From f577a94012062131267af482f4063d050a2e9275 Mon Sep 17 00:00:00 2001 From: zzz Date: Mon, 31 Aug 2015 13:19:29 +0000 Subject: [PATCH 001/111] i2psnark: Change default sig type to Ed25519 --- apps/i2psnark/java/src/org/klomp/snark/I2PSnarkUtil.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/apps/i2psnark/java/src/org/klomp/snark/I2PSnarkUtil.java b/apps/i2psnark/java/src/org/klomp/snark/I2PSnarkUtil.java index 85bb97c4d..75570e04a 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/I2PSnarkUtil.java +++ b/apps/i2psnark/java/src/org/klomp/snark/I2PSnarkUtil.java @@ -14,6 +14,7 @@ import java.util.Set; import net.i2p.I2PAppContext; import net.i2p.I2PException; +import net.i2p.client.I2PClient; import net.i2p.client.I2PSession; import net.i2p.client.I2PSessionException; import net.i2p.client.streaming.I2PServerSocket; @@ -255,6 +256,8 @@ public class I2PSnarkUtil { opts.setProperty("i2p.streaming.disableRejectLogging", "true"); if (opts.getProperty("i2p.streaming.answerPings") == null) opts.setProperty("i2p.streaming.answerPings", "false"); + if (opts.getProperty(I2PClient.PROP_SIGTYPE) == null) + opts.setProperty(I2PClient.PROP_SIGTYPE, "EdDSA_SHA512_Ed25519"); _manager = I2PSocketManagerFactory.createManager(_i2cpHost, _i2cpPort, opts); _connecting = false; } From 7c703953be0afa7d3ed5cb57d4a6cb00f113da4d Mon Sep 17 00:00:00 2001 From: zzz Date: Mon, 31 Aug 2015 13:25:58 +0000 Subject: [PATCH 002/111] Data: Cache P256 and Ed255i9 key certificates - Enable P256 caching - Create cached Ed25519 cert and enable - Fix cached P256 hashcode --- core/java/src/net/i2p/data/Certificate.java | 22 +++- .../java/src/net/i2p/data/KeyCertificate.java | 104 +++++++++++++++++- history.txt | 4 + .../src/net/i2p/router/RouterVersion.java | 2 +- 4 files changed, 121 insertions(+), 11 deletions(-) diff --git a/core/java/src/net/i2p/data/Certificate.java b/core/java/src/net/i2p/data/Certificate.java index 7b40b5099..aa2624b8a 100644 --- a/core/java/src/net/i2p/data/Certificate.java +++ b/core/java/src/net/i2p/data/Certificate.java @@ -47,16 +47,17 @@ public class Certificate extends DataStructureImpl { public final static int CERTIFICATE_TYPE_KEY = 5; /** - * If null cert, return immutable static instance, else create new + * If null, P256 key, or Ed25519 key cert, return immutable static instance, else create new * @throws DataFormatException if not enough bytes * @since 0.8.3 */ public static Certificate create(byte[] data, int off) throws DataFormatException { int type; byte[] payload; + int length; try { type = data[off] & 0xff; - int length = (int) DataHelper.fromLong(data, off + 1, 2); + length = (int) DataHelper.fromLong(data, off + 1, 2); if (type == 0 && length == 0) return NULL_CERT; // from here down roughly the same as readBytes() below @@ -68,6 +69,12 @@ public class Certificate extends DataStructureImpl { throw new DataFormatException("not enough bytes", aioobe); } if (type == CERTIFICATE_TYPE_KEY) { + if (length == 4) { + if (Arrays.equals(payload, KeyCertificate.Ed25519_PAYLOAD)) + return KeyCertificate.ELG_Ed25519_CERT; + if (Arrays.equals(payload, KeyCertificate.ECDSA256_PAYLOAD)) + return KeyCertificate.ELG_ECDSA256_CERT; + } try { return new KeyCertificate(payload); } catch (DataFormatException dfe) { @@ -78,7 +85,7 @@ public class Certificate extends DataStructureImpl { } /** - * If null cert, return immutable static instance, else create new + * If null, P256 key, or Ed25519 key cert, return immutable static instance, else create new * @since 0.8.3 */ public static Certificate create(InputStream in) throws DataFormatException, IOException { @@ -93,8 +100,15 @@ public class Certificate extends DataStructureImpl { int read = DataHelper.read(in, payload); if (read != length) throw new DataFormatException("Not enough bytes for the payload (read: " + read + " length: " + length + ')'); - if (type == CERTIFICATE_TYPE_KEY) + if (type == CERTIFICATE_TYPE_KEY) { + if (length == 4) { + if (Arrays.equals(payload, KeyCertificate.Ed25519_PAYLOAD)) + return KeyCertificate.ELG_Ed25519_CERT; + if (Arrays.equals(payload, KeyCertificate.ECDSA256_PAYLOAD)) + return KeyCertificate.ELG_ECDSA256_CERT; + } return new KeyCertificate(payload); + } return new Certificate(type, payload); } diff --git a/core/java/src/net/i2p/data/KeyCertificate.java b/core/java/src/net/i2p/data/KeyCertificate.java index 86078658f..1c35d6c31 100644 --- a/core/java/src/net/i2p/data/KeyCertificate.java +++ b/core/java/src/net/i2p/data/KeyCertificate.java @@ -17,15 +17,41 @@ public class KeyCertificate extends Certificate { public static final int HEADER_LENGTH = 4; + /** @since 0.9.22 pkg private for Certificate.create() */ + static final byte[] Ed25519_PAYLOAD = new byte[] { + 0, (byte) (SigType.EdDSA_SHA512_Ed25519.getCode()), 0, 0 + }; + + /** @since 0.9.22 pkg private for Certificate.create() */ + static final byte[] ECDSA256_PAYLOAD = new byte[] { + 0, (byte) (SigType.ECDSA_SHA256_P256.getCode()), 0, 0 + }; + + /** + * An immutable ElG/ECDSA-P256 certificate. + */ public static final KeyCertificate ELG_ECDSA256_CERT; + + /** + * An immutable ElG/Ed25519 certificate. + * @since 0.9.22 + */ + public static final KeyCertificate ELG_Ed25519_CERT; + static { KeyCertificate kc; try { kc = new ECDSA256Cert(); } catch (DataFormatException dfe) { - kc = null; // won't happen + throw new RuntimeException(dfe); // won't happen } ELG_ECDSA256_CERT = kc; + try { + kc = new Ed25519Cert(); + } catch (DataFormatException dfe) { + throw new RuntimeException(dfe); // won't happen + } + ELG_Ed25519_CERT = kc; } /** @@ -185,19 +211,17 @@ public class KeyCertificate extends Certificate { /** * An immutable ElG/ECDSA-256 certificate. - * @since 0.8.3 */ private static final class ECDSA256Cert extends KeyCertificate { private static final byte[] ECDSA256_DATA = new byte[] { CERTIFICATE_TYPE_KEY, 0, HEADER_LENGTH, 0, (byte) (SigType.ECDSA_SHA256_P256.getCode()), 0, 0 }; private static final int ECDSA256_LENGTH = ECDSA256_DATA.length; - private static final byte[] ECDSA256_PAYLOAD = new byte[] { - 0, (byte) (SigType.ECDSA_SHA256_P256.getCode()), 0, 0 - }; + private final int _hashcode; public ECDSA256Cert() throws DataFormatException { super(ECDSA256_PAYLOAD); + _hashcode = super.hashCode(); } /** @throws RuntimeException always */ @@ -246,7 +270,75 @@ public class KeyCertificate extends Certificate { /** Overridden for efficiency */ @Override public int hashCode() { - return 1234567; + return _hashcode; + } + } + + /** + * An immutable ElG/Ed25519 certificate. + * @since 0.9.22 + */ + private static final class Ed25519Cert extends KeyCertificate { + private static final byte[] ED_DATA = new byte[] { CERTIFICATE_TYPE_KEY, + 0, HEADER_LENGTH, + 0, (byte) SigType.EdDSA_SHA512_Ed25519.getCode(), + 0, 0 + }; + private static final int ED_LENGTH = ED_DATA.length; + private final int _hashcode; + + public Ed25519Cert() throws DataFormatException { + super(Ed25519_PAYLOAD); + _hashcode = super.hashCode(); + } + + /** @throws RuntimeException always */ + @Override + public void setCertificateType(int type) { + throw new RuntimeException("Data already set"); + } + + /** @throws RuntimeException always */ + @Override + public void setPayload(byte[] payload) { + throw new RuntimeException("Data already set"); + } + + /** @throws RuntimeException always */ + @Override + public void readBytes(InputStream in) throws DataFormatException, IOException { + throw new RuntimeException("Data already set"); + } + + /** Overridden for efficiency */ + @Override + public void writeBytes(OutputStream out) throws IOException { + out.write(ED_DATA); + } + + /** Overridden for efficiency */ + @Override + public int writeBytes(byte target[], int offset) { + System.arraycopy(ED_DATA, 0, target, offset, ED_LENGTH); + return ED_LENGTH; + } + + /** @throws RuntimeException always */ + @Override + public int readBytes(byte source[], int offset) throws DataFormatException { + throw new RuntimeException("Data already set"); + } + + /** Overridden for efficiency */ + @Override + public int size() { + return ED_LENGTH; + } + + /** Overridden for efficiency */ + @Override + public int hashCode() { + return _hashcode; } } } diff --git a/history.txt b/history.txt index 3dd700a2f..37d8b5652 100644 --- a/history.txt +++ b/history.txt @@ -1,3 +1,7 @@ +2015-08-31 zzz + * Data: Cache P256 and Ed255i9 key certificates + * i2psnark: Change default sig type to Ed25519 + 2015-08-29 zzz * Router: - Change default RI sig type to Ed25519, with a 10% chance od diff --git a/router/java/src/net/i2p/router/RouterVersion.java b/router/java/src/net/i2p/router/RouterVersion.java index 0725033fa..f6e6df3a5 100644 --- a/router/java/src/net/i2p/router/RouterVersion.java +++ b/router/java/src/net/i2p/router/RouterVersion.java @@ -18,7 +18,7 @@ public class RouterVersion { /** deprecated */ public final static String ID = "Monotone"; public final static String VERSION = CoreVersion.VERSION; - public final static long BUILD = 3; + public final static long BUILD = 4; /** for example "-test" */ public final static String EXTRA = ""; From 483d7c43ee4dc966e614051a660e3c9c2f67d6dc Mon Sep 17 00:00:00 2001 From: zzz Date: Tue, 1 Sep 2015 11:56:58 +0000 Subject: [PATCH 003/111] Router: Change thread name so it truncates better (ticket #1648) --- router/java/src/net/i2p/router/Router.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/router/java/src/net/i2p/router/Router.java b/router/java/src/net/i2p/router/Router.java index c6cc76f68..a76d4b7fa 100644 --- a/router/java/src/net/i2p/router/Router.java +++ b/router/java/src/net/i2p/router/Router.java @@ -398,7 +398,7 @@ public class Router implements RouterClock.ClockShiftListener { _oomListener = new OOMListener(_context); _shutdownHook = new ShutdownHook(_context); - _gracefulShutdownDetector = new I2PAppThread(new GracefulShutdown(_context), "Graceful shutdown hook", true); + _gracefulShutdownDetector = new I2PAppThread(new GracefulShutdown(_context), "Graceful ShutdownHook", true); _gracefulShutdownDetector.setPriority(Thread.NORM_PRIORITY + 1); _gracefulShutdownDetector.start(); From 61edd01e3d6666bfb198eb856a67071ac15e8916 Mon Sep 17 00:00:00 2001 From: kytv Date: Fri, 4 Sep 2015 18:44:05 +0000 Subject: [PATCH 004/111] Switch URL/certificate for backup's reseed server --- .../certificates/ssl/link.mx24.eu.crt | 24 ------------------- .../certificates/ssl/user.mx24.eu.crt | 17 +++++++++++++ .../i2p/router/networkdb/reseed/Reseeder.java | 2 +- 3 files changed, 18 insertions(+), 25 deletions(-) delete mode 100644 installer/resources/certificates/ssl/link.mx24.eu.crt create mode 100644 installer/resources/certificates/ssl/user.mx24.eu.crt diff --git a/installer/resources/certificates/ssl/link.mx24.eu.crt b/installer/resources/certificates/ssl/link.mx24.eu.crt deleted file mode 100644 index 8e0d910fc..000000000 --- a/installer/resources/certificates/ssl/link.mx24.eu.crt +++ /dev/null @@ -1,24 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIEDzCCAvegAwIBAgIJAMsPNG1k0yV4MA0GCSqGSIb3DQEBCwUAMIGdMQswCQYD -VQQGEwJERTEVMBMGA1UECAwMbGluay5teDI0LmV1MRUwEwYDVQQHDAxsaW5rLm14 -MjQuZXUxFTATBgNVBAoMDGxpbmsubXgyNC5ldTEVMBMGA1UECwwMbGluay5teDI0 -LmV1MRUwEwYDVQQDDAxsaW5rLm14MjQuZXUxGzAZBgkqhkiG9w0BCQEWDGxpbmsu -bXgyNC5ldTAeFw0xNDExMTkxOTE4NTRaFw0yMDA1MTExOTE4NTRaMIGdMQswCQYD -VQQGEwJERTEVMBMGA1UECAwMbGluay5teDI0LmV1MRUwEwYDVQQHDAxsaW5rLm14 -MjQuZXUxFTATBgNVBAoMDGxpbmsubXgyNC5ldTEVMBMGA1UECwwMbGluay5teDI0 -LmV1MRUwEwYDVQQDDAxsaW5rLm14MjQuZXUxGzAZBgkqhkiG9w0BCQEWDGxpbmsu -bXgyNC5ldTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL8modDBRkyh -SHSm92pTfguO3F6n5ocsBJ4vaVoosYq3ILCsapjqmynMHZUef6gEB7+Gn5cKXsH2 -JaKOeb8DHrOFCaxfj187x1QfZj1UNMQblx2T9q4th12tqp+k4JuLwgemr+2uAUpM -xx/uHRJXD0hf67+fHQFYNVfa+WvT46xlKGsWDQ0LBsA/z4YGnyeaV4PrS5nj3euA -IbdfDj7rJea3bfhSqYA1ZH1cquKlsXOOYO5cIcXsa5dxDWX51QS+i7+ocph+JN1X -dRh6ZirE9OXZVXwXXVRnJSYjgBlP/DQBdE7YkE1R3LyCVZsgxJaaLV/ujijOIK61 -SqEhHvFNRe0CAwEAAaNQME4wHQYDVR0OBBYEFB6XRz6VZlrAE+3xL6AyKrkq+y2X -MB8GA1UdIwQYMBaAFB6XRz6VZlrAE+3xL6AyKrkq+y2XMAwGA1UdEwQFMAMBAf8w -DQYJKoZIhvcNAQELBQADggEBADhxBA5GHisDVf5a+1hIi7FBGBjJJLqzlaKh+bFB -gTCYfk3F4wYzndr1HpdCZSSYDtY3mXFNMWQCpwvwvy1DM+9AMRY68wKNXHa/WypW -zQSqTfEH8cdaIXUALB7pdWFVr3rx0f7/8I0Gj/ByUbJ94rzd22vduX5riY0Rag6B -dPtW0M9bJrC1AIjexzDcStupj9v/ceGYZQYC4zb2tZ7Ek/6q+vei8TxWZjku7Dl4 -YRPXXufyB24uQ1hJVy2fSyIJ63tIRJoEFLBNaKDOB53i10xLWBcsJpXKY57AOQMn -flqW4HG8uGJ/o1WjhiOB9eI7T9toy08zNzt+kSI/blFIoek= ------END CERTIFICATE----- diff --git a/installer/resources/certificates/ssl/user.mx24.eu.crt b/installer/resources/certificates/ssl/user.mx24.eu.crt new file mode 100644 index 000000000..38c68ab5b --- /dev/null +++ b/installer/resources/certificates/ssl/user.mx24.eu.crt @@ -0,0 +1,17 @@ +-----BEGIN CERTIFICATE----- +MIICwDCCAkagAwIBAgIJAKXCoCBjd/C0MAoGCCqGSM49BAMEMIGdMQswCQYDVQQG +EwJERTEVMBMGA1UECAwMdXNlci5teDI0LmV1MRUwEwYDVQQHDAx1c2VyLm14MjQu +ZXUxFTATBgNVBAoMDHVzZXIubXgyNC5ldTEVMBMGA1UECwwMdXNlci5teDI0LmV1 +MRUwEwYDVQQDDAx1c2VyLm14MjQuZXUxGzAZBgkqhkiG9w0BCQEWDHVzZXIubXgy +NC5ldTAeFw0xNTA5MDMxNjMyNDVaFw0yMTAyMjMxNjMyNDVaMIGdMQswCQYDVQQG +EwJERTEVMBMGA1UECAwMdXNlci5teDI0LmV1MRUwEwYDVQQHDAx1c2VyLm14MjQu +ZXUxFTATBgNVBAoMDHVzZXIubXgyNC5ldTEVMBMGA1UECwwMdXNlci5teDI0LmV1 +MRUwEwYDVQQDDAx1c2VyLm14MjQuZXUxGzAZBgkqhkiG9w0BCQEWDHVzZXIubXgy +NC5ldTB2MBAGByqGSM49AgEGBSuBBAAiA2IABPlKs5fYTqVhIOMiR6U9U4TimxS3 +P5NBDVzeeIAgbw5KBC8UImScZVt9g4V1wQe5kPs7TxA2BfanAPZ+ekQiRRvMVQxD +bSlRYupEWhq5BrJI6Lq/HDc7VJe9UUWffWKUoKNQME4wHQYDVR0OBBYEFBGJ0Yr+ +PZXnrk5RafQEALUpAU6ZMB8GA1UdIwQYMBaAFBGJ0Yr+PZXnrk5RafQEALUpAU6Z +MAwGA1UdEwQFMAMBAf8wCgYIKoZIzj0EAwQDaAAwZQIxAPcovePHMCosrAQNzS5i +VDUiyPNLOxHyRBm79yKXGl13LxysB6OK+2M7t8j8E/udBwIwXVVjxN6aSgXYTJ7d +p+Hg/2CuBMwf41/ENRcYQA+oGS9bU6A+7U9KJ1xTWWoqsUEs +-----END CERTIFICATE----- diff --git a/router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java b/router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java index d930cac9b..146a734f3 100644 --- a/router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java +++ b/router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java @@ -98,7 +98,7 @@ public class Reseeder { "https://us.reseed.i2p2.no:444/" + "," + "https://uk.reseed.i2p2.no:444/" + "," + "https://reseed.i2p.vzaws.com:8443/" + ", " + // Only SU3 (v3) support - "https://link.mx24.eu/" + "," + // Only HTTPS and SU3 (v3) support + "https://user.mx24.eu/" + "," + // Only HTTPS and SU3 (v3) support "https://ieb9oopo.mooo.com/"; // Only HTTPS and SU3 (v3) support private static final String SU3_FILENAME = "i2pseeds.su3"; From fe69d3b8f71544740cc77657fd1eaf5e294a001a Mon Sep 17 00:00:00 2001 From: zzz Date: Fri, 4 Sep 2015 21:05:38 +0000 Subject: [PATCH 005/111] UPnP: Fix "content not allowed in trailing section" (tickets #481, #1653) patch from 'kay" in #1653, dev agreement received --- history.txt | 4 +++ .../src/net/i2p/router/RouterVersion.java | 4 +-- .../cybergarage/xml/parser/JaxpParser.java | 34 +++++++++++++++++++ 3 files changed, 40 insertions(+), 2 deletions(-) diff --git a/history.txt b/history.txt index 37d8b5652..db2c40c3d 100644 --- a/history.txt +++ b/history.txt @@ -1,3 +1,7 @@ +2015-09-04 zzz + * UPnP: Fix "content not allowed in trailing section" + (tickets #481, #1653) + 2015-08-31 zzz * Data: Cache P256 and Ed255i9 key certificates * i2psnark: Change default sig type to Ed25519 diff --git a/router/java/src/net/i2p/router/RouterVersion.java b/router/java/src/net/i2p/router/RouterVersion.java index f6e6df3a5..ba403a9f3 100644 --- a/router/java/src/net/i2p/router/RouterVersion.java +++ b/router/java/src/net/i2p/router/RouterVersion.java @@ -18,10 +18,10 @@ public class RouterVersion { /** deprecated */ public final static String ID = "Monotone"; public final static String VERSION = CoreVersion.VERSION; - public final static long BUILD = 4; + public final static long BUILD = 5; /** for example "-test" */ - public final static String EXTRA = ""; + public final static String EXTRA = "-rc"; public final static String FULL_VERSION = VERSION + "-" + BUILD + EXTRA; public static void main(String args[]) { System.out.println("I2P Router version: " + FULL_VERSION); diff --git a/router/java/src/org/cybergarage/xml/parser/JaxpParser.java b/router/java/src/org/cybergarage/xml/parser/JaxpParser.java index 332c5525f..af84b14f3 100644 --- a/router/java/src/org/cybergarage/xml/parser/JaxpParser.java +++ b/router/java/src/org/cybergarage/xml/parser/JaxpParser.java @@ -184,6 +184,40 @@ public class JaxpParser extends Parser } return rv; } + + /** @since 0.9.22 */ + @Override + public int read(byte[] b) throws IOException { + return this.read(b, 0, b.length); + } + + /** @since 0.9.22 */ + @Override + public int read(byte[] b, int off, int len) throws IOException { + if (b == null) { + throw new NullPointerException(); + } else if (off < 0 || len < 0 || len > b.length - off) { + throw new IndexOutOfBoundsException(); + } else if (len == 0) { + return 0; + } + + int rv = this.read(); + if (-1 == rv) { + return -1; + } + + int i = 1; + b[off] = (byte) rv; + for (; i < len; i++) { + rv = this.read(); + if (-1 == rv) { + break; + } + b[off + i] = (byte) rv; + } + return i; + } } /** From 2c6edf401f8fe4d84d86bafcfe3ed3825edfe81d Mon Sep 17 00:00:00 2001 From: zzz Date: Fri, 4 Sep 2015 21:15:48 +0000 Subject: [PATCH 006/111] add extra to bumpBuild output after change --- router/java/src/net/i2p/router/RouterVersion.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/router/java/src/net/i2p/router/RouterVersion.java b/router/java/src/net/i2p/router/RouterVersion.java index ba403a9f3..ae4c8ac3a 100644 --- a/router/java/src/net/i2p/router/RouterVersion.java +++ b/router/java/src/net/i2p/router/RouterVersion.java @@ -18,7 +18,7 @@ public class RouterVersion { /** deprecated */ public final static String ID = "Monotone"; public final static String VERSION = CoreVersion.VERSION; - public final static long BUILD = 5; + public final static long BUILD = 6; /** for example "-test" */ public final static String EXTRA = "-rc"; From e978bb81a07a7345f4a9105b3d37cd38c7d919eb Mon Sep 17 00:00:00 2001 From: zzz Date: Sat, 5 Sep 2015 14:02:21 +0000 Subject: [PATCH 007/111] checked in correct file --- build.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.xml b/build.xml index 8b2ef5085..8190e4fa1 100644 --- a/build.xml +++ b/build.xml @@ -450,7 +450,7 @@ if (newBuildNumber != 'unknown' && newBuildNumber != null) { echo = project.createTask("echo"); project.setProperty("new.i2p.build.number", newBuildNumber); - echo.setMessage("Build number is now: " + newBuildNumber); + echo.setMessage("Build number is now: " + newBuildNumber + project.getProperty("build.extra")); echo.perform(); } ]]> From c4cbd7d5c45bc117f476b6f6098b07b74adcca70 Mon Sep 17 00:00:00 2001 From: kytv Date: Sun, 6 Sep 2015 08:01:28 +0000 Subject: [PATCH 008/111] (hopefully temporarily) disable netdb.rows.io as it's been down for nearly a month. --- router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java b/router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java index 146a734f3..f619391ec 100644 --- a/router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java +++ b/router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java @@ -89,7 +89,7 @@ public class Reseeder { /** @since 0.8.2 */ public static final String DEFAULT_SSL_SEED_URL = "https://reseed.i2p-projekt.de/" + "," + // Only HTTPS - "https://netdb.rows.io:444/" + "," + // Only HTTPS and SU3 (v3) support + //"https://netdb.rows.io:444/" + "," + // Only HTTPS and SU3 (v3) support "https://i2pseed.zarrenspry.info/" + "," + // Only HTTPS and SU3 (v3) support "https://i2p.mooo.com/netDb/" + "," + // ticket #1596 From de2431e9ee1f0091655c3749ae5a5a27cf48722f Mon Sep 17 00:00:00 2001 From: dg2-new Date: Mon, 7 Sep 2015 18:18:16 +0000 Subject: [PATCH 009/111] Fix auto-start of new .torrents in the Snark folder --- apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java | 4 ++-- router/java/src/net/i2p/router/RouterVersion.java | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java b/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java index 771821827..7d64813e5 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java +++ b/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java @@ -1247,7 +1247,7 @@ public class SnarkManager implements CompleteListener { _log.info("New Snark, torrent: " + filename + " base: " + baseFile); torrent = new Snark(_util, filename, null, -1, null, null, this, _peerCoordinatorSet, _connectionAcceptor, - false, dataDir.getPath(), baseFile); + shouldAutoStart(), dataDir.getPath(), baseFile); loadSavedFilePriorities(torrent); synchronized (_snarks) { _snarks.put(filename, torrent); @@ -1278,7 +1278,7 @@ public class SnarkManager implements CompleteListener { running = true; } else { running = false; - } + } // Were we running last time? if (!dontAutoStart && shouldAutoStart() && running) { torrent.startTorrent(); diff --git a/router/java/src/net/i2p/router/RouterVersion.java b/router/java/src/net/i2p/router/RouterVersion.java index ae4c8ac3a..c76c0f106 100644 --- a/router/java/src/net/i2p/router/RouterVersion.java +++ b/router/java/src/net/i2p/router/RouterVersion.java @@ -18,7 +18,7 @@ public class RouterVersion { /** deprecated */ public final static String ID = "Monotone"; public final static String VERSION = CoreVersion.VERSION; - public final static long BUILD = 6; + public final static long BUILD = 7; /** for example "-test" */ public final static String EXTRA = "-rc"; From ab134261f0846a2ae9972dcb012599b73297fd5c Mon Sep 17 00:00:00 2001 From: kytv Date: Fri, 11 Sep 2015 00:53:13 +0000 Subject: [PATCH 010/111] Translation updates from Transifex --- apps/desktopgui/locale/messages_uk.po | 8 +- apps/i2psnark/locale/messages_de.po | 10 +- apps/i2psnark/locale/messages_pl.po | 9 +- apps/i2psnark/locale/messages_ro.po | 826 ++++++++------- apps/i2ptunnel/locale-proxy/messages_uk.po | 63 +- apps/i2ptunnel/locale/messages_sv.po | 41 +- apps/i2ptunnel/locale/messages_uk.po | 10 +- apps/ministreaming/locale/messages_uk.po | 15 +- .../locale-countries/messages_pl.po | 39 +- .../locale-countries/messages_pt.po | 39 +- .../locale-countries/messages_tr.po | 40 +- .../locale-countries/messages_uk.po | 40 +- apps/routerconsole/locale-news/messages_sv.po | 9 +- apps/routerconsole/locale-news/messages_tr.po | 10 +- apps/routerconsole/locale-news/messages_uk.po | 6 +- apps/routerconsole/locale/messages_de.po | 28 +- apps/routerconsole/locale/messages_fr.po | 10 +- apps/routerconsole/locale/messages_ja.po | 323 +++--- apps/routerconsole/locale/messages_pl.po | 998 +++++++++--------- apps/routerconsole/locale/messages_ru.po | 909 ++++++++-------- apps/routerconsole/locale/messages_tr.po | 972 ++++++++--------- apps/routerconsole/locale/messages_uk.po | 103 +- apps/susidns/locale/messages_ja.po | 27 +- apps/susidns/locale/messages_tr.po | 136 +-- apps/susidns/locale/messages_uk.po | 33 +- apps/susimail/locale/messages_uk.po | 10 +- 26 files changed, 2407 insertions(+), 2307 deletions(-) diff --git a/apps/desktopgui/locale/messages_uk.po b/apps/desktopgui/locale/messages_uk.po index c45356c20..3084ecab5 100644 --- a/apps/desktopgui/locale/messages_uk.po +++ b/apps/desktopgui/locale/messages_uk.po @@ -4,7 +4,7 @@ # To contribute translations, see http://www.i2p2.de/newdevelopers # # Translators: -# Denis Blank , 2011 +# Denis Lysenko , 2011 # LinuxChata, 2014 # madjong , 2014 msgid "" @@ -12,9 +12,9 @@ msgstr "" "Project-Id-Version: I2P\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2014-01-09 19:27+0000\n" -"PO-Revision-Date: 2014-12-17 17:00+0000\n" -"Last-Translator: madjong \n" -"Language-Team: Ukrainian (Ukraine) (http://www.transifex.com/projects/p/I2P/language/uk_UA/)\n" +"PO-Revision-Date: 2015-08-07 16:31+0000\n" +"Last-Translator: Denis Lysenko \n" +"Language-Team: Ukrainian (Ukraine) (http://www.transifex.com/otf/I2P/language/uk_UA/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" diff --git a/apps/i2psnark/locale/messages_de.po b/apps/i2psnark/locale/messages_de.po index ad4612891..927df100d 100644 --- a/apps/i2psnark/locale/messages_de.po +++ b/apps/i2psnark/locale/messages_de.po @@ -12,7 +12,7 @@ # Ettore Atalan , 2014 # foo , 2009 # SteinQuadrat, 2013 -# Lars Schimmer , 2014 +# Lars Schimmer , 2014-2015 # Max Muster , 2014 # mixxy, 2011 # nextloop , 2013 @@ -23,9 +23,9 @@ msgstr "" "Project-Id-Version: I2P\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-07-17 01:09+0000\n" -"PO-Revision-Date: 2015-07-17 01:32+0000\n" -"Last-Translator: kytv \n" -"Language-Team: German (http://www.transifex.com/projects/p/I2P/language/de/)\n" +"PO-Revision-Date: 2015-08-21 21:02+0000\n" +"Last-Translator: Lars Schimmer \n" +"Language-Team: German (http://www.transifex.com/otf/I2P/language/de/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -659,7 +659,7 @@ msgstr[1] "{0} DHT-Gegenstellen" #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:695 msgid "Dest" -msgstr "" +msgstr "Ziel" #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:823 msgid "First" diff --git a/apps/i2psnark/locale/messages_pl.po b/apps/i2psnark/locale/messages_pl.po index 6072b60ec..854c90672 100644 --- a/apps/i2psnark/locale/messages_pl.po +++ b/apps/i2psnark/locale/messages_pl.po @@ -11,14 +11,15 @@ # polacco , 2012 # seb, 2014 # Smert i2p , 2013 +# Taporpo Ne , 2015 msgid "" msgstr "" "Project-Id-Version: I2P\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-07-17 01:09+0000\n" -"PO-Revision-Date: 2015-07-17 01:32+0000\n" -"Last-Translator: kytv \n" -"Language-Team: Polish (http://www.transifex.com/projects/p/I2P/language/pl/)\n" +"PO-Revision-Date: 2015-09-03 19:18+0000\n" +"Last-Translator: Taporpo Ne \n" +"Language-Team: Polish (http://www.transifex.com/otf/I2P/language/pl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -655,7 +656,7 @@ msgstr[2] "{0} peerów DHT" #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:695 msgid "Dest" -msgstr "" +msgstr "Cel" #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:823 msgid "First" diff --git a/apps/i2psnark/locale/messages_ro.po b/apps/i2psnark/locale/messages_ro.po index 5259dc9c8..98d4bb92c 100644 --- a/apps/i2psnark/locale/messages_ro.po +++ b/apps/i2psnark/locale/messages_ro.po @@ -4,236 +4,243 @@ # To contribute translations, see http://www.i2p2.de/newdevelopers # # Translators: +# Di N., 2015 +# titus , 2015 msgid "" msgstr "" "Project-Id-Version: I2P\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-12-01 20:06+0000\n" -"PO-Revision-Date: 2013-12-05 15:04+0000\n" -"Last-Translator: polearnik \n" -"Language-Team: Romanian (http://www.transifex.com/projects/p/I2P/language/ro/)\n" +"POT-Creation-Date: 2015-07-17 01:09+0000\n" +"PO-Revision-Date: 2015-07-21 13:47+0000\n" +"Last-Translator: Di N.\n" +"Language-Team: Romanian (http://www.transifex.com/otf/I2P/language/ro/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: ro\n" "Plural-Forms: nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));\n" -#: ../java/src/org/klomp/snark/IdleChecker.java:69 -#: ../java/src/org/klomp/snark/SnarkManager.java:1938 -#: ../java/src/org/klomp/snark/SnarkManager.java:1949 +#: ../java/src/org/klomp/snark/IdleChecker.java:75 +msgid "No more torrents running." +msgstr "Nu sunt torrente care rulează" + +#: ../java/src/org/klomp/snark/IdleChecker.java:76 +#: ../java/src/org/klomp/snark/SnarkManager.java:2392 +#: ../java/src/org/klomp/snark/SnarkManager.java:2403 msgid "I2P tunnel closed." msgstr "Tunel I2P închis." #: ../java/src/org/klomp/snark/MagnetURI.java:42 #: ../java/src/org/klomp/snark/MagnetURI.java:52 -#: ../java/src/org/klomp/snark/SnarkManager.java:1644 +#: ../java/src/org/klomp/snark/SnarkManager.java:2096 msgid "Magnet" msgstr "Magnet" -#: ../java/src/org/klomp/snark/SnarkManager.java:504 +#: ../java/src/org/klomp/snark/SnarkManager.java:772 #, java-format msgid "Total uploaders limit changed to {0}" msgstr "Limita totala de incarcare schimbat la {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:506 +#: ../java/src/org/klomp/snark/SnarkManager.java:774 #, java-format msgid "Minimum total uploaders limit is {0}" msgstr "Limita totala minimă de incarcare este {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:518 +#: ../java/src/org/klomp/snark/SnarkManager.java:786 #, java-format msgid "Up BW limit changed to {0}KBps" msgstr "Limita de incarcare BW schimbat la {0} Kbps" -#: ../java/src/org/klomp/snark/SnarkManager.java:520 +#: ../java/src/org/klomp/snark/SnarkManager.java:788 #, java-format msgid "Minimum up bandwidth limit is {0}KBps" msgstr "Limita de lățime de bandă minima la incarcarea este {0} Kbps" -#: ../java/src/org/klomp/snark/SnarkManager.java:532 +#: ../java/src/org/klomp/snark/SnarkManager.java:800 #, java-format msgid "Startup delay changed to {0}" msgstr "Întârziere de pornire schimbat la {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:543 +#: ../java/src/org/klomp/snark/SnarkManager.java:811 #, java-format msgid "Refresh time changed to {0}" msgstr "Actualizarea timpului schimbat la {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:545 +#: ../java/src/org/klomp/snark/SnarkManager.java:813 msgid "Refresh disabled" msgstr "Refresh dezactivat" -#: ../java/src/org/klomp/snark/SnarkManager.java:561 +#: ../java/src/org/klomp/snark/SnarkManager.java:829 #, java-format msgid "Page size changed to {0}" msgstr "Schimbat dimensiunea paginii la {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:570 +#: ../java/src/org/klomp/snark/SnarkManager.java:838 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:956 msgid "Data directory must be an absolute path" msgstr "Dosarul de data de lucru trebuie să fie o cale absolută" -#: ../java/src/org/klomp/snark/SnarkManager.java:572 +#: ../java/src/org/klomp/snark/SnarkManager.java:840 msgid "Data directory does not exist" msgstr "Dosarul de date nu există" -#: ../java/src/org/klomp/snark/SnarkManager.java:574 +#: ../java/src/org/klomp/snark/SnarkManager.java:842 msgid "Not a directory" msgstr "Nu e un dosar" -#: ../java/src/org/klomp/snark/SnarkManager.java:576 +#: ../java/src/org/klomp/snark/SnarkManager.java:844 msgid "Unreadable" msgstr "necitibil" -#: ../java/src/org/klomp/snark/SnarkManager.java:581 +#: ../java/src/org/klomp/snark/SnarkManager.java:849 #, java-format msgid "Data directory changed to {0}" msgstr "Dosarul de date s-a schimbat la {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:636 +#: ../java/src/org/klomp/snark/SnarkManager.java:904 msgid "I2CP and tunnel changes will take effect after stopping all torrents" msgstr "I2CP și tunel modificările vor intra în vigoare după oprirea tuturor torrentele" -#: ../java/src/org/klomp/snark/SnarkManager.java:640 +#: ../java/src/org/klomp/snark/SnarkManager.java:908 #, java-format msgid "I2CP options changed to {0}" msgstr "Opțiuni I2CP schimbat la {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:646 +#: ../java/src/org/klomp/snark/SnarkManager.java:914 msgid "Disconnecting old I2CP destination" msgstr "Deconectarea destinației vechi I2CP" -#: ../java/src/org/klomp/snark/SnarkManager.java:648 +#: ../java/src/org/klomp/snark/SnarkManager.java:916 #, java-format msgid "I2CP settings changed to {0}" msgstr "Opțiuni I2CP schimbat la {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:653 +#: ../java/src/org/klomp/snark/SnarkManager.java:921 msgid "" "Unable to connect with the new settings, reverting to the old I2CP settings" msgstr "Imposibil de a se conecta cu noile setări, revenirea la vechile setări I2CP" -#: ../java/src/org/klomp/snark/SnarkManager.java:657 +#: ../java/src/org/klomp/snark/SnarkManager.java:925 msgid "Unable to reconnect with the old settings!" msgstr "Nu pot să se reconectez cu setările vechi!" -#: ../java/src/org/klomp/snark/SnarkManager.java:659 +#: ../java/src/org/klomp/snark/SnarkManager.java:927 msgid "Reconnected on the new I2CP destination" msgstr "Reconectat la destinație noua I2CP" -#: ../java/src/org/klomp/snark/SnarkManager.java:666 +#: ../java/src/org/klomp/snark/SnarkManager.java:934 #, java-format msgid "I2CP listener restarted for \"{0}\"" msgstr "I2CP ascultător repornit pentru \"{0}\"" -#: ../java/src/org/klomp/snark/SnarkManager.java:680 +#: ../java/src/org/klomp/snark/SnarkManager.java:948 msgid "New files will be publicly readable" msgstr "Fișiere noi vor putea fi citite public" -#: ../java/src/org/klomp/snark/SnarkManager.java:682 +#: ../java/src/org/klomp/snark/SnarkManager.java:950 msgid "New files will not be publicly readable" msgstr "Fișiere noi nu vor putea fi citite public" -#: ../java/src/org/klomp/snark/SnarkManager.java:689 +#: ../java/src/org/klomp/snark/SnarkManager.java:957 msgid "Enabled autostart" msgstr "Activeaza autopornirea" -#: ../java/src/org/klomp/snark/SnarkManager.java:691 +#: ../java/src/org/klomp/snark/SnarkManager.java:959 msgid "Disabled autostart" msgstr "Dezactivează autopornirea" -#: ../java/src/org/klomp/snark/SnarkManager.java:697 +#: ../java/src/org/klomp/snark/SnarkManager.java:965 msgid "Enabled open trackers - torrent restart required to take effect." msgstr "Trackere deschise activat - repornirea torrentui este necesara să aibă efect." -#: ../java/src/org/klomp/snark/SnarkManager.java:699 +#: ../java/src/org/klomp/snark/SnarkManager.java:967 msgid "Disabled open trackers - torrent restart required to take effect." msgstr "Trackere deschise dezactivat - repornirea torrentui este necesara să aibă efect." -#: ../java/src/org/klomp/snark/SnarkManager.java:706 +#: ../java/src/org/klomp/snark/SnarkManager.java:974 msgid "Enabled DHT." msgstr "DHT activat." -#: ../java/src/org/klomp/snark/SnarkManager.java:708 +#: ../java/src/org/klomp/snark/SnarkManager.java:976 msgid "Disabled DHT." msgstr "DHT dezactivat." -#: ../java/src/org/klomp/snark/SnarkManager.java:710 +#: ../java/src/org/klomp/snark/SnarkManager.java:978 msgid "DHT change requires tunnel shutdown and reopen" msgstr "Schimbare DHT necesită oprirea tunel și redeschiderea lui" -#: ../java/src/org/klomp/snark/SnarkManager.java:717 +#: ../java/src/org/klomp/snark/SnarkManager.java:985 #, java-format msgid "{0} theme loaded, return to main i2psnark page to view." msgstr "{0} temă încărcata, a reveni la pagina principală i2psnark pentru a vizualiza." -#: ../java/src/org/klomp/snark/SnarkManager.java:727 +#: ../java/src/org/klomp/snark/SnarkManager.java:995 msgid "Configuration unchanged." msgstr "Configuraţia neschimbată" -#: ../java/src/org/klomp/snark/SnarkManager.java:759 +#: ../java/src/org/klomp/snark/SnarkManager.java:1027 msgid "Open Tracker list changed - torrent restart required to take effect." msgstr "Trackere deschise schimbat - repornirea torrentui este necesara să aibă efect." -#: ../java/src/org/klomp/snark/SnarkManager.java:769 +#: ../java/src/org/klomp/snark/SnarkManager.java:1037 msgid "Private tracker list changed - affects newly created torrents only." msgstr "Lista trackerilor private schimbat - afectează doar nou-create torrente." -#: ../java/src/org/klomp/snark/SnarkManager.java:815 +#: ../java/src/org/klomp/snark/SnarkManager.java:1083 #, java-format msgid "Unable to save the config to {0}" msgstr "Imposibil de a salva configurarea {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:893 +#: ../java/src/org/klomp/snark/SnarkManager.java:1164 msgid "Connecting to I2P" msgstr "Conectarea la I2P" -#: ../java/src/org/klomp/snark/SnarkManager.java:896 +#: ../java/src/org/klomp/snark/SnarkManager.java:1167 msgid "Error connecting to I2P - check your I2CP settings!" msgstr "Eroare la conectarea la I2P - verificați setările I2CP!" -#: ../java/src/org/klomp/snark/SnarkManager.java:905 -#: ../java/src/org/klomp/snark/SnarkManager.java:1681 +#: ../java/src/org/klomp/snark/SnarkManager.java:1176 +#: ../java/src/org/klomp/snark/SnarkManager.java:2133 #, java-format msgid "Error: Could not add the torrent {0}" msgstr "Eroare: Nu sa putut adăuga torentul {0}" #. catch this here so we don't try do delete it below -#: ../java/src/org/klomp/snark/SnarkManager.java:927 +#: ../java/src/org/klomp/snark/SnarkManager.java:1199 #, java-format msgid "Cannot open \"{0}\"" msgstr "Nu se poate deschide \"{0}\"." #. TODO - if the existing one is a magnet, delete it and add the metainfo #. instead? -#: ../java/src/org/klomp/snark/SnarkManager.java:946 -#: ../java/src/org/klomp/snark/SnarkManager.java:1047 -#: ../java/src/org/klomp/snark/SnarkManager.java:1129 -#: ../java/src/org/klomp/snark/web/FetchAndAdd.java:159 +#: ../java/src/org/klomp/snark/SnarkManager.java:1218 +#: ../java/src/org/klomp/snark/SnarkManager.java:1352 +#: ../java/src/org/klomp/snark/SnarkManager.java:1440 +#: ../java/src/org/klomp/snark/web/FetchAndAdd.java:166 #, java-format msgid "Torrent with this info hash is already running: {0}" msgstr "Torrent cu aceste informații hash este deja pornit: {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:952 +#: ../java/src/org/klomp/snark/SnarkManager.java:1224 #, java-format msgid "ERROR - No I2P trackers in private torrent \"{0}\"" msgstr "EROARE - Nu sunt trackere I2P in torrent privat \"{0}\"" -#: ../java/src/org/klomp/snark/SnarkManager.java:954 +#: ../java/src/org/klomp/snark/SnarkManager.java:1226 #, java-format msgid "" "Warning - No I2P trackers in \"{0}\", will announce to I2P open trackers and" " DHT only." msgstr "Avertisment - Nu sunt trackere I2P în \"{0}\", va anunța numai la I2P trackers deschise și DHT ." -#: ../java/src/org/klomp/snark/SnarkManager.java:957 +#: ../java/src/org/klomp/snark/SnarkManager.java:1229 #, java-format msgid "" "Warning - No I2P trackers in \"{0}\", and open trackers are disabled, will " "announce to DHT only." msgstr "Avertisment - Nu sunt trackere I2P în \"{0}\", și trackere deschise sunt dezactivate, se va anunța numai prin DHT." -#: ../java/src/org/klomp/snark/SnarkManager.java:959 +#: ../java/src/org/klomp/snark/SnarkManager.java:1231 #, java-format msgid "" "Warning - No I2P trackers in \"{0}\", and DHT and open trackers are " @@ -241,34 +248,34 @@ msgid "" "torrent." msgstr "Avertisment - Nu sunt trackere I2P în \"{0}\", și DHT și trackere deschise sunt dezactivate, ar trebui să permiteti trackere deschise sau DHT înainte de a începe torrent." -#: ../java/src/org/klomp/snark/SnarkManager.java:981 +#: ../java/src/org/klomp/snark/SnarkManager.java:1257 #, java-format msgid "Torrent in \"{0}\" is invalid" msgstr "Torrent în \"{0}\" este incorect" -#: ../java/src/org/klomp/snark/SnarkManager.java:988 -#: ../java/src/org/klomp/snark/web/FetchAndAdd.java:183 +#: ../java/src/org/klomp/snark/SnarkManager.java:1264 +#: ../java/src/org/klomp/snark/web/FetchAndAdd.java:193 #, java-format msgid "ERROR - Out of memory, cannot create torrent from {0}" msgstr "EROARE - Out de memorie, nu se pot crea torrent din {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1000 +#: ../java/src/org/klomp/snark/SnarkManager.java:1285 #, java-format msgid "Torrent added and started: \"{0}\"" msgstr "Torrent adăugat și pornit: \"{0}\"" -#: ../java/src/org/klomp/snark/SnarkManager.java:1002 +#: ../java/src/org/klomp/snark/SnarkManager.java:1287 #, java-format msgid "Torrent added: \"{0}\"" msgstr "Torrent adăugat: \"{0}\"" -#: ../java/src/org/klomp/snark/SnarkManager.java:1058 -#: ../java/src/org/klomp/snark/web/FetchAndAdd.java:87 +#: ../java/src/org/klomp/snark/SnarkManager.java:1363 +#: ../java/src/org/klomp/snark/web/FetchAndAdd.java:93 #, java-format msgid "Fetching {0}" msgstr "Preluarea {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1064 +#: ../java/src/org/klomp/snark/SnarkManager.java:1369 #, java-format msgid "" "Open trackers are disabled and we have no DHT peers. Fetch of {0} may not " @@ -276,311 +283,348 @@ msgid "" "DHT." msgstr "Trackere deschise sunt dezactivate și nu avem colegii DHT. Descarcarea din{0} nu poate reuși până când veți începe un alt torrent, permite trackere deschise, sau permite DHT." -#: ../java/src/org/klomp/snark/SnarkManager.java:1068 +#: ../java/src/org/klomp/snark/SnarkManager.java:1373 #, java-format msgid "Adding {0}" msgstr "Adăugarea {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1100 +#: ../java/src/org/klomp/snark/SnarkManager.java:1406 #, java-format msgid "Download already running: {0}" msgstr "Descarcarea deja rulează: {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1139 -#: ../java/src/org/klomp/snark/SnarkManager.java:1162 -#: ../java/src/org/klomp/snark/SnarkManager.java:1600 +#: ../java/src/org/klomp/snark/SnarkManager.java:1451 +#: ../java/src/org/klomp/snark/SnarkManager.java:1477 +#: ../java/src/org/klomp/snark/SnarkManager.java:2052 #, java-format msgid "Failed to copy torrent file to {0}" msgstr " Copierea fisieurului torent in {0} a esuat" -#: ../java/src/org/klomp/snark/SnarkManager.java:1389 +#: ../java/src/org/klomp/snark/SnarkManager.java:1828 #, java-format msgid "Too many files in \"{0}\" ({1}), deleting it!" msgstr "Prea multe fișiere în \"{0}\" ({1}), ștergeti-le!" -#: ../java/src/org/klomp/snark/SnarkManager.java:1391 +#: ../java/src/org/klomp/snark/SnarkManager.java:1830 #, java-format msgid "Torrent file \"{0}\" cannot end in \".torrent\", deleting it!" msgstr "Torrent \"{0}\" nu se poate termina cu \". Torrent\", ștergeti!" -#: ../java/src/org/klomp/snark/SnarkManager.java:1393 +#: ../java/src/org/klomp/snark/SnarkManager.java:1832 #, java-format msgid "No pieces in \"{0}\", deleting it!" msgstr "Nu sunt piese din \"{0}\", ștergeti!" -#: ../java/src/org/klomp/snark/SnarkManager.java:1395 +#: ../java/src/org/klomp/snark/SnarkManager.java:1834 #, java-format msgid "Too many pieces in \"{0}\", limit is {1}, deleting it!" msgstr "Prea multe piese în \"{0}\", limita este de {1}, ștergeti!" -#: ../java/src/org/klomp/snark/SnarkManager.java:1397 +#: ../java/src/org/klomp/snark/SnarkManager.java:1836 #, java-format msgid "Pieces are too large in \"{0}\" ({1}B), deleting it." msgstr "Piese sunt prea mari în \"{0}\" ({1} B), ștergeti." -#: ../java/src/org/klomp/snark/SnarkManager.java:1398 +#: ../java/src/org/klomp/snark/SnarkManager.java:1837 #, java-format msgid "Limit is {0}B" msgstr "Limita este de {0} B" -#: ../java/src/org/klomp/snark/SnarkManager.java:1400 +#: ../java/src/org/klomp/snark/SnarkManager.java:1839 #, java-format msgid "Torrent \"{0}\" has no data, deleting it!" msgstr "Torrent \"{0}\" nu dispune de date, șterge-o!" -#: ../java/src/org/klomp/snark/SnarkManager.java:1408 +#: ../java/src/org/klomp/snark/SnarkManager.java:1847 #, java-format msgid "Torrents larger than {0}B are not supported yet, deleting \"{1}\"" msgstr "Torrents mai mari de {0} B nu sunt acceptate încă, ștergerea \"{1}\"Torrents mai mari de {0} B nu sunt acceptate încă, ștergerea \"{1}\"" -#: ../java/src/org/klomp/snark/SnarkManager.java:1424 +#: ../java/src/org/klomp/snark/SnarkManager.java:1864 #, java-format msgid "Error: Could not remove the torrent {0}" msgstr "Eroare: Nu am putut șterge torentul {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1445 -#: ../java/src/org/klomp/snark/SnarkManager.java:1463 +#: ../java/src/org/klomp/snark/SnarkManager.java:1887 +#: ../java/src/org/klomp/snark/SnarkManager.java:1906 #, java-format msgid "Torrent stopped: \"{0}\"" msgstr "Torrent oprit: \"{0}\"" -#: ../java/src/org/klomp/snark/SnarkManager.java:1484 +#: ../java/src/org/klomp/snark/SnarkManager.java:1926 #, java-format msgid "Torrent removed: \"{0}\"" msgstr "Torrent sters: \"{0}\"" -#: ../java/src/org/klomp/snark/SnarkManager.java:1492 +#: ../java/src/org/klomp/snark/SnarkManager.java:1934 #, java-format msgid "Adding torrents in {0}" msgstr "Adăugarea torrente în {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1523 +#: ../java/src/org/klomp/snark/SnarkManager.java:1966 #, java-format msgid "Up bandwidth limit is {0} KBps" msgstr "Limita de lățime de bandă la incarcarea este {0} Kbps" -#: ../java/src/org/klomp/snark/SnarkManager.java:1545 +#: ../java/src/org/klomp/snark/SnarkManager.java:1993 #, java-format msgid "Download finished: {0}" msgstr "Descarcare finisata: {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1596 +#: ../java/src/org/klomp/snark/SnarkManager.java:2048 #, java-format msgid "Metainfo received for {0}" msgstr "Metainfo primit pentru {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1597 -#: ../java/src/org/klomp/snark/SnarkManager.java:1826 +#: ../java/src/org/klomp/snark/SnarkManager.java:2049 +#: ../java/src/org/klomp/snark/SnarkManager.java:2280 #, java-format msgid "Starting up torrent {0}" msgstr "Pornirea torrent {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1612 +#: ../java/src/org/klomp/snark/SnarkManager.java:2064 #, java-format msgid "Error on torrent {0}" msgstr "Eroare pe torrent {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1675 +#: ../java/src/org/klomp/snark/SnarkManager.java:2127 msgid "Unable to connect to I2P!" msgstr "Nu se poate stabili o conexiune la I2P" -#: ../java/src/org/klomp/snark/SnarkManager.java:1825 -#: ../java/src/org/klomp/snark/web/FetchAndAdd.java:124 +#: ../java/src/org/klomp/snark/SnarkManager.java:2279 +#: ../java/src/org/klomp/snark/web/FetchAndAdd.java:130 msgid "Opening the I2P tunnel" msgstr "Deschiderea tunelului I2P" -#: ../java/src/org/klomp/snark/SnarkManager.java:1849 +#: ../java/src/org/klomp/snark/SnarkManager.java:2303 msgid "Opening the I2P tunnel and starting all torrents." msgstr "Deschiderea tunelului I2P și pornirea tuturor torrentelor." -#: ../java/src/org/klomp/snark/SnarkManager.java:1912 +#: ../java/src/org/klomp/snark/SnarkManager.java:2366 msgid "Stopping all torrents and closing the I2P tunnel." msgstr "Oprirea tuturor torrentelor și inchiderea tunelului I2P" -#: ../java/src/org/klomp/snark/SnarkManager.java:1931 +#: ../java/src/org/klomp/snark/SnarkManager.java:2385 msgid "Closing I2P tunnel after notifying trackers." msgstr "Închiderea tunelului I2P după notificarea trackere." -#: ../java/src/org/klomp/snark/TrackerClient.java:234 +#: ../java/src/org/klomp/snark/TrackerClient.java:245 #, java-format msgid "No valid trackers for {0} - enable opentrackers or DHT?" msgstr "Nu sunt trackere valabile pentru {0} - permite opentrackers sau DHT?" #: ../java/src/org/klomp/snark/UpdateHandler.java:49 -#: ../java/src/org/klomp/snark/UpdateRunner.java:227 +#: ../java/src/org/klomp/snark/UpdateRunner.java:228 msgid "Updating" msgstr "Actualizare" -#: ../java/src/org/klomp/snark/UpdateRunner.java:114 +#: ../java/src/org/klomp/snark/UpdateRunner.java:115 #, java-format msgid "Updating from {0}" msgstr "Actualizarea din {0}" -#: ../java/src/org/klomp/snark/web/FetchAndAdd.java:75 +#: ../java/src/org/klomp/snark/web/FetchAndAdd.java:80 #, java-format msgid "Download torrent file from {0}" msgstr "Descărca fișierul torrent de la {0}" -#: ../java/src/org/klomp/snark/web/FetchAndAdd.java:97 +#: ../java/src/org/klomp/snark/web/FetchAndAdd.java:103 #, java-format msgid "Torrent was not retrieved from {0}" msgstr "Torrent nu a fost preluat de la {0}" -#: ../java/src/org/klomp/snark/web/FetchAndAdd.java:150 +#: ../java/src/org/klomp/snark/web/FetchAndAdd.java:157 #, java-format msgid "Torrent fetched from {0}" msgstr "Torrent preluat de la {0}" -#: ../java/src/org/klomp/snark/web/FetchAndAdd.java:171 +#: ../java/src/org/klomp/snark/web/FetchAndAdd.java:178 #, java-format msgid "Torrent already running: {0}" msgstr "Torrent deja rulează: {0}" -#: ../java/src/org/klomp/snark/web/FetchAndAdd.java:173 +#: ../java/src/org/klomp/snark/web/FetchAndAdd.java:180 #, java-format msgid "Torrent already in the queue: {0}" msgstr "Torrent deja în coada de așteptare: {0}" -#: ../java/src/org/klomp/snark/web/FetchAndAdd.java:181 +#: ../java/src/org/klomp/snark/web/FetchAndAdd.java:191 #, java-format msgid "Torrent at {0} was not valid" msgstr "Torrent la {0} nu a fost valid" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:254 -msgid "I2PSnark - Anonymous BitTorrent Client" -msgstr "I2PSnark - BitTorrent Client Anonim" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:267 -msgid "Router is down" -msgstr "Router-ul este deactivat" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:284 -msgid "Torrents" -msgstr "Torente" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:288 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:298 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1486 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2255 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:268 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:311 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:322 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1763 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2662 msgid "I2PSnark" msgstr "I2PSnark" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:294 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:273 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2149 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2422 +msgid "Configuration" +msgstr "Configurație" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:275 +msgid "Anonymous BitTorrent Client" +msgstr "Client Bittorrent anonim" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:289 +msgid "Router is down" +msgstr "Router-ul este deactivat" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:306 +msgid "Torrents" +msgstr "Torente" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:317 msgid "Refresh page" msgstr "refresh pagina" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:302 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:326 msgid "Forum" msgstr "Forum" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:315 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:341 msgid "Click \"Add torrent\" button to fetch torrent" msgstr "Faceți clic pe \"Adauga torrent\" pentru a aduce torrent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:352 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:353 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:394 msgid "clear messages" msgstr "stergerea mesajelor" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:405 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:407 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2440 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2442 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:449 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2980 msgid "Status" msgstr "Stare" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:418 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:420 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:451 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:493 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:511 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:537 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:568 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:583 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:598 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2953 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2970 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2982 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2994 +#, java-format +msgid "Sort by {0}" +msgstr "Sortează după {0}" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:462 msgid "Hide Peers" msgstr "Ascunde utilizatori" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:430 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:432 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:468 msgid "Show Peers" msgstr "Arată utilizatori" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:439 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:441 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2249 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2269 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:491 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2648 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2681 msgid "Torrent" msgstr "Torent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:449 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:493 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2953 +msgid "File type" +msgstr "Tip fișier" + +#. Translators: Please keep short or translate as " " +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:509 +msgid "ETA" +msgstr "eta" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:511 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:512 msgid "Estimated time remaining" msgstr "Estimare timp rămas" #. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:452 -msgid "ETA" -msgstr "eta" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:457 -msgid "Downloaded" -msgstr "Descărcat" - -#. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:460 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:535 msgid "RX" msgstr "RX" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:465 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:537 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:538 +msgid "Downloaded" +msgstr "Descărcat" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:537 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2818 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2968 +msgid "Size" +msgstr "Dimensiune" + +#. Translators: Please keep short or translate as " " +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:566 +msgid "TX" +msgstr "TX" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:568 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2836 +msgid "Upload ratio" +msgstr "Rată de încărcare" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:568 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:569 msgid "Uploaded" msgstr "Încărcat" #. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:468 -msgid "TX" -msgstr "TX" +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:581 +msgid "RX Rate" +msgstr "RX Rate" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:474 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:583 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:584 msgid "Down Rate" msgstr "Rata de descarcare " #. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:477 -msgid "RX Rate" -msgstr "RX Rate" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:483 -msgid "Up Rate" -msgstr "Rata de incarcare " - -#. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:486 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:596 msgid "TX Rate" msgstr "TX Rate" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:501 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:598 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:599 +msgid "Up Rate" +msgstr "Rata de incarcare " + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:615 msgid "Stop all torrents and the I2P tunnel" msgstr "Opreste toate torrentele și tunelul I2P" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:503 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:617 msgid "Stop All" msgstr "Oprește toate" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:515 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:629 msgid "Start all stopped torrents" msgstr "Începeți toate torrentele oprite" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:517 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:531 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:631 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:645 msgid "Start All" msgstr "Pornește toate" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:529 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:643 msgid "Start all torrents and the I2P tunnel" msgstr "Porneste toate torrentele și tunelul I2P" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:555 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:668 msgid "No torrents loaded." msgstr "Niciun torent încărcat." -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:561 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:674 msgid "Totals" msgstr "Totaluri" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:563 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:676 #, java-format msgid "1 torrent" msgid_plural "{0} torrents" @@ -588,7 +632,7 @@ msgstr[0] "1 torrent" msgstr[1] "{0} torrente" msgstr[2] "{0} torrentу" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:568 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:681 #, java-format msgid "1 connected peer" msgid_plural "{0} connected peers" @@ -596,7 +640,7 @@ msgstr[0] "{0} utilizator conectat " msgstr[1] "{0} utilizatori conectati" msgstr[2] "{0} utilizatori conectati" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:575 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:688 #, java-format msgid "1 DHT peer" msgid_plural "{0} DHT peers" @@ -604,174 +648,207 @@ msgstr[0] "1 partener DHT" msgstr[1] "{0} parteneri DHT" msgstr[2] "{0} parteneri DHT" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:611 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:695 +msgid "Dest" +msgstr "Dest" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:823 msgid "First" msgstr "Primul" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:611 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:823 msgid "First page" msgstr "P&rima pagină" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:622 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:833 msgid "Prev" msgstr "Prev" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:622 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:833 msgid "Previous page" msgstr "Pagina anterioară" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:657 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:866 msgid "Next" msgstr "Următorul" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:657 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:866 msgid "Next page" msgstr "Pagina următoare" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:667 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:874 msgid "Last" msgstr "Ultimul" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:667 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:874 msgid "Last page" msgstr "Ultima pagină" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:750 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:960 +msgid "Data directory cannot be created" +msgstr "Directorul de date nu poate fi creat" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:970 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1176 +#, java-format +msgid "Cannot add torrent {0} inside another torrent: {1}" +msgstr "Nu se poate adăuga torrentul {0} în interiorul altui torrent: {1}" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:985 #, java-format msgid "Invalid URL: Must start with \"http://\", \"{0}\", or \"{1}\"" msgstr "URL incorect: trebuie să înceapă cu \"http://\", \"{0}\", sau \"{1}\"" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:793 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:823 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1026 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1055 #, java-format msgid "Magnet deleted: {0}" msgstr "Magnet sters: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:801 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:829 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1034 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1061 #, java-format msgid "Torrent file deleted: {0}" msgstr "Fișier torrent șters: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:821 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1053 #, java-format msgid "Download deleted: {0}" msgstr "Descarcă șterse: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:835 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1070 #, java-format msgid "Data file deleted: {0}" msgstr "Fișier data șters: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:837 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:848 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1072 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1081 #, java-format msgid "Data file could not be deleted: {0}" msgstr "Fișier de date nu a putut fi șters: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:863 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:872 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1097 #, java-format msgid "Directory could not be deleted: {0}" msgstr "Dosarul nu a putut fi sters {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:870 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1104 #, java-format msgid "Directory deleted: {0}" msgstr "Directorii șterse: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:942 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1155 +#, java-format +msgid "Cannot add a torrent ending in \".torrent\": {0}" +msgstr "Nu se poate adăuga un torrent terminat în \".torrent\": {0}" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1160 +#, java-format +msgid "Torrent with this name is already running: {0}" +msgstr "Torrentul cu acest nume deja rulează: {0}" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1166 +#, java-format +msgid "Cannot add a torrent including an I2P directory: {0}" +msgstr "Nu se poate adăuga un torent ce include un director I2P: {0}" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1181 +#, java-format +msgid "Cannot add torrent {0} including another torrent: {1}" +msgstr "Nu se poate adăuga torrent {0} ce include un alt torrent: {1}" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1207 msgid "Error - Cannot include alternate trackers without a primary tracker" msgstr "Eroare - Nu pot conține trackere alternative fără un tracker primar" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:955 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1220 msgid "Error - Cannot mix private and public trackers in a torrent" msgstr "Eroare - Nu se poate amesteca trackere publice și private într-un torent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:975 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1242 #, java-format msgid "Torrent created for \"{0}\"" msgstr "Torrent creat pentru \"{0}\"" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:977 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1244 #, java-format msgid "" "Many I2P trackers require you to register new torrents before seeding - " "please do so before starting \"{0}\"" msgstr "Multe trackere I2P cer să vă înregistrați torrentele noi înainte de seedat - vă rugăm să faceți acest lucru înainte de a începe \"{0}\"" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:979 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1246 #, java-format msgid "Error creating a torrent for \"{0}\"" msgstr "Eroare la crearea unui torrent pentru \"{0}\"" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:983 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1250 #, java-format msgid "Cannot create a torrent for the nonexistent data: {0}" msgstr "Nu se poate crea un torrent pentru datele inexistente: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:986 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1253 msgid "Error creating torrent - you must enter a file or directory" msgstr "Eroare la crearea torrent - trebuie să introduceți un fișier sau director" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1017 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2031 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1284 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2406 msgid "Delete selected" msgstr "Șterge pe cel ales" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1017 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2032 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1284 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2408 msgid "Save tracker configuration" msgstr "Salvați configurația tracker" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1034 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1301 msgid "Removed" msgstr "Șters" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1063 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2030 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2035 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1333 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2405 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2407 msgid "Add tracker" msgstr "Adaugă tracker" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1086 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1089 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1356 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1359 msgid "Enter valid tracker name and URLs" msgstr "Introduceți numele tracker valid și URL-uri" #. "\n" + -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1091 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2034 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1361 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2410 msgid "Restore defaults" msgstr "Restabileşte implicitele" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1094 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1364 msgid "Restored default trackers" msgstr "Trackers implicite restaurate" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1215 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1216 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1472 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1473 msgid "Checking" msgstr "Se verifică" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1218 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1219 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1475 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1476 msgid "Allocating" msgstr "Alocare" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1233 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1240 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1490 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1499 msgid "Tracker Error" msgstr "Eroare tracker" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1235 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1263 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1268 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1279 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1284 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1290 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1295 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1492 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1522 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1527 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1538 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1543 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1549 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1554 #, java-format msgid "1 peer" msgid_plural "{0} peers" @@ -779,356 +856,366 @@ msgstr[0] "1 partener" msgstr[1] "{0} parteneri" msgstr[2] "{0} parteneri" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1243 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1244 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1502 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1503 msgid "Starting" msgstr "Începere" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1252 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1511 msgid "Seeding" msgstr "Încărcare" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1256 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1270 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1271 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2382 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2496 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1515 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1529 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1530 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2831 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3047 msgid "Complete" msgstr "Complet" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1275 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1276 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1281 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1282 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1534 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1535 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1540 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1541 msgid "OK" msgstr "OK" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1286 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1287 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1292 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1293 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1545 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1546 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1551 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1552 msgid "Stalled" msgstr "Întrerupt" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1297 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1298 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1301 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1302 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1556 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1557 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1560 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1561 msgid "No Peers" msgstr "Nu sunt utilizatori" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1304 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1305 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1563 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1564 msgid "Stopped" msgstr "Oprit" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1338 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1593 msgid "Torrent details" msgstr "Detalii torent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1367 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1628 msgid "View files" msgstr "Vizualizare fișierilor" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1369 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1630 msgid "Open file" msgstr "Deschide fișier" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1411 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1682 msgid "Stop the torrent" msgstr "Oprește torentul" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1413 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1684 msgid "Stop" msgstr "Stop" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1425 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1697 msgid "Start the torrent" msgstr "Pornește torentul" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1427 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1699 msgid "Start" msgstr "Start" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1439 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1712 msgid "Remove the torrent from the active list, deleting the .torrent file" msgstr "Scoateți torrent din lista torentelor activi, ștergem fișierul 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 quote must be escaped -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1444 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1717 #, java-format msgid "" "Are you sure you want to delete the file \\''{0}\\'' (downloaded data will " "not be deleted) ?" msgstr "Sigur doriți să ștergeți dosarul \\'' {0} \\'' (datele descărcate nu vor fi șterse)?" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1447 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1721 msgid "Remove" msgstr "Șterge" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1459 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1734 msgid "Delete the .torrent file and the associated data file(s)" msgstr "Ștergeți fișierul torrent. Și fișier(e) de date asociat(e)" #. 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:1464 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1739 #, java-format msgid "" "Are you sure you want to delete the torrent \\''{0}\\'' and all downloaded " "data?" msgstr "Sigur doriți să ștergeți torrent \\'' {0} \\'' și toate datele descărcate?" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1467 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1997 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1743 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2364 msgid "Delete" msgstr "Șterge" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1502 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1779 msgid "Unknown" msgstr "Necunoscut" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1514 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1791 msgid "Seed" msgstr "Seed" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1537 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1814 msgid "Uninteresting (The peer has no pieces we need)" msgstr "Neinteresante (partener nu are piese de care avem nevoie)" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1539 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1816 msgid "Choked (The peer is not allowing us to request pieces)" msgstr "Înecat (partener nu ne permite să solicitam bucăți)" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1559 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1836 msgid "Uninterested (We have no pieces the peer needs)" msgstr "Neinteresat (Nu avem piese de care are nevoie partener)" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1561 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1838 msgid "Choking (We are not allowing the peer to request pieces)" msgstr "partenerSufocare (Noi nu permitem partenerului solicitarea bucăților)" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1616 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1954 #, java-format msgid "Details at {0} tracker" msgstr "Detalii la tracker {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1633 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1971 msgid "Info" msgstr "Info" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1684 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2044 msgid "Add Torrent" msgstr "Adaugă torent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1686 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2047 msgid "From URL" msgstr "Din URL" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1689 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2050 msgid "" "Enter the torrent file download URL (I2P only), magnet link, maggot link, or" " info hash" msgstr "Introduceți URL-ul de descarcare fișierilor torrent (I2P numai), link-ul magnet, maggot-link, sau info hash" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1694 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2055 msgid "Add torrent" msgstr "Adaugă torent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1697 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2059 +msgid "Data dir" +msgstr "Dir date" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2062 +#, java-format +msgid "Enter the directory to save the data in (default {0})" +msgstr "Introdu directorul în care să se salveze datele (default {0})" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2066 #, java-format msgid "You can also copy .torrent files to: {0}." msgstr "De asemenea, puteți copia fișiere torrent la: {0}." -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1699 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2068 msgid "Removing a .torrent will cause it to stop." msgstr "Stergerea .torrent va face ca acesta să se oprească." -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1722 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2081 msgid "Create Torrent" msgstr "Creează un torent" #. out.write("From file:
\n"); -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1725 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2084 msgid "Data to seed" msgstr "Date pentru seedare" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1729 -msgid "File or directory to seed (must be within the specified path)" -msgstr "Fișier sau director de seedare (trebuie să fie în calea specificată)" +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2088 +#, java-format +msgid "File or directory to seed (full path or within the directory {0} )" +msgstr "Fișier sau director de seedare (calea completă sau în director {0} )" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1731 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1975 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2091 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2337 msgid "Trackers" msgstr "Trackere" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1733 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2093 msgid "Primary" msgstr "Primar" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1735 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2095 msgid "Alternates" msgstr "Alternativă" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1738 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2098 msgid "Create torrent" msgstr "Creează un torent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1756 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2116 msgid "none" msgstr "nici unul" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1789 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2046 -msgid "Configuration" -msgstr "Configurație" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1793 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2153 msgid "Data directory" msgstr "Dosar cu date" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1797 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2158 msgid "Files readable by all" msgstr "Fișiere lizibile de către toți" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1801 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2162 msgid "If checked, other users may access the downloaded files" msgstr "Dacă este bifată, utilizatorii pot accesa fișierele descărcate" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1805 -msgid "Auto start" -msgstr "Start automat" +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2166 +msgid "Auto start torrents" +msgstr "Pornește automat torrente" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1809 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2170 msgid "If checked, automatically start torrents that are added" msgstr "Dacă este bifată, începe automat torrentele care sunt adăugate" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1813 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2174 msgid "Theme" msgstr "Teme" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1826 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2188 msgid "Refresh time" msgstr "Timp de reîmprospătare" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1839 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2201 msgid "Never" msgstr "Niciodată" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1845 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2207 msgid "Startup delay" msgstr "întârziere de pornire" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1847 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2209 msgid "minutes" msgstr "minute" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1851 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2213 msgid "Page size" msgstr "Mărimea paginii" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1853 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2215 msgid "torrents" msgstr "Torente" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1877 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2239 msgid "Total uploader limit" msgstr "Limită totală de încărcare" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1880 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2242 msgid "peers" msgstr "Parteneri" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1884 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2246 msgid "Up bandwidth limit" msgstr "limita de incarcare de lățime de bandă" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1887 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2249 msgid "Half available bandwidth recommended." msgstr "Jumătate lățime de bandă disponibilă este recomandat." -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1889 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2251 msgid "View or change router bandwidth" msgstr "Vizualizeaza sau modifica lățime de bandă router" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1893 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2255 msgid "Use open trackers also" msgstr "Utilizați trackere deschise, de asemenea," -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1897 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2259 msgid "" "If checked, announce torrents to open trackers as well as the tracker listed" " in the torrent file" msgstr "Dacă este bifată, anunta torrente pentru a urmări trackere deschise , precum și trackere listate în fișierul torrent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1901 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2263 msgid "Enable DHT" msgstr "Activează DHT" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1905 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2267 msgid "If checked, use DHT" msgstr "Dacă este bifată, utilizați DHT" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1921 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2283 msgid "Inbound Settings" msgstr "Setări de intrare" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1927 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2289 msgid "Outbound Settings" msgstr "Setări de ieșire" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1935 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2297 msgid "I2CP host" msgstr "Portul I2CP" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1940 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2302 msgid "I2CP port" msgstr "Portul I2CP" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1955 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2317 msgid "I2CP options" msgstr "Opțiuni I2CP" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1960 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2322 msgid "Save configuration" msgstr "Salvare configurări" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1980 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2342 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2953 msgid "Name" msgstr "Nume" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1982 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2344 msgid "Website URL" msgstr "URL website" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1984 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2530 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2346 +msgid "Standard" +msgstr "Standard" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2348 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3080 msgid "Open" msgstr "Deschis" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1986 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2350 msgid "Private" msgstr "Privat" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1988 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2352 msgid "Announce URL" msgstr "URL de anuntare" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2022 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2396 msgid "Add" msgstr "Adaugă" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2062 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2439 #, java-format msgid "Invalid magnet URL {0}" msgstr "URL-ul magnet invalid {0}" #. * dummies for translation -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2070 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2447 #, java-format msgid "1 hop" msgid_plural "{0} hops" @@ -1136,7 +1223,7 @@ msgstr[0] "1 hop" msgstr[1] "{0} hop-uri" msgstr[2] "{0} hop-uri" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2071 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2448 #, java-format msgid "1 tunnel" msgid_plural "{0} tunnels" @@ -1144,106 +1231,119 @@ msgstr[0] "1 tunel" msgstr[1] "{0} tunele" msgstr[2] "{0} tunele" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2278 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2691 msgid "Torrent file" msgstr "Fișier torent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2291 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2699 +msgid "Data location" +msgstr "Locaţie date" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2708 +msgid "Info hash" +msgstr "Informație index" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2727 msgid "Primary Tracker" msgstr "Tracker primar" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2300 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2736 msgid "Tracker List" msgstr "Lista Tracker" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2324 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2761 msgid "Comment" msgstr "Comentariu" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2333 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2771 msgid "Created" msgstr "Creat" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2343 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2782 msgid "Created By" msgstr "Creat de" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2353 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2794 msgid "Magnet link" msgstr "Legătură Magnet" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2360 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2807 msgid "Private torrent" msgstr "Torrent privat" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2370 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2434 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2436 -msgid "Size" -msgstr "Dimensiune" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2377 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2827 msgid "Completion" msgstr "Completare" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2387 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2856 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2982 msgid "Remaining" msgstr "Rămas" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2394 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2866 msgid "Files" msgstr "Fișiere" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2399 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2873 msgid "Pieces" msgstr "Piese:" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2403 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2879 msgid "Piece size" msgstr "Dimensiune piesei" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2426 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2430 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2933 msgid "Directory" msgstr "Dosar" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2447 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2449 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2992 msgid "Priority" msgstr "Prioritate" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2455 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3004 msgid "Up to higher level directory" msgstr "Spre dosarul de nivel superior" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2485 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3038 msgid "Torrent not found?" msgstr "Torrent nu a fost găsit?" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2493 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3044 msgid "File not found in torrent?" msgstr "Fișierul nu a fost găsit în torrent?" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2506 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3057 msgid "complete" msgstr "încheiat" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2507 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3058 msgid "remaining" msgstr "Rămas" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2556 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3104 msgid "High" msgstr "Ridicat" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2561 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3109 msgid "Normal" msgstr "Normal" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2566 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3114 msgid "Skip" msgstr "Omitere" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2575 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3124 +msgid "Set all high" +msgstr "Configurează toate ca înalte" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3126 +msgid "Set all normal" +msgstr "Configurează toate ca normal" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3128 +msgid "Skip all" +msgstr "Omite tot" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3129 msgid "Save priorities" msgstr "Salvați priorități" diff --git a/apps/i2ptunnel/locale-proxy/messages_uk.po b/apps/i2ptunnel/locale-proxy/messages_uk.po index c2ca97ac1..6bb879d82 100644 --- a/apps/i2ptunnel/locale-proxy/messages_uk.po +++ b/apps/i2ptunnel/locale-proxy/messages_uk.po @@ -4,8 +4,9 @@ # To contribute translations, see http://www.i2p2.de/newdevelopers # # Translators: -# Denis Blank , 2011 -# Denis Blank , 2012 +# Denis Lysenko , 2015 +# Denis Lysenko , 2011 +# Denis Lysenko , 2012 # jonny_nut, 2014 # madjong , 2014 # puxud , 2014 @@ -13,10 +14,10 @@ msgid "" msgstr "" "Project-Id-Version: I2P\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-03-29 14:30+0000\n" -"PO-Revision-Date: 2015-03-29 14:31+0000\n" -"Last-Translator: kytv \n" -"Language-Team: Ukrainian (Ukraine) (http://www.transifex.com/projects/p/I2P/language/uk_UA/)\n" +"POT-Creation-Date: 2015-05-14 08:33+0000\n" +"PO-Revision-Date: 2015-08-07 17:15+0000\n" +"Last-Translator: Denis Lysenko \n" +"Language-Team: Ukrainian (Ukraine) (http://www.transifex.com/otf/I2P/language/uk_UA/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -36,7 +37,7 @@ msgstr "" #: ../java/build/Proxy.java:129 ../java/build/Proxy.java:140 #: ../java/build/Proxy.java:151 ../java/build/Proxy.java:164 #: ../java/build/Proxy.java:173 ../java/build/Proxy.java:185 -#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:192 +#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:207 msgid "Router Console" msgstr "Консоль роутера" @@ -50,7 +51,7 @@ msgstr "Консоль роутера" #: ../java/build/Proxy.java:152 ../java/build/Proxy.java:165 #: ../java/build/Proxy.java:174 ../java/build/Proxy.java:186 msgid "I2P Router Console" -msgstr "Консоль роутера" +msgstr "Консоль роутера I2P" #: ../java/build/Proxy.java:8 ../java/build/Proxy.java:20 #: ../java/build/Proxy.java:30 ../java/build/Proxy.java:40 @@ -61,7 +62,7 @@ msgstr "Консоль роутера" #: ../java/build/Proxy.java:131 ../java/build/Proxy.java:142 #: ../java/build/Proxy.java:153 ../java/build/Proxy.java:166 #: ../java/build/Proxy.java:175 ../java/build/Proxy.java:187 -#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:193 +#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:208 msgid "Configuration" msgstr "Настройки" @@ -74,7 +75,7 @@ msgstr "Настройки" #: ../java/build/Proxy.java:132 ../java/build/Proxy.java:143 #: ../java/build/Proxy.java:154 ../java/build/Proxy.java:167 #: ../java/build/Proxy.java:176 ../java/build/Proxy.java:188 -#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:193 +#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:208 msgid "Help" msgstr "Допомога" @@ -87,7 +88,7 @@ msgstr "Допомога" #: ../java/build/Proxy.java:133 ../java/build/Proxy.java:144 #: ../java/build/Proxy.java:155 ../java/build/Proxy.java:168 #: ../java/build/Proxy.java:177 ../java/build/Proxy.java:189 -#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:193 +#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:208 msgid "Addressbook" msgstr "Адресна книга" @@ -440,15 +441,15 @@ msgid "" "tunnel." msgstr "" -#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:610 +#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:634 msgid "This seems to be a bad destination:" msgstr "Скоріше всього це поганий адрес призначення:" -#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:611 +#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:635 msgid "i2paddresshelper cannot help you with a destination like that!" msgstr "i2paddresshelper не може допомогти Вам з місцем призначення як це!" -#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:684 +#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:709 #, java-format msgid "" "To visit the destination in your host database, click here." msgstr "Для того щоб перейти по локальному посиланню з локальної адресної книги, натисніть осьтут. Для переходу по новому addresshelper-посиланню, натисніть будь-ласка тут." -#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1095 +#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1119 msgid "Destination lease set not found" msgstr "" -#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1245 +#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1271 msgid "Host" msgstr "Адрес" -#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1249 +#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1275 msgid "Base 32" msgstr "" -#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1253 +#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1279 msgid "Destination" msgstr "Адреса призначення" -#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1259 +#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1285 #, java-format msgid "Continue to {0} without saving" msgstr "Продовжити до {0} без збереження" -#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1265 +#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1291 #, java-format msgid "Save {0} to router address book and continue to website" msgstr "" #. only blockfile supports multiple books -#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1268 +#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1294 #, java-format msgid "Save {0} to master address book and continue to website" msgstr "" -#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1269 +#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1295 #, java-format msgid "Save {0} to private address book and continue to website" msgstr "" -#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:156 +#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:169 #, java-format msgid "Added via address helper from {0}" msgstr "Додано через address helper {0}" -#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:158 +#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:171 msgid "Added via address helper" msgstr "Додано через address helper" -#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:175 +#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:188 msgid "router" msgstr "роутер" -#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:177 +#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:190 msgid "master" msgstr "" -#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:179 +#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:192 msgid "private" msgstr "" -#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:186 +#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:201 #, java-format msgid "Redirecting to {0}" msgstr "Перенаправляємо до {0}" -#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:198 +#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:213 #, java-format msgid "Saved {0} to the {1} addressbook, redirecting now." msgstr "{0} збережено в {1} адресної книги, перенапрявляємо." -#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:199 +#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:214 #, java-format msgid "Failed to save {0} to the {1} addressbook, redirecting now." msgstr "Не вдалось зберегти {0} в {1} адресної книги, перенаправляємо." -#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:201 +#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:216 msgid "Click here if you are not redirected automatically." msgstr "Клацніть тут якщо вас не перенаправило автоматично." diff --git a/apps/i2ptunnel/locale/messages_sv.po b/apps/i2ptunnel/locale/messages_sv.po index 9a18890a0..9bc348aea 100644 --- a/apps/i2ptunnel/locale/messages_sv.po +++ b/apps/i2ptunnel/locale/messages_sv.po @@ -4,6 +4,7 @@ # To contribute translations, see http://www.i2p2.de/newdevelopers # # Translators: +# Anders Nilsson , 2015 # Calle Rundgren , 2013 # cacapo , 2015 # hottuna , 2013 @@ -14,9 +15,9 @@ msgstr "" "Project-Id-Version: I2P\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-03-29 14:30+0000\n" -"PO-Revision-Date: 2015-04-09 17:35+0000\n" -"Last-Translator: cacapo \n" -"Language-Team: Swedish (Sweden) (http://www.transifex.com/projects/p/I2P/language/sv_SE/)\n" +"PO-Revision-Date: 2015-08-25 20:41+0000\n" +"Last-Translator: Anders Nilsson \n" +"Language-Team: Swedish (Sweden) (http://www.transifex.com/otf/I2P/language/sv_SE/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -108,7 +109,7 @@ msgstr "Standard klient" #: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:378 msgid "HTTP/HTTPS client" -msgstr "HTTP/HTTPS klient" +msgstr "HTTP/HTTPS-klient" #: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:379 msgid "IRC client" @@ -163,11 +164,11 @@ msgstr "Ogiltig adress" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:82 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:85 msgid "Hidden Services Manager" -msgstr "Manager Dolda Tjänster" +msgstr "Hanterare för dolda tjänster" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:86 msgid "Edit Client Tunnel" -msgstr "Redigera Klienttunnel" +msgstr "Redigera klienttunnel" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:114 msgid "Edit proxy settings" @@ -240,11 +241,11 @@ msgstr "Utgående proxier" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:245 msgid "SSL Outproxies" -msgstr "SSL Outproxies" +msgstr "SSL-utproxies" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:251 msgid "Use Outproxy Plugin" -msgstr "Använd Outproxy Plugin" +msgstr "Använd Outproxy-plugin" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:255 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:293 @@ -313,22 +314,22 @@ msgstr "Längd" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:318 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:316 msgid "0 hop tunnel (no anonymity)" -msgstr "0 hop tunnel (ingen anonymitet)" +msgstr "0-hopp tunnel (ingen anonymitet)" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:322 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:320 msgid "1 hop tunnel (low anonymity)" -msgstr "1 hop tunnel (låg anonymitet)" +msgstr "1-hopp tunnel (låg anonymitet)" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:326 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:324 msgid "2 hop tunnel (medium anonymity)" -msgstr "2 hot tunnel (medium anonymitet)" +msgstr "2-hopp tunnel (medium anonymitet)" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:330 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:328 msgid "3 hop tunnel (high anonymity)" -msgstr "3 hop tunnel (hög anonymitet)" +msgstr "3-hopp tunnel (hög anonymitet)" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:338 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:336 @@ -519,23 +520,23 @@ msgstr "Lokalt mål" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:524 msgid "Local Base 32" -msgstr "Lokal Base 32" +msgstr "Lokal bas32" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:533 msgid "Pass User-Agent header through" -msgstr "Förmedla User-Agent header" +msgstr "Skicka User-Agent-fältet vidare" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:539 msgid "Pass Referer header through" -msgstr "Förmedla Referer header" +msgstr "Skicka Referer-fältet vidare" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:545 msgid "Pass Accept headers through" -msgstr "Förmedla Accept headers" +msgstr "Skicka Accept-fältet vidare" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:551 msgid "Allow SSL to I2P addresses" -msgstr "Tillåt SSL till I2P adresser" +msgstr "Tillåt SSL till I2P-adresser" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:562 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:618 @@ -591,7 +592,7 @@ msgstr "Spara" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:86 msgid "Edit Hidden Service" -msgstr "Redigera Dold Tjänst" +msgstr "Redigera dold tjänst" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:114 msgid "Edit server settings" @@ -663,7 +664,7 @@ msgstr "Blockera tillgång via inproxies" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:497 msgid "Unique Local Address per Client" -msgstr "Unik Lokal Adress per Klient" +msgstr "Unik lokal adress per klient" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:503 msgid "Optimize for Multihoming" @@ -745,7 +746,7 @@ msgstr "Starta Om Alla" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:126 msgid "I2P Hidden Services" -msgstr "I2P Dolda Tjänster" +msgstr "I2P Dolda tjänster" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:130 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:151 diff --git a/apps/i2ptunnel/locale/messages_uk.po b/apps/i2ptunnel/locale/messages_uk.po index 30b9a24a0..206a7a162 100644 --- a/apps/i2ptunnel/locale/messages_uk.po +++ b/apps/i2ptunnel/locale/messages_uk.po @@ -5,8 +5,8 @@ # # Translators: # asteryx , 2015 -# Denis Blank , 2011 -# Denis Blank , 2012 +# Denis Lysenko , 2011 +# Denis Lysenko , 2012 # LinuxChata, 2014 # madjong , 2014-2015 # brianhopes , 2015 @@ -15,9 +15,9 @@ msgstr "" "Project-Id-Version: I2P\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-03-29 14:30+0000\n" -"PO-Revision-Date: 2015-05-07 07:43+0000\n" -"Last-Translator: brianhopes \n" -"Language-Team: Ukrainian (Ukraine) (http://www.transifex.com/projects/p/I2P/language/uk_UA/)\n" +"PO-Revision-Date: 2015-08-07 16:31+0000\n" +"Last-Translator: Denis Lysenko \n" +"Language-Team: Ukrainian (Ukraine) (http://www.transifex.com/otf/I2P/language/uk_UA/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" diff --git a/apps/ministreaming/locale/messages_uk.po b/apps/ministreaming/locale/messages_uk.po index c10b20698..fab6b0800 100644 --- a/apps/ministreaming/locale/messages_uk.po +++ b/apps/ministreaming/locale/messages_uk.po @@ -4,6 +4,7 @@ # To contribute translations, see http://www.i2p2.de/newdevelopers # # Translators: +# Denis Lysenko , 2015 # madjong , 2015 # puxud , 2014 msgid "" @@ -11,9 +12,9 @@ msgstr "" "Project-Id-Version: I2P\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-03-29 14:30+0000\n" -"PO-Revision-Date: 2015-04-10 13:47+0000\n" -"Last-Translator: madjong \n" -"Language-Team: Ukrainian (Ukraine) (http://www.transifex.com/projects/p/I2P/language/uk_UA/)\n" +"PO-Revision-Date: 2015-08-07 17:12+0000\n" +"Last-Translator: Denis Lysenko \n" +"Language-Team: Ukrainian (Ukraine) (http://www.transifex.com/otf/I2P/language/uk_UA/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -22,11 +23,11 @@ msgstr "" #: ../java/src/net/i2p/client/streaming/I2PSocketException.java:69 msgid "Message timeout" -msgstr "" +msgstr "Тайм-аут повідомлення" #: ../java/src/net/i2p/client/streaming/I2PSocketException.java:72 msgid "Failed delivery to local destination" -msgstr "" +msgstr "Не вдалось доставити до локального призначення" #: ../java/src/net/i2p/client/streaming/I2PSocketException.java:75 #: ../java/src/net/i2p/client/streaming/I2PSocketException.java:108 @@ -51,11 +52,11 @@ msgstr "" #: ../java/src/net/i2p/client/streaming/I2PSocketException.java:90 msgid "Buffer overflow" -msgstr "" +msgstr "Буфер заповнено" #: ../java/src/net/i2p/client/streaming/I2PSocketException.java:93 msgid "Message expired" -msgstr "" +msgstr "Повідомлення застаріло" #: ../java/src/net/i2p/client/streaming/I2PSocketException.java:96 msgid "Local lease set invalid" diff --git a/apps/routerconsole/locale-countries/messages_pl.po b/apps/routerconsole/locale-countries/messages_pl.po index 077b78902..f8a1f59f8 100644 --- a/apps/routerconsole/locale-countries/messages_pl.po +++ b/apps/routerconsole/locale-countries/messages_pl.po @@ -9,15 +9,16 @@ # polacco , 2014 # polacco , 2012 # PolishAnon , 2011 +# Taporpo Ne , 2015 # Tracerneo , 2013 msgid "" msgstr "" "Project-Id-Version: I2P\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-07-17 01:08+0000\n" -"PO-Revision-Date: 2015-07-17 01:31+0000\n" -"Last-Translator: kytv \n" -"Language-Team: Polish (http://www.transifex.com/projects/p/I2P/language/pl/)\n" +"PO-Revision-Date: 2015-08-30 16:58+0000\n" +"Last-Translator: Taporpo Ne \n" +"Language-Team: Polish (http://www.transifex.com/otf/I2P/language/pl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -58,7 +59,7 @@ msgid "Angola" msgstr "Angola" msgid "Asia/Pacific Region" -msgstr "" +msgstr "Azja Pacyficzna" msgid "Antarctica" msgstr "Antarktyda" @@ -112,7 +113,7 @@ msgid "Benin" msgstr "Benin" msgid "Saint Barthélemy" -msgstr "" +msgstr "Saint Barthélemy" msgid "Bermuda" msgstr "Bermudy" @@ -124,7 +125,7 @@ msgid "Bolivia" msgstr "Boliwia" msgid "Bonaire" -msgstr "" +msgstr "Bonaire" msgid "Brazil" msgstr "Brazylia" @@ -256,7 +257,7 @@ msgid "Falkland Islands (Malvinas)" msgstr "Falklandy (Malwiny)" msgid "Micronesia" -msgstr "" +msgstr "Mikronezja" msgid "Faroe Islands" msgstr "Wyspy Owcze" @@ -358,7 +359,7 @@ msgid "Iraq" msgstr "Irak" msgid "Iran" -msgstr "" +msgstr "Iran" msgid "Iceland" msgstr "Islandia" @@ -397,7 +398,7 @@ msgid "Saint Kitts and Nevis" msgstr "Saint Kitts i Nevis" msgid "North Korea" -msgstr "" +msgstr "Korea Północna" msgid "Republic of Korea" msgstr "Korea Południowa" @@ -442,7 +443,7 @@ msgid "Latvia" msgstr "Łotwa" msgid "Libya" -msgstr "" +msgstr "Libia" msgid "Morocco" msgstr "Maroko" @@ -451,7 +452,7 @@ msgid "Monaco" msgstr "Monako" msgid "Moldova" -msgstr "" +msgstr "Mołdawia" msgid "Montenegro" msgstr "Czarnogóra" @@ -466,7 +467,7 @@ msgid "Marshall Islands" msgstr "Wyspy Marshalla" msgid "Macedonia" -msgstr "" +msgstr "Macedonia" msgid "Mali" msgstr "Mali" @@ -478,7 +479,7 @@ msgid "Mongolia" msgstr "Mongolia" msgid "Macau" -msgstr "" +msgstr "Makao" msgid "Northern Mariana Islands" msgstr "Mariany Północne" @@ -658,7 +659,7 @@ msgid "Suriname" msgstr "Surinam" msgid "South Sudan" -msgstr "" +msgstr "Południowy Sudan" msgid "Sao Tome and Principe" msgstr "Wyspy Świętego Tomasza i Książęca" @@ -667,10 +668,10 @@ msgid "El Salvador" msgstr "Salwador" msgid "Sint Maarten" -msgstr "" +msgstr "Sint Maarten" msgid "Syria" -msgstr "" +msgstr "Syria" msgid "Swaziland" msgstr "Suazi" @@ -721,7 +722,7 @@ msgid "Taiwan" msgstr "Republika Chińska" msgid "Tanzania" -msgstr "" +msgstr "Tanzania" msgid "Ukraine" msgstr "Ukraina" @@ -742,7 +743,7 @@ msgid "Uzbekistan" msgstr "Uzbekistan" msgid "Vatican" -msgstr "" +msgstr "Watykan" msgid "Saint Vincent and the Grenadines" msgstr "Saint Vincent i Grenadyny" @@ -754,7 +755,7 @@ msgid "Virgin Islands" msgstr "Wyspy Dziewicze" msgid "Vietnam" -msgstr "" +msgstr "Wietnam" msgid "Vanuatu" msgstr "Vanuatu" diff --git a/apps/routerconsole/locale-countries/messages_pt.po b/apps/routerconsole/locale-countries/messages_pt.po index d744d7ccf..ab95eb0ec 100644 --- a/apps/routerconsole/locale-countries/messages_pt.po +++ b/apps/routerconsole/locale-countries/messages_pt.po @@ -6,6 +6,7 @@ # Translators: # alfalb.as, 2015 # hxdcmls, 2013 +# wtfisthis , 2015 # rafaelbf, 2013 # Ruthein Alex , 2012 # tuliouel, 2013 @@ -15,9 +16,9 @@ msgstr "" "Project-Id-Version: I2P\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-07-17 01:08+0000\n" -"PO-Revision-Date: 2015-07-17 01:31+0000\n" -"Last-Translator: kytv \n" -"Language-Team: Portuguese (http://www.transifex.com/projects/p/I2P/language/pt/)\n" +"PO-Revision-Date: 2015-07-30 11:57+0000\n" +"Last-Translator: wtfisthis \n" +"Language-Team: Portuguese (http://www.transifex.com/otf/I2P/language/pt/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -58,7 +59,7 @@ msgid "Angola" msgstr "Angola" msgid "Asia/Pacific Region" -msgstr "" +msgstr "Ásia/Região do Pacifico" msgid "Antarctica" msgstr "Antártica" @@ -112,7 +113,7 @@ msgid "Benin" msgstr "Benin" msgid "Saint Barthélemy" -msgstr "" +msgstr "Coletividade de São Bartolomeu" msgid "Bermuda" msgstr "Bermudas" @@ -124,7 +125,7 @@ msgid "Bolivia" msgstr "Bolívia" msgid "Bonaire" -msgstr "" +msgstr "Bonaire" msgid "Brazil" msgstr "Brasil" @@ -256,7 +257,7 @@ msgid "Falkland Islands (Malvinas)" msgstr "Ilhas Falkland (Malvinas)" msgid "Micronesia" -msgstr "" +msgstr "Micronésia" msgid "Faroe Islands" msgstr "Ilhas Faroe" @@ -358,7 +359,7 @@ msgid "Iraq" msgstr "Iraque" msgid "Iran" -msgstr "" +msgstr "Irão" msgid "Iceland" msgstr "Islândia" @@ -397,7 +398,7 @@ msgid "Saint Kitts and Nevis" msgstr "São Cristóvão e Nevis" msgid "North Korea" -msgstr "" +msgstr "Correia do Norte" msgid "Republic of Korea" msgstr "República da Koreia" @@ -442,7 +443,7 @@ msgid "Latvia" msgstr "Látvia" msgid "Libya" -msgstr "" +msgstr "Líbia" msgid "Morocco" msgstr "Marrocos" @@ -451,7 +452,7 @@ msgid "Monaco" msgstr "Mónaco" msgid "Moldova" -msgstr "" +msgstr "Moldávia" msgid "Montenegro" msgstr "Montenegro" @@ -466,7 +467,7 @@ msgid "Marshall Islands" msgstr "Ilhas Marshall" msgid "Macedonia" -msgstr "" +msgstr "Macedónia" msgid "Mali" msgstr "Mali" @@ -478,7 +479,7 @@ msgid "Mongolia" msgstr "Mongolia" msgid "Macau" -msgstr "" +msgstr "Macau" msgid "Northern Mariana Islands" msgstr "Ilhas Marianas do Norte" @@ -658,7 +659,7 @@ msgid "Suriname" msgstr "Suriname" msgid "South Sudan" -msgstr "" +msgstr "Sudão do Sul" msgid "Sao Tome and Principe" msgstr "São Tomé e Princípe" @@ -667,10 +668,10 @@ msgid "El Salvador" msgstr "São Salvador" msgid "Sint Maarten" -msgstr "" +msgstr "São Martinho" msgid "Syria" -msgstr "" +msgstr "Síria" msgid "Swaziland" msgstr "Suazilândia" @@ -721,7 +722,7 @@ msgid "Taiwan" msgstr "Taiwan" msgid "Tanzania" -msgstr "" +msgstr "Tanzânia" msgid "Ukraine" msgstr "Ucrânia" @@ -742,7 +743,7 @@ msgid "Uzbekistan" msgstr "Uzbequistão" msgid "Vatican" -msgstr "" +msgstr "Vaticano" msgid "Saint Vincent and the Grenadines" msgstr "São Vicente e Granadinas" @@ -754,7 +755,7 @@ msgid "Virgin Islands" msgstr "Ilhas Virgens" msgid "Vietnam" -msgstr "" +msgstr "Vietname" msgid "Vanuatu" msgstr "Vanuatu" diff --git a/apps/routerconsole/locale-countries/messages_tr.po b/apps/routerconsole/locale-countries/messages_tr.po index 698c18650..248b2b5b8 100644 --- a/apps/routerconsole/locale-countries/messages_tr.po +++ b/apps/routerconsole/locale-countries/messages_tr.po @@ -5,16 +5,16 @@ # # Translators: # Erkin Batu Altunbaş , 2013 -# Kaya Zeren , 2013 +# Kaya Zeren , 2013,2015 # Trans Lator , 2013 msgid "" msgstr "" "Project-Id-Version: I2P\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-07-17 01:08+0000\n" -"PO-Revision-Date: 2015-07-17 01:31+0000\n" -"Last-Translator: kytv \n" -"Language-Team: Turkish (Turkey) (http://www.transifex.com/projects/p/I2P/language/tr_TR/)\n" +"PO-Revision-Date: 2015-08-05 13:48+0000\n" +"Last-Translator: Kaya Zeren \n" +"Language-Team: Turkish (Turkey) (http://www.transifex.com/otf/I2P/language/tr_TR/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -55,7 +55,7 @@ msgid "Angola" msgstr "Angola" msgid "Asia/Pacific Region" -msgstr "" +msgstr "Asya/Pasifik Bölgesi" msgid "Antarctica" msgstr "Antarktika" @@ -109,7 +109,7 @@ msgid "Benin" msgstr "Benin" msgid "Saint Barthélemy" -msgstr "" +msgstr "Aziz Bartelemi" msgid "Bermuda" msgstr "Bermuda" @@ -121,7 +121,7 @@ msgid "Bolivia" msgstr "Bolivya" msgid "Bonaire" -msgstr "" +msgstr "Bonaire" msgid "Brazil" msgstr "Brezilya" @@ -253,7 +253,7 @@ msgid "Falkland Islands (Malvinas)" msgstr "Falkland Adaları (Malvinalar)" msgid "Micronesia" -msgstr "" +msgstr "Mikronezya" msgid "Faroe Islands" msgstr "Faroe Adaları" @@ -355,7 +355,7 @@ msgid "Iraq" msgstr "Irak" msgid "Iran" -msgstr "" +msgstr "İran" msgid "Iceland" msgstr "İzlanda" @@ -394,7 +394,7 @@ msgid "Saint Kitts and Nevis" msgstr "Aziz Kitts ve Nevis" msgid "North Korea" -msgstr "" +msgstr "Kuzey Kore" msgid "Republic of Korea" msgstr "Kore Cumhuriyeti" @@ -439,7 +439,7 @@ msgid "Latvia" msgstr "Letonya" msgid "Libya" -msgstr "" +msgstr "Libya" msgid "Morocco" msgstr "Fas" @@ -448,7 +448,7 @@ msgid "Monaco" msgstr "Monako" msgid "Moldova" -msgstr "" +msgstr "Moldova" msgid "Montenegro" msgstr "Karadağ" @@ -463,7 +463,7 @@ msgid "Marshall Islands" msgstr "Marşal Adaları" msgid "Macedonia" -msgstr "" +msgstr "Makedonya" msgid "Mali" msgstr "Mali" @@ -475,7 +475,7 @@ msgid "Mongolia" msgstr "Moğolistan" msgid "Macau" -msgstr "" +msgstr "Makau" msgid "Northern Mariana Islands" msgstr "Kuzey Mariyana Adaları" @@ -655,7 +655,7 @@ msgid "Suriname" msgstr "Surinam" msgid "South Sudan" -msgstr "" +msgstr "Güney Sudan" msgid "Sao Tome and Principe" msgstr "Sao Tome ve Principe" @@ -664,10 +664,10 @@ msgid "El Salvador" msgstr "El Salvador" msgid "Sint Maarten" -msgstr "" +msgstr "Aziz Marten" msgid "Syria" -msgstr "" +msgstr "Suriye" msgid "Swaziland" msgstr "Svaziland" @@ -718,7 +718,7 @@ msgid "Taiwan" msgstr "Tayva" msgid "Tanzania" -msgstr "" +msgstr "Tanzanya" msgid "Ukraine" msgstr "Ukrayna" @@ -739,7 +739,7 @@ msgid "Uzbekistan" msgstr "Özbekistan" msgid "Vatican" -msgstr "" +msgstr "Vatikan" msgid "Saint Vincent and the Grenadines" msgstr "Aziz Vincent ve Granadinler" @@ -751,7 +751,7 @@ msgid "Virgin Islands" msgstr "Virgin Adaları" msgid "Vietnam" -msgstr "" +msgstr "Vietnam" msgid "Vanuatu" msgstr "Vanuatu" diff --git a/apps/routerconsole/locale-countries/messages_uk.po b/apps/routerconsole/locale-countries/messages_uk.po index 46fea5e02..cc13aa985 100644 --- a/apps/routerconsole/locale-countries/messages_uk.po +++ b/apps/routerconsole/locale-countries/messages_uk.po @@ -4,15 +4,17 @@ # To contribute translations, see http://www.i2p2.de/newdevelopers # # Translators: +# asteryx , 2015 # LinuxChata, 2014 +# Maus , 2015 msgid "" msgstr "" "Project-Id-Version: I2P\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-07-17 01:08+0000\n" -"PO-Revision-Date: 2015-07-17 01:31+0000\n" -"Last-Translator: kytv \n" -"Language-Team: Ukrainian (Ukraine) (http://www.transifex.com/projects/p/I2P/language/uk_UA/)\n" +"PO-Revision-Date: 2015-08-07 16:31+0000\n" +"Last-Translator: Denis Lysenko \n" +"Language-Team: Ukrainian (Ukraine) (http://www.transifex.com/otf/I2P/language/uk_UA/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -53,7 +55,7 @@ msgid "Angola" msgstr "Ангола" msgid "Asia/Pacific Region" -msgstr "" +msgstr "Азія / Тихоокеанський регіон" msgid "Antarctica" msgstr "Антарктика" @@ -107,7 +109,7 @@ msgid "Benin" msgstr "Бенін" msgid "Saint Barthélemy" -msgstr "" +msgstr "сен- Бартельмі" msgid "Bermuda" msgstr "Бермуда" @@ -119,7 +121,7 @@ msgid "Bolivia" msgstr "Болівія" msgid "Bonaire" -msgstr "" +msgstr "Бонайре" msgid "Brazil" msgstr "Бразилія" @@ -251,7 +253,7 @@ msgid "Falkland Islands (Malvinas)" msgstr "Фолклендські острови (Мальвінські)" msgid "Micronesia" -msgstr "" +msgstr "Мікронезія" msgid "Faroe Islands" msgstr "Фарерські острови" @@ -353,7 +355,7 @@ msgid "Iraq" msgstr "Ірак" msgid "Iran" -msgstr "" +msgstr "Іран" msgid "Iceland" msgstr "Ісландія" @@ -392,7 +394,7 @@ msgid "Saint Kitts and Nevis" msgstr "Федерація Сент-Кіттс і Невіс" msgid "North Korea" -msgstr "" +msgstr "КНДР" msgid "Republic of Korea" msgstr "Республіка Корея" @@ -437,7 +439,7 @@ msgid "Latvia" msgstr "Латвія" msgid "Libya" -msgstr "" +msgstr "Лівія" msgid "Morocco" msgstr "Марокко" @@ -446,7 +448,7 @@ msgid "Monaco" msgstr "Монако" msgid "Moldova" -msgstr "" +msgstr "Молдова" msgid "Montenegro" msgstr "Чорногорія " @@ -461,7 +463,7 @@ msgid "Marshall Islands" msgstr "Маршаллові острови" msgid "Macedonia" -msgstr "" +msgstr "Македонія" msgid "Mali" msgstr "Малі" @@ -473,7 +475,7 @@ msgid "Mongolia" msgstr "Монголія" msgid "Macau" -msgstr "" +msgstr "Аоминь або Макао" msgid "Northern Mariana Islands" msgstr "Північні Маріанські острови" @@ -653,7 +655,7 @@ msgid "Suriname" msgstr "Сурінам" msgid "South Sudan" -msgstr "" +msgstr "Південний Судан" msgid "Sao Tome and Principe" msgstr "Сан-Томе і Принсіпі" @@ -662,10 +664,10 @@ msgid "El Salvador" msgstr "Ель Сальвадор" msgid "Sint Maarten" -msgstr "" +msgstr "Сінт-Мартен" msgid "Syria" -msgstr "" +msgstr "Сірія" msgid "Swaziland" msgstr "Свазиленд" @@ -716,7 +718,7 @@ msgid "Taiwan" msgstr "Тайвань" msgid "Tanzania" -msgstr "" +msgstr "Танзанія" msgid "Ukraine" msgstr "Україна" @@ -737,7 +739,7 @@ msgid "Uzbekistan" msgstr "Узбекістан" msgid "Vatican" -msgstr "" +msgstr "Ватикан" msgid "Saint Vincent and the Grenadines" msgstr "Сент Вінсент і Ґренадіни" @@ -749,7 +751,7 @@ msgid "Virgin Islands" msgstr "Віргінські острови" msgid "Vietnam" -msgstr "" +msgstr "В'єтнам" msgid "Vanuatu" msgstr "Вануату" diff --git a/apps/routerconsole/locale-news/messages_sv.po b/apps/routerconsole/locale-news/messages_sv.po index 766d3987e..dc80a0e5d 100644 --- a/apps/routerconsole/locale-news/messages_sv.po +++ b/apps/routerconsole/locale-news/messages_sv.po @@ -4,6 +4,7 @@ # To contribute translations, see http://www.i2p2.de/newdevelopers # # Translators: +# Anders Nilsson , 2015 # cacapo , 2015 # hottuna , 2013 # hottuna , 2013 @@ -14,9 +15,9 @@ msgstr "" "Project-Id-Version: I2P\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-07-13 21:46+0000\n" -"PO-Revision-Date: 2015-04-09 17:47+0000\n" -"Last-Translator: cacapo \n" -"Language-Team: Swedish (Sweden) (http://www.transifex.com/projects/p/I2P/language/sv_SE/)\n" +"PO-Revision-Date: 2015-08-26 06:24+0000\n" +"Last-Translator: Anders Nilsson \n" +"Language-Team: Swedish (Sweden) (http://www.transifex.com/otf/I2P/language/sv_SE/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -24,7 +25,7 @@ msgstr "" "Plural-Forms: nplurals=2; plural=(n != 1);\n" msgid "Congratulations on getting I2P installed!" -msgstr "Grattis för din I2P installation!" +msgstr "Grattis till din I2P-installation!" msgid "Welcome to I2P!" msgstr "Välkommen till I2P!" diff --git a/apps/routerconsole/locale-news/messages_tr.po b/apps/routerconsole/locale-news/messages_tr.po index 090db06b3..4ec097690 100644 --- a/apps/routerconsole/locale-news/messages_tr.po +++ b/apps/routerconsole/locale-news/messages_tr.po @@ -4,15 +4,15 @@ # To contribute translations, see http://www.i2p2.de/newdevelopers # # Translators: -# Kaya Zeren , 2013 +# Kaya Zeren , 2013,2015 msgid "" msgstr "" "Project-Id-Version: I2P\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-07-13 21:46+0000\n" -"PO-Revision-Date: 2014-02-23 16:51+0000\n" -"Last-Translator: kytv \n" -"Language-Team: Turkish (Turkey) (http://www.transifex.com/projects/p/I2P/language/tr_TR/)\n" +"PO-Revision-Date: 2015-08-05 14:03+0000\n" +"Last-Translator: Kaya Zeren \n" +"Language-Team: Turkish (Turkey) (http://www.transifex.com/otf/I2P/language/tr_TR/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -62,4 +62,4 @@ msgstr "Sol tarafta \"paylaşılmış istemci\" hedefi listelendiğinde, lütfen msgid "" "Point your IRC client to {0}localhost:6668{1} and say hi to us on " "{2}#i2p{3}." -msgstr "" +msgstr "IRC istemcinizi {0}localhost:6668{1} adresine yönlendirin ve bize merhaba demek için {2}#i2p{3} kanalını açın." diff --git a/apps/routerconsole/locale-news/messages_uk.po b/apps/routerconsole/locale-news/messages_uk.po index ba8e39a36..9112d4b9d 100644 --- a/apps/routerconsole/locale-news/messages_uk.po +++ b/apps/routerconsole/locale-news/messages_uk.po @@ -13,9 +13,9 @@ msgstr "" "Project-Id-Version: I2P\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-07-13 21:46+0000\n" -"PO-Revision-Date: 2014-12-25 14:10+0000\n" -"Last-Translator: madjong \n" -"Language-Team: Ukrainian (Ukraine) (http://www.transifex.com/projects/p/I2P/language/uk_UA/)\n" +"PO-Revision-Date: 2015-08-07 17:13+0000\n" +"Last-Translator: Denis Lysenko \n" +"Language-Team: Ukrainian (Ukraine) (http://www.transifex.com/otf/I2P/language/uk_UA/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" diff --git a/apps/routerconsole/locale/messages_de.po b/apps/routerconsole/locale/messages_de.po index 2869ea281..a046a3201 100644 --- a/apps/routerconsole/locale/messages_de.po +++ b/apps/routerconsole/locale/messages_de.po @@ -27,9 +27,9 @@ msgstr "" "Project-Id-Version: I2P\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-07-17 01:05+0000\n" -"PO-Revision-Date: 2015-07-17 01:31+0000\n" -"Last-Translator: kytv \n" -"Language-Team: German (http://www.transifex.com/projects/p/I2P/language/de/)\n" +"PO-Revision-Date: 2015-08-21 21:13+0000\n" +"Last-Translator: Lars Schimmer \n" +"Language-Team: German (http://www.transifex.com/otf/I2P/language/de/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -100,8 +100,8 @@ msgstr[1] "{0} Tage" #, java-format msgid "1 year" msgid_plural "{0} years" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "1 Jahr" +msgstr[1] "{0} Jahre" #: ../../../core/java/src/net/i2p/data/DataHelper.java:1549 #: ../../../core/java/src/net/i2p/data/DataHelper.java:1596 @@ -1200,7 +1200,7 @@ msgstr "Keine neue Version unter {0} gefunden" #: ../java/src/net/i2p/router/web/BanlistRenderer.java:65 msgid "Permanently banned" -msgstr "" +msgstr "permanent gesperrte IP's" #: ../java/src/net/i2p/router/web/BanlistRenderer.java:67 #, java-format @@ -4128,7 +4128,7 @@ msgstr "Tunnel, die wir zur Verfügung stellen oder nutzen, um auf Dienste im Ne msgid "" "Tunnels we are participating in, directly contributing bandwidth to the " "network" -msgstr "" +msgstr "Tunnel an denen wir teilnehmen, die direkt Bandbreite dem Netzwerk zur Verfügung stellen." #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:512 msgid "Participating" @@ -4352,11 +4352,11 @@ msgstr "ganz oben" #: ../java/src/net/i2p/router/web/SummaryHelper.java:930 msgid "Move to top" -msgstr "" +msgstr "Nach oben verschieben" #: ../java/src/net/i2p/router/web/SummaryHelper.java:940 msgid "Move up" -msgstr "" +msgstr "Nach oben verschieben" #: ../java/src/net/i2p/router/web/SummaryHelper.java:948 msgid "Down" @@ -4364,7 +4364,7 @@ msgstr "runter" #: ../java/src/net/i2p/router/web/SummaryHelper.java:953 msgid "Move down" -msgstr "" +msgstr "nach unten verschieben" #: ../java/src/net/i2p/router/web/SummaryHelper.java:958 msgid "Bottom" @@ -4372,7 +4372,7 @@ msgstr "ganz unten" #: ../java/src/net/i2p/router/web/SummaryHelper.java:963 msgid "Move to bottom" -msgstr "" +msgstr "Zum Ende verschieben" #: ../java/src/net/i2p/router/web/SummaryHelper.java:975 msgid "Select a section to add" @@ -4581,7 +4581,7 @@ msgstr "nach dem Starten die Routerkonsole im Browser anzeigen" #: ../java/strings/Strings.java:37 msgid "shared clients (DSA)" -msgstr "" +msgstr "mehrere Klienten (DSA)" #: ../java/strings/Strings.java:38 msgid "IRC proxy" @@ -4951,11 +4951,11 @@ msgstr "Floodfill-Teilnahme hilft dem Netzwerk, kann aber die Systemressourcen s #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:442 msgid "This router is currently a floodfill participant." -msgstr "" +msgstr "Dieser Router ist zur Zeit Teilnehmer am FloodFill Netz." #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:446 msgid "This router is not currently a floodfill participant." -msgstr "" +msgstr "Dieser Router ist zur Zeit kein Teilnehmer am FloodFill Netz." #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:457 msgid "Automatic" diff --git a/apps/routerconsole/locale/messages_fr.po b/apps/routerconsole/locale/messages_fr.po index a3147c16b..3d75da8df 100644 --- a/apps/routerconsole/locale/messages_fr.po +++ b/apps/routerconsole/locale/messages_fr.po @@ -25,9 +25,9 @@ msgstr "" "Project-Id-Version: I2P\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-07-17 01:05+0000\n" -"PO-Revision-Date: 2015-07-22 09:12+0000\n" +"PO-Revision-Date: 2015-08-14 04:29+0000\n" "Last-Translator: Towinet\n" -"Language-Team: French (http://www.transifex.com/projects/p/I2P/language/fr/)\n" +"Language-Team: French (http://www.transifex.com/otf/I2P/language/fr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -3782,7 +3782,7 @@ msgstr "Intégration" #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:272 msgid "is the peer banned, or unreachable, or failing tunnel tests?" -msgstr "le pair est-il banni, injoignable, ou alors les tests de tunnels échouent ?" +msgstr "le pair est-il banni, injoignable, ou alors les tests de tunnels échouent-ils ?" #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:272 msgid "status" @@ -6312,7 +6312,7 @@ msgstr "Contrôle de mises à jour" #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:451 msgid "News Updates" -msgstr "Mises à jour des nouvelles" +msgstr "Mises à jour des actualités" #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:459 msgid "Update In Progress" @@ -6332,7 +6332,7 @@ msgstr "Méthode de mise à jour" #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:487 msgid "Fetch news through the eepProxy?" -msgstr "Récupérer news à travers le eepProxy ?" +msgstr "Récupérer les actualités à travers l'eepProxy ?" #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:491 msgid "Update through the eepProxy?" diff --git a/apps/routerconsole/locale/messages_ja.po b/apps/routerconsole/locale/messages_ja.po index 136d6df97..0031b451d 100644 --- a/apps/routerconsole/locale/messages_ja.po +++ b/apps/routerconsole/locale/messages_ja.po @@ -6,7 +6,8 @@ # Translators: # a1678991 , 2015 # g3600303 , 2015 -# タカハシ , 2013-2014 +# タカハシ , 2013-2014 +# タカハシ , 2015 # luixxiul, 2013 # rafe , 2015 # rafe , 2015 @@ -17,9 +18,9 @@ msgstr "" "Project-Id-Version: I2P\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-07-17 01:05+0000\n" -"PO-Revision-Date: 2015-07-17 01:31+0000\n" -"Last-Translator: kytv \n" -"Language-Team: Japanese (http://www.transifex.com/projects/p/I2P/language/ja/)\n" +"PO-Revision-Date: 2015-08-31 09:17+0000\n" +"Last-Translator: タカハシ \n" +"Language-Team: Japanese (http://www.transifex.com/otf/I2P/language/ja/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -85,7 +86,7 @@ msgstr[0] "{0} 日" #, java-format msgid "1 year" msgid_plural "{0} years" -msgstr[0] "" +msgstr[0] "{0} 年" #: ../../../core/java/src/net/i2p/data/DataHelper.java:1549 #: ../../../core/java/src/net/i2p/data/DataHelper.java:1596 @@ -97,13 +98,13 @@ msgstr "n/a" #, java-format msgid "1 ns" msgid_plural "{0,number,###} ns" -msgstr[0] "" +msgstr[0] "{0,number,###} ns" #: ../../../core/java/src/net/i2p/data/DataHelper.java:1580 #, java-format msgid "1 μs" msgid_plural "{0,number,###} μs" -msgstr[0] "" +msgstr[0] "{0,number,###} μs" #: ../../../router/java/src/net/i2p/router/Blocklist.java:201 #, java-format @@ -154,40 +155,40 @@ msgstr "OK" #: ../../../router/java/src/net/i2p/router/CommSystemFacade.java:312 msgid "IPv4: OK; IPv6: Testing" -msgstr "" +msgstr "IPv4: OK; IPv6: テスト中" #: ../../../router/java/src/net/i2p/router/CommSystemFacade.java:313 msgid "IPv4: OK; IPv6: Firewalled" -msgstr "" +msgstr "IPv4: OK; IPv6: ファイアーウォール有効" #: ../../../router/java/src/net/i2p/router/CommSystemFacade.java:314 msgid "IPv4: Testing; IPv6: OK" -msgstr "" +msgstr "IPv4: テスト中; IPv6: OK" #: ../../../router/java/src/net/i2p/router/CommSystemFacade.java:315 msgid "IPv4: Firewalled; IPv6: OK" -msgstr "" +msgstr "IPv4: ファイアーウォール有効; IPv6: OK" #: ../../../router/java/src/net/i2p/router/CommSystemFacade.java:316 msgid "IPv4: Disabled; IPv6: OK" -msgstr "" +msgstr "IPv4: 無効; IPv6: OK" #: ../../../router/java/src/net/i2p/router/CommSystemFacade.java:317 msgid "IPv4: Symmetric NAT; IPv6: OK" -msgstr "" +msgstr "IPv4: 対称型NAT; IPv6: OK" #. * IPv4 symmetric NAT, IPv6 firewalled or disabled or no address #: ../../../router/java/src/net/i2p/router/CommSystemFacade.java:319 msgid "Symmetric NAT" -msgstr "" +msgstr "対称型NAT" #: ../../../router/java/src/net/i2p/router/CommSystemFacade.java:320 msgid "IPv4: Symmetric NAT; IPv6: Testing" -msgstr "" +msgstr "IPv4: 対称型NAT; IPv6: テスト中" #: ../../../router/java/src/net/i2p/router/CommSystemFacade.java:321 msgid "IPv4: Firewalled; IPv6: Testing" -msgstr "" +msgstr "IPv4: ファイアーウォール有効; IPv6: テスト中" #. * IPv4 firewalled, IPv6 firewalled or disabled or no address #: ../../../router/java/src/net/i2p/router/CommSystemFacade.java:323 @@ -197,23 +198,23 @@ msgstr "警告-ファイアーウォールされ、高速" #: ../../../router/java/src/net/i2p/router/CommSystemFacade.java:324 msgid "IPv4: Testing; IPv6: Firewalled" -msgstr "" +msgstr "IPv4: テスト中; IPv6: ファイアーウォール有効" #: ../../../router/java/src/net/i2p/router/CommSystemFacade.java:325 msgid "IPv4: Disabled; IPv6: Testing" -msgstr "" +msgstr "IPv4: 無効; IPv6: テスト中" #: ../../../router/java/src/net/i2p/router/CommSystemFacade.java:326 msgid "IPv4: Disabled; IPv6: Firewalled" -msgstr "" +msgstr "IPv4: 無効; IPv6: ファイアーウォール有効" #: ../../../router/java/src/net/i2p/router/CommSystemFacade.java:327 msgid "Disconnected" -msgstr "" +msgstr "切断" #: ../../../router/java/src/net/i2p/router/CommSystemFacade.java:328 msgid "Port Conflict" -msgstr "" +msgstr "ポート競合" #: ../../../router/java/src/net/i2p/router/CommSystemFacade.java:329 #: ../java/src/net/i2p/router/web/SummaryHelper.java:155 @@ -283,7 +284,7 @@ msgstr "トンネルを拒否中" #: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:212 #, java-format msgid "Reseeding: got router info from file ({0} successful, {1} errors)." -msgstr "" +msgstr "再シード中: ファイルからルータ情報を取得 ({0} 成功, {1} 個エラー)。" #: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:284 #: ../java/src/net/i2p/router/web/ConfigNavHelper.java:28 @@ -351,11 +352,11 @@ msgstr "既知の高速なピア" #: ../../../router/java/src/net/i2p/router/tasks/CoalesceStatsEvent.java:41 msgid "Known integrated (floodfill) peers" -msgstr "" +msgstr "基地の統合された (floodfill) ピア" #: ../../../router/java/src/net/i2p/router/tasks/CoalesceStatsEvent.java:42 msgid "Size of tunnel acceptor backlog" -msgstr "" +msgstr "トンネル受け入れバックログのサイズ" #: ../../../router/java/src/net/i2p/router/transport/CommSystemFacadeImpl.java:502 msgid "NetDb entry" @@ -373,7 +374,7 @@ msgstr "サポートされていない署名形式です" #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:618 msgid "No support for our signature type" -msgstr "" +msgstr "署名タイプに非対応" #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:622 msgid "Unreachable on any transport" @@ -862,7 +863,7 @@ msgstr "トンネル要求ドロップ: 遅すぎます" #: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:260 msgid "Dropping tunnel requests: High job lag" -msgstr "" +msgstr "トンネルリクエストを中断: 高いジョブラグ" #. don't even bother, since we are so overloaded locally #: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:451 @@ -871,7 +872,7 @@ msgstr "トンネル要求ドロップ: 過負荷" #: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:693 msgid "Rejecting tunnels: Hidden mode" -msgstr "" +msgstr "トンネルを拒否: Hidden モード" #: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:721 msgid "Rejecting tunnels: Request overload" @@ -913,7 +914,7 @@ msgstr "{0}B 転送" #: ../java/src/net/i2p/router/update/ConsoleUpdateManager.java:1051 #, java-format msgid "Install failed from {0}" -msgstr "" +msgstr "{0} からのインストールに失敗" #: ../java/src/net/i2p/router/update/ConsoleUpdateManager.java:1053 #: ../java/src/net/i2p/router/update/UpdateRunner.java:298 @@ -965,7 +966,7 @@ msgstr "{0} へのコピーに失敗" #: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:177 #: ../java/src/net/i2p/router/web/PluginStarter.java:157 msgid "HTTP client proxy tunnel must be running" -msgstr "" +msgstr "HTTPクライアントプロキシトンネルが起動している必要があります" #. set status before thread to ensure UI feedback #: ../java/src/net/i2p/router/update/DevSU3UpdateHandler.java:91 @@ -1180,7 +1181,7 @@ msgstr "{0} に新しいバージョンが見つかりませんでした" #: ../java/src/net/i2p/router/web/BanlistRenderer.java:65 msgid "Permanently banned" -msgstr "" +msgstr "永久的に禁止されました" #: ../java/src/net/i2p/router/web/BanlistRenderer.java:67 #, java-format @@ -1343,7 +1344,7 @@ msgstr "プラグインをインストール" #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:77 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:639 msgid "Install Plugin from File" -msgstr "" +msgstr "ファイルからプラグインをインストール" #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:86 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:650 @@ -1443,11 +1444,11 @@ msgstr "プラグインURLが指定されていません。" #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:421 #: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:79 msgid "You must enter a file" -msgstr "" +msgstr "ファイルを入力する必要があります" #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:464 msgid "Install from file failed" -msgstr "" +msgstr "ファイルからのインストール失敗" #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:479 #, java-format @@ -1466,7 +1467,7 @@ msgstr "全てのプラグインをアップデート中" #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:528 #, java-format msgid "Installing plugin from {0}" -msgstr "" +msgstr "{0} からプラグインをインストール中" #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:549 #, java-format @@ -1963,11 +1964,11 @@ msgstr "ラップトップモードを無効化中" #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:359 msgid "Disabling inbound IPv4" -msgstr "" +msgstr "着信 IPv4を無効化中" #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:361 msgid "Enabling inbound IPv4" -msgstr "" +msgstr "着信 IPv4を有効化中" #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:369 msgid "Disabling UDP" @@ -2080,35 +2081,35 @@ msgstr "リシードプロセスを開始" #: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:32 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:491 msgid "Reseed from URL" -msgstr "" +msgstr "URLからリシード" #: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:37 msgid "You must enter a URL" -msgstr "" +msgstr "URLを入力する必要があります" #: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:66 msgid "Reseed in progress, check summary bar for status" -msgstr "" +msgstr "リシード進行中、ステータスの概要バーをチェックしてください。" #: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:68 msgid "Reseed complete, check summary bar for status" -msgstr "" +msgstr "リシード完了、ステータスの概要バーをチェックしてください" #: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:74 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:503 msgid "Reseed from file" -msgstr "" +msgstr "ファイルからリシード" #: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:84 #: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:91 msgid "Reseed from file failed" -msgstr "" +msgstr "ファイルからのリシード失敗" #: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:86 #, java-format msgid "Reseed successful, loaded {0} router info from file" msgid_plural "Reseed successful, loaded {0} router infos from file" -msgstr[0] "" +msgstr[0] "リシード成功、ファイルから {0} 件のルータ情報を読み込みました" #: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:149 msgid "Configuration saved successfully." @@ -2487,11 +2488,11 @@ msgstr "ユーザー {0} を削除しました" #: ../java/src/net/i2p/router/web/ConfigUIHelper.java:25 msgid "Set theme universally across all apps" -msgstr "" +msgstr "全アプリにテーマを設定" #: ../java/src/net/i2p/router/web/ConfigUIHelper.java:37 msgid "Force the mobile console to be used" -msgstr "" +msgstr "モバイルコンソールの使用を強制する" #: ../java/src/net/i2p/router/web/ConfigUIHelper.java:76 msgid "Arabic" @@ -2499,7 +2500,7 @@ msgstr "アラビア語" #: ../java/src/net/i2p/router/web/ConfigUIHelper.java:77 msgid "Czech" -msgstr "" +msgstr "チェコ語" #: ../java/src/net/i2p/router/web/ConfigUIHelper.java:78 msgid "Danish" @@ -2515,7 +2516,7 @@ msgstr "エストニア語" #: ../java/src/net/i2p/router/web/ConfigUIHelper.java:81 msgid "Greek" -msgstr "" +msgstr "ギリシャ語" #: ../java/src/net/i2p/router/web/ConfigUIHelper.java:82 msgid "English" @@ -2547,7 +2548,7 @@ msgstr "日本語" #: ../java/src/net/i2p/router/web/ConfigUIHelper.java:89 msgid "Malagasy" -msgstr "" +msgstr "マラガシ語" #: ../java/src/net/i2p/router/web/ConfigUIHelper.java:90 msgid "Dutch" @@ -2576,7 +2577,7 @@ msgstr "ロシア語" #: ../java/src/net/i2p/router/web/ConfigUIHelper.java:97 msgid "Slovak" -msgstr "" +msgstr "スロバキア語" #: ../java/src/net/i2p/router/web/ConfigUIHelper.java:98 msgid "Swedish" @@ -2636,7 +2637,7 @@ msgstr "利用可能なアップデートなし" #: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:216 #, java-format msgid "Updating news URL to {0}" -msgstr "" +msgstr "ニュース URL を {0} に更新中" #: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:223 #: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:231 @@ -2648,28 +2649,28 @@ msgstr "内部" #: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:227 #, java-format msgid "Updating proxy host to {0}" -msgstr "" +msgstr "プロキシホストを {0} に更新中" #: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:235 #, java-format msgid "Updating proxy port to {0}" -msgstr "" +msgstr "プロキシのポートを {0} に更新中" #: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:251 #, java-format msgid "Updating refresh frequency to {0}" -msgstr "" +msgstr "更新頻度を {0} に更新中" #: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:252 #: ../java/src/net/i2p/router/web/ConfigUpdateHelper.java:130 #: ../java/src/net/i2p/router/web/GraphHelper.java:377 msgid "Never" -msgstr "" +msgstr "二度としない" #: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:259 #, java-format msgid "Updating update policy to {0}" -msgstr "" +msgstr "アップデート設定を {0} に更新中" #: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:268 msgid "Updating update URLs." @@ -2682,12 +2683,12 @@ msgstr "信頼されているキーを更新中。" #: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:292 #, java-format msgid "Updating unsigned update URL to {0}" -msgstr "" +msgstr "未署名の更新 URL を {0} に更新中" #: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:304 #, java-format msgid "Updating signed development build URL to {0}" -msgstr "" +msgstr "署名された開発ビルドの URL を{0} に更新中" #: ../java/src/net/i2p/router/web/ConfigUpdateHelper.java:132 msgid "Every" @@ -2711,7 +2712,7 @@ msgstr "実行を中止しました" #: ../java/src/net/i2p/router/web/EventLogHelper.java:35 msgid "Enabled floodfill" -msgstr "" +msgstr "floodfill を有効化" #: ../java/src/net/i2p/router/web/EventLogHelper.java:36 msgid "Changed IP" @@ -2723,7 +2724,7 @@ msgstr "ポートが変更されました" #: ../java/src/net/i2p/router/web/EventLogHelper.java:38 msgid "Clock shifted" -msgstr "" +msgstr "クロックがシフトされました" #: ../java/src/net/i2p/router/web/EventLogHelper.java:39 msgid "Crashed" @@ -2752,7 +2753,7 @@ msgstr "新しいルーターidentity" #: ../java/src/net/i2p/router/web/EventLogHelper.java:45 msgid "Disabled floodfill" -msgstr "" +msgstr "floodfill が無効になりました" #: ../java/src/net/i2p/router/web/EventLogHelper.java:46 msgid "Out of memory error" @@ -2760,11 +2761,11 @@ msgstr "エラー:メモリ不足" #: ../java/src/net/i2p/router/web/EventLogHelper.java:47 msgid "Reachability change" -msgstr "" +msgstr "到達可能性の変更" #: ../java/src/net/i2p/router/web/EventLogHelper.java:49 msgid "Reseeded router" -msgstr "" +msgstr "ルーターをリシードしました" #: ../java/src/net/i2p/router/web/EventLogHelper.java:50 msgid "Soft restart" @@ -2792,7 +2793,7 @@ msgstr "イベント表示" #: ../java/src/net/i2p/router/web/EventLogHelper.java:106 msgid "Events since" -msgstr "" +msgstr "以降のイベント" #: ../java/src/net/i2p/router/web/EventLogHelper.java:111 msgid "Event type" @@ -2814,17 +2815,17 @@ msgstr "イベントはありません" #: ../java/src/net/i2p/router/web/EventLogHelper.java:171 #, java-format msgid "No events found in previous {0}" -msgstr "" +msgstr "過去 {0} にイベントはありませんでした" #: ../java/src/net/i2p/router/web/EventLogHelper.java:174 #, java-format msgid "No \"{0}\" events found" -msgstr "" +msgstr "\"{0} イベントはありませんでした" #: ../java/src/net/i2p/router/web/EventLogHelper.java:175 #, java-format msgid "No \"{0}\" events found in previous {1}" -msgstr "" +msgstr "\"{0}\" イベントは過去 {1} にありませんでした" #: ../java/src/net/i2p/router/web/EventLogHelper.java:179 #: ../java/src/net/i2p/router/web/JobQueueHelper.java:143 @@ -2849,7 +2850,7 @@ msgstr "無効なフォームからの送信、おそらくブラウザで「戻 msgid "" "If the problem persists, verify that you have cookies enabled in your " "browser." -msgstr "" +msgstr "問題が続く場合、クッキーがブラウザで有効になっているか確認してください。" #: ../java/src/net/i2p/router/web/GraphHelper.java:162 msgid "Combined bandwidth graph" @@ -2860,7 +2861,7 @@ msgstr "複合帯域幅グラフ" #: ../java/src/net/i2p/router/web/GraphHelper.java:236 #, java-format msgid "{0} for {1}" -msgstr "" +msgstr "{1} 間 {0}" #: ../java/src/net/i2p/router/web/GraphHelper.java:223 #: ../java/src/net/i2p/router/web/StatSummarizer.java:332 @@ -2870,7 +2871,7 @@ msgstr "帯域幅使用率" #: ../java/src/net/i2p/router/web/GraphHelper.java:238 #, java-format msgid "ending {0} ago" -msgstr "" +msgstr "{0} 前に終了" #: ../java/src/net/i2p/router/web/GraphHelper.java:253 msgid "Larger" @@ -2898,19 +2899,19 @@ msgstr "より遅い" #: ../java/src/net/i2p/router/web/GraphHelper.java:290 msgid "Larger interval" -msgstr "" +msgstr "インターバルを大きく" #: ../java/src/net/i2p/router/web/GraphHelper.java:296 msgid "Smaller interval" -msgstr "" +msgstr "インターバルを小さく" #: ../java/src/net/i2p/router/web/GraphHelper.java:303 msgid "Previous interval" -msgstr "" +msgstr "過去のインターバル" #: ../java/src/net/i2p/router/web/GraphHelper.java:314 msgid "Next interval" -msgstr "" +msgstr "次のインターバル" #: ../java/src/net/i2p/router/web/GraphHelper.java:321 #: ../java/src/net/i2p/router/web/GraphHelper.java:361 @@ -2924,7 +2925,7 @@ msgstr "イベントを図示" #: ../java/src/net/i2p/router/web/GraphHelper.java:324 msgid "All times are UTC." -msgstr "" +msgstr "時間はすべて UTC です。" #: ../java/src/net/i2p/router/web/GraphHelper.java:356 msgid "Configure Graph Display" @@ -2966,11 +2967,11 @@ msgstr "更新遅延" #: ../java/src/net/i2p/router/web/GraphHelper.java:381 msgid "Store graph data on disk?" -msgstr "" +msgstr "ディスク上にグラフデータを保存しますか?" #: ../java/src/net/i2p/router/web/GraphHelper.java:387 msgid "Save settings and redraw graphs" -msgstr "" +msgstr "設定を保温してグラフを再描画する" #: ../java/src/net/i2p/router/web/GraphHelper.java:443 msgid "Graph settings saved" @@ -3088,7 +3089,7 @@ msgstr "FAQ" #: ../java/src/net/i2p/router/web/HomeHelper.java:47 msgid "Frequently Asked Questions" -msgstr "" +msgstr "よくある質問" #: ../java/src/net/i2p/router/web/HomeHelper.java:48 msgid "Community forum" @@ -3102,7 +3103,7 @@ msgstr "フォーラム" msgid "" "A public anonymous Git hosting site - supports pulling via Git and HTTP and " "pushing via SSH" -msgstr "" +msgstr "公開匿名 Git ホスティングサイト - Git および HTTP を通じた pull とSSH を通じた push をサポートします" #: ../java/src/net/i2p/router/web/HomeHelper.java:49 msgid "Anonymous Git Hosting" @@ -3110,7 +3111,7 @@ msgstr "Anonymous Git Hosting" #: ../java/src/net/i2p/router/web/HomeHelper.java:50 msgid "HiddenGate" -msgstr "" +msgstr "HiddenGate" #: ../java/src/net/i2p/router/web/HomeHelper.java:51 msgid "Microblog" @@ -3118,7 +3119,7 @@ msgstr "マイクロブログ" #: ../java/src/net/i2p/router/web/HomeHelper.java:51 msgid "Your premier microblogging service on I2P" -msgstr "" +msgstr "I2P で最もよく使う短文投稿サービス" #: ../java/src/net/i2p/router/web/HomeHelper.java:52 msgid "Javadocs" @@ -3135,7 +3136,7 @@ msgstr "技術仕様" #. + I + "education.png" + S + #: ../java/src/net/i2p/router/web/HomeHelper.java:55 msgid "Debian and Tahoe-LAFS repositories" -msgstr "" +msgstr "Debian と Tahoe-LAFS のレポジトリ" #: ../java/src/net/i2p/router/web/HomeHelper.java:56 msgid "Free Web Hosting" @@ -3189,19 +3190,19 @@ msgstr "技術仕様" #: ../java/src/net/i2p/router/web/HomeHelper.java:65 msgid "Trac Wiki" -msgstr "" +msgstr "Trac Wiki" #: ../java/src/net/i2p/router/web/HomeHelper.java:66 msgid "Ugha's Wiki" -msgstr "" +msgstr "Ugha's Wiki" #: ../java/src/net/i2p/router/web/HomeHelper.java:67 msgid "Seedless and the Robert BitTorrent applications" -msgstr "" +msgstr "Seedless および Robert BitTorrent アプリケーション" #: ../java/src/net/i2p/router/web/HomeHelper.java:67 msgid "Sponge's main site" -msgstr "" +msgstr "Sponge のメインサイト" #: ../java/src/net/i2p/router/web/HomeHelper.java:108 msgid "The HTTP proxy is not up" @@ -3210,7 +3211,7 @@ msgstr "HTTPプロキシは起動していません" #: ../java/src/net/i2p/router/web/HomeHelper.java:110 #, java-format msgid "Your browser is not properly configured to use the HTTP proxy at {0}" -msgstr "" +msgstr "あなたのブラウザは {0} で HTTP プロキシを使用するように正しく設定されていません" #: ../java/src/net/i2p/router/web/HomeHelper.java:210 #: ../java/src/net/i2p/router/web/SummaryHelper.java:906 @@ -3223,11 +3224,11 @@ msgstr "URL" #: ../java/src/net/i2p/router/web/JobQueueHelper.java:50 msgid "I2P Job Queue" -msgstr "" +msgstr "I2P ジョブキュー" #: ../java/src/net/i2p/router/web/JobQueueHelper.java:51 msgid "Job runners" -msgstr "" +msgstr "有効なジョブ" #: ../java/src/net/i2p/router/web/JobQueueHelper.java:56 msgid "Active jobs" @@ -3236,30 +3237,30 @@ msgstr "有効なジョブ" #: ../java/src/net/i2p/router/web/JobQueueHelper.java:59 #, java-format msgid "started {0} ago" -msgstr "" +msgstr "{0} 前に開始" #: ../java/src/net/i2p/router/web/JobQueueHelper.java:64 msgid "Just finished jobs" -msgstr "" +msgstr "たった今ジョブが終了しました" #: ../java/src/net/i2p/router/web/JobQueueHelper.java:67 #, java-format msgid "finished {0} ago" -msgstr "" +msgstr "{0} 前に終了" #: ../java/src/net/i2p/router/web/JobQueueHelper.java:72 msgid "Ready/waiting jobs" -msgstr "" +msgstr "準備完了/待機中のジョブ" #: ../java/src/net/i2p/router/web/JobQueueHelper.java:89 msgid "Scheduled jobs" -msgstr "" +msgstr "スケジュールされたジョブ" #. translators: {0} is a job name, {1} is a time, e.g. 6 min #: ../java/src/net/i2p/router/web/JobQueueHelper.java:99 #, java-format msgid "{0} will start in {1}" -msgstr "" +msgstr "{0} は {1} 後に開始します" #: ../java/src/net/i2p/router/web/JobQueueHelper.java:113 msgid "Total Job Statistics" @@ -3268,7 +3269,7 @@ msgstr "合計ジョブ統計" #: ../java/src/net/i2p/router/web/JobQueueHelper.java:124 #: ../java/src/net/i2p/router/web/JobQueueHelper.java:141 msgid "Job" -msgstr "" +msgstr "ジョブ" #: ../java/src/net/i2p/router/web/JobQueueHelper.java:124 msgid "Queued" @@ -3276,11 +3277,11 @@ msgstr "キュー" #: ../java/src/net/i2p/router/web/JobQueueHelper.java:141 msgid "Runs" -msgstr "" +msgstr "有効" #: ../java/src/net/i2p/router/web/JobQueueHelper.java:142 msgid "Dropped" -msgstr "" +msgstr "中断" #: ../java/src/net/i2p/router/web/JobQueueHelper.java:143 #: ../java/src/net/i2p/router/web/JobQueueHelper.java:145 @@ -3304,7 +3305,7 @@ msgstr "保留中" #: ../java/src/net/i2p/router/web/JobQueueHelper.java:197 #: ../java/src/net/i2p/router/web/NetDbHelper.java:16 msgid "Summary" -msgstr "" +msgstr "概要" #: ../java/src/net/i2p/router/web/LogsHelper.java:49 #: ../java/src/net/i2p/router/web/LogsHelper.java:103 @@ -3322,22 +3323,22 @@ msgstr "ログメッセージなし" #. 0 #: ../java/src/net/i2p/router/web/NetDbHelper.java:17 msgid "Local Router" -msgstr "" +msgstr "ローカルルーター" #. 1 #: ../java/src/net/i2p/router/web/NetDbHelper.java:18 msgid "Router Lookup" -msgstr "" +msgstr "ルーター調査" #. 2 #: ../java/src/net/i2p/router/web/NetDbHelper.java:19 msgid "All Routers" -msgstr "" +msgstr "すべてのルーター" #. 3 #: ../java/src/net/i2p/router/web/NetDbHelper.java:20 msgid "All Routers with Full Stats" -msgstr "" +msgstr "すべてのルーター(全ステータス)" #. 4 #. 5 @@ -3374,7 +3375,7 @@ msgstr "宛先" #: ../java/src/net/i2p/router/web/NetDbRenderer.java:173 #: ../java/src/net/i2p/router/web/NetDbRenderer.java:185 msgid "Add to local addressbook" -msgstr "" +msgstr "ローカルのアドレス帳に追加" #: ../java/src/net/i2p/router/web/NetDbRenderer.java:190 #: ../java/src/net/i2p/router/web/NetDbRenderer.java:217 @@ -3433,7 +3434,7 @@ msgstr "次のピアの情報: " #: ../java/src/net/i2p/router/web/NetDbRenderer.java:433 msgid "Full entry" -msgstr "" +msgstr "フルエントリ" #: ../java/src/net/i2p/router/web/NetDbRenderer.java:440 #: ../java/src/net/i2p/router/web/SummaryHelper.java:152 @@ -3459,7 +3460,7 @@ msgstr "公開済み" #: ../java/src/net/i2p/router/web/NetDbRenderer.java:449 msgid "Signing Key" -msgstr "" +msgstr "署名キー" #: ../java/src/net/i2p/router/web/NetDbRenderer.java:451 msgid "Address(es)" @@ -3495,31 +3496,31 @@ msgstr "NTCP 及びイントロデューサー付き SSU" #: ../java/src/net/i2p/router/web/NetDbRenderer.java:491 msgid "IPv6 Only SSU, introducers" -msgstr "" +msgstr "IPv6 のみ SSU、イントロデューサー" #: ../java/src/net/i2p/router/web/NetDbRenderer.java:491 msgid "IPv6 SSU" -msgstr "" +msgstr "IPv6 SSU" #: ../java/src/net/i2p/router/web/NetDbRenderer.java:491 msgid "IPv6 SSU, introducers" -msgstr "" +msgstr "IPv6 SSU、イントロデューサー" #: ../java/src/net/i2p/router/web/NetDbRenderer.java:492 msgid "IPv6 NTCP" -msgstr "" +msgstr "IPv6 NTCP" #: ../java/src/net/i2p/router/web/NetDbRenderer.java:492 msgid "IPv6 NTCP, SSU" -msgstr "" +msgstr "IPv6 NTCP, SSU" #: ../java/src/net/i2p/router/web/NetDbRenderer.java:492 msgid "IPv6 NTCP, SSU, introducers" -msgstr "" +msgstr "IPv6 NTCP, SSU, イントロデューサー" #: ../java/src/net/i2p/router/web/NetDbRenderer.java:492 msgid "IPv6 Only NTCP, SSU, introducers" -msgstr "" +msgstr "IPv6 のみ NTCP, SSU, イントロデューサー" #: ../java/src/net/i2p/router/web/NewsHelper.java:295 #, java-format @@ -3533,49 +3534,49 @@ msgstr "ニュースは {0} に最終確認。" #: ../java/src/net/i2p/router/web/NewsHelper.java:310 msgid "Hide news" -msgstr "" +msgstr "ニュースを非表示" #: ../java/src/net/i2p/router/web/NewsHelper.java:313 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:647 msgid "Show news" -msgstr "" +msgstr "ニュースを表示" #: ../java/src/net/i2p/router/web/PluginStarter.java:140 msgid "Checking for plugin updates" -msgstr "" +msgstr "プラグインのアップデートをチェック中" #: ../java/src/net/i2p/router/web/PluginStarter.java:155 msgid "Plugin update check failed" -msgstr "" +msgstr "プラグインのアップデート確認失敗" #: ../java/src/net/i2p/router/web/PluginStarter.java:193 #, java-format msgid "1 plugin updated" msgid_plural "{0} plugins updated" -msgstr[0] "" +msgstr[0] "{0} 個のプラグインをアップデートしました" #: ../java/src/net/i2p/router/web/PluginStarter.java:195 msgid "Plugin update check complete" -msgstr "" +msgstr "プラグインのアップデート確認完了" #. buf.append("

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

\n

"); #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:79 #, java-format msgid "Showing 1 recent profile." msgid_plural "Showing {0} recent profiles." -msgstr[0] "" +msgstr[0] "{0} 件の最近のプロファイルを表示" #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:81 #, java-format msgid "Hiding 1 older profile." msgid_plural "Hiding {0} older profiles." -msgstr[0] "" +msgstr[0] "{0} 件のもっと昔のプロファイルを非表示" #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:83 #, java-format msgid "Hiding 1 standard profile." msgid_plural "Hiding {0} standard profiles." -msgstr[0] "" +msgstr[0] "{0} 件の標準プロファイルを非表示" #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:88 msgid "Groups (Caps)" @@ -3765,16 +3766,16 @@ msgstr "ステータス" #. 0 #: ../java/src/net/i2p/router/web/ProfilesHelper.java:12 msgid "Floodfill " -msgstr "" +msgstr "Floodfill " #. 2 #: ../java/src/net/i2p/router/web/ProfilesHelper.java:14 msgid "All" -msgstr "" +msgstr "すべて" #: ../java/src/net/i2p/router/web/SearchHelper.java:74 msgid "Select search engine" -msgstr "" +msgstr "検索エンジンを選択" #: ../java/src/net/i2p/router/web/StatsGenerator.java:57 msgid "GO" @@ -3834,7 +3835,7 @@ msgstr "生涯平均頻度" #, java-format msgid "1 event" msgid_plural "{0} events" -msgstr[0] "" +msgstr[0] "{0}件のイベント" #: ../java/src/net/i2p/router/web/StatsGenerator.java:168 msgid "rate" @@ -3852,12 +3853,12 @@ msgstr "最大平均" #, java-format msgid "There was 1 event in this period." msgid_plural "There were {0} events in this period." -msgstr[0] "" +msgstr[0] "この期間中に {0} 件のイベントがありました。" #: ../java/src/net/i2p/router/web/StatsGenerator.java:202 #, java-format msgid "The period ended {0} ago." -msgstr "" +msgstr "その期間は {0} 前に終了しました。" #: ../java/src/net/i2p/router/web/StatsGenerator.java:204 msgid "No events" @@ -3959,13 +3960,13 @@ msgstr "テキストのルーターパフォーマンス統計" #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:233 #: ../java/src/net/i2p/router/web/SummaryHelper.java:438 msgid "Local Tunnels" -msgstr "" +msgstr "ローカルトンネル" #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:235 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/i2ptunnelmgr_jsp.java:164 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/i2ptunnelmgr_jsp.java:337 msgid "Hidden Services Manager" -msgstr "" +msgstr "Hidden サービスマネージャー" #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:253 msgid "General" @@ -3979,7 +3980,7 @@ msgstr "ローカル識別子は一意な I2P ルーターの識別子であり #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:259 msgid "Never disclose this to anyone, as it can reveal your real world ip." -msgstr "" +msgstr "実際の IP がばれかねないので、誰にもこれを明かさないでください。" #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:261 msgid "Local Identity" @@ -4014,23 +4015,23 @@ msgstr "最適な I2P パフォーマンスを得るためにファイアーウ #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:337 msgid "See more information on the wiki" -msgstr "" +msgstr "wiki 上で詳細を表示" #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:339 msgid "Warning: ECDSA is not available. Update your Java or OS" -msgstr "" +msgstr "警告: ECDSA が利用できません。 Java または OS を更新してください" #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:351 msgid "Configure I2P Updates" -msgstr "" +msgstr "I2P のアップデートを構成" #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:353 msgid "I2P Update" -msgstr "" +msgstr "I2P アップデート" #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:378 msgid "Peers we've been talking to in the last few minutes/last hour" -msgstr "" +msgstr "過去数分/数時間内に通信したピア" #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:381 msgid "Active" @@ -4038,7 +4039,7 @@ msgstr "アクティブ" #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:390 msgid "The number of peers available for building client tunnels" -msgstr "" +msgstr "クライアントトンネルのビルドに利用できるピアノ数" #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:393 msgid "Fast" @@ -4092,13 +4093,13 @@ msgstr "予備" #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:500 msgid "Tunnels we are using to provide or access services on the network" -msgstr "" +msgstr "ネットワーク上でサービスを提供またはアクセスするために使用しているトンネル" #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:509 msgid "" "Tunnels we are participating in, directly contributing bandwidth to the " "network" -msgstr "" +msgstr "参加していて、ネットワークの帯域幅に直接貢献しているトンネル" #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:512 msgid "Participating" @@ -4108,7 +4109,7 @@ msgstr "参加中" msgid "" "The ratio of tunnel hops we provide to tunnel hops we use - a value greater " "than 1.00 indicates a positive contribution to the network" -msgstr "" +msgstr "使用するトンネルホップに提供しているトンネルのホップ率 - 1000より大きな値はネットワークへのポジティブな貢献を示します" #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:521 msgid "Share ratio" @@ -4124,7 +4125,7 @@ msgstr "混雑状態" #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:541 msgid "Indicates router performance" -msgstr "" +msgstr "ルーターパフォーマンスを表示" #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:544 msgid "Job lag" @@ -4132,7 +4133,7 @@ msgstr "ジョブラグ" #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:550 msgid "Indicates how quickly outbound messages to other I2P routers are sent" -msgstr "" +msgstr "ほかの I2P のルーターへの送信メッセージが送られた際の速さを表示" #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:553 msgid "Message delay" @@ -4140,7 +4141,7 @@ msgstr "メッセージ遅延" #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:560 msgid "Round trip time for a tunnel test" -msgstr "" +msgstr "トンネルテストのラウンドトリップ時間" #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:563 msgid "Tunnel lag" @@ -4148,7 +4149,7 @@ msgstr "トンネルラグ" #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:570 msgid "Queued requests from other routers to participate in tunnels" -msgstr "" +msgstr "トンネルに参加しているほかのルーターからのリクエストをキューに入れました" #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:573 msgid "Backlog" @@ -4156,7 +4157,7 @@ msgstr "バックラグ" #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:608 msgid "News & Updates" -msgstr "" +msgstr "ニュースとアップデート" #: ../java/src/net/i2p/router/web/SummaryHelper.java:143 msgid "ERR-Client Manager I2CP Error - check logs" @@ -4169,7 +4170,7 @@ msgstr "ERR-{0} のクロックスキュー" #: ../java/src/net/i2p/router/web/SummaryHelper.java:170 msgid "ERR-Unresolved TCP Address" -msgstr "" +msgstr "エラー - 解決できない TCP アドレス" #: ../java/src/net/i2p/router/web/SummaryHelper.java:174 msgid "ERR-Private TCP Address" @@ -4215,7 +4216,7 @@ msgstr "クライアント及びサーバートンネルを追加・削除・編 #: ../java/src/net/i2p/router/web/SummaryHelper.java:450 msgid "Hidden Service" -msgstr "" +msgstr "Hidden サービス" #: ../java/src/net/i2p/router/web/SummaryHelper.java:454 msgid "Show tunnels" @@ -4274,13 +4275,13 @@ msgstr "バージョン {0} " #: ../java/src/net/i2p/router/web/SummaryHelper.java:734 msgid "Update available" -msgstr "" +msgstr "アップデートが利用できます" #. Note to translators: parameter is a version, e.g. "0.8.4" #: ../java/src/net/i2p/router/web/SummaryHelper.java:758 #, java-format msgid "Download {0} Update" -msgstr "" +msgstr "{0} のアップデートをダウンロード" #. Note to translators: parameter is a router version, e.g. "0.9.19-16" #.
is optional, to help the browser make the lines even in the button @@ -4289,7 +4290,7 @@ msgstr "" #: ../java/src/net/i2p/router/web/SummaryHelper.java:766 #, java-format msgid "Download Signed
Development Update
{0}" -msgstr "" +msgstr "署名されている
開発アップデートをダウンロード
{0}" #. Note to translators: parameter is a date and time, e.g. "02-Mar 20:34 UTC" #.
is optional, to help the browser make the lines even in the button @@ -4298,7 +4299,7 @@ msgstr "" #: ../java/src/net/i2p/router/web/SummaryHelper.java:774 #, java-format msgid "Download Unsigned
Update {0}" -msgstr "" +msgstr "署名されていない {0}" #: ../java/src/net/i2p/router/web/SummaryHelper.java:798 msgid "Help with firewall configuration" @@ -4306,7 +4307,7 @@ msgstr "ファイアーウォールの構成に役立ちます" #: ../java/src/net/i2p/router/web/SummaryHelper.java:800 msgid "Check network connection and NAT/firewall" -msgstr "" +msgstr "ネットワーク接続および NAT/ファイアーウォールを確認してください" #: ../java/src/net/i2p/router/web/SummaryHelper.java:819 msgid "Reseed" @@ -4314,39 +4315,39 @@ msgstr "リシード" #: ../java/src/net/i2p/router/web/SummaryHelper.java:908 msgid "Order" -msgstr "" +msgstr "順序" #: ../java/src/net/i2p/router/web/SummaryHelper.java:925 msgid "Top" -msgstr "" +msgstr "上部" #: ../java/src/net/i2p/router/web/SummaryHelper.java:930 msgid "Move to top" -msgstr "" +msgstr "上部に移動" #: ../java/src/net/i2p/router/web/SummaryHelper.java:940 msgid "Move up" -msgstr "" +msgstr "上に移動" #: ../java/src/net/i2p/router/web/SummaryHelper.java:948 msgid "Down" -msgstr "" +msgstr "下" #: ../java/src/net/i2p/router/web/SummaryHelper.java:953 msgid "Move down" -msgstr "" +msgstr "下に移動" #: ../java/src/net/i2p/router/web/SummaryHelper.java:958 msgid "Bottom" -msgstr "" +msgstr "下部" #: ../java/src/net/i2p/router/web/SummaryHelper.java:963 msgid "Move to bottom" -msgstr "" +msgstr "下部に移動" #: ../java/src/net/i2p/router/web/SummaryHelper.java:975 msgid "Select a section to add" -msgstr "" +msgstr "追加するセクションを選択" #: ../java/src/net/i2p/router/web/SummaryRenderer.java:142 #, java-format @@ -5307,7 +5308,7 @@ msgstr "IPアドレスが変わった際の動作" msgid "" "Laptop mode - Change router identity and UDP port when IP changes for " "enhanced anonymity" -msgstr "ノートパソコンモード - より良い匿名性のため、IPアドレスが変わった際にルータのIDとUDPポートを変更する" +msgstr "ノートパソコンモード - 匿名性を向上させるため、IPアドレスが変わった際にルータのIDとUDPポートを変更する" #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:530 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:560 diff --git a/apps/routerconsole/locale/messages_pl.po b/apps/routerconsole/locale/messages_pl.po index be18a1880..df958ab9a 100644 --- a/apps/routerconsole/locale/messages_pl.po +++ b/apps/routerconsole/locale/messages_pl.po @@ -12,7 +12,8 @@ # polacco , 2012,2015 # PolishAnon , 2011-2012 # seb, 2014 -# seb, 2014 +# seb, 2014-2015 +# Taporpo Ne , 2015 # Tracerneo , 2013 # Warton , 2011-2012 # Tracerneo , 2013 @@ -20,10 +21,10 @@ msgid "" msgstr "" "Project-Id-Version: I2P\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-05-14 08:33+0000\n" -"PO-Revision-Date: 2015-05-14 08:34+0000\n" -"Last-Translator: kytv \n" -"Language-Team: Polish (http://www.transifex.com/projects/p/I2P/language/pl/)\n" +"POT-Creation-Date: 2015-07-17 01:05+0000\n" +"PO-Revision-Date: 2015-08-30 21:53+0000\n" +"Last-Translator: Taporpo Ne \n" +"Language-Team: Polish (http://www.transifex.com/otf/I2P/language/pl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -41,8 +42,8 @@ msgstr "" #. locale. #. If you want the digit separator in your locale, translate as {0}. #. alternates: msec, msecs -#: ../../../core/java/src/net/i2p/data/DataHelper.java:1527 -#: ../../../core/java/src/net/i2p/data/DataHelper.java:1577 +#: ../../../core/java/src/net/i2p/data/DataHelper.java:1529 +#: ../../../core/java/src/net/i2p/data/DataHelper.java:1582 #, java-format msgid "1 ms" msgid_plural "{0,number,####} ms" @@ -52,8 +53,8 @@ msgstr[2] "{0,number,####} ms" #. seconds #. alternates: secs, sec. 'seconds' is probably too long. -#: ../../../core/java/src/net/i2p/data/DataHelper.java:1531 -#: ../../../core/java/src/net/i2p/data/DataHelper.java:1579 +#: ../../../core/java/src/net/i2p/data/DataHelper.java:1533 +#: ../../../core/java/src/net/i2p/data/DataHelper.java:1584 #, java-format msgid "1 sec" msgid_plural "{0} sec" @@ -63,8 +64,8 @@ msgstr[2] "{0} sek" #. minutes #. alternates: mins, min. 'minutes' is probably too long. -#: ../../../core/java/src/net/i2p/data/DataHelper.java:1535 -#: ../../../core/java/src/net/i2p/data/DataHelper.java:1581 +#: ../../../core/java/src/net/i2p/data/DataHelper.java:1537 +#: ../../../core/java/src/net/i2p/data/DataHelper.java:1586 #, java-format msgid "1 min" msgid_plural "{0} min" @@ -74,8 +75,8 @@ msgstr[2] "{0} min" #. hours #. alternates: hrs, hr., hrs. -#: ../../../core/java/src/net/i2p/data/DataHelper.java:1539 -#: ../../../core/java/src/net/i2p/data/DataHelper.java:1583 +#: ../../../core/java/src/net/i2p/data/DataHelper.java:1541 +#: ../../../core/java/src/net/i2p/data/DataHelper.java:1588 #, java-format msgid "1 hour" msgid_plural "{0} hours" @@ -83,15 +84,9 @@ msgstr[0] "1 godz" msgstr[1] "{0} godz" msgstr[2] "{0} godz" -#: ../../../core/java/src/net/i2p/data/DataHelper.java:1541 -#: ../../../core/java/src/net/i2p/data/DataHelper.java:1585 -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:343 -msgid "n/a" -msgstr "n/d" - #. days #: ../../../core/java/src/net/i2p/data/DataHelper.java:1544 -#: ../../../core/java/src/net/i2p/data/DataHelper.java:1587 +#: ../../../core/java/src/net/i2p/data/DataHelper.java:1591 #, java-format msgid "1 day" msgid_plural "{0} days" @@ -99,21 +94,37 @@ msgstr[0] "1 dzień" msgstr[1] "{0} dni" msgstr[2] "{0} dni" -#: ../../../core/java/src/net/i2p/data/DataHelper.java:1573 +#. years +#: ../../../core/java/src/net/i2p/data/DataHelper.java:1547 +#: ../../../core/java/src/net/i2p/data/DataHelper.java:1594 +#, java-format +msgid "1 year" +msgid_plural "{0} years" +msgstr[0] "1 rok" +msgstr[1] "{0} lata" +msgstr[2] "{0} lat" + +#: ../../../core/java/src/net/i2p/data/DataHelper.java:1549 +#: ../../../core/java/src/net/i2p/data/DataHelper.java:1596 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:334 +msgid "n/a" +msgstr "n/d" + +#: ../../../core/java/src/net/i2p/data/DataHelper.java:1578 #, java-format msgid "1 ns" msgid_plural "{0,number,###} ns" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" +msgstr[0] "1 ns" +msgstr[1] "{0,number,###} ns" +msgstr[2] "{0,number,###} ns" -#: ../../../core/java/src/net/i2p/data/DataHelper.java:1575 +#: ../../../core/java/src/net/i2p/data/DataHelper.java:1580 #, java-format msgid "1 μs" msgid_plural "{0,number,###} μs" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" +msgstr[0] "1 μs" +msgstr[1] "{0,number,###} μs" +msgstr[2] "{0,number,###} μs" #: ../../../router/java/src/net/i2p/router/Blocklist.java:201 #, java-format @@ -151,7 +162,7 @@ msgstr "Do" #: ../../../router/java/src/net/i2p/router/Blocklist.java:997 #: ../java/src/net/i2p/router/web/BanlistRenderer.java:48 -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:647 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:652 #: ../java/src/net/i2p/router/web/SummaryHelper.java:478 msgid "none" msgstr "brak" @@ -164,40 +175,40 @@ msgstr "OK" #: ../../../router/java/src/net/i2p/router/CommSystemFacade.java:312 msgid "IPv4: OK; IPv6: Testing" -msgstr "" +msgstr "IPv4: OK; IPv6: Testuję" #: ../../../router/java/src/net/i2p/router/CommSystemFacade.java:313 msgid "IPv4: OK; IPv6: Firewalled" -msgstr "" +msgstr "IPv4: OK; IPv6: Za zaporą" #: ../../../router/java/src/net/i2p/router/CommSystemFacade.java:314 msgid "IPv4: Testing; IPv6: OK" -msgstr "" +msgstr "IPv4: Testuję; IPv6: OK" #: ../../../router/java/src/net/i2p/router/CommSystemFacade.java:315 msgid "IPv4: Firewalled; IPv6: OK" -msgstr "" +msgstr "IPv4: Za zaporą; IPv6: OK" #: ../../../router/java/src/net/i2p/router/CommSystemFacade.java:316 msgid "IPv4: Disabled; IPv6: OK" -msgstr "" +msgstr "IPv4: Wyłączone; IPv6: OK" #: ../../../router/java/src/net/i2p/router/CommSystemFacade.java:317 msgid "IPv4: Symmetric NAT; IPv6: OK" -msgstr "" +msgstr "IPv4: Symetryczny NAT; IPv6: OK" #. * IPv4 symmetric NAT, IPv6 firewalled or disabled or no address #: ../../../router/java/src/net/i2p/router/CommSystemFacade.java:319 msgid "Symmetric NAT" -msgstr "" +msgstr "Symetryczny NAT" #: ../../../router/java/src/net/i2p/router/CommSystemFacade.java:320 msgid "IPv4: Symmetric NAT; IPv6: Testing" -msgstr "" +msgstr "IPv4: Symetryczny NAT; IPv6: Testuję" #: ../../../router/java/src/net/i2p/router/CommSystemFacade.java:321 msgid "IPv4: Firewalled; IPv6: Testing" -msgstr "" +msgstr "IPv4: Za zaporą; IPv6: Testuję" #. * IPv4 firewalled, IPv6 firewalled or disabled or no address #: ../../../router/java/src/net/i2p/router/CommSystemFacade.java:323 @@ -207,29 +218,29 @@ msgstr "Za zaporą" #: ../../../router/java/src/net/i2p/router/CommSystemFacade.java:324 msgid "IPv4: Testing; IPv6: Firewalled" -msgstr "" +msgstr "IPv4: Testuję; IPv6: Za zaporą" #: ../../../router/java/src/net/i2p/router/CommSystemFacade.java:325 msgid "IPv4: Disabled; IPv6: Testing" -msgstr "" +msgstr "IPv4: Wyłączone; IPv6: Testuję" #: ../../../router/java/src/net/i2p/router/CommSystemFacade.java:326 msgid "IPv4: Disabled; IPv6: Firewalled" -msgstr "" +msgstr "IPv4: Wyłączone; IPv6: Za zaporą" #: ../../../router/java/src/net/i2p/router/CommSystemFacade.java:327 msgid "Disconnected" -msgstr "" +msgstr "Rozłączono" #: ../../../router/java/src/net/i2p/router/CommSystemFacade.java:328 msgid "Port Conflict" -msgstr "" +msgstr "Konflikt portów" #: ../../../router/java/src/net/i2p/router/CommSystemFacade.java:329 #: ../java/src/net/i2p/router/web/SummaryHelper.java:155 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:722 msgid "Testing" -msgstr "Testuje" +msgstr "Testuję" #. NPE, too early #. if (_context.router().getRouterInfo().getBandwidthTier().equals("K")) @@ -290,17 +301,17 @@ msgstr "Odrzucanie tuneli: Zamykanie" msgid "Rejecting tunnels" msgstr "Odrzucanie tuneli" -#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:210 +#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:212 #, java-format msgid "Reseeding: got router info from file ({0} successful, {1} errors)." -msgstr "" +msgstr "Ponowne seedowanie: pobrano informacje o węźle z pliku ({0} udane, {1} błędów)" -#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:282 +#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:284 #: ../java/src/net/i2p/router/web/ConfigNavHelper.java:28 msgid "Reseeding" msgstr "Ponowne seedowanie" -#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:305 +#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:307 #, java-format msgid "Reseed fetched only 1 router." msgid_plural "Reseed fetched only {0} routers." @@ -308,26 +319,26 @@ msgstr[0] "Ponowny seed pobrał tylko 1 węzeł." msgstr[1] "Ponowny seed pobrał tylko {0} węzły." msgstr[2] "Ponowny seed pobrał tylko {0} węzłów." -#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:314 +#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:316 msgid "Reseed failed." msgstr "Ponowne seedowanie nie udane" -#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:315 +#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:317 #, java-format msgid "See {0} for help." msgstr "Zobacz {0} w celu uzyskania pomocy." -#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:316 +#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:318 msgid "reseed configuration page" msgstr "strona ustawień ponownego seedowania" -#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:564 -#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:695 +#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:566 +#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:697 msgid "Reseeding: fetching seed URL." msgstr "Ponowne seedowanie: pobieranie URL seeda" -#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:621 -#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:731 +#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:623 +#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:733 #, java-format msgid "" "Reseeding: fetching router info from seed URL ({0} successful, {1} errors)." @@ -385,7 +396,7 @@ msgstr "Nieobsługiwany typ podpisu" #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:618 msgid "No support for our signature type" -msgstr "" +msgstr "Nieobsługiwany typ naszego podpisu" #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:622 msgid "Unreachable on any transport" @@ -397,7 +408,7 @@ msgstr "Nieosiągalne na każdym transporcie" #: ../../../router/java/src/net/i2p/router/transport/UPnP.java:603 #: ../../../router/java/src/net/i2p/router/transport/UPnP.java:621 #: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:1348 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2452 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2469 #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:92 msgid "Status" msgstr "Stan" @@ -412,7 +423,7 @@ msgid "{0} is used for outbound connections only" msgstr "{0} jest używane tylko do połączeń wychodzących" #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:711 -#: ../../../router/java/src/net/i2p/router/transport/UPnPManager.java:278 +#: ../../../router/java/src/net/i2p/router/transport/UPnPManager.java:283 msgid "UPnP is not enabled" msgstr "UPnP nie jest włączone" @@ -435,13 +446,13 @@ msgid "" msgstr "Aby zmienić te limity, dodaj ustawienia i2np.ntcp.maxConnections=nnn i i2np.udp.maxConnections=nnn na stronie zaawansowanych ustawień." #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:725 -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:275 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:266 msgid "Definitions" msgstr "Definicje" #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:726 #: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:1352 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2456 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2473 #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:24 #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:33 #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:35 @@ -456,7 +467,7 @@ msgstr "Zdalny uczestnik, zidentifikowany przez hash węzła" #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:727 #: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:1353 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2460 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2477 msgid "Dir" msgstr "Kier." @@ -483,13 +494,13 @@ msgstr "Jak długo od czasu, gdy pakiet został odebrany / wysłany" #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:735 #: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:1355 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2462 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2479 msgid "Idle" msgstr "Bezczynny" #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:736 #: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:1356 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2467 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2484 #: ../java/src/net/i2p/router/web/TunnelRenderer.java:162 msgid "In/Out" msgstr "Wejście / Wyjście" @@ -504,14 +515,14 @@ msgstr "Jak długo od czasu, gdy połączenie zostało ustanowione" #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:737 #: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:1357 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2472 -#: ../java/src/net/i2p/router/web/SummaryHelper.java:928 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2489 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:935 msgid "Up" msgstr "W górę" #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:738 #: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:1358 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2474 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2491 msgid "Skew" msgstr "Odchylenie" @@ -560,7 +571,7 @@ msgstr "Obecny maksymalny rozmiar pakietu wysyłania / szacowany maksymalny rozm #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:748 #: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:1359 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2491 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2508 msgid "TX" msgstr "TX" @@ -570,7 +581,7 @@ msgstr "Całkowita liczba pakietów wysłanych do uczestnika" #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:749 #: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:1360 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2493 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2510 msgid "RX" msgstr "RX" @@ -579,7 +590,7 @@ msgid "The total number of packets received from the peer" msgstr "Całkowita liczba pakietów otrzymanych od uczestnika" #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:750 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2496 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2513 msgid "Dup TX" msgstr "Dup TX" @@ -588,7 +599,7 @@ msgid "The total number of packets retransmitted to the peer" msgstr "Całkowita liczba pakietów retransmitowanych do uczestnika" #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:751 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2498 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2515 msgid "Dup RX" msgstr "Dup RX" @@ -627,8 +638,8 @@ msgstr "Połączenie WAN PPP" #: ../../../router/java/src/net/i2p/router/transport/UPnP.java:583 #: ../../../router/java/src/net/i2p/router/transport/UPnP.java:610 -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:283 -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:309 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:288 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:314 msgid "Uptime" msgstr "Czas działania" @@ -723,17 +734,17 @@ msgid "NTCP connections" msgstr "Połączenia NTCP" #: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:1345 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2449 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2466 msgid "Limit" msgstr "Limit" #: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:1346 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2450 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2467 msgid "Timeout" msgstr "Limit czasu" #: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:1354 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2461 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2478 msgid "IPv6" msgstr "IPv6" @@ -746,19 +757,19 @@ msgid "Backlogged?" msgstr "Zaległości?" #: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:1375 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2515 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2532 #: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:91 msgid "Inbound" msgstr "Przychodzące" #: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:1377 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2517 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2534 #: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:91 msgid "Outbound" msgstr "Wychodzące" #: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:1432 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2682 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2699 #, java-format msgid "{0} peer" msgid_plural "{0} peers" @@ -766,107 +777,107 @@ msgstr[0] "{0} uczestnik" msgstr[1] "{0} uczestnicy" msgstr[2] "{0} uczestników" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2448 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2465 msgid "UDP connections" msgstr "Połączenia UDP" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2458 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2475 msgid "Sort by peer hash" msgstr "Sortuj według hashu uczestnika" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2460 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2477 msgid "Direction/Introduction" msgstr "Kierunek/Wprowadzenie" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2463 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2480 msgid "Sort by idle inbound" msgstr "Sortuj według bezczynnych przychodzących" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2465 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2482 msgid "Sort by idle outbound" msgstr "Sortuj według bezczynnych wychodzących" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2468 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2485 msgid "Sort by inbound rate" msgstr "Sortuj według prędkości przychodzących" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2470 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2487 msgid "Sort by outbound rate" msgstr "Sortuj według prędkości wychodzących" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2473 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2490 msgid "Sort by connection uptime" msgstr "Sortuj według czasu działania połączenia" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2475 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2492 msgid "Sort by clock skew" msgstr "Sortuj według odchylenia zegara" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2478 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2495 msgid "Sort by congestion window" msgstr "Sortuj według okna zatłoczenia" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2480 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2497 msgid "Sort by slow start threshold" msgstr "Sortuj według progu powolnego startu" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2483 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2500 msgid "Sort by round trip time" msgstr "Sortuj według czasu podróży w obie strony" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2487 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2504 msgid "Sort by retransmission timeout" msgstr "Sortuj według limitu czasu retransmisji" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2490 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2507 msgid "Sort by outbound maximum transmit unit" msgstr "Sortuj według maksymalnej wychodzących jednostki transmisji" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2492 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2509 msgid "Sort by packets sent" msgstr "Sortuj według pakietów wysłanych" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2494 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2511 msgid "Sort by packets received" msgstr "Sortuj według pakietów otrzymanych" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2497 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2514 msgid "Sort by packets retransmitted" msgstr "Sortuj według pakietów retransmitowanych" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2499 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2516 msgid "Sort by packets received more than once" msgstr "Sortuj według pakietów otrzymanych więcej niż jeden raz" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2519 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2536 msgid "We offered to introduce them" msgstr "Zaproponowaliśmy, że ich wprowadzimy" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2521 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2538 msgid "They offered to introduce us" msgstr "Zaproponowali, że nas wprowadzą" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2525 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2542 msgid "Choked" msgstr "Zdławiony" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2533 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2550 msgid "1 fail" msgstr "1 porażka" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2535 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2552 #, java-format msgid "{0} fails" msgstr "{0} nieudanych" #. 1 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2541 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2558 #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:166 #: ../java/src/net/i2p/router/web/ProfilesHelper.java:13 msgid "Banned" msgstr "Zbanowany" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2600 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2617 msgid "backlogged" msgstr "zalogowano" @@ -904,66 +915,66 @@ msgstr "Odrzucanie żądań o tunele: Wysokie obciążenie" msgid "Dropping tunnel requests: Queue time" msgstr "Odrzucanie żądań o tunele: Czas kolejki" -#: ../java/src/net/i2p/router/update/ConsoleUpdateManager.java:858 +#: ../java/src/net/i2p/router/update/ConsoleUpdateManager.java:884 #, java-format msgid "New plugin version {0} is available" msgstr "Nowa wersja {0} wtyczki jest dostępna" -#: ../java/src/net/i2p/router/update/ConsoleUpdateManager.java:938 +#: ../java/src/net/i2p/router/update/ConsoleUpdateManager.java:964 #, java-format msgid "Update check failed for plugin {0}" msgstr "Nieudane sprawdzanie aktualizacji dla wtyczki {0}" -#: ../java/src/net/i2p/router/update/ConsoleUpdateManager.java:942 +#: ../java/src/net/i2p/router/update/ConsoleUpdateManager.java:968 #, java-format msgid "No new version is available for plugin {0}" msgstr "Brak nowych wersji dla wtyczki {0}" -#: ../java/src/net/i2p/router/update/ConsoleUpdateManager.java:966 +#: ../java/src/net/i2p/router/update/ConsoleUpdateManager.java:992 #, java-format msgid "{0}B transferred" msgstr "{0} bajtów przesłano" -#: ../java/src/net/i2p/router/update/ConsoleUpdateManager.java:1025 +#: ../java/src/net/i2p/router/update/ConsoleUpdateManager.java:1051 #, java-format msgid "Install failed from {0}" -msgstr "" +msgstr "Nieudana instalacja z {0}" -#: ../java/src/net/i2p/router/update/ConsoleUpdateManager.java:1027 +#: ../java/src/net/i2p/router/update/ConsoleUpdateManager.java:1053 #: ../java/src/net/i2p/router/update/UpdateRunner.java:298 #, java-format msgid "Transfer failed from {0}" msgstr "Nieudany transfer z {0}" -#: ../java/src/net/i2p/router/update/ConsoleUpdateManager.java:1302 -#: ../java/src/net/i2p/router/update/ConsoleUpdateManager.java:1366 -#: ../java/src/net/i2p/router/update/ConsoleUpdateManager.java:1390 -#: ../java/src/net/i2p/router/web/SummaryHelper.java:713 +#: ../java/src/net/i2p/router/update/ConsoleUpdateManager.java:1328 +#: ../java/src/net/i2p/router/update/ConsoleUpdateManager.java:1392 +#: ../java/src/net/i2p/router/update/ConsoleUpdateManager.java:1416 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:715 msgid "Update downloaded" msgstr "Uaktualnienie ściągnięte" -#: ../java/src/net/i2p/router/update/ConsoleUpdateManager.java:1346 -#: ../java/src/net/i2p/router/update/ConsoleUpdateManager.java:1390 +#: ../java/src/net/i2p/router/update/ConsoleUpdateManager.java:1372 +#: ../java/src/net/i2p/router/update/ConsoleUpdateManager.java:1416 msgid "Restarting" msgstr "Restartuję" -#: ../java/src/net/i2p/router/update/ConsoleUpdateManager.java:1346 +#: ../java/src/net/i2p/router/update/ConsoleUpdateManager.java:1372 msgid "Update verified" msgstr "Zweryfikowano aktualizację" -#: ../java/src/net/i2p/router/update/ConsoleUpdateManager.java:1355 +#: ../java/src/net/i2p/router/update/ConsoleUpdateManager.java:1381 #: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:189 #: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:306 #, java-format msgid "from {0}" msgstr "z {0}" -#: ../java/src/net/i2p/router/update/ConsoleUpdateManager.java:1370 +#: ../java/src/net/i2p/router/update/ConsoleUpdateManager.java:1396 #, java-format msgid "Unsigned update file from {0} is corrupt" msgstr "Niepodpisana aktualizacja z pliku {0} jest uszkodzona" -#: ../java/src/net/i2p/router/update/ConsoleUpdateManager.java:1399 +#: ../java/src/net/i2p/router/update/ConsoleUpdateManager.java:1425 #, java-format msgid "Failed copy to {0}" msgstr "Nie udało się skopiować do {0}" @@ -976,7 +987,7 @@ msgstr "Nie udało się skopiować do {0}" #: ../java/src/net/i2p/router/update/UnsignedUpdateRunner.java:41 #: ../java/src/net/i2p/router/update/UpdateRunner.java:155 #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:573 -#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:175 +#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:177 #: ../java/src/net/i2p/router/web/PluginStarter.java:157 msgid "HTTP client proxy tunnel must be running" msgstr "" @@ -990,20 +1001,20 @@ msgstr "" msgid "Updating" msgstr "Uaktualniam" -#: ../java/src/net/i2p/router/update/NewsFetcher.java:172 +#: ../java/src/net/i2p/router/update/NewsFetcher.java:209 msgid "In-network updates disabled. Check package manager." msgstr "Aktualizacje wewnątrz sieciowe wyłączone. Sprawdź managera pakietów." -#: ../java/src/net/i2p/router/update/NewsFetcher.java:178 +#: ../java/src/net/i2p/router/update/NewsFetcher.java:215 msgid "No write permission for I2P install directory." msgstr "Brak praw do zapisu w katalogu instalacyjnym I2P." -#: ../java/src/net/i2p/router/update/NewsFetcher.java:186 +#: ../java/src/net/i2p/router/update/NewsFetcher.java:223 #, java-format msgid "You must first update to version {0}" msgstr "Najpierw musisz aktualizować do wersji {0}" -#: ../java/src/net/i2p/router/update/NewsFetcher.java:196 +#: ../java/src/net/i2p/router/update/NewsFetcher.java:233 #, java-format msgid "Requires Java version {0} but installed Java version is {1}" msgstr "Wymagana jest Java w wersji {0}. Obecna zainstalowana wersja to {1}" @@ -1193,16 +1204,20 @@ msgid "No new version found at {0}" msgstr "Nie znaleziono nowej wersji w {0}" #: ../java/src/net/i2p/router/web/BanlistRenderer.java:65 +msgid "Permanently banned" +msgstr "Zbanowany permanentnie" + +#: ../java/src/net/i2p/router/web/BanlistRenderer.java:67 #, java-format msgid "Temporary ban expiring in {0}" msgstr "Tymczasowy ban wygasa w {0}" -#: ../java/src/net/i2p/router/web/BanlistRenderer.java:67 +#: ../java/src/net/i2p/router/web/BanlistRenderer.java:69 #, java-format msgid "Banned until restart or in {0}" msgstr "Zbanowany aż do restartu lub przez {0}" -#: ../java/src/net/i2p/router/web/BanlistRenderer.java:79 +#: ../java/src/net/i2p/router/web/BanlistRenderer.java:82 msgid "unban now" msgstr "odbanuj teraz" @@ -1303,18 +1318,18 @@ msgstr "odbanuj teraz" msgid "I2P Router Console" msgstr "Konsola Węzła I2P" -#: ../java/src/net/i2p/router/web/ConfigAdvancedHandler.java:61 +#: ../java/src/net/i2p/router/web/ConfigAdvancedHandler.java:62 msgid "Error updating the configuration - please see the error logs" msgstr "Błąd podczas aktualizowania ustawień – zobacz logi błędów" -#: ../java/src/net/i2p/router/web/ConfigAdvancedHandler.java:71 -#: ../java/src/net/i2p/router/web/ConfigAdvancedHandler.java:87 +#: ../java/src/net/i2p/router/web/ConfigAdvancedHandler.java:72 +#: ../java/src/net/i2p/router/web/ConfigAdvancedHandler.java:96 #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:389 msgid "Configuration saved successfully" msgstr "Konfiguracja zapisana pomyślnie" -#: ../java/src/net/i2p/router/web/ConfigAdvancedHandler.java:73 -#: ../java/src/net/i2p/router/web/ConfigAdvancedHandler.java:89 +#: ../java/src/net/i2p/router/web/ConfigAdvancedHandler.java:74 +#: ../java/src/net/i2p/router/web/ConfigAdvancedHandler.java:98 #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:622 #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:391 #: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:151 @@ -1353,7 +1368,7 @@ msgstr "Zainstaluj wtyczkę" #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:77 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:639 msgid "Install Plugin from File" -msgstr "" +msgstr "Zainstaluj wtyczkę z pliku" #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:86 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:650 @@ -1453,11 +1468,11 @@ msgstr "Brak wskazanego URL wtyczki." #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:421 #: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:79 msgid "You must enter a file" -msgstr "" +msgstr "Musisz podać plik" #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:464 msgid "Install from file failed" -msgstr "" +msgstr "Instalacja z pliku nie powiodła się" #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:479 #, java-format @@ -1476,7 +1491,7 @@ msgstr "Aktualizowanie wszystkich wtyczek" #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:528 #, java-format msgid "Installing plugin from {0}" -msgstr "" +msgstr "Instalowanie wtyczki z {0}" #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:549 #, java-format @@ -1522,10 +1537,10 @@ msgid "Add Client" msgstr "Dodaj klienta" #: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:116 -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:498 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:503 #: ../java/src/net/i2p/router/web/SummaryHelper.java:452 msgid "Client" -msgstr "Klient" +msgstr "Klienckie" #: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:117 #: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:203 @@ -1554,9 +1569,9 @@ msgid "Plugin" msgstr "Wtyczka" #: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:248 -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:320 -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:273 -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:299 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:337 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:278 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:304 msgid "Version" msgstr "Wersja" @@ -1578,7 +1593,8 @@ msgstr "Licencja" #: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:294 #: ../java/src/net/i2p/router/web/HomeHelper.java:37 -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:152 +#: ../java/src/net/i2p/router/web/HomeHelper.java:171 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:157 msgid "Website" msgstr "Strona internetowa" @@ -1591,7 +1607,7 @@ msgid "Stop" msgstr "Zatrzymaj" #: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:362 -#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:158 +#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:160 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:463 msgid "Check for updates" msgstr "Sprawdź aktualizacje" @@ -1613,7 +1629,7 @@ msgstr "Usuń" #: ../java/src/net/i2p/router/web/ConfigHomeHandler.java:21 #: ../java/src/net/i2p/router/web/ConfigSummaryHandler.java:22 #: ../java/src/net/i2p/router/web/ConfigUIHandler.java:19 -#: ../java/src/net/i2p/router/web/SummaryHelper.java:948 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:970 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confighome_jsp.java:496 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confighome_jsp.java:516 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confighome_jsp.java:532 @@ -1623,7 +1639,7 @@ msgstr "Usuń zaznaczone" #: ../java/src/net/i2p/router/web/ConfigHomeHandler.java:22 #: ../java/src/net/i2p/router/web/ConfigSummaryHandler.java:23 -#: ../java/src/net/i2p/router/web/SummaryHelper.java:967 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:989 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confighome_jsp.java:494 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confighome_jsp.java:502 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confighome_jsp.java:514 @@ -1642,7 +1658,7 @@ msgstr "Przywróć domyślne" #: ../java/src/net/i2p/router/web/ConfigHomeHandler.java:24 #: ../java/src/net/i2p/router/web/ConfigSummaryHandler.java:26 -#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:200 +#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:202 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confighome_jsp.java:482 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configsidebar_jsp.java:486 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:542 @@ -1771,8 +1787,8 @@ msgstr "WARN" #: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:85 #: ../java/src/net/i2p/router/web/ConfigUIHelper.java:170 -#: ../java/src/net/i2p/router/web/HomeHelper.java:199 -#: ../java/src/net/i2p/router/web/SummaryHelper.java:902 +#: ../java/src/net/i2p/router/web/HomeHelper.java:208 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:904 msgid "Remove" msgstr "Usuń" @@ -1782,7 +1798,7 @@ msgstr "Wybierz klasę do dodania" #. stat groups for stats.jsp #: ../java/src/net/i2p/router/web/ConfigNavHelper.java:25 -#: ../java/strings/Strings.java:57 +#: ../java/strings/Strings.java:58 msgid "Bandwidth" msgstr "Przepustowość" @@ -1791,7 +1807,7 @@ msgid "Home Page" msgstr "Strona Główna" #: ../java/src/net/i2p/router/web/ConfigNavHelper.java:25 -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:323 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:328 msgid "Network" msgstr "Sieć" @@ -1847,9 +1863,9 @@ msgid "UI" msgstr "UI" #: ../java/src/net/i2p/router/web/ConfigNavHelper.java:26 -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:174 -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:481 -#: ../java/strings/Strings.java:72 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:179 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:486 +#: ../java/strings/Strings.java:73 msgid "Tunnels" msgstr "Tunele" @@ -1867,15 +1883,15 @@ msgid "Logging" msgstr "Zapisywanie do loga" #: ../java/src/net/i2p/router/web/ConfigNavHelper.java:27 -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:180 -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:367 -#: ../java/strings/Strings.java:67 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:185 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:372 +#: ../java/strings/Strings.java:68 msgid "Peers" msgstr "Uczestnicy" #: ../java/src/net/i2p/router/web/ConfigNavHelper.java:27 -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:455 -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:218 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:473 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:223 msgid "Stats" msgstr "Statystyki" @@ -1887,8 +1903,8 @@ msgstr "Zaawansowane" #: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:97 #: ../java/src/net/i2p/router/web/ConfigTunnelsHandler.java:30 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:499 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:459 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:479 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:471 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:491 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:479 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:641 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:591 @@ -1972,11 +1988,11 @@ msgstr "Wyłączenie trybu laptopa" #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:359 msgid "Disabling inbound IPv4" -msgstr "" +msgstr "Wyłączenie przychodzących IPv4" #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:361 msgid "Enabling inbound IPv4" -msgstr "" +msgstr "Włączenie przychodzących IPv4" #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:369 msgid "Disabling UDP" @@ -2093,7 +2109,7 @@ msgstr "" #: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:37 msgid "You must enter a URL" -msgstr "" +msgstr "Musisz podać URL" #: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:66 msgid "Reseed in progress, check summary bar for status" @@ -2106,12 +2122,12 @@ msgstr "" #: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:74 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:503 msgid "Reseed from file" -msgstr "" +msgstr "Ponownie udostępnij z pliku" #: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:84 #: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:91 msgid "Reseed from file failed" -msgstr "" +msgstr "Ponowne udostępnienie z pliku zakończone niepowodzeniem" #: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:86 #, java-format @@ -2150,7 +2166,7 @@ msgstr "Natychmiast uruchom ponownie" #. ctx.router().shutdown(Router.EXIT_HARD_RESTART); // never returns #. give the UI time to respond #: ../java/src/net/i2p/router/web/ConfigRestartBean.java:47 -#: ../java/src/net/i2p/router/web/SummaryRenderer.java:200 +#: ../java/src/net/i2p/router/web/SummaryRenderer.java:201 msgid "Restart" msgstr "Restart" @@ -2593,7 +2609,7 @@ msgstr "Rosyjski" #: ../java/src/net/i2p/router/web/ConfigUIHelper.java:97 msgid "Slovak" -msgstr "" +msgstr "Słowacki" #: ../java/src/net/i2p/router/web/ConfigUIHelper.java:98 msgid "Swedish" @@ -2624,8 +2640,8 @@ msgid "User Name" msgstr "Nazwa użytkownika" #: ../java/src/net/i2p/router/web/ConfigUIHelper.java:183 -#: ../java/src/net/i2p/router/web/HomeHelper.java:226 -#: ../java/src/net/i2p/router/web/SummaryHelper.java:950 +#: ../java/src/net/i2p/router/web/HomeHelper.java:235 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:972 msgid "Add" msgstr "Dodaj" @@ -2634,91 +2650,91 @@ msgstr "Dodaj" msgid "Password" msgstr "Hasło" -#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:165 +#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:167 msgid "Update or check already in progress" msgstr "Trwa już aktualizacja lub sprawdzanie" -#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:188 +#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:190 msgid "Update available, attempting to download now" msgstr "Dostępne uaktualnienie , próba ściągnięcia" -#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:190 +#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:192 msgid "Update available, click button on left to download" msgstr "Dostępna aktualizacja, kliknij przycisk po lewej, aby pobrać" -#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:196 +#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:198 msgid "No update available" msgstr "Brak dostepnych aktualizacji" -#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:214 +#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:216 #, java-format msgid "Updating news URL to {0}" msgstr "Aktualizowanie URL-a wiadomości do {0}" -#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:221 -#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:229 -#: ../java/src/net/i2p/router/web/ConfigUpdateHelper.java:53 -#: ../java/src/net/i2p/router/web/ConfigUpdateHelper.java:59 +#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:223 +#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:231 +#: ../java/src/net/i2p/router/web/ConfigUpdateHelper.java:54 +#: ../java/src/net/i2p/router/web/ConfigUpdateHelper.java:60 msgid "internal" msgstr "wewnętrzny" -#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:225 +#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:227 #, java-format msgid "Updating proxy host to {0}" msgstr "Aktualizacja hosta proxy do {0}" -#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:233 +#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:235 #, java-format msgid "Updating proxy port to {0}" msgstr "Aktualizacja portu proxy do {0}" -#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:249 +#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:251 #, java-format msgid "Updating refresh frequency to {0}" msgstr "Aktualizacja częstotliwości odświeżania do {0}" -#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:250 -#: ../java/src/net/i2p/router/web/ConfigUpdateHelper.java:129 +#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:252 +#: ../java/src/net/i2p/router/web/ConfigUpdateHelper.java:130 #: ../java/src/net/i2p/router/web/GraphHelper.java:377 msgid "Never" msgstr "Nigdy" -#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:257 +#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:259 #, java-format msgid "Updating update policy to {0}" msgstr "Aktualizacja polityki aktualizacji do {0}" -#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:266 +#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:268 msgid "Updating update URLs." msgstr "Aktualizaowanie zaktualizowanych adresów URL." -#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:278 +#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:280 msgid "Updating trusted keys." msgstr "Uaktualnianie zaufanych kluczy" -#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:290 +#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:292 #, java-format msgid "Updating unsigned update URL to {0}" msgstr "" -#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:302 +#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:304 #, java-format msgid "Updating signed development build URL to {0}" msgstr "" -#: ../java/src/net/i2p/router/web/ConfigUpdateHelper.java:131 +#: ../java/src/net/i2p/router/web/ConfigUpdateHelper.java:132 msgid "Every" msgstr "Co" -#: ../java/src/net/i2p/router/web/ConfigUpdateHelper.java:149 +#: ../java/src/net/i2p/router/web/ConfigUpdateHelper.java:150 msgid "Notify only" msgstr "Powiadom tylko" -#: ../java/src/net/i2p/router/web/ConfigUpdateHelper.java:156 +#: ../java/src/net/i2p/router/web/ConfigUpdateHelper.java:157 msgid "Download and verify only" msgstr "Ściągnij i tylko zweryfikuj" -#: ../java/src/net/i2p/router/web/ConfigUpdateHelper.java:164 +#: ../java/src/net/i2p/router/web/ConfigUpdateHelper.java:165 msgid "Download, verify, and restart" msgstr "Ściągnij, zweryfikuj i zrestartuj" @@ -2844,7 +2860,7 @@ msgid "No \"{0}\" events found in previous {1}" msgstr "Nie znaleziono żadnych \"{0}\" wydarzeń w poprzednim {1}" #: ../java/src/net/i2p/router/web/EventLogHelper.java:179 -#: ../java/src/net/i2p/router/web/JobQueueHelper.java:144 +#: ../java/src/net/i2p/router/web/JobQueueHelper.java:143 msgid "Time" msgstr "Czas" @@ -2994,12 +3010,12 @@ msgid "Graph settings saved" msgstr "Zapisano ustawienia rysowania wykresów" #: ../java/src/net/i2p/router/web/HomeHelper.java:29 -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:224 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:229 msgid "Addressbook" msgstr "Książka adresowa" #: ../java/src/net/i2p/router/web/HomeHelper.java:29 -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:222 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:227 msgid "Manage your I2P hosts file here (I2P domain name resolution)" msgstr "Zarządzaj swoim plikiem hosta I2P tutaj (nazwa domeny I2P)" @@ -3030,17 +3046,17 @@ msgid "I2P Home Page Configuration" msgstr "Konfiguracja strony domowej I2P" #: ../java/src/net/i2p/router/web/HomeHelper.java:33 -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:138 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:139 msgid "Anonymous webmail client" msgstr "Anonimowy klient pocztowy" #: ../java/src/net/i2p/router/web/HomeHelper.java:33 -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:140 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:141 msgid "Email" msgstr "Email" #: ../java/src/net/i2p/router/web/HomeHelper.java:34 -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:246 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:251 msgid "I2P Router Help" msgstr "Pomoc węzła I2P" @@ -3050,17 +3066,17 @@ msgid "Router Console" msgstr "Konsola węzła" #: ../java/src/net/i2p/router/web/HomeHelper.java:36 -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:144 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:145 msgid "Built-in anonymous BitTorrent Client" msgstr "Wbudowany anonimowy klient sieci BitTorrent" #: ../java/src/net/i2p/router/web/HomeHelper.java:36 -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:146 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:147 msgid "Torrents" msgstr "Torrenty" #: ../java/src/net/i2p/router/web/HomeHelper.java:37 -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:150 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:155 msgid "Local web server" msgstr "Serwer lokalnej sieci" @@ -3229,97 +3245,97 @@ msgstr "HTTP proxy nie działa" msgid "Your browser is not properly configured to use the HTTP proxy at {0}" msgstr "Twoja przeglądarka nie jest poprawnie skonfigurowana, aby używać HTTP proxy na {0}" -#: ../java/src/net/i2p/router/web/HomeHelper.java:201 -#: ../java/src/net/i2p/router/web/SummaryHelper.java:904 +#: ../java/src/net/i2p/router/web/HomeHelper.java:210 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:906 msgid "Name" msgstr "Nazwa" -#: ../java/src/net/i2p/router/web/HomeHelper.java:203 +#: ../java/src/net/i2p/router/web/HomeHelper.java:212 msgid "URL" msgstr "URL" -#: ../java/src/net/i2p/router/web/JobQueueHelper.java:51 +#: ../java/src/net/i2p/router/web/JobQueueHelper.java:50 msgid "I2P Job Queue" msgstr "Kolejka zadań I2P" -#: ../java/src/net/i2p/router/web/JobQueueHelper.java:52 +#: ../java/src/net/i2p/router/web/JobQueueHelper.java:51 msgid "Job runners" msgstr "Bierzące zadania" -#: ../java/src/net/i2p/router/web/JobQueueHelper.java:57 +#: ../java/src/net/i2p/router/web/JobQueueHelper.java:56 msgid "Active jobs" msgstr "Aktywne zadania" -#: ../java/src/net/i2p/router/web/JobQueueHelper.java:60 +#: ../java/src/net/i2p/router/web/JobQueueHelper.java:59 #, java-format msgid "started {0} ago" msgstr "rozpoczęto {0} temu" -#: ../java/src/net/i2p/router/web/JobQueueHelper.java:65 +#: ../java/src/net/i2p/router/web/JobQueueHelper.java:64 msgid "Just finished jobs" msgstr "Niedawno zakończone zadania" -#: ../java/src/net/i2p/router/web/JobQueueHelper.java:68 +#: ../java/src/net/i2p/router/web/JobQueueHelper.java:67 #, java-format msgid "finished {0} ago" msgstr "zakończono {0} temu" -#: ../java/src/net/i2p/router/web/JobQueueHelper.java:73 +#: ../java/src/net/i2p/router/web/JobQueueHelper.java:72 msgid "Ready/waiting jobs" msgstr "Gotowe/czekające zadania" -#: ../java/src/net/i2p/router/web/JobQueueHelper.java:90 +#: ../java/src/net/i2p/router/web/JobQueueHelper.java:89 msgid "Scheduled jobs" msgstr "Zaplanowane zadania" #. translators: {0} is a job name, {1} is a time, e.g. 6 min -#: ../java/src/net/i2p/router/web/JobQueueHelper.java:100 +#: ../java/src/net/i2p/router/web/JobQueueHelper.java:99 #, java-format msgid "{0} will start in {1}" msgstr "{0} zacznie się za {1}" -#: ../java/src/net/i2p/router/web/JobQueueHelper.java:114 +#: ../java/src/net/i2p/router/web/JobQueueHelper.java:113 msgid "Total Job Statistics" msgstr "Statystyka ogólu zadań" -#: ../java/src/net/i2p/router/web/JobQueueHelper.java:125 -#: ../java/src/net/i2p/router/web/JobQueueHelper.java:142 +#: ../java/src/net/i2p/router/web/JobQueueHelper.java:124 +#: ../java/src/net/i2p/router/web/JobQueueHelper.java:141 msgid "Job" msgstr "Zadanie" -#: ../java/src/net/i2p/router/web/JobQueueHelper.java:125 +#: ../java/src/net/i2p/router/web/JobQueueHelper.java:124 msgid "Queued" msgstr "W kolejce" -#: ../java/src/net/i2p/router/web/JobQueueHelper.java:142 +#: ../java/src/net/i2p/router/web/JobQueueHelper.java:141 msgid "Runs" msgstr "Uruchomiony" -#: ../java/src/net/i2p/router/web/JobQueueHelper.java:143 +#: ../java/src/net/i2p/router/web/JobQueueHelper.java:142 msgid "Dropped" msgstr "" -#: ../java/src/net/i2p/router/web/JobQueueHelper.java:144 -#: ../java/src/net/i2p/router/web/JobQueueHelper.java:146 +#: ../java/src/net/i2p/router/web/JobQueueHelper.java:143 +#: ../java/src/net/i2p/router/web/JobQueueHelper.java:145 msgid "Avg" msgstr "Średia" -#: ../java/src/net/i2p/router/web/JobQueueHelper.java:145 -#: ../java/src/net/i2p/router/web/JobQueueHelper.java:147 +#: ../java/src/net/i2p/router/web/JobQueueHelper.java:144 +#: ../java/src/net/i2p/router/web/JobQueueHelper.java:146 msgid "Max" msgstr "Maksimum" -#: ../java/src/net/i2p/router/web/JobQueueHelper.java:145 -#: ../java/src/net/i2p/router/web/JobQueueHelper.java:147 +#: ../java/src/net/i2p/router/web/JobQueueHelper.java:144 +#: ../java/src/net/i2p/router/web/JobQueueHelper.java:146 msgid "Min" msgstr "Minimum" -#: ../java/src/net/i2p/router/web/JobQueueHelper.java:146 +#: ../java/src/net/i2p/router/web/JobQueueHelper.java:145 msgid "Pending" msgstr "Czeka" -#: ../java/src/net/i2p/router/web/JobQueueHelper.java:198 -#: ../java/src/net/i2p/router/web/NetDbHelper.java:14 +#: ../java/src/net/i2p/router/web/JobQueueHelper.java:197 +#: ../java/src/net/i2p/router/web/NetDbHelper.java:16 msgid "Summary" msgstr "Podsumowanie" @@ -3337,223 +3353,223 @@ msgid "No log messages" msgstr "Brak logów" #. 0 -#: ../java/src/net/i2p/router/web/NetDbHelper.java:15 +#: ../java/src/net/i2p/router/web/NetDbHelper.java:17 msgid "Local Router" msgstr "Węzeł lokalny" #. 1 -#: ../java/src/net/i2p/router/web/NetDbHelper.java:16 +#: ../java/src/net/i2p/router/web/NetDbHelper.java:18 msgid "Router Lookup" msgstr "Sprawdź węzeł" #. 2 -#: ../java/src/net/i2p/router/web/NetDbHelper.java:17 +#: ../java/src/net/i2p/router/web/NetDbHelper.java:19 msgid "All Routers" msgstr "Wszytkie węzły" #. 3 -#: ../java/src/net/i2p/router/web/NetDbHelper.java:18 +#: ../java/src/net/i2p/router/web/NetDbHelper.java:20 msgid "All Routers with Full Stats" msgstr "Wszytkie węzły z pełnymi statystykami" #. 4 #. 5 -#: ../java/src/net/i2p/router/web/NetDbHelper.java:20 +#: ../java/src/net/i2p/router/web/NetDbHelper.java:22 msgid "LeaseSets" msgstr "" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:96 -#: ../java/strings/Strings.java:68 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:105 +#: ../java/strings/Strings.java:69 msgid "Router" msgstr "Węzeł" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:96 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:112 msgid "not found in network database" msgstr "nie znaleziono w bazie danych sieci" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:139 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:156 msgid "LeaseSet" msgstr "" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:141 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:158 msgid "Local" msgstr "Lokalny" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:143 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:160 msgid "Unpublished" msgstr "Nieopublikowany" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:144 -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:159 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:161 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:176 msgid "Destination" msgstr "Miejsce przeznaczenia" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:156 -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:168 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:173 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:185 msgid "Add to local addressbook" msgstr "Dodaj do lokalnej książki adresowej" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:173 -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:200 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:190 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:217 #, java-format msgid "Expires in {0}" msgstr "Wygasa {0}" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:175 -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:202 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:192 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:219 #, java-format msgid "Expired {0} ago" msgstr "Wygasło {0} temu" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:194 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:211 #: ../java/src/net/i2p/router/web/TunnelRenderer.java:162 msgid "Gateway" msgstr "Brama" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:194 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:211 msgid "Lease" msgstr "" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:196 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:213 msgid "Tunnel" msgstr "Tunel" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:263 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:280 msgid "Not initialized" msgstr "Nie zainicjalizowany" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:313 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:330 msgid "Network Database Router Statistics" msgstr "Statystyka Sieciowej Bazy Danych Węzła" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:320 -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:334 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:337 #: ../java/src/net/i2p/router/web/NetDbRenderer.java:352 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:370 msgid "Count" msgstr "Policz" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:334 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:352 msgid "Transports" msgstr "Transporty" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:352 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:370 msgid "Country" msgstr "Kraj" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:411 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:429 msgid "Our info" msgstr "Nasze informacje" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:413 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:431 msgid "Peer info for" msgstr "Info dla uczestnika" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:415 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:433 msgid "Full entry" msgstr "Pełny wpis" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:422 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:440 #: ../java/src/net/i2p/router/web/SummaryHelper.java:152 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:726 msgid "Hidden" msgstr "Ukryte" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:422 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:440 msgid "Updated" msgstr "Uaktualnione" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:423 -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:426 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:441 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:444 #, java-format msgid "{0} ago" msgstr "{0} temu" #. shouldnt happen -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:425 -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:429 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:443 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:447 msgid "Published" msgstr "Opublikowane" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:431 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:449 msgid "Signing Key" msgstr "Klucz podpisujący" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:433 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:451 msgid "Address(es)" msgstr "Adres(y)" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:445 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:463 msgid "cost" msgstr "koszt" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:471 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:489 msgid "Hidden or starting up" msgstr "Ukryte lub uruchamia się" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:471 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:489 msgid "SSU" msgstr "SSU" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:471 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:489 msgid "SSU with introducers" msgstr "SSU z przedstawicielami" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:472 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:490 msgid "NTCP" msgstr "NTCP" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:472 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:490 msgid "NTCP and SSU" msgstr "NTCP i SSU" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:472 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:490 msgid "NTCP and SSU with introducers" msgstr "NTCP i SSU z przedstawicielami" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:473 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:491 msgid "IPv6 Only SSU, introducers" msgstr "IPv6 tylko SSU, przedstawiciele" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:473 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:491 msgid "IPv6 SSU" msgstr "IPv6 SSU" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:473 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:491 msgid "IPv6 SSU, introducers" msgstr "IPv6 SSU, przedstawiciele" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:474 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:492 msgid "IPv6 NTCP" msgstr "IPv6 NTCP" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:474 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:492 msgid "IPv6 NTCP, SSU" msgstr "IPv6 NTCP, SSU" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:474 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:492 msgid "IPv6 NTCP, SSU, introducers" msgstr "IPv6 NTCP, SSU, przedstawiciele" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:474 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:492 msgid "IPv6 Only NTCP, SSU, introducers" msgstr "IPv6 tylko NTCP, SSU, przedstawicieli" -#: ../java/src/net/i2p/router/web/NewsHelper.java:290 +#: ../java/src/net/i2p/router/web/NewsHelper.java:295 #, java-format msgid "News last updated {0} ago." msgstr "Wiadomości uaktualnione {0} temu." -#: ../java/src/net/i2p/router/web/NewsHelper.java:296 +#: ../java/src/net/i2p/router/web/NewsHelper.java:301 #, java-format msgid "News last checked {0} ago." msgstr "Wiadomości ostatnio sprawdzono {0} temu." -#: ../java/src/net/i2p/router/web/NewsHelper.java:305 +#: ../java/src/net/i2p/router/web/NewsHelper.java:310 msgid "Hide news" msgstr "Ukryj wiadomości" -#: ../java/src/net/i2p/router/web/NewsHelper.java:308 -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:642 +#: ../java/src/net/i2p/router/web/NewsHelper.java:313 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:647 msgid "Show news" msgstr "Pokaż wiadomości" @@ -3607,19 +3623,19 @@ msgid "Groups (Caps)" msgstr "Grupy" #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:89 -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:269 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:260 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:516 msgid "Speed" msgstr "Prędkość" #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:90 -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:271 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:262 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:520 msgid "Capacity" msgstr "Wydajność" #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:91 -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:273 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:264 msgid "Integration" msgstr "Integracja" @@ -3642,7 +3658,7 @@ msgid "Failing" msgstr "" #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:135 -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:406 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:411 msgid "Integrated" msgstr "Zintegrowani" @@ -3719,71 +3735,71 @@ msgstr "Godzinny Wskaźnik Niepowodzeń" msgid "1d Fail Rate" msgstr "Dniowy Wskaźnik Niepowodzeń" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:268 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:259 msgid "Thresholds" msgstr "Progi" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:270 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:261 msgid "fast peers" msgstr "szybcy uczestnicy" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:272 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:263 msgid "high capacity peers" msgstr "uczestnicy o wysokiej wydajności" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:274 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:265 msgid " well integrated peers" msgstr "uczestnicy dobrze zintegrowani" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:276 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:267 msgid "as determined by the profile organizer" msgstr "jak określono przez organizatora profilu" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:276 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:267 msgid "groups" msgstr "grupy" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:277 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:268 msgid "capabilities in the netDb, not used to determine profiles" msgstr "" #. capabilities -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:277 -#: ../java/strings/Strings.java:81 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:268 +#: ../java/strings/Strings.java:82 msgid "caps" msgstr "ograniczenia" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:278 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:269 msgid "" "peak throughput (bytes per second) over a 1 minute period that the peer has " "sustained in a single tunnel" msgstr "" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:278 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:269 msgid "speed" msgstr "szybkość" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:279 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:270 msgid "capacity" msgstr "pojemność" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:279 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:270 msgid "how many tunnels can we ask them to join in an hour?" msgstr "do ilu tuneli możemy się zwrócić z prośbą o dołączenie w ciągu godziny?" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:280 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:271 msgid "how many new peers have they told us about lately?" msgstr "o ilu nowych uczestnikach powiadomili nas ostatnio?" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:280 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:271 msgid "integration" msgstr "integracja" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:281 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:272 msgid "is the peer banned, or unreachable, or failing tunnel tests?" msgstr "czy uczestnik jest zbanowany, nieosiągalny lub nie zalicza testów tunelu?" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:281 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:272 msgid "status" msgstr "stan" @@ -3913,277 +3929,277 @@ msgstr "Wykresu częstotliwości wydarzeń" msgid "Lifetime average value" msgstr "liczba życiowej średniej" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:120 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:121 msgid "I2P Router Help & FAQ" msgstr "Pomoc węzła I2P oraz Najczęściej zadawane pytania" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:122 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:123 msgid "Help & FAQ" msgstr "Pomoc i FAQ" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:130 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:131 msgid "" "Configure startup of clients and webapps (services); manually start dormant " "services" msgstr "Konfiguruj rozruch klientów i aplikacji sieciowych (usług); ręcznie uruchom uśpione usługi" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:132 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:133 msgid "I2P Services" msgstr "Usługi I2P" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:164 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:169 msgid "Configure I2P Router" msgstr "Skonfiguruj węzeł I2P" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:166 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:171 msgid "I2P Internals" msgstr "Wnętrzności I2P" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:172 -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:479 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:177 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:484 msgid "View existing tunnels and tunnel build status" msgstr "Wyświetl istniejące tunele i status budowy tunelu" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:178 -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:365 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:183 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:370 msgid "Show all current peer connections" msgstr "Pokaż wszystkie aktualne połączenia z uczestnikami" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:184 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:189 msgid "Show recent peer performance profiles" msgstr "Pokaż ostatnie profile wydajności uczestników" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:186 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:191 msgid "Profiles" msgstr "Profile" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:190 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:195 msgid "Show list of all known I2P routers" msgstr "Pokaż listę wszystkich znanych węzłów I2P" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:192 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:197 msgid "NetDB" msgstr "NetDB" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:196 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:201 msgid "Health Report" msgstr "Raport zdrowotny" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:198 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:203 msgid "Logs" msgstr "Logi" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:209 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:214 msgid "Graph router performance" msgstr "Wykres wydajności węzła" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:211 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:216 msgid "Graphs" msgstr "Wykresy" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:216 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:221 msgid "Textual router performance statistics" msgstr "" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:228 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:233 #: ../java/src/net/i2p/router/web/SummaryHelper.java:438 msgid "Local Tunnels" msgstr "Lokalne tunele" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:230 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:235 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/i2ptunnelmgr_jsp.java:164 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/i2ptunnelmgr_jsp.java:337 msgid "Hidden Services Manager" -msgstr "Zarządzanie ukrytymi usługami" +msgstr "Zarządzaj ukrytymi usługami" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:248 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:253 msgid "General" msgstr "Ogólne" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:253 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:258 msgid "" "Your Local Identity is your unique I2P router identity, similar to an ip " "address but tailored to I2P. " msgstr "Twoja Lokalna Tożsamość jest unikalną tożsamością węzła I2P podobną do adresu IP, lecz zgodną z I2P." -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:254 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:259 msgid "Never disclose this to anyone, as it can reveal your real world ip." msgstr "Nigdy jej nikomu nie ujawniaj, gdyż może ona doprowadzić do odkrycia Twojego rzeczywistego ip." -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:256 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:261 msgid "Local Identity" msgstr "Lokalna Tożsamość" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:260 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:265 msgid "Your unique I2P router identity is" msgstr "Twoja unikatowa tożsamość węzłą I2P to" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:264 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:269 msgid "never reveal it to anyone" msgstr "nigdy nie pokazuj nikomu" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:266 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:271 msgid "show" msgstr "pokaż" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:270 -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:296 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:275 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:301 msgid "The version of the I2P software we are running" msgstr "Wersja używanego softwaru I2P" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:280 -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:306 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:285 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:311 msgid "How long we've been running for this session" msgstr "Jak długo trwa aktualna sesja" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:321 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:326 msgid "" "Help with configuring your firewall and router for optimal I2P performance" msgstr "Pomóż nam optymalizować wydajność I2P konfigurując zaporę i węzeł" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:332 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:337 msgid "See more information on the wiki" msgstr "Więcej informacji zobacz na wiki" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:334 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:339 msgid "Warning: ECDSA is not available. Update your Java or OS" msgstr "Uwaga: ECDSA niedostępne. Zaktualizuj Javę lub system operacyjny." -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:346 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:351 msgid "Configure I2P Updates" msgstr "Konfiguracja aktualizacji I2P" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:348 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:353 msgid "I2P Update" msgstr "Aktualizacja I2P" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:373 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:378 msgid "Peers we've been talking to in the last few minutes/last hour" msgstr "Uczestnicy, z którymi komunikowaliśmy się przez ostatnie parę minut/ostatnią godzinę" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:376 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:381 msgid "Active" -msgstr "Aktywne" +msgstr "Aktywni" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:385 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:390 msgid "The number of peers available for building client tunnels" msgstr "Liczba uczestników dostępnych do budowania tuneli klienta" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:388 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:393 msgid "Fast" msgstr "Szybcy" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:394 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:399 msgid "The number of peers available for building exploratory tunnels" msgstr "Liczba uczestników dostępna do budowania tuneli rozpoznawczych" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:397 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:402 msgid "High capacity" msgstr "Wysokiej przepustowości" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:403 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:408 msgid "The number of peers available for network database inquiries" msgstr "Ilość uczestników dostępnych do zapytań bazy danych sieci" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:412 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:417 msgid "The total number of peers in our network database" msgstr "Całkowita liczba uczestników w naszej sieciowej bazie danych" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:415 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:420 msgid "Known" msgstr "Znani" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:435 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:440 msgid "Configure router bandwidth allocation" msgstr "Ustaw przydzielanie przepustowości" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:437 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:442 msgid "Bandwidth in/out" -msgstr "Przepustowość przychodząca/wychodząca" +msgstr "Przepustowość przychodząca / wychodząca" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:457 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:462 msgid "Total" msgstr "Razem" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:464 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:469 msgid "Used" msgstr "Użyte" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:486 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:491 msgid "" "Used for building and testing tunnels, and communicating with floodfill " "peers" msgstr "" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:489 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:494 msgid "Exploratory" msgstr "Rozpoznawcze" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:495 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:500 msgid "Tunnels we are using to provide or access services on the network" msgstr "Używamy tuneli dla zabezpieczenia lub uzyskania dostępu do usług w sieci" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:504 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:509 msgid "" -"Tunnels we are participating in, directly contributing bandwith to the " +"Tunnels we are participating in, directly contributing bandwidth to the " "network" msgstr "" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:507 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:512 msgid "Participating" msgstr "Uczestnictwo" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:513 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:518 msgid "" "The ratio of tunnel hops we provide to tunnel hops we use - a value greater " "than 1.00 indicates a positive contribution to the network" msgstr "" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:516 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:521 msgid "Share ratio" msgstr "" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:529 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:534 msgid "What's in the router's job queue?" msgstr "Co znajduje się w kolejce zadań węzła?" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:531 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:536 msgid "Congestion" msgstr "Zatłoczenie" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:536 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:541 msgid "Indicates router performance" msgstr "Pokazuje wydajność węzła" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:539 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:544 msgid "Job lag" msgstr "Opóźnienie zadań" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:545 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:550 msgid "Indicates how quickly outbound messages to other I2P routers are sent" msgstr "Wskazuje, z jaką prędkością wysyłane są wiadomości do innych węzłów I2P" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:548 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:553 msgid "Message delay" msgstr "Opóźnienie wiadomości" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:555 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:560 msgid "Round trip time for a tunnel test" msgstr "" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:558 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:563 msgid "Tunnel lag" msgstr "Opóźnienie tunelu" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:565 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:570 msgid "Queued requests from other routers to participate in tunnels" msgstr "Zakolejkowane zapytania z innych węzłów dot. uczestnictwa w tunelach" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:568 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:573 msgid "Backlog" msgstr "" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:603 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:608 msgid "News & Updates" msgstr "Wiadomości i aktualizacje" @@ -4287,26 +4303,26 @@ msgstr "Tworzenie tuneli" msgid "shared clients" msgstr "Współdzielone klienty" -#: ../java/src/net/i2p/router/web/SummaryHelper.java:715 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:717 msgid "Click Restart to install" msgstr "Kliknij Restart by zainstalować" -#: ../java/src/net/i2p/router/web/SummaryHelper.java:717 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:719 msgid "Click Shutdown and restart to install" msgstr "Kliknij Zamknięcie i zrestartuj, by zainstalować" -#: ../java/src/net/i2p/router/web/SummaryHelper.java:718 -#: ../java/src/net/i2p/router/web/SummaryHelper.java:733 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:720 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:735 #, java-format msgid "Version {0}" msgstr "Wersja {0}" -#: ../java/src/net/i2p/router/web/SummaryHelper.java:732 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:734 msgid "Update available" msgstr "Aktualizacja jest dostępna" #. Note to translators: parameter is a version, e.g. "0.8.4" -#: ../java/src/net/i2p/router/web/SummaryHelper.java:756 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:758 #, java-format msgid "Download {0} Update" msgstr "Pobierz {0} Uaktualnień" @@ -4315,7 +4331,7 @@ msgstr "Pobierz {0} Uaktualnień" #.
is optional, to help the browser make the lines even in the button #. If the translation is shorter than the English, you should probably not #. include
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:764 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:766 #, java-format msgid "Download Signed
Development Update
{0}" msgstr "" @@ -4324,69 +4340,85 @@ msgstr "" #.
is optional, to help the browser make the lines even in the button #. If the translation is shorter than the English, you should probably not #. include
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:772 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:774 #, java-format msgid "Download Unsigned
Update {0}" msgstr "" -#: ../java/src/net/i2p/router/web/SummaryHelper.java:796 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:798 msgid "Help with firewall configuration" msgstr "Pomoc w konfiguracji zapory" -#: ../java/src/net/i2p/router/web/SummaryHelper.java:798 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:800 msgid "Check network connection and NAT/firewall" msgstr "Sprawdź połączenie sieciowe oraz NAT/zaporę" -#: ../java/src/net/i2p/router/web/SummaryHelper.java:817 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:819 msgid "Reseed" msgstr "Ponownie seeduj" -#: ../java/src/net/i2p/router/web/SummaryHelper.java:906 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:908 msgid "Order" msgstr "Kolejność" -#: ../java/src/net/i2p/router/web/SummaryHelper.java:923 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:925 msgid "Top" msgstr "Góra" -#: ../java/src/net/i2p/router/web/SummaryHelper.java:936 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:930 +msgid "Move to top" +msgstr "Przenieś na górę" + +#: ../java/src/net/i2p/router/web/SummaryHelper.java:940 +msgid "Move up" +msgstr "Przenieś w górę" + +#: ../java/src/net/i2p/router/web/SummaryHelper.java:948 msgid "Down" msgstr "W dół" -#: ../java/src/net/i2p/router/web/SummaryHelper.java:941 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:953 +msgid "Move down" +msgstr "Przenieś w dół" + +#: ../java/src/net/i2p/router/web/SummaryHelper.java:958 msgid "Bottom" msgstr "Dół" -#: ../java/src/net/i2p/router/web/SummaryHelper.java:953 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:963 +msgid "Move to bottom" +msgstr "Przenieś na dół" + +#: ../java/src/net/i2p/router/web/SummaryHelper.java:975 msgid "Select a section to add" msgstr "Wybierz sekcję, którą chcesz dodać" -#: ../java/src/net/i2p/router/web/SummaryRenderer.java:141 +#: ../java/src/net/i2p/router/web/SummaryRenderer.java:142 #, java-format msgid "events in {0}" msgstr "zdarzenia w {0}" -#: ../java/src/net/i2p/router/web/SummaryRenderer.java:143 +#: ../java/src/net/i2p/router/web/SummaryRenderer.java:144 #, java-format msgid "averaged for {0}" msgstr "uśrednione dla {0}" -#: ../java/src/net/i2p/router/web/SummaryRenderer.java:153 +#: ../java/src/net/i2p/router/web/SummaryRenderer.java:154 msgid "Events per period" msgstr "Zdarzenia przez okres czasu" -#: ../java/src/net/i2p/router/web/SummaryRenderer.java:175 -#: ../java/src/net/i2p/router/web/SummaryRenderer.java:188 +#: ../java/src/net/i2p/router/web/SummaryRenderer.java:176 +#: ../java/src/net/i2p/router/web/SummaryRenderer.java:189 msgid "avg" msgstr "średnia" -#: ../java/src/net/i2p/router/web/SummaryRenderer.java:176 -#: ../java/src/net/i2p/router/web/SummaryRenderer.java:189 +#: ../java/src/net/i2p/router/web/SummaryRenderer.java:177 +#: ../java/src/net/i2p/router/web/SummaryRenderer.java:190 msgid "max" msgstr "maksimum" -#: ../java/src/net/i2p/router/web/SummaryRenderer.java:177 -#: ../java/src/net/i2p/router/web/SummaryRenderer.java:190 +#: ../java/src/net/i2p/router/web/SummaryRenderer.java:178 +#: ../java/src/net/i2p/router/web/SummaryRenderer.java:191 msgid "now" msgstr "teraz" @@ -4563,175 +4595,127 @@ msgid "Open Router Console in web browser at startup" msgstr "Przy uruchamianiu węzła otwieraj konsolę w przeglądarce internetowej" #: ../java/strings/Strings.java:37 +msgid "shared clients (DSA)" +msgstr "" + +#: ../java/strings/Strings.java:38 msgid "IRC proxy" msgstr "proxy IRC" -#: ../java/strings/Strings.java:38 +#: ../java/strings/Strings.java:39 msgid "eepsite" msgstr "eepsite" -#: ../java/strings/Strings.java:39 +#: ../java/strings/Strings.java:40 msgid "I2P webserver" msgstr "Serwer internetowy I2P" -#: ../java/strings/Strings.java:40 +#: ../java/strings/Strings.java:41 msgid "HTTP Proxy" msgstr "HTTP Proxy" #. older names for pre-0.7.4 installs -#: ../java/strings/Strings.java:42 +#: ../java/strings/Strings.java:43 msgid "eepProxy" msgstr "eepProxy" -#: ../java/strings/Strings.java:43 +#: ../java/strings/Strings.java:44 msgid "ircProxy" msgstr "ircProxy" #. hardcoded in i2psnark -#: ../java/strings/Strings.java:45 +#: ../java/strings/Strings.java:46 msgid "I2PSnark" msgstr "I2PSnark" #. hardcoded in iMule? -#: ../java/strings/Strings.java:47 +#: ../java/strings/Strings.java:48 msgid "iMule" msgstr "iMule" #. standard themes for ConfigUIHelper -#: ../java/strings/Strings.java:51 +#: ../java/strings/Strings.java:52 msgid "classic" msgstr "klasyczny" -#: ../java/strings/Strings.java:52 +#: ../java/strings/Strings.java:53 msgid "dark" msgstr "ciemny" -#: ../java/strings/Strings.java:53 +#: ../java/strings/Strings.java:54 msgid "light" msgstr "jasny" -#: ../java/strings/Strings.java:54 +#: ../java/strings/Strings.java:55 msgid "midnight" msgstr "północ" -#: ../java/strings/Strings.java:58 +#: ../java/strings/Strings.java:59 msgid "BandwidthLimiter" msgstr "OgraniczeniePrzepustowości" -#: ../java/strings/Strings.java:59 +#: ../java/strings/Strings.java:60 msgid "ClientMessages" msgstr "WiadomościKlienta" -#: ../java/strings/Strings.java:60 +#: ../java/strings/Strings.java:61 msgid "Encryption" msgstr "Szyfrowanie" -#: ../java/strings/Strings.java:61 +#: ../java/strings/Strings.java:62 msgid "i2cp" msgstr "i2cp" -#: ../java/strings/Strings.java:62 +#: ../java/strings/Strings.java:63 msgid "I2PTunnel" msgstr "Tunel I2P" -#: ../java/strings/Strings.java:63 +#: ../java/strings/Strings.java:64 msgid "InNetPool" msgstr "" -#: ../java/strings/Strings.java:64 +#: ../java/strings/Strings.java:65 msgid "JobQueue" msgstr "KolejkaZadań" -#: ../java/strings/Strings.java:65 +#: ../java/strings/Strings.java:66 msgid "NetworkDatabase" msgstr "SieciowaBazaDanych " -#: ../java/strings/Strings.java:66 +#: ../java/strings/Strings.java:67 msgid "ntcp" msgstr "ntcp" -#: ../java/strings/Strings.java:69 +#: ../java/strings/Strings.java:70 msgid "Stream" msgstr "Strumień" -#: ../java/strings/Strings.java:70 +#: ../java/strings/Strings.java:71 msgid "Throttle" msgstr "" -#: ../java/strings/Strings.java:71 +#: ../java/strings/Strings.java:72 msgid "Transport" msgstr "Transport" -#: ../java/strings/Strings.java:73 +#: ../java/strings/Strings.java:74 msgid "udp" msgstr "udp" #. parameters in transport addresses (netdb.jsp) #. may or may not be worth translating -#: ../java/strings/Strings.java:77 +#: ../java/strings/Strings.java:78 msgid "host" msgstr "host" -#: ../java/strings/Strings.java:78 +#: ../java/strings/Strings.java:79 msgid "key" msgstr "klucz" -#: ../java/strings/Strings.java:79 +#: ../java/strings/Strings.java:80 msgid "port" msgstr "port" -#. introducer host -#: ../java/strings/Strings.java:83 -msgid "ihost0" -msgstr "ihost0" - -#: ../java/strings/Strings.java:84 -msgid "ihost1" -msgstr "ihost1" - -#: ../java/strings/Strings.java:85 -msgid "ihost2" -msgstr "ihost2" - -#. introducer port -#: ../java/strings/Strings.java:87 -msgid "iport0" -msgstr "iport0" - -#: ../java/strings/Strings.java:88 -msgid "iport1" -msgstr "iport1" - -#: ../java/strings/Strings.java:89 -msgid "iport2" -msgstr "iport2" - -#. introducer key -#: ../java/strings/Strings.java:91 -msgid "ikey0" -msgstr "ikey0" - -#: ../java/strings/Strings.java:92 -msgid "ikey1" -msgstr "ikey1" - -#: ../java/strings/Strings.java:93 -msgid "ikey2" -msgstr "ikey2" - -#. introducer tag -#: ../java/strings/Strings.java:95 -msgid "itag0" -msgstr "itag0" - -#: ../java/strings/Strings.java:96 -msgid "itag1" -msgstr "itag1" - -#: ../java/strings/Strings.java:97 -msgid "itag2" -msgstr "itag2" - #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:148 msgid "configure bandwidth" msgstr "konfiguruj przepustowość" @@ -4900,7 +4884,7 @@ msgid "Share" msgstr "Udostępnij" #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:479 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:481 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:493 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:475 msgid "NOTE" msgstr "UWAGA" @@ -4941,7 +4925,7 @@ msgid "Advanced network configuration page" msgstr "Strona zaawansowanych ustawień sieciowych" #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:497 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:477 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:489 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:498 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:574 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:590 @@ -4980,27 +4964,35 @@ msgid "" "computer's resources." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:445 -msgid "Automatic" +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:442 +msgid "This router is currently a floodfill participant." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:451 -msgid "Force On" +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:446 +msgid "This router is not currently a floodfill participant." msgstr "" #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:457 -msgid "Disable" +msgid "Automatic" +msgstr "Automatycznie" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:463 +msgid "Force On" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:461 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:469 +msgid "Disable" +msgstr "Wyłącz" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:473 msgid "Advanced I2P Configuration" msgstr "Zaawansowana konfiguracja I2P" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:483 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:495 msgid "Some changes may require a restart to take effect." msgstr "Niektóre zmiany mogą wymagać restartu, aby zmiany były widoczne." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:486 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:498 #, java-format msgid "To make changes, edit the file {0}." msgstr "By poczynić zmiany, edytuj plik {0}." @@ -5126,7 +5118,7 @@ msgstr "Wtyczki podane poniżej są uruchamiane przez klienta webConsole." #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:616 msgid "Plugin Installation from URL" -msgstr "" +msgstr "Zainstaluj wtyczkę z adresu www" #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:618 #, java-format @@ -5139,19 +5131,19 @@ msgstr "Aby zainstalować wtyczkę, proszę wprowadzić adres URL:" #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:631 msgid "Plugin Installation from File" -msgstr "" +msgstr "Zainstaluj wtyczkę z pliku" #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:635 msgid "Install plugin from file." -msgstr "" +msgstr "Zainstaluj wtyczkę z pliku" #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:637 msgid "Select xpi2p or su3 file" -msgstr "" +msgstr "Wypierz plik xpi2p lub su3" #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:646 msgid "Update All Plugins" -msgstr "" +msgstr "Aktualizuj wszystkie wtyczki" #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confighome_jsp.java:150 msgid "config home" @@ -5369,7 +5361,7 @@ msgstr "Eksperymentalny" #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:532 msgid "IPv4 Configuration" -msgstr "" +msgstr "Ustawienia IPv4" #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:536 msgid "Disable inbound (Firewalled by Carrier-grade NAT or DS-Lite)" @@ -5684,7 +5676,7 @@ msgstr "" #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:744 msgid "WARN - Firewalled with Inbound TCP Enabled" -msgstr "" +msgstr "OSTRZEŻENIE - Włączona zapora akceptująca przychodzące pakiety TCP" #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:746 msgid "" @@ -5903,7 +5895,7 @@ msgstr "FAQ" #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:483 msgid "Manual Reseed from URL" -msgstr "" +msgstr "Ręczne seedowanie z adresu URL" #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:485 msgid "Enter zip or su3 URL" @@ -5925,11 +5917,11 @@ msgstr "" #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:495 msgid "Manual Reseed from File" -msgstr "" +msgstr "Ręczne seedowanie z pliku" #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:497 msgid "Select zip or su3 file" -msgstr "" +msgstr "Wybierz plik zip lub su3" #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:505 msgid "Create Reseed File" diff --git a/apps/routerconsole/locale/messages_ru.po b/apps/routerconsole/locale/messages_ru.po index ba45d3cbc..1ec786502 100644 --- a/apps/routerconsole/locale/messages_ru.po +++ b/apps/routerconsole/locale/messages_ru.po @@ -7,37 +7,40 @@ # Aleksey Orekhov , 2013 # Alexey Solomin , 2013 # Andrey Lukyanenko , 2013 +# brianhopes , 2015 # dimi , 2013 # ducki2p , 2011 # Eugene, 2013 # Eugene, 2013 # foo , 2009 +# Foster Snowhill, 2015 # gmind, 2012-2013 # gmind, 2013 # gmind, 2012 # Aleksey Orekhov , 2013 # dimi , 2013 # Maxym Mykhalchuk, 2015 +# Maxym Mykhalchuk, 2015 # Nikolay Parukhin , 2014 # Petr Polyakov, 2014 # Petr Polyakov, 2014 # rineri, 2014 -# Roman A. , 2013 -# Roman A. , 2013 +# Foster Snowhill, 2013 +# Foster Snowhill, 2013 # varnav, 2013 # brianhopes , 2015 -# Roman A. , 2013 +# Foster Snowhill, 2013 # yume, 2014-2015 # Andrey Lukyanenko , 2013 -# Roman A. , 2013 +# Foster Snowhill, 2013 msgid "" msgstr "" "Project-Id-Version: I2P\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-05-14 08:33+0000\n" -"PO-Revision-Date: 2015-05-15 14:49+0000\n" -"Last-Translator: Maxym Mykhalchuk\n" -"Language-Team: Russian (Russia) (http://www.transifex.com/projects/p/I2P/language/ru_RU/)\n" +"POT-Creation-Date: 2015-07-17 01:05+0000\n" +"PO-Revision-Date: 2015-07-22 18:26+0000\n" +"Last-Translator: Foster Snowhill\n" +"Language-Team: Russian (Russia) (http://www.transifex.com/otf/I2P/language/ru_RU/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -55,8 +58,8 @@ msgstr "" #. locale. #. If you want the digit separator in your locale, translate as {0}. #. alternates: msec, msecs -#: ../../../core/java/src/net/i2p/data/DataHelper.java:1527 -#: ../../../core/java/src/net/i2p/data/DataHelper.java:1577 +#: ../../../core/java/src/net/i2p/data/DataHelper.java:1529 +#: ../../../core/java/src/net/i2p/data/DataHelper.java:1582 #, java-format msgid "1 ms" msgid_plural "{0,number,####} ms" @@ -67,8 +70,8 @@ msgstr[3] "{0,number,####} мс" #. seconds #. alternates: secs, sec. 'seconds' is probably too long. -#: ../../../core/java/src/net/i2p/data/DataHelper.java:1531 -#: ../../../core/java/src/net/i2p/data/DataHelper.java:1579 +#: ../../../core/java/src/net/i2p/data/DataHelper.java:1533 +#: ../../../core/java/src/net/i2p/data/DataHelper.java:1584 #, java-format msgid "1 sec" msgid_plural "{0} sec" @@ -79,8 +82,8 @@ msgstr[3] "{0} с" #. minutes #. alternates: mins, min. 'minutes' is probably too long. -#: ../../../core/java/src/net/i2p/data/DataHelper.java:1535 -#: ../../../core/java/src/net/i2p/data/DataHelper.java:1581 +#: ../../../core/java/src/net/i2p/data/DataHelper.java:1537 +#: ../../../core/java/src/net/i2p/data/DataHelper.java:1586 #, java-format msgid "1 min" msgid_plural "{0} min" @@ -91,8 +94,8 @@ msgstr[3] "{0} мин." #. hours #. alternates: hrs, hr., hrs. -#: ../../../core/java/src/net/i2p/data/DataHelper.java:1539 -#: ../../../core/java/src/net/i2p/data/DataHelper.java:1583 +#: ../../../core/java/src/net/i2p/data/DataHelper.java:1541 +#: ../../../core/java/src/net/i2p/data/DataHelper.java:1588 #, java-format msgid "1 hour" msgid_plural "{0} hours" @@ -101,15 +104,9 @@ msgstr[1] "{0} часа" msgstr[2] "{0} часов" msgstr[3] "{0} часов" -#: ../../../core/java/src/net/i2p/data/DataHelper.java:1541 -#: ../../../core/java/src/net/i2p/data/DataHelper.java:1585 -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:343 -msgid "n/a" -msgstr "н/д" - #. days #: ../../../core/java/src/net/i2p/data/DataHelper.java:1544 -#: ../../../core/java/src/net/i2p/data/DataHelper.java:1587 +#: ../../../core/java/src/net/i2p/data/DataHelper.java:1591 #, java-format msgid "1 day" msgid_plural "{0} days" @@ -118,7 +115,24 @@ msgstr[1] "{0} дня" msgstr[2] "{0} дней" msgstr[3] "{0} дней" -#: ../../../core/java/src/net/i2p/data/DataHelper.java:1573 +#. years +#: ../../../core/java/src/net/i2p/data/DataHelper.java:1547 +#: ../../../core/java/src/net/i2p/data/DataHelper.java:1594 +#, java-format +msgid "1 year" +msgid_plural "{0} years" +msgstr[0] "{0} год" +msgstr[1] "{0} года" +msgstr[2] "{0} лет" +msgstr[3] "{0} лет" + +#: ../../../core/java/src/net/i2p/data/DataHelper.java:1549 +#: ../../../core/java/src/net/i2p/data/DataHelper.java:1596 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:334 +msgid "n/a" +msgstr "н/д" + +#: ../../../core/java/src/net/i2p/data/DataHelper.java:1578 #, java-format msgid "1 ns" msgid_plural "{0,number,###} ns" @@ -127,7 +141,7 @@ msgstr[1] "{0,number,###} нс" msgstr[2] "{0,number,###} нс" msgstr[3] "{0,number,###} нс" -#: ../../../core/java/src/net/i2p/data/DataHelper.java:1575 +#: ../../../core/java/src/net/i2p/data/DataHelper.java:1580 #, java-format msgid "1 μs" msgid_plural "{0,number,###} μs" @@ -172,7 +186,7 @@ msgstr "Кому" #: ../../../router/java/src/net/i2p/router/Blocklist.java:997 #: ../java/src/net/i2p/router/web/BanlistRenderer.java:48 -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:647 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:652 #: ../java/src/net/i2p/router/web/SummaryHelper.java:478 msgid "none" msgstr "нет" @@ -311,17 +325,17 @@ msgstr "Не принимаем туннели: маршрутизатор в п msgid "Rejecting tunnels" msgstr "Не принимаем туннели" -#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:210 +#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:212 #, java-format msgid "Reseeding: got router info from file ({0} successful, {1} errors)." msgstr "Начальная загрузка: получены данные маршрутизатора из файла ({0} успешно, {1} с ошибкой)." -#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:282 +#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:284 #: ../java/src/net/i2p/router/web/ConfigNavHelper.java:28 msgid "Reseeding" msgstr "Начальная загрузка" -#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:305 +#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:307 #, java-format msgid "Reseed fetched only 1 router." msgid_plural "Reseed fetched only {0} routers." @@ -330,26 +344,26 @@ msgstr[1] "При начальной загрузке получены данн msgstr[2] "При начальной загрузке получены данные только о {0} маршрутизаторах." msgstr[3] "При начальной загрузке получены данные только о {0} маршрутизаторах." -#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:314 +#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:316 msgid "Reseed failed." msgstr "Начальная загрузка не удалась." -#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:315 +#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:317 #, java-format msgid "See {0} for help." msgstr "Смотрите {0} для получения помощи." -#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:316 +#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:318 msgid "reseed configuration page" msgstr "страница настройки начальной загрузки" -#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:564 -#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:695 +#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:566 +#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:697 msgid "Reseeding: fetching seed URL." msgstr "Производится начальная загрузка: загружается URL каталога маршрутизаторов." -#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:621 -#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:731 +#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:623 +#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:733 #, java-format msgid "" "Reseeding: fetching router info from seed URL ({0} successful, {1} errors)." @@ -419,7 +433,7 @@ msgstr "Недоступен по всем транспортным проток #: ../../../router/java/src/net/i2p/router/transport/UPnP.java:603 #: ../../../router/java/src/net/i2p/router/transport/UPnP.java:621 #: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:1348 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2452 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2469 #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:92 msgid "Status" msgstr "Состояние" @@ -434,7 +448,7 @@ msgid "{0} is used for outbound connections only" msgstr "{0} используется только для исходящих соединений" #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:711 -#: ../../../router/java/src/net/i2p/router/transport/UPnPManager.java:278 +#: ../../../router/java/src/net/i2p/router/transport/UPnPManager.java:283 msgid "UPnP is not enabled" msgstr "UPnP не включен" @@ -457,13 +471,13 @@ msgid "" msgstr "Для переопределения этих пределов добавьте параметры i2np.ntcp.maxConnections=nnn и i2np.udp.maxConnections=nnn на странице расширенных настроек." #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:725 -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:275 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:266 msgid "Definitions" msgstr "Обозначения" #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:726 #: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:1352 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2456 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2473 #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:24 #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:33 #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:35 @@ -478,7 +492,7 @@ msgstr "Удаленный узел, идентифицируемый хешем #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:727 #: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:1353 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2460 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2477 msgid "Dir" msgstr "Направление" @@ -505,13 +519,13 @@ msgstr "Сколько прошло времени после приема/пе #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:735 #: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:1355 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2462 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2479 msgid "Idle" msgstr "Неактивен" #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:736 #: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:1356 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2467 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2484 #: ../java/src/net/i2p/router/web/TunnelRenderer.java:162 msgid "In/Out" msgstr "Прием/передача" @@ -526,14 +540,14 @@ msgstr "Время жизни соединения" #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:737 #: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:1357 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2472 -#: ../java/src/net/i2p/router/web/SummaryHelper.java:928 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2489 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:935 msgid "Up" msgstr "Подключен" #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:738 #: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:1358 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2474 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2491 msgid "Skew" msgstr "Сдвиг" @@ -582,7 +596,7 @@ msgstr "Maximum Transfer Unit. Текущий максимальный р #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:748 #: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:1359 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2491 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2508 msgid "TX" msgstr "Передано" @@ -592,7 +606,7 @@ msgstr "Общее количество отправленных узлу пак #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:749 #: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:1360 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2493 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2510 msgid "RX" msgstr "Принято" @@ -601,7 +615,7 @@ msgid "The total number of packets received from the peer" msgstr "Общее количество принятых от узла пакетов" #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:750 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2496 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2513 msgid "Dup TX" msgstr "Повт. отправлено" @@ -610,7 +624,7 @@ msgid "The total number of packets retransmitted to the peer" msgstr "Общее количество повторно отправленных узлу пакетов" #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:751 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2498 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2515 msgid "Dup RX" msgstr "Повт. принято" @@ -649,8 +663,8 @@ msgstr "PPP WAN-соединение" #: ../../../router/java/src/net/i2p/router/transport/UPnP.java:583 #: ../../../router/java/src/net/i2p/router/transport/UPnP.java:610 -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:283 -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:309 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:288 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:314 msgid "Uptime" msgstr "Время работы" @@ -745,17 +759,17 @@ msgid "NTCP connections" msgstr "NTCP-соединения" #: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:1345 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2449 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2466 msgid "Limit" msgstr "Предел" #: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:1346 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2450 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2467 msgid "Timeout" msgstr "Тайм-аут" #: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:1354 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2461 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2478 msgid "IPv6" msgstr "IPv6" @@ -768,19 +782,19 @@ msgid "Backlogged?" msgstr "В очереди?" #: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:1375 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2515 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2532 #: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:91 msgid "Inbound" msgstr "Входящие" #: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:1377 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2517 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2534 #: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:91 msgid "Outbound" msgstr "Исходящие" #: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:1432 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2682 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2699 #, java-format msgid "{0} peer" msgid_plural "{0} peers" @@ -789,107 +803,107 @@ msgstr[1] "{0} пира" msgstr[2] "{0} пиров" msgstr[3] "{0} пиров" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2448 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2465 msgid "UDP connections" msgstr "UDP-соединения" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2458 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2475 msgid "Sort by peer hash" msgstr "Сортировать по хешу узла" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2460 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2477 msgid "Direction/Introduction" msgstr "Направление/посредничество" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2463 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2480 msgid "Sort by idle inbound" msgstr "Сортировать по неактивности приема" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2465 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2482 msgid "Sort by idle outbound" msgstr "Сортировать по неактивности передачи" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2468 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2485 msgid "Sort by inbound rate" msgstr "Сортировать по скорости приема" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2470 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2487 msgid "Sort by outbound rate" msgstr "Сортировать по скорости передачи" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2473 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2490 msgid "Sort by connection uptime" msgstr "Сортировать по времени жизни соединения" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2475 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2492 msgid "Sort by clock skew" msgstr "Сортировать по сдвигу часов" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2478 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2495 msgid "Sort by congestion window" msgstr "Сортировать по размеру окна перегрузки" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2480 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2497 msgid "Sort by slow start threshold" msgstr "Сортировать по порогу медленного старта" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2483 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2500 msgid "Sort by round trip time" msgstr "Сортировать по времени прохождения сигнала" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2487 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2504 msgid "Sort by retransmission timeout" msgstr "Сортировать по тайм-ауту повторной передачи" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2490 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2507 msgid "Sort by outbound maximum transmit unit" msgstr "Сортировать по размеру исходящего MTU" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2492 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2509 msgid "Sort by packets sent" msgstr "Сортировать по количеству отправленных пакетов" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2494 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2511 msgid "Sort by packets received" msgstr "Сортировать по количеству принятых пакетов" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2497 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2514 msgid "Sort by packets retransmitted" msgstr "Сортировать по количеству повторно отправленных пакетов" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2499 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2516 msgid "Sort by packets received more than once" msgstr "Сортировать по количеству повторно принятых пакетов" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2519 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2536 msgid "We offered to introduce them" msgstr "Мы предлагаем себя в качестве посредника для этого узла" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2521 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2538 msgid "They offered to introduce us" msgstr "Этот узел предлагает себя в качестве нашего посредника" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2525 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2542 msgid "Choked" msgstr "Дросселирован" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2533 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2550 msgid "1 fail" msgstr "1 сбой" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2535 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2552 #, java-format msgid "{0} fails" msgstr "{0} сбоя(-ев)" #. 1 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2541 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2558 #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:166 #: ../java/src/net/i2p/router/web/ProfilesHelper.java:13 msgid "Banned" msgstr "Заблокирован" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2600 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2617 msgid "backlogged" msgstr "перегружен" @@ -927,66 +941,66 @@ msgstr "Игнорируем запросы туннелей: высокая н msgid "Dropping tunnel requests: Queue time" msgstr "Игнорируем запросы туннелей: слишком большое время пребывания в очереди" -#: ../java/src/net/i2p/router/update/ConsoleUpdateManager.java:858 +#: ../java/src/net/i2p/router/update/ConsoleUpdateManager.java:884 #, java-format msgid "New plugin version {0} is available" msgstr "Доступна новая версия {0}" -#: ../java/src/net/i2p/router/update/ConsoleUpdateManager.java:938 +#: ../java/src/net/i2p/router/update/ConsoleUpdateManager.java:964 #, java-format msgid "Update check failed for plugin {0}" msgstr "Ошибка при проверке наличия обновлений для модуля {0}" -#: ../java/src/net/i2p/router/update/ConsoleUpdateManager.java:942 +#: ../java/src/net/i2p/router/update/ConsoleUpdateManager.java:968 #, java-format msgid "No new version is available for plugin {0}" msgstr "Для модуля {0} нет обновлений" -#: ../java/src/net/i2p/router/update/ConsoleUpdateManager.java:966 +#: ../java/src/net/i2p/router/update/ConsoleUpdateManager.java:992 #, java-format msgid "{0}B transferred" msgstr "{0} байт загружено" -#: ../java/src/net/i2p/router/update/ConsoleUpdateManager.java:1025 +#: ../java/src/net/i2p/router/update/ConsoleUpdateManager.java:1051 #, java-format msgid "Install failed from {0}" msgstr "Не удалось установить из {0}" -#: ../java/src/net/i2p/router/update/ConsoleUpdateManager.java:1027 +#: ../java/src/net/i2p/router/update/ConsoleUpdateManager.java:1053 #: ../java/src/net/i2p/router/update/UpdateRunner.java:298 #, java-format msgid "Transfer failed from {0}" msgstr "Не удалось произвести передачу файлов из {0}" -#: ../java/src/net/i2p/router/update/ConsoleUpdateManager.java:1302 -#: ../java/src/net/i2p/router/update/ConsoleUpdateManager.java:1366 -#: ../java/src/net/i2p/router/update/ConsoleUpdateManager.java:1390 -#: ../java/src/net/i2p/router/web/SummaryHelper.java:713 +#: ../java/src/net/i2p/router/update/ConsoleUpdateManager.java:1328 +#: ../java/src/net/i2p/router/update/ConsoleUpdateManager.java:1392 +#: ../java/src/net/i2p/router/update/ConsoleUpdateManager.java:1416 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:715 msgid "Update downloaded" msgstr "Обновление загружено" -#: ../java/src/net/i2p/router/update/ConsoleUpdateManager.java:1346 -#: ../java/src/net/i2p/router/update/ConsoleUpdateManager.java:1390 +#: ../java/src/net/i2p/router/update/ConsoleUpdateManager.java:1372 +#: ../java/src/net/i2p/router/update/ConsoleUpdateManager.java:1416 msgid "Restarting" msgstr "Производится перезапуск" -#: ../java/src/net/i2p/router/update/ConsoleUpdateManager.java:1346 +#: ../java/src/net/i2p/router/update/ConsoleUpdateManager.java:1372 msgid "Update verified" msgstr "Подлинность обновления проверена" -#: ../java/src/net/i2p/router/update/ConsoleUpdateManager.java:1355 +#: ../java/src/net/i2p/router/update/ConsoleUpdateManager.java:1381 #: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:189 #: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:306 #, java-format msgid "from {0}" msgstr "из {0}" -#: ../java/src/net/i2p/router/update/ConsoleUpdateManager.java:1370 +#: ../java/src/net/i2p/router/update/ConsoleUpdateManager.java:1396 #, java-format msgid "Unsigned update file from {0} is corrupt" msgstr "Обнаружено повреждение в неподписанном обновлении, загруженном из {0}" -#: ../java/src/net/i2p/router/update/ConsoleUpdateManager.java:1399 +#: ../java/src/net/i2p/router/update/ConsoleUpdateManager.java:1425 #, java-format msgid "Failed copy to {0}" msgstr "Не удалось скопировать в {0}" @@ -999,7 +1013,7 @@ msgstr "Не удалось скопировать в {0}" #: ../java/src/net/i2p/router/update/UnsignedUpdateRunner.java:41 #: ../java/src/net/i2p/router/update/UpdateRunner.java:155 #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:573 -#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:175 +#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:177 #: ../java/src/net/i2p/router/web/PluginStarter.java:157 msgid "HTTP client proxy tunnel must be running" msgstr "Клиентский прокси туннель должен быть запущен" @@ -1013,20 +1027,20 @@ msgstr "Клиентский прокси туннель должен быть msgid "Updating" msgstr "Загружается обновление" -#: ../java/src/net/i2p/router/update/NewsFetcher.java:172 +#: ../java/src/net/i2p/router/update/NewsFetcher.java:209 msgid "In-network updates disabled. Check package manager." msgstr "Внутрисетевые обновления отключены. Проверьте менеджер пакетов." -#: ../java/src/net/i2p/router/update/NewsFetcher.java:178 +#: ../java/src/net/i2p/router/update/NewsFetcher.java:215 msgid "No write permission for I2P install directory." msgstr "Отсутствует разрешение на запись в директорию установки I2P." -#: ../java/src/net/i2p/router/update/NewsFetcher.java:186 +#: ../java/src/net/i2p/router/update/NewsFetcher.java:223 #, java-format msgid "You must first update to version {0}" msgstr "Сначала вы должны обновить до версии {0}" -#: ../java/src/net/i2p/router/update/NewsFetcher.java:196 +#: ../java/src/net/i2p/router/update/NewsFetcher.java:233 #, java-format msgid "Requires Java version {0} but installed Java version is {1}" msgstr "Требуется Java версии {0} но установлена Java версии {1}" @@ -1216,16 +1230,20 @@ msgid "No new version found at {0}" msgstr "Новая версия не обнаружена на {0}" #: ../java/src/net/i2p/router/web/BanlistRenderer.java:65 +msgid "Permanently banned" +msgstr "Заблокирован навсегда" + +#: ../java/src/net/i2p/router/web/BanlistRenderer.java:67 #, java-format msgid "Temporary ban expiring in {0}" msgstr "Временная блокировка истекает через {0}" -#: ../java/src/net/i2p/router/web/BanlistRenderer.java:67 +#: ../java/src/net/i2p/router/web/BanlistRenderer.java:69 #, java-format msgid "Banned until restart or in {0}" msgstr "Заблокирован до перезапуска или истечения {0}" -#: ../java/src/net/i2p/router/web/BanlistRenderer.java:79 +#: ../java/src/net/i2p/router/web/BanlistRenderer.java:82 msgid "unban now" msgstr "разблокировать сейчас" @@ -1326,18 +1344,18 @@ msgstr "разблокировать сейчас" msgid "I2P Router Console" msgstr "Консоль маршрутизатора I2P" -#: ../java/src/net/i2p/router/web/ConfigAdvancedHandler.java:61 +#: ../java/src/net/i2p/router/web/ConfigAdvancedHandler.java:62 msgid "Error updating the configuration - please see the error logs" msgstr "Ошибка обновления конфигурации — смотрите журналы ошибок" -#: ../java/src/net/i2p/router/web/ConfigAdvancedHandler.java:71 -#: ../java/src/net/i2p/router/web/ConfigAdvancedHandler.java:87 +#: ../java/src/net/i2p/router/web/ConfigAdvancedHandler.java:72 +#: ../java/src/net/i2p/router/web/ConfigAdvancedHandler.java:96 #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:389 msgid "Configuration saved successfully" msgstr "Конфигурация успешно сохранена" -#: ../java/src/net/i2p/router/web/ConfigAdvancedHandler.java:73 -#: ../java/src/net/i2p/router/web/ConfigAdvancedHandler.java:89 +#: ../java/src/net/i2p/router/web/ConfigAdvancedHandler.java:74 +#: ../java/src/net/i2p/router/web/ConfigAdvancedHandler.java:98 #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:622 #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:391 #: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:151 @@ -1545,7 +1563,7 @@ msgid "Add Client" msgstr "Добавить клиент" #: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:116 -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:498 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:503 #: ../java/src/net/i2p/router/web/SummaryHelper.java:452 msgid "Client" msgstr "Клиентские" @@ -1577,9 +1595,9 @@ msgid "Plugin" msgstr "Модуль" #: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:248 -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:320 -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:273 -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:299 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:337 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:278 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:304 msgid "Version" msgstr "Версия" @@ -1601,7 +1619,8 @@ msgstr "Лицензия" #: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:294 #: ../java/src/net/i2p/router/web/HomeHelper.java:37 -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:152 +#: ../java/src/net/i2p/router/web/HomeHelper.java:171 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:157 msgid "Website" msgstr "Веб-сайт" @@ -1614,7 +1633,7 @@ msgid "Stop" msgstr "Остановить" #: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:362 -#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:158 +#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:160 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:463 msgid "Check for updates" msgstr "Проверить наличие обновлений" @@ -1636,7 +1655,7 @@ msgstr "Удалить" #: ../java/src/net/i2p/router/web/ConfigHomeHandler.java:21 #: ../java/src/net/i2p/router/web/ConfigSummaryHandler.java:22 #: ../java/src/net/i2p/router/web/ConfigUIHandler.java:19 -#: ../java/src/net/i2p/router/web/SummaryHelper.java:948 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:970 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confighome_jsp.java:496 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confighome_jsp.java:516 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confighome_jsp.java:532 @@ -1646,7 +1665,7 @@ msgstr "Удалить выбранные" #: ../java/src/net/i2p/router/web/ConfigHomeHandler.java:22 #: ../java/src/net/i2p/router/web/ConfigSummaryHandler.java:23 -#: ../java/src/net/i2p/router/web/SummaryHelper.java:967 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:989 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confighome_jsp.java:494 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confighome_jsp.java:502 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confighome_jsp.java:514 @@ -1665,7 +1684,7 @@ msgstr "Восстановить умолчания" #: ../java/src/net/i2p/router/web/ConfigHomeHandler.java:24 #: ../java/src/net/i2p/router/web/ConfigSummaryHandler.java:26 -#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:200 +#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:202 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confighome_jsp.java:482 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configsidebar_jsp.java:486 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:542 @@ -1794,8 +1813,8 @@ msgstr "WARN" #: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:85 #: ../java/src/net/i2p/router/web/ConfigUIHelper.java:170 -#: ../java/src/net/i2p/router/web/HomeHelper.java:199 -#: ../java/src/net/i2p/router/web/SummaryHelper.java:902 +#: ../java/src/net/i2p/router/web/HomeHelper.java:208 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:904 msgid "Remove" msgstr "Удалить" @@ -1805,7 +1824,7 @@ msgstr "Выберите класс для добавления" #. stat groups for stats.jsp #: ../java/src/net/i2p/router/web/ConfigNavHelper.java:25 -#: ../java/strings/Strings.java:57 +#: ../java/strings/Strings.java:58 msgid "Bandwidth" msgstr "Трафик" @@ -1814,7 +1833,7 @@ msgid "Home Page" msgstr "Домашняя страница" #: ../java/src/net/i2p/router/web/ConfigNavHelper.java:25 -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:323 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:328 msgid "Network" msgstr "Сеть" @@ -1870,9 +1889,9 @@ msgid "UI" msgstr "Интерфейс" #: ../java/src/net/i2p/router/web/ConfigNavHelper.java:26 -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:174 -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:481 -#: ../java/strings/Strings.java:72 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:179 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:486 +#: ../java/strings/Strings.java:73 msgid "Tunnels" msgstr "Туннели" @@ -1890,15 +1909,15 @@ msgid "Logging" msgstr "Журналирование" #: ../java/src/net/i2p/router/web/ConfigNavHelper.java:27 -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:180 -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:367 -#: ../java/strings/Strings.java:67 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:185 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:372 +#: ../java/strings/Strings.java:68 msgid "Peers" msgstr "Узлы" #: ../java/src/net/i2p/router/web/ConfigNavHelper.java:27 -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:455 -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:218 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:473 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:223 msgid "Stats" msgstr "Статистика" @@ -1910,8 +1929,8 @@ msgstr "Расширенные" #: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:97 #: ../java/src/net/i2p/router/web/ConfigTunnelsHandler.java:30 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:499 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:459 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:479 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:471 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:491 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:479 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:641 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:591 @@ -2174,7 +2193,7 @@ msgstr "Перезапустить немедленно" #. ctx.router().shutdown(Router.EXIT_HARD_RESTART); // never returns #. give the UI time to respond #: ../java/src/net/i2p/router/web/ConfigRestartBean.java:47 -#: ../java/src/net/i2p/router/web/SummaryRenderer.java:200 +#: ../java/src/net/i2p/router/web/SummaryRenderer.java:201 msgid "Restart" msgstr "Перезапуск" @@ -2651,8 +2670,8 @@ msgid "User Name" msgstr "Имя пользователя" #: ../java/src/net/i2p/router/web/ConfigUIHelper.java:183 -#: ../java/src/net/i2p/router/web/HomeHelper.java:226 -#: ../java/src/net/i2p/router/web/SummaryHelper.java:950 +#: ../java/src/net/i2p/router/web/HomeHelper.java:235 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:972 msgid "Add" msgstr "Добавить" @@ -2661,91 +2680,91 @@ msgstr "Добавить" msgid "Password" msgstr "Пароль" -#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:165 +#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:167 msgid "Update or check already in progress" msgstr "Обновление или проверка уже в процессе" -#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:188 +#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:190 msgid "Update available, attempting to download now" msgstr "Доступно обновление, идет попытка загрузки" -#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:190 +#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:192 msgid "Update available, click button on left to download" msgstr "Доступно обновление, нажмите кнопку слева для загрузки" -#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:196 +#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:198 msgid "No update available" msgstr "Нет доступных обновлений" -#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:214 +#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:216 #, java-format msgid "Updating news URL to {0}" msgstr "Изменение URL новостей на {0}" -#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:221 -#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:229 -#: ../java/src/net/i2p/router/web/ConfigUpdateHelper.java:53 -#: ../java/src/net/i2p/router/web/ConfigUpdateHelper.java:59 +#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:223 +#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:231 +#: ../java/src/net/i2p/router/web/ConfigUpdateHelper.java:54 +#: ../java/src/net/i2p/router/web/ConfigUpdateHelper.java:60 msgid "internal" msgstr "внутренний" -#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:225 +#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:227 #, java-format msgid "Updating proxy host to {0}" msgstr "Изменение узла прокси на {0}" -#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:233 +#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:235 #, java-format msgid "Updating proxy port to {0}" msgstr "Изменение порта прокси на {0}" -#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:249 +#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:251 #, java-format msgid "Updating refresh frequency to {0}" msgstr "Изменение частоты обновлений на {0}" -#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:250 -#: ../java/src/net/i2p/router/web/ConfigUpdateHelper.java:129 +#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:252 +#: ../java/src/net/i2p/router/web/ConfigUpdateHelper.java:130 #: ../java/src/net/i2p/router/web/GraphHelper.java:377 msgid "Never" msgstr "Никогда" -#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:257 +#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:259 #, java-format msgid "Updating update policy to {0}" msgstr "Изменение политики обновлений на {0}" -#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:266 +#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:268 msgid "Updating update URLs." msgstr "Обновление URL обновлений." -#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:278 +#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:280 msgid "Updating trusted keys." msgstr "Обновление доверенных ключей." -#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:290 +#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:292 #, java-format msgid "Updating unsigned update URL to {0}" msgstr "Изменение адреса неподписанных обновлений на {0}" -#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:302 +#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:304 #, java-format msgid "Updating signed development build URL to {0}" msgstr "Изменение адреса подписанных тестовых сборок на {0}" -#: ../java/src/net/i2p/router/web/ConfigUpdateHelper.java:131 +#: ../java/src/net/i2p/router/web/ConfigUpdateHelper.java:132 msgid "Every" msgstr "Каждые" -#: ../java/src/net/i2p/router/web/ConfigUpdateHelper.java:149 +#: ../java/src/net/i2p/router/web/ConfigUpdateHelper.java:150 msgid "Notify only" msgstr "Только уведомлять" -#: ../java/src/net/i2p/router/web/ConfigUpdateHelper.java:156 +#: ../java/src/net/i2p/router/web/ConfigUpdateHelper.java:157 msgid "Download and verify only" msgstr "Только скачивать и проверять целостность" -#: ../java/src/net/i2p/router/web/ConfigUpdateHelper.java:164 +#: ../java/src/net/i2p/router/web/ConfigUpdateHelper.java:165 msgid "Download, verify, and restart" msgstr "Скачивать, проверять целостность и перезапускать" @@ -2871,7 +2890,7 @@ msgid "No \"{0}\" events found in previous {1}" msgstr "События \"{0}\" не найдены в предыдущих {1}" #: ../java/src/net/i2p/router/web/EventLogHelper.java:179 -#: ../java/src/net/i2p/router/web/JobQueueHelper.java:144 +#: ../java/src/net/i2p/router/web/JobQueueHelper.java:143 msgid "Time" msgstr "Время" @@ -3021,12 +3040,12 @@ msgid "Graph settings saved" msgstr "Настройки графиков сохранены" #: ../java/src/net/i2p/router/web/HomeHelper.java:29 -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:224 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:229 msgid "Addressbook" msgstr "Адресная книга" #: ../java/src/net/i2p/router/web/HomeHelper.java:29 -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:222 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:227 msgid "Manage your I2P hosts file here (I2P domain name resolution)" msgstr "Управление файлами hosts (единственный механизм, используемый I2P для разрешения доменных имен)" @@ -3057,17 +3076,17 @@ msgid "I2P Home Page Configuration" msgstr "Конфигурация домашней страницы маршрутизатора I2P" #: ../java/src/net/i2p/router/web/HomeHelper.java:33 -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:138 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:139 msgid "Anonymous webmail client" msgstr "Анонимный почтовый клиент с веб-интерфейсом" #: ../java/src/net/i2p/router/web/HomeHelper.java:33 -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:140 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:141 msgid "Email" msgstr "Эл. почта" #: ../java/src/net/i2p/router/web/HomeHelper.java:34 -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:246 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:251 msgid "I2P Router Help" msgstr "Справка маршрутизатора I2P" @@ -3077,17 +3096,17 @@ msgid "Router Console" msgstr "Консоль маршрутизатора I2P" #: ../java/src/net/i2p/router/web/HomeHelper.java:36 -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:144 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:145 msgid "Built-in anonymous BitTorrent Client" msgstr "Встроенный анонимный BitTorrent-клиент" #: ../java/src/net/i2p/router/web/HomeHelper.java:36 -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:146 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:147 msgid "Torrents" msgstr "Торренты" #: ../java/src/net/i2p/router/web/HomeHelper.java:37 -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:150 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:155 msgid "Local web server" msgstr "Локальный веб-сервер" @@ -3256,97 +3275,97 @@ msgstr "HTTP-прокси не запущен" msgid "Your browser is not properly configured to use the HTTP proxy at {0}" msgstr "Ваш браузер не настроен должным образом для использования HTTP-прокси {0}" -#: ../java/src/net/i2p/router/web/HomeHelper.java:201 -#: ../java/src/net/i2p/router/web/SummaryHelper.java:904 +#: ../java/src/net/i2p/router/web/HomeHelper.java:210 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:906 msgid "Name" msgstr "Название" -#: ../java/src/net/i2p/router/web/HomeHelper.java:203 +#: ../java/src/net/i2p/router/web/HomeHelper.java:212 msgid "URL" msgstr "URL" -#: ../java/src/net/i2p/router/web/JobQueueHelper.java:51 +#: ../java/src/net/i2p/router/web/JobQueueHelper.java:50 msgid "I2P Job Queue" msgstr "Очередь задач I2P" -#: ../java/src/net/i2p/router/web/JobQueueHelper.java:52 +#: ../java/src/net/i2p/router/web/JobQueueHelper.java:51 msgid "Job runners" msgstr "Пускатели задач" -#: ../java/src/net/i2p/router/web/JobQueueHelper.java:57 +#: ../java/src/net/i2p/router/web/JobQueueHelper.java:56 msgid "Active jobs" msgstr "Активные задачи" -#: ../java/src/net/i2p/router/web/JobQueueHelper.java:60 +#: ../java/src/net/i2p/router/web/JobQueueHelper.java:59 #, java-format msgid "started {0} ago" msgstr "запущен {0} назад" -#: ../java/src/net/i2p/router/web/JobQueueHelper.java:65 +#: ../java/src/net/i2p/router/web/JobQueueHelper.java:64 msgid "Just finished jobs" msgstr "Только что завершенные задачи " -#: ../java/src/net/i2p/router/web/JobQueueHelper.java:68 +#: ../java/src/net/i2p/router/web/JobQueueHelper.java:67 #, java-format msgid "finished {0} ago" msgstr "завершено {0} назад" -#: ../java/src/net/i2p/router/web/JobQueueHelper.java:73 +#: ../java/src/net/i2p/router/web/JobQueueHelper.java:72 msgid "Ready/waiting jobs" msgstr "Готовые/ожидающие задачи" -#: ../java/src/net/i2p/router/web/JobQueueHelper.java:90 +#: ../java/src/net/i2p/router/web/JobQueueHelper.java:89 msgid "Scheduled jobs" msgstr "Запланированные задачи" #. translators: {0} is a job name, {1} is a time, e.g. 6 min -#: ../java/src/net/i2p/router/web/JobQueueHelper.java:100 +#: ../java/src/net/i2p/router/web/JobQueueHelper.java:99 #, java-format msgid "{0} will start in {1}" msgstr "{0} запустится через {1}" -#: ../java/src/net/i2p/router/web/JobQueueHelper.java:114 +#: ../java/src/net/i2p/router/web/JobQueueHelper.java:113 msgid "Total Job Statistics" msgstr "Общая статистика задач" -#: ../java/src/net/i2p/router/web/JobQueueHelper.java:125 -#: ../java/src/net/i2p/router/web/JobQueueHelper.java:142 +#: ../java/src/net/i2p/router/web/JobQueueHelper.java:124 +#: ../java/src/net/i2p/router/web/JobQueueHelper.java:141 msgid "Job" msgstr "Задача" -#: ../java/src/net/i2p/router/web/JobQueueHelper.java:125 +#: ../java/src/net/i2p/router/web/JobQueueHelper.java:124 msgid "Queued" msgstr "В очереди" -#: ../java/src/net/i2p/router/web/JobQueueHelper.java:142 +#: ../java/src/net/i2p/router/web/JobQueueHelper.java:141 msgid "Runs" msgstr "Запуски" -#: ../java/src/net/i2p/router/web/JobQueueHelper.java:143 +#: ../java/src/net/i2p/router/web/JobQueueHelper.java:142 msgid "Dropped" msgstr "Отклонено" -#: ../java/src/net/i2p/router/web/JobQueueHelper.java:144 -#: ../java/src/net/i2p/router/web/JobQueueHelper.java:146 +#: ../java/src/net/i2p/router/web/JobQueueHelper.java:143 +#: ../java/src/net/i2p/router/web/JobQueueHelper.java:145 msgid "Avg" msgstr "Среднее" -#: ../java/src/net/i2p/router/web/JobQueueHelper.java:145 -#: ../java/src/net/i2p/router/web/JobQueueHelper.java:147 +#: ../java/src/net/i2p/router/web/JobQueueHelper.java:144 +#: ../java/src/net/i2p/router/web/JobQueueHelper.java:146 msgid "Max" msgstr "Макс." -#: ../java/src/net/i2p/router/web/JobQueueHelper.java:145 -#: ../java/src/net/i2p/router/web/JobQueueHelper.java:147 +#: ../java/src/net/i2p/router/web/JobQueueHelper.java:144 +#: ../java/src/net/i2p/router/web/JobQueueHelper.java:146 msgid "Min" msgstr "Мин." -#: ../java/src/net/i2p/router/web/JobQueueHelper.java:146 +#: ../java/src/net/i2p/router/web/JobQueueHelper.java:145 msgid "Pending" msgstr "В ожидании" -#: ../java/src/net/i2p/router/web/JobQueueHelper.java:198 -#: ../java/src/net/i2p/router/web/NetDbHelper.java:14 +#: ../java/src/net/i2p/router/web/JobQueueHelper.java:197 +#: ../java/src/net/i2p/router/web/NetDbHelper.java:16 msgid "Summary" msgstr "Сводка" @@ -3364,223 +3383,223 @@ msgid "No log messages" msgstr "Нет сообщений" #. 0 -#: ../java/src/net/i2p/router/web/NetDbHelper.java:15 +#: ../java/src/net/i2p/router/web/NetDbHelper.java:17 msgid "Local Router" msgstr "Локальный маршрутизатор" #. 1 -#: ../java/src/net/i2p/router/web/NetDbHelper.java:16 +#: ../java/src/net/i2p/router/web/NetDbHelper.java:18 msgid "Router Lookup" msgstr "Просмотр маршрутизатора" #. 2 -#: ../java/src/net/i2p/router/web/NetDbHelper.java:17 +#: ../java/src/net/i2p/router/web/NetDbHelper.java:19 msgid "All Routers" msgstr "Все маршрутизаторы" #. 3 -#: ../java/src/net/i2p/router/web/NetDbHelper.java:18 +#: ../java/src/net/i2p/router/web/NetDbHelper.java:20 msgid "All Routers with Full Stats" msgstr "Все маршрутизаторы с полной статистикой" #. 4 #. 5 -#: ../java/src/net/i2p/router/web/NetDbHelper.java:20 +#: ../java/src/net/i2p/router/web/NetDbHelper.java:22 msgid "LeaseSets" msgstr "Список LeaseSet" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:96 -#: ../java/strings/Strings.java:68 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:105 +#: ../java/strings/Strings.java:69 msgid "Router" msgstr "Маршрутизатор" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:96 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:112 msgid "not found in network database" msgstr "не найден в сетевой базе данных" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:139 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:156 msgid "LeaseSet" msgstr "LeaseSet" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:141 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:158 msgid "Local" msgstr "локальный" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:143 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:160 msgid "Unpublished" msgstr "неопубликованный" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:144 -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:159 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:161 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:176 msgid "Destination" msgstr "адрес назначения" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:156 -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:168 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:173 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:185 msgid "Add to local addressbook" msgstr "Добавить в локальную адресную книгу" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:173 -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:200 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:190 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:217 #, java-format msgid "Expires in {0}" msgstr "Истекает через {0}" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:175 -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:202 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:192 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:219 #, java-format msgid "Expired {0} ago" msgstr "Истек {0} назад" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:194 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:211 #: ../java/src/net/i2p/router/web/TunnelRenderer.java:162 msgid "Gateway" msgstr "Шлюз" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:194 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:211 msgid "Lease" msgstr "Lease" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:196 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:213 msgid "Tunnel" msgstr "Туннель" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:263 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:280 msgid "Not initialized" msgstr "База не инициализирована" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:313 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:330 msgid "Network Database Router Statistics" msgstr "Статистика маршрутизаторов" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:320 -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:334 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:337 #: ../java/src/net/i2p/router/web/NetDbRenderer.java:352 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:370 msgid "Count" msgstr "Количество" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:334 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:352 msgid "Transports" msgstr "Транспортный протокол" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:352 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:370 msgid "Country" msgstr "Страна" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:411 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:429 msgid "Our info" msgstr "Информация о нас" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:413 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:431 msgid "Peer info for" msgstr "Информация об узле" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:415 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:433 msgid "Full entry" msgstr "Полная запись" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:422 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:440 #: ../java/src/net/i2p/router/web/SummaryHelper.java:152 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:726 msgid "Hidden" msgstr "Скрытый" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:422 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:440 msgid "Updated" msgstr "Обновленный" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:423 -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:426 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:441 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:444 #, java-format msgid "{0} ago" msgstr "{0} назад" #. shouldnt happen -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:425 -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:429 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:443 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:447 msgid "Published" msgstr "Опубликовано" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:431 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:449 msgid "Signing Key" msgstr "Подписывающий ключ" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:433 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:451 msgid "Address(es)" msgstr "Адрес(а)" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:445 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:463 msgid "cost" msgstr "cost" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:471 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:489 msgid "Hidden or starting up" msgstr "В скрытом режиме или недавно запущен" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:471 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:489 msgid "SSU" msgstr "SSU" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:471 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:489 msgid "SSU with introducers" msgstr "SSU через посредников" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:472 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:490 msgid "NTCP" msgstr "NTCP" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:472 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:490 msgid "NTCP and SSU" msgstr "NTCP и SSU" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:472 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:490 msgid "NTCP and SSU with introducers" msgstr "NTCP и SSU через посредников" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:473 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:491 msgid "IPv6 Only SSU, introducers" msgstr "Только IPv6 SSU, представители" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:473 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:491 msgid "IPv6 SSU" msgstr "IPv6 SSU" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:473 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:491 msgid "IPv6 SSU, introducers" msgstr "IPv6 SSU, представители" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:474 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:492 msgid "IPv6 NTCP" msgstr "IPv6 NTCP" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:474 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:492 msgid "IPv6 NTCP, SSU" msgstr "IPv6 NTCP, SSU" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:474 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:492 msgid "IPv6 NTCP, SSU, introducers" msgstr "IPv6 NTCP, SSU, представители" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:474 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:492 msgid "IPv6 Only NTCP, SSU, introducers" msgstr "Только IPv6 NTCP, SSU, представители" -#: ../java/src/net/i2p/router/web/NewsHelper.java:290 +#: ../java/src/net/i2p/router/web/NewsHelper.java:295 #, java-format msgid "News last updated {0} ago." msgstr "Новости последний раз обновлялись {0} назад." -#: ../java/src/net/i2p/router/web/NewsHelper.java:296 +#: ../java/src/net/i2p/router/web/NewsHelper.java:301 #, java-format msgid "News last checked {0} ago." msgstr "Новости последний раз проверялись {0} назад." -#: ../java/src/net/i2p/router/web/NewsHelper.java:305 +#: ../java/src/net/i2p/router/web/NewsHelper.java:310 msgid "Hide news" msgstr "Скрыть новости" -#: ../java/src/net/i2p/router/web/NewsHelper.java:308 -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:642 +#: ../java/src/net/i2p/router/web/NewsHelper.java:313 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:647 msgid "Show news" msgstr "Показать новости" @@ -3638,19 +3657,19 @@ msgid "Groups (Caps)" msgstr "Входит в группы (возможности)" #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:89 -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:269 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:260 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:516 msgid "Speed" msgstr "Скорость" #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:90 -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:271 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:262 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:520 msgid "Capacity" msgstr "Емкость" #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:91 -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:273 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:264 msgid "Integration" msgstr "Интеграция" @@ -3673,7 +3692,7 @@ msgid "Failing" msgstr "Сбоящие" #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:135 -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:406 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:411 msgid "Integrated" msgstr "интегрированные" @@ -3750,71 +3769,71 @@ msgstr "Уровень отказов за 1 час" msgid "1d Fail Rate" msgstr "Уровень отказов за 1 день" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:268 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:259 msgid "Thresholds" msgstr "Пороговые значения" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:270 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:261 msgid "fast peers" msgstr "быстрые узлы" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:272 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:263 msgid "high capacity peers" msgstr "высокоемкие узлы" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:274 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:265 msgid " well integrated peers" msgstr "хорошо интегрированные узлы" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:276 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:267 msgid "as determined by the profile organizer" msgstr "определяется автоматически модулем ProfileOrganizer на основании собранной информации о производительности узла" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:276 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:267 msgid "groups" msgstr "Входит в группы" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:277 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:268 msgid "capabilities in the netDb, not used to determine profiles" msgstr "информация об узле, предоставленная сетевой БД; для профилирования не используется" #. capabilities -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:277 -#: ../java/strings/Strings.java:81 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:268 +#: ../java/strings/Strings.java:82 msgid "caps" msgstr "caps" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:278 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:269 msgid "" "peak throughput (bytes per second) over a 1 minute period that the peer has " "sustained in a single tunnel" msgstr "пиковая скорость (байт/с) узла на одном туннеле за 1-минутый период" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:278 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:269 msgid "speed" msgstr "Скорость" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:279 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:270 msgid "capacity" msgstr "емкость" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:279 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:270 msgid "how many tunnels can we ask them to join in an hour?" msgstr "ко скольким туннелям мы можем попросить этот узел присоединиться за час?" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:280 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:271 msgid "how many new peers have they told us about lately?" msgstr "о скольких новых узлах этот узел сообщил нам в последнее время?" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:280 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:271 msgid "integration" msgstr "Интеграция" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:281 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:272 msgid "is the peer banned, or unreachable, or failing tunnel tests?" msgstr "заблокирован ли этот узел, недоступен, дает ошибки на тестах?" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:281 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:272 msgid "status" msgstr "Состояние" @@ -3946,277 +3965,277 @@ msgstr "График количества событий" msgid "Lifetime average value" msgstr "Среднее значение за время работы" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:120 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:121 msgid "I2P Router Help & FAQ" msgstr "Справка и FAQ маршрутизатора I2P" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:122 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:123 msgid "Help & FAQ" msgstr "Справка и FAQ" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:130 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:131 msgid "" "Configure startup of clients and webapps (services); manually start dormant " "services" msgstr "Настройка автозапуска клиентов и веб-приложений (служб), ручной запуск неактивных приложений" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:132 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:133 msgid "I2P Services" msgstr "Службы I2P" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:164 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:169 msgid "Configure I2P Router" msgstr "Настройка маршрутизатора I2P" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:166 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:171 msgid "I2P Internals" msgstr "Настройки I2P" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:172 -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:479 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:177 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:484 msgid "View existing tunnels and tunnel build status" msgstr "Отобразить существующие туннели и состояние строящихся" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:178 -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:365 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:183 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:370 msgid "Show all current peer connections" msgstr "Просмотр списка текущих соединений с узлами" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:184 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:189 msgid "Show recent peer performance profiles" msgstr "Просмотр недавних профилей производительности узлов" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:186 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:191 msgid "Profiles" msgstr "Профили" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:190 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:195 msgid "Show list of all known I2P routers" msgstr "Показать список всех известных I2P-маршрутизаторов" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:192 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:197 msgid "NetDB" msgstr "Сетевая БД" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:196 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:201 msgid "Health Report" msgstr "Отчет о состоянии маршрутизатора" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:198 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:203 msgid "Logs" msgstr "Журналы" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:209 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:214 msgid "Graph router performance" msgstr "График производительности маршрутизатора" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:211 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:216 msgid "Graphs" msgstr "Графики" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:216 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:221 msgid "Textual router performance statistics" msgstr "Статистика производительности маршрутизатора в текстовом виде" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:228 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:233 #: ../java/src/net/i2p/router/web/SummaryHelper.java:438 msgid "Local Tunnels" msgstr "Локальные туннели" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:230 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:235 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/i2ptunnelmgr_jsp.java:164 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/i2ptunnelmgr_jsp.java:337 msgid "Hidden Services Manager" msgstr "Управление скрытыми сервисами" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:248 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:253 msgid "General" msgstr "Общая информация" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:253 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:258 msgid "" "Your Local Identity is your unique I2P router identity, similar to an ip " "address but tailored to I2P. " msgstr "Ваш локальный идентификатор — это уникальный идентификатор Вашего I2P-маршрутизатора, как IP-адрес, но применительно к I2P." -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:254 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:259 msgid "Never disclose this to anyone, as it can reveal your real world ip." msgstr "Никогда не сообщайте его кому-либо, это может раскрыть Ваш IP-адрес." -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:256 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:261 msgid "Local Identity" msgstr "Локальный идентификатор" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:260 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:265 msgid "Your unique I2P router identity is" msgstr "Уникальный идентификатор Вашего I2P-маршрутизатора:" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:264 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:269 msgid "never reveal it to anyone" msgstr "никому его не показывайте" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:266 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:271 msgid "show" msgstr "показать" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:270 -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:296 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:275 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:301 msgid "The version of the I2P software we are running" msgstr "Версия запущенного ПО I2P" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:280 -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:306 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:285 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:311 msgid "How long we've been running for this session" msgstr "Время работы маршрутизатора с последнего запуска" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:321 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:326 msgid "" "Help with configuring your firewall and router for optimal I2P performance" msgstr "Помощь в настройке брандмауэра и маршрутизатора для обеспечения оптимальной производительности I2P" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:332 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:337 msgid "See more information on the wiki" msgstr "Подробнее в wiki" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:334 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:339 msgid "Warning: ECDSA is not available. Update your Java or OS" msgstr "Внимание: ECDSA недоступно. Обновите Java или ОС." -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:346 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:351 msgid "Configure I2P Updates" msgstr "Настройка обновления I2P" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:348 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:353 msgid "I2P Update" msgstr "Обновление I2P" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:373 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:378 msgid "Peers we've been talking to in the last few minutes/last hour" msgstr "Узлы, с которыми была связь за последние минуты/часы" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:376 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:381 msgid "Active" msgstr "Активные" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:385 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:390 msgid "The number of peers available for building client tunnels" msgstr "Число узлов, доступных для создания клиентских туннелей" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:388 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:393 msgid "Fast" msgstr "Быстрые" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:394 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:399 msgid "The number of peers available for building exploratory tunnels" msgstr "Число узлов, доступных для создания зондирующих туннелей" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:397 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:402 msgid "High capacity" msgstr "Высокоемкие" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:403 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:408 msgid "The number of peers available for network database inquiries" msgstr "Число узлов, доступных для запросов к сетевой БД" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:412 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:417 msgid "The total number of peers in our network database" msgstr "Общее число узлов в нашей сетевой БД" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:415 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:420 msgid "Known" msgstr "Известные" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:435 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:440 msgid "Configure router bandwidth allocation" msgstr "Настройка ограничений скорости" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:437 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:442 msgid "Bandwidth in/out" msgstr "Трафик (вх./исх.)" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:457 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:462 msgid "Total" msgstr "Всего" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:464 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:469 msgid "Used" msgstr "Объем" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:486 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:491 msgid "" "Used for building and testing tunnels, and communicating with floodfill " "peers" msgstr "Используются для создания и тестирования туннелей и соединения с floodfill-узлами" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:489 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:494 msgid "Exploratory" msgstr "Зондирующие" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:495 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:500 msgid "Tunnels we are using to provide or access services on the network" msgstr "Туннели, используемые для доступа к службам сети или их публикации" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:504 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:509 msgid "" -"Tunnels we are participating in, directly contributing bandwith to the " +"Tunnels we are participating in, directly contributing bandwidth to the " "network" -msgstr "Туннели, в которых мы принимаем участие, непосредственно способствующие пропускной способнсти сети" +msgstr "" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:507 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:512 msgid "Participating" msgstr "Транзитные" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:513 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:518 msgid "" "The ratio of tunnel hops we provide to tunnel hops we use - a value greater " "than 1.00 indicates a positive contribution to the network" msgstr "Доля транзита отображает соотношение предоставляемой нами пропускной способности для транзитных туннелей по отношению к потребляемой нами скорости. Соотношение 1.00 означает положительный вклад в сеть" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:516 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:521 msgid "Share ratio" msgstr "Доля транзита" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:529 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:534 msgid "What's in the router's job queue?" msgstr "Просмотр очереди заданий маршрутизатора" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:531 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:536 msgid "Congestion" msgstr "Занятость" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:536 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:541 msgid "Indicates router performance" msgstr "Отражает производительность маршрутизатора" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:539 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:544 msgid "Job lag" msgstr "Задержка задач" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:545 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:550 msgid "Indicates how quickly outbound messages to other I2P routers are sent" msgstr "Показывает, как быстро исходящие сообщения отправляются другим I2P-маршрутизаторам" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:548 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:553 msgid "Message delay" msgstr "Задежка сообщений" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:555 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:560 msgid "Round trip time for a tunnel test" msgstr "Тест времени прохождения туннеля" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:558 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:563 msgid "Tunnel lag" msgstr "Задержка туннелей" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:565 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:570 msgid "Queued requests from other routers to participate in tunnels" msgstr "Очередь запросов от других маршрутизаторов, принимающих участие в туннелях" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:568 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:573 msgid "Backlog" msgstr "Очередь" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:603 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:608 msgid "News & Updates" msgstr "Новости и обновления" @@ -4320,26 +4339,26 @@ msgstr "Построение туннелей" msgid "shared clients" msgstr "коллективных клиентов" -#: ../java/src/net/i2p/router/web/SummaryHelper.java:715 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:717 msgid "Click Restart to install" msgstr "Перезапустите I2P-маршрутизатор для установки" -#: ../java/src/net/i2p/router/web/SummaryHelper.java:717 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:719 msgid "Click Shutdown and restart to install" msgstr "Остановите и снова запустите I2P-маршрутизатор для установки" -#: ../java/src/net/i2p/router/web/SummaryHelper.java:718 -#: ../java/src/net/i2p/router/web/SummaryHelper.java:733 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:720 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:735 #, java-format msgid "Version {0}" msgstr "Версия {0}" -#: ../java/src/net/i2p/router/web/SummaryHelper.java:732 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:734 msgid "Update available" msgstr "Доступно обновление" #. Note to translators: parameter is a version, e.g. "0.8.4" -#: ../java/src/net/i2p/router/web/SummaryHelper.java:756 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:758 #, java-format msgid "Download {0} Update" msgstr "Скачать обновление {0}" @@ -4348,7 +4367,7 @@ msgstr "Скачать обновление {0}" #.
is optional, to help the browser make the lines even in the button #. If the translation is shorter than the English, you should probably not #. include
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:764 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:766 #, java-format msgid "Download Signed
Development Update
{0}" msgstr "Загрузка подписанного
тестового обновления
{0}" @@ -4357,69 +4376,85 @@ msgstr "Загрузка подписанного
тестового обно #.
is optional, to help the browser make the lines even in the button #. If the translation is shorter than the English, you should probably not #. include
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:772 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:774 #, java-format msgid "Download Unsigned
Update {0}" msgstr "Скачать неподписанное
обновление {0}" -#: ../java/src/net/i2p/router/web/SummaryHelper.java:796 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:798 msgid "Help with firewall configuration" msgstr "Помощь в настройке брандмауэра" -#: ../java/src/net/i2p/router/web/SummaryHelper.java:798 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:800 msgid "Check network connection and NAT/firewall" msgstr "Проверьте сетевое соединение и настройки NAT/брандмауэра" -#: ../java/src/net/i2p/router/web/SummaryHelper.java:817 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:819 msgid "Reseed" msgstr "Повторить начальную загрузку" -#: ../java/src/net/i2p/router/web/SummaryHelper.java:906 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:908 msgid "Order" msgstr "Порядок" -#: ../java/src/net/i2p/router/web/SummaryHelper.java:923 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:925 msgid "Top" msgstr "Верх" -#: ../java/src/net/i2p/router/web/SummaryHelper.java:936 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:930 +msgid "Move to top" +msgstr "Переместить в начало" + +#: ../java/src/net/i2p/router/web/SummaryHelper.java:940 +msgid "Move up" +msgstr "Переместить вверх" + +#: ../java/src/net/i2p/router/web/SummaryHelper.java:948 msgid "Down" msgstr "Вниз" -#: ../java/src/net/i2p/router/web/SummaryHelper.java:941 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:953 +msgid "Move down" +msgstr "Переместить вниз" + +#: ../java/src/net/i2p/router/web/SummaryHelper.java:958 msgid "Bottom" msgstr "Низ" -#: ../java/src/net/i2p/router/web/SummaryHelper.java:953 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:963 +msgid "Move to bottom" +msgstr "Переместить в конец" + +#: ../java/src/net/i2p/router/web/SummaryHelper.java:975 msgid "Select a section to add" msgstr "Выберите секцию для добавления" -#: ../java/src/net/i2p/router/web/SummaryRenderer.java:141 +#: ../java/src/net/i2p/router/web/SummaryRenderer.java:142 #, java-format msgid "events in {0}" msgstr "событий за {0}" -#: ../java/src/net/i2p/router/web/SummaryRenderer.java:143 +#: ../java/src/net/i2p/router/web/SummaryRenderer.java:144 #, java-format msgid "averaged for {0}" msgstr "усредненное за {0}" -#: ../java/src/net/i2p/router/web/SummaryRenderer.java:153 +#: ../java/src/net/i2p/router/web/SummaryRenderer.java:154 msgid "Events per period" msgstr "Событий за период" -#: ../java/src/net/i2p/router/web/SummaryRenderer.java:175 -#: ../java/src/net/i2p/router/web/SummaryRenderer.java:188 +#: ../java/src/net/i2p/router/web/SummaryRenderer.java:176 +#: ../java/src/net/i2p/router/web/SummaryRenderer.java:189 msgid "avg" msgstr "сред." -#: ../java/src/net/i2p/router/web/SummaryRenderer.java:176 -#: ../java/src/net/i2p/router/web/SummaryRenderer.java:189 +#: ../java/src/net/i2p/router/web/SummaryRenderer.java:177 +#: ../java/src/net/i2p/router/web/SummaryRenderer.java:190 msgid "max" msgstr "макс." -#: ../java/src/net/i2p/router/web/SummaryRenderer.java:177 -#: ../java/src/net/i2p/router/web/SummaryRenderer.java:190 +#: ../java/src/net/i2p/router/web/SummaryRenderer.java:178 +#: ../java/src/net/i2p/router/web/SummaryRenderer.java:191 msgid "now" msgstr "текущ." @@ -4596,175 +4631,127 @@ msgid "Open Router Console in web browser at startup" msgstr "Открывать консоль маршрутизатора в веб-браузере при старте I2P" #: ../java/strings/Strings.java:37 +msgid "shared clients (DSA)" +msgstr "" + +#: ../java/strings/Strings.java:38 msgid "IRC proxy" msgstr "IRC-прокси" -#: ../java/strings/Strings.java:38 +#: ../java/strings/Strings.java:39 msgid "eepsite" msgstr "eepsite" -#: ../java/strings/Strings.java:39 +#: ../java/strings/Strings.java:40 msgid "I2P webserver" msgstr "I2P-веб-сервер" -#: ../java/strings/Strings.java:40 +#: ../java/strings/Strings.java:41 msgid "HTTP Proxy" msgstr "HTTP-прокси" #. older names for pre-0.7.4 installs -#: ../java/strings/Strings.java:42 +#: ../java/strings/Strings.java:43 msgid "eepProxy" msgstr "I2P-прокси" -#: ../java/strings/Strings.java:43 +#: ../java/strings/Strings.java:44 msgid "ircProxy" msgstr "IRC-прокси" #. hardcoded in i2psnark -#: ../java/strings/Strings.java:45 +#: ../java/strings/Strings.java:46 msgid "I2PSnark" msgstr "I2PSnark" #. hardcoded in iMule? -#: ../java/strings/Strings.java:47 +#: ../java/strings/Strings.java:48 msgid "iMule" msgstr "iMule" #. standard themes for ConfigUIHelper -#: ../java/strings/Strings.java:51 +#: ../java/strings/Strings.java:52 msgid "classic" msgstr "Классическая" -#: ../java/strings/Strings.java:52 +#: ../java/strings/Strings.java:53 msgid "dark" msgstr "Темная" -#: ../java/strings/Strings.java:53 +#: ../java/strings/Strings.java:54 msgid "light" msgstr "Светлая" -#: ../java/strings/Strings.java:54 +#: ../java/strings/Strings.java:55 msgid "midnight" msgstr "Полночь" -#: ../java/strings/Strings.java:58 +#: ../java/strings/Strings.java:59 msgid "BandwidthLimiter" msgstr "Ограничитель скорости" -#: ../java/strings/Strings.java:59 +#: ../java/strings/Strings.java:60 msgid "ClientMessages" msgstr "Клиентские сообщения" -#: ../java/strings/Strings.java:60 +#: ../java/strings/Strings.java:61 msgid "Encryption" msgstr "Шифрование" -#: ../java/strings/Strings.java:61 +#: ../java/strings/Strings.java:62 msgid "i2cp" msgstr "I2CP" -#: ../java/strings/Strings.java:62 +#: ../java/strings/Strings.java:63 msgid "I2PTunnel" msgstr "Менеджер туннелей" -#: ../java/strings/Strings.java:63 +#: ../java/strings/Strings.java:64 msgid "InNetPool" msgstr "Сетевой пул" -#: ../java/strings/Strings.java:64 +#: ../java/strings/Strings.java:65 msgid "JobQueue" msgstr "Очередь заданий" -#: ../java/strings/Strings.java:65 +#: ../java/strings/Strings.java:66 msgid "NetworkDatabase" msgstr "Сетевая БД" -#: ../java/strings/Strings.java:66 +#: ../java/strings/Strings.java:67 msgid "ntcp" msgstr "NTCP" -#: ../java/strings/Strings.java:69 +#: ../java/strings/Strings.java:70 msgid "Stream" msgstr "Потоки" -#: ../java/strings/Strings.java:70 +#: ../java/strings/Strings.java:71 msgid "Throttle" msgstr "Регуляция" -#: ../java/strings/Strings.java:71 +#: ../java/strings/Strings.java:72 msgid "Transport" msgstr "Транспортные протоколы" -#: ../java/strings/Strings.java:73 +#: ../java/strings/Strings.java:74 msgid "udp" msgstr "UDP" #. parameters in transport addresses (netdb.jsp) #. may or may not be worth translating -#: ../java/strings/Strings.java:77 +#: ../java/strings/Strings.java:78 msgid "host" msgstr "host" -#: ../java/strings/Strings.java:78 +#: ../java/strings/Strings.java:79 msgid "key" msgstr "key" -#: ../java/strings/Strings.java:79 +#: ../java/strings/Strings.java:80 msgid "port" msgstr "port" -#. introducer host -#: ../java/strings/Strings.java:83 -msgid "ihost0" -msgstr "ihost0" - -#: ../java/strings/Strings.java:84 -msgid "ihost1" -msgstr "ihost1" - -#: ../java/strings/Strings.java:85 -msgid "ihost2" -msgstr "ihost2" - -#. introducer port -#: ../java/strings/Strings.java:87 -msgid "iport0" -msgstr "iport0" - -#: ../java/strings/Strings.java:88 -msgid "iport1" -msgstr "iport1" - -#: ../java/strings/Strings.java:89 -msgid "iport2" -msgstr "iport2" - -#. introducer key -#: ../java/strings/Strings.java:91 -msgid "ikey0" -msgstr "ikey0" - -#: ../java/strings/Strings.java:92 -msgid "ikey1" -msgstr "ikey1" - -#: ../java/strings/Strings.java:93 -msgid "ikey2" -msgstr "ikey2" - -#. introducer tag -#: ../java/strings/Strings.java:95 -msgid "itag0" -msgstr "itag0" - -#: ../java/strings/Strings.java:96 -msgid "itag1" -msgstr "itag1" - -#: ../java/strings/Strings.java:97 -msgid "itag2" -msgstr "itag2" - #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:148 msgid "configure bandwidth" msgstr "настройка полосы пропускания" @@ -4933,7 +4920,7 @@ msgid "Share" msgstr "Доля транзитного трафика" #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:479 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:481 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:493 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:475 msgid "NOTE" msgstr "ПРИМЕЧАНИЕ" @@ -4974,7 +4961,7 @@ msgid "Advanced network configuration page" msgstr "Расширенные сетевые настройки" #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:497 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:477 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:489 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:498 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:574 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:590 @@ -5013,27 +5000,35 @@ msgid "" "computer's resources." msgstr "Участие в качестве Floodill-узла помогает сети, но может использовать больше ресурсов вашего компьютера." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:445 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:442 +msgid "This router is currently a floodfill participant." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:446 +msgid "This router is not currently a floodfill participant." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:457 msgid "Automatic" msgstr "Автоматически" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:451 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:463 msgid "Force On" msgstr "Включить принудительно" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:457 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:469 msgid "Disable" msgstr "Отключить" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:461 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:473 msgid "Advanced I2P Configuration" msgstr "Дополнительные настройки I2P" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:483 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:495 msgid "Some changes may require a restart to take effect." msgstr "Для вступления некоторых изменений в силу может потребоваться перезапуск I2P-маршрутизатора." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:486 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:498 #, java-format msgid "To make changes, edit the file {0}." msgstr "Для внесения изменений отредактируйте файл {0}." diff --git a/apps/routerconsole/locale/messages_tr.po b/apps/routerconsole/locale/messages_tr.po index 6d7aae2fa..b20614289 100644 --- a/apps/routerconsole/locale/messages_tr.po +++ b/apps/routerconsole/locale/messages_tr.po @@ -8,7 +8,7 @@ # Erkin Batu Altunbaş , 2013 # gelomichelan, 2015 # gelomichelan, 2015 -# Kaya Zeren , 2013 +# Kaya Zeren , 2013,2015 # Trans Lator , 2013 # Trans Lator , 2013 msgid "" @@ -16,9 +16,9 @@ msgstr "" "Project-Id-Version: I2P\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-07-17 01:05+0000\n" -"PO-Revision-Date: 2015-07-17 01:31+0000\n" -"Last-Translator: kytv \n" -"Language-Team: Turkish (Turkey) (http://www.transifex.com/projects/p/I2P/language/tr_TR/)\n" +"PO-Revision-Date: 2015-08-08 07:10+0000\n" +"Last-Translator: Kaya Zeren \n" +"Language-Team: Turkish (Turkey) (http://www.transifex.com/otf/I2P/language/tr_TR/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -84,7 +84,7 @@ msgstr[0] "{0} gün" #, java-format msgid "1 year" msgid_plural "{0} years" -msgstr[0] "" +msgstr[0] "{0} yıl" #: ../../../core/java/src/net/i2p/data/DataHelper.java:1549 #: ../../../core/java/src/net/i2p/data/DataHelper.java:1596 @@ -96,13 +96,13 @@ msgstr "kullanılamaz" #, java-format msgid "1 ns" msgid_plural "{0,number,###} ns" -msgstr[0] "" +msgstr[0] "{0,number,####} ns" #: ../../../core/java/src/net/i2p/data/DataHelper.java:1580 #, java-format msgid "1 μs" msgid_plural "{0,number,###} μs" -msgstr[0] "" +msgstr[0] "{0,number,###} μs" #: ../../../router/java/src/net/i2p/router/Blocklist.java:201 #, java-format @@ -122,11 +122,11 @@ msgstr "IP blocklist.txt dosyasındaki {0} kayıdıyla engellendi" #: ../../../router/java/src/net/i2p/router/Blocklist.java:920 msgid "IPs Banned Until Restart" -msgstr "" +msgstr "Yeniden Başlatılana Kadar Yasaklanmış IP Adresleri" #: ../../../router/java/src/net/i2p/router/Blocklist.java:957 msgid "IPs Permanently Banned" -msgstr "" +msgstr "Kalıcı Olarak Yasaklanmış IP Adresleri" #: ../../../router/java/src/net/i2p/router/Blocklist.java:959 #: ../java/src/net/i2p/router/web/TunnelRenderer.java:71 @@ -153,66 +153,66 @@ msgstr "Tamam" #: ../../../router/java/src/net/i2p/router/CommSystemFacade.java:312 msgid "IPv4: OK; IPv6: Testing" -msgstr "" +msgstr "IPv4: Tamam; IPv6: Sınanıyor" #: ../../../router/java/src/net/i2p/router/CommSystemFacade.java:313 msgid "IPv4: OK; IPv6: Firewalled" -msgstr "" +msgstr "IPv4: Tamam; IPv6: Güvenlik duvarlı" #: ../../../router/java/src/net/i2p/router/CommSystemFacade.java:314 msgid "IPv4: Testing; IPv6: OK" -msgstr "" +msgstr "IPv4: Sınanıyor; IPv6: Tamam" #: ../../../router/java/src/net/i2p/router/CommSystemFacade.java:315 msgid "IPv4: Firewalled; IPv6: OK" -msgstr "" +msgstr "IPv4: Güvenlik duvarlı; IPv6: Tamam" #: ../../../router/java/src/net/i2p/router/CommSystemFacade.java:316 msgid "IPv4: Disabled; IPv6: OK" -msgstr "" +msgstr "IPv4: Devre dışı; IPv6: Tamam" #: ../../../router/java/src/net/i2p/router/CommSystemFacade.java:317 msgid "IPv4: Symmetric NAT; IPv6: OK" -msgstr "" +msgstr "IPv4: Simetrik NAT; IPv6: Tamam" #. * IPv4 symmetric NAT, IPv6 firewalled or disabled or no address #: ../../../router/java/src/net/i2p/router/CommSystemFacade.java:319 msgid "Symmetric NAT" -msgstr "" +msgstr "Simetrik NAT" #: ../../../router/java/src/net/i2p/router/CommSystemFacade.java:320 msgid "IPv4: Symmetric NAT; IPv6: Testing" -msgstr "" +msgstr "IPv4: Simetrik NAT; IPv6: Sınanıyor" #: ../../../router/java/src/net/i2p/router/CommSystemFacade.java:321 msgid "IPv4: Firewalled; IPv6: Testing" -msgstr "" +msgstr "IPv4: Güvenlik duvarlı; IPv6: Sınanıyor" #. * IPv4 firewalled, IPv6 firewalled or disabled or no address #: ../../../router/java/src/net/i2p/router/CommSystemFacade.java:323 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:706 msgid "Firewalled" -msgstr "Güvenlik duvarı engellemesi" +msgstr "Güvenlik duvarlı" #: ../../../router/java/src/net/i2p/router/CommSystemFacade.java:324 msgid "IPv4: Testing; IPv6: Firewalled" -msgstr "" +msgstr "IPv4: Sınanıyor; IPv6: Güvenlik duvarlı" #: ../../../router/java/src/net/i2p/router/CommSystemFacade.java:325 msgid "IPv4: Disabled; IPv6: Testing" -msgstr "" +msgstr "IPv4: Devre dışı; IPv6: Sınanıyor" #: ../../../router/java/src/net/i2p/router/CommSystemFacade.java:326 msgid "IPv4: Disabled; IPv6: Firewalled" -msgstr "" +msgstr "IPv4: Devre dışı; IPv6: Güvenlik duvarlı" #: ../../../router/java/src/net/i2p/router/CommSystemFacade.java:327 msgid "Disconnected" -msgstr "" +msgstr "Bağlantı kesildi" #: ../../../router/java/src/net/i2p/router/CommSystemFacade.java:328 msgid "Port Conflict" -msgstr "" +msgstr "Kapı Çakışması" #: ../../../router/java/src/net/i2p/router/CommSystemFacade.java:329 #: ../java/src/net/i2p/router/web/SummaryHelper.java:155 @@ -229,7 +229,7 @@ msgstr "Sınanıyor" #: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:135 #: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:523 msgid "Rejecting tunnels: Starting up" -msgstr "" +msgstr "Tünelleme red ediliyor: Başlatılıyor" #: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:182 msgid "Rejecting tunnels: High message delay" @@ -282,43 +282,43 @@ msgstr "Tünelleme red ediliyor" #: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:212 #, java-format msgid "Reseeding: got router info from file ({0} successful, {1} errors)." -msgstr "" +msgstr "Yeniden tohumlanıyor: dosyadan yöneltici bilgileri alındı ({0} başarılı, {1} hata)." #: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:284 #: ../java/src/net/i2p/router/web/ConfigNavHelper.java:28 msgid "Reseeding" -msgstr "Tekrar düğümleniyor" +msgstr "Yeniden tohumlanıyor" #: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:307 #, java-format msgid "Reseed fetched only 1 router." msgid_plural "Reseed fetched only {0} routers." -msgstr[0] "Tekrar düğümleme sadece {0} yönlendirici aldı." +msgstr[0] "Yeniden tohumlama yalnız {0} yöneltici aldı." #: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:316 msgid "Reseed failed." -msgstr "Tekrar düğümleme başarısız oldu." +msgstr "Yeniden tohumlama yapılamadı." #: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:317 #, java-format msgid "See {0} for help." -msgstr "Yardım için {0}'a bakınız." +msgstr "Yardım için {0} bölümüne bakın." #: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:318 msgid "reseed configuration page" -msgstr "tekrar düğümleme düzenleşim sayfası" +msgstr "yeniden tohumlama ayarları sayfası" #: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:566 #: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:697 msgid "Reseeding: fetching seed URL." -msgstr "Tekrar düğümleniyor: düğüm URL'sini alıyor." +msgstr "Yeniden tohumlanıyor: tohum İnternet adresi alınıyor." #: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:623 #: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:733 #, java-format msgid "" "Reseeding: fetching router info from seed URL ({0} successful, {1} errors)." -msgstr "Tekrar düğümleniyor: yönlendirici bilgilerini düğümleme URL''sinden alıyor ({0} başarılı, {1} hatalı)." +msgstr "Yeniden tohumlanıyor: Tohum İnternet adresinden yöneltici bilgileri alınıyor ({0} başarılı, {1} hata)." #. NOTE TO TRANSLATORS - each of these phrases is a description for a #. statistic @@ -326,19 +326,19 @@ msgstr "Tekrar düğümleniyor: yönlendirici bilgilerini düğümleme URL''sind #. Please keep relatively short so it will fit on the graphs. #: ../../../router/java/src/net/i2p/router/tasks/CoalesceStatsEvent.java:33 msgid "Message receive rate (bytes/sec)" -msgstr "" +msgstr "İleti alma hızı (bayt/saniye)" #: ../../../router/java/src/net/i2p/router/tasks/CoalesceStatsEvent.java:34 msgid "Message send rate (bytes/sec)" -msgstr "" +msgstr "İleti gönderme hızı (bayt/saniye)" #: ../../../router/java/src/net/i2p/router/tasks/CoalesceStatsEvent.java:35 msgid "Low-level send rate (bytes/sec)" -msgstr "" +msgstr "Düşük düzey gönderme hızı (bayt/saniye)" #: ../../../router/java/src/net/i2p/router/tasks/CoalesceStatsEvent.java:36 msgid "Low-level receive rate (bytes/sec)" -msgstr "" +msgstr "Düşük düzey alma hızı (bayt/saniye)" #: ../../../router/java/src/net/i2p/router/tasks/CoalesceStatsEvent.java:37 msgid "How many peers we are actively talking with" @@ -346,25 +346,25 @@ msgstr "Etkin olarak görüşülen eş sayısı" #: ../../../router/java/src/net/i2p/router/tasks/CoalesceStatsEvent.java:40 msgid "Known fast peers" -msgstr "" +msgstr "Bilinen hızlı eşler" #: ../../../router/java/src/net/i2p/router/tasks/CoalesceStatsEvent.java:41 msgid "Known integrated (floodfill) peers" -msgstr "" +msgstr "Bilinen tümleştirilmiş (floodfill) eşler" #: ../../../router/java/src/net/i2p/router/tasks/CoalesceStatsEvent.java:42 msgid "Size of tunnel acceptor backlog" -msgstr "" +msgstr "Tünel onaylayıcı geri günlüğünün boyutu" #: ../../../router/java/src/net/i2p/router/transport/CommSystemFacadeImpl.java:502 msgid "NetDb entry" -msgstr "NetDb girişi" +msgstr "NetDb kaydı" #. This used to be "no common transports" but it is almost always no #. transports at all #: ../../../router/java/src/net/i2p/router/transport/GetBidsJob.java:73 msgid "No transports (hidden or starting up?)" -msgstr "Taşıma yok (gizli mi, yeni mi başlıyor?)" +msgstr "Aktarım yok (gizli ya da yeni mi başlıyor)" #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:601 msgid "Unsupported signature type" @@ -372,11 +372,11 @@ msgstr "Desteklenmeyen imza tipi" #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:618 msgid "No support for our signature type" -msgstr "" +msgstr "İmza tipimiz desteklenmiyor" #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:622 msgid "Unreachable on any transport" -msgstr "Hiçbir taşımada erişilebilir değil" +msgstr "Hiçbir aktarım için erişilebilir değil" #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:674 #: ../../../router/java/src/net/i2p/router/transport/UPnP.java:565 @@ -391,17 +391,17 @@ msgstr "Durum" #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:692 msgid "Router Transport Addresses" -msgstr "Yönlendirici Taşıma Adresleri" +msgstr "Yöneltici Aktarım Adresleri" #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:700 #, java-format msgid "{0} is used for outbound connections only" -msgstr "{0} yalnızca giden bağlantılar içindir." +msgstr "{0} yalnız giden bağlantılar için kullanılır" #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:711 #: ../../../router/java/src/net/i2p/router/transport/UPnPManager.java:283 msgid "UPnP is not enabled" -msgstr "UPnp etkin değil" +msgstr "UPnP etkin değil" #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:720 #: ../java/src/net/i2p/router/web/HomeHelper.java:34 @@ -413,13 +413,13 @@ msgstr "Yardım" msgid "" "Your transport connection limits are automatically set based on your " "configured bandwidth." -msgstr "Taşıma bağlantı sınırlarınız ayarlı kuşak genişliğiniz taban alınarak otomatikman belirlenmiştir." +msgstr "Aktarım bağlantı sınırlarınız ayarlanmış bant genişliğinize göre kendiliğinden belirlenmiştir." #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:723 msgid "" "To override these limits, add the settings i2np.ntcp.maxConnections=nnn and " "i2np.udp.maxConnections=nnn on the advanced configuration page." -msgstr "Bu sınırları geçersiz kılmak için i2np.ntcp.maxConnections=nnn ve i2np.udp.maxConnections=nnn ayarlarını gelişmiş ayarlar sayfasında ekleyin." +msgstr "Bu sınırları değiştirmek için gelişmiş ayarlar bölümünden i2np.ntcp.maxConnections=nnn ve i2np.udp.maxConnections=nnn ayarlarını ekleyin." #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:725 #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:266 @@ -445,7 +445,7 @@ msgstr "Uzak eş, yönlendirici hash'i tarafından tespit edilmiş" #: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:1353 #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2477 msgid "Dir" -msgstr "Dizin" +msgstr "Klasör" #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:728 msgid "Inbound connection" @@ -479,15 +479,15 @@ msgstr "Boşta" #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2484 #: ../java/src/net/i2p/router/web/TunnelRenderer.java:162 msgid "In/Out" -msgstr "Girdi/Çıktı" +msgstr "Giriş/Çıkış" #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:736 msgid "The smoothed inbound / outbound transfer rate (KBytes per second)" -msgstr "Düzleştirilmiş gelen / giden aktarım oranı (saniyede KBayt)" +msgstr "Düzeltilmiş gelen / giden aktarım hızı (KBayt/saniye)" #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:737 msgid "How long ago this connection was established" -msgstr "" +msgstr "Bu bağlantının ne kadar zaman önce kurulduğu" #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:737 #: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:1357 @@ -500,7 +500,7 @@ msgstr "Yukarı" #: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:1358 #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2491 msgid "Skew" -msgstr "Kayma" +msgstr "Sapma" #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:738 msgid "The difference between the peer's clock and your own" @@ -510,7 +510,7 @@ msgstr "Eşin ve sizin saatleriniz arasındaki ayrım" msgid "" "The congestion window, which is how many bytes can be sent without an " "acknowledgement" -msgstr "Tıkanıklık penceresi, yani bir onay olmadan kaç bayt gönderilebileceği" +msgstr "Tıkanma eşiği, bir onay olmadan kaç bayt gönderilebileceğini belirler" #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:740 msgid "The number of sent messages awaiting acknowledgement" @@ -518,11 +518,11 @@ msgstr "Onay bekleyen gönderilmiş ileti sayısı" #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:741 msgid "The maximum number of concurrent messages to send" -msgstr "" +msgstr "Aynı gönderilebilecek en fazla ileti sayısı" #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:742 msgid "The number of pending sends which exceed congestion window" -msgstr "Tıkanıklık penceresini aşan ve gönderilmeyi bekleyen ileti sayısı" +msgstr "Tıkanma eşiğini aşan ve gönderilmeyi bekleyen ileti sayısı" #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:743 msgid "The slow start threshold" @@ -530,20 +530,20 @@ msgstr "Yavaş başlangıç eşiği" #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:744 msgid "The round trip time in milliseconds" -msgstr "Milisaniyelerle gidiş-dönüş" +msgstr "Milisaniye cinsinden gidiş-dönüş süresi" #. "").append(_("Dev")).append(": ").append(_("The #. standard deviation of the round trip time in #. milliseconds")).append("
\n" + #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:746 msgid "The retransmit timeout in milliseconds" -msgstr "Milisaniylerle yeniden iletim zaman aşımı" +msgstr "Milisaniye cinsinden yeniden aktarım zaman aşımı" #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:747 msgid "" "Current maximum send packet size / estimated maximum receive packet size " "(bytes)" -msgstr "Mevcut azami gönderilen paket boyu / tahmini azami alınan paket boyu (bayt)" +msgstr "Geçerli en büyük gönderilen paket boyutu / öngörülen en büyük alınan paket boyutu (bayt)" #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:748 #: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:1359 @@ -572,7 +572,7 @@ msgstr "Dup TX" #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:750 msgid "The total number of packets retransmitted to the peer" -msgstr "Eşe yeniden iletilen paket sayısı" +msgstr "Eşe yeniden aktarılan toplam paket sayısı" #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:751 #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2515 @@ -581,7 +581,7 @@ msgstr "Dup RX" #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:751 msgid "The total number of duplicate packets received from the peer" -msgstr "Eşten alınan çifte paket sayısı" +msgstr "Eşten alınan toplam çift paket sayısı" #: ../../../router/java/src/net/i2p/router/transport/UPnP.java:560 #: ../java/src/net/i2p/router/web/ConfigNavHelper.java:26 @@ -590,27 +590,27 @@ msgstr "Hizmet" #: ../../../router/java/src/net/i2p/router/transport/UPnP.java:564 msgid "WAN Common Interface Configuration" -msgstr "" +msgstr "Ortak WAN Arabirimi Ayarları" #: ../../../router/java/src/net/i2p/router/transport/UPnP.java:567 #: ../../../router/java/src/net/i2p/router/transport/UPnP.java:587 #: ../../../router/java/src/net/i2p/router/transport/UPnP.java:614 msgid "Type" -msgstr "" +msgstr "Tip" #: ../../../router/java/src/net/i2p/router/transport/UPnP.java:569 #: ../../../router/java/src/net/i2p/router/transport/UPnP.java:589 msgid "Upstream" -msgstr "" +msgstr "Yükleme" #: ../../../router/java/src/net/i2p/router/transport/UPnP.java:571 #: ../../../router/java/src/net/i2p/router/transport/UPnP.java:591 msgid "Downstream" -msgstr "" +msgstr "İndirme" #: ../../../router/java/src/net/i2p/router/transport/UPnP.java:575 msgid "WAN PPP Connection" -msgstr "" +msgstr "WAN PPP Bağlantısı" #: ../../../router/java/src/net/i2p/router/transport/UPnP.java:583 #: ../../../router/java/src/net/i2p/router/transport/UPnP.java:610 @@ -622,31 +622,31 @@ msgstr "Çalışma süresi" #: ../../../router/java/src/net/i2p/router/transport/UPnP.java:593 #: ../../../router/java/src/net/i2p/router/transport/UPnP.java:616 msgid "External IP" -msgstr "" +msgstr "Dış IP Adresi" #: ../../../router/java/src/net/i2p/router/transport/UPnP.java:597 msgid "Layer 3 Forwarding" -msgstr "" +msgstr "Layer 3 İletme" #: ../../../router/java/src/net/i2p/router/transport/UPnP.java:598 msgid "Default Connection Service" -msgstr "" +msgstr "Varsayılan Bağlantı Hizmeti" #: ../../../router/java/src/net/i2p/router/transport/UPnP.java:602 msgid "WAN IP Connection" -msgstr "" +msgstr "WAN IP Bağlantısı" #: ../../../router/java/src/net/i2p/router/transport/UPnP.java:620 msgid "WAN Ethernet Link Configuration" -msgstr "" +msgstr "WAN Ethernet Bağlantısı Ayarı" #: ../../../router/java/src/net/i2p/router/transport/UPnP.java:641 msgid "Found Device" -msgstr "" +msgstr "Aygıt Bulundu" #: ../../../router/java/src/net/i2p/router/transport/UPnP.java:643 msgid "Subdevice" -msgstr "" +msgstr "Alt aygıt" #: ../../../router/java/src/net/i2p/router/transport/UPnP.java:664 msgid "UPnP Status" @@ -654,13 +654,13 @@ msgstr "UPnP Durumu" #: ../../../router/java/src/net/i2p/router/transport/UPnP.java:668 msgid "Disabled UPnP Devices" -msgstr "" +msgstr "UPnP Aygıtlarını Devre Dışı Bırak" #: ../../../router/java/src/net/i2p/router/transport/UPnP.java:682 msgid "" "UPnP has been disabled; Do you have more than one UPnP Internet Gateway " "Device on your LAN ?" -msgstr "" +msgstr "UPnP devre dışı bırakıldı. yerel ağınızda birden fazla UPnP İnternet geçidi olabilir mi?" #: ../../../router/java/src/net/i2p/router/transport/UPnP.java:685 msgid "UPnP has not found any UPnP-aware, compatible device on your LAN." @@ -673,7 +673,7 @@ msgstr "" #: ../../../router/java/src/net/i2p/router/transport/UPnP.java:695 msgid "The current external IP address is not available." -msgstr "" +msgstr "Geçerli dış IP adresi kullanılamıyor." #: ../../../router/java/src/net/i2p/router/transport/UPnP.java:699 #, java-format @@ -692,12 +692,12 @@ msgstr "" #: ../../../router/java/src/net/i2p/router/transport/UPnP.java:709 #, java-format msgid "{0} port {1,number,#####} was successfully forwarded by UPnP." -msgstr "" +msgstr "{0} kapısı {1,number,#####} UPnP tarafından yönlendirildi." #: ../../../router/java/src/net/i2p/router/transport/UPnP.java:711 #, java-format msgid "{0} port {1,number,#####} was not forwarded by UPnP." -msgstr "" +msgstr "{0} kapısı {1,number,#####} UPnP tarafından yönlendirilmedi." #: ../../../router/java/src/net/i2p/router/transport/ntcp/EstablishState.java:561 #: ../../../router/java/src/net/i2p/router/transport/ntcp/EstablishState.java:877 @@ -749,7 +749,7 @@ msgstr "Giden" #, java-format msgid "{0} peer" msgid_plural "{0} peers" -msgstr[0] "" +msgstr[0] "{0} eş" #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2465 msgid "UDP connections" @@ -757,7 +757,7 @@ msgstr "UDP bağlantılari" #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2475 msgid "Sort by peer hash" -msgstr "Eş hash'lerine göre sırala" +msgstr "Eş karmasına göre sırala" #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2477 msgid "Direction/Introduction" @@ -765,19 +765,19 @@ msgstr "Yönerge/Giriş" #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2480 msgid "Sort by idle inbound" -msgstr "Boşta gelenlere göre sırala" +msgstr "Geliş boşta beklemesine göre sırala" #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2482 msgid "Sort by idle outbound" -msgstr "Boşta gidenlere göre sırala" +msgstr "Gidiş boşta beklemesine göre sırala" #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2485 msgid "Sort by inbound rate" -msgstr "Gelen oranına göre sırala" +msgstr "Geliş hızına göre sırala" #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2487 msgid "Sort by outbound rate" -msgstr "Giden oranına göre sırala" +msgstr "Gidiş hızına göre sırala" #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2490 msgid "Sort by connection uptime" @@ -785,7 +785,7 @@ msgstr "Bağlantı süresine göre sırala" #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2492 msgid "Sort by clock skew" -msgstr "Saat kaymasına göre sırala" +msgstr "Saat sapmasına göre sırala" #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2495 msgid "Sort by congestion window" @@ -801,11 +801,11 @@ msgstr "Gidiş-dönüş süresine göre sırala" #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2504 msgid "Sort by retransmission timeout" -msgstr "Yeniden iletim zaman aşımına göre sırala" +msgstr "Yeniden aktarım zaman aşımına göre sırala" #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2507 msgid "Sort by outbound maximum transmit unit" -msgstr "Giden azami iletim birimine göre sırala" +msgstr "Gidiş en fazla aktarım birimine göre sırala" #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2509 msgid "Sort by packets sent" @@ -817,7 +817,7 @@ msgstr "Alınan paketlere göre sırala" #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2514 msgid "Sort by packets retransmitted" -msgstr "Yeniden iletilen paketlere göre sırala" +msgstr "Yeniden aktarılan paketlere göre sırala" #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2516 msgid "Sort by packets received more than once" @@ -833,7 +833,7 @@ msgstr "Bize tanıştırma önerildi" #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2542 msgid "Choked" -msgstr "Tıkalı" +msgstr "Tıkanmış" #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2550 msgid "1 fail" @@ -849,7 +849,7 @@ msgstr "{0} başarısızlık" #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:166 #: ../java/src/net/i2p/router/web/ProfilesHelper.java:13 msgid "Banned" -msgstr "Yasaklı" +msgstr "Yasaklanmış" #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2617 msgid "backlogged" @@ -861,20 +861,20 @@ msgstr "Tünel istekleri atılıyor: Çok yavaş" #: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:260 msgid "Dropping tunnel requests: High job lag" -msgstr "" +msgstr "Tünel istekleri atılıyor: Yüksek görev gecikmesi" #. don't even bother, since we are so overloaded locally #: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:451 msgid "Dropping tunnel requests: Overloaded" -msgstr "Tünel istekleri atılıyor: Aşırı yük" +msgstr "Tünel istekleri atılıyor: Aşırı yüklenme" #: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:693 msgid "Rejecting tunnels: Hidden mode" -msgstr "" +msgstr "Tüneller red ediliyor: Gizli kip" #: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:721 msgid "Rejecting tunnels: Request overload" -msgstr "Tüneller reddediliyor: İstek aşırı yükü" +msgstr "Tüneller reddediliyor: İstek aşırı yüklenmiş" #: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:752 msgid "Rejecting tunnels: Connection limit" @@ -883,31 +883,31 @@ msgstr "Tüneller reddediliyor: Bağlantı sınırı" #: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:964 #: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:997 msgid "Dropping tunnel requests: High load" -msgstr "Tünel istekleri atılıyor: Yüksek yük" +msgstr "Tünel istekleri atılıyor: Yüksek yüklenme" #: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:1076 msgid "Dropping tunnel requests: Queue time" -msgstr "Tünel talepleri atılıyor: Kuyruk süresi" +msgstr "Tünel istekleri atılıyor: Kuyruk süresi" #: ../java/src/net/i2p/router/update/ConsoleUpdateManager.java:884 #, java-format msgid "New plugin version {0} is available" -msgstr "Yeni eklenti sürümü {0} mevcut" +msgstr "Yeni uygulama eki {0} sürümü yayınlanmış" #: ../java/src/net/i2p/router/update/ConsoleUpdateManager.java:964 #, java-format msgid "Update check failed for plugin {0}" -msgstr "{0} eklentisi için güncelleme denetimi başarısız" +msgstr "{0} uygulama eki güncellemesi denetlenemedi" #: ../java/src/net/i2p/router/update/ConsoleUpdateManager.java:968 #, java-format msgid "No new version is available for plugin {0}" -msgstr "{0} eklentisi için yeni sürüm mevcut değil" +msgstr "{0} uygulama eki için yeni bir sürüm yayınlanmamış" #: ../java/src/net/i2p/router/update/ConsoleUpdateManager.java:992 #, java-format msgid "{0}B transferred" -msgstr "{0}B iletildi" +msgstr "{0}B aktarıldı" #: ../java/src/net/i2p/router/update/ConsoleUpdateManager.java:1051 #, java-format @@ -964,7 +964,7 @@ msgstr "{0} üzerine kopyalanamadı" #: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:177 #: ../java/src/net/i2p/router/web/PluginStarter.java:157 msgid "HTTP client proxy tunnel must be running" -msgstr "" +msgstr "HTTP istemci vekil sunucu tüneli çalışıyor olmalıdır" #. set status before thread to ensure UI feedback #: ../java/src/net/i2p/router/update/DevSU3UpdateHandler.java:91 @@ -977,26 +977,26 @@ msgstr "Güncelleniyor" #: ../java/src/net/i2p/router/update/NewsFetcher.java:209 msgid "In-network updates disabled. Check package manager." -msgstr "" +msgstr "Ağ içi güncellemeler devre dışı. Paket yöneticisini denetleyin." #: ../java/src/net/i2p/router/update/NewsFetcher.java:215 msgid "No write permission for I2P install directory." -msgstr "" +msgstr "I2P kurulum klasörüne yazma izni yok." #: ../java/src/net/i2p/router/update/NewsFetcher.java:223 #, java-format msgid "You must first update to version {0}" -msgstr "" +msgstr "Önce {0} sürümüne güncellemelisiniz" #: ../java/src/net/i2p/router/update/NewsFetcher.java:233 #, java-format msgid "Requires Java version {0} but installed Java version is {1}" -msgstr "" +msgstr "Java {0} sürümü gerekli ancak yüklü Java sürümü {1}" #: ../java/src/net/i2p/router/update/PluginUpdateChecker.java:62 #, java-format msgid "Checking for update of plugin {0}" -msgstr "{0} eklentisi için güncellemeler denetleniyor" +msgstr "{0} uygulama ekinin güncellemesi denetleniyor" #: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:90 #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:519 @@ -1004,33 +1004,33 @@ msgstr "{0} eklentisi için güncellemeler denetleniyor" #: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:72 #, java-format msgid "Bad URL {0}" -msgstr "" +msgstr "{0} İnternet adresi geçersiz" #: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:95 #, java-format msgid "Attempting to install from file {0}" -msgstr "" +msgstr "{0} dosyasından yüklenmeye çalışılıyor" #: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:98 #, java-format msgid "Failed to install from file {0}, copy failed." -msgstr "" +msgstr "{0} dosyasından yüklenemedi, kopyalanamadı" #: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:118 #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:530 #, java-format msgid "Downloading plugin from {0}" -msgstr "{0}'dan eklenti indiriliyor" +msgstr "Uygulama eki {0} üzerinden indiriliyor" #: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:139 msgid "Plugin downloaded" -msgstr "Eklenti indirildi" +msgstr "Uygulama eki indirildi" #: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:144 #: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:506 #, java-format msgid "Cannot create plugin directory {0}" -msgstr "{0} eklenti dizni yaratılamıyor" +msgstr "{0} uygulama eki klasörü oluşturulamadı" #. updateStatus("" + "Plugin contains an invalid key" + ' ' + pubkey + ' ' #. + signer + ""); @@ -1039,7 +1039,7 @@ msgstr "{0} eklenti dizni yaratılamıyor" #: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:318 #, java-format msgid "Plugin from {0} contains an invalid key" -msgstr "{0}'dan gelen eklenti geçersiz anahtar içeriyor" +msgstr "{0} üzerinden alınan uygulama eki içindeki anahtar geçersiz" #: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:247 #: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:257 @@ -1047,90 +1047,90 @@ msgstr "{0}'dan gelen eklenti geçersiz anahtar içeriyor" #: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:329 #, java-format msgid "Plugin signature verification of {0} failed" -msgstr "{0} için eklenti imzası onaylaması başarısız oldu" +msgstr "{0} için uygulama eki imzası doğrulanamadı" #. don't display signer, we're really checking the key not the signer name #: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:280 msgid "Plugin not installed - signer is untrusted" -msgstr "" +msgstr "Uygulama eki yüklenemedi - imzalayana güvenilmiyor" #: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:345 #, java-format msgid "Plugin from {0} is corrupt" -msgstr "{0}'dan gelen eklenti bozuk" +msgstr "{0} üzerinden alınan uygulama eki bozuk" #: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:355 #, java-format msgid "Plugin from {0} does not contain the required configuration file" -msgstr "{0}'dan gelen eklenti gerekli düzenleşim dosyasını içermiyor" +msgstr "{0} üzerinden alınan uygulama ekinde bulunması gereken ayar dosyası yok" #: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:377 #, java-format msgid "Plugin from {0} has invalid name or version" -msgstr "{0}'dan gelen eklenti geçersiz isim'e veya versiyon'a sahip " +msgstr "{0} üzerinden alınan uygulama ekinin adı ya da sürümü geçersiz" #: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:382 #, java-format msgid "Plugin {0} has mismatched versions" -msgstr "{0} eklentisinin uyuşmayan sürümleri var" +msgstr "{0} uygulama ekinin sürümleri uyuşmuyor" #: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:393 #, java-format msgid "This plugin requires I2P version {0} or higher" -msgstr "Bu eklenti I2P sürüm {0} veya üstünü gerektirir" +msgstr "Bu uygulama eki için I2P {0} sürümü ya da üzeri gereklidir" #: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:401 #, java-format msgid "This plugin requires Java version {0} or higher" -msgstr "Bu eklenti Java sürüm {0} veya üstünü gerektirir" +msgstr "Bu uygulama eki için Java {0} sürümü ya da üzeri gerekir" #: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:410 msgid "" "Downloaded plugin is for new installs only, but the plugin is already " "installed" -msgstr "İndirilmiş eklenti sadece yeni yüklemeler için geçerli, fakat halihazırda eklenti yüklenmiş durumda" +msgstr "İndirilmiş uygulama eki yalnız yeni yüklemeler için kullanılabilir, ancak uygulama eki zaten yüklü" #: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:420 msgid "Installed plugin does not contain the required configuration file" -msgstr "Yüklenmiş eklenti gerekli düzenleşim dosyasını içermiyor" +msgstr "Yüklenmiş uygulama ekin bulunaması gereken ayar dosyası yok" #: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:428 msgid "Signature of downloaded plugin does not match installed plugin" -msgstr "İndirilmiş eklentinin imzası yüklü eklentinin imzası ile uyuşmuyor" +msgstr "İndirilmiş uygulama ekini imzası yüklü uygulama eki ile uyuşmuyor" #: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:435 #, java-format msgid "Downloaded plugin version {0} is not newer than installed plugin" -msgstr "İndirilmiş eklenti sürüm {0} yüklü olan eklentiden daha yeni değil" +msgstr "İndirilen uygulama ekinin sürümü {0} yüklü olan uygulama ekinden daha yeni değil" #: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:442 #, java-format msgid "Plugin update requires installed plugin version {0} or higher" -msgstr "Eklenti güncellemesi yüklü eklentinin sürüm {0} ve üstünü gerektiriyor" +msgstr "Uygulama ekinin güncellenebilmesi için yüklenmiş uygulama eki sürümü {0} ya da üzerinde olmalıdır" #: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:449 #, java-format msgid "Plugin update requires installed plugin version {0} or lower" -msgstr "Uygulama eki güncellenmesi için yüklenmiş uygulama eki sürümü {0} ya da daha düşük olmalıdır" +msgstr "Uygulama ekinin güncellenebilmesi için yüklenmiş uygulama eki sürümü {0} ya da altında olmalıdır" #: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:457 #, java-format msgid "Plugin requires Jetty version {0} or higher" -msgstr "" +msgstr "Uygulama eki için Jetty {0} ya da üzerindeki bir sürüm gerekli" #: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:464 #, java-format msgid "Plugin requires Jetty version {0} or lower" -msgstr "" +msgstr "Uygulama eki için Jetty {0} ya da önceki bir sürüm gerekli" #: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:473 #, java-format msgid "Cannot copy plugin to directory {0}" -msgstr "" +msgstr "Uygulama eki {0} klasörüne kopyalanamadı" #: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:483 msgid "Plugin will be installed on next restart." -msgstr "" +msgstr "Uygulama eki sonraki yeniden başlatmada yüklenecek" #: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:501 msgid "Plugin is for upgrades only, but the plugin is not installed" @@ -1179,7 +1179,7 @@ msgstr "{0} üzerinde yeni bir sürüm bulunamadı" #: ../java/src/net/i2p/router/web/BanlistRenderer.java:65 msgid "Permanently banned" -msgstr "" +msgstr "Kalıcı olarak yasaklandı" #: ../java/src/net/i2p/router/web/BanlistRenderer.java:67 #, java-format @@ -1189,7 +1189,7 @@ msgstr "Geçici yasaklama {0} içinde kaldırılacak" #: ../java/src/net/i2p/router/web/BanlistRenderer.java:69 #, java-format msgid "Banned until restart or in {0}" -msgstr "Yeniden başlatılana ya da {0} yapılana kadar yasaklı" +msgstr "Yeniden başlatılana kadar ya da {0} süresince yasaklı" #: ../java/src/net/i2p/router/web/BanlistRenderer.java:82 msgid "unban now" @@ -1290,17 +1290,17 @@ msgstr "yasağı kaldırın" #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/webmail_jsp.java:235 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/webmail_jsp.java:237 msgid "I2P Router Console" -msgstr "I2P Yönlendirici Sergeni" +msgstr "I2P Yöneltici Konsolu" #: ../java/src/net/i2p/router/web/ConfigAdvancedHandler.java:62 msgid "Error updating the configuration - please see the error logs" -msgstr "Düzenleşimi güncellerken hata - lütfen hata kütüklerine bakınız" +msgstr "Ayarlar güncellenirken bir sorun çıktı - lütfen hata günlüklerine bakın" #: ../java/src/net/i2p/router/web/ConfigAdvancedHandler.java:72 #: ../java/src/net/i2p/router/web/ConfigAdvancedHandler.java:96 #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:389 msgid "Configuration saved successfully" -msgstr "Düzenleşim başarıyla saklandı" +msgstr "Ayarlar kaydedildi" #: ../java/src/net/i2p/router/web/ConfigAdvancedHandler.java:74 #: ../java/src/net/i2p/router/web/ConfigAdvancedHandler.java:98 @@ -1310,18 +1310,18 @@ msgstr "Düzenleşim başarıyla saklandı" msgid "" "Error saving the configuration (applied but not saved) - please see the " "error logs" -msgstr "Düzenleşim kaydedilirken hata (uygulandı ancak kaydedilmedi) - lütfen hata kütüklerine bakınız" +msgstr "Ayarlar kaydedilirken bir sorun çıktı (uygulandı ancak kaydedilmedi) - lütfen hata günlüklerine bakın" #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:48 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:506 msgid "Save Client Configuration" -msgstr "İstemci Düzenleşimini Kaydet" +msgstr "İstemci Ayarlarını Kaydet" #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:52 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:572 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:576 msgid "Save Interface Configuration" -msgstr "Arayüz Düzenleşimini Kaydet" +msgstr "Arabirim Ayarlarını Kaydet" #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:56 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:592 @@ -1331,55 +1331,55 @@ msgstr "WebApp Ayarlarını Kaydedin" #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:61 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:609 msgid "Save Plugin Configuration" -msgstr "Eklenti Düzenleşimini Kaydet" +msgstr "Uygulama Eki Ayarlarını Kaydet" #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:68 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:625 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:629 msgid "Install Plugin" -msgstr "Eklenti Yükle" +msgstr "Uygulama Eki Yükle" #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:77 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:639 msgid "Install Plugin from File" -msgstr "" +msgstr "Dosyadan Uygulama Eki Yükle" #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:86 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:650 msgid "Update All Installed Plugins" -msgstr "" +msgstr "Tüm Yüklü Uygulama Eklerini Güncelle" #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:138 #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:175 #, java-format msgid "Error stopping plugin {0}" -msgstr "{0} eklentisini durdururken hata" +msgstr "{0} eklentisi durdurulurken bir sorun çıktı" #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:143 #, java-format msgid "Deleted plugin {0}" -msgstr "{0} eklentisi silindi" +msgstr "{0} uygullama eki silindi" #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:145 #, java-format msgid "Error deleting plugin {0}" -msgstr "{0} eklentisini silerken hata" +msgstr "{0} uygulama eki silinirken bir sorun çıktı" #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:170 #, java-format msgid "Stopped plugin {0}" -msgstr "{0} eklentisi durduruldu" +msgstr "{0} uygulama eki durduruldu" #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:180 #, java-format msgid "Stopped webapp {0}" -msgstr "" +msgstr "Webapp {0} durduruldu" #. label (IE) #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:209 #: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:352 msgid "Start" -msgstr "Başla" +msgstr "Başlat" #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:282 msgid "New client added" @@ -1387,36 +1387,36 @@ msgstr "Yeni istemci eklendi" #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:287 msgid "Client configuration saved successfully" -msgstr "" +msgstr "İstemci ayarları kaydedildi" #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:297 #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:323 #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:338 msgid "Bad client index." -msgstr "Kötü istemci dizni." +msgstr "İstemci dizini kötü" #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:306 #, java-format msgid "Client {0} stopped" -msgstr "" +msgstr "{0} istemcisi durduruldu" #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:328 #, java-format msgid "Client {0} started" -msgstr "" +msgstr "{0} istemcisi başlatıldı" #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:343 #, java-format msgid "Client {0} deleted" -msgstr "" +msgstr "{0} istemcisi siilindi" #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:358 msgid "WebApp configuration saved." -msgstr "WebApp düzenleşimi kaydedildi." +msgstr "WebApp ayarları kaydedildi." #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:372 msgid "Plugin configuration saved." -msgstr "Eklenti düzenleşimi kaydedildi." +msgstr "Uygulama eki ayarları kaydedildi." #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:387 #: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:202 @@ -1425,11 +1425,11 @@ msgstr "WebApp" #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:387 msgid "started" -msgstr "başladı" +msgstr "başlatıldı" #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:389 msgid "Failed to start" -msgstr "Başlayamadı" +msgstr "Başlatılamadı" #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:394 msgid "Failed to find server." @@ -1437,60 +1437,60 @@ msgstr "Sunucu bulunamadı." #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:400 msgid "No plugin URL specified." -msgstr "Eklenti URL'si belirtilmedi." +msgstr "Uygulama ekinin İnternet adresi belirtilmemiş." #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:421 #: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:79 msgid "You must enter a file" -msgstr "" +msgstr "Bir dosya belirtmelisiniz" #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:464 msgid "Install from file failed" -msgstr "" +msgstr "Dosyadan yüklenemedi" #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:479 #, java-format msgid "No update URL specified for {0}" -msgstr "{0} için güncelleme URL'si belirtilmedi." +msgstr "{0} için bir güncelleme İnternet adresi belirtilmemiş" #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:488 #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:512 msgid "Plugin or update download already in progress." -msgstr "Eklenti veya güncelleme indirme daha sürüyor." +msgstr "Uygulama eki ya da güncelleme indirmesi sürüyor." #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:493 msgid "Updating all plugins" -msgstr "" +msgstr "Tüm uygulama ekleri güncelleniyor" #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:528 #, java-format msgid "Installing plugin from {0}" -msgstr "" +msgstr "Uygulama eki {0} üzerinden yükleniyor" #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:549 #, java-format msgid "Checking plugin {0} for updates" -msgstr "{0} eklentisi güncellemeler için denetleniyor" +msgstr "{0} uygulama ekinin güncellemeleri denetleniyor" #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:580 #, java-format msgid "Started plugin {0}" -msgstr "{0} eklentisi başladı" +msgstr "{0} uygulama eki başlatıldı" #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:582 #, java-format msgid "Error starting plugin {0}" -msgstr "{0} eklentisi başlatılırken hata" +msgstr "{0} uygulama eki başlatılırken bir sorun çıktı" #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:604 #: ../java/src/net/i2p/router/web/ConfigUIHandler.java:93 #, java-format msgid "Added user {0}" -msgstr "" +msgstr "{0} kullanıcısı eklendi" #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:619 msgid "Interface configuration saved" -msgstr "" +msgstr "Arabirim ayarları kaydedildi" #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:620 #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:342 @@ -1498,7 +1498,7 @@ msgstr "" #: ../java/src/net/i2p/router/web/ConfigUIHandler.java:94 #: ../java/src/net/i2p/router/web/ConfigUIHandler.java:118 msgid "Restart required to take effect" -msgstr "" +msgstr "Değişikliklerin etkili olması için yeniden başlatmalısınız" #: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:98 #: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:359 @@ -1520,7 +1520,7 @@ msgstr "İstemci" #: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:203 #: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:232 msgid "Run at Startup?" -msgstr "Başlangıçta Çalıştır?" +msgstr "Başlangıçta Çalıştırılsın" #: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:118 #: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:204 @@ -1530,17 +1530,17 @@ msgstr "Denetim" #: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:119 msgid "Class and arguments" -msgstr "Sınıf ve argümanlar" +msgstr "Sınıf ve değişkenler" #: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:205 #: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:234 #: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:284 msgid "Description" -msgstr "Tanım" +msgstr "Açıklama" #: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:231 msgid "Plugin" -msgstr "Eklenti" +msgstr "Uygulama Eki" #: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:248 #: ../java/src/net/i2p/router/web/NetDbRenderer.java:337 @@ -1559,7 +1559,7 @@ msgstr "Tarih" #: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:273 msgid "Author" -msgstr "Yazar" +msgstr "Geliştirici" #: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:289 msgid "License" @@ -1594,7 +1594,7 @@ msgstr "Güncelle" #: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:369 #, java-format msgid "Are you sure you want to delete {0}?" -msgstr "{0}ı silmek istediğinize emin misiniz?" +msgstr "{0} ögesini silmek istediğinize emin misiniz?" #: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:371 msgid "Delete" @@ -1609,7 +1609,7 @@ msgstr "Sil" #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confighome_jsp.java:532 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:473 msgid "Delete selected" -msgstr "" +msgstr "Seçilmişleri silin" #: ../java/src/net/i2p/router/web/ConfigHomeHandler.java:22 #: ../java/src/net/i2p/router/web/ConfigSummaryHandler.java:23 @@ -1621,14 +1621,14 @@ msgstr "" #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confighome_jsp.java:530 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confighome_jsp.java:538 msgid "Add item" -msgstr "" +msgstr "Öge ekleyin" #: ../java/src/net/i2p/router/web/ConfigHomeHandler.java:23 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confighome_jsp.java:500 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confighome_jsp.java:520 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confighome_jsp.java:536 msgid "Restore defaults" -msgstr "" +msgstr "Varsayılanları geri yükleyin" #: ../java/src/net/i2p/router/web/ConfigHomeHandler.java:24 #: ../java/src/net/i2p/router/web/ConfigSummaryHandler.java:26 @@ -1637,33 +1637,33 @@ msgstr "" #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configsidebar_jsp.java:486 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:542 msgid "Save" -msgstr "" +msgstr "Kaydet" #: ../java/src/net/i2p/router/web/ConfigHomeHandler.java:29 msgid "Home page changed" -msgstr "" +msgstr "Ana sayfa değiştirildi" #: ../java/src/net/i2p/router/web/ConfigHomeHandler.java:51 msgid "Restored default settings" -msgstr "" +msgstr "Varsayılan ayarlar geri yüklendi" #: ../java/src/net/i2p/router/web/ConfigHomeHandler.java:63 msgid "No name entered" -msgstr "" +msgstr "Bir ad yazmalısınız" #: ../java/src/net/i2p/router/web/ConfigHomeHandler.java:68 msgid "No URL entered" -msgstr "" +msgstr "Bİr İnternet adresi yazmalısınız" #: ../java/src/net/i2p/router/web/ConfigHomeHandler.java:84 #: ../java/src/net/i2p/router/web/ConfigSummaryHandler.java:81 msgid "Added" -msgstr "" +msgstr "Eklendi" #: ../java/src/net/i2p/router/web/ConfigHomeHandler.java:101 #: ../java/src/net/i2p/router/web/ConfigSummaryHandler.java:107 msgid "Removed" -msgstr "" +msgstr "Silindi" #: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:18 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:505 @@ -1673,21 +1673,21 @@ msgstr "Anahtar ekle" #: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:19 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:503 msgid "Delete key" -msgstr "Anahtar sil" +msgstr "Anahtarı sil" #: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:21 msgid "You must enter a destination" -msgstr "Bir hedef girmelisiniz" +msgstr "Bir hedef yazmalısınız" #: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:23 msgid "You must enter a key" -msgstr "Bir anahtar girmelisiniz" +msgstr "Bir anahtar yazmalısınız" #: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:34 #: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:41 #: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:43 msgid "Key for" -msgstr "" +msgstr "Şunun anahtarı" #: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:34 msgid "added to keyring" @@ -1695,42 +1695,42 @@ msgstr "anahtarlığa eklendi" #: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:36 msgid "Invalid destination or key" -msgstr "Geçersiz hedef veya anahtar" +msgstr "Hedef ya da anahtar geçersiz" #: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:41 msgid "removed from keyring" -msgstr "anahtarlıktan silindi" +msgstr "anahtarlıktan çıkarıldı" #: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:43 msgid "not found in keyring" -msgstr "anahtarlıkta bulunmadı" +msgstr "anahtarlıkta bulunamadı" #: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:45 msgid "Invalid destination" -msgstr "Geçersiz hedef" +msgstr "Hedef geçersiz" #: ../java/src/net/i2p/router/web/ConfigLoggingHandler.java:82 msgid "Log overrides updated" -msgstr "" +msgstr "Günlük değişiklikleri güncellendi" #: ../java/src/net/i2p/router/web/ConfigLoggingHandler.java:163 msgid "Log configuration saved" -msgstr "Kütük düzenleşimi kaydedildi" +msgstr "Günlük ayarları kaydedildi" #: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:45 msgid "" "Add additional logging statements above. Example: net.i2p.router.tunnel=WARN" -msgstr "Yukarıya ek kütük deyimleri ekleyin. Örnek: net.i2p.router.tunnel=UYAR" +msgstr "Yukarıdan ek günlük durumları ekleyin. Örnek: net.i2p.router.tunnel=UYAR" #: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:46 msgid "" "Or put entries in the logger.config file. Example: " "logger.record.net.i2p.router.tunnel=WARN" -msgstr "Veya girdileri logger.config dosyasına koyun. Örnek: logger.record.net.i2p.router.tunnel=UYAR" +msgstr "Ya da kayıtları logger.config dosyasına ekleyin. Örnek: logger.record.net.i2p.router.tunnel=UYAR" #: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:47 msgid "Valid levels are DEBUG, INFO, WARN, ERROR, CRIT" -msgstr "AYIKLA, BİLGİ, UYAR, HATA ve ACİL geçerli düzeylerdir." +msgstr "Geçerli düzeyler: AYIKLA, BİLGİ, UYAR, HATA ve ACİL" #. Homeland Security Advisory System #. http://www.dhs.gov/xinfoshare/programs/Copy_of_press_release_0046.shtm @@ -1768,7 +1768,7 @@ msgstr "Sil" #: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:122 msgid "Select a class to add" -msgstr "Eklemek için sınıf seçin" +msgstr "Eklenecek sınıfı seçin" #. stat groups for stats.jsp #: ../java/src/net/i2p/router/web/ConfigNavHelper.java:25 @@ -1778,7 +1778,7 @@ msgstr "Bant genişliği" #: ../java/src/net/i2p/router/web/ConfigNavHelper.java:25 msgid "Home Page" -msgstr "" +msgstr "Ana Sayfa" #: ../java/src/net/i2p/router/web/ConfigNavHelper.java:25 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:328 @@ -1830,7 +1830,7 @@ msgstr "Ağ" #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/viewprofile_jsp.java:292 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/webmail_jsp.java:310 msgid "Summary Bar" -msgstr "" +msgstr "Özet Çubuğu" #: ../java/src/net/i2p/router/web/ConfigNavHelper.java:25 msgid "UI" @@ -1854,7 +1854,7 @@ msgstr "Anahtarlık" #: ../java/src/net/i2p/router/web/ConfigNavHelper.java:27 msgid "Logging" -msgstr "Kütük" +msgstr "Günlükleme" #: ../java/src/net/i2p/router/web/ConfigNavHelper.java:27 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:185 @@ -1893,16 +1893,16 @@ msgstr "IP adresi güncelleniyor" #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:234 msgid "Updating IPv6 setting" -msgstr "" +msgstr "IPv6 ayarları güncelleniyor" #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:251 msgid "Disabling TCP completely" -msgstr "TCP bütünüyle devre dışı bırakılıyor" +msgstr "TCP tümüyle devre dışı bırakılıyor" #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:256 #, java-format msgid "Updating TCP address to {0}" -msgstr "" +msgstr "TCP adresi {0} olarak güncelleniyor " #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:263 msgid "Disabling inbound TCP" @@ -1910,31 +1910,31 @@ msgstr "Gelen TCP devre dışı bırakılıyor" #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:265 msgid "Updating inbound TCP address to auto" -msgstr "Gelen TCP adresi kendiliğinden olarak güncelleniyor" +msgstr "Gelen TCP adresi otomatik olarak güncelleniyor" #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:278 #, java-format msgid "Updating TCP port to {0}" -msgstr "" +msgstr "TCP kapısı {0} olarak güncelleniyor" #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:280 #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:305 msgid "Warning - ports less than 1024 are not recommended" -msgstr "" +msgstr "Uyarı - 1024 değerinden küçük kapı değerlerinin kullanılması önerilmez" #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:284 #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:311 msgid "Invalid port" -msgstr "" +msgstr "Kapı geçersiz" #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:289 msgid "Updating inbound TCP port to auto" -msgstr "Gelen TCP kapısı kendiliğinden olarak güncelleniyor" +msgstr "Gelen TCP kapısı otomatik olarak güncelleniyor" #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:303 #, java-format msgid "Updating UDP port to {0}" -msgstr "" +msgstr "UDP kapısı {0} olarak güncelleniyor" #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:328 msgid "Gracefully restarting into Hidden Router Mode" @@ -1946,11 +1946,11 @@ msgstr "Gizli Yönlendirici Kipi'nden çıkmak için incelikle yeniden başlatı #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:339 msgid "Enabling UPnP" -msgstr "" +msgstr "UPnP etkinleştiriliyor" #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:341 msgid "Disabling UPnP" -msgstr "" +msgstr "UPnP devre dışı bırakılıyor" #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:350 msgid "Enabling laptop mode" @@ -1962,19 +1962,19 @@ msgstr "Dizüstü kipi devre dışı bırakılıyor" #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:359 msgid "Disabling inbound IPv4" -msgstr "" +msgstr "Geliş için IPv4 devre dışı bırakılıyor" #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:361 msgid "Enabling inbound IPv4" -msgstr "" +msgstr "Geliş için IPv4 etkinleştiriliyor" #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:369 msgid "Disabling UDP" -msgstr "" +msgstr "UDP devre dışı bırakılıyor" #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:371 msgid "Enabling UDP" -msgstr "" +msgstr "UDP devre dışı bırakılıyor" #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:378 msgid "Requiring SSU introducers" @@ -1982,7 +1982,7 @@ msgstr "SSU tanıştırıcıları gerekiyor" #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:436 msgid "Invalid address" -msgstr "" +msgstr "Adres geçersiz" #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:442 #, java-format @@ -1991,11 +1991,11 @@ msgstr "" #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:467 msgid "Updating bandwidth share percentage" -msgstr "Kuşak genişliği pay yüzdesi güncelleniyor" +msgstr "Bant genişliği paylaşım yüzdesi güncelleniyor" #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:497 msgid "Updated bandwidth limits" -msgstr "Kuşak genişliği sınırları güncellendi" +msgstr "Bant genişliği sınırlamaları güncellendi" #: ../java/src/net/i2p/router/web/ConfigNetHelper.java:46 #: ../java/src/net/i2p/router/web/ConfigNetHelper.java:49 @@ -2004,32 +2004,32 @@ msgstr "bilinmeyen" #: ../java/src/net/i2p/router/web/ConfigNetHelper.java:256 msgid "bits per second" -msgstr "saniye başına bit" +msgstr "saniyedeki bit" #: ../java/src/net/i2p/router/web/ConfigNetHelper.java:257 #, java-format msgid "or {0} bytes per month maximum" -msgstr "veya ay başına azami {0} bayt" +msgstr "ya da aylık en fazla {0} bayt" #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:20 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:496 msgid "Ban peer until restart" -msgstr "Yeniden başlatana dek eşi yasakla" +msgstr "Yeniden başlatılana dek eşi yasakla" #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:23 #, java-format msgid "Manually banned via {0}" -msgstr "{0} ile elle yasaklandı" +msgstr "{0} tarafından el ile yasaklandı" #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:24 msgid "banned until restart" -msgstr "yeniden başlayana dek yasaklı" +msgstr "yeniden başlatılana dek yasaklı" #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:27 #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:38 #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:59 msgid "Invalid peer" -msgstr "Geçersiz eş" +msgstr "Eş geçersiz" #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:28 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:498 @@ -2038,24 +2038,24 @@ msgstr "Eşin yasağını kaldır" #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:33 msgid "unbanned" -msgstr "yasak kalktı" +msgstr "yasak kaldırıldı" #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:35 msgid "is not currently banned" -msgstr "yasaklı değil" +msgstr "şu anda yasaklı değil" #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:39 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:524 msgid "Adjust peer bonuses" -msgstr "Eş primlerini ayarla" +msgstr "Eş hediyelerini ayarla" #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:47 msgid "Bad speed value" -msgstr "Kötü hız değeri" +msgstr "Hız değer kötü" #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:52 msgid "Bad capacity value" -msgstr "Kötü kapasite değeri" +msgstr "Kapasite değeri kötü" #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:61 msgid "Unsupported" @@ -2064,54 +2064,54 @@ msgstr "Desteklenmiyor" #: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:24 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:589 msgid "Save changes and reseed now" -msgstr "Değişiklikleri kaydet ve tekrar düğümle" +msgstr "Değişiklikleri kaydet ve yeniden tohumla" #: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:27 #: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:49 msgid "Reseeding is already in progress" -msgstr "Halihazırda tekrar düğümleme süreci içinde" +msgstr "Yeniden tohumlama işlemi sürüyor" #. skip the nonce checking in ReseedHandler #: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:30 msgid "Starting reseed process" -msgstr "Tekrar düğümleme süreci başlatılıyor" +msgstr "Yeniden tohumlama süreci başlatılıyor" #: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:32 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:491 msgid "Reseed from URL" -msgstr "" +msgstr "İnternet Adresinden Yeniden Tohumla" #: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:37 msgid "You must enter a URL" -msgstr "" +msgstr "Bir İnternet adresi yazmalısınız" #: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:66 msgid "Reseed in progress, check summary bar for status" -msgstr "" +msgstr "Yeniden tohumlama sürüyor, durum için özet çubuğuna bakın" #: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:68 msgid "Reseed complete, check summary bar for status" -msgstr "" +msgstr "Yeniden tohumlama tamamlandı, durum için özet çubuğuna bakın" #: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:74 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:503 msgid "Reseed from file" -msgstr "" +msgstr "Dosyadan yeniden tohumla" #: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:84 #: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:91 msgid "Reseed from file failed" -msgstr "" +msgstr "Dosyadan yeniden tohumlanamadı" #: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:86 #, java-format msgid "Reseed successful, loaded {0} router info from file" msgid_plural "Reseed successful, loaded {0} router infos from file" -msgstr[0] "" +msgstr[0] "Yeniden tohumlandı, dosyadan {0} yöneltici bilgisi yüklendi" #: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:149 msgid "Configuration saved successfully." -msgstr "Düzenleşim başarıyla kaydedildi" +msgstr "Ayarlar kaydedildi." #. Normal browsers send value, IE sends button label #: ../java/src/net/i2p/router/web/ConfigRestartBean.java:34 @@ -2119,21 +2119,21 @@ msgstr "Düzenleşim başarıyla kaydedildi" #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:208 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:473 msgid "Shutdown immediately" -msgstr "Derhal kapat" +msgstr "Hemen kapat" #. ctx.router().shutdown(Router.EXIT_HARD); // never returns #. give the UI time to respond #: ../java/src/net/i2p/router/web/ConfigRestartBean.java:39 msgid "Cancel shutdown" -msgstr "Kapanmayı iptal et" +msgstr "Kapatmayı iptal et" #: ../java/src/net/i2p/router/web/ConfigRestartBean.java:40 msgid "Cancel restart" -msgstr "Yeniden başlamayı iptal et" +msgstr "Yeniden başlatmayı iptal et" #: ../java/src/net/i2p/router/web/ConfigRestartBean.java:42 msgid "Restart immediately" -msgstr "Derhal yeniden başlat" +msgstr "Hemen yeniden başlat" #. ctx.router().shutdown(Router.EXIT_HARD_RESTART); // never returns #. give the UI time to respond @@ -2148,16 +2148,16 @@ msgstr "Kapat" #: ../java/src/net/i2p/router/web/ConfigRestartBean.java:65 msgid "Restart imminent" -msgstr "Yeniden başlamak üzere" +msgstr "Yeniden başlatılmak üzere" #: ../java/src/net/i2p/router/web/ConfigRestartBean.java:67 msgid "Shutdown imminent" -msgstr "Kapanmak üzere" +msgstr "Kapatılmak üzere" #: ../java/src/net/i2p/router/web/ConfigRestartBean.java:71 #, java-format msgid "Shutdown in {0}" -msgstr "{0} içinde kapanıyor" +msgstr "{0} içinde kapatılıyor" #: ../java/src/net/i2p/router/web/ConfigRestartBean.java:74 #: ../java/src/net/i2p/router/web/ConfigRestartBean.java:85 @@ -2169,7 +2169,7 @@ msgstr[0] "" #: ../java/src/net/i2p/router/web/ConfigRestartBean.java:82 #, java-format msgid "Restart in {0}" -msgstr "{0} içinde yeniden başlıyor" +msgstr "{0} içinde yeniden başlatılıyor" #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:199 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:471 @@ -2226,12 +2226,12 @@ msgstr "" #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:232 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:519 msgid "Run I2P on startup" -msgstr "I2P'yi başlangıçta çalıştır" +msgstr "Başlangıçta I2P çalıştırılsın" #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:234 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:521 msgid "Don't run I2P on startup" -msgstr "I2P'yi başlangıçta çalıştırma" +msgstr "Başlangıçta I2P çalıştırılmasın" #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:236 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:545 @@ -2246,20 +2246,20 @@ msgstr "" #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:244 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:553 msgid "View console on startup" -msgstr "Başlangıçta sergeni görüntüle" +msgstr "Başlangıçta konsol görüntülensin" #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:246 msgid "Console is to be shown on startup" -msgstr "Başlangıçta sergen gösterilecek" +msgstr "Başlangıçta konsol görüntülenecek" #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:247 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:555 msgid "Do not view console on startup" -msgstr "Başlangıçta sergen görüntülenecek" +msgstr "Başlangıçta konsol görüntülenmesin" #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:249 msgid "Console is not to be shown on startup" -msgstr "Başlangıçta sergen görüntülenmeyecek" +msgstr "Başlangıçta konsol görüntülenmeyecek" #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:250 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:541 @@ -2272,7 +2272,7 @@ msgstr "" #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:261 msgid "Service installed" -msgstr "Hizmet Yüklendi" +msgstr "Hizmet yüklendi" #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:263 msgid "Warning: unable to install the service" @@ -2284,7 +2284,7 @@ msgstr "Hizmet silindi" #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:272 msgid "Warning: unable to remove the service" -msgstr "Uyarı: Hitmet silinemiyor" +msgstr "Uyarı: Hitmet silinemedi" #: ../java/src/net/i2p/router/web/ConfigStatsHandler.java:116 msgid "Stat filter and location updated successfully to" @@ -2292,11 +2292,11 @@ msgstr "" #: ../java/src/net/i2p/router/web/ConfigStatsHandler.java:119 msgid "Full statistics enabled" -msgstr "" +msgstr "Tam istatistikler etkinleştirildi" #: ../java/src/net/i2p/router/web/ConfigStatsHandler.java:121 msgid "Full statistics disabled" -msgstr "" +msgstr "Tam istatistikler devre dışı bırakıldı" #: ../java/src/net/i2p/router/web/ConfigStatsHandler.java:125 #, java-format @@ -2307,35 +2307,35 @@ msgstr "" #: ../java/src/net/i2p/router/web/ConfigSummaryHandler.java:24 msgid "Save order" -msgstr "" +msgstr "Sıralamayı kaydedin" #: ../java/src/net/i2p/router/web/ConfigSummaryHandler.java:31 msgid "Refresh interval changed" -msgstr "" +msgstr "Yenileme sıklığı değiştirildi" #: ../java/src/net/i2p/router/web/ConfigSummaryHandler.java:33 #, java-format msgid "Refresh interval must be at least {0} seconds" -msgstr "" +msgstr "Yenileme sıklığı en az {0} saniye olmalıdır" #: ../java/src/net/i2p/router/web/ConfigSummaryHandler.java:35 msgid "Refresh interval must be a number" -msgstr "" +msgstr "Yenileme sıklığı bir sayı olmalıdır" #: ../java/src/net/i2p/router/web/ConfigSummaryHandler.java:38 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configsidebar_jsp.java:494 msgid "Restore full default" -msgstr "" +msgstr "Tüm varsayılanları geri yükleyin" #: ../java/src/net/i2p/router/web/ConfigSummaryHandler.java:40 msgid "Full summary bar default restored." -msgstr "" +msgstr "Tüm özet çubuğu varsayılanları geri yüklendi" #: ../java/src/net/i2p/router/web/ConfigSummaryHandler.java:41 #: ../java/src/net/i2p/router/web/ConfigSummaryHandler.java:45 #: ../java/src/net/i2p/router/web/ConfigSummaryHandler.java:137 msgid "Summary bar will refresh shortly." -msgstr "" +msgstr "Özet çubuğu kısa süre içinde yenilenecek." #: ../java/src/net/i2p/router/web/ConfigSummaryHandler.java:42 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configsidebar_jsp.java:496 @@ -2350,34 +2350,34 @@ msgstr "" #: ../java/src/net/i2p/router/web/ConfigSummaryHandler.java:83 #: ../java/src/net/i2p/router/web/ConfigSummaryHandler.java:131 msgid "Order must be an integer" -msgstr "" +msgstr "Sıralama bir tamsayı olmalıdır" #: ../java/src/net/i2p/router/web/ConfigSummaryHandler.java:68 msgid "No section selected" -msgstr "" +msgstr "Bir bölüm seçilmemiş" #: ../java/src/net/i2p/router/web/ConfigSummaryHandler.java:73 msgid "No order entered" -msgstr "" +msgstr "Bir sıralama yazılmamış" #: ../java/src/net/i2p/router/web/ConfigSummaryHandler.java:129 msgid "Moved" -msgstr "" +msgstr "Taşındı" #: ../java/src/net/i2p/router/web/ConfigSummaryHandler.java:136 msgid "Saved order of sections." -msgstr "" +msgstr "Bölüm sıralaması kaydedildi." #. the count isn't really correct anyway, since we don't check for actual #. changes #. addFormNotice("Updated settings for " + updated + " pools."); #: ../java/src/net/i2p/router/web/ConfigTunnelsHandler.java:130 msgid "Updated settings for all pools." -msgstr "Tüm havuzlar için ayarlar güncellendi." +msgstr "Tüm havuzların ayarları güncellendi." #: ../java/src/net/i2p/router/web/ConfigTunnelsHandler.java:135 msgid "Exploratory tunnel configuration saved successfully." -msgstr "Araştırma tünel düzenleşimi başarıyla kaydedildi." +msgstr "Araştırma tüneli ayarları kaydedildi." #: ../java/src/net/i2p/router/web/ConfigTunnelsHandler.java:137 #: ../java/src/net/i2p/router/web/ConfigUIHandler.java:73 @@ -2386,7 +2386,7 @@ msgstr "Araştırma tünel düzenleşimi başarıyla kaydedildi." msgid "" "Error saving the configuration (applied but not saved) - please see the " "error logs." -msgstr "Düzenleşim kaydedilirken hata (uygulandı ancak kaydedilmedi) - lütfen hata kütüklerine bakınız." +msgstr "Ayarlar kaydedilirken bir sorun çıktı (uygulandı ancak kaydedilmedi) - lütfen hata günlüklerine bakın." #. * dummies for translation #: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:14 @@ -2425,7 +2425,7 @@ msgstr "BAŞARIM UYARISI - Ayarlar çok uzun tüneller içeriyor." #: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:89 msgid "PERFORMANCE WARNING - Settings include high tunnel quantities." -msgstr "BAŞARIM UYARISI - Ayarlar yüksek tünel nicelikleri içeriyor." +msgstr "BAŞARIM UYARISI - Ayarlar çok fazla sayıda tünel içeriyor." #: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:97 msgid "Length" @@ -2434,7 +2434,7 @@ msgstr "Uzunluk" #. tunnel depth variance #: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:114 msgid "Randomization" -msgstr "Rasgeleleştirme" +msgstr "Rastgeleleştirme" #: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:139 msgid "Quantity" @@ -2442,7 +2442,7 @@ msgstr "Nicelik" #: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:157 msgid "Backup quantity" -msgstr "Yedek niceliği" +msgstr "Yedekleme sayısı" #: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:179 msgid "Inbound options" @@ -2456,11 +2456,11 @@ msgstr "Giden ayarları" #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:471 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:477 msgid "Add user" -msgstr "" +msgstr "Kullanıcı ekle" #: ../java/src/net/i2p/router/web/ConfigUIHandler.java:63 msgid "Theme change saved." -msgstr "Biçem değişikliği kaydedildi." +msgstr "Tema değişikliği kaydedildi." #: ../java/src/net/i2p/router/web/ConfigUIHandler.java:65 #: ../java/src/net/i2p/router/web/ConfigUIHandler.java:70 @@ -2469,20 +2469,20 @@ msgstr "Görmek için sayfayı yenileyin." #: ../java/src/net/i2p/router/web/ConfigUIHandler.java:68 msgid "Mobile console option saved." -msgstr "" +msgstr "Mobil konsol ayarları kaydedildi." #: ../java/src/net/i2p/router/web/ConfigUIHandler.java:80 msgid "No user name entered" -msgstr "" +msgstr "Bir kullanıcı adı yazmalısınız" #: ../java/src/net/i2p/router/web/ConfigUIHandler.java:85 msgid "No password entered" -msgstr "" +msgstr "Bir parola yazmalısınız" #: ../java/src/net/i2p/router/web/ConfigUIHandler.java:111 #, java-format msgid "Removed user {0}" -msgstr "" +msgstr "{0} kullanıcısı silindi" #: ../java/src/net/i2p/router/web/ConfigUIHelper.java:25 msgid "Set theme universally across all apps" @@ -2494,15 +2494,15 @@ msgstr "" #: ../java/src/net/i2p/router/web/ConfigUIHelper.java:76 msgid "Arabic" -msgstr "" +msgstr "Arapça" #: ../java/src/net/i2p/router/web/ConfigUIHelper.java:77 msgid "Czech" -msgstr "" +msgstr "Çekce" #: ../java/src/net/i2p/router/web/ConfigUIHelper.java:78 msgid "Danish" -msgstr "" +msgstr "Danimarkaca" #: ../java/src/net/i2p/router/web/ConfigUIHelper.java:79 msgid "German" @@ -2510,11 +2510,11 @@ msgstr "Almanca" #: ../java/src/net/i2p/router/web/ConfigUIHelper.java:80 msgid "Estonian" -msgstr "" +msgstr "Estonca" #: ../java/src/net/i2p/router/web/ConfigUIHelper.java:81 msgid "Greek" -msgstr "" +msgstr "Yunanca" #: ../java/src/net/i2p/router/web/ConfigUIHelper.java:82 msgid "English" @@ -2526,7 +2526,7 @@ msgstr "İspanyolca" #: ../java/src/net/i2p/router/web/ConfigUIHelper.java:84 msgid "Finnish" -msgstr "" +msgstr "Fince" #: ../java/src/net/i2p/router/web/ConfigUIHelper.java:85 msgid "French" @@ -2534,19 +2534,19 @@ msgstr "Fransızca" #: ../java/src/net/i2p/router/web/ConfigUIHelper.java:86 msgid "Hungarian" -msgstr "" +msgstr "Macarca" #: ../java/src/net/i2p/router/web/ConfigUIHelper.java:87 msgid "Italian" -msgstr "" +msgstr "İtalyanca" #: ../java/src/net/i2p/router/web/ConfigUIHelper.java:88 msgid "Japanese" -msgstr "" +msgstr "Japonca" #: ../java/src/net/i2p/router/web/ConfigUIHelper.java:89 msgid "Malagasy" -msgstr "" +msgstr "Malagazca" #: ../java/src/net/i2p/router/web/ConfigUIHelper.java:90 msgid "Dutch" @@ -2554,11 +2554,11 @@ msgstr "Felemence" #: ../java/src/net/i2p/router/web/ConfigUIHelper.java:91 msgid "Norwegian Bokmaal" -msgstr "" +msgstr "Norveç Bokmaal" #: ../java/src/net/i2p/router/web/ConfigUIHelper.java:92 msgid "Polish" -msgstr "" +msgstr "Lehçe" #: ../java/src/net/i2p/router/web/ConfigUIHelper.java:93 #: ../java/src/net/i2p/router/web/ConfigUIHelper.java:94 @@ -2567,7 +2567,7 @@ msgstr "Portekizce" #: ../java/src/net/i2p/router/web/ConfigUIHelper.java:95 msgid "Romanian" -msgstr "" +msgstr "Romence" #: ../java/src/net/i2p/router/web/ConfigUIHelper.java:96 msgid "Russian" @@ -2575,7 +2575,7 @@ msgstr "Rusça" #: ../java/src/net/i2p/router/web/ConfigUIHelper.java:97 msgid "Slovak" -msgstr "" +msgstr "Slovakça" #: ../java/src/net/i2p/router/web/ConfigUIHelper.java:98 msgid "Swedish" @@ -2583,15 +2583,15 @@ msgstr "İsveççe" #: ../java/src/net/i2p/router/web/ConfigUIHelper.java:99 msgid "Turkish" -msgstr "" +msgstr "Türkçe" #: ../java/src/net/i2p/router/web/ConfigUIHelper.java:100 msgid "Ukrainian" -msgstr "" +msgstr "Ukraynaca" #: ../java/src/net/i2p/router/web/ConfigUIHelper.java:101 msgid "Vietnamese" -msgstr "" +msgstr "Vietnamca" #: ../java/src/net/i2p/router/web/ConfigUIHelper.java:102 msgid "Chinese" @@ -2599,65 +2599,65 @@ msgstr "Çince" #: ../java/src/net/i2p/router/web/ConfigUIHelper.java:166 msgid "Add a user and password to enable." -msgstr "" +msgstr "Etkinleştirmek için bir kullanıcı adı ve parola yazın." #: ../java/src/net/i2p/router/web/ConfigUIHelper.java:172 msgid "User Name" -msgstr "" +msgstr "Kullanıcı Adı" #: ../java/src/net/i2p/router/web/ConfigUIHelper.java:183 #: ../java/src/net/i2p/router/web/HomeHelper.java:235 #: ../java/src/net/i2p/router/web/SummaryHelper.java:972 msgid "Add" -msgstr "" +msgstr "Ekle" #: ../java/src/net/i2p/router/web/ConfigUIHelper.java:186 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:562 msgid "Password" -msgstr "" +msgstr "Parola" #: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:167 msgid "Update or check already in progress" -msgstr "" +msgstr "Güncelleme ya da denetim sürüyor" #: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:190 msgid "Update available, attempting to download now" -msgstr "Güncelleme mevcut, şimdi indirmeye çalışılıyor" +msgstr "Güncelleme yayınlanmış, şimdi indirilmeye çalışılıyor" #: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:192 msgid "Update available, click button on left to download" -msgstr "Güncelleme mevcut, indirmek için soldaki düğmeye tıklayın" +msgstr "Güncelleme yayınlanmış, indirmek için soldaki düğmeye tıklayın" #: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:198 msgid "No update available" -msgstr "Güncelleme mevcut değil" +msgstr "Yayınlanmış bir güncelleme yok" #: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:216 #, java-format msgid "Updating news URL to {0}" -msgstr "" +msgstr "Haber İnternet adresi {0} olarak güncelleniyor" #: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:223 #: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:231 #: ../java/src/net/i2p/router/web/ConfigUpdateHelper.java:54 #: ../java/src/net/i2p/router/web/ConfigUpdateHelper.java:60 msgid "internal" -msgstr "" +msgstr "iç" #: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:227 #, java-format msgid "Updating proxy host to {0}" -msgstr "" +msgstr "Vekil sunucu {0} olarak güncelleniyor" #: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:235 #, java-format msgid "Updating proxy port to {0}" -msgstr "" +msgstr "Vekil sunucu kapısı {0} olarak güncelleniyor" #: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:251 #, java-format msgid "Updating refresh frequency to {0}" -msgstr "" +msgstr "Yenileme sıklığı {0} olarak güncelleniyor" #: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:252 #: ../java/src/net/i2p/router/web/ConfigUpdateHelper.java:130 @@ -2668,11 +2668,11 @@ msgstr "Asla" #: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:259 #, java-format msgid "Updating update policy to {0}" -msgstr "" +msgstr "Güncelleme ilkesi {0} olarak güncelleniyor" #: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:268 msgid "Updating update URLs." -msgstr "Güncelleme URLleri güncelleniyor." +msgstr "Güncelleme İnternet adresleri güncelleniyor." #: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:280 msgid "Updating trusted keys." @@ -2681,16 +2681,16 @@ msgstr "Güvenilen anahtarlar güncelleniyor." #: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:292 #, java-format msgid "Updating unsigned update URL to {0}" -msgstr "" +msgstr "İmzalanmamış güncelleme adresi {0} olarak güncelleniyor" #: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:304 #, java-format msgid "Updating signed development build URL to {0}" -msgstr "" +msgstr "İmzalanmış geliştirme yapımı adresi {0} olarak güncelleniyor" #: ../java/src/net/i2p/router/web/ConfigUpdateHelper.java:132 msgid "Every" -msgstr "Hep" +msgstr "Her" #: ../java/src/net/i2p/router/web/ConfigUpdateHelper.java:150 msgid "Notify only" @@ -2698,122 +2698,122 @@ msgstr "Yalnızca bildir" #: ../java/src/net/i2p/router/web/ConfigUpdateHelper.java:157 msgid "Download and verify only" -msgstr "Yalnızca indir ve onayla" +msgstr "Yalnızca indir ve doğrula" #: ../java/src/net/i2p/router/web/ConfigUpdateHelper.java:165 msgid "Download, verify, and restart" -msgstr "İndir, onayla ve yeniden başlat" +msgstr "İndir, doğrula ve yeniden başlat" #: ../java/src/net/i2p/router/web/EventLogHelper.java:34 msgid "Aborted startup" -msgstr "" +msgstr "Başlangıç durduruldu" #: ../java/src/net/i2p/router/web/EventLogHelper.java:35 msgid "Enabled floodfill" -msgstr "" +msgstr "Floodfill etkinleştirildi" #: ../java/src/net/i2p/router/web/EventLogHelper.java:36 msgid "Changed IP" -msgstr "" +msgstr "IP değiştirildi" #: ../java/src/net/i2p/router/web/EventLogHelper.java:37 msgid "Changed port" -msgstr "" +msgstr "Kapı değiştirildi" #: ../java/src/net/i2p/router/web/EventLogHelper.java:38 msgid "Clock shifted" -msgstr "" +msgstr "Saat kaydırıldı" #: ../java/src/net/i2p/router/web/EventLogHelper.java:39 msgid "Crashed" -msgstr "" +msgstr "Çöktü" #: ../java/src/net/i2p/router/web/EventLogHelper.java:40 msgid "Critical error" -msgstr "" +msgstr "Kritik hata" #: ../java/src/net/i2p/router/web/EventLogHelper.java:41 msgid "Installed new version" -msgstr "" +msgstr "Yeni sürüm yüklendi" #: ../java/src/net/i2p/router/web/EventLogHelper.java:42 msgid "Install failed" -msgstr "" +msgstr "Yüklenemedi" #: ../java/src/net/i2p/router/web/EventLogHelper.java:43 msgid "Network error" -msgstr "" +msgstr "Ağ hatası" #: ../java/src/net/i2p/router/web/EventLogHelper.java:44 #: ../java/src/net/i2p/router/web/EventLogHelper.java:48 msgid "New router identity" -msgstr "" +msgstr "Yeni yöneltici kimliği" #: ../java/src/net/i2p/router/web/EventLogHelper.java:45 msgid "Disabled floodfill" -msgstr "" +msgstr "Floodfill devre dışı bırakıldı" #: ../java/src/net/i2p/router/web/EventLogHelper.java:46 msgid "Out of memory error" -msgstr "" +msgstr "Bellek taşma hatası" #: ../java/src/net/i2p/router/web/EventLogHelper.java:47 msgid "Reachability change" -msgstr "" +msgstr "Erişilebilirlik değişimi" #: ../java/src/net/i2p/router/web/EventLogHelper.java:49 msgid "Reseeded router" -msgstr "" +msgstr "Yöneltici yeniden tohumlandı" #: ../java/src/net/i2p/router/web/EventLogHelper.java:50 msgid "Soft restart" -msgstr "" +msgstr "Yumuşak yeniden başlatma" #: ../java/src/net/i2p/router/web/EventLogHelper.java:51 msgid "Started router" -msgstr "" +msgstr "Yöneltici başlatıldı" #: ../java/src/net/i2p/router/web/EventLogHelper.java:52 msgid "Stopped router" -msgstr "" +msgstr "Yöneltici durduruldu" #: ../java/src/net/i2p/router/web/EventLogHelper.java:53 msgid "Updated router" -msgstr "" +msgstr "Yöneltici güncellendi" #: ../java/src/net/i2p/router/web/EventLogHelper.java:54 msgid "Watchdog warning" -msgstr "" +msgstr "Bekçi köğeği uyarısı" #: ../java/src/net/i2p/router/web/EventLogHelper.java:102 msgid "Display Events" -msgstr "" +msgstr "Görüntülenecek Etkinlikler" #: ../java/src/net/i2p/router/web/EventLogHelper.java:106 msgid "Events since" -msgstr "" +msgstr "Etkinlik başlangıcı" #: ../java/src/net/i2p/router/web/EventLogHelper.java:111 msgid "Event type" -msgstr "" +msgstr "Etkinlik tipi" #: ../java/src/net/i2p/router/web/EventLogHelper.java:117 #: ../java/src/net/i2p/router/web/EventLogHelper.java:148 msgid "All events" -msgstr "" +msgstr "Tüm etkinlikler" #: ../java/src/net/i2p/router/web/EventLogHelper.java:122 msgid "Filter events" -msgstr "" +msgstr "Etkinlikleri süzün" #: ../java/src/net/i2p/router/web/EventLogHelper.java:170 msgid "No events found" -msgstr "" +msgstr "Bir etkinlik bulunamadı" #: ../java/src/net/i2p/router/web/EventLogHelper.java:171 #, java-format msgid "No events found in previous {0}" -msgstr "" +msgstr "Önceki {0} içinde bir etkinlik bulunamadı" #: ../java/src/net/i2p/router/web/EventLogHelper.java:174 #, java-format @@ -2828,15 +2828,15 @@ msgstr "" #: ../java/src/net/i2p/router/web/EventLogHelper.java:179 #: ../java/src/net/i2p/router/web/JobQueueHelper.java:143 msgid "Time" -msgstr "" +msgstr "Zaman" #: ../java/src/net/i2p/router/web/EventLogHelper.java:182 msgid "Event" -msgstr "" +msgstr "Etkinlik" #: ../java/src/net/i2p/router/web/EventLogHelper.java:184 msgid "Details" -msgstr "" +msgstr "Ayrıntılar" #: ../java/src/net/i2p/router/web/FormHandler.java:251 msgid "" @@ -2848,11 +2848,11 @@ msgstr "Geçersiz form gönderisi, olasılıkla tarayıcınızın \"geri\" veya msgid "" "If the problem persists, verify that you have cookies enabled in your " "browser." -msgstr "" +msgstr "Sorun sürerse, tarayıcınızda çerezlerin etkinleştirilmiş olduğuna emin olun." #: ../java/src/net/i2p/router/web/GraphHelper.java:162 msgid "Combined bandwidth graph" -msgstr "Bileşik kuşak genişliği grafiği" +msgstr "Bileşik bant genişliği grafiği" #. e.g. "statname for 60m" #: ../java/src/net/i2p/router/web/GraphHelper.java:174 @@ -2873,61 +2873,61 @@ msgstr "" #: ../java/src/net/i2p/router/web/GraphHelper.java:253 msgid "Larger" -msgstr "" +msgstr "Daha Büyük" #: ../java/src/net/i2p/router/web/GraphHelper.java:259 msgid "Smaller" -msgstr "" +msgstr "Daha Küçük" #: ../java/src/net/i2p/router/web/GraphHelper.java:265 msgid "Taller" -msgstr "" +msgstr "Daha Uzun" #: ../java/src/net/i2p/router/web/GraphHelper.java:271 msgid "Shorter" -msgstr "" +msgstr "Daha Kısa" #: ../java/src/net/i2p/router/web/GraphHelper.java:277 msgid "Wider" -msgstr "" +msgstr "Daha Geniş" #: ../java/src/net/i2p/router/web/GraphHelper.java:283 msgid "Narrower" -msgstr "" +msgstr "Daha Dar" #: ../java/src/net/i2p/router/web/GraphHelper.java:290 msgid "Larger interval" -msgstr "" +msgstr "Daha büyük sıklık" #: ../java/src/net/i2p/router/web/GraphHelper.java:296 msgid "Smaller interval" -msgstr "" +msgstr "Daha küçük sıklık" #: ../java/src/net/i2p/router/web/GraphHelper.java:303 msgid "Previous interval" -msgstr "" +msgstr "Önceki sıklık" #: ../java/src/net/i2p/router/web/GraphHelper.java:314 msgid "Next interval" -msgstr "" +msgstr "Sonraki sıklık" #: ../java/src/net/i2p/router/web/GraphHelper.java:321 #: ../java/src/net/i2p/router/web/GraphHelper.java:361 msgid "Plot averages" -msgstr "Grafik ortalamaları" +msgstr "Ortalamalar çizilsin" #: ../java/src/net/i2p/router/web/GraphHelper.java:321 #: ../java/src/net/i2p/router/web/GraphHelper.java:362 msgid "plot events" -msgstr "çizelge olayları" +msgstr "olaylar çizilsin" #: ../java/src/net/i2p/router/web/GraphHelper.java:324 msgid "All times are UTC." -msgstr "" +msgstr "Tüm zamanlar UTC saat dilimindedir." #: ../java/src/net/i2p/router/web/GraphHelper.java:356 msgid "Configure Graph Display" -msgstr "Grafik Gösterimini Ayarlayın" +msgstr "Çizelge Görünümü Ayarları" #: ../java/src/net/i2p/router/web/GraphHelper.java:356 msgid "Select Stats" @@ -2935,7 +2935,7 @@ msgstr "İstatistikleri Seçin" #: ../java/src/net/i2p/router/web/GraphHelper.java:360 msgid "Periods" -msgstr "Dönemler" +msgstr "Aralıklar" #: ../java/src/net/i2p/router/web/GraphHelper.java:362 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:517 @@ -2944,7 +2944,7 @@ msgstr "ya da" #: ../java/src/net/i2p/router/web/GraphHelper.java:363 msgid "Image sizes" -msgstr "resim boyları" +msgstr "Görsel boyutları" #: ../java/src/net/i2p/router/web/GraphHelper.java:363 msgid "width" @@ -2965,15 +2965,15 @@ msgstr "Yenileme gecikmesi" #: ../java/src/net/i2p/router/web/GraphHelper.java:381 msgid "Store graph data on disk?" -msgstr "" +msgstr "Çizelge verisi diskte saklansın" #: ../java/src/net/i2p/router/web/GraphHelper.java:387 msgid "Save settings and redraw graphs" -msgstr "" +msgstr "Ayarlar kaydedilip çizelgeleri yeniden oluşturulsun" #: ../java/src/net/i2p/router/web/GraphHelper.java:443 msgid "Graph settings saved" -msgstr "Grafik ayarları kaydedildi" +msgstr "Çizelge ayarları kaydedildi" #: ../java/src/net/i2p/router/web/HomeHelper.java:29 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:229 @@ -2987,39 +2987,39 @@ msgstr "I2P hosts dosyasını buradan yönetin (I2P etki alanı çözümlemesi)" #: ../java/src/net/i2p/router/web/HomeHelper.java:30 msgid "Configure Bandwidth" -msgstr "" +msgstr "Bant Genişliği Ayarları" #: ../java/src/net/i2p/router/web/HomeHelper.java:30 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:330 msgid "I2P Bandwidth Configuration" -msgstr "" +msgstr "I2P Bant Genişliği Ayarları" #: ../java/src/net/i2p/router/web/HomeHelper.java:31 msgid "Configure Language" -msgstr "" +msgstr "Dil Ayarları" #: ../java/src/net/i2p/router/web/HomeHelper.java:31 msgid "Console Language Selection" -msgstr "" +msgstr "Konsol Dili Seçimi" #: ../java/src/net/i2p/router/web/HomeHelper.java:32 msgid "Customize Home Page" -msgstr "" +msgstr "Ana Sayfayı Özelleştirin" #: ../java/src/net/i2p/router/web/HomeHelper.java:32 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confighome_jsp.java:346 msgid "I2P Home Page Configuration" -msgstr "" +msgstr "I2P Ana Sayfa Ayarları" #: ../java/src/net/i2p/router/web/HomeHelper.java:33 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:139 msgid "Anonymous webmail client" -msgstr "Anonim webposta istemcisi" +msgstr "Anonim web posta istemcisi" #: ../java/src/net/i2p/router/web/HomeHelper.java:33 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:141 msgid "Email" -msgstr "" +msgstr "E-posta" #: ../java/src/net/i2p/router/web/HomeHelper.java:34 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:251 @@ -3029,7 +3029,7 @@ msgstr "I2P Yöneltici Yardımı" #: ../java/src/net/i2p/router/web/HomeHelper.java:35 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:161 msgid "Router Console" -msgstr "" +msgstr "Yöneltici Konsolu" #: ../java/src/net/i2p/router/web/HomeHelper.java:36 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:145 @@ -3044,7 +3044,7 @@ msgstr "Torrentler" #: ../java/src/net/i2p/router/web/HomeHelper.java:37 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:155 msgid "Local web server" -msgstr "" +msgstr "Yerel web sunucusu" #: ../java/src/net/i2p/router/web/HomeHelper.java:41 msgid "The Anoncoin project" @@ -3052,26 +3052,26 @@ msgstr "" #: ../java/src/net/i2p/router/web/HomeHelper.java:42 msgid "Bug Reports" -msgstr "" +msgstr "Hata Bildirimleri" #: ../java/src/net/i2p/router/web/HomeHelper.java:42 msgid "Bug tracker" -msgstr "" +msgstr "Hata izleyici" #. "colombo-bt.i2p" + S + _x("The Italian Bittorrent Resource") + S + "http #. ://colombo-bt.i2p/" + S + I + "colomboicon.png" + S + #: ../java/src/net/i2p/router/web/HomeHelper.java:44 msgid "Dev Forum" -msgstr "" +msgstr "Geliştirici Forumu" #: ../java/src/net/i2p/router/web/HomeHelper.java:44 msgid "Development forum" -msgstr "" +msgstr "Geliştirici Forumu" #: ../java/src/net/i2p/router/web/HomeHelper.java:45 #: ../java/src/net/i2p/router/web/HomeHelper.java:60 msgid "Bittorrent tracker" -msgstr "" +msgstr "Bittorrent izleyici" #: ../java/src/net/i2p/router/web/HomeHelper.java:45 msgid "diftracker" @@ -3079,23 +3079,23 @@ msgstr "" #: ../java/src/net/i2p/router/web/HomeHelper.java:46 msgid "I2P Applications" -msgstr "" +msgstr "I2P Uygulamaları" #: ../java/src/net/i2p/router/web/HomeHelper.java:47 msgid "FAQ" -msgstr "" +msgstr "SSS" #: ../java/src/net/i2p/router/web/HomeHelper.java:47 msgid "Frequently Asked Questions" -msgstr "" +msgstr "Sık Sorulan Sorular" #: ../java/src/net/i2p/router/web/HomeHelper.java:48 msgid "Community forum" -msgstr "" +msgstr "Topluluk forumu" #: ../java/src/net/i2p/router/web/HomeHelper.java:48 msgid "Forum" -msgstr "" +msgstr "Forum" #: ../java/src/net/i2p/router/web/HomeHelper.java:49 msgid "" @@ -3170,33 +3170,33 @@ msgstr "" #: ../java/src/net/i2p/router/web/HomeHelper.java:61 msgid "I2P home page" -msgstr "" +msgstr "I2P ana sayfası" #: ../java/src/net/i2p/router/web/HomeHelper.java:61 msgid "Project Website" -msgstr "" +msgstr "Proje Web Sitesi" #. "Salt" + S + "salt.i2p" + S + "http://salt.i2p/" + S + I + #. "salt_console.png" + S + #: ../java/src/net/i2p/router/web/HomeHelper.java:63 msgid "I2P Network Statistics" -msgstr "" +msgstr "I2P Ağ İstatistikleri" #: ../java/src/net/i2p/router/web/HomeHelper.java:64 msgid "Technical Docs" -msgstr "" +msgstr "Teknik Belgeler" #: ../java/src/net/i2p/router/web/HomeHelper.java:65 msgid "Trac Wiki" -msgstr "" +msgstr "Trac Wiki" #: ../java/src/net/i2p/router/web/HomeHelper.java:66 msgid "Ugha's Wiki" -msgstr "" +msgstr "Ugha's Wiki" #: ../java/src/net/i2p/router/web/HomeHelper.java:67 msgid "Seedless and the Robert BitTorrent applications" -msgstr "" +msgstr "Seedless ve Robert BitTorrent uygulamaları" #: ../java/src/net/i2p/router/web/HomeHelper.java:67 msgid "Sponge's main site" @@ -3204,7 +3204,7 @@ msgstr "" #: ../java/src/net/i2p/router/web/HomeHelper.java:108 msgid "The HTTP proxy is not up" -msgstr "" +msgstr "HTTP vekil sunucusu çalışmıyor" #: ../java/src/net/i2p/router/web/HomeHelper.java:110 #, java-format @@ -3214,11 +3214,11 @@ msgstr "" #: ../java/src/net/i2p/router/web/HomeHelper.java:210 #: ../java/src/net/i2p/router/web/SummaryHelper.java:906 msgid "Name" -msgstr "" +msgstr "Ad" #: ../java/src/net/i2p/router/web/HomeHelper.java:212 msgid "URL" -msgstr "" +msgstr "İnternet Adresi" #: ../java/src/net/i2p/router/web/JobQueueHelper.java:50 msgid "I2P Job Queue" @@ -3262,12 +3262,12 @@ msgstr "" #: ../java/src/net/i2p/router/web/JobQueueHelper.java:113 msgid "Total Job Statistics" -msgstr "" +msgstr "Toplam Görev İstatistikleri" #: ../java/src/net/i2p/router/web/JobQueueHelper.java:124 #: ../java/src/net/i2p/router/web/JobQueueHelper.java:141 msgid "Job" -msgstr "" +msgstr "Görev" #: ../java/src/net/i2p/router/web/JobQueueHelper.java:124 msgid "Queued" @@ -3284,26 +3284,26 @@ msgstr "" #: ../java/src/net/i2p/router/web/JobQueueHelper.java:143 #: ../java/src/net/i2p/router/web/JobQueueHelper.java:145 msgid "Avg" -msgstr "" +msgstr "Ortalama" #: ../java/src/net/i2p/router/web/JobQueueHelper.java:144 #: ../java/src/net/i2p/router/web/JobQueueHelper.java:146 msgid "Max" -msgstr "" +msgstr "En Büyük" #: ../java/src/net/i2p/router/web/JobQueueHelper.java:144 #: ../java/src/net/i2p/router/web/JobQueueHelper.java:146 msgid "Min" -msgstr "" +msgstr "En Küçük" #: ../java/src/net/i2p/router/web/JobQueueHelper.java:145 msgid "Pending" -msgstr "" +msgstr "Bekleyen" #: ../java/src/net/i2p/router/web/JobQueueHelper.java:197 #: ../java/src/net/i2p/router/web/NetDbHelper.java:16 msgid "Summary" -msgstr "" +msgstr "Özet" #: ../java/src/net/i2p/router/web/LogsHelper.java:49 #: ../java/src/net/i2p/router/web/LogsHelper.java:103 @@ -3316,38 +3316,38 @@ msgstr "Dosya bulunamadı" #: ../java/src/net/i2p/router/web/LogsHelper.java:118 msgid "No log messages" -msgstr "Kütük iletisi yok" +msgstr "Henüz bir günlük iletisi yok" #. 0 #: ../java/src/net/i2p/router/web/NetDbHelper.java:17 msgid "Local Router" -msgstr "" +msgstr "Yerel Yöneltici" #. 1 #: ../java/src/net/i2p/router/web/NetDbHelper.java:18 msgid "Router Lookup" -msgstr "" +msgstr "Yöneltici Tarama" #. 2 #: ../java/src/net/i2p/router/web/NetDbHelper.java:19 msgid "All Routers" -msgstr "" +msgstr "Tüm Yönelticiler" #. 3 #: ../java/src/net/i2p/router/web/NetDbHelper.java:20 msgid "All Routers with Full Stats" -msgstr "" +msgstr "Tam İstatistkler ile Tüm Yönelticiler" #. 4 #. 5 #: ../java/src/net/i2p/router/web/NetDbHelper.java:22 msgid "LeaseSets" -msgstr "" +msgstr "Kiralama Kümeleri" #: ../java/src/net/i2p/router/web/NetDbRenderer.java:105 #: ../java/strings/Strings.java:69 msgid "Router" -msgstr "Yönlendirici" +msgstr "Yöneltici" #: ../java/src/net/i2p/router/web/NetDbRenderer.java:112 msgid "not found in network database" @@ -3355,7 +3355,7 @@ msgstr "ağ veritabanında bulunamadı" #: ../java/src/net/i2p/router/web/NetDbRenderer.java:156 msgid "LeaseSet" -msgstr "" +msgstr "Kiralama Kümesi" #: ../java/src/net/i2p/router/web/NetDbRenderer.java:158 msgid "Local" @@ -3373,7 +3373,7 @@ msgstr "Hedef" #: ../java/src/net/i2p/router/web/NetDbRenderer.java:173 #: ../java/src/net/i2p/router/web/NetDbRenderer.java:185 msgid "Add to local addressbook" -msgstr "" +msgstr "Yerel adres defterine ekleyin" #: ../java/src/net/i2p/router/web/NetDbRenderer.java:190 #: ../java/src/net/i2p/router/web/NetDbRenderer.java:217 @@ -3394,7 +3394,7 @@ msgstr "Geçit" #: ../java/src/net/i2p/router/web/NetDbRenderer.java:211 msgid "Lease" -msgstr "" +msgstr "Kiralama" #: ../java/src/net/i2p/router/web/NetDbRenderer.java:213 msgid "Tunnel" @@ -3402,21 +3402,21 @@ msgstr "Tünel" #: ../java/src/net/i2p/router/web/NetDbRenderer.java:280 msgid "Not initialized" -msgstr "Başlatılmadı" +msgstr "Başlatılmamış" #: ../java/src/net/i2p/router/web/NetDbRenderer.java:330 msgid "Network Database Router Statistics" -msgstr "Ağ Veritabanı Yönlendirici İstatistikleri" +msgstr "Ağ Veritabanı Yöneltici İstatistikleri" #: ../java/src/net/i2p/router/web/NetDbRenderer.java:337 #: ../java/src/net/i2p/router/web/NetDbRenderer.java:352 #: ../java/src/net/i2p/router/web/NetDbRenderer.java:370 msgid "Count" -msgstr "Sayım" +msgstr "Sayı" #: ../java/src/net/i2p/router/web/NetDbRenderer.java:352 msgid "Transports" -msgstr "Taşımalar" +msgstr "Aktarımlar" #: ../java/src/net/i2p/router/web/NetDbRenderer.java:370 msgid "Country" @@ -3424,7 +3424,7 @@ msgstr "Ülke" #: ../java/src/net/i2p/router/web/NetDbRenderer.java:429 msgid "Our info" -msgstr "Bilgimiz" +msgstr "Bilgilerimiz" #: ../java/src/net/i2p/router/web/NetDbRenderer.java:431 msgid "Peer info for" @@ -3432,7 +3432,7 @@ msgstr "" #: ../java/src/net/i2p/router/web/NetDbRenderer.java:433 msgid "Full entry" -msgstr "Tam girdi" +msgstr "Tam kayıt" #: ../java/src/net/i2p/router/web/NetDbRenderer.java:440 #: ../java/src/net/i2p/router/web/SummaryHelper.java:152 @@ -3458,7 +3458,7 @@ msgstr "Yayınlanmış" #: ../java/src/net/i2p/router/web/NetDbRenderer.java:449 msgid "Signing Key" -msgstr "" +msgstr "İmzalama Anahtarı" #: ../java/src/net/i2p/router/web/NetDbRenderer.java:451 msgid "Address(es)" @@ -3466,11 +3466,11 @@ msgstr "Adres(ler)" #: ../java/src/net/i2p/router/web/NetDbRenderer.java:463 msgid "cost" -msgstr "tutar" +msgstr "maliyet" #: ../java/src/net/i2p/router/web/NetDbRenderer.java:489 msgid "Hidden or starting up" -msgstr "Gizli veya yeniden başlıyor" +msgstr "Gizli ya da başlatılıyor" #: ../java/src/net/i2p/router/web/NetDbRenderer.java:489 msgid "SSU" @@ -3532,30 +3532,30 @@ msgstr "Haberler en son {0} önce denetlendi." #: ../java/src/net/i2p/router/web/NewsHelper.java:310 msgid "Hide news" -msgstr "" +msgstr "Haberleri gizle" #: ../java/src/net/i2p/router/web/NewsHelper.java:313 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:647 msgid "Show news" -msgstr "" +msgstr "Haberleri görüntüle" #: ../java/src/net/i2p/router/web/PluginStarter.java:140 msgid "Checking for plugin updates" -msgstr "" +msgstr "Uygulama ekleri için güncellemeler denetleniyor" #: ../java/src/net/i2p/router/web/PluginStarter.java:155 msgid "Plugin update check failed" -msgstr "" +msgstr "Uygulama eki güncellemeleri denetlenemedi" #: ../java/src/net/i2p/router/web/PluginStarter.java:193 #, java-format msgid "1 plugin updated" msgid_plural "{0} plugins updated" -msgstr[0] "" +msgstr[0] "{0} uygulama eki güncellendi" #: ../java/src/net/i2p/router/web/PluginStarter.java:195 msgid "Plugin update check complete" -msgstr "" +msgstr "Uygulama eki güncelleme denetimi tamamlandı" #. buf.append("

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

\n

"); #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:79 @@ -3622,7 +3622,7 @@ msgstr "Tümleştirilmiş" #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:168 msgid "Unreachable" -msgstr "Erişlemiyor" +msgstr "Erişilemeyen" #. hide if < 10% #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:176 @@ -3643,7 +3643,7 @@ msgstr "Tümleştirme Değeri" #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:203 msgid "Last Heard About" -msgstr "Son Duyulan" +msgstr "Son Duyulma" #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:204 msgid "Last Heard From" @@ -3764,24 +3764,24 @@ msgstr "durum" #. 0 #: ../java/src/net/i2p/router/web/ProfilesHelper.java:12 msgid "Floodfill " -msgstr "" +msgstr "Floodfill " #. 2 #: ../java/src/net/i2p/router/web/ProfilesHelper.java:14 msgid "All" -msgstr "" +msgstr "Tümü" #: ../java/src/net/i2p/router/web/SearchHelper.java:74 msgid "Select search engine" -msgstr "" +msgstr "Arama motorunu seçin" #: ../java/src/net/i2p/router/web/StatsGenerator.java:57 msgid "GO" -msgstr "Gidin" +msgstr "Git" #: ../java/src/net/i2p/router/web/StatsGenerator.java:60 msgid "Statistics gathered during this router's uptime" -msgstr "Bu yönelticinin çalıştığı sürece toplanan istatistikler" +msgstr "Bu yönelticinin çalıştığı sürede toplanan istatistikler" #: ../java/src/net/i2p/router/web/StatsGenerator.java:63 msgid "" @@ -3833,11 +3833,11 @@ msgstr "Ömür boyu ortalama sıklığı" #, java-format msgid "1 event" msgid_plural "{0} events" -msgstr[0] "" +msgstr[0] "{0} etkinlik" #: ../java/src/net/i2p/router/web/StatsGenerator.java:168 msgid "rate" -msgstr "oran" +msgstr "hız" #: ../java/src/net/i2p/router/web/StatsGenerator.java:170 msgid "Average" @@ -3860,7 +3860,7 @@ msgstr "" #: ../java/src/net/i2p/router/web/StatsGenerator.java:204 msgid "No events" -msgstr "Etkinlik yok" +msgstr "Henüz bir etkinlik yok" #: ../java/src/net/i2p/router/web/StatsGenerator.java:209 msgid "Average event count" @@ -3868,15 +3868,15 @@ msgstr "Ortalama etkinlik sayısı" #: ../java/src/net/i2p/router/web/StatsGenerator.java:211 msgid "Events in peak period" -msgstr "En yoğun aralıktaki etkinlikler" +msgstr "En yoğun dönemdeki etkinlikler" #: ../java/src/net/i2p/router/web/StatsGenerator.java:219 msgid "Graph Data" -msgstr "Grafik Verisi" +msgstr "Çizelge Verisi" #: ../java/src/net/i2p/router/web/StatsGenerator.java:222 msgid "Graph Event Count" -msgstr "Grafik Etkinliği Sayısı" +msgstr "Çizelgedeki Etkinlik Sayısı" #. Display the strict average #: ../java/src/net/i2p/router/web/StatsGenerator.java:231 @@ -3912,16 +3912,16 @@ msgstr "I2P Bilgileri" #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:177 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:484 msgid "View existing tunnels and tunnel build status" -msgstr "Varolan tünel ve tünel yapım durumlarına bakın" +msgstr "Varolan tünel ve tünel yapım durumlarını görüntüle" #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:183 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:370 msgid "Show all current peer connections" -msgstr "Tüm geçerli eş bağlantılarına bakın" +msgstr "Tüm geçerli eş bağlantılarını görüntüle" #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:189 msgid "Show recent peer performance profiles" -msgstr "Geçenlerdeki eş başarım profillerine bakın" +msgstr "Yaınlardaki eş başarım profillerini görüntüle" #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:191 msgid "Profiles" @@ -3929,7 +3929,7 @@ msgstr "Profiller" #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:195 msgid "Show list of all known I2P routers" -msgstr "Tüm bilinen I2P yönelticilerinin listesi görüntülensin" +msgstr "Tüm bilinen I2P yönelticilerinin listesini görüntüle" #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:197 msgid "NetDB" @@ -3945,7 +3945,7 @@ msgstr "Günlükler" #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:214 msgid "Graph router performance" -msgstr "Yöneltici başarım çizelgesi" +msgstr "Yöneltici başarımı çizelgesi" #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:216 msgid "Graphs" @@ -3958,7 +3958,7 @@ msgstr "Metin bazlı yöneltici başarım istatistikleri" #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:233 #: ../java/src/net/i2p/router/web/SummaryHelper.java:438 msgid "Local Tunnels" -msgstr "" +msgstr "Yerel Tüneller" #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:235 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/i2ptunnelmgr_jsp.java:164 @@ -3990,11 +3990,11 @@ msgstr "Eşsiz I2P yöneltici kimliğiniz" #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:269 msgid "never reveal it to anyone" -msgstr "asla kimseye söyelemeyin" +msgstr "asla kimseye söylemeyin" #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:271 msgid "show" -msgstr "bakın" +msgstr "görüntüle" #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:275 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:301 @@ -4164,7 +4164,7 @@ msgstr "HATA-İstemci yöneticisi I2CP hatası - günlüklere bakın" #: ../java/src/net/i2p/router/web/SummaryHelper.java:150 #, java-format msgid "ERR-Clock Skew of {0}" -msgstr "HATA-Saat sapması {0}" +msgstr "HATA-Saat Sapması {0}" #: ../java/src/net/i2p/router/web/SummaryHelper.java:170 msgid "ERR-Unresolved TCP Address" @@ -4180,7 +4180,7 @@ msgstr "HATA-SimetrikNAT" #: ../java/src/net/i2p/router/web/SummaryHelper.java:183 msgid "WARN-Firewalled with Inbound TCP Enabled" -msgstr "UYARI-Güvenlik duvarı engellemesi gelen TCP etkinleştirilmiş " +msgstr "UYARI-Gelen TCP güvenlik duvarı engellemesi etkinleştirilmiş " #: ../java/src/net/i2p/router/web/SummaryHelper.java:188 msgid "WARN-Firewalled and Floodfill" @@ -4206,7 +4206,7 @@ msgstr "HATA-UDP devre dışı ve Gelen TCP sunucu/kapı ayarlanmamış" #: ../java/src/net/i2p/router/web/SummaryHelper.java:211 msgid "WARN-Firewalled with UDP Disabled" -msgstr "UYARI-Güvenlik duvarı engellemesi UDP devre dışı" +msgstr "UYARI-UDP ile güvenlik duvarı engellemesi devre dışı" #: ../java/src/net/i2p/router/web/SummaryHelper.java:437 msgid "Add/remove/edit & control your client and server tunnels" @@ -4263,7 +4263,7 @@ msgstr "Yüklemek için yeniden başlatın" #: ../java/src/net/i2p/router/web/SummaryHelper.java:719 msgid "Click Shutdown and restart to install" -msgstr "Kapatın düğmesine tıklayıp yüklemek için yeniden başlatın" +msgstr "Yüklemek için kapatıp yeniden başlatın" #: ../java/src/net/i2p/router/web/SummaryHelper.java:720 #: ../java/src/net/i2p/router/web/SummaryHelper.java:735 @@ -4309,7 +4309,7 @@ msgstr "" #: ../java/src/net/i2p/router/web/SummaryHelper.java:819 msgid "Reseed" -msgstr "Tekrar düğümleme" +msgstr "Yeniden tohumlama" #: ../java/src/net/i2p/router/web/SummaryHelper.java:908 msgid "Order" @@ -4350,12 +4350,12 @@ msgstr "" #: ../java/src/net/i2p/router/web/SummaryRenderer.java:142 #, java-format msgid "events in {0}" -msgstr "{0} etkinlikleri" +msgstr "{0} içindeki etkinlikler" #: ../java/src/net/i2p/router/web/SummaryRenderer.java:144 #, java-format msgid "averaged for {0}" -msgstr "{0} ortalamaları" +msgstr "{0} içindeki ortalamalar" #: ../java/src/net/i2p/router/web/SummaryRenderer.java:154 msgid "Events per period" @@ -4380,7 +4380,7 @@ msgstr "şimdi" #: ../java/src/net/i2p/router/web/TunnelRenderer.java:62 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:415 msgid "configure" -msgstr "ayarlayın" +msgstr "ayarla" #: ../java/src/net/i2p/router/web/TunnelRenderer.java:60 msgid "Client tunnels for" @@ -4396,7 +4396,7 @@ msgstr "Katılınan tüneller" #: ../java/src/net/i2p/router/web/TunnelRenderer.java:71 msgid "Receive on" -msgstr "Alındığı zaman" +msgstr "Alınma zamanı" #: ../java/src/net/i2p/router/web/TunnelRenderer.java:72 msgid "Expiration" @@ -4408,7 +4408,7 @@ msgstr "Gönderilme zamanı" #: ../java/src/net/i2p/router/web/TunnelRenderer.java:73 msgid "Rate" -msgstr "Oran" +msgstr "Hız" #: ../java/src/net/i2p/router/web/TunnelRenderer.java:73 msgid "Role" @@ -4421,7 +4421,7 @@ msgstr "Kullanım" #: ../java/src/net/i2p/router/web/TunnelRenderer.java:111 msgid "grace period" -msgstr "çalıştığı aralık" +msgstr "deneme süresi" #: ../java/src/net/i2p/router/web/TunnelRenderer.java:121 msgid "Outbound Endpoint" @@ -4469,11 +4469,11 @@ msgstr "Yapılıyor" #: ../java/src/net/i2p/router/web/TunnelRenderer.java:211 msgid "inbound" -msgstr "gelen" +msgstr "geliş" #: ../java/src/net/i2p/router/web/TunnelRenderer.java:218 msgid "outbound" -msgstr "giden" +msgstr "gidiş" #: ../java/src/net/i2p/router/web/TunnelRenderer.java:223 msgid "No tunnels; waiting for the grace period to end." @@ -4511,14 +4511,14 @@ msgstr "susidns" #: ../java/strings/Strings.java:17 msgid "routerconsole" -msgstr "yöneltici paneli" +msgstr "yonelticipanosu" #. clients, taken from clients.config, for ConfigClientsHelper #. note that if the wording changes in clients.config, we have to #. keep the old string here as well for existing installs #: ../java/strings/Strings.java:22 msgid "Web console" -msgstr "Web paneli" +msgstr "Web panosu" #: ../java/strings/Strings.java:23 msgid "SAM application bridge" @@ -4546,7 +4546,7 @@ msgstr "BOB uygulama köprüsü" #: ../java/strings/Strings.java:30 msgid "Open Router Console in web browser at startup" -msgstr "Yöneltici paneli başlangıçta web tarayıcı içinde açılsın" +msgstr "Yöneltici panosu başlangıçta web tarayıcı içinde açılsın" #: ../java/strings/Strings.java:37 msgid "shared clients (DSA)" @@ -4630,7 +4630,7 @@ msgstr "InNet Havuzu" #: ../java/strings/Strings.java:65 msgid "JobQueue" -msgstr "İş Kuyruğu" +msgstr "Görev Kuyruğu" #: ../java/strings/Strings.java:66 msgid "NetworkDatabase" @@ -4813,7 +4813,7 @@ msgstr "Yenileme (s)" #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/viewprofile_jsp.java:309 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/webmail_jsp.java:327 msgid "Enable" -msgstr "Etkinleştirin" +msgstr "Etkinleştir" #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:437 msgid "Bandwidth limiter" @@ -5668,13 +5668,13 @@ msgstr "" #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:760 msgid "ERR - Clock Skew" -msgstr "" +msgstr "HATA-Saat Sapması" #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:762 msgid "" "Your system's clock is skewed, which will make it difficult to participate " "in the network." -msgstr "" +msgstr "Sistem saatiniz sapmış olduğundan ağa katılmanız zorlaşıyor." #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:764 msgid "Correct your clock setting if this error persists." @@ -5824,7 +5824,7 @@ msgstr "" #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:359 msgid "I2P Reseeding Configuration" -msgstr "" +msgstr "I2P Yeniden Tohumlama Ayarları" #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:475 msgid "" @@ -5849,7 +5849,7 @@ msgstr "" #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:483 msgid "Manual Reseed from URL" -msgstr "" +msgstr "İnternet Adresinden El İle Yeniden Tohumlama" #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:485 msgid "Enter zip or su3 URL" @@ -5871,7 +5871,7 @@ msgstr "" #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:495 msgid "Manual Reseed from File" -msgstr "" +msgstr "Dosyadan El İle Yeniden Tohumlama" #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:497 msgid "Select zip or su3 file" @@ -5879,7 +5879,7 @@ msgstr "" #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:505 msgid "Create Reseed File" -msgstr "" +msgstr "Yeniden Tohumla Dosyası Oluşturun" #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:507 msgid "" @@ -5892,11 +5892,11 @@ msgstr "" #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:511 msgid "Create reseed file" -msgstr "" +msgstr "Yeniden tohumlama dosyası oluştur" #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:515 msgid "Reseeding Configuration" -msgstr "" +msgstr "Yeniden Tohumlama Ayarları" #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:519 msgid "" @@ -5906,7 +5906,7 @@ msgstr "" #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:521 msgid "Reseed URL Selection" -msgstr "" +msgstr "Yeniden Tohumlama Adresi Seçimi" #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:525 msgid "Try SSL first then non-SSL" @@ -5922,7 +5922,7 @@ msgstr "" #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:535 msgid "Reseed URLs" -msgstr "" +msgstr "Yeniden Tohumlama İnternet Adresleri" #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:539 msgid "Enable HTTP Proxy?" diff --git a/apps/routerconsole/locale/messages_uk.po b/apps/routerconsole/locale/messages_uk.po index 226aa0a94..1232b560b 100644 --- a/apps/routerconsole/locale/messages_uk.po +++ b/apps/routerconsole/locale/messages_uk.po @@ -6,15 +6,16 @@ # Translators: # naeto , 2012 # Anton Zub , 2014 -# Denis Blank , 2011 -# Denis Blank , 2011 -# Denis Blank , 2011 +# Denis Lysenko , 2011,2015 +# Denis Lysenko , 2011 +# Denis Lysenko , 2011 # jonny_nut, 2014 # jonny_nut, 2014 # LinuxChata, 2014 # LinuxChata, 2014 # madjong , 2015 # madjong , 2015 +# Maxym Mykhalchuk, 2015 # naeto , 2012 # puxud , 2014 # puxud , 2014 @@ -24,9 +25,9 @@ msgstr "" "Project-Id-Version: I2P\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-07-17 01:05+0000\n" -"PO-Revision-Date: 2015-07-17 01:31+0000\n" -"Last-Translator: kytv \n" -"Language-Team: Ukrainian (Ukraine) (http://www.transifex.com/projects/p/I2P/language/uk_UA/)\n" +"PO-Revision-Date: 2015-08-07 16:30+0000\n" +"Last-Translator: Denis Lysenko \n" +"Language-Team: Ukrainian (Ukraine) (http://www.transifex.com/otf/I2P/language/uk_UA/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -102,9 +103,9 @@ msgstr[2] "{0} днів" #, java-format msgid "1 year" msgid_plural "{0} years" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" +msgstr[0] "{0} рік" +msgstr[1] "{0} роки" +msgstr[2] "{0} років" #: ../../../core/java/src/net/i2p/data/DataHelper.java:1549 #: ../../../core/java/src/net/i2p/data/DataHelper.java:1596 @@ -526,7 +527,7 @@ msgstr "Підключений" #: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:1358 #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2491 msgid "Skew" -msgstr "Нахил" +msgstr "Відхилення" #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:738 msgid "The difference between the peer's clock and your own" @@ -729,7 +730,7 @@ msgstr "{0} порт {1,number,#####} не пропущено через UPnP." #: ../../../router/java/src/net/i2p/router/transport/ntcp/EstablishState.java:877 #, java-format msgid "Excessive clock skew: {0}" -msgstr "" +msgstr "Надмірне відхилення годинника: {0}" #: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:1344 msgid "NTCP connections" @@ -789,67 +790,67 @@ msgstr "Сортування по хешу вузла" #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2477 msgid "Direction/Introduction" -msgstr "" +msgstr "Напрямок/Введення" #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2480 msgid "Sort by idle inbound" -msgstr "Порядком за вхідню бездіяльність" +msgstr "Сортувати за простоєм на вході" #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2482 msgid "Sort by idle outbound" -msgstr "Порядком за вихідню бездіяльність" +msgstr "Сортувати за простоєм на виході" #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2485 msgid "Sort by inbound rate" -msgstr "Порядком за вхідну ставку" +msgstr "Сортувати за швидкістю на вході" #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2487 msgid "Sort by outbound rate" -msgstr "Порядком за вихідну ставку" +msgstr "Сортувати за швидкістю на виході" #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2490 msgid "Sort by connection uptime" -msgstr "Порядком за тривалість зв'язку" +msgstr "Сортувати за тривалістю роботи" #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2492 msgid "Sort by clock skew" -msgstr "Порядком за нахилом такту" +msgstr "Сортувати за відхиленням годинника" #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2495 msgid "Sort by congestion window" -msgstr "" +msgstr "Сортувати за вікном затору" #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2497 msgid "Sort by slow start threshold" -msgstr "" +msgstr "Сортувати за порогом повільного старту" #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2500 msgid "Sort by round trip time" -msgstr "" +msgstr "Сортувати за часом проходження сигналу туди і назад" #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2504 msgid "Sort by retransmission timeout" -msgstr "" +msgstr "Сортувати за таймаутом ретрансляції" #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2507 msgid "Sort by outbound maximum transmit unit" -msgstr "" +msgstr "Сортувати за максимальною одиницею передачі на виході" #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2509 msgid "Sort by packets sent" -msgstr "" +msgstr "Сортувати за кількістю переданих пакетів" #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2511 msgid "Sort by packets received" -msgstr "" +msgstr "Сортувати за кількістю отриманих пакетів" #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2514 msgid "Sort by packets retransmitted" -msgstr "" +msgstr "Сортувати за кількістю ретрансльованих пакетів" #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2516 msgid "Sort by packets received more than once" -msgstr "" +msgstr "Сортувати за кількістю отриманих пакетів отриманих декілька разів" #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2536 msgid "We offered to introduce them" @@ -861,7 +862,7 @@ msgstr "Вони пропонують представити нас" #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2542 msgid "Choked" -msgstr "" +msgstr "Давка" #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2550 msgid "1 fail" @@ -877,7 +878,7 @@ msgstr "{0} збоїв" #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:166 #: ../java/src/net/i2p/router/web/ProfilesHelper.java:13 msgid "Banned" -msgstr "Забороненo" +msgstr "Забанений" #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2617 msgid "backlogged" @@ -885,11 +886,11 @@ msgstr "перевантажений" #: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:250 msgid "Dropping tunnel requests: Too slow" -msgstr "Відхиляю запити на тунелі: надто повільно працює" +msgstr "Відхиляю запити на тунелі: занадто повільна обробка запитів" #: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:260 msgid "Dropping tunnel requests: High job lag" -msgstr "" +msgstr "Відхиляю запити на тунелі: велике відставання обробки запитів" #. don't even bother, since we are so overloaded locally #: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:451 @@ -898,15 +899,15 @@ msgstr "Відхиляю запити на тунелі: перевантаже #: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:693 msgid "Rejecting tunnels: Hidden mode" -msgstr "Видхилення тунелів: прихований режим" +msgstr "Не приймаємо тунелі: прихований режим" #: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:721 msgid "Rejecting tunnels: Request overload" -msgstr "Видхилення тунелів: забагато запитів" +msgstr "Не приймаємо тунелі: забагато запитів" #: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:752 msgid "Rejecting tunnels: Connection limit" -msgstr "Відхиляю тунелі: обмеження кількості з’єднань" +msgstr "Не приймаємо тунелі: досягнутий ліміт кількості з'єднань" #: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:964 #: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:997 @@ -915,7 +916,7 @@ msgstr "Відхиляю запити на тунелі: високе наван #: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:1076 msgid "Dropping tunnel requests: Queue time" -msgstr "" +msgstr "Відхиляю запити на тунелі: завеликий час у черзі" #: ../java/src/net/i2p/router/update/ConsoleUpdateManager.java:884 #, java-format @@ -974,7 +975,7 @@ msgstr "з {0}" #: ../java/src/net/i2p/router/update/ConsoleUpdateManager.java:1396 #, java-format msgid "Unsigned update file from {0} is corrupt" -msgstr "" +msgstr "Непідписане оновлення з {0} пошкоджено" #: ../java/src/net/i2p/router/update/ConsoleUpdateManager.java:1425 #, java-format @@ -1207,7 +1208,7 @@ msgstr "Нової версії на {0} не знайдено" #: ../java/src/net/i2p/router/web/BanlistRenderer.java:65 msgid "Permanently banned" -msgstr "" +msgstr "Забанений назавжди" #: ../java/src/net/i2p/router/web/BanlistRenderer.java:67 #, java-format @@ -1217,7 +1218,7 @@ msgstr "Тимчасовий бан завершується через {0}" #: ../java/src/net/i2p/router/web/BanlistRenderer.java:69 #, java-format msgid "Banned until restart or in {0}" -msgstr "" +msgstr "Забанений до перезапуску або до {0}" #: ../java/src/net/i2p/router/web/BanlistRenderer.java:82 msgid "unban now" @@ -1401,7 +1402,7 @@ msgstr "Зупинено плагін {0}" #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:180 #, java-format msgid "Stopped webapp {0}" -msgstr "" +msgstr "Зупинено веб-додаток {0}" #. label (IE) #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:209 @@ -1449,11 +1450,11 @@ msgstr "Конфігурацію плагіна збережено" #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:387 #: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:202 msgid "WebApp" -msgstr "WebApp" +msgstr "Web-додаток" #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:387 msgid "started" -msgstr "почато" +msgstr "запущено" #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:389 msgid "Failed to start" @@ -1461,7 +1462,7 @@ msgstr "Помилка запуску" #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:394 msgid "Failed to find server." -msgstr "Провал пошуку за сервер" +msgstr "Не вдалося знайти сервер." #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:400 msgid "No plugin URL specified." @@ -1484,7 +1485,7 @@ msgstr "Не вказано URL оновлення для {0}" #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:488 #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:512 msgid "Plugin or update download already in progress." -msgstr "" +msgstr "Плагін або оновлення вже завантажується." #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:493 msgid "Updating all plugins" @@ -2047,7 +2048,7 @@ msgstr "Забанити пір до наступного запуску" #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:23 #, java-format msgid "Manually banned via {0}" -msgstr "" +msgstr "Заблоковані вручну задопомогою {0}" #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:24 msgid "banned until restart" @@ -2210,12 +2211,12 @@ msgstr "М’яка зупинка" #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:203 msgid "Graceful shutdown initiated" -msgstr "" +msgstr "Запущена м'яка зупинка" #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:209 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:477 msgid "Cancel graceful shutdown" -msgstr "" +msgstr "М'яка зупинка відмінена" #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:211 msgid "Graceful shutdown cancelled" @@ -2228,12 +2229,12 @@ msgstr "М’який перезапуск" #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:217 msgid "Graceful restart requested" -msgstr "" +msgstr "Запитаний м'який перезапуск " #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:218 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:493 msgid "Hard restart" -msgstr "" +msgstr "Жорсткий перезапуск" #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:223 msgid "Hard restart requested" @@ -4212,7 +4213,7 @@ msgstr "" #: ../java/src/net/i2p/router/web/SummaryHelper.java:150 #, java-format msgid "ERR-Clock Skew of {0}" -msgstr "" +msgstr "ПОМИЛКА-Відхилення годинника {0}" #: ../java/src/net/i2p/router/web/SummaryHelper.java:170 msgid "ERR-Unresolved TCP Address" @@ -5716,13 +5717,13 @@ msgstr "" #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:760 msgid "ERR - Clock Skew" -msgstr "" +msgstr "ПОМИЛКА - Відхилення годинника" #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:762 msgid "" "Your system's clock is skewed, which will make it difficult to participate " "in the network." -msgstr "" +msgstr "Ваш системний годинник занадто відхилився, вам буде важко приймати участь у мережі." #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:764 msgid "Correct your clock setting if this error persists." diff --git a/apps/susidns/locale/messages_ja.po b/apps/susidns/locale/messages_ja.po index d069b5dd3..42651fe90 100644 --- a/apps/susidns/locale/messages_ja.po +++ b/apps/susidns/locale/messages_ja.po @@ -4,16 +4,17 @@ # To contribute translations, see http://www.i2p2.de/newdevelopers # # Translators: -# タカハシ , 2013-2014 +# タカハシ , 2013-2014 +# タカハシ , 2015 # rafe , 2015 msgid "" msgstr "" "Project-Id-Version: I2P\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-05-14 08:33+0000\n" -"PO-Revision-Date: 2015-05-14 08:34+0000\n" -"Last-Translator: kytv \n" -"Language-Team: Japanese (http://www.transifex.com/projects/p/I2P/language/ja/)\n" +"POT-Creation-Date: 2015-07-17 01:13+0000\n" +"PO-Revision-Date: 2015-08-31 08:07+0000\n" +"Last-Translator: タカハシ \n" +"Language-Team: Japanese (http://www.transifex.com/otf/I2P/language/ja/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -219,7 +220,7 @@ msgstr "エラー: アドレスブックファイルに書き込めません。" #: ../src/java/src/i2p/susi/dns/AddressbookBean.java:326 #: ../src/java/src/i2p/susi/dns/ConfigBean.java:108 #: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:316 -#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:153 +#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:157 msgid "" "Invalid form submission, probably because you used the \"back\" or " "\"reload\" button on your browser. Please resubmit." @@ -228,14 +229,14 @@ msgstr "無効なフォームからの送信、おそらく、ブラウザで「 #: ../src/java/src/i2p/susi/dns/AddressbookBean.java:328 #: ../src/java/src/i2p/susi/dns/ConfigBean.java:110 #: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:318 -#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:155 +#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:159 msgid "" "If the problem persists, verify that you have cookies enabled in your " "browser." msgstr "問題が続く場合、クッキーがブラウザで有効になっているか確認してください。" #: ../src/java/src/i2p/susi/dns/ConfigBean.java:99 -#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:128 +#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:131 #: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:160 #: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:151 msgid "Save" @@ -246,7 +247,7 @@ msgid "Configuration saved." msgstr "設定が保存されました。" #: ../src/java/src/i2p/susi/dns/ConfigBean.java:102 -#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:147 +#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:151 #: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:158 #: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:149 msgid "Reload" @@ -275,16 +276,16 @@ msgstr "ネーミング・サービス {1} への {0} の宛先を追加する msgid "Failed to delete Destination for {0} from naming service {1}" msgstr "ネーミング・サービス {1} から {0} の宛先を削除するのに失敗しました" -#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:140 +#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:144 msgid "" "Subscriptions saved, updating addressbook from subscription sources now." msgstr "購読が保存されました、現在購読ソースからアドレスブックを更新しています。" -#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:145 +#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:149 msgid "Subscriptions saved." msgstr "購読が保存されました。" -#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:149 +#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:153 msgid "Subscriptions reloaded." msgstr "購読が再読込されました。" @@ -432,7 +433,7 @@ msgstr "キャンセル" #: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:373 msgid "Export in hosts.txt format" -msgstr "" +msgstr "hosts.txt 形式でエクスポート" #: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:396 msgid "This address book is empty." diff --git a/apps/susidns/locale/messages_tr.po b/apps/susidns/locale/messages_tr.po index 267a58f1d..5ce6b3963 100644 --- a/apps/susidns/locale/messages_tr.po +++ b/apps/susidns/locale/messages_tr.po @@ -4,15 +4,15 @@ # To contribute translations, see http://www.i2p2.de/newdevelopers # # Translators: -# Kaya Zeren , 2013 +# Kaya Zeren , 2013,2015 msgid "" msgstr "" "Project-Id-Version: I2P\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-05-14 08:33+0000\n" -"PO-Revision-Date: 2015-05-14 08:34+0000\n" -"Last-Translator: kytv \n" -"Language-Team: Turkish (Turkey) (http://www.transifex.com/projects/p/I2P/language/tr_TR/)\n" +"POT-Creation-Date: 2015-07-17 01:13+0000\n" +"PO-Revision-Date: 2015-08-05 15:31+0000\n" +"Last-Translator: Kaya Zeren \n" +"Language-Team: Turkish (Turkey) (http://www.transifex.com/otf/I2P/language/tr_TR/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -22,58 +22,58 @@ msgstr "" #: ../src/java/src/i2p/susi/dns/AddressBean.java:131 #, java-format msgid "Host name \"{0}\" contains illegal character {1}" -msgstr "" +msgstr "\"{0}\" sunucu adında {1} geçersiz karakteri bulunuyor" #: ../src/java/src/i2p/susi/dns/AddressBean.java:144 #: ../src/java/src/i2p/susi/dns/AddressBean.java:146 #: ../src/java/src/i2p/susi/dns/AddressBean.java:153 #, java-format msgid "Host name cannot start with \"{0}\"" -msgstr "" +msgstr "Sunucu adı \"{0}\" ile başlayamaz" #: ../src/java/src/i2p/susi/dns/AddressBean.java:148 #: ../src/java/src/i2p/susi/dns/AddressBean.java:150 #, java-format msgid "Host name cannot end with \"{0}\"" -msgstr "" +msgstr "Sunucu adı \"{0}\" ile bitemez" #: ../src/java/src/i2p/susi/dns/AddressBean.java:155 #, java-format msgid "Host name cannot contain \"{0}\"" -msgstr "" +msgstr "Sunucu adında \"{0}\" bulunamaz" #: ../src/java/src/i2p/susi/dns/AddressBean.java:158 #, java-format msgid "" "Host name \"{0}\" requires conversion to ASCII but the conversion library is" " unavailable in this JVM" -msgstr "" +msgstr "\"{0}\" sunucu adının ASCII karakterlerine dönüştürülmesi gerekiyor ancak bu JVM için dönüştürme kitaplığı kullanılamıyor" #: ../src/java/src/i2p/susi/dns/AddressBean.java:219 msgid "None" -msgstr "" +msgstr "Yok" #: ../src/java/src/i2p/susi/dns/AddressBean.java:227 msgid "Hashcash" -msgstr "" +msgstr "Hashcash" #: ../src/java/src/i2p/susi/dns/AddressBean.java:229 msgid "Hidden" -msgstr "" +msgstr "Gizli" #: ../src/java/src/i2p/susi/dns/AddressBean.java:231 msgid "Signed" -msgstr "" +msgstr "İmzalanmış" #: ../src/java/src/i2p/susi/dns/AddressBean.java:233 msgid "Key" -msgstr "" +msgstr "Anahtar" #: ../src/java/src/i2p/susi/dns/AddressBean.java:235 #: ../src/java/src/i2p/susi/dns/AddressBean.java:260 #, java-format msgid "Type {0}" -msgstr "" +msgstr "Tip {0}" #: ../src/java/src/i2p/susi/dns/AddressBean.java:247 #: ../src/java/src/i2p/susi/dns/AddressBean.java:254 @@ -85,25 +85,25 @@ msgstr "DSA 1024 bit" #, java-format msgid "One result for search within filtered list." msgid_plural "{0} results for search within filtered list." -msgstr[0] "" +msgstr[0] "Süzülmüş listede arama için {0} sonuç bulundu" #: ../src/java/src/i2p/susi/dns/AddressbookBean.java:192 #, java-format msgid "Filtered list contains 1 entry." msgid_plural "Filtered list contains {0} entries." -msgstr[0] "" +msgstr[0] "Süzülmüş listede {0} kayıt bulundu" #: ../src/java/src/i2p/susi/dns/AddressbookBean.java:197 #, java-format msgid "One result for search." msgid_plural "{0} results for search." -msgstr[0] "" +msgstr[0] "Arama için {0} sonuç bulundu." #: ../src/java/src/i2p/susi/dns/AddressbookBean.java:206 #, java-format msgid "Address book contains 1 entry." msgid_plural "Address book contains {0} entries." -msgstr[0] "" +msgstr[0] "Adres defterinde {0} kayıt var." #: ../src/java/src/i2p/susi/dns/AddressbookBean.java:222 #, java-format @@ -128,7 +128,7 @@ msgstr "Değiştirin" #: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:243 #, java-format msgid "Host name {0} is already in address book, unchanged." -msgstr "" +msgstr "{0} sunucu adı zaten adres defterinde var, değiştirilmedi." #: ../src/java/src/i2p/susi/dns/AddressbookBean.java:256 #: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:245 @@ -136,7 +136,7 @@ msgstr "" msgid "" "Host name {0} is already in address book with a different destination. Click" " \"Replace\" to overwrite." -msgstr "" +msgstr "{0} sunucu adı zaten adres defterinde var ancak farklı bir hedefi gösteriyor. Değiştirmek için \"Değiştir\" üzerine tıklayın." #: ../src/java/src/i2p/susi/dns/AddressbookBean.java:269 #: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:258 @@ -153,7 +153,7 @@ msgstr "{0} için hedef değiştirildi." #: ../src/java/src/i2p/susi/dns/AddressbookBean.java:273 #: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:262 msgid "Warning - host name does not end with \".i2p\"" -msgstr "" +msgstr "Uyarı - sunucu adı \".i2p\" ile bitemez" #: ../src/java/src/i2p/susi/dns/AddressbookBean.java:278 #: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:270 @@ -164,7 +164,7 @@ msgstr "Base 64 hedefi geçersiz." #: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:276 #, java-format msgid "Invalid host name \"{0}\"." -msgstr "" +msgstr "\"{0}\" sunucu adı geçersiz." #: ../src/java/src/i2p/susi/dns/AddressbookBean.java:287 #: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:279 @@ -178,7 +178,7 @@ msgstr "Lütfen bir sunucu adı ve hedef yazın" #: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:308 #: ../src/tmp/i2p/susi/dns/jsp/details_jsp.java:270 msgid "Delete Entry" -msgstr "" +msgstr "Kaydı Silin" #: ../src/java/src/i2p/susi/dns/AddressbookBean.java:291 #: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:283 @@ -199,17 +199,17 @@ msgstr "{0} hedefi silindi." #, java-format msgid "1 destination deleted." msgid_plural "{0} destinations deleted." -msgstr[0] "" +msgstr[0] "{0} hedef silindi." #: ../src/java/src/i2p/susi/dns/AddressbookBean.java:310 #: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:305 msgid "No entries selected to delete." -msgstr "" +msgstr "Silinmek için seçilmiş bir kayıt yok." #: ../src/java/src/i2p/susi/dns/AddressbookBean.java:318 #: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:312 msgid "Address book saved." -msgstr "" +msgstr "Adres defteri kaydedildi." #: ../src/java/src/i2p/susi/dns/AddressbookBean.java:321 msgid "ERROR: Could not write addressbook file." @@ -218,7 +218,7 @@ msgstr "HATA: Adres defteri dosyasına yazılamadı." #: ../src/java/src/i2p/susi/dns/AddressbookBean.java:326 #: ../src/java/src/i2p/susi/dns/ConfigBean.java:108 #: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:316 -#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:153 +#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:157 msgid "" "Invalid form submission, probably because you used the \"back\" or " "\"reload\" button on your browser. Please resubmit." @@ -227,14 +227,14 @@ msgstr "Büyük olasılıkla web tarayıcınızdaki \"Geri\" ya da \"Yenile\" d #: ../src/java/src/i2p/susi/dns/AddressbookBean.java:328 #: ../src/java/src/i2p/susi/dns/ConfigBean.java:110 #: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:318 -#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:155 +#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:159 msgid "" "If the problem persists, verify that you have cookies enabled in your " "browser." -msgstr "" +msgstr "Sorun sürerse, tarayıcınızda çerezlerin etkinleştirilmiş olduğuna emin olun." #: ../src/java/src/i2p/susi/dns/ConfigBean.java:99 -#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:128 +#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:131 #: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:160 #: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:151 msgid "Save" @@ -245,7 +245,7 @@ msgid "Configuration saved." msgstr "Ayarlar kaydedildi." #: ../src/java/src/i2p/susi/dns/ConfigBean.java:102 -#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:147 +#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:151 #: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:158 #: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:149 msgid "Reload" @@ -258,32 +258,32 @@ msgstr "Ayarlar yeniden yüklendi" #: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:104 #, java-format msgid "{0} address book in {1} database" -msgstr "" +msgstr "{0} adres defteri {1} veritabanında " #: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:253 msgid "Manually added via SusiDNS" -msgstr "" +msgstr "SusiDNS üzerine el ile eklendi" #: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:267 #, java-format msgid "Failed to add Destination for {0} to naming service {1}" -msgstr "" +msgstr "{0} hedefi {1} ad hizmetine eklenemedi" #: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:291 #, java-format msgid "Failed to delete Destination for {0} from naming service {1}" -msgstr "" +msgstr "{0} hedefi {1} ad hizmetinden silinemedi" -#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:140 +#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:144 msgid "" "Subscriptions saved, updating addressbook from subscription sources now." msgstr "Abonelikler kaydedildi, adres defteri abonelik kaynaklarına göre güncelleniyor." -#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:145 +#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:149 msgid "Subscriptions saved." msgstr "Abonelikler kaydedildi." -#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:149 +#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:153 msgid "Subscriptions reloaded." msgstr "Abonelikler yeniden yüklendi" @@ -431,7 +431,7 @@ msgstr "İptal" #: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:373 msgid "Export in hosts.txt format" -msgstr "" +msgstr "hosts.txt biçiminde verin" #: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:396 msgid "This address book is empty." @@ -521,31 +521,31 @@ msgstr "eepProxy kapınız (değiştirilmesine gerek yok)" #: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:190 msgid "Hostname for your eepProxy (no need to change)" -msgstr "" +msgstr "eepProxy sunucu adınız (değiştirilmesine gerek yok)" #: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:192 msgid "Whether to update the published addressbook" -msgstr "" +msgstr "Yayınlanmış adres defteri güncellensin" #: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:194 msgid "" "File containing the etags header from the fetched subscription URLs (no need" " to change)" -msgstr "" +msgstr "Alınan abonelik İnternet adresinde etags üst bilgisini içeren dosya (değiştirilmesine gerek yok)" #: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:196 msgid "" "File containing the modification timestamp for each fetched subscription URL" " (no need to change)" -msgstr "" +msgstr "Alınan her bir abonelik İnternet adresi için değişiklik zaman damgasını içeren dosya (değiştirilmesine gerek yok)" #: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:198 msgid "File to log activity to (change to /dev/null if you like)" -msgstr "" +msgstr "İşlem günlük kayıtlarının yazılacağı dosya (/dev/null olarak değiştirebilirsiniz)" #: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:200 msgid "Name of the theme to use (defaults to 'light')" -msgstr "" +msgstr "Kullanılacak temanın adı (varsayılan 'açık')" #: ../src/tmp/i2p/susi/dns/jsp/details_jsp.java:112 msgid "addressbook" @@ -561,7 +561,7 @@ msgstr "Base 32 Adresi" #: ../src/tmp/i2p/susi/dns/jsp/details_jsp.java:204 msgid "Base 64 Hash" -msgstr "" +msgstr "Base 64 Karma" #: ../src/tmp/i2p/susi/dns/jsp/details_jsp.java:210 msgid "Address Helper" @@ -605,80 +605,80 @@ msgstr "Notlar" #: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:115 msgid "Introduction" -msgstr "" +msgstr "Giriş" #: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:137 msgid "What is the addressbook?" -msgstr "" +msgstr "Adres defteri nedir?" #: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:139 msgid "The addressbook application is part of your I2P installation." -msgstr "" +msgstr "Adres defteri uygulaması I2P yazılımının bir parçasıdır." #: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:141 msgid "" "It regularly updates your hosts.txt file from distributed sources or " "\"subscriptions\"." -msgstr "" +msgstr "hosts.txt dosyanızı düzenli olarak dağıtılmışkaynaklar ya da \"aboneliklerden\" günceller." #: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:143 #, java-format msgid "" "In the default configuration, the address book is only subscribed to {0}." -msgstr "" +msgstr "Varsayılan ayarlarda, adres defteri yalnız {0} üzerine abonedir." #: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:145 msgid "" "Subscribing to additional sites is easy, just add them to your subscriptions file." -msgstr "" +msgstr "Ek sitelere kolayca abone olabilirsiniz. Yalnızca siteleri subscriptions dosyasına ekleyin." #: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:147 msgid "" "For more information on naming in I2P, see the overview." -msgstr "" +msgstr "I2P adlandırmaları hakkında ayrıntılı bilgi almak için özet bölümüne bakın." #: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:149 msgid "How does the addressbook application work?" -msgstr "" +msgstr "Adres defteri uygulaması nasıl çalışır?" #: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:151 msgid "" "The addressbook application regularly polls your subscriptions and merges " "their content into your \"router\" address book." -msgstr "" +msgstr "Adres defteri uygulaması düzenli olarak aboneliklerinizi denetleyerek içeriklerini \"yöneltici\" adres defterinize aktarır." #: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:153 msgid "" "Then it merges your \"master\" address book into the router address book as " "well." -msgstr "" +msgstr "Ardından \"ana\" adres defterinizi yönelticinin adres defterine aktarır." #: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:155 msgid "" "If configured, the router address book is now written to the \"published\" " "address book, which will be publicly available if you are running an " "eepsite." -msgstr "" +msgstr "Eepsite çalıştırıyorsanız ve uygun seçeneği etkinleştirdiyseniz, yöneltici adres defteri herkes tarafından görülebilecek \"yayınlanmış\" adres defterine yazılır." #: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:157 msgid "" "The router also uses a private address book (not shown in the picture), " "which is not merged or published." -msgstr "" +msgstr "Yöneltici ayrıca aktarılmayan ya da yayınlanmayan bir kişisel adres defteri (görselde görüntülenmeyen) kullanır." #: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:159 msgid "" "Hosts in the private address book can be accessed by you but their addresses" " are never distributed to others." -msgstr "" +msgstr "Kişisel adres defterindeki sunuculara yalnız siz erişebilirsiniz. Bu adresler asla diğer kişiler ile paylaşılmaz." #: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:161 msgid "" "The private address book can also be used for aliases of hosts in your other" " address books." -msgstr "" +msgstr "Kişisel adres defteri ayrıca diğer adres defterlerinizdeki sunucu kısaltmaları için kullanılabilir." #: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:117 msgid "subscriptions" @@ -686,30 +686,30 @@ msgstr "abonelikler" #: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:153 msgid "The subscription file contains a list of i2p URLs." -msgstr "" +msgstr "Abonelik dosyasında I2P İnternet adreslerinin listesi bulunur." #: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:155 msgid "" "The addressbook application regularly checks this list for new eepsites." -msgstr "" +msgstr "Adres defteri uygulaması düzenli olarak yeni eepsiteleri için bu listeyi denetler." #: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:157 msgid "Those URLs refer to published hosts.txt files." -msgstr "" +msgstr "Bu İnternet adresleri yayınlanmış hosts.txt dosyalarını gösterir." #: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:159 #, java-format msgid "" "The default subscription is the hosts.txt from {0}, which is updated " "infrequently." -msgstr "" +msgstr "hosts.txt dosyasındaki varsayılan abonelik olan {0} sık güncellenmez." #: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:161 msgid "" "So it is a good idea to add additional subscriptions to sites that have the " "latest addresses." -msgstr "" +msgstr "Bu nedenle güncel adresleri bulunduran sitelerin aboneliğini eklemek iyi olur." #: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:163 msgid "See the FAQ for a list of subscription URLs." -msgstr "" +msgstr "Abonelik İnternet adreslerinin listesi için SSS bölümüne bakın." diff --git a/apps/susidns/locale/messages_uk.po b/apps/susidns/locale/messages_uk.po index 916d1af3f..8151a05b1 100644 --- a/apps/susidns/locale/messages_uk.po +++ b/apps/susidns/locale/messages_uk.po @@ -6,22 +6,23 @@ # Translators: # 007 , 2014 # 007 , 2014 -# Denis Blank , 2011-2012 -# Denis Blank , 2011 -# Denis Blank , 2011 +# Denis Lysenko , 2011-2012 +# Denis Lysenko , 2011 +# Denis Lysenko , 2011 # LinuxChata, 2014 # LinuxChata, 2014 # madjong , 2014 # madjong , 2014 -# Denis Blank , 2012 +# Maxym Mykhalchuk, 2015 +# Denis Lysenko , 2012 msgid "" msgstr "" "Project-Id-Version: I2P\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-05-14 08:33+0000\n" -"PO-Revision-Date: 2015-05-14 08:34+0000\n" -"Last-Translator: kytv \n" -"Language-Team: Ukrainian (Ukraine) (http://www.transifex.com/projects/p/I2P/language/uk_UA/)\n" +"POT-Creation-Date: 2015-07-17 01:13+0000\n" +"PO-Revision-Date: 2015-08-07 16:52+0000\n" +"Last-Translator: Denis Lysenko \n" +"Language-Team: Ukrainian (Ukraine) (http://www.transifex.com/otf/I2P/language/uk_UA/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -237,7 +238,7 @@ msgstr "ПОМИЛКА: Не вдалось зберегти файл адрес #: ../src/java/src/i2p/susi/dns/AddressbookBean.java:326 #: ../src/java/src/i2p/susi/dns/ConfigBean.java:108 #: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:316 -#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:153 +#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:157 msgid "" "Invalid form submission, probably because you used the \"back\" or " "\"reload\" button on your browser. Please resubmit." @@ -246,14 +247,14 @@ msgstr "Форма не прийнята, скоріше всього це ві #: ../src/java/src/i2p/susi/dns/AddressbookBean.java:328 #: ../src/java/src/i2p/susi/dns/ConfigBean.java:110 #: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:318 -#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:155 +#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:159 msgid "" "If the problem persists, verify that you have cookies enabled in your " "browser." msgstr "Якщо проблема не усунена, то перевірте, чи у вашому браузері увімкнено куки (cookies)." #: ../src/java/src/i2p/susi/dns/ConfigBean.java:99 -#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:128 +#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:131 #: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:160 #: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:151 msgid "Save" @@ -264,7 +265,7 @@ msgid "Configuration saved." msgstr "Налаштування збережені." #: ../src/java/src/i2p/susi/dns/ConfigBean.java:102 -#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:147 +#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:151 #: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:158 #: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:149 msgid "Reload" @@ -293,16 +294,16 @@ msgstr "Не вдалося додати адресу призначення д msgid "Failed to delete Destination for {0} from naming service {1}" msgstr "Не вдалося видалити адресу призначення для {0} із служби імен {1}" -#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:140 +#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:144 msgid "" "Subscriptions saved, updating addressbook from subscription sources now." msgstr "Підписки збережені, запущено завантаження підписок і оновлення адресної книги." -#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:145 +#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:149 msgid "Subscriptions saved." msgstr "Підписки збережені." -#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:149 +#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:153 msgid "Subscriptions reloaded." msgstr "Підписки перезавантаженні." @@ -450,7 +451,7 @@ msgstr "Відмінити" #: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:373 msgid "Export in hosts.txt format" -msgstr "" +msgstr "Експорт у форматі hosts.txt" #: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:396 msgid "This address book is empty." diff --git a/apps/susimail/locale/messages_uk.po b/apps/susimail/locale/messages_uk.po index 4860d7be6..a8e313fdb 100644 --- a/apps/susimail/locale/messages_uk.po +++ b/apps/susimail/locale/messages_uk.po @@ -5,8 +5,8 @@ # # Translators: # 007 , 2014 -# Denis Blank , 2011 -# Denis Blank , 2011 +# Denis Lysenko , 2011 +# Denis Lysenko , 2011 # LinuxChata, 2014 # madjong , 2014-2015 msgid "" @@ -14,9 +14,9 @@ msgstr "" "Project-Id-Version: I2P\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-03-29 14:30+0000\n" -"PO-Revision-Date: 2015-04-08 19:55+0000\n" -"Last-Translator: madjong \n" -"Language-Team: Ukrainian (Ukraine) (http://www.transifex.com/projects/p/I2P/language/uk_UA/)\n" +"PO-Revision-Date: 2015-08-07 16:53+0000\n" +"Last-Translator: Denis Lysenko \n" +"Language-Team: Ukrainian (Ukraine) (http://www.transifex.com/otf/I2P/language/uk_UA/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" From fa792a9d5ea782f1c71d34f42a8688e652268a20 Mon Sep 17 00:00:00 2001 From: kytv Date: Fri, 11 Sep 2015 00:54:03 +0000 Subject: [PATCH 011/111] GeoIP db updates from 2015-09-02. --- history.txt | 5 + installer/resources/geoip.txt | 2835 ++++++++++++++++++++++------ installer/resources/geoipv6.dat.gz | Bin 136708 -> 143965 bytes 3 files changed, 2232 insertions(+), 608 deletions(-) diff --git a/history.txt b/history.txt index db2c40c3d..34ba9f682 100644 --- a/history.txt +++ b/history.txt @@ -1,3 +1,8 @@ +2015-09-11 kytv + * Updates to geoip.txt and geoipv6.dat.gz based on Maxmind GeoLite Country + database from 2015-09-02. + * Translation updates pulled from Transifex + 2015-09-04 zzz * UPnP: Fix "content not allowed in trailing section" (tickets #481, #1653) diff --git a/installer/resources/geoip.txt b/installer/resources/geoip.txt index e52eb5ac1..e2d1037c6 100644 --- a/installer/resources/geoip.txt +++ b/installer/resources/geoip.txt @@ -1,5 +1,5 @@ # Last updated based on Maxmind GeoLite Country -# dated 2015-07-24 +# dated 2015-09-02 # Script borrowed from Tor # # wget http://geolite.maxmind.com/download/geoip/database/GeoIPCountryCSV.zip @@ -649,7 +649,9 @@ 86837248,86839295,ES 86839296,86843391,GB 86847488,86849535,GB -86849536,86851583,CZ +86849536,86850559,CZ +86850560,86851327,NL +86851328,86851583,CZ 86851584,86855679,NL 86855680,86859775,RU 86859776,86863871,DE @@ -1239,9 +1241,7 @@ 93893120,93893375,NL 93893376,93893631,US 93893632,93893887,AU -93893888,93894399,US -93894400,93894655,GB -93894656,93896703,US +93893888,93896703,US 93896704,93904895,GB 93904896,93906943,LV 93906944,93908991,BA @@ -1533,7 +1533,8 @@ 96756744,96756751,NL 96756752,96757639,FR 96757640,96757643,CH -96757644,96757663,FR +96757644,96757647,SE +96757648,96757663,FR 96757664,96757667,SE 96757668,96757883,FR 96757884,96757887,ES @@ -1611,7 +1612,7 @@ 96778260,96778859,FR 96778860,96778863,NL 96778864,96778867,CZ -96778868,96778871,NL +96778868,96778871,BE 96778872,96778991,FR 96778992,96779007,DE 96779008,96779011,PT @@ -1623,7 +1624,9 @@ 96779520,96779523,NL 96779524,96779839,FR 96779840,96779903,NL -96779904,96782911,FR +96779904,96782199,FR +96782200,96782207,CZ +96782208,96782911,FR 96782912,96782915,LT 96782916,96783299,FR 96783300,96783303,ES @@ -1726,7 +1729,9 @@ 98992432,98992639,US 98992640,98993151,DE 98993152,98993175,US -98993176,99024895,DE +98993176,98998527,DE +98998528,98998783,GB +98998784,99024895,DE 99024896,99025167,GB 99025168,99025279,DE 99025280,99025407,US @@ -1801,7 +1806,9 @@ 100329472,100331519,RU 100331520,100335615,TR 100335616,100401151,KZ -100532224,100559255,RO +100532224,100548872,RO +100548873,100548873,TR +100548874,100559255,RO 100559256,100559263,EG 100559264,100559551,RO 100559552,100559615,GB @@ -1837,7 +1844,17 @@ 100646912,100647679,RU 100647680,100647711,TR 100647712,100663295,RU -100663296,134738943,US +100663296,134221823,US +134221824,134221824,DE +134221825,134222335,US +134222336,134222336,DE +134222337,134223871,US +134223872,134223872,GB +134223873,134224383,US +134224384,134224384,GB +134224385,134247423,US +134247424,134247424,DE +134247425,134738943,US 134738944,134739199,CA 134739200,135192575,US 135192576,135200767,MX @@ -2074,7 +2091,8 @@ 289642752,289652735,US 289652736,289653759,NL 289653760,289654271,DE -289654272,289656831,US +289654272,289655807,US +289655808,289656831,DE 289656832,289657855,BE 289657856,289658879,AE 289658880,289659903,GB @@ -2761,7 +2779,9 @@ 400911616,400911871,CR 400911872,400912127,US 400912128,400912383,SG -400912384,401130495,US +400912384,401129727,US +401129728,401129983,FR +401129984,401130495,US 401130496,401130751,DE 401130752,401137151,US 401137152,401137663,GB @@ -2815,7 +2835,8 @@ 402128896,402169855,CA 402169856,402223103,US 402223104,402227199,CA -402227200,402239301,US +402227200,402231295,US +402235392,402239301,US 402239302,402239302,CA 402239303,402239473,US 402239474,402239474,CA @@ -2829,8 +2850,8 @@ 402399232,402403327,CA 402403328,402415615,US 402415616,402416639,CA -402416640,402416895,US -402416896,402417663,CA +402416640,402417151,US +402417152,402417663,CA 402417664,402550015,US 402550016,402550271,CA 402550272,402550783,GB @@ -3430,7 +3451,9 @@ 521058304,521060351,IT 521060352,521074687,RO 521074688,521074943,EG -521074944,521075455,RO +521074944,521075199,RO +521075200,521075327,FR +521075328,521075455,RO 521075456,521075711,EG 521075712,521076479,RO 521076480,521076735,IN @@ -4118,7 +4141,9 @@ 533856256,533858303,FR 533858304,533858751,TR 533858752,533858815,AT -533858816,533859647,TR +533858816,533858895,TR +533858896,533858903,AT +533858904,533859647,TR 533859648,533859663,AT 533859664,533860351,TR 533862400,533864447,GB @@ -4207,11 +4232,7 @@ 534519552,534519807,NL 534519808,534521855,US 534521856,534522367,DE -534522368,534522879,NL -534522880,534523034,DE -534523035,534523035,NL -534523036,534523135,DE -534523136,534523391,NL +534522368,534523391,NL 534523392,534523903,DE 534523904,534530047,US 534530048,534538239,ES @@ -4256,7 +4277,9 @@ 539623424,539624577,NL 539624578,539624578,EU 539624579,539627519,NL -539627520,539629975,GB +539627520,539629455,GB +539629456,539629463,BE +539629464,539629975,GB 539629976,539629983,DE 539629984,539630975,GB 539630976,539630983,PT @@ -4657,7 +4680,9 @@ 624574464,624590847,NL 624590848,624625848,FR 624625849,624625849,CA -624625850,624640527,FR +624625850,624640255,FR +624640256,624640259,GB +624640260,624640527,FR 624640528,624640543,GB 624640544,624640759,FR 624640760,624640767,NL @@ -4741,7 +4766,9 @@ 624665952,624665955,NL 624665956,624666167,FR 624666168,624666168,GB -624666169,624666219,FR +624666169,624666172,FR +624666173,624666173,GB +624666174,624666219,FR 624666220,624666223,DE 624666224,624666695,FR 624666696,624666703,DE @@ -4892,7 +4919,7 @@ 624738304,624740351,NL 624740352,624742399,DE 624742400,624746495,RU -624746496,624754687,BG +624746496,624754687,US 624754688,624787455,AZ 624787456,624791551,DE 624791552,624795647,ES @@ -5224,11 +5251,14 @@ 630997504,630997759,MD 630997760,630998271,RO 630998272,630998783,MD -630998784,631001087,RO +630998784,630999039,RO +630999040,630999295,CN +630999296,631001087,RO 631001088,631005183,MD 631005184,631006207,IT 631006208,631007231,MD -631007232,631009279,RO +631007232,631007487,KR +631007488,631009279,RO 631009280,631017471,IR 631017472,631018495,MD 631018496,631019519,IT @@ -5236,10 +5266,14 @@ 631023616,631024639,IT 631024640,631024895,RO 631024896,631025151,GB -631025152,631029759,RO +631025152,631027711,RO +631027712,631027967,KR +631027968,631029759,RO 631029760,631033855,SE 631033856,631034879,IT -631034880,631039999,RO +631034880,631035903,RO +631035904,631036159,JP +631036160,631039999,RO 631040000,631043071,MD 631043072,631043839,RO 631043840,631045119,MD @@ -5467,7 +5501,9 @@ 635860992,635863039,BE 635863040,635893503,RU 635893504,635893759,AZ -635893760,635895807,RU +635893760,635894527,RU +635894528,635894783,KZ +635894784,635895807,RU 635895808,635961343,KW 635961344,635994111,GE 635994112,636026879,RU @@ -6102,7 +6138,11 @@ 700284928,700301311,GH 700301312,700309503,CD 700309504,700313599,DJ -700313600,700317695,US +700313600,700315584,US +700315585,700315585,DJ +700315586,700317478,US +700317479,700317479,DJ +700317480,700317695,US 700317696,700325887,NG 700325888,700334079,ZW 700334080,700335103,BJ @@ -6164,7 +6204,9 @@ 700593152,700594175,NG 700594176,700595199,A2 700595200,700596223,CD -700596224,700645375,A2 +700596224,700598783,A2 +700598784,700599039,CG +700599040,700645375,A2 700645376,700710911,ZA 700710912,700776447,EG 700776448,700841983,RW @@ -6523,7 +6565,9 @@ 711166592,711169311,JP 711169312,711169327,IN 711169328,711173119,JP -711173120,711173375,SG +711173120,711173210,SG +711173211,711173211,ID +711173212,711173375,SG 711173376,711196671,JP 711196672,711458815,CN 711458816,711983103,IN @@ -6713,7 +6757,7 @@ 736403456,736404479,KR 736405504,736408575,IN 736408576,736409599,CN -736409600,736410623,NZ +736409600,736410623,US 736410624,736411647,CN 736411648,736412671,NP 736412672,736413695,TH @@ -6743,7 +6787,6 @@ 736441344,736442367,HK 736442368,736443391,CN 736443392,736445439,AU -736445440,736446463,JP 736446464,736447487,IN 736447488,736448511,TH 736448512,736449535,IN @@ -6859,7 +6902,38 @@ 736621568,736622591,JP 736622592,736624639,IN 736624640,736886783,JP -736886784,737149951,CN +736886784,737096703,CN +737096704,737099775,IN +737099776,737100799,HK +737100800,737101823,IN +737101824,737102847,BD +737102848,737104895,IN +737104896,737106943,HK +737106944,737108991,NZ +737108992,737110015,SG +737110016,737111039,JP +737111040,737113087,IN +737113088,737115135,CN +737115136,737118207,IN +737118208,737119231,AU +737119232,737119999,NL +737120000,737121279,IN +737121280,737122303,VN +737122304,737123327,IN +737123328,737126399,HK +737126400,737127423,IN +737127424,737129471,CN +737129472,737130495,NZ +737130496,737132543,VN +737132544,737139711,IN +737139712,737141759,VN +737141760,737142783,IN +737142784,737143039,HK +737143040,737143807,MY +737143808,737146879,IN +737146880,737147903,NZ +737147904,737148927,MY +737148928,737149951,CN 737149952,737151999,IN 737152000,737154047,HK 737154048,737155071,MY @@ -6938,7 +7012,7 @@ 737308672,737309695,KR 737309696,737312767,IN 737312768,737313791,HK -737313792,737315839,JP +737314816,737315839,JP 737315840,737316863,HK 737316864,737324031,CN 737324032,737325055,HK @@ -7063,7 +7137,31 @@ 737539072,737540095,BD 737540096,737541119,ID 737541120,737542143,SG -737542144,737574911,CN +737542144,737567743,CN +737567744,737570815,IN +737570816,737571839,SG +737571840,737572863,HK +737572864,737574911,IN +737574912,737575935,JP +737575936,737576959,HK +737576960,737581055,IN +737581056,737582079,KR +737582080,737584127,IN +737584128,737585151,MY +737585152,737587199,HK +737587200,737588223,MY +737588224,737589247,KR +737589248,737590271,TH +737590272,737591295,TW +737591296,737593343,JP +737593344,737594367,BD +737594368,737596415,HK +737596416,737597439,CN +737597440,737598463,TW +737598464,737600511,PK +737600512,737601535,CN +737601536,737602559,AU +737602560,737607679,IN 737607680,737608703,HK 737608704,737610751,CN 737610752,737611775,ID @@ -7420,7 +7518,15 @@ 738195456,738197503,KR 738197504,747175935,US 747175936,747241471,NL -747241472,757186559,US +747241472,757071871,US +757071872,757088255,NL +757088256,757090303,US +757090304,757104639,NL +757104640,757106687,US +757106688,757133311,NL +757133312,757135359,AU +757135360,757137407,JP +757137408,757186559,US 757186560,757190655,CA 757190656,757600255,US 757600256,757604351,CA @@ -7443,7 +7549,9 @@ 757714176,757714431,JP 757714432,757716735,US 757716736,757716991,NZ -757716992,757729279,US +757716992,757721599,US +757721600,757721855,PH +757721856,757729279,US 757729280,757731327,CA 757731328,757733375,US 757733376,757734399,CA @@ -7460,9 +7568,10 @@ 757761792,757762047,US 757762048,757762303,MV 757762304,757762559,JP -757762560,757762815,US +757762560,757762815,PH 757762816,757763071,CD -757763072,757763583,US +757763072,757763327,US +757763328,757763583,PA 757763584,757763839,MN 757763840,757764095,US 757764096,757764351,ZW @@ -7494,9 +7603,7 @@ 757773056,757773311,MR 757773312,757774335,US 757774336,757774591,LR -757774592,757775359,US -757775360,757775487,SZ -757775488,757776639,US +757774592,757776639,US 757776640,757776767,GQ 757776768,757777919,US 757777920,757778047,LS @@ -7522,11 +7629,25 @@ 757790976,757791231,WS 757791232,757858303,US 757858304,757956607,CA -757956608,757956863,AU -757956864,758683647,US +757956608,757956863,HK +757956864,757957631,US +757957632,757957887,JP +757957888,757958399,US +757958400,757958655,DE +757958656,757959679,US +757959680,757959935,IT +757959936,757961471,US +757961472,757961727,HK +757961728,757965311,US +757965312,757965567,IN +757965568,758682111,US +758682112,758682367,PH +758682368,758683647,US 758683648,758683903,HK 758683904,758684159,SG -758684160,758685183,US +758684160,758684671,US +758684672,758684927,BR +758684928,758685183,IN 758685184,758685439,AU 758685440,758685695,JP 758685696,758691839,US @@ -7548,7 +7669,8 @@ 758876160,758876415,AU 758876416,758876671,US 758876672,758876927,SD -758876928,758877439,US +758876928,758877183,MH +758877184,758877439,US 758877440,758877695,KZ 758877696,758877951,IR 758877952,758878207,PG @@ -7847,7 +7969,8 @@ 762472448,762473471,CN 762473472,762475519,JP 762475520,762475775,AU -762475776,762476543,ID +762475776,762476031,HK +762476032,762476543,ID 762476544,762478591,PK 762478592,762479615,KR 762479616,762480639,PK @@ -8096,7 +8219,7 @@ 762876928,762877951,SG 762877952,762879231,HK 762879232,762879487,JP -762879488,762879743,SG +762879488,762879743,HK 762879744,762879999,CN 762880000,762881023,IN 762881024,762882047,CN @@ -8148,7 +8271,8 @@ 762950656,762951679,AU 762951680,762952703,JP 762952704,762953727,IN -762953728,762958847,HK +762953728,762957823,HK +762957824,762958847,AU 762958848,762959871,CN 762959872,762960895,ID 762960896,762964991,IN @@ -8199,12 +8323,96 @@ 763103232,763104255,HK 763104256,763105279,BD 763105280,763106303,PH -763106304,763111423,CN +763106304,763107327,CN +763107328,763108351,HK +763108352,763111423,CN 763111424,763112447,AU 763112448,763113471,CN 763113472,763114495,IN +763114496,763115519,AU +763115520,763116543,PH +763116544,763117567,JP +763117568,763118591,HK +763118592,763119615,CN +763119616,763120639,HK +763120640,763122687,CN +763122688,763125759,VN +763125760,763126783,IN +763126784,763127807,CN +763127808,763129343,IN +763129344,763129855,AU +763129856,763130879,HK +763130880,763132927,IN +763132928,763133951,CN +763133952,763134975,IN +763134976,763135999,HK +763136000,763137023,JP +763137024,763142143,IN +763142144,763143167,HK +763143168,763144191,AU +763144192,763145215,BD +763145216,763147263,CN +763147264,763152383,IN +763152384,763153407,AU +763153408,763154431,JP +763154432,763155455,CN +763155456,763156479,AU +763156480,763158527,JP +763158528,763164671,IN +763164672,763166719,CN +763166720,763169791,HK +763169792,763171839,CN +763171840,763172863,SG +763172864,763175935,CN +763175936,763177983,IN +763177984,763179007,CN +763179008,763180031,HK +763180032,763182079,CN +763182080,763183103,IN +763183104,763184127,HK +763184128,763185151,IN +763185152,763186175,HK +763186176,763194367,CN +763194368,763196415,HK +763196416,763197439,IN +763197440,763199487,AU +763199488,763201535,IN +763201536,763202559,CN +763202560,763207679,IN +763207680,763209727,HK +763209728,763210751,NZ +763210752,763214847,IN +763214848,763215871,JP +763215872,763217919,SG +763217920,763220991,VN +763220992,763222015,IN +763222016,763223039,HK +763223040,763224063,BD +763224064,763225087,AF +763225088,763226111,TH +763226112,763227135,KR +763227136,763228159,VN +763228160,763229183,JP +763229184,763229439,NZ +763229440,763230207,IN +763230208,763231231,PH +763231232,763232255,IN +763232256,763234303,HK +763234304,763235327,IN +763235328,763236351,HK +763236352,763238399,IN +763238400,763239423,AU +763239424,763243519,IN +763243520,763244543,AU +763244544,763246591,CN +763246592,763247615,ID +763247616,763248639,SG +763248640,763250687,IN +763250688,763251711,AU +763251712,763252735,HK 767557632,768606207,ZA 768606208,768868351,GH +768868352,769130495,ZM 769130496,769392639,MA 770703360,771227647,EG 771751936,771817471,RU @@ -10103,15 +10311,16 @@ 839339608,839339609,A1 839339610,839340031,US 839340032,839341055,ES -839341056,839348223,US +839341056,839342079,US +839342080,839343103,DE +839343104,839348223,US 839348224,839348479,DE 839348480,839348735,AT 839348736,839348991,GB 839348992,839349247,AT 839349248,839350271,DE 839350272,839351295,NL -839351296,839351807,US -839351808,839352063,DE +839351296,839352063,DE 839352064,839352319,US 839352320,839357439,NL 839357440,839358463,FR @@ -10183,22 +10392,26 @@ 871038976,871104511,SA 871104512,872153087,GB 872153088,872284159,SA -872284160,872415231,FR +872284160,872288871,FR +872288872,872288875,DE +872288876,872290111,FR +872290112,872290143,ES +872290144,872415231,FR 872415232,873463807,US 873463808,873725951,IE 873725952,874250239,US -874250240,874315775,DE -874315776,876609535,US -876609536,876642303,AU -876642304,876871679,US +874250240,874381311,DE +874381312,876609535,US +876609536,876675071,AU +876675072,876871679,US 876871680,877002751,JP 877002752,877264895,US 877264896,877330431,SG 877330432,877395967,US 877395968,877428735,SG -877428736,878510079,US -878510080,878518271,DE -878518272,878650367,US +877428736,878649855,US +878649856,878650111,JP +878650112,878650367,SG 878650368,878651391,AU 878651392,878655487,US 878655488,878656511,JP @@ -10753,7 +10966,9 @@ 1023238144,1023246335,ID 1023246336,1023279103,CN 1023279104,1023311871,IN -1023311872,1023328255,US +1023311872,1023317503,US +1023317504,1023317759,IN +1023317760,1023328255,US 1023328256,1023344639,JP 1023344640,1023410175,CN 1023410176,1023672319,IN @@ -10811,13 +11026,11 @@ 1024365056,1024365311,AP 1024365312,1024365567,JP 1024365568,1024365823,SG -1024365824,1024368639,JP -1024368640,1024369407,MY -1024369408,1024371199,JP +1024365824,1024371199,JP 1024371200,1024371455,PH 1024371456,1024372543,JP -1024372544,1024372607,HK -1024372608,1024373263,JP +1024372544,1024372639,HK +1024372640,1024373263,JP 1024373264,1024373279,HK 1024373280,1024376831,JP 1024376832,1024378879,PH @@ -10834,7 +11047,7 @@ 1025294592,1025294847,SG 1025294848,1025295103,TH 1025295104,1025295615,CN -1025295616,1025295871,MY +1025295616,1025295871,PH 1025295872,1025296127,GB 1025296128,1025296639,FR 1025296640,1025296895,MY @@ -11560,7 +11773,9 @@ 1049030656,1049031679,DE 1049031680,1049031743,EU 1049031744,1049031871,DE -1049031872,1049034751,EU +1049031872,1049032093,EU +1049032094,1049032094,DE +1049032095,1049034751,EU 1049034752,1049067519,EG 1049067520,1049100287,DK 1049100288,1049231359,GB @@ -11568,7 +11783,9 @@ 1049296896,1049362431,EG 1049362432,1049366527,GB 1049366528,1049368575,DE -1049368576,1049369983,GB +1049368576,1049368656,GB +1049368657,1049368657,DE +1049368658,1049369983,GB 1049369984,1049370047,DE 1049370048,1049370623,GB 1049370624,1049378815,AT @@ -13080,7 +13297,9 @@ 1080024320,1080024575,CA 1080024576,1080033279,US 1080033280,1080164351,KY -1080164352,1080295423,CA +1080164352,1080225791,CA +1080225792,1080229887,US +1080229888,1080295423,CA 1080295424,1080498664,US 1080498665,1080498665,EU 1080498666,1080501503,US @@ -13258,7 +13477,9 @@ 1087444224,1087444479,GB 1087444480,1087465727,US 1087465728,1087465983,AU -1087465984,1087496703,US +1087465984,1087466883,US +1087466884,1087466887,GB +1087466888,1087496703,US 1087496704,1087496959,CA 1087496960,1087501567,US 1087501568,1087501695,HK @@ -13304,9 +13525,13 @@ 1088012768,1088012775,PR 1088012776,1088684031,US 1088684032,1088946175,CA -1088946176,1089057279,US +1088946176,1089055999,US +1089056000,1089056255,AP +1089056256,1089057279,US 1089057280,1089057535,EU -1089057536,1089167359,US +1089057536,1089151231,US +1089151232,1089151487,NL +1089151488,1089167359,US 1089167360,1089171455,CA 1089171456,1089171967,A2 1089171968,1089172735,US @@ -13496,7 +13721,9 @@ 1093966164,1093966164,NL 1093966165,1093966216,US 1093966217,1093966217,NL -1093966218,1094074879,US +1093966218,1093984294,US +1093984295,1093984295,IE +1093984296,1094074879,US 1094074880,1094075167,BR 1094075168,1094088959,US 1094088960,1094089023,PR @@ -13550,7 +13777,9 @@ 1098070272,1098070279,GR 1098070280,1098070295,US 1098070296,1098070303,BE -1098070304,1101121535,US +1098070304,1098891623,US +1098891624,1098891631,AU +1098891632,1101121535,US 1101121536,1101121791,EC 1101121792,1101182975,US 1101182976,1101183487,YE @@ -13730,7 +13959,9 @@ 1108525056,1108541439,CA 1108541440,1109688319,US 1109688320,1109696511,CA -1109696512,1109707007,US +1109696512,1109705727,US +1109705728,1109705983,CG +1109705984,1109707007,US 1109707008,1109707263,JM 1109707264,1109707519,US 1109707520,1109707775,MW @@ -13836,10 +14067,15 @@ 1112539136,1112870911,US 1112871936,1112873983,US 1112873984,1112875007,CA -1112875008,1112907775,US +1112875008,1112875519,US +1112875520,1112875775,CA +1112875776,1112889855,US +1112890112,1112890367,CA +1112890368,1112907775,US 1112907776,1112907783,CA 1112907784,1112931327,US 1112931328,1112931839,CA +1112931840,1112932095,US 1112932352,1113591807,US 1113591808,1113595903,CA 1113595904,1113596415,CL @@ -13856,9 +14092,10 @@ 1113603328,1113603583,GT 1113603584,1113603839,US 1113603840,1113604095,CA -1113604096,1113643202,US -1113643203,1113643237,CH -1113643238,1113657343,US +1113604096,1113636863,US +1113636864,1113645055,SG +1113645056,1113653247,ID +1113653248,1113657343,US 1113657344,1113661439,CA 1113661440,1113669631,US 1113669632,1113677823,CA @@ -13969,7 +14206,9 @@ 1117458912,1117458943,GB 1117458944,1117460223,US 1117460224,1117460287,GB -1117460288,1117470719,US +1117460288,1117460991,US +1117460992,1117461247,GB +1117461248,1117470719,US 1117470720,1117471231,CA 1117471232,1117480191,US 1117480192,1117480255,CA @@ -14696,6 +14935,7 @@ 1158427648,1158428159,CA 1158428160,1158428415,US 1158428672,1158440959,US +1158440960,1158441215,CA 1158441216,1158441471,US 1158441472,1158441983,CA 1158441984,1158443007,DM @@ -14871,11 +15111,17 @@ 1161427456,1161428223,AG 1161428224,1161428991,KN 1161428992,1161429247,US -1161429248,1161429503,CA +1161429248,1161429375,CA +1161429376,1161429407,US +1161429408,1161429503,CA 1161429504,1161429951,US 1161429952,1161430015,CA 1161430016,1161430783,US -1161430784,1161431039,CA +1161430784,1161430879,CA +1161430880,1161430911,US +1161430912,1161430943,CA +1161430944,1161430975,US +1161430976,1161431039,CA 1161431040,1161433087,A2 1161433088,1161437183,CA 1161437184,1161453567,US @@ -15031,7 +15277,9 @@ 1163538464,1163538479,CA 1163538480,1163538575,US 1163538576,1163538591,CA -1163538592,1163540351,US +1163538592,1163539199,US +1163539200,1163539455,CA +1163539456,1163540351,US 1163540352,1163540479,CA 1163540480,1163540735,US 1163540736,1163541503,CA @@ -15506,7 +15754,13 @@ 1211334656,1211367935,US 1211367936,1211368191,CA 1211368192,1211368447,EE -1211368448,1211432959,US +1211368448,1211390981,US +1211390982,1211390982,DE +1211390983,1211390989,US +1211390990,1211390990,DE +1211390991,1211391216,US +1211391217,1211391217,IT +1211391218,1211432959,US 1211432960,1211473919,CA 1211473920,1211596799,US 1211596800,1211605999,CA @@ -15788,7 +16042,9 @@ 1249720600,1249720607,IT 1249720608,1249720663,GB 1249720664,1249720671,SE -1249720672,1249720831,GB +1249720672,1249720711,GB +1249720712,1249720719,NL +1249720720,1249720831,GB 1249720832,1249721343,US 1249721344,1249721351,AT 1249721352,1249721359,BE @@ -15920,7 +16176,9 @@ 1264718720,1264718847,CA 1264718848,1264719103,US 1264719104,1264719871,CA -1264719872,1264762879,US +1264719872,1264746527,US +1264746528,1264746543,CA +1264746544,1264762879,US 1264762880,1264763391,CA 1264763392,1264763647,IE 1264763648,1264766975,CA @@ -16339,7 +16597,9 @@ 1297178112,1297178367,QA 1297178368,1297178623,RO 1297178624,1297178879,NL -1297178880,1297182719,RO +1297178880,1297181951,RO +1297181952,1297182463,DE +1297182464,1297182719,RO 1297182720,1297184767,ES 1297184768,1297185279,BZ 1297185280,1297190143,RO @@ -16870,7 +17130,12 @@ 1310707968,1310708223,PL 1310708224,1310708479,RU 1310708480,1310708735,GB -1310708736,1310709247,IE +1310708736,1310708927,IE +1310708928,1310708943,GB +1310708944,1310709199,IE +1310709200,1310709215,DE +1310709216,1310709231,NL +1310709232,1310709247,IE 1310709248,1310709759,PL 1310709760,1310711807,RU 1310711808,1310713855,LT @@ -17428,7 +17693,9 @@ 1334725632,1334726143,SE 1334726144,1334726399,LU 1334726400,1334726655,SE -1334726656,1334734847,RU +1334726656,1334730239,RU +1334730240,1334730495,KZ +1334730496,1334734847,RU 1334734848,1334738943,LT 1334738944,1334743039,CH 1334743040,1334747135,CZ @@ -17441,7 +17708,9 @@ 1334779904,1334783999,UA 1334784000,1334788095,AT 1334788096,1334792191,RU -1334792192,1334794239,GB +1334792192,1334793320,GB +1334793321,1334793321,IR +1334793322,1334794239,GB 1334794240,1334796287,ES 1334796288,1334800383,ME 1334800384,1334804479,IT @@ -17760,8 +18029,8 @@ 1347010560,1347014655,RU 1347014656,1347018751,GG 1347018752,1347022847,IT -1347022848,1347026943,AT -1347026944,1347035135,GB +1347022848,1347024895,AT +1347024896,1347035135,GB 1347035136,1347039231,CZ 1347039232,1347043327,RO 1347043328,1347047423,FR @@ -18383,7 +18652,9 @@ 1353262296,1353262303,US 1353262304,1353271567,GB 1353271568,1353271575,AT -1353271576,1353271727,GB +1353271576,1353271711,GB +1353271712,1353271719,AT +1353271720,1353271727,GB 1353271728,1353271743,AT 1353271744,1353271775,GB 1353271776,1353271807,AT @@ -18478,7 +18749,9 @@ 1357318160,1357318191,GB 1357318192,1357318399,EU 1357318400,1357318655,FR -1357318656,1357321023,EU +1357318656,1357318911,EU +1357318912,1357319167,DE +1357319168,1357321023,EU 1357321024,1357321087,KE 1357321088,1357321983,EU 1357321984,1357322239,GB @@ -18488,8 +18761,8 @@ 1357323008,1357323015,CG 1357323016,1357323519,EU 1357323520,1357323775,GB -1357323776,1357323783,FI -1357323784,1357324287,EU +1357323776,1357323791,FI +1357323792,1357324287,EU 1357324288,1357325311,GB 1357325312,1357326335,EU 1357326336,1357326337,ES @@ -18534,8 +18807,10 @@ 1357348416,1357348479,EU 1357348480,1357348607,ES 1357348608,1357350399,EU -1357350400,1357350591,GB -1357350592,1357351167,EU +1357350400,1357350607,GB +1357350608,1357350655,EU +1357350656,1357350783,GB +1357350784,1357351167,EU 1357351168,1357351423,PL 1357351424,1357360063,EU 1357360064,1357360127,GB @@ -18566,11 +18841,11 @@ 1357373556,1357373567,EU 1357373568,1357373695,GB 1357373696,1357373951,EU -1357373952,1357375103,GB -1357375104,1357377535,EU +1357373952,1357375135,GB +1357375136,1357377535,EU 1357377536,1357377671,FR -1357377672,1357377791,EU -1357377792,1357378559,FR +1357377672,1357377695,EU +1357377696,1357378559,FR 1357378560,1357381631,EU 1357381632,1357414399,NO 1357414400,1357447167,LV @@ -18964,7 +19239,9 @@ 1359036416,1359052799,GB 1359052800,1359101951,RU 1359101952,1359118335,GB -1359118336,1359119199,DE +1359118336,1359118655,DE +1359118656,1359118719,GR +1359118720,1359119199,DE 1359119200,1359119231,NL 1359119232,1359119359,DE 1359119360,1359120383,NL @@ -19239,9 +19516,13 @@ 1360986270,1360986270,US 1360986271,1360986299,GB 1360986300,1360986300,US -1360986301,1360986367,GB +1360986301,1360986356,GB +1360986357,1360986358,US +1360986359,1360986367,GB 1360986368,1360986399,US -1360986400,1360992255,GB +1360986400,1360986631,GB +1360986632,1360986635,US +1360986636,1360992255,GB 1360992256,1360992511,DE 1360992512,1360994303,GB 1360994304,1360998399,CZ @@ -19858,7 +20139,9 @@ 1383497728,1383505919,RU 1383505920,1383514111,SA 1383514112,1383522303,FI -1383522304,1383530495,BG +1383522304,1383523839,BG +1383523840,1383524095,GB +1383524096,1383530495,BG 1383530496,1383538687,DE 1383538688,1383546879,IT 1383546880,1383555071,BG @@ -19938,7 +20221,11 @@ 1385275392,1385283583,IT 1385283584,1385286143,DE 1385286144,1385287679,GB -1385287680,1385291775,EU +1385287680,1385290631,EU +1385290632,1385290632,IS +1385290633,1385291343,EU +1385291344,1385291344,IS +1385291345,1385291775,EU 1385291776,1385299967,TR 1385299968,1385308159,BG 1385308160,1385312255,RU @@ -19996,7 +20283,9 @@ 1386217472,1386283007,PL 1386283008,1386348543,NL 1386348544,1386414079,RU -1386414080,1386448895,GB +1386414080,1386438399,GB +1386438400,1386438655,FR +1386438656,1386448895,GB 1386448896,1386450943,IL 1386450944,1386479615,GB 1386479616,1386545151,NO @@ -21527,7 +21816,9 @@ 1431994368,1432002559,AT 1432002560,1432010751,HU 1432010752,1432018943,UA -1432018944,1432027135,GB +1432018944,1432024063,GB +1432024064,1432025087,DE +1432025088,1432027135,GB 1432027136,1432035327,IE 1432035328,1432043519,GB 1432043520,1432051711,ES @@ -21622,7 +21913,7 @@ 1433731072,1433739263,PL 1433739264,1433747455,GE 1433747456,1433755647,RU -1433755648,1433763839,EE +1433755648,1433763839,KZ 1433763840,1433772031,FR 1433772032,1433788415,SE 1433796608,1433804799,GB @@ -21822,9 +22113,7 @@ 1438878208,1438885887,RU 1438885888,1438889983,LT 1438889984,1438892031,RU -1438892032,1438893823,IS -1438893824,1438894079,CH -1438894080,1438896127,IS +1438892032,1438896127,CH 1438896128,1438900223,AQ 1438900224,1438908415,CH 1438908416,1438924799,GR @@ -21900,7 +22189,9 @@ 1439467520,1439468031,DK 1439468032,1439468543,RO 1439468544,1439469567,ES -1439469568,1439477759,RO +1439469568,1439475711,RO +1439475712,1439475967,IN +1439475968,1439477759,RO 1439477760,1439479807,MD 1439479808,1439482367,RO 1439482368,1439482879,DK @@ -22171,7 +22462,7 @@ 1449778688,1449779455,RO 1449779456,1449779711,GB 1449779712,1449779967,RO -1449779968,1449780223,EU +1449779968,1449780223,RU 1449780224,1449780479,RO 1449780480,1449780991,GB 1449780992,1449781247,RO @@ -22197,7 +22488,7 @@ 1449811968,1449812223,DK 1449812224,1449812991,RO 1449812992,1449813503,GB -1449813504,1449813759,EU +1449813504,1449813759,RU 1449813760,1449814271,RO 1449814272,1449815039,GB 1449815040,1449815295,RO @@ -23167,7 +23458,9 @@ 1495313152,1495313407,MD 1495313408,1495316991,RO 1495316992,1495317503,IT -1495317504,1495319295,RO +1495317504,1495319039,RO +1495319040,1495319167,FR +1495319168,1495319295,RO 1495319296,1495319551,SE 1495319552,1495320063,IR 1495320064,1495326719,RO @@ -23194,7 +23487,8 @@ 1495351296,1495351551,GB 1495351552,1495351807,MD 1495351808,1495352319,IQ -1495352320,1495352831,RO +1495352320,1495352447,FR +1495352448,1495352831,RO 1495352832,1495353087,FI 1495353088,1495362559,RO 1495362560,1495363583,ES @@ -23230,9 +23524,7 @@ 1495406080,1495408639,RO 1495408640,1495416831,IR 1495416832,1495418879,MD -1495418880,1495419391,RO -1495419392,1495419903,EU -1495419904,1495422975,RO +1495418880,1495422975,RO 1495422976,1495423487,IR 1495423488,1495424511,RO 1495424512,1495425023,IR @@ -23246,7 +23538,9 @@ 1495428864,1495429119,DE 1495429120,1495433215,RO 1495433216,1495441407,IR -1495441408,1495442943,RO +1495441408,1495442431,RO +1495442432,1495442559,FR +1495442560,1495442943,RO 1495442944,1495443199,AE 1495443200,1495443455,RO 1495443456,1495443967,IR @@ -23290,7 +23584,9 @@ 1495498368,1495498495,BD 1495498496,1495499775,RO 1495499776,1495500287,IR -1495500288,1495505151,RO +1495500288,1495502847,RO +1495502848,1495503871,PL +1495503872,1495505151,RO 1495505152,1495505407,GB 1495505408,1495505919,RO 1495505920,1495506431,IR @@ -23304,7 +23600,8 @@ 1495511552,1495511807,LT 1495511808,1495515647,RO 1495515648,1495516159,IR -1495516160,1495516671,RO +1495516160,1495516287,FR +1495516288,1495516671,RO 1495516672,1495516927,GR 1495516928,1495517183,RO 1495517184,1495518207,MD @@ -23327,7 +23624,9 @@ 1495554560,1495555071,SE 1495555072,1495556095,RO 1495556096,1495560191,IR -1495560192,1495566847,RO +1495560192,1495566335,RO +1495566336,1495566591,GB +1495566592,1495566847,RO 1495566848,1495567359,GB 1495567360,1495571455,RO 1495571456,1495572479,MD @@ -23357,8 +23656,8 @@ 1495623168,1495623679,IR 1495623680,1495624191,MD 1495624192,1495630079,RO -1495630080,1495631359,GB -1495631360,1495632127,RO +1495630080,1495631615,GB +1495631616,1495632127,RO 1495632128,1495632639,MD 1495632640,1495642111,RO 1495642112,1495644159,SE @@ -23403,7 +23702,9 @@ 1495760128,1495760895,RO 1495760896,1495762943,DE 1495762944,1495763967,GB -1495763968,1495765503,RO +1495763968,1495764735,RO +1495764736,1495764991,AU +1495764992,1495765503,RO 1495765504,1495765759,GB 1495765760,1495766015,NL 1495766016,1495767039,RO @@ -23424,7 +23725,9 @@ 1495791360,1495791615,GB 1495791616,1495793663,RO 1495793664,1495794687,DE -1495794688,1495795455,RO +1495794688,1495795199,RO +1495795200,1495795327,FR +1495795328,1495795455,RO 1495795456,1495795711,RU 1495795712,1495803391,RO 1495803392,1495803903,IR @@ -23504,7 +23807,11 @@ 1495970816,1495971839,MD 1495971840,1495983103,RO 1495983104,1495983615,IR -1495983616,1495990271,RO +1495983616,1495985663,RO +1495985664,1495985791,FR +1495985792,1495985919,RO +1495985920,1495986175,JP +1495986176,1495990271,RO 1495990272,1495994367,IR 1495994368,1495998463,RO 1495998464,1495998719,SG @@ -23518,7 +23825,9 @@ 1496012800,1496016895,IR 1496016896,1496018943,RO 1496018944,1496019967,FR -1496019968,1496036863,RO +1496019968,1496020735,RO +1496020736,1496020991,AU +1496020992,1496036863,RO 1496036864,1496037375,IR 1496037376,1496038399,RO 1496038400,1496038911,IR @@ -23534,7 +23843,9 @@ 1496057856,1496058111,DE 1496058112,1496066815,RO 1496066816,1496067071,QA -1496067072,1496084479,RO +1496067072,1496073983,RO +1496073984,1496074239,ES +1496074240,1496084479,RO 1496084480,1496084991,IR 1496084992,1496085247,MD 1496085248,1496086015,RO @@ -23580,7 +23891,9 @@ 1496197120,1496197631,MD 1496197632,1496198143,RO 1496198144,1496198655,IR -1496198656,1496202239,RO +1496198656,1496198911,RO +1496198912,1496199167,GB +1496199168,1496202239,RO 1496202240,1496202751,IR 1496202752,1496203263,RO 1496203264,1496205311,IT @@ -23590,7 +23903,9 @@ 1496213504,1496215551,IT 1496215552,1496216319,RO 1496216320,1496216575,MD -1496216576,1496228863,RO +1496216576,1496221695,RO +1496221696,1496223743,ES +1496223744,1496228863,RO 1496228864,1496229887,MD 1496229888,1496231935,RO 1496231936,1496233983,PS @@ -23621,9 +23936,7 @@ 1499856896,1499987967,CZ 1499987968,1499996159,AT 1499996160,1500004351,GB -1500004352,1500008447,RU -1500008448,1500012543,IR -1500012544,1500020735,RU +1500004352,1500020735,RU 1500020736,1500028927,IS 1500028928,1500037119,NL 1500037120,1500045311,DK @@ -24085,7 +24398,9 @@ 1506410496,1506422063,DE 1506422064,1506422079,GB 1506422080,1506443263,DE -1506443264,1506444757,GB +1506443264,1506444397,GB +1506444398,1506444398,DE +1506444399,1506444757,GB 1506444758,1506444758,DE 1506444759,1506445103,GB 1506445104,1506445119,DE @@ -24135,7 +24450,9 @@ 1506463680,1506463695,DE 1506463696,1506464895,GB 1506464896,1506464911,NL -1506464912,1506465023,GB +1506464912,1506464999,GB +1506465000,1506465007,NL +1506465008,1506465023,GB 1506465024,1506465187,EU 1506465188,1506465188,NL 1506465189,1506465279,EU @@ -24147,11 +24464,15 @@ 1506469664,1506469695,IT 1506469696,1506469759,GB 1506469760,1506469775,IT -1506469776,1506471983,GB +1506469776,1506471871,GB +1506471872,1506471903,IT +1506471904,1506471983,GB 1506471984,1506471999,NL 1506472000,1506472031,GB 1506472032,1506472047,NL -1506472048,1506476031,GB +1506472048,1506475873,GB +1506475874,1506475874,DE +1506475875,1506476031,GB 1506476032,1506508799,KW 1506508800,1506541567,CZ 1506541568,1506574335,RU @@ -25405,7 +25726,6 @@ 1539560960,1539561471,UA 1539561472,1539561983,RO 1539561984,1539563007,DE -1539563008,1539563519,RU 1539563520,1539564031,SE 1539564032,1539564543,KZ 1539564544,1539565055,GB @@ -27107,7 +27427,6 @@ 1540654080,1540654335,EU 1540654336,1540654591,RU 1540654592,1540654847,SI -1540654848,1540655103,RU 1540655104,1540655359,AT 1540655360,1540655615,RU 1540655616,1540655871,GB @@ -27120,7 +27439,7 @@ 1540658176,1540658431,RO 1540658432,1540659199,RU 1540659200,1540659455,FR -1540659456,1540659967,UA +1540659712,1540659967,UA 1540659968,1540660223,PL 1540660224,1540660479,RU 1540660480,1540660735,FR @@ -27919,10 +28238,9 @@ 1541010944,1541011199,CY 1541011200,1541011455,CH 1541011456,1541011711,FI -1541011712,1541011967,RU 1541012224,1541012479,DE 1541012480,1541012735,FI -1541012736,1541013247,UA +1541012992,1541013247,UA 1541013248,1541013503,SI 1541013504,1541014527,RO 1541014528,1541015551,AM @@ -28301,7 +28619,6 @@ 1541232128,1541232639,RU 1541232640,1541233151,PL 1541233152,1541233663,RU -1541233664,1541234175,SK 1541234176,1541234687,RO 1541234688,1541235199,NL 1541235200,1541235455,RU @@ -28454,7 +28771,6 @@ 1541347584,1541347839,RU 1541347840,1541348095,SI 1541348096,1541348351,UA -1541348352,1541348607,RU 1541348608,1541348863,HR 1541348864,1541349119,UA 1541349120,1541349375,PL @@ -29444,7 +29760,6 @@ 1541904384,1541904639,PL 1541904640,1541904895,SE 1541904896,1541905407,GB -1541905408,1541905663,RU 1541905664,1541905919,PL 1541905920,1541906431,RS 1541906432,1541906687,UA @@ -29634,7 +29949,7 @@ 1542017792,1542018047,GB 1542018048,1542019071,DE 1542019072,1542019327,RU -1542019328,1542020095,UA +1542019584,1542020095,UA 1542020096,1542021119,RU 1542021120,1542023167,UA 1542023168,1542023423,PL @@ -29762,7 +30077,7 @@ 1542106112,1542107135,RU 1542107136,1542107391,PL 1542107392,1542107903,RU -1542107904,1542108159,SK +1542107904,1542108159,AT 1542108160,1542109183,RU 1542109184,1542109695,GB 1542109696,1542110207,PL @@ -29801,7 +30116,6 @@ 1542124800,1542125567,PL 1542125568,1542126591,CZ 1542126592,1542127103,PL -1542127360,1542127615,RU 1542127616,1542128127,PL 1542128128,1542128383,RU 1542128384,1542129151,RO @@ -29988,7 +30302,8 @@ 1542237184,1542238207,PL 1542238208,1542239743,RU 1542239744,1542239999,HU -1542240000,1542240767,RU +1542240000,1542240255,RU +1542240256,1542240767,UA 1542240768,1542241023,DK 1542241024,1542241279,GB 1542241280,1542241535,LV @@ -30163,7 +30478,7 @@ 1542343680,1542344447,PL 1542344448,1542345727,RU 1542345984,1542346239,PL -1542346240,1542348287,RU +1542346240,1542347775,RU 1542348288,1542348799,MD 1542348800,1542349823,RU 1542349824,1542350847,UA @@ -30737,7 +31052,8 @@ 1546006528,1546008575,UA 1546008576,1546014719,BY 1546014720,1546015743,RU -1546015744,1546027007,CZ +1546015744,1546018815,CZ +1546018816,1546027007,UA 1546027008,1546059775,RU 1546059776,1546063871,SE 1546063872,1546067967,DE @@ -31096,7 +31412,9 @@ 1558056104,1558079407,FR 1558079408,1558079415,PL 1558079416,1558079423,GB -1558079424,1558081175,FR +1558079424,1558079871,FR +1558079872,1558079887,GB +1558079888,1558081175,FR 1558081176,1558081183,BE 1558081184,1558083775,FR 1558083776,1558083791,DE @@ -31128,7 +31446,9 @@ 1558122496,1558123007,SG 1558123008,1558123519,RU 1558123520,1558125567,LU -1558125568,1558147071,AT +1558125568,1558141439,AT +1558141440,1558141695,CY +1558141696,1558147071,AT 1558147072,1558147327,LU 1558147328,1558147583,AT 1558147584,1558147839,RU @@ -31503,16 +31823,22 @@ 1567826176,1567826431,DE 1567826432,1567827455,RO 1567827456,1567827711,BG -1567827712,1567833087,RO +1567827712,1567832831,RO +1567832832,1567833087,GB 1567833088,1567833599,NL 1567833600,1567834111,IT 1567834112,1567838207,RO 1567838208,1567842303,A1 -1567842304,1567852543,RO +1567842304,1567842815,FR +1567842816,1567852543,RO 1567852544,1567856639,MD 1567856640,1567858687,RO 1567858688,1567860735,SE -1567860736,1567871999,RO +1567860736,1567866879,RO +1567866880,1567867135,IN +1567867136,1567869183,RO +1567869184,1567869439,NL +1567869440,1567871999,RO 1567872000,1567873023,ES 1567873024,1567879167,MD 1567879168,1567883263,RO @@ -31539,11 +31865,14 @@ 1568024320,1568038911,RO 1568038912,1568059391,IR 1568059392,1568060415,RO -1568060416,1568062463,MD -1568062464,1568088063,RO +1568060416,1568063487,MD +1568063488,1568083967,RO +1568083968,1568084223,CN +1568084224,1568088063,RO 1568088064,1568104447,IR 1568104448,1568106495,MD -1568106496,1568108543,RO +1568106496,1568107519,RO +1568107520,1568108543,MD 1568108544,1568109055,GB 1568109056,1568110079,RO 1568110080,1568111103,GB @@ -31640,7 +31969,7 @@ 1571422208,1571422463,CZ 1571422464,1571422719,UA 1571422720,1571423231,RU -1571423232,1571423487,CZ +1571423232,1571423487,UA 1571423488,1571423999,RU 1571424000,1571424255,KZ 1571424256,1571424511,KG @@ -31654,7 +31983,9 @@ 1571425233,1571425279,CZ 1571425280,1571425535,RU 1571425536,1571425791,NL -1571425792,1571426047,CZ +1571425792,1571425871,CZ +1571425872,1571425872,RU +1571425873,1571426047,CZ 1571426048,1571426303,UA 1571426304,1571428607,CZ 1571428608,1571428863,UA @@ -31712,16 +32043,17 @@ 1571469312,1571469823,BY 1571469824,1571470335,CZ 1571470336,1571470847,UA -1571470848,1571471103,RU -1571471104,1571471359,CZ -1571471360,1571475455,RU +1571470848,1571475455,RU 1571475456,1571476479,CZ 1571476480,1571479551,RU 1571479552,1571483647,CZ 1571483648,1571484159,RU 1571484160,1571487743,CZ -1571487744,1571489791,SK -1571489792,1571490303,CZ +1571487744,1571489023,SK +1571489024,1571489279,UA +1571489280,1571489535,BY +1571489536,1571490047,RU +1571490048,1571490303,CZ 1571490304,1571491071,RU 1571491072,1571491327,CZ 1571491328,1571495935,UA @@ -31734,7 +32066,9 @@ 1571514368,1571520511,BY 1571520512,1571522047,UA 1571522048,1571522815,RU -1571522816,1571524607,CZ +1571522816,1571524095,CZ +1571524096,1571524351,RU +1571524352,1571524607,CZ 1571524608,1571526655,RU 1571526656,1571528191,CZ 1571528192,1571528703,UA @@ -31757,8 +32091,8 @@ 1571535872,1571538943,RU 1571538944,1571539967,CZ 1571539968,1571540223,UA -1571540224,1571540694,CZ -1571540695,1571540695,RU +1571540224,1571540693,CZ +1571540694,1571540695,RU 1571540696,1571540696,CZ 1571540697,1571540697,RU 1571540698,1571540991,CZ @@ -32194,11 +32528,9 @@ 1578614404,1578614423,FR 1578614424,1578614427,IS 1578614428,1578614431,LV -1578614432,1578614435,BG -1578614436,1578614459,FR +1578614432,1578614459,FR 1578614460,1578614463,NO -1578614464,1578614467,FR -1578614468,1578614471,AT +1578614464,1578614471,FR 1578614472,1578614475,SI 1578614476,1578614479,UA 1578614480,1578614495,FR @@ -32645,14 +32977,17 @@ 1588658176,1588659199,RO 1588659200,1588659711,NL 1588659712,1588664319,RO -1588664320,1588664831,VG +1588664320,1588664575,TH +1588664576,1588664831,VG 1588664832,1588673535,RO 1588673536,1588674559,MD 1588674560,1588676607,RO 1588676608,1588678655,IR 1588678656,1588684799,RO -1588684800,1588685311,VG -1588685312,1588689919,RO +1588684800,1588685055,TH +1588685056,1588685311,VG +1588685312,1588689663,RO +1588689664,1588689919,RU 1588689920,1588690687,GB 1588690688,1588723711,RO 1588723712,1588854783,UA @@ -32969,7 +33304,9 @@ 1596858880,1596859391,RU 1596859392,1596862463,CZ 1596862464,1596876799,RU -1596876800,1596881919,CZ +1596876800,1596878079,CZ +1596878080,1596878335,RU +1596878336,1596881919,CZ 1596881920,1596887295,RU 1596887296,1596887551,KZ 1596887552,1596888063,UA @@ -32986,7 +33323,8 @@ 1596901376,1596907519,BY 1596907520,1596909567,RU 1596909568,1596911615,KZ -1596911616,1596915711,RU +1596911616,1596911871,BY +1596911872,1596915711,RU 1596915712,1596923903,UA 1596923904,1596925951,CZ 1596925952,1596932095,RU @@ -33348,7 +33686,10 @@ 1603215360,1603219455,DE 1603219456,1603223551,CH 1603223552,1603223807,FR -1603223808,1603227647,GB +1603223808,1603226255,GB +1603226256,1603226263,DE +1603226264,1603226271,NL +1603226272,1603227647,GB 1603227648,1603231743,AT 1603231744,1603235839,IT 1603235840,1603239935,RU @@ -33378,7 +33719,9 @@ 1604059136,1604075519,MK 1604075520,1604091903,RU 1604091904,1604108287,BA -1604108288,1604141055,DE +1604108288,1604120575,DE +1604120576,1604122623,PL +1604122624,1604141055,DE 1604141056,1604157439,IT 1604157440,1604190207,FR 1604190208,1604206591,UA @@ -33500,7 +33843,9 @@ 1605125277,1605125375,DE 1605125376,1605125903,GB 1605125904,1605125919,DE -1605125920,1605130239,GB +1605125920,1605126701,GB +1605126702,1605126702,US +1605126703,1605130239,GB 1605130240,1605130271,NL 1605130272,1605131263,GB 1605131264,1605131519,DE @@ -33614,7 +33959,9 @@ 1607636480,1607639039,EU 1607639040,1607640805,IT 1607640806,1607640806,CH -1607640807,1607647231,IT +1607640807,1607642388,IT +1607642389,1607642389,NL +1607642390,1607647231,IT 1607647232,1607651327,DE 1607651328,1607655423,FR 1607655424,1607663615,IT @@ -33711,7 +34058,8 @@ 1611116544,1611117567,NL 1611117568,1611128831,US 1611128832,1611130879,NL -1611130880,1611227135,US +1611130880,1611218943,US +1611218944,1611227135,KH 1611227136,1611235327,CA 1611235328,1611251711,SG 1611251712,1611662335,US @@ -34133,7 +34481,9 @@ 1728346624,1728347135,AU 1728347136,1728347147,SG 1728347148,1728347148,AP -1728347149,1728347421,SG +1728347149,1728347416,SG +1728347417,1728347417,AP +1728347418,1728347421,SG 1728347422,1728347422,AP 1728347423,1728348159,SG 1728348160,1728349183,VN @@ -34478,7 +34828,8 @@ 1728684032,1728685055,AU 1728685056,1728686079,JP 1728686080,1728687103,AU -1728687104,1728689407,JP +1728687104,1728688127,JP +1728689152,1728689407,JP 1728689408,1728689663,BD 1728689664,1728689919,PK 1728690176,1728691199,BD @@ -34611,7 +34962,7 @@ 1728812544,1728813055,SG 1728813056,1728814079,IN 1728814080,1728815103,JP -1728816128,1728817151,AU +1728815104,1728817151,AU 1728818176,1728819199,VN 1728819200,1728819711,ID 1728819712,1728819967,NZ @@ -34656,7 +35007,7 @@ 1728848896,1728849919,AU 1728849920,1728850943,PK 1728850944,1728851967,BD -1728851968,1728854015,JP +1728852992,1728854015,JP 1728854016,1728854527,AU 1728854528,1728854783,PK 1728854784,1728855039,AU @@ -34717,12 +35068,10 @@ 1728902400,1728902655,IN 1728902912,1728903167,BD 1728903168,1728905215,KR -1728905472,1728905727,PK 1728905728,1728906239,IN 1728907264,1728908287,NZ 1728909312,1728912383,JP 1728912384,1728913407,TH -1728913408,1728914431,PH 1728914432,1728915199,ID 1728915200,1728915455,NZ 1728915456,1728917503,JP @@ -34784,9 +35133,7 @@ 1728973824,1728974847,JP 1728974848,1728976383,ID 1728976384,1728976895,AU -1728976896,1728977151,AF 1728977920,1728978943,MY -1728978944,1728979967,JP 1728979968,1728980991,MN 1728980992,1728982015,AU 1728982016,1728982527,ID @@ -35340,7 +35687,6 @@ 1729546240,1729546495,JP 1729546496,1729547263,HK 1729548288,1729549311,AU -1729549312,1729550335,JP 1729550336,1729551359,MY 1729551360,1729552383,KR 1729552384,1729553407,AU @@ -35648,7 +35994,6 @@ 1729864704,1729866751,IN 1729866752,1729867775,AU 1729867776,1729869823,HK -1729869824,1729870847,JP 1729870848,1729871871,AU 1729871872,1729872895,JP 1729872896,1729873919,AU @@ -35831,7 +36176,7 @@ 1730043904,1730044927,CN 1730044928,1730046975,HK 1730046976,1730047999,KR -1730048000,1730049023,ID +1730048000,1730049023,TL 1730050048,1730050303,AU 1730050304,1730050559,SG 1730050560,1730051071,ID @@ -35922,7 +36267,62 @@ 1730147328,1730148351,JP 1730148352,1730149375,ID 1730149376,1730150399,JP -1730150400,1730412543,CN +1730150400,1730360319,CN +1730360320,1730361343,IN +1730361344,1730362367,SG +1730362368,1730363391,JP +1730363392,1730364415,VN +1730364416,1730365439,IN +1730365440,1730367487,HK +1730367488,1730368511,AU +1730368512,1730369535,HK +1730369536,1730370047,NZ +1730370048,1730370303,IN +1730370304,1730370559,JP +1730370560,1730371583,AU +1730371584,1730372607,TH +1730372608,1730373631,IN +1730373632,1730374655,CN +1730374656,1730375679,BD +1730375680,1730376191,AU +1730376192,1730376703,VU +1730376704,1730377727,CN +1730377728,1730378239,IN +1730378240,1730378495,HK +1730378496,1730378751,IN +1730378752,1730379775,HK +1730379776,1730380799,AU +1730380800,1730381823,IN +1730381824,1730382847,MY +1730382848,1730383359,ID +1730383360,1730383615,IN +1730383616,1730383871,MY +1730383872,1730385919,HK +1730385920,1730386943,AU +1730386944,1730387967,BD +1730387968,1730389503,IN +1730389504,1730390015,AF +1730390016,1730391039,BD +1730391040,1730392063,HK +1730392064,1730393087,AU +1730393088,1730394111,SG +1730394112,1730395135,HK +1730395136,1730396159,JP +1730396160,1730398207,IN +1730398208,1730399231,CN +1730399232,1730400255,TW +1730400256,1730402303,PK +1730402304,1730402559,NZ +1730402560,1730402815,IN +1730402816,1730403071,ID +1730403072,1730403327,AU +1730403328,1730404351,CN +1730404352,1730406399,AU +1730406400,1730407423,IN +1730407424,1730408447,ID +1730408448,1730410495,IN +1730410496,1730411519,SG +1730411520,1730412543,HK 1730412544,1730414591,AU 1730414592,1730415615,ID 1730415616,1730416127,AU @@ -36500,7 +36900,7 @@ 1731182592,1731183615,VN 1731183616,1731184639,IN 1731184640,1731185663,CN -1731185664,1731186687,NZ +1731185664,1731186687,US 1731186688,1731187711,SG 1731187712,1731188735,CN 1731188736,1731189759,IN @@ -37280,7 +37680,9 @@ 1732124160,1732124671,PH 1732124672,1732126719,AU 1732126720,1732127743,IN -1732127744,1732129791,HK +1732127744,1732128767,HK +1732128768,1732129023,SG +1732129024,1732129791,HK 1732129792,1732130815,CN 1732130816,1732134911,IN 1732134912,1732140031,CN @@ -37358,7 +37760,121 @@ 1740676096,1740677119,BD 1740677120,1740678143,HK 1740678144,1740679167,CN -1740679168,1740681215,IN +1740679168,1740680447,IN +1740680448,1740680703,AU +1740680704,1740680959,MM +1740680960,1740681215,AU +1740681216,1740682239,HK +1740682240,1740683263,KH +1740683264,1740684287,PH +1740684288,1740685311,CN +1740685312,1740686591,AU +1740686592,1740686847,NZ +1740686848,1740687359,IN +1740687360,1740688383,HK +1740688384,1740689407,IN +1740689408,1740692479,CN +1740692480,1740693503,IN +1740693504,1740694527,HK +1740694528,1740696575,JP +1740696576,1740697599,VN +1740697600,1740698623,NZ +1740698624,1740700671,IN +1740700672,1740701695,CN +1740701696,1740702719,IN +1740702720,1740703743,MX +1740703744,1740704255,NZ +1740704256,1740704767,AU +1740704768,1740705791,JP +1740705792,1740706047,NZ +1740706048,1740706303,AU +1740706304,1740706559,PK +1740706560,1740706815,ID +1740706816,1740709887,IN +1740709888,1740710911,HK +1740710912,1740711423,IN +1740711424,1740711935,NZ +1740711936,1740713983,CN +1740713984,1740719103,IN +1740719104,1740720127,HK +1740720128,1740721151,JP +1740721152,1740721407,AU +1740721408,1740721663,IN +1740721664,1740721919,AU +1740721920,1740722175,IN +1740722176,1740723199,AU +1740723200,1740731391,IN +1740731392,1740732415,ID +1740732416,1740734463,CN +1740734464,1740736511,HK +1740736512,1740737535,NZ +1740737536,1740740607,CN +1740740608,1740742655,IN +1740742656,1740743679,CN +1740743680,1740743935,NZ +1740743936,1740744191,PH +1740744192,1740744703,AU +1740744704,1740745727,BD +1740745728,1740746751,HK +1740746752,1740747775,JP +1740747776,1740748799,KH +1740748800,1740749823,JP +1740749824,1740751871,CN +1740751872,1740753919,IN +1740753920,1740754943,KH +1740754944,1740755967,AU +1740755968,1740764159,CN +1740764160,1740766207,HK +1740766208,1740767231,IN +1740767232,1740769279,AU +1740769280,1740771327,IN +1740771328,1740772351,CN +1740772352,1740776447,IN +1740776448,1740777471,HK +1740777472,1740777983,JP +1740777984,1740778495,HK +1740778496,1740779519,IN +1740779520,1740780543,AU +1740780544,1740784639,IN +1740784640,1740784895,AU +1740784896,1740785663,IN +1740785664,1740786687,JP +1740786688,1740787711,SG +1740787712,1740788735,MY +1740788736,1740789759,KH +1740789760,1740790783,IN +1740791808,1740792831,IN +1740792832,1740794879,HK +1740794880,1740795903,KR +1740795904,1740796159,NZ +1740796160,1740798207,IN +1740798208,1740798463,AU +1740798464,1740798975,IN +1740798976,1740799999,AU +1740800000,1740800511,IN +1740800512,1740800767,ID +1740800768,1740805119,IN +1740805120,1740806143,HK +1740806144,1740809215,IN +1740809216,1740810239,JP +1740810240,1740811263,IN +1740811264,1740812287,ID +1740812288,1740813311,MN +1740813312,1740814335,IN +1740815360,1740816383,VN +1740816384,1740821503,IN +1740821504,1740822015,HK +1740822016,1740822527,AU +1740822528,1740825599,IN +1740825600,1740825855,SG +1740825856,1740826111,AU +1740826112,1740826623,CN +1740826624,1740827647,IN +1740827648,1740828671,HK +1740828672,1740829695,IN +1740829696,1740830719,HK +1740830720,1740831743,IN +1740831744,1740832767,KR 1742734336,1742735359,IN 1742735360,1742736383,JP 1742736384,1742737407,PK @@ -37794,7 +38310,6 @@ 1743201280,1743202303,PH 1743202304,1743204351,IN 1743204352,1743205375,TW -1743205376,1743206399,JP 1743206400,1743207423,HK 1743207424,1743208447,KH 1743208448,1743210495,CN @@ -37831,7 +38346,6 @@ 1743237120,1743238143,BD 1743238144,1743240191,CN 1743240192,1743241215,SG -1743241216,1743242239,JP 1743242240,1743244287,ID 1743244288,1743245311,AU 1743245312,1743248383,IN @@ -37848,8 +38362,9 @@ 1743256576,1743258623,HK 1743258624,1743259647,CN 1743259648,1743260671,IN -1743260672,1743261695,JP -1743261696,1743262719,HK +1743260672,1743261703,JP +1743261704,1743261711,PH +1743261712,1743262719,HK 1743262720,1743264767,IN 1743264768,1743265279,MY 1743265280,1743265535,ID @@ -37880,12 +38395,10 @@ 1743296512,1743297535,NP 1743297536,1743298303,NZ 1743298304,1743299583,AU -1743299584,1743300607,KH 1743300608,1743301631,AU 1743301632,1743303679,IN 1743303680,1743304703,NZ 1743304704,1743305727,IN -1743305728,1743306751,JP 1743306752,1743307775,KH 1743307776,1743308799,AU 1743308800,1743309823,JP @@ -37940,7 +38453,6 @@ 1743355904,1743356927,CN 1743356928,1743357951,NZ 1743357952,1743358975,CN -1743358976,1743359487,AF 1743359488,1743361023,ID 1743361024,1743362047,AU 1743362048,1743364095,ID @@ -37972,13 +38484,11 @@ 1743387648,1743388671,JP 1743388672,1743389695,CN 1743389696,1743390719,KR -1743390720,1743391743,JP 1743391744,1743391999,PK 1743392000,1743392767,AU 1743392768,1743393791,HK 1743393792,1743394815,CN 1743394816,1743395839,BD -1743395840,1743396863,JP 1743396864,1743397887,HK 1743397888,1743398911,VN 1743398912,1743399935,TW @@ -37987,7 +38497,6 @@ 1743403008,1743404031,CN 1743404032,1743405055,AU 1743405056,1743407103,IN -1743407104,1743408127,JP 1743408128,1743410175,TW 1743410176,1743411199,SG 1743411200,1743412223,VN @@ -38026,7 +38535,7 @@ 1743446016,1743448063,TW 1743448064,1743449087,AU 1743449088,1743451135,IN -1743451136,1743452159,HK +1743451136,1743452159,CN 1743452160,1743453183,AU 1743453184,1743454207,ID 1743454208,1743455231,IN @@ -38082,7 +38591,31 @@ 1743506944,1743507455,IN 1743507456,1743509503,VN 1743509504,1743510527,HK -1743510528,1743552511,CN +1743510528,1743545343,CN +1743545344,1743546367,HK +1743546368,1743549951,IN +1743549952,1743550207,AU +1743550208,1743550463,SG +1743550464,1743551487,CN +1743551488,1743552511,IN +1743552512,1743553535,JP +1743553536,1743554559,PK +1743554560,1743555583,HK +1743555584,1743557631,JP +1743557632,1743558655,ID +1743558656,1743560703,IN +1743560704,1743561215,ID +1743561216,1743561727,AU +1743561728,1743564799,IN +1743564800,1743565823,PH +1743565824,1743566847,JP +1743566848,1743567871,CN +1743567872,1743569151,ID +1743569152,1743569919,IN +1743569920,1743570943,SG +1743570944,1743574015,IN +1743574016,1743575039,AU +1743575040,1743576063,HK 1743585280,1743589375,CN 1743589376,1743590399,AU 1743590400,1743591423,KR @@ -38455,7 +38988,7 @@ 1744041984,1744043007,TW 1744043008,1744044031,CN 1744044032,1744045055,HK -1744045056,1744047103,SG +1744046080,1744047103,SG 1744047104,1744048127,BD 1744048128,1744049151,CN 1744049152,1744050175,BD @@ -38721,7 +39254,7 @@ 1744315392,1744316415,HK 1744316416,1744317439,KH 1744317440,1744318463,AU -1744318464,1744320511,JP +1744318464,1744319487,JP 1744320512,1744321535,ID 1744321536,1744322559,IN 1744322560,1744323583,CN @@ -38753,9 +39286,8 @@ 1744354304,1744354559,AU 1744354560,1744355327,NZ 1744355328,1744356351,CN -1744356352,1744357375,JP 1744357376,1744357631,NZ -1744357632,1744358399,AU +1744357632,1744357887,AU 1744358400,1744359423,BD 1744359424,1744360447,IN 1744360448,1744361471,CN @@ -38766,7 +39298,7 @@ 1744367616,1744368639,HK 1744368640,1744369663,IN 1744369664,1744369919,ID -1744369920,1744370431,AU +1744369920,1744370175,AU 1744370432,1744370687,JP 1744370688,1744371711,HK 1744371712,1744372735,BD @@ -38827,7 +39359,6 @@ 1744434176,1744435199,CN 1744435200,1744436223,IN 1744436224,1744437247,CN -1744438272,1744439295,JP 1744439296,1744439807,AU 1744439808,1744440319,IN 1744440320,1744441343,HK @@ -38879,7 +39410,6 @@ 1744490496,1744491519,IN 1744491520,1744492543,AU 1744492544,1744493567,CN -1744493568,1744494079,AU 1744494080,1744494591,PK 1744494592,1744495615,CN 1744495616,1744497663,NZ @@ -38975,7 +39505,8 @@ 1744597124,1744597124,US 1744597125,1744597151,SG 1744597152,1744597183,IN -1744597184,1744598015,SG +1744597184,1744597215,JP +1744597216,1744598015,SG 1744599040,1744601087,JP 1744602112,1744603135,HK 1744603136,1744604159,JP @@ -39114,7 +39645,6 @@ 1744747520,1744748543,CN 1744749056,1744749567,NZ 1744749568,1744749823,CN -1744749824,1744750591,AU 1744750592,1744752639,IN 1744752640,1744753663,HK 1744753664,1744754687,SG @@ -39334,7 +39864,10 @@ 1750581248,1750597631,NL 1750597632,1750705151,US 1750705152,1750724607,NL -1750724608,1753251839,US +1750724608,1751505919,US +1751505920,1751506175,IN +1751506176,1751506431,HK +1751506432,1753251839,US 1753251840,1753252095,MN 1753252096,1753252351,SY 1753252352,1753252607,BY @@ -39370,9 +39903,13 @@ 1753489664,1753490175,US 1753490176,1753490431,AU 1753490432,1753490687,IL -1753490688,1753517567,US +1753490688,1753494527,US +1753494528,1753494783,IL +1753494784,1753517567,US 1753517568,1753517823,NO -1753517824,1753735167,US +1753517824,1753522431,US +1753522432,1753522687,FR +1753522688,1753735167,US 1753735168,1753743359,IE 1753743360,1754136575,US 1754136576,1754169343,CA @@ -39395,7 +39932,10 @@ 1754209536,1754209791,BR 1754209792,1754210047,AR 1754210048,1754210303,BJ -1754210304,1754230783,US +1754210304,1754223615,US +1754223616,1754223623,MX +1754223624,1754223631,AU +1754223632,1754230783,US 1754230784,1754234879,VG 1754234880,1754251519,US 1754251520,1754251775,LY @@ -39545,7 +40085,7 @@ 1755824128,1755824383,TV 1755824384,1755824639,SY 1755824640,1755824895,ZW -1755824896,1755825151,TG +1755824896,1755825151,US 1755825152,1755825407,GM 1755825408,1755825663,AO 1755825664,1755825919,LB @@ -39970,7 +40510,9 @@ 1761019648,1761019903,VE 1761019904,1761023231,US 1761023232,1761023487,JP -1761023488,1761044479,US +1761023488,1761043711,US +1761043712,1761043967,PH +1761043968,1761044479,US 1761044480,1761044735,AU 1761044736,1761046527,US 1761046528,1761046783,JP @@ -39982,15 +40524,27 @@ 1761181696,1761181951,MX 1761181952,1761183743,US 1761183744,1761183999,AU -1761184000,1761185791,US +1761184000,1761185023,US +1761185024,1761185279,RU +1761185280,1761185535,US +1761185536,1761185791,AE 1761185792,1761186047,MX -1761186048,1761187327,US +1761186048,1761186815,US +1761186816,1761187071,MX +1761187072,1761187327,US 1761187328,1761187583,PK -1761187584,1761189887,US +1761187584,1761188095,US +1761188096,1761188351,RU +1761188352,1761189887,US 1761189888,1761190143,JP -1761190144,1761192703,US +1761190144,1761191679,US +1761191680,1761191935,MX +1761191936,1761192703,US 1761192704,1761192959,AU -1761192960,1761195007,US +1761192960,1761194239,US +1761194240,1761194495,PH +1761194496,1761194751,HK +1761194752,1761195007,US 1761195008,1761195263,HK 1761195264,1761198079,US 1761198080,1761214463,CA @@ -40028,7 +40582,9 @@ 1761262336,1761262591,PK 1761262592,1761262847,US 1761262848,1761263103,RU -1761263104,1761273599,US +1761263104,1761273087,US +1761273088,1761273343,PH +1761273344,1761273599,US 1761273600,1761273855,AU 1761273856,1761275391,US 1761275392,1761275647,JP @@ -40305,7 +40861,7 @@ 1805253120,1805253375,DE 1805253376,1805253631,GB 1805253632,1805253887,DE -1805253888,1805254143,GB +1805253888,1805254143,US 1805254144,1805254399,DE 1805254400,1805254655,GB 1805254656,1805582335,US @@ -40899,7 +41455,153 @@ 1836023808,1836040191,RU 1836040192,1836048383,GB 1836048384,1836056575,RS -1836056576,1836580863,IT +1836056576,1836450337,IT +1836450338,1836450338,CN +1836450339,1836450371,IT +1836450372,1836450372,CN +1836450373,1836450450,IT +1836450451,1836450451,CN +1836450452,1836450470,IT +1836450471,1836450471,CN +1836450472,1836450511,IT +1836450512,1836450512,CN +1836450513,1836450869,IT +1836450870,1836450870,CN +1836450871,1836450881,IT +1836450882,1836450882,CN +1836450883,1836450883,IT +1836450884,1836450884,CN +1836450885,1836450926,IT +1836450927,1836450927,CN +1836450928,1836450931,IT +1836450932,1836450932,CN +1836450933,1836450940,IT +1836450941,1836450941,CN +1836450942,1836450955,IT +1836450956,1836450956,CN +1836450957,1836451346,IT +1836451347,1836451348,CN +1836451349,1836451350,IT +1836451351,1836451351,CN +1836451352,1836451406,IT +1836451407,1836451407,CN +1836451408,1836451417,IT +1836451418,1836451418,CN +1836451419,1836451461,IT +1836451462,1836451462,CN +1836451463,1836451463,IT +1836451464,1836451464,CN +1836451465,1836451521,IT +1836451522,1836451522,CN +1836451523,1836452122,IT +1836452123,1836452123,CN +1836452124,1836452147,IT +1836452148,1836452148,CN +1836452149,1836452186,IT +1836452187,1836452187,CN +1836452188,1836452315,IT +1836452316,1836452316,CN +1836452317,1836452343,IT +1836452344,1836452345,CN +1836452346,1836452445,IT +1836452446,1836452446,CN +1836452447,1836452447,IT +1836452448,1836452448,CN +1836452449,1836452450,IT +1836452451,1836452451,CN +1836452452,1836452546,IT +1836452547,1836452547,CN +1836452548,1836452751,IT +1836452752,1836452752,CN +1836452753,1836452755,IT +1836452756,1836452757,CN +1836452758,1836453483,IT +1836453484,1836453484,CN +1836453485,1836453539,IT +1836453540,1836453540,CN +1836453541,1836453573,IT +1836453574,1836453574,CN +1836453575,1836454695,IT +1836454696,1836454696,CN +1836454697,1836454740,IT +1836454741,1836454741,CN +1836454742,1836454755,IT +1836454756,1836454756,CN +1836454757,1836455219,IT +1836455220,1836455220,CN +1836455221,1836455228,IT +1836455229,1836455229,CN +1836455230,1836455233,IT +1836455234,1836455234,CN +1836455235,1836455263,IT +1836455264,1836455264,CN +1836455265,1836455272,IT +1836455273,1836455274,CN +1836455275,1836455281,IT +1836455282,1836455282,CN +1836455283,1836455305,IT +1836455306,1836455306,CN +1836455307,1836455309,IT +1836455310,1836455310,CN +1836455311,1836455378,IT +1836455379,1836455379,CN +1836455380,1836455454,IT +1836455455,1836455455,CN +1836455456,1836455458,IT +1836455459,1836455460,CN +1836455461,1836455516,IT +1836455517,1836455517,CN +1836455518,1836455546,IT +1836455547,1836455547,CN +1836455548,1836455556,IT +1836455557,1836455557,CN +1836455558,1836455562,IT +1836455563,1836455563,CN +1836455564,1836455565,IT +1836455566,1836455566,CN +1836455567,1836455568,IT +1836455569,1836455570,CN +1836455571,1836455589,IT +1836455590,1836455590,CN +1836455591,1836455631,IT +1836455632,1836455632,CN +1836455633,1836455987,IT +1836455988,1836455988,CN +1836455989,1836455993,IT +1836455994,1836455995,CN +1836455996,1836455997,IT +1836455998,1836455998,CN +1836455999,1836456001,IT +1836456002,1836456002,CN +1836456003,1836456021,IT +1836456022,1836456022,CN +1836456023,1836456097,IT +1836456098,1836456098,CN +1836456099,1836456117,IT +1836456118,1836456118,CN +1836456119,1836456131,IT +1836456132,1836456135,CN +1836456136,1836456136,IT +1836456137,1836456137,CN +1836456138,1836458047,IT +1836458048,1836458048,CN +1836458049,1836459294,IT +1836459295,1836459295,CN +1836459296,1836459383,IT +1836459384,1836459384,CN +1836459385,1836459399,IT +1836459400,1836459400,CN +1836459401,1836466454,IT +1836466455,1836466455,CN +1836466456,1836466465,IT +1836466466,1836466466,CN +1836466467,1836466529,IT +1836466530,1836466530,CN +1836466531,1836466532,IT +1836466533,1836466533,CN +1836466534,1836466551,IT +1836466552,1836466552,CN +1836466553,1836580863,IT 1836580864,1836597247,RU 1836597248,1836598271,LU 1836598272,1836605439,FR @@ -40929,7 +41631,9 @@ 1836794595,1836794595,FR 1836794596,1836797951,GB 1836797952,1836798207,DE -1836798208,1836810239,GB +1836798208,1836807087,GB +1836807088,1836807088,CN +1836807089,1836810239,GB 1836810240,1836826623,RU 1836826624,1836843007,CZ 1836843008,1836875775,RU @@ -40947,7 +41651,77 @@ 1837056000,1837072383,IQ 1837072384,1837088767,RU 1837088768,1837105151,SI -1837105152,1838153727,BE +1837105152,1837500953,BE +1837500954,1837500954,CN +1837500955,1837501019,BE +1837501020,1837501020,CN +1837501021,1837501040,BE +1837501041,1837501041,CN +1837501042,1837501119,BE +1837501120,1837501120,CN +1837501121,1837501584,BE +1837501585,1837501585,CN +1837501586,1837501588,BE +1837501589,1837501589,CN +1837501590,1837501623,BE +1837501624,1837501624,CN +1837501625,1837501643,BE +1837501644,1837501644,CN +1837501645,1837501998,BE +1837501999,1837501999,CN +1837502000,1837502022,BE +1837502023,1837502023,CN +1837502024,1837502041,BE +1837502042,1837502042,CN +1837502043,1837502052,BE +1837502053,1837502053,CN +1837502054,1837502126,BE +1837502127,1837502127,CN +1837502128,1837502164,BE +1837502165,1837502165,CN +1837502166,1837502539,BE +1837502540,1837502540,CN +1837502541,1837502574,BE +1837502575,1837502575,CN +1837502576,1837502606,BE +1837502607,1837502607,CN +1837502608,1837502610,BE +1837502611,1837502611,CN +1837502612,1837502639,BE +1837502640,1837502640,CN +1837502641,1837502702,BE +1837502703,1837502703,CN +1837502704,1837502818,BE +1837502819,1837502819,CN +1837502820,1837502913,BE +1837502914,1837502914,CN +1837502915,1837502931,BE +1837502932,1837502932,CN +1837502933,1837503116,BE +1837503117,1837503117,CN +1837503118,1837503125,BE +1837503126,1837503127,CN +1837503128,1837503129,BE +1837503130,1837503131,CN +1837503132,1837503136,BE +1837503137,1837503137,CN +1837503138,1837503153,BE +1837503154,1837503154,CN +1837503155,1837503156,BE +1837503157,1837503157,CN +1837503158,1837503163,BE +1837503164,1837503165,CN +1837503166,1837503166,BE +1837503167,1837503167,CN +1837503168,1837503175,BE +1837503176,1837503176,CN +1837503177,1837503184,BE +1837503185,1837503185,CN +1837503186,1837503186,BE +1837503187,1837503187,CN +1837503188,1837503188,BE +1837503189,1837503189,CN +1837503190,1838153727,BE 1838153728,1839202303,GB 1839202304,1839235071,BG 1839235072,1839267839,IL @@ -40972,7 +41746,11 @@ 1839603712,1839618047,RO 1839618048,1839628287,SA 1839628288,1839661055,RO -1839661056,1839693823,UA +1839661056,1839686655,UA +1839686656,1839687167,ES +1839687168,1839693055,UA +1839693056,1839693311,ES +1839693312,1839693823,UA 1839693824,1839726591,RU 1839726592,1839759359,IT 1839759360,1839792127,RU @@ -41396,9 +42174,13 @@ 1844903936,1844969471,NO 1844969472,1845006335,RU 1845006336,1845010431,KZ -1845010432,1845025535,RU +1845010432,1845022719,RU +1845022720,1845023743,KZ +1845023744,1845025535,RU 1845025536,1845025791,KZ -1845025792,1845029887,RU +1845025792,1845027583,RU +1845027584,1845027839,ES +1845027840,1845029887,RU 1845029888,1845030143,KZ 1845030144,1845030911,RU 1845030912,1845031935,GE @@ -42289,7 +43071,9 @@ 1946173696,1946173951,TW 1946173952,1946174463,SG 1946174464,1946174719,TW -1946174720,1946176511,SG +1946174720,1946175487,SG +1946175488,1946175615,HK +1946175616,1946176511,SG 1946176512,1946176639,AU 1946176640,1946176767,PH 1946176768,1946178047,SG @@ -42301,7 +43085,6 @@ 1946189824,1946222591,JP 1946222592,1946943487,CN 1946943488,1946951679,JP -1946951680,1946953727,BD 1946953728,1946955775,ID 1946955776,1946957823,SG 1946957824,1946959871,NZ @@ -42494,9 +43277,7 @@ 1962622976,1962639359,CN 1962639360,1962658815,NZ 1962658816,1962659839,HK -1962659840,1962660863,SG -1962660864,1962661375,HK -1962661376,1962663935,SG +1962659840,1962663935,SG 1962663936,1962672127,HK 1962672128,1962803199,CN 1962803200,1962827775,JP @@ -42932,9 +43713,11 @@ 2001854944,2001854951,CN 2001854952,2001855231,SG 2001855232,2001855263,US -2001855264,2001855775,SG -2001855776,2001855791,US -2001855792,2001857439,SG +2001855264,2001855743,SG +2001855744,2001855999,HK +2001856000,2001857255,SG +2001857256,2001857263,A1 +2001857264,2001857439,SG 2001857440,2001857471,US 2001857472,2001857791,SG 2001857792,2001858047,HK @@ -42942,12 +43725,22 @@ 2001858336,2001858367,US 2001858368,2001858639,SG 2001858640,2001858655,US -2001858656,2001860031,SG +2001858656,2001859071,SG +2001859072,2001859327,HK +2001859328,2001860031,SG 2001860032,2001860047,HK 2001860048,2001860351,SG 2001860352,2001860607,HK -2001860608,2001862079,SG -2001862080,2001862143,US +2001860608,2001860655,SG +2001860656,2001860671,US +2001860672,2001860991,SG +2001860992,2001861007,US +2001861008,2001861263,SG +2001861264,2001861279,US +2001861280,2001862079,SG +2001862080,2001862124,US +2001862125,2001862125,HK +2001862126,2001862143,US 2001862144,2001862655,SG 2001862656,2001864703,AU 2001864704,2001870847,JP @@ -44022,7 +44815,7 @@ 2153398272,2153406463,US 2153406464,2153407487,JP 2153407488,2153407743,HK -2153407744,2153407999,US +2153407744,2153407999,AE 2153408000,2153408511,BR 2153408512,2153408767,AU 2153408768,2153409023,PA @@ -44139,7 +44932,9 @@ 2163638528,2163671039,DE 2163671040,2163867647,US 2163867648,2163933183,AU -2163933184,2164981759,US +2163933184,2164260863,US +2164260864,2164326399,CM +2164326400,2164981759,US 2164981760,2165112831,GB 2165112832,2165178367,DE 2165178368,2165309439,US @@ -44220,7 +45015,9 @@ 2177105920,2177302527,US 2177302528,2177368063,FR 2177368064,2177695743,US +2177695744,2177703935,UG 2177703936,2177712127,ZA +2177728512,2177744895,ZA 2177744896,2177761279,BW 2177761280,2177826815,DE 2177826816,2177892351,US @@ -44337,7 +45134,15 @@ 2188509184,2188574719,US 2188574720,2188640255,NL 2188640256,2188705791,AU -2188705792,2188724463,EU +2188705792,2188706153,EU +2188706154,2188706154,SI +2188706155,2188718161,EU +2188718162,2188718162,SI +2188718163,2188718337,EU +2188718338,2188718338,AT +2188718339,2188718473,EU +2188718474,2188718474,AT +2188718475,2188724463,EU 2188724464,2188724464,NL 2188724465,2188724991,EU 2188724992,2188725247,RS @@ -44404,7 +45209,9 @@ 2193205248,2193207295,FR 2193207296,2193209343,CZ 2193209344,2193211391,FR -2193211392,2193227775,BG +2193211392,2193223423,BG +2193223424,2193223679,GB +2193223680,2193227775,BG 2193227776,2193293311,IT 2193293312,2193358847,US 2193358848,2193424383,FI @@ -45788,7 +46595,7 @@ 2323042304,2323045375,AR 2323045376,2323054591,BR 2323054592,2323120127,CA -2323120128,2323185663,FR +2323120128,2323185663,US 2323185664,2323186687,BR 2323186688,2323187711,CO 2323187712,2323188735,BR @@ -45828,18 +46635,22 @@ 2323279872,2323283967,BR 2323283968,2323284991,AR 2323284992,2323288063,BR +2323288064,2323289087,MX 2323289088,2323291135,BR 2323291136,2323292159,AR 2323292160,2323293183,PY 2323293184,2323298303,BR +2323298304,2323299327,PY 2323299328,2323300351,AR 2323300352,2323301375,HN +2323301376,2323302399,BR 2323302400,2323303423,CO 2323303424,2323308543,BR 2323308544,2323309567,CL 2323309568,2323310591,AR 2323310592,2323313663,BR 2323313664,2323314687,CR +2323314688,2323315711,BR 2323315712,2323316735,MX 2323316736,2323382271,US 2323382272,2323447807,NO @@ -45859,37 +46670,65 @@ 2327379968,2327380991,MX 2327380992,2327383039,BR 2327383040,2327384063,CL -2327384064,2327396351,BR -2327397376,2327398399,VE +2327384064,2327387135,BR +2327387136,2327388159,NI +2327388160,2327396351,BR +2327396352,2327398399,VE 2327398400,2327399423,BR +2327399424,2327400447,BZ 2327400448,2327401471,AR 2327401472,2327406591,BR 2327406592,2327407615,NI 2327407616,2327408639,BR 2327408640,2327409663,AR -2327411712,2327412735,BR -2327413760,2327414783,BR +2327409664,2327410687,PE +2327410688,2327414783,BR +2327414784,2327415807,EC 2327415808,2327416831,AR 2327416832,2327432191,BR 2327432192,2327433215,AR 2327433216,2327434239,BQ 2327434240,2327437311,BR 2327437312,2327438335,MX -2327438336,2327440383,BR +2327438336,2327443455,BR 2327443456,2327444479,CR -2327445504,2327446527,BR +2327444480,2327446527,BR 2327446528,2327447551,VE +2327447552,2327448575,CL +2327448576,2327449599,PA +2327449600,2327450623,BR 2327450624,2327451647,CO 2327451648,2327452671,BR -2327453696,2327459839,BR +2327452672,2327453695,MX +2327453696,2327460863,BR 2327460864,2327461887,PY -2327463936,2327464959,BR -2327465984,2327468031,BR +2327461888,2327462911,MX +2327462912,2327468031,BR 2327468032,2327469055,PA -2327469056,2327474175,BR -2327478272,2327480319,BR +2327469056,2327471103,BR +2327471104,2327472127,MX +2327472128,2327476223,BR +2327476224,2327477247,CL +2327477248,2327480319,BR 2327480320,2327481343,HN 2327481344,2327482367,AR +2327482368,2327483391,BR +2327483392,2327485439,AR +2327485440,2327486463,BR +2327486464,2327487487,AR +2327487488,2327490559,BR +2327490560,2327491583,VE +2327491584,2327493631,BR +2327493632,2327494655,CO +2327494656,2327496703,BR +2327496704,2327497727,MX +2327497728,2327498751,BR +2327498752,2327499775,HN +2327499776,2327501823,AR +2327501824,2327507967,BR +2327507968,2327508991,AR +2327508992,2327510015,SV +2327510016,2327511039,AR 2327511040,2327838719,CH 2327838720,2327969791,US 2327969792,2328035327,AU @@ -45902,6 +46741,27 @@ 2328363008,2328494079,DE 2328494080,2328559615,US 2328559616,2328625151,BE +2328625152,2328627199,AR +2328627200,2328628223,BR +2328628224,2328629247,BZ +2328629248,2328635391,BR +2328635392,2328636415,AR +2328636416,2328652799,BR +2328652800,2328653823,PA +2328653824,2328664063,BR +2328664064,2328667135,AR +2328667136,2328668159,BR +2328668160,2328669183,MX +2328669184,2328671231,BR +2328671232,2328672255,HN +2328672256,2328677375,BR +2328677376,2328678399,MX +2328678400,2328680447,BR +2328680448,2328681471,AR +2328681472,2328683519,BR +2328684544,2328685567,BR +2328685568,2328686591,VE +2328686592,2328687615,BR 2328690688,2328756223,BE 2328756224,2328797439,CH 2328797440,2328797695,AU @@ -45914,6 +46774,32 @@ 2329411584,2329477119,FI 2329477120,2329542655,AU 2329542656,2329608191,CA +2329609216,2329610239,AR +2329610240,2329611263,PY +2329612288,2329613311,AR +2329613312,2329614335,BR +2329615360,2329617407,BR +2329617408,2329618431,MX +2329618432,2329619455,AR +2329619456,2329622527,BR +2329623552,2329624575,AR +2329624576,2329626623,BR +2329626624,2329627647,HN +2329627648,2329628671,BR +2329628672,2329629695,AR +2329629696,2329638911,BR +2329638912,2329639935,HN +2329639936,2329644031,BR +2329644032,2329645055,CW +2329645056,2329649151,BR +2329649152,2329650175,AR +2329650176,2329651199,BR +2329653248,2329662463,BR +2329662464,2329664511,AR +2329664512,2329666559,BR +2329666560,2329667583,CL +2329668608,2329671679,BR +2329671680,2329672703,AR 2329673728,2329739263,US 2329739264,2329804799,CH 2329804800,2329870335,DE @@ -45946,6 +46832,15 @@ 2331639808,2331770879,GB 2331836416,2331901951,GB 2331901952,2331967487,US +2331967488,2331980799,BR +2331980800,2331981823,PA +2331981824,2331982847,BR +2331982848,2331983871,MX +2331983872,2331992063,BR +2331993088,2331994111,CL +2331994112,2332006399,BR +2332006400,2332007423,SV +2332016640,2332020735,BR 2332033024,2332098559,ID 2332098560,2332622847,DE 2332622848,2332688383,CN @@ -46052,7 +46947,9 @@ 2342518784,2342584319,FR 2342584320,2342649856,US 2342649857,2342658047,SG -2342658048,2342700247,US +2342658048,2342682623,US +2342682624,2342690815,DE +2342690816,2342700247,US 2342700248,2342700248,GB 2342700249,2342715391,US 2342715392,2342780927,AU @@ -46194,8 +47091,8 @@ 2365587456,2365589503,JO 2365589504,2365590527,US 2365590528,2365591039,NO -2365591040,2365591455,EU -2365591456,2365591551,NO +2365591040,2365591295,EU +2365591296,2365591551,NO 2365591552,2365593599,DE 2365593600,2365595647,NL 2365595648,2365603839,GB @@ -46526,25 +47423,31 @@ 2391015424,2391277567,CA 2391277568,2391343103,US 2391343104,2391998463,CA -2391998464,2392002047,US +2391998464,2392002303,US 2392002304,2392010751,CA 2392010752,2392011263,US 2392011264,2392011519,CA -2392011776,2392012799,CA -2392012800,2392013823,US +2392011776,2392012543,CA +2392012544,2392014079,US 2392014080,2392014335,CA -2392015360,2392015615,CA +2392015360,2392015871,CA 2392015872,2392017407,US 2392017408,2392017663,CA +2392017920,2392018431,US 2392018432,2392018687,CA -2392018944,2392019967,CA +2392018688,2392018943,US +2392018944,2392019199,CA +2392019200,2392019455,US +2392019456,2392019967,CA 2392019968,2392021759,US 2392021760,2392022015,NL 2392022016,2392022271,FR 2392022272,2392022527,DE 2392022528,2392022783,GB 2392022784,2392023039,US -2392023040,2392025087,CA +2392023040,2392024319,CA +2392024320,2392024575,US +2392024576,2392025087,VI 2392025088,2392063999,US 2392064000,2392096767,CA 2392096768,2392129535,US @@ -46965,8 +47868,7 @@ 2449420288,2449422335,DE 2449422336,2449424383,DK 2449424384,2449440767,OM -2449440768,2449441279,NL -2449441280,2449442815,RO +2449440768,2449442815,NL 2449442816,2449444863,RU 2449444864,2449448959,SK 2449448960,2449457151,KZ @@ -47585,7 +48487,9 @@ 2500149504,2500149759,GB 2500149760,2500150655,US 2500150656,2500150719,GB -2500150720,2500161023,US +2500150720,2500155647,US +2500155648,2500155903,GB +2500155904,2500161023,US 2500161024,2500162047,GB 2500162048,2500162559,US 2500162560,2500162815,GB @@ -47727,7 +48631,9 @@ 2501574656,2501640191,KZ 2501640192,2502033407,US 2502033408,2502037503,LU -2502037504,2503016447,US +2502037504,2502041599,US +2502041600,2502043647,ES +2502043648,2503016447,US 2503016448,2503147519,IL 2503147520,2503671807,US 2503671808,2503737343,NL @@ -47901,11 +48807,19 @@ 2513070560,2513070591,ES 2513070592,2513070623,FR 2513070624,2513070655,ES -2513070656,2513079250,FR +2513070656,2513076471,FR +2513076472,2513076479,ES +2513076480,2513078367,FR +2513078368,2513078371,GB +2513078372,2513079250,FR 2513079251,2513079254,ES 2513079255,2513081327,FR 2513081328,2513081343,ES -2513081344,2513108991,FR +2513081344,2513082561,FR +2513082562,2513082562,GB +2513082563,2513102899,FR +2513102900,2513102903,CZ +2513102904,2513108991,FR 2513108992,2513502207,DE 2513502208,2513567743,NO 2513567744,2513600511,GR @@ -48040,7 +48954,7 @@ 2525060096,2525061119,AU 2525061120,2525062143,TW 2525062144,2525071359,IN -2525071360,2525072383,HK +2525071360,2525072383,CN 2525072384,2525073407,MN 2525073408,2525075455,IN 2525075456,2525076479,CN @@ -48164,7 +49078,9 @@ 2538606032,2538606039,ES 2538606040,2538606043,FR 2538606044,2538606047,DE -2538606048,2538619359,FR +2538606048,2538606403,FR +2538606404,2538606407,GB +2538606408,2538619359,FR 2538619360,2538619375,ES 2538619376,2538619431,FR 2538619432,2538619435,DE @@ -48279,7 +49195,6 @@ 2547523584,2547535871,GB 2547535872,2547548159,BG 2547548160,2547580927,NO -2547580928,2547646463,DE 2548039680,2548563967,GB 2548563968,2548826111,IR 2548826112,2548829695,AT @@ -48495,7 +49410,12 @@ 2572943360,2572951551,DE 2572951552,2572953599,US 2572953600,2572953855,BY -2572953856,2572955647,DE +2572953856,2572954111,HK +2572954112,2572954367,DE +2572954368,2572954623,HK +2572954624,2572954879,AU +2572954880,2572955135,HK +2572955136,2572955647,DE 2572955648,2572959743,BR 2572959744,2572968447,DE 2572968448,2572968959,CZ @@ -48727,7 +49647,9 @@ 2586714880,2586715135,NL 2586715136,2586716159,US 2586716160,2586716671,ES -2586716672,2586733567,US +2586716672,2586717183,US +2586717184,2586717439,ES +2586717440,2586733567,US 2586733568,2586733823,LT 2586733824,2586734591,US 2586734592,2586735615,LT @@ -48810,8 +49732,8 @@ 2587525120,2587542527,US 2587542528,2587544575,ES 2587544576,2587545599,US -2587545600,2587547647,ES -2587547648,2587582463,US +2587545600,2587549695,ES +2587549696,2587582463,US 2587582464,2587586559,NL 2587586560,2587592703,US 2587592704,2587594751,GB @@ -48872,7 +49794,8 @@ 2588303360,2588311551,CM 2588311552,2588315647,ZA 2588315648,2588317695,BW -2588317696,2588318207,MU +2588317696,2588317951,ZA +2588317952,2588318207,MU 2588318208,2588318719,ZA 2588318720,2588319743,UG 2588319744,2588327935,SC @@ -49136,7 +50059,7 @@ 2616885530,2616918015,DE 2616983552,2617049087,US 2617049088,2617114623,IT -2617114880,2617115135,US +2617114624,2617115135,US 2617115136,2617115647,CA 2617115648,2617123839,US 2617123840,2617124095,DE @@ -49192,7 +50115,7 @@ 2617166336,2617166591,KH 2617166592,2617166847,TJ 2617166848,2617167103,KG -2617167104,2617167359,IS +2617167104,2617167359,IN 2617167360,2617167615,DK 2617167616,2617167871,IL 2617167872,2617168127,PL @@ -49237,7 +50160,7 @@ 2617177856,2617178111,BE 2617178112,2617178367,IM 2617178368,2617178623,BN -2617178624,2617178879,AD +2617178624,2617178879,US 2617178880,2617179135,LT 2617179136,2617179391,MD 2617179392,2617179647,SI @@ -49321,7 +50244,7 @@ 2627076096,2627141631,NL 2627141632,2627469311,US 2627469312,2627731455,TZ -2627731456,2629828607,EG +2627731456,2631925759,EG 2634022912,2634088447,CN 2634088448,2635202559,JP 2635202560,2635268095,CN @@ -49369,7 +50292,10 @@ 2640445440,2640510975,US 2640510976,2640576511,FR 2640576512,2640642047,EC -2640642048,2641952767,JP +2640642048,2641928191,JP +2641928192,2641936383,SG +2641936384,2641944575,US +2641944576,2641952767,JP 2641952768,2642018303,US 2642018304,2642083839,CN 2642083840,2642149375,US @@ -49743,7 +50669,9 @@ 2674130944,2674147327,GB 2674147328,2674163711,NL 2674163712,2674175999,GB -2674176000,2674192383,US +2674176000,2674177286,US +2674177287,2674177287,GB +2674177288,2674192383,US 2674192384,2674196479,CH 2674196480,2674249727,GB 2674249728,2674251775,US @@ -49883,7 +50811,9 @@ 2680487936,2680553471,GB 2680553472,2680684543,US 2680684544,2680750079,SE -2680750080,2681012223,US +2680750080,2680881151,US +2680881152,2680897535,CA +2680897536,2681012223,US 2681012224,2681077759,PL 2681077760,2681143295,CA 2681143296,2681208831,AU @@ -50074,7 +51004,8 @@ 2697789440,2697854975,US 2697854976,2697889791,AU 2697889792,2697891839,US -2697891840,2697892863,AU +2697891840,2697892095,GB +2697892096,2697892863,AU 2697892864,2697894399,US 2697894400,2697920511,AU 2697920512,2698117119,US @@ -50096,7 +51027,10 @@ 2699296768,2699362303,FR 2699362304,2699624447,US 2699624448,2699689983,JP -2699755520,2700935167,JP +2699755520,2700214271,JP +2700214272,2700247039,NA +2700247040,2700263423,UG +2700279808,2700935167,JP 2700935168,2701066239,US 2701066240,2701131775,BG 2701131776,2701132543,HN @@ -50506,7 +51440,9 @@ 2732549120,2732550143,CA 2732550144,2732580863,US 2732580864,2732582911,CA -2732582912,2733903871,US +2732582912,2733882879,US +2733882880,2733883135,CA +2733883136,2733903871,US 2733903872,2733904895,PR 2733904896,2733907967,CA 2733907968,2733911039,US @@ -51049,7 +51985,8 @@ 2773286912,2773745663,US 2773745664,2773794815,NZ 2773794816,2773798911,IN -2773798912,2773807103,NZ +2773798912,2773805055,NZ +2773805056,2773807103,JP 2773807104,2773811199,IN 2773811200,2773876735,US 2773876736,2773942271,AU @@ -51192,6 +52129,7 @@ 2784362496,2784428031,KR 2784428032,2784952063,US 2784952064,2784952319,NL +2784952320,2785017855,ZA 2785017856,2785804287,US 2785804288,2786066431,CH 2786066432,2788163583,US @@ -51536,7 +52474,7 @@ 2835087360,2835152895,AU 2835152896,2835161087,LR 2835161088,2835169279,ZW -2835169280,2835173375,ZA +2835169280,2835177471,ZA 2835177472,2835181567,DZ 2835181568,2835183615,NG 2835183616,2835185663,ZA @@ -51629,6 +52567,13 @@ 2851019776,2851020799,ZA 2851020800,2851021823,AO 2851021824,2851022847,EG +2851022848,2851023871,CM +2851023872,2851024895,ZA +2851024896,2851025919,NG +2851025920,2851026943,GH +2851026944,2851027967,DZ +2851027968,2851028991,ZA +2851028992,2851030015,CI 2851078144,2851995647,US 2852061184,2852062207,ZA 2852062208,2852063231,CM @@ -52000,7 +52945,11 @@ 2886667264,2886729727,US 2887778304,2891034623,US 2891034624,2891036671,CA -2891036672,2891120639,US +2891036672,2891056383,US +2891056384,2891056639,ES +2891056640,2891058943,US +2891058944,2891059199,FR +2891059200,2891120639,US 2891251712,2891272191,US 2891272192,2891274239,CA 2891274240,2891282431,US @@ -52022,14 +52971,30 @@ 2891843328,2891843839,SE 2891843840,2891844095,GB 2891844096,2891845119,FR -2891845120,2891845631,DE -2891845632,2891848959,US +2891845120,2891846399,DE +2891846400,2891846911,CH +2891846912,2891847679,NL +2891847680,2891847935,SG +2891847936,2891848447,MY +2891848448,2891848959,JP 2891848960,2891849471,BN -2891849472,2891857919,US +2891849472,2891849983,PH +2891849984,2891850495,TH +2891850496,2891850751,SG +2891850752,2891854335,US +2891854336,2891855615,NL +2891855616,2891856127,SE +2891856128,2891856383,LU +2891856384,2891857919,US 2891857920,2891858175,ES 2891858176,2891858431,TR 2891858432,2891858687,RO -2891858688,2891871231,US +2891858688,2891862527,US +2891862528,2891863039,KR +2891863040,2891863551,AU +2891863552,2891864063,JP +2891864064,2891864575,SG +2891864576,2891871231,US 2891871232,2891871487,CA 2891871488,2891974655,US 2891974656,2891976703,CA @@ -52047,11 +53012,17 @@ 2892068864,2892069887,CA 2892069888,2892070911,US 2892070912,2892103679,CA -2892103680,2892140543,US +2892103680,2892120831,US +2892120832,2892121087,CA +2892121088,2892140543,US 2892140544,2892144895,CA 2892144896,2892145407,US 2892145408,2892145663,CA -2892145664,2892171263,US +2892145664,2892146943,US +2892146944,2892147199,NL +2892147200,2892149503,US +2892149504,2892149759,NL +2892149760,2892171263,US 2892171264,2892172287,CA 2892172288,2892174335,US 2892174336,2892177407,CA @@ -52066,7 +53037,14 @@ 2892464128,2892496895,CA 2892496896,2892906495,US 2892906496,2892910591,CA -2892910592,2893676543,US +2892910592,2892988415,US +2892988416,2892988671,SC +2892988672,2892988927,PA +2892988928,2892989183,SA +2892989184,2892989439,PE +2892989440,2892989695,CO +2892989696,2892989951,VE +2892989952,2893676543,US 2893676544,2893807615,CA 2893807616,2894921727,US 2894921728,2895118335,GB @@ -52126,7 +53104,9 @@ 2905345280,2905345535,AU 2905345536,2905346815,US 2905346816,2905347071,JP -2905347072,2905348863,US +2905347072,2905348095,US +2905348096,2905348351,PH +2905348352,2905348863,US 2905348864,2905349119,NZ 2905349120,2905387519,US 2905387520,2905388031,CA @@ -52178,7 +53158,9 @@ 2915528768,2915528791,NL 2915528792,2915528863,US 2915528864,2915528879,NL -2915528880,2915795013,US +2915528880,2915528927,US +2915528928,2915528943,NL +2915528944,2915795013,US 2915795014,2915795014,MX 2915795015,2915894575,US 2915894576,2915894591,CA @@ -52474,7 +53456,9 @@ 2928201984,2928202239,JP 2928202240,2928204799,US 2928204800,2928205055,NZ -2928205056,2928226303,US +2928205056,2928206335,US +2928206336,2928206591,PH +2928206592,2928226303,US 2928226304,2928230399,CA 2928230400,2928261375,US 2928261376,2928261887,CA @@ -52812,7 +53796,9 @@ 2954843760,2954843771,ES 2954843772,2954844147,FR 2954844148,2954844151,DE -2954844152,2954844999,FR +2954844152,2954844192,FR +2954844193,2954844193,NL +2954844194,2954844999,FR 2954845000,2954845003,ES 2954845004,2954845183,FR 2954845184,2954845199,DE @@ -52865,7 +53851,9 @@ 2954870904,2954870907,ES 2954870908,2954874431,FR 2954874432,2954874447,GB -2954874448,2954875879,FR +2954874448,2954874655,FR +2954874656,2954874663,DE +2954874664,2954875879,FR 2954875880,2954875883,ES 2954875884,2954876871,FR 2954876872,2954876875,ES @@ -52945,7 +53933,7 @@ 2956500992,2956503039,NL 2956503040,2956504063,CY 2956504064,2956504319,CH -2956504320,2956504575,RU +2956504320,2956504575,NL 2956504576,2956504831,A1 2956504832,2956505087,RU 2956505088,2956506111,NL @@ -53518,7 +54506,7 @@ 2967345152,2967347199,ES 2967347200,2967351295,HR 2967351296,2967355391,FR -2967355392,2967363583,RO +2967355392,2967363583,ES 2967363584,2967371775,SE 2967371776,2967388159,KZ 2967388160,2967392255,RU @@ -53855,7 +54843,9 @@ 2988465216,2988465219,ES 2988465220,2988465559,FR 2988465560,2988465563,ES -2988465564,2988476415,FR +2988465564,2988466098,FR +2988466099,2988466099,BE +2988466100,2988476415,FR 2988476416,2988478463,IT 2988478464,2988478579,FR 2988478580,2988478583,DE @@ -54139,7 +55129,11 @@ 2989883392,2989948927,UA 2989948928,2990014463,FI 2990014464,2990079999,PL -2990080000,2990145535,RU +2990080000,2990096895,RU +2990096896,2990097023,KZ +2990097024,2990097151,RU +2990097152,2990097279,KZ +2990097280,2990145535,RU 2990145536,2990211071,SI 2990211072,2990276607,GR 2990276608,2990342143,ES @@ -55398,9 +56392,13 @@ 3025612896,3025613063,SG 3025613064,3025616895,IN 3025616896,3025617439,SG -3025617440,3025618943,IN +3025617440,3025617447,IN +3025617448,3025617455,SG +3025617456,3025618943,IN 3025618944,3025619519,SG -3025619520,3025620991,IN +3025619520,3025619583,IN +3025619584,3025619711,SG +3025619712,3025620991,IN 3025620992,3025621247,PH 3025621248,3025621503,IN 3025621504,3025621759,PH @@ -55408,7 +56406,8 @@ 3025623056,3025623087,SG 3025623088,3025623295,IN 3025623296,3025623551,JP -3025623552,3025625343,IN +3025623552,3025623807,SG +3025623808,3025625343,IN 3025625344,3025625375,SG 3025625376,3025625391,IN 3025625392,3025625395,CA @@ -55434,11 +56433,10 @@ 3025631240,3025631247,AU 3025631248,3025631747,IN 3025631748,3025631767,HK -3025631768,3025632255,IN -3025632256,3025632271,SG -3025632272,3025632287,IN -3025632288,3025632383,SG -3025632384,3025632511,IN +3025631768,3025631999,IN +3025632000,3025632255,HK +3025632256,3025632399,SG +3025632400,3025632511,IN 3025632512,3025632767,SG 3025632768,3025633535,IN 3025633536,3025633791,HK @@ -55467,7 +56465,9 @@ 3025639536,3025639551,HK 3025639552,3025639679,SG 3025639680,3025639807,HK -3025639808,3025640191,IN +3025639808,3025639839,IN +3025639840,3025639871,HK +3025639872,3025640191,IN 3025640192,3025640447,JP 3025640448,3025640799,MY 3025640800,3025641727,IN @@ -55752,21 +56752,29 @@ 3039395840,3039411199,BZ 3039411200,3039412223,US 3039412224,3039412735,CL -3039412736,3039414015,BR +3039412736,3039412991,BR +3039412992,3039413247,US +3039413248,3039414015,BR 3039414016,3039414271,CL -3039414272,3039414527,BR -3039414528,3039414783,CL -3039414784,3039415039,BR +3039414272,3039415039,BR 3039415040,3039415295,CL 3039415296,3039416319,BR -3039416320,3039416713,CL +3039416320,3039416591,CL +3039416592,3039416607,SG +3039416608,3039416713,CL 3039416714,3039416715,US -3039416716,3039416735,CL +3039416716,3039416719,SG +3039416720,3039416735,CL 3039416736,3039416739,US -3039416740,3039416831,CL +3039416740,3039416741,SG +3039416742,3039416831,CL 3039416832,3039417599,BR 3039417600,3039417855,CL -3039417856,3039420415,BR +3039417856,3039419583,BR +3039419584,3039419647,SG +3039419648,3039419839,BR +3039419840,3039419903,SG +3039419904,3039420415,BR 3039420416,3039428607,AR 3039428608,3039559679,CL 3039559680,3039821823,AR @@ -56024,7 +57032,79 @@ 3050778368,3050778623,US 3050778624,3050778639,TR 3050778640,3050778879,BR -3050778880,3050831871,US +3050778880,3050800383,US +3050800384,3050800399,AL +3050800400,3050800415,AD +3050800416,3050800431,AI +3050800432,3050800447,AG +3050800448,3050800463,AR +3050800464,3050800479,AM +3050800480,3050800495,AZ +3050800496,3050800511,BS +3050800512,3050800639,US +3050800640,3050800655,BB +3050800656,3050800671,BY +3050800672,3050800687,BZ +3050800688,3050800703,BM +3050800704,3050800719,BO +3050800720,3050800735,BA +3050800736,3050800751,VG +3050800752,3050800767,KY +3050800768,3050800895,US +3050800896,3050800911,CN +3050800912,3050800927,CO +3050800928,3050800943,GG +3050800944,3050800959,CU +3050800960,3050800975,CY +3050800976,3050800991,DK +3050800992,3050801007,DO +3050801008,3050801023,EC +3050801024,3050801151,US +3050801152,3050801167,EG +3050801168,3050801183,GQ +3050801184,3050801199,GF +3050801200,3050801215,PF +3050801216,3050801231,GE +3050801232,3050801247,SV +3050801248,3050801263,GD +3050801264,3050801279,GT +3050801280,3050801407,US +3050801408,3050801423,HN +3050801424,3050801439,IR +3050801440,3050801455,JM +3050801456,3050801471,JO +3050801472,3050801487,KG +3050801488,3050801503,LB +3050801504,3050801519,LI +3050801520,3050801535,MG +3050801536,3050801663,US +3050801664,3050801679,MT +3050801680,3050801695,MQ +3050801696,3050801711,MU +3050801712,3050801727,MX +3050801728,3050801743,MC +3050801744,3050801759,ME +3050801760,3050801775,NC +3050801776,3050801791,NI +3050801792,3050802175,US +3050802176,3050802191,OM +3050802192,3050802207,PK +3050802208,3050802223,PE +3050802224,3050802239,PH +3050802240,3050802255,PR +3050802256,3050802271,QA +3050802272,3050802287,LC +3050802288,3050802303,RS +3050802304,3050802431,US +3050802432,3050802447,SC +3050802448,3050802463,SI +3050802464,3050802479,KR +3050802480,3050802495,LK +3050802496,3050802511,TW +3050802512,3050802527,TT +3050802528,3050802543,UY +3050802544,3050802559,VE +3050802560,3050831871,US 3050831872,3051356159,BR 3051356160,3051372543,CR 3051372544,3051372799,PA @@ -56221,6 +57301,7 @@ 3068723200,3068919807,TW 3068919808,3068948479,JP 3068948480,3068949503,VN +3068949504,3068950527,AU 3068950528,3068952575,NZ 3068952576,3068985343,CN 3068985344,3068986367,HK @@ -56320,13 +57401,23 @@ 3082174464,3082178559,BZ 3082178560,3082178823,HK 3082178824,3082178824,SG -3082178825,3082179583,HK +3082178825,3082179047,HK +3082179048,3082179055,SG +3082179056,3082179583,HK 3082179584,3082181631,IN 3082181632,3082182655,ID 3082182656,3082190847,LA 3082190848,3082289151,JP 3082289152,3087007743,CN -3087007744,3088605183,US +3087007744,3088449535,US +3088449536,3088462847,TH +3088462848,3088463103,US +3088463104,3088474111,TH +3088474112,3088478207,US +3088478208,3088489471,TH +3088489472,3088489727,US +3088489728,3088506879,TH +3088506880,3088605183,US 3088605184,3088609279,NL 3088609280,3088629759,US 3088629760,3088633855,NL @@ -56392,7 +57483,9 @@ 3090387968,3090388479,NL 3090388480,3090389503,US 3090389504,3090389631,CA -3090389632,3090415103,US +3090389632,3090401791,US +3090401792,3090402047,IN +3090402048,3090415103,US 3090415104,3090415615,NL 3090415616,3091202047,US 3091202048,3091726335,CA @@ -56400,7 +57493,9 @@ 3091955712,3091959807,CA 3091959808,3091976191,US 3091976192,3091980287,CA -3091980288,3092559359,US +3091980288,3092381695,US +3092381696,3092439039,TH +3092439040,3092559359,US 3092559360,3092559615,NL 3092559616,3092567039,US 3092567040,3092568063,NL @@ -56454,7 +57549,19 @@ 3093282816,3093299199,CA 3093299200,3093908991,US 3093908992,3093909247,PR -3093909248,3094020095,US +3093909248,3093909528,US +3093909529,3093909529,AT +3093909530,3093909597,US +3093909598,3093909598,DE +3093909599,3093909656,US +3093909657,3093909657,FR +3093909658,3093909812,US +3093909813,3093909813,AT +3093909814,3093943785,US +3093943786,3093943786,CZ +3093943787,3093945989,US +3093945990,3093945990,AT +3093945991,3094020095,US 3094020096,3094023303,CA 3094023304,3094023311,BD 3094023312,3094032759,CA @@ -56491,18 +57598,7 @@ 3098107136,3098107391,FR 3098107392,3098107647,EU 3098107648,3098107903,SE -3098107904,3098108159,US -3098108160,3098108415,IL -3098108416,3098108671,US -3098108672,3098108927,SG -3098108928,3098109183,JP -3098109184,3098109439,AU -3098109440,3098109695,HK -3098109696,3098110719,QA -3098110720,3098111743,IT -3098111744,3098113023,US -3098113024,3098113535,AU -3098113536,3098148863,US +3098107904,3098148863,US 3098148864,3098165247,JM 3098165248,3098181631,US 3098181632,3098185727,CA @@ -56561,6 +57657,9 @@ 3103861760,3103862015,ME 3103862016,3103862271,MD 3103862272,3103862527,IT +3103862528,3103862783,FR +3103862784,3103863039,DE +3103863040,3103863295,RU 3103916032,3103917055,CH 3103917056,3103918079,IT 3103918080,3103919103,DE @@ -56573,7 +57672,9 @@ 3103924224,3103924479,DE 3103924480,3103925247,RU 3103925248,3103926271,PL -3103926272,3103927295,CZ +3103926272,3103926783,CZ +3103926784,3103927039,SK +3103927040,3103927295,CZ 3103927296,3103929343,NL 3103929344,3103930367,BE 3103930368,3103931391,DE @@ -57593,7 +58694,24 @@ 3105008640,3105009663,CH 3105009664,3105010687,PL 3105010688,3105011711,AT -3105011712,3105012735,CY +3105011712,3105012229,CY +3105012230,3105012230,US +3105012231,3105012231,CY +3105012232,3105012235,US +3105012236,3105012257,CY +3105012258,3105012258,US +3105012259,3105012259,CY +3105012260,3105012267,US +3105012268,3105012485,CY +3105012486,3105012486,GB +3105012487,3105012487,CY +3105012488,3105012491,GB +3105012492,3105012543,CY +3105012544,3105012557,DE +3105012558,3105012559,US +3105012560,3105012560,CY +3105012561,3105012563,DE +3105012564,3105012735,CY 3105012736,3105013759,GL 3105013760,3105014783,SE 3105014784,3105015807,ES @@ -58704,7 +59822,9 @@ 3106146304,3106147327,GB 3106147328,3106148351,FR 3106148352,3106149375,AT -3106149376,3106150399,EU +3106149376,3106149631,EU +3106149632,3106149887,DE +3106149888,3106150399,EU 3106150400,3106151423,GB 3106151424,3106152447,NO 3106152448,3106153471,GB @@ -58851,7 +59971,8 @@ 3106299904,3106300927,GB 3106300928,3106301951,NL 3106301952,3106302975,GB -3106302976,3106303999,CZ +3106302976,3106303231,A2 +3106303232,3106303999,CZ 3106304000,3106305023,GB 3106305024,3106306047,DE 3106306048,3106307071,NO @@ -59158,7 +60279,9 @@ 3106599936,3106601983,CH 3106601984,3106603007,DE 3106603008,3106604031,BE -3106604032,3106605055,DE +3106604032,3106604543,DE +3106604544,3106604799,RU +3106604800,3106605055,DE 3106605056,3106606079,RU 3106606080,3106607103,AT 3106607104,3106608127,IT @@ -59272,7 +60395,9 @@ 3106716672,3106717695,CZ 3106717696,3106718719,TR 3106718720,3106719743,CH -3106719744,3106720767,DE +3106719744,3106720245,DE +3106720246,3106720246,US +3106720247,3106720767,DE 3106720768,3106722815,AT 3106722816,3106723839,IT 3106723840,3106724863,PL @@ -59618,7 +60743,7 @@ 3107085312,3107086335,NL 3107086336,3107087359,EE 3107087360,3107088383,IE -3107088384,3107089407,NL +3107088384,3107089407,BR 3107089408,3107090431,IT 3107090432,3107091455,FR 3107091456,3107092479,ES @@ -59732,7 +60857,6 @@ 3107204096,3107205119,FR 3107205120,3107206143,BG 3107206144,3107207167,NL -3107207168,3107208191,DE 3107208192,3107209215,NL 3107209216,3107210239,IT 3107210240,3107213311,RU @@ -59746,7 +60870,9 @@ 3107220480,3107221503,GB 3107221504,3107222527,IT 3107222528,3107223551,IQ -3107223552,3107224575,AT +3107223552,3107224063,AT +3107224064,3107224319,DE +3107224320,3107224575,AT 3107224576,3107225599,FR 3107225600,3107226623,AZ 3107226624,3107227647,RU @@ -59832,7 +60958,9 @@ 3107316736,3107317759,KG 3107317760,3107318783,RU 3107318784,3107318799,IE -3107318800,3107319807,NL +3107318800,3107319039,NL +3107319040,3107319295,GB +3107319296,3107319807,NL 3107319808,3107320831,OM 3107320832,3107321855,SA 3107321856,3107322879,NL @@ -60344,10 +61472,7 @@ 3107826688,3107827711,RU 3107827712,3107828735,FR 3107828736,3107829759,IT -3107829760,3107830783,FR -3107830784,3107831639,GB -3107831640,3107831643,FR -3107831644,3107831807,GB +3107829760,3107831807,FR 3107831808,3107832831,RU 3107832832,3107833855,NL 3107833856,3107834879,PS @@ -61555,7 +62680,9 @@ 3109128224,3109128231,DK 3109128232,3109128239,SE 3109128240,3109128247,IS -3109128248,3109128503,NL +3109128248,3109128319,NL +3109128320,3109128383,GB +3109128384,3109128503,NL 3109128504,3109128511,IE 3109128512,3109128719,NL 3109128720,3109128727,GB @@ -61564,7 +62691,9 @@ 3109128744,3109128751,SE 3109128752,3109128759,IE 3109128760,3109128760,IT -3109128761,3109128975,NL +3109128761,3109128831,NL +3109128832,3109128895,BE +3109128896,3109128975,NL 3109128976,3109128983,DK 3109128984,3109128991,SE 3109128992,3109128999,IT @@ -62578,7 +63707,9 @@ 3110182912,3110183935,GB 3110183936,3110184959,RU 3110184960,3110185983,ES -3110185984,3110189055,DE +3110185984,3110187007,DE +3110187008,3110187263,BE +3110187264,3110189055,DE 3110189056,3110190079,FR 3110190080,3110193151,NO 3110193152,3110194175,RU @@ -62955,7 +64086,8 @@ 3110594560,3110595583,DE 3110595584,3110596607,NL 3110596608,3110597631,SE -3110597632,3110600703,RU +3110597632,3110599679,IR +3110599680,3110600703,RU 3110600704,3110601727,GR 3110601728,3110602751,RU 3110602752,3110603775,NL @@ -63008,10 +64140,9 @@ 3110656000,3110657023,GB 3110657024,3110658047,GI 3110658048,3110659071,AT -3110659072,3110660095,IR -3110660096,3110661119,RU +3110659072,3110661119,IR 3110661120,3110662143,ES -3110662144,3110663167,RU +3110662144,3110663167,IR 3110663168,3110664191,LB 3110664192,3110665215,RU 3110665216,3110666239,LB @@ -63110,9 +64241,9 @@ 3110763520,3110764543,AD 3110764544,3110765567,RU 3110765568,3110766591,PL -3110766592,3110767615,RU +3110766592,3110767615,IR 3110767616,3110768639,RS -3110768640,3110769663,RU +3110768640,3110769663,IR 3110769664,3110770687,DE 3110770688,3110771711,NL 3110771712,3110772735,KZ @@ -63146,8 +64277,7 @@ 3110801408,3110802431,ES 3110802432,3110803455,DE 3110803456,3110804479,NL -3110804480,3110805503,RU -3110805504,3110806527,IR +3110804480,3110806527,IR 3110806528,3110809599,NL 3110809600,3110810623,LB 3110810624,3110811647,DE @@ -63188,18 +64318,19 @@ 3110853632,3110854655,DE 3110854656,3110855679,NL 3110855680,3110856703,GB -3110856704,3110857727,KW +3110856704,3110857727,FR 3110857728,3110858751,IT 3110858752,3110859775,RU 3110859776,3110861823,IR -3110861824,3110864895,RU +3110861824,3110862847,UA +3110862848,3110864895,RU 3110864896,3110865919,DE 3110865920,3110866943,GB 3110866944,3110868991,RU 3110868992,3110870015,PS 3110870016,3110871039,CZ 3110871040,3110872063,FR -3110872064,3110873087,ES +3110872064,3110873087,MD 3110873088,3110874111,IE 3110874112,3110875135,GB 3110875136,3110876159,PL @@ -63221,23 +64352,25 @@ 3110894592,3110895615,TR 3110895616,3110896639,IE 3110896640,3110897663,GB -3110897664,3110898687,ES +3110897664,3110898687,MD 3110898688,3110899711,BG -3110899712,3110900735,ES +3110899712,3110900735,MD 3110900736,3110901759,TR -3110901760,3110902783,ES +3110901760,3110902783,MD 3110902784,3110903807,TR -3110903808,3110905855,RU +3110903808,3110904831,RU +3110904832,3110905855,IR 3110905856,3110906879,GB 3110906880,3110907903,DE 3110907904,3110908927,GB -3110908928,3110909951,ES +3110908928,3110909951,MD 3110909952,3110910975,DE 3110910976,3110911999,BG 3110912000,3110914047,RU 3110914048,3110915071,AT 3110915072,3110916095,ES -3110916096,3110918143,RU +3110916096,3110917119,RU +3110917120,3110918143,UA 3110918144,3110919167,DE 3110919168,3110920191,RU 3110920192,3110921215,NL @@ -63295,7 +64428,7 @@ 3110977536,3110978559,JO 3110978560,3110979583,DE 3110979584,3110980607,FR -3110980608,3110982655,RU +3110980608,3110982655,UA 3110982656,3110983679,RO 3110983680,3110984703,PL 3110984704,3110985727,IT @@ -63312,6 +64445,324 @@ 3110996992,3110998015,DE 3110998016,3110999039,ES 3110999040,3111000063,IT +3111000064,3111001087,RO +3111001088,3111002111,IR +3111002112,3111003135,DE +3111003136,3111004159,GG +3111004160,3111005183,DE +3111005184,3111006207,RU +3111006208,3111007231,PL +3111007232,3111008255,GB +3111008256,3111009279,RU +3111009280,3111010303,BG +3111010304,3111012351,ES +3111012352,3111013375,CH +3111013376,3111014399,ES +3111014400,3111015423,DK +3111015424,3111016447,FR +3111016448,3111017471,CH +3111017472,3111018495,NL +3111018496,3111019519,FR +3111019520,3111020543,CH +3111020544,3111021567,SY +3111021568,3111022591,IL +3111022592,3111023615,NL +3111023616,3111024639,IT +3111024640,3111025663,AT +3111025664,3111026687,DE +3111026688,3111027711,RU +3111027712,3111028735,UA +3111028736,3111029759,AT +3111029760,3111031807,SK +3111031808,3111032831,NO +3111032832,3111033855,DE +3111033856,3111035903,ES +3111035904,3111036927,GE +3111036928,3111037951,RU +3111037952,3111038975,NL +3111038976,3111041023,GB +3111041024,3111042047,CH +3111042048,3111043071,GB +3111043072,3111044095,FR +3111044096,3111045119,CH +3111045120,3111046143,NL +3111046144,3111047167,CZ +3111047168,3111048191,RU +3111048192,3111049215,ES +3111049216,3111050239,IR +3111050240,3111051263,CH +3111051264,3111052287,ES +3111052288,3111053311,IR +3111053312,3111054335,SA +3111054336,3111055359,IR +3111055360,3111056383,TR +3111056384,3111057407,IR +3111057408,3111058431,GB +3111058432,3111059455,IR +3111059456,3111060479,ES +3111060480,3111061503,LB +3111061504,3111063551,IR +3111063552,3111064575,FR +3111064576,3111065599,GB +3111065600,3111066623,RU +3111066624,3111067647,NL +3111067648,3111068671,DE +3111068672,3111069695,IS +3111069696,3111070719,IR +3111070720,3111071743,FR +3111071744,3111072767,UA +3111072768,3111074815,FR +3111074816,3111075839,DE +3111075840,3111076863,IR +3111076864,3111077887,AZ +3111077888,3111078911,NL +3111078912,3111079935,IT +3111079936,3111080959,NL +3111080960,3111081983,RU +3111081984,3111083007,HU +3111083008,3111084031,UA +3111084032,3111085055,CZ +3111085056,3111086079,RU +3111086080,3111087103,KZ +3111087104,3111088127,CZ +3111088128,3111089151,IE +3111089152,3111090175,UA +3111090176,3111091199,NL +3111091200,3111092223,AT +3111092224,3111093247,IR +3111093248,3111094271,PL +3111094272,3111095295,IR +3111095296,3111096319,IE +3111096320,3111097343,AT +3111097344,3111098367,ES +3111098368,3111099391,SE +3111099392,3111100415,CH +3111100416,3111101439,LB +3111101440,3111102463,UA +3111102464,3111103487,DE +3111103488,3111104511,DK +3111104512,3111105535,CH +3111105536,3111106559,LT +3111106560,3111107583,ES +3111107584,3111108607,HR +3111108608,3111109631,DE +3111109632,3111110655,BE +3111110656,3111111679,NL +3111111680,3111112703,BE +3111112704,3111113727,HU +3111113728,3111114751,BG +3111114752,3111115775,RU +3111115776,3111116799,DE +3111116800,3111117823,GB +3111117824,3111118847,ES +3111118848,3111119871,TR +3111119872,3111120895,FR +3111120896,3111121919,SE +3111121920,3111122943,TR +3111122944,3111123967,IT +3111123968,3111126015,ES +3111126016,3111127039,IT +3111127040,3111128063,CH +3111128064,3111129087,UA +3111129088,3111130111,FR +3111130112,3111131135,RS +3111131136,3111132159,NO +3111132160,3111133183,CZ +3111133184,3111135231,IR +3111135232,3111136255,PL +3111136256,3111137279,DE +3111137280,3111138303,LI +3111138304,3111139327,CH +3111139328,3111140351,RU +3111140352,3111141375,IT +3111141376,3111142399,NL +3111142400,3111143423,DE +3111143424,3111144447,CH +3111144448,3111145471,ES +3111145472,3111146495,RU +3111146496,3111149567,IT +3111149568,3111150591,GB +3111150592,3111151615,RU +3111151616,3111152639,OM +3111152640,3111153663,NL +3111153664,3111154687,SE +3111154688,3111155711,PL +3111155712,3111156735,UA +3111156736,3111157759,DE +3111157760,3111158783,IR +3111158784,3111159807,CH +3111159808,3111160831,SE +3111160832,3111161855,RU +3111161856,3111162879,IS +3111162880,3111163903,IR +3111163904,3111164927,DE +3111164928,3111165951,HU +3111165952,3111166975,GB +3111166976,3111167999,CZ +3111168000,3111169023,IR +3111169024,3111170047,UA +3111170048,3111171071,DE +3111171072,3111172095,PL +3111172096,3111173119,RO +3111173120,3111174143,IQ +3111174144,3111175167,AZ +3111175168,3111176191,IT +3111176192,3111177215,YE +3111177216,3111178239,IS +3111178240,3111179263,DK +3111179264,3111180287,IT +3111180288,3111181311,DE +3111181312,3111182335,GB +3111182336,3111183359,RU +3111183360,3111184383,FR +3111184384,3111185407,IQ +3111185408,3111186431,RU +3111186432,3111189503,GB +3111189504,3111190527,DE +3111190528,3111191551,GB +3111191552,3111192575,DE +3111192576,3111193599,TR +3111193600,3111194623,RU +3111194624,3111195647,GB +3111195648,3111196671,CH +3111196672,3111197695,GB +3111197696,3111198719,RU +3111198720,3111199743,PL +3111199744,3111200767,KZ +3111200768,3111201791,ES +3111201792,3111202815,SK +3111202816,3111203839,FR +3111203840,3111204863,NL +3111204864,3111205887,IR +3111205888,3111206911,GB +3111206912,3111207935,FR +3111207936,3111208959,GB +3111208960,3111211007,RU +3111211008,3111212031,GB +3111212032,3111214079,NL +3111214080,3111215103,GB +3111215104,3111216127,SE +3111216128,3111217151,AT +3111217152,3111218175,IR +3111218176,3111219199,RU +3111219200,3111220223,IR +3111220224,3111221247,RU +3111221248,3111223295,DE +3111223296,3111224319,GB +3111224320,3111225343,KZ +3111225344,3111226367,RU +3111226368,3111227391,PT +3111227392,3111228415,DE +3111228416,3111230463,IR +3111230464,3111231487,PT +3111231488,3111232511,FR +3111232512,3111233535,DE +3111233536,3111234559,LV +3111234560,3111235583,NL +3111235584,3111236607,SE +3111236608,3111237631,GB +3111237632,3111238655,ES +3111238656,3111239679,GB +3111239680,3111240703,ES +3111240704,3111241727,NL +3111241728,3111242751,RU +3111242752,3111243775,GB +3111243776,3111244799,RU +3111244800,3111245823,NL +3111245824,3111246847,GB +3111246848,3111247871,TR +3111247872,3111248895,NL +3111248896,3111249919,DK +3111249920,3111250943,IE +3111250944,3111251967,ES +3111251968,3111252991,GB +3111252992,3111254015,RU +3111254016,3111255039,IE +3111255040,3111256063,EE +3111256064,3111257087,IT +3111257088,3111259135,FR +3111259136,3111261183,DE +3111261184,3111262207,TR +3111262208,3111266303,NL +3111266304,3111267327,DE +3111267328,3111268351,DK +3111268352,3111269375,BE +3111269376,3111270399,RO +3111270400,3111271423,NO +3111271424,3111272447,NL +3111272448,3111273471,ES +3111273472,3111274495,SA +3111274496,3111275519,IR +3111275520,3111276543,NL +3111276544,3111277567,IT +3111277568,3111278591,RO +3111278592,3111279615,LB +3111279616,3111280639,PL +3111280640,3111281663,GB +3111281664,3111282687,FR +3111282688,3111283711,SE +3111283712,3111284735,IT +3111284736,3111285759,AL +3111285760,3111286783,IT +3111286784,3111287807,IL +3111287808,3111288831,DE +3111288832,3111289855,FR +3111289856,3111290879,DE +3111290880,3111291903,UA +3111291904,3111292927,NL +3111292928,3111293951,SI +3111293952,3111294975,GB +3111294976,3111295999,US +3111296000,3111297023,NL +3111297024,3111298047,IE +3111298048,3111299071,NL +3111299072,3111300095,DE +3111300096,3111301119,ES +3111301120,3111302143,EE +3111302144,3111303167,BG +3111303168,3111304191,NL +3111304192,3111305215,IR +3111305216,3111306239,TR +3111306240,3111307263,NL +3111307264,3111308287,DE +3111308288,3111309311,GB +3111309312,3111310335,CH +3111310336,3111313407,DE +3111313408,3111314431,AT +3111314432,3111315455,GB +3111315456,3111316479,IT +3111316480,3111317503,NL +3111317504,3111318527,SY +3111318528,3111319551,RU +3111319552,3111320575,SE +3111320576,3111321599,LB +3111321600,3111322623,CZ +3111322624,3111323647,GE +3111323648,3111324671,CZ +3111324672,3111325695,MT +3111325696,3111326719,FI +3111326720,3111327743,HU +3111327744,3111328767,DE +3111328768,3111329791,RO +3111329792,3111330815,NL +3111330816,3111331839,UA +3111331840,3111332863,TR +3111332864,3111333887,PL +3111333888,3111334911,DE +3111334912,3111335935,ES +3111335936,3111336959,HR +3111336960,3111337983,GB +3111337984,3111339007,RO +3111339008,3111340031,GB +3111340032,3111341055,CZ +3111341056,3111342079,IR +3111342080,3111343103,DE +3111343104,3111344127,GB +3111344128,3111345151,NL +3111345152,3111346175,RO +3111346176,3111347199,RU +3111347200,3111348223,LB +3111348224,3111349247,DE 3113710318,3113710318,CA 3120562176,3120594943,CO 3120594944,3120599039,AR @@ -64128,7 +65579,9 @@ 3164973424,3164973663,FR 3164973664,3164973695,GB 3164973696,3164974335,FR -3164974336,3164974463,GB +3164974336,3164974437,GB +3164974438,3164974438,IT +3164974439,3164974463,GB 3164974464,3164974527,FR 3164974528,3164974559,ES 3164974560,3164974651,FR @@ -64224,9 +65677,7 @@ 3167784960,3167797247,IR 3167797248,3167798271,MD 3167798272,3167799295,RO -3167799296,3167800319,MD -3167800320,3167801343,RO -3167801344,3167803391,MD +3167799296,3167803391,MD 3167803392,3167804159,RO 3167804160,3167804415,ES 3167804416,3167805439,GB @@ -64293,7 +65744,9 @@ 3168018688,3168020479,RO 3168020480,3168022527,MD 3168022528,3168034815,IR -3168034816,3168038911,RO +3168034816,3168037887,RO +3168037888,3168038399,SE +3168038400,3168038911,RO 3168038912,3168039935,MD 3168039936,3168040959,BE 3168040960,3168050431,RO @@ -64341,15 +65794,19 @@ 3168137472,3168137727,MD 3168137728,3168137983,EU 3168137984,3168138239,NL -3168138240,3168139263,RO +3168138240,3168139263,MD 3168139264,3168141311,GB 3168141312,3168143615,RO 3168143616,3168143871,UA -3168143872,3168145151,RO +3168143872,3168144383,RO +3168144384,3168144639,SG +3168144640,3168145151,RO 3168145152,3168145407,UA 3168145408,3168147455,RO 3168147456,3168147967,FR -3168147968,3168155135,RO +3168147968,3168154111,RO +3168154112,3168154367,SG +3168154368,3168155135,RO 3168155136,3168155391,IT 3168155392,3168156671,RO 3168156672,3168157695,MD @@ -64393,13 +65850,16 @@ 3168239616,3168243711,IR 3168243712,3168247807,RO 3168247808,3168264191,IR -3168264192,3168265983,RO +3168264192,3168265727,RO +3168265728,3168265855,FR +3168265856,3168265983,RO 3168265984,3168266239,GR -3168266240,3168268287,RO -3168268288,3168269311,MD +3168266240,3168267263,RO +3168267264,3168269311,MD 3168269312,3168270591,RO 3168270592,3168270847,MD -3168270848,3168272383,RO +3168270848,3168271359,RO +3168271360,3168272383,MD 3168272384,3168534527,IT 3168534528,3168796671,GB 3168796672,3168829439,FR @@ -64436,7 +65896,9 @@ 3169648640,3169714175,MD 3169714176,3169779711,FI 3169779712,3169845247,UA -3169845248,3169863167,RO +3169845248,3169854463,RO +3169854464,3169854719,ES +3169854720,3169863167,RO 3169863168,3169863423,MD 3169863424,3169869823,RO 3169869824,3169878015,MD @@ -64451,7 +65913,9 @@ 3169899264,3169899391,CN 3169899392,3169899519,TW 3169899520,3169899775,IR -3169899776,3169905663,RO +3169899776,3169902079,RO +3169902080,3169902591,SE +3169902592,3169905663,RO 3169905664,3169906687,ES 3169906688,3169913855,RO 3169913856,3169914111,GB @@ -65134,7 +66598,8 @@ 3194806272,3194814463,AR 3194814464,3194818559,PA 3194818560,3194830847,AR -3194830848,3194839039,PA +3194830848,3194831871,BR +3194831872,3194839039,PA 3194839040,3194863615,CO 3194863616,3194871807,HN 3194871808,3194879999,BO @@ -65221,7 +66686,9 @@ 3195205632,3195206655,PE 3195206656,3195207679,CL 3195207680,3195211775,GT -3195211776,3195215871,BZ +3195211776,3195214988,BZ +3195214989,3195214989,RU +3195214990,3195215871,BZ 3195215872,3195224063,AR 3195224064,3195232255,PA 3195232256,3195234559,CR @@ -67146,7 +68613,7 @@ 3226141952,3226143487,CA 3226143488,3226143743,US 3226143744,3226146559,CA -3226146560,3226146815,FR +3226146560,3226146815,US 3226146816,3226156543,CA 3226156544,3226156799,US 3226156800,3226157567,CA @@ -67177,8 +68644,8 @@ 3226237696,3226240255,DE 3226240256,3226240511,US 3226240512,3226241535,DE -3226241536,3226241791,AT -3226241792,3226248447,DE +3226241536,3226241791,NL +3226241792,3226248191,DE 3226248448,3226248703,IE 3226248704,3226250495,DE 3226250496,3226251263,US @@ -68122,11 +69589,12 @@ 3228406016,3228406271,US 3228406272,3228406527,IN 3228406528,3228407039,FR -3228407040,3228424703,DE +3228407296,3228424447,DE 3228424704,3228424959,US -3228425216,3228430847,DE +3228425216,3228430335,DE +3228430592,3228430847,DE 3228430848,3228431103,MU -3228431360,3228434431,DE +3228431872,3228434431,DE 3228434432,3228456191,US 3228456192,3228456447,CA 3228456448,3228457471,US @@ -68927,6 +70395,7 @@ 3231093248,3231093503,NL 3231093504,3231101183,US 3231101184,3231103231,GB +3231103232,3231103487,CA 3231103488,3231103999,US 3231104000,3231104255,NO 3231104256,3231104767,DE @@ -68953,8 +70422,7 @@ 3231113984,3231115775,GB 3231115776,3231116799,AU 3231116800,3231117055,HU -3231117056,3231118335,US -3231118592,3231118847,US +3231117056,3231118847,US 3231118848,3231119103,AU 3231119104,3231119359,US 3231119360,3231119615,GB @@ -69028,6 +70496,7 @@ 3231225600,3231225855,DE 3231225856,3231226879,US 3231226880,3231227135,GB +3231227136,3231227391,US 3231227392,3231227647,CA 3231227648,3231228927,US 3231228928,3231229183,PR @@ -69045,7 +70514,9 @@ 3231237632,3231241215,US 3231241216,3231241471,AU 3231241472,3231241727,CA -3231241728,3231248639,US +3231241728,3231244287,US +3231244288,3231244543,CA +3231244544,3231248639,US 3231248640,3231248895,NL 3231248896,3231249407,US 3231249408,3231249663,GB @@ -69407,7 +70878,7 @@ 3231906048,3231907839,RU 3231907840,3231912959,US 3231912960,3231913215,AP -3231913472,3231916031,US +3231913216,3231916031,US 3231916032,3231948799,FI 3231948800,3231973375,US 3231973376,3232038911,AT @@ -69496,26 +70967,27 @@ 3232407040,3232407551,SG 3232407552,3232432383,US 3232432384,3232433663,EU -3232433920,3232440319,US +3232433664,3232440319,US 3232440320,3232448511,CA 3232448512,3232461311,US 3232461312,3232461823,CA 3232461824,3232462847,US 3232462848,3232464895,BB 3232464896,3232483327,GB -3232483328,3232555007,US -3232555264,3232555775,US +3232483328,3232555775,US 3232555776,3232557055,JP 3232557056,3232557311,AU 3232557312,3232557567,US -3232557568,3232560127,JP +3232557568,3232559103,JP +3232559104,3232559359,US +3232559360,3232560127,JP 3232560896,3232561663,US 3232561664,3232561919,CA 3232561920,3232562431,US 3232562432,3232562687,NL 3232562688,3232562943,CA -3232562944,3232563199,US -3232563200,3232564479,GB +3232562944,3232563455,US +3232563456,3232564479,GB 3232564480,3232567295,US 3232567296,3232569599,NZ 3232569600,3232570367,US @@ -69587,7 +71059,9 @@ 3233484800,3233487359,ES 3233487360,3233487871,US 3233487872,3233488895,CA -3233488896,3233548799,US +3233488896,3233546751,US +3233546752,3233547007,CA +3233547008,3233548799,US 3233548800,3233549055,NL 3233549056,3233549311,BR 3233549312,3233557247,US @@ -69604,7 +71078,8 @@ 3233564928,3233566719,JP 3233567744,3233567999,US 3233568000,3233568767,JP -3233568768,3233569791,AU +3233568768,3233569023,CA +3233569024,3233569535,AU 3233569792,3233570047,JP 3233570048,3233570815,US 3233570816,3233571071,GB @@ -69618,9 +71093,9 @@ 3233575680,3233575935,AU 3233575936,3233576191,RU 3233576192,3233576447,GB -3233576448,3233576959,US -3233576960,3233577983,NL -3233577984,3233578239,US +3233576448,3233577215,US +3233577216,3233577727,NL +3233577728,3233578239,US 3233578240,3233578495,NL 3233578496,3233578751,US 3233578752,3233579007,NL @@ -69656,7 +71131,7 @@ 3233607168,3233607935,US 3233607936,3233608191,AU 3233608192,3233609727,HU -3233609728,3233611775,US +3233609728,3233612031,US 3233612032,3233612287,NL 3233612288,3233613823,US 3233613824,3233614847,GB @@ -69711,7 +71186,8 @@ 3233654272,3233655551,GB 3233655552,3233663487,US 3233663488,3233663999,NL -3233664000,3233665023,US +3233664000,3233664255,CA +3233664256,3233665023,US 3233665024,3233666047,AU 3233666048,3233668863,US 3233668864,3233669119,AU @@ -69719,7 +71195,9 @@ 3233670400,3233670655,AU 3233671168,3233676031,US 3233676032,3233676287,NL -3233676288,3233684991,US +3233676288,3233677311,US +3233677312,3233677567,CA +3233677568,3233684991,US 3233684992,3233685247,MX 3233685248,3233685503,BR 3233685504,3233688575,US @@ -69737,7 +71215,7 @@ 3233694976,3233695231,FR 3233695232,3233696511,US 3233696512,3233696767,CA -3233696768,3233701375,US +3233696768,3233701631,US 3233701632,3233701887,NL 3233701888,3233704959,US 3233704960,3233705215,NZ @@ -69833,19 +71311,19 @@ 3233936640,3233936895,EU 3233936896,3233939455,US 3233939456,3234004991,FI +3234004992,3234005247,US 3234005248,3234005503,GB 3234005504,3234005759,AU +3234005760,3234006015,CA 3234006016,3234007039,US 3234007040,3234007295,NL 3234007296,3234007551,US 3234007552,3234007807,AU 3234007808,3234008063,US 3234008064,3234008831,NZ -3234008832,3234013183,US -3234013440,3234013695,US +3234008832,3234013695,US 3234013696,3234013951,AU -3234013952,3234014207,US -3234014464,3234014975,US +3234013952,3234014975,US 3234014976,3234015487,AU 3234015488,3234015743,US 3234015744,3234015999,IE @@ -69860,7 +71338,7 @@ 3234031360,3234031871,US 3234031872,3234032127,GB 3234032128,3234032383,NL -3234032384,3234032895,US +3234032384,3234033151,US 3234033152,3234033407,NL 3234033408,3234033663,US 3234033664,3234033919,AU @@ -69882,15 +71360,21 @@ 3234054912,3234055167,NL 3234055168,3234055423,US 3234055424,3234055679,AU -3234055680,3234061055,US +3234055680,3234056959,US +3234056960,3234057215,CA +3234057216,3234061055,US 3234061056,3234061311,AU 3234061312,3234064639,US 3234064640,3234064895,AU 3234064896,3234065407,US 3234065408,3234065663,NL 3234065664,3234065919,BR -3234065920,3234070527,US -3234070528,3234110463,FR +3234065920,3234069247,US +3234069248,3234069503,CA +3234069504,3234070271,US +3234070272,3234070527,CA +3234070528,3234070783,US +3234070784,3234110463,FR 3234110464,3234128455,US 3234128456,3234128463,GB 3234128464,3234130695,US @@ -69900,7 +71384,9 @@ 3234131192,3234136063,US 3234136064,3234150911,CA 3234150912,3234151423,US -3234151424,3234159615,CA +3234151424,3234158847,CA +3234158848,3234159103,US +3234159104,3234159615,CA 3234159616,3234160127,US 3234160128,3234164991,CA 3234164992,3234165247,US @@ -69912,10 +71398,14 @@ 3234176000,3234177279,US 3234177280,3234187007,CA 3234187008,3234187519,US -3234187520,3234192383,CA +3234187520,3234189055,CA +3234189056,3234189311,US +3234189312,3234192383,CA 3234192384,3234193663,US -3234193664,3234201599,CA -3234201600,3234203647,US +3234193664,3234198783,CA +3234198784,3234199039,US +3234199040,3234201343,CA +3234201344,3234203647,US 3234203648,3234205183,BR 3234205184,3234205439,AR 3234205440,3234205695,BR @@ -69933,7 +71423,9 @@ 3234238976,3234239231,MY 3234239232,3234240255,US 3234240256,3234240511,EU -3234240512,3234270207,US +3234240512,3234267135,US +3234267136,3234267391,CA +3234267392,3234270207,US 3234270208,3234271231,CA 3234271232,3234275327,PT 3234275328,3234279423,AU @@ -69949,7 +71441,11 @@ 3234340096,3234340351,IN 3234340352,3234349055,US 3234349056,3234353151,NZ -3234353152,3234549759,US +3234353152,3234529279,US +3234529280,3234529535,PR +3234529536,3234538751,US +3234538752,3234539007,TC +3234539520,3234549759,US 3234549760,3234550015,RU 3234553856,3234554367,US 3234554624,3234554879,AU @@ -69978,29 +71474,30 @@ 3234583808,3234584063,AU 3234584064,3234584575,US 3234584576,3234584831,AU -3234584832,3234585343,US -3234585600,3234587391,US +3234584832,3234587391,US 3234587392,3234587647,NL 3234587648,3234588671,US 3234588672,3234588927,AU 3234588928,3234589439,US 3234589440,3234589695,AU -3234589696,3234592511,US +3234589696,3234590463,US +3234590464,3234590719,CA +3234590720,3234592511,US 3234592512,3234592767,AU -3234592768,3234725887,US +3234592768,3234726143,US 3234726144,3234726399,CA 3234726400,3234726911,US 3234726912,3234727935,CA 3234727936,3234733055,US 3234733056,3234733311,CA -3234733312,3234739455,US +3234733312,3234739711,US 3234739712,3234740223,CA 3234740224,3234745599,US 3234745600,3234746879,GB 3234746880,3234747903,US 3234747904,3234748159,NL -3234748160,3234749439,US -3234749440,3234750463,CA +3234748160,3234749695,US +3234749696,3234750207,CA 3234750464,3234751999,US 3234752000,3234752255,AU 3234752256,3234753535,US @@ -70012,12 +71509,12 @@ 3234764800,3234766335,NZ 3234766336,3234772223,US 3234772224,3234772479,CA -3234772480,3234772735,US -3234772992,3234781439,US +3234772480,3234781439,US 3234781440,3234781951,CA 3234781952,3234782719,US 3234782720,3234783999,IL 3234784000,3234794495,US +3234794496,3234794751,CA 3234794752,3234795007,US 3234795008,3234795263,NL 3234795264,3234799359,US @@ -70030,7 +71527,7 @@ 3234801664,3234802431,EC 3234802432,3234803711,US 3234803712,3234803967,PR -3234804224,3234806783,US +3234803968,3234806783,US 3234806784,3234807295,CA 3234807552,3234807807,US 3234807808,3234808063,AU @@ -70043,8 +71540,7 @@ 3234816000,3234816767,AU 3234816768,3234820351,US 3234820352,3234820607,AU -3234820608,3234820863,US -3234821120,3234821887,US +3234820608,3234821887,US 3234821888,3234822655,AU 3234822656,3234826751,US 3234826752,3234827007,CA @@ -70076,17 +71572,19 @@ 3234853888,3234854143,EC 3234854144,3234854911,US 3234854912,3234855167,AU -3234855168,3234855935,US -3234856192,3234856447,US +3234855168,3234856447,US 3234856448,3234856703,AU -3234856960,3234861055,CA -3234861056,3234988031,US -3234988032,3234991103,CA -3234991104,3235004415,US +3234856704,3234857215,US +3234857216,3234861055,CA +3234861056,3234988287,US +3234988288,3234990847,CA +3234990848,3235004415,US 3235004416,3235021823,CA 3235021824,3235026943,US 3235026944,3235027967,CA -3235027968,3235045375,US +3235027968,3235044375,US +3235044376,3235044383,GB +3235044384,3235045375,US 3235045376,3235045887,CA 3235045888,3235065343,US 3235065344,3235065855,CA @@ -70103,10 +71601,16 @@ 3235389440,3235389951,VE 3235389952,3235512319,US 3235512320,3235577855,JP -3235577856,3235643391,CA -3235643392,3235774463,US -3235774464,3235776767,CA -3235777024,3235800319,US +3235577856,3235643135,CA +3235643136,3235745791,US +3235745792,3235745792,DE +3235745793,3235747839,US +3235747840,3235748095,GB +3235748096,3235748351,US +3235748352,3235748607,GB +3235748608,3235774719,US +3235774720,3235776767,CA +3235776768,3235800575,US 3235800576,3235801087,CA 3235801088,3235807231,US 3235807232,3235839999,CA @@ -70184,7 +71688,8 @@ 3236044800,3236052991,CA 3236052992,3236069375,US 3236069376,3236102143,CA -3236102144,3236106239,PH +3236102144,3236102399,US +3236102400,3236106239,PH 3236106240,3236140031,US 3236140032,3236142079,CA 3236142080,3236142335,US @@ -70195,8 +71700,8 @@ 3236143007,3236143103,CA 3236143104,3236163519,US 3236163520,3236163583,IE -3236163584,3236167679,US -3236167680,3236175871,CA +3236163584,3236167935,US +3236167936,3236175871,CA 3236175872,3236200447,US 3236200448,3236233215,MY 3236233216,3236237567,US @@ -70211,13 +71716,17 @@ 3236312320,3236312575,GH 3236312576,3236312831,GR 3236312832,3236313087,QA -3236313088,3236368127,US +3236313088,3236365567,US +3236365568,3236365823,CA +3236365824,3236368127,US 3236368128,3236368383,AU 3236368384,3236372991,US 3236372992,3236373247,AU -3236373504,3236379391,US +3236373248,3236373503,US +3236373504,3236373759,BS +3236373760,3236379391,US 3236379392,3236379647,AU -3236379648,3236380927,US +3236379648,3236381183,US 3236381184,3236381439,CA 3236381440,3236381695,NL 3236381696,3236383999,US @@ -70236,7 +71745,7 @@ 3236395008,3236395519,BR 3236395520,3236396799,US 3236396800,3236397055,AU -3236397056,3236398591,US +3236397056,3236398847,US 3236398848,3236399359,AU 3236399616,3236400127,US 3236400128,3236400383,CL @@ -70250,14 +71759,15 @@ 3236409088,3236409599,BR 3236409600,3236411135,US 3236411136,3236411391,AU -3236411392,3236413695,US +3236411392,3236412415,US +3236412416,3236412671,CA +3236412672,3236413695,US 3236413696,3236413951,AU 3236413952,3236416255,US 3236416256,3236416511,AU 3236416512,3236418303,US 3236418304,3236418815,AU -3236418816,3236419071,US -3236419328,3236419583,US +3236418816,3236419583,US 3236419584,3236419839,AU 3236419840,3236420095,US 3236420096,3236420351,AU @@ -70266,16 +71776,18 @@ 3236425216,3236427519,US 3236427520,3236427775,CA 3236427776,3236428031,AU -3236428288,3236429311,US +3236428032,3236429311,US 3236429312,3236429567,MU -3236429824,3236438015,US +3236429568,3236438015,US 3236446208,3236447487,US 3236447488,3236447743,AP 3236447744,3236450047,US 3236450048,3236450303,EU 3236450304,3236462591,US 3236462592,3236470783,AU -3236470784,3236566783,US +3236470784,3236560895,US +3236560896,3236561151,CA +3236561152,3236566783,US 3236566784,3236567039,CA 3236567040,3236575743,US 3236575744,3236575999,AU @@ -70286,8 +71798,9 @@ 3236604928,3236610047,US 3236610560,3236611071,US 3236611072,3236612095,CA -3236612096,3236617471,US -3236617728,3236617983,US +3236612096,3236613119,US +3236613120,3236613375,CA +3236613376,3236617983,US 3236617984,3236619775,CA 3236619776,3236620031,US 3236620032,3236620287,AU @@ -70295,7 +71808,7 @@ 3236623616,3236623871,AU 3236623872,3236625919,US 3236625920,3236626175,CA -3236626432,3236638719,US +3236626176,3236638719,US 3236638720,3236642815,BB 3236642816,3236659199,US 3236659200,3236691967,CA @@ -70329,9 +71842,9 @@ 3236787968,3236788223,JP 3236788224,3236788479,US 3236788480,3236789503,GB -3236789504,3236823039,US -3236823040,3236826111,CH -3236826112,3236827135,CA +3236789504,3236823295,US +3236823296,3236825855,CH +3236825856,3236827135,CA 3236827136,3236828415,US 3236828416,3236828671,A1 3236828672,3236958207,US @@ -70395,14 +71908,13 @@ 3237325056,3237325311,NL 3237325312,3237325823,US 3237325824,3237326079,CA -3237326080,3237328127,US -3237328384,3237328639,US +3237326080,3237328639,US 3237328640,3237328895,CA 3237328896,3237329151,US 3237329152,3237329407,NZ 3237329664,3237330943,US 3237330944,3237331199,AU -3237331456,3237331711,US +3237331200,3237331711,US 3237331968,3237332223,AU 3237332224,3237335039,US 3237335040,3237335295,AU @@ -70419,7 +71931,9 @@ 3237346304,3237366015,US 3237366016,3237366271,AU 3237366272,3237412863,US -3237412864,3237415935,GB +3237412864,3237413119,CA +3237413120,3237415679,GB +3237415680,3237415935,US 3237415936,3237416959,CA 3237416960,3237478399,US 3237478400,3237511167,LK @@ -70441,7 +71955,7 @@ 3237613568,3237614591,CA 3237614592,3237615615,US 3237615616,3237616895,CA -3237617152,3237622015,US +3237616896,3237622015,US 3237622016,3237622271,AP 3237622272,3237634601,US 3237634602,3237634603,EU @@ -70449,7 +71963,9 @@ 3237647104,3237647359,AU 3237647360,3237655039,US 3237655040,3237655551,IN -3237655552,3237681663,US +3237655552,3237675007,US +3237675008,3237675263,CA +3237675264,3237681663,US 3237681664,3237682943,CA 3237682944,3237684991,US 3237684992,3237685247,CL @@ -70470,6 +71986,7 @@ 3237725184,3237725439,CA 3237725440,3237725695,US 3237725696,3237726207,CA +3237726208,3237726463,US 3237726464,3237726719,AU 3237726720,3237726975,GH 3237726976,3237727231,US @@ -70501,7 +72018,7 @@ 3237870592,3237870847,DE 3237870848,3237870975,KR 3237870976,3237871103,JP -3237871104,3237871231,PH +3237871104,3237871231,TH 3237871232,3237871359,TW 3237871360,3237871487,SG 3237871488,3237871615,MY @@ -72712,7 +74229,6 @@ 3244919296,3244919551,SE 3244919552,3244919807,DE 3244919808,3244920063,RO -3244920064,3244920319,RU 3244920320,3244920575,SK 3244920576,3244920831,PL 3244920832,3244921087,NL @@ -73689,7 +75205,11 @@ 3248624384,3248624639,US 3248624640,3248624895,DK 3248624896,3248625151,AP -3248625152,3248719871,DK +3248625152,3248626175,DK +3248626176,3248626176,EU +3248626177,3248626190,DK +3248626191,3248626191,US +3248626192,3248719871,DK 3248719872,3248720127,EU 3248720128,3248748543,DK 3248748544,3248748573,EU @@ -74331,9 +75851,7 @@ 3250748416,3250749439,UA 3250749440,3250749695,GH 3250749696,3250749951,EU -3250750464,3250750537,FR -3250750538,3250750541,EU -3250750542,3250751487,FR +3250750464,3250751487,FR 3250751488,3250751743,DE 3250752000,3250752511,CH 3250752512,3250753023,BG @@ -74440,7 +75958,6 @@ 3251151360,3251151615,DE 3251151872,3251152127,NL 3251152128,3251152639,RO -3251152640,3251152895,UA 3251152896,3251153151,RU 3251153408,3251153663,TR 3251153664,3251153919,FR @@ -74663,7 +76180,9 @@ 3251272448,3251272703,AT 3251272704,3251272959,DE 3251272960,3251273471,FR -3251273472,3251290111,DE +3251273472,3251286015,DE +3251286016,3251288063,US +3251288064,3251290111,SG 3251290112,3251302399,GB 3251302400,3251306239,LI 3251306240,3251306495,EU @@ -75312,11 +76831,17 @@ 3253767676,3253767679,DE 3253767680,3253767711,GB 3253767712,3253767743,DE -3253767744,3253770983,GB +3253767744,3253768565,GB +3253768566,3253768566,DE +3253768567,3253770983,GB 3253770984,3253770984,DE 3253770985,3253771199,GB 3253771200,3253771263,IE -3253771264,3253773055,GB +3253771264,3253772063,GB +3253772064,3253772095,DE +3253772096,3253772191,GB +3253772192,3253772207,DE +3253772208,3253773055,GB 3253773056,3253773311,DE 3253773312,3253796863,GB 3253796864,3253862399,SE @@ -76032,7 +77557,6 @@ 3255615488,3255623679,DE 3255623680,3255631871,BG 3255631872,3255659519,NL -3255659776,3255660031,NL 3255660288,3255660543,GR 3255660544,3255666175,NL 3255666432,3255666687,DE @@ -77987,7 +79511,6 @@ 3264660992,3264661503,CH 3264661504,3264662015,GB 3264662016,3264662527,RU -3264662528,3264663039,UA 3264663040,3264663551,PL 3264663552,3264664063,NL 3264664064,3264664575,DE @@ -79183,7 +80706,6 @@ 3270980864,3270981631,RU 3270981632,3270981887,IT 3270981888,3270982143,AT -3270982144,3270982399,RU 3270982400,3270982655,TR 3270982656,3270982911,UA 3270982912,3270983167,DK @@ -79490,8 +81012,8 @@ 3272217152,3272217215,EU 3272217216,3272217279,BE 3272217280,3272217303,DE -3272217304,3272217319,BE -3272217320,3272217343,EU +3272217304,3272217327,BE +3272217328,3272217343,EU 3272217344,3272217599,GB 3272217600,3272217631,CH 3272217632,3272217855,EU @@ -80916,7 +82438,6 @@ 3275510400,3275510463,NL 3275510464,3275510527,GB 3275510528,3275510559,PL -3275510560,3275510591,DE 3275510592,3275510623,CY 3275510624,3275510655,EE 3275510656,3275510687,FR @@ -81472,7 +82993,9 @@ 3276876384,3276876415,NL 3276876416,3276880427,GB 3276880428,3276880431,DK -3276880432,3276882047,GB +3276880432,3276881811,GB +3276881812,3276881815,FR +3276881816,3276882047,GB 3276882048,3276882687,IT 3276882688,3276883077,GB 3276883078,3276883078,IT @@ -81480,7 +83003,9 @@ 3276883712,3276883839,IT 3276883840,3276886363,GB 3276886364,3276886367,DE -3276886368,3276890175,GB +3276886368,3276886649,GB +3276886650,3276886650,DE +3276886651,3276890175,GB 3276890176,3276890191,US 3276890192,3276892159,GB 3276892160,3276893183,IT @@ -81518,7 +83043,9 @@ 3276912880,3276912895,IT 3276912896,3276917231,GB 3276917232,3276917247,FR -3276917248,3276919375,GB +3276917248,3276919061,GB +3276919062,3276919062,DE +3276919063,3276919375,GB 3276919376,3276919391,DE 3276919392,3276919471,GB 3276919472,3276919479,DE @@ -81690,11 +83217,10 @@ 3277374464,3277375999,RU 3277376000,3277376511,NL 3277376512,3277377023,RO -3277377024,3277378559,RU +3277377024,3277378047,RU 3277378560,3277379071,HR 3277379072,3277379583,UZ 3277379584,3277380095,RS -3277380096,3277380607,RO 3277380608,3277381119,RU 3277381120,3277381631,KW 3277381632,3277382143,RU @@ -83046,7 +84572,9 @@ 3284016384,3284016639,CH 3284016640,3284017151,DK 3284017152,3284025343,GR -3284025344,3284028287,GB +3284025344,3284028139,GB +3284028140,3284028143,US +3284028144,3284028287,GB 3284028288,3284028319,US 3284028320,3284029183,GB 3284029184,3284029199,US @@ -83055,7 +84583,9 @@ 3284030480,3284030495,FR 3284030496,3284030615,GB 3284030616,3284030623,SE -3284030624,3284033535,GB +3284030624,3284030991,GB +3284030992,3284031007,FR +3284031008,3284033535,GB 3284033536,3284041727,RU 3284041728,3284041983,DK 3284041984,3284042239,SI @@ -83302,7 +84832,6 @@ 3285098496,3285114879,GB 3285114880,3285115903,RU 3285115904,3285116415,SI -3285116416,3285116927,CZ 3285116928,3285117439,UA 3285117952,3285118463,FR 3285118464,3285118975,UA @@ -83612,7 +85141,9 @@ 3285964800,3285964935,DE 3285964936,3285965055,EU 3285965056,3285965567,DE -3285965568,3285975039,EU +3285965568,3285968895,EU +3285968896,3285970943,GB +3285970944,3285975039,EU 3285975040,3286013695,FR 3286013696,3286013951,RE 3286013952,3286106111,FR @@ -83721,7 +85252,6 @@ 3286423808,3286424063,CZ 3286424064,3286424319,LV 3286424320,3286424575,FR -3286424576,3286424831,UA 3286424832,3286425087,TR 3286425088,3286425343,RU 3286425344,3286425599,IT @@ -83988,7 +85518,6 @@ 3287444480,3287444991,PL 3287445504,3287446527,UA 3287446528,3287447039,PL -3287447040,3287447551,IL 3287447552,3287448063,DK 3287448064,3287448575,GB 3287448576,3287449087,PL @@ -84536,6 +86065,8 @@ 3289212928,3289213183,ZM 3289213184,3289213439,TZ 3289213440,3289213951,ZA +3289213952,3289214207,MA +3289214208,3289214463,AO 3289214976,3289215231,NG 3289215232,3289217279,ZA 3289217280,3289217535,KE @@ -84558,6 +86089,7 @@ 3289233920,3289234175,TZ 3289234176,3289235199,ZA 3289235200,3289235455,KE +3289235456,3289237503,GH 3289237504,3289237759,ZA 3289238528,3289238783,AO 3289238784,3289239039,ZA @@ -84573,8 +86105,10 @@ 3289248768,3289249023,EG 3289249024,3289249279,NG 3289249280,3289250815,ZA +3289250816,3289251071,GH 3289251072,3289251327,EG 3289251328,3289251583,ZA +3289251584,3289251839,KE 3289251840,3289319423,ZA 3289319424,3289319679,A2 3289319680,3289319935,ZA @@ -84652,6 +86186,7 @@ 3290423296,3290427391,NA 3290427392,3290431487,ZA 3290431488,3290433535,JM +3290435584,3290439679,DZ 3290439680,3290447871,TT 3290447872,3290456063,AR 3290456064,3290460159,MZ @@ -84849,6 +86384,7 @@ 3300925440,3300929535,MG 3300933632,3300950015,MU 3300953088,3300954111,MU +3300954112,3300958207,NG 3300966400,3301113855,ZA 3301113856,3301138431,NG 3301138432,3301140479,ZA @@ -84904,6 +86440,7 @@ 3301474304,3301490687,MA 3301490688,3301494783,ZA 3301494784,3301498879,ZM +3301502976,3301507071,MA 3301507328,3301507583,MU 3301507584,3301507839,GH 3301507840,3301508095,EG @@ -84993,6 +86530,7 @@ 3302545408,3302545919,CD 3302545920,3302546431,TZ 3302546432,3302546943,SL +3302546944,3302547455,KE 3302548480,3302548991,GH 3302548992,3302549503,ZA 3302549504,3302550015,KE @@ -85614,6 +87152,7 @@ 3325131776,3325132031,AU 3325132032,3325132799,US 3325132800,3325133823,CO +3325133824,3325134335,BR 3325134336,3325136127,US 3325136128,3325136383,CA 3325136384,3325142015,US @@ -85986,8 +87525,7 @@ 3330640896,3330641151,CH 3330641152,3330646527,US 3330646528,3330647295,CA -3330647296,3330647807,US -3330648064,3330649599,US +3330647296,3330649599,US 3330649600,3330649855,CA 3330649856,3330662911,US 3330662912,3330663167,GB @@ -86119,6 +87657,7 @@ 3332492032,3332500735,CA 3332500736,3332500991,US 3332500992,3332501247,CA +3332501248,3332501503,US 3332501504,3332503039,CA 3332503040,3332503551,US 3332503552,3332505343,CA @@ -86175,8 +87714,8 @@ 3332876288,3332882431,US 3332882432,3332890623,KN 3332890624,3332897279,US -3332897280,3332898559,CA -3332898560,3332899071,US +3332897280,3332898815,CA +3332898816,3332899071,US 3332899072,3332906495,CA 3332906496,3332909567,US 3332909568,3332922879,CA @@ -86272,7 +87811,9 @@ 3334007552,3334007807,EU 3334007808,3334020095,US 3334020096,3334021119,CA -3334021120,3334138623,US +3334021120,3334068479,US +3334068480,3334068735,CA +3334068736,3334138623,US 3334138624,3334138879,BM 3334138880,3334187775,US 3334187776,3334188031,BM @@ -86527,7 +88068,11 @@ 3338935040,3338935295,GB 3338935296,3338964991,US 3338964992,3338965247,CA -3338965248,3339075583,US +3338965248,3338976767,US +3338976768,3338977023,CA +3338977024,3338993407,US +3338993408,3338993663,CA +3338993664,3339075583,US 3339075584,3339076863,GB 3339076864,3339077631,JP 3339077632,3339077887,SG @@ -86570,11 +88115,13 @@ 3339261952,3339263999,HK 3339264000,3339327999,US 3339328512,3339329535,CA -3339329536,3339337727,US -3339337984,3339338239,US +3339329536,3339338239,US 3339338240,3339338495,CA -3339338496,3339669503,US +3339338496,3339342847,US +3339342848,3339343103,CA +3339343104,3339669503,US 3339669504,3339671807,CA +3339671808,3339672063,US 3339672576,3339679487,US 3339679488,3339679743,CN 3339679744,3339707391,US @@ -86646,7 +88193,9 @@ 3340677120,3340679167,CA 3340679168,3340694783,US 3340694784,3340695039,CA -3340695040,3340852479,US +3340695040,3340851455,US +3340851456,3340851711,CA +3340851712,3340852479,US 3340852736,3340853247,CA 3340853248,3340857343,US 3340857344,3340858367,CA @@ -86698,9 +88247,10 @@ 3341518848,3341520895,CA 3341520896,3341521663,US 3341521664,3341531135,CA -3341531136,3341534207,US -3341534976,3341537279,CA -3341537280,3341546239,US +3341531136,3341533951,US +3341533952,3341534207,CA +3341534976,3341536767,CA +3341536768,3341546239,US 3341546240,3341547007,CA 3341547008,3341547519,CH 3341547520,3341549567,CA @@ -87184,7 +88734,9 @@ 3351043584,3351044095,CA 3351044096,3351047167,US 3351047168,3351047679,A1 -3351047680,3351071743,US +3351047680,3351058943,US +3351058944,3351059455,CA +3351059456,3351071743,US 3351071744,3351072767,CA 3351072768,3351074815,US 3351074816,3351076863,CA @@ -87321,6 +88873,7 @@ 3351441408,3351441919,US 3351441920,3351442175,CA 3351442176,3351474687,US +3351474688,3351475199,CA 3351475200,3351475711,US 3351475712,3351475967,IS 3351475968,3351483391,US @@ -87395,7 +88948,9 @@ 3352563200,3352563455,US 3352563456,3352573951,CA 3352573952,3352574463,US -3352574464,3352583935,CA +3352574464,3352581631,CA +3352581632,3352582143,US +3352582144,3352583935,CA 3352583936,3352584191,US 3352584192,3352591359,CA 3352591360,3352591615,US @@ -87487,12 +89042,11 @@ 3354955776,3354956031,AR 3354956032,3354972159,US 3354972160,3354972415,CA -3354972416,3355013119,US -3355013120,3355017215,CA +3354972416,3355012607,US +3355012608,3355017215,CA 3355017216,3355052287,US 3355052288,3355053311,CA -3355053312,3355053567,US -3355054080,3355249151,US +3355053312,3355249151,US 3355249152,3355249663,CA 3355249664,3355260927,US 3355260928,3355262719,CA @@ -87724,7 +89278,9 @@ 3355918336,3355923455,EC 3355923456,3355924479,UY 3355924480,3355926527,TT -3355926528,3355930623,PA +3355926528,3355927039,NL +3355927040,3355928063,US +3355928064,3355930623,PA 3355930624,3355934719,BR 3355934720,3355939839,AR 3355939840,3355940863,SR @@ -87749,30 +89305,31 @@ 3356052480,3356053247,BR 3356053248,3356054015,CL 3356054016,3356054527,US -3356054528,3356057599,BR +3356054528,3356056575,BR +3356056832,3356057087,BR +3356057088,3356057343,CO +3356057344,3356057599,BR 3356057600,3356057855,EC 3356057856,3356059135,CL 3356059136,3356060671,BR 3356060672,3356061695,CL 3356061696,3356062463,BR 3356062464,3356062719,JM -3356062720,3356062975,BR -3356062976,3356063231,CR -3356063232,3356063743,BR +3356062720,3356063743,CR 3356064000,3356064255,BR 3356064256,3356064511,CL -3356064768,3356065791,BR +3356064512,3356065791,BR 3356065792,3356066047,CL 3356066048,3356069119,BR 3356069120,3356069631,CL -3356069888,3356070143,BR +3356069632,3356070143,BR 3356070144,3356070655,CL 3356070656,3356070911,AR 3356070912,3356071423,BR 3356071424,3356072447,CL 3356073216,3356073471,AR -3356073472,3356075007,BR -3356075008,3356076287,BO +3356073472,3356075263,BR +3356075264,3356076287,BO 3356076288,3356078079,BR 3356078080,3356078335,EC 3356078336,3356079359,CL @@ -88034,6 +89591,7 @@ 3357007872,3357011967,BR 3357011968,3357016063,MX 3357016064,3357018623,CO +3357018624,3357019135,BR 3357019136,3357020159,CL 3357020160,3357032447,CO 3357032448,3357040639,BR @@ -88987,11 +90545,13 @@ 3367840768,3367841791,HN 3367841792,3368052991,BR 3368052992,3368053247,PE -3368053760,3368086015,BR +3368053760,3368086527,BR 3368086528,3368087551,CR 3368087552,3368157183,BR 3368157184,3368173567,MX -3368173568,3370188799,BR +3368173568,3368601799,BR +3368601800,3368601800,A1 +3368601801,3370188799,BR 3370188800,3370196991,MX 3370196992,3370214399,BR 3370214400,3370215423,AR @@ -89063,7 +90623,9 @@ 3380833792,3380834303,SV 3380834304,3380834815,MX 3380834816,3380835071,CO +3380835072,3380835327,NI 3380835328,3380835839,MX +3380835840,3380836351,AR 3380836352,3380836607,MX 3380836608,3380836863,PE 3380836864,3380837375,SV @@ -89837,7 +91399,9 @@ 3391094784,3391192063,JP 3391192064,3391192319,AP 3391192320,3391356927,JP -3391356928,3391444479,NZ +3391356928,3391441407,NZ +3391441408,3391441663,PH +3391441664,3391444479,NZ 3391444480,3391444991,VN 3391444992,3391453183,NZ 3391453184,3391453439,ID @@ -91215,7 +92779,6 @@ 3398684672,3398688767,JP 3398688768,3398705151,ID 3398705152,3398709247,CN -3398709248,3398711295,AU 3398713344,3398729727,CN 3398729728,3398737919,AU 3398737920,3398742015,SG @@ -91420,7 +92983,9 @@ 3399999488,3400000475,SG 3400000476,3400000479,US 3400000480,3400000487,AU -3400000488,3400006143,SG +3400000488,3400002303,SG +3400002304,3400002367,HK +3400002368,3400006143,SG 3400006144,3400006399,AP 3400006400,3400007679,SG 3400007680,3400024063,AU @@ -91552,7 +93117,9 @@ 3400648816,3400648831,HK 3400648832,3400649943,SG 3400649944,3400649951,HK -3400649952,3400650409,SG +3400649952,3400650143,SG +3400650144,3400650159,HK +3400650160,3400650409,SG 3400650410,3400650410,AU 3400650411,3400650751,SG 3400650752,3400654847,AU @@ -92072,7 +93639,8 @@ 3406737408,3406737663,ID 3406737664,3406739199,AU 3406739200,3406739455,ID -3406739456,3406741503,HK +3406739456,3406740991,HK +3406740992,3406741503,SG 3406741504,3406741759,CN 3406741760,3406742015,AU 3406742016,3406742527,CN @@ -93119,8 +94687,8 @@ 3409455104,3409455359,CN 3409455360,3409456639,AU 3409456640,3409456895,CN -3409456896,3409457151,AU -3409457152,3409459199,HK +3409456896,3409457152,AU +3409457153,3409459199,HK 3409459200,3409462271,AU 3409462272,3409462783,CN 3409462784,3409465855,AU @@ -93288,7 +94856,6 @@ 3410903040,3410911231,HK 3410911232,3410915327,TH 3410915328,3410919423,ID -3410919424,3410923519,IN 3410927616,3410931711,NP 3410931712,3410935807,TW 3410935808,3410939903,MY @@ -93322,7 +94889,8 @@ 3411051008,3411051263,PK 3411051264,3411051519,SG 3411051520,3411052543,CN -3411052544,3411054591,HK +3411052544,3411052544,JP +3411052545,3411054591,HK 3411054592,3411058687,CN 3411058688,3411062783,AU 3411062784,3411064831,HK @@ -93470,7 +95038,9 @@ 3411857408,3411859249,JP 3411859250,3411859251,AU 3411859252,3411859711,JP -3411859712,3411860223,AP +3411859712,3411859815,AP +3411859816,3411859816,CN +3411859817,3411860223,AP 3411860224,3411861503,JP 3411861504,3411869695,AU 3411869696,3411943423,CN @@ -94171,7 +95741,6 @@ 3418273792,3418275839,ID 3418275840,3418279935,AU 3418279936,3418281983,NZ -3418281984,3418282239,IN 3418282240,3418282495,AU 3418282496,3418283519,PH 3418283520,3418284031,AU @@ -94393,7 +95962,7 @@ 3420032256,3420032511,AU 3420032512,3420033023,NZ 3420033024,3420034047,IN -3420034048,3420036095,AU +3420034048,3420035071,AU 3420036096,3420037119,JP 3420037120,3420037631,AU 3420039168,3420040191,KH @@ -94416,7 +95985,9 @@ 3420366960,3420366975,KR 3420366976,3420367359,AU 3420367360,3420367615,AP -3420367616,3420370559,AU +3420367616,3420369007,AU +3420369008,3420369023,HK +3420369024,3420370559,AU 3420370560,3420370575,JP 3420370576,3420372991,AU 3420372992,3420374527,HK @@ -95310,7 +96881,11 @@ 3448987648,3448989695,IN 3448989696,3448990719,HK 3448990720,3448991743,IN -3448991744,3449159679,US +3448991744,3449098751,US +3449098752,3449099263,DE +3449099264,3449100799,US +3449100800,3449101311,AU +3449101312,3449159679,US 3449159680,3449160703,CA 3449160704,3449161471,US 3449161472,3449163519,CA @@ -95838,8 +97413,8 @@ 3454664448,3454672895,US 3454672896,3454681087,CA 3454681088,3454727935,US -3454727936,3454727951,JP -3454727952,3454730239,US +3454727936,3454728191,JP +3454728192,3454730239,US 3454730240,3454732287,EC 3454732288,3454796031,US 3454796032,3454808831,CA @@ -96180,8 +97755,10 @@ 3459620864,3459622911,US 3459624960,3459629055,BM 3459629056,3459686399,US -3459686400,3459688447,NL -3459688448,3459731455,US +3459686400,3459688479,NL +3459688480,3459689215,US +3459689216,3459689471,NL +3459689472,3459731455,US 3459731456,3459735551,CA 3459735552,3459745535,US 3459745536,3459745791,IT @@ -96477,7 +98054,7 @@ 3464171776,3464172031,US 3464172032,3464173567,CA 3464173568,3464173823,US -3464173824,3464174591,CA +3464173824,3464175103,CA 3464175104,3464175359,US 3464175360,3464180735,CA 3464180736,3464200703,US @@ -96633,7 +98210,9 @@ 3466938812,3466958079,US 3466958080,3466958335,CA 3466958336,3467051007,US -3467051008,3467116543,CA +3467051008,3467068927,CA +3467068928,3467069439,US +3467069440,3467116543,CA 3467116544,3467378687,US 3467378688,3467444223,CA 3467444224,3467554815,US @@ -96767,7 +98346,9 @@ 3469186304,3469186559,MX 3469186560,3469893631,US 3469893632,3469901823,CA -3469901824,3470131199,US +3469901824,3469989887,US +3469989888,3469990399,CA +3469990400,3470131199,US 3470131200,3470135295,AG 3470135296,3470137343,LC 3470137344,3470139391,VG @@ -96931,9 +98512,7 @@ 3476545536,3476547583,A2 3476547584,3476881407,US 3476881408,3476946943,CA -3476946944,3477312511,US -3477312512,3477312767,A1 -3477312768,3478114303,US +3476946944,3478114303,US 3478114304,3478118399,PE 3478118400,3478192127,US 3478192128,3478257663,CA @@ -97091,7 +98670,9 @@ 3481843456,3481843711,GB 3481843712,3481958271,US 3481958272,3481958399,NL -3481958400,3481964575,US +3481958400,3481959020,US +3481959021,3481959021,GB +3481959022,3481964575,US 3481964576,3481964579,IE 3481964580,3481993791,US 3481993792,3481993799,CA @@ -97971,7 +99552,9 @@ 3495375872,3495376895,CA 3495376896,3495399423,US 3495399424,3495400447,KN -3495400448,3495412735,US +3495400448,3495406335,US +3495406336,3495406591,LB +3495406592,3495412735,US 3495412736,3495413759,CA 3495413760,3495429119,US 3495429120,3495430143,CA @@ -98626,7 +100209,9 @@ 3510268928,3510269951,US 3510269952,3510270719,LY 3510270720,3510270975,SY -3510270976,3510321151,US +3510270976,3510284298,US +3510284299,3510284299,SG +3510284300,3510321151,US 3510321152,3510321663,VG 3510321664,3510321919,AG 3510321920,3510322175,KN @@ -98891,10 +100476,7 @@ 3515222272,3515224831,TR 3515224832,3515301887,US 3515301888,3515318271,CA -3515318272,3515326463,US -3515334656,3515339519,US -3515339520,3515339775,A1 -3515339776,3515358975,US +3515318272,3515358975,US 3515358976,3515359231,MX 3515359232,3515596799,US 3515596800,3515613183,CA @@ -99479,9 +101061,9 @@ 3534758976,3534759039,PH 3534759040,3534759167,AU 3534759168,3534759183,JP -3534759184,3534760703,AU -3534760704,3534760711,NZ -3534760712,3534761983,AU +3534759184,3534760447,AU +3534760448,3534760959,NZ +3534760960,3534761983,AU 3534761984,3534763775,HK 3534763776,3534764031,AP 3534764032,3534863443,HK @@ -99931,7 +101513,9 @@ 3559153664,3559178239,GB 3559178240,3559186431,LB 3559186432,3559194623,RU -3559194624,3559202815,SE +3559194624,3559200255,SE +3559200256,3559200511,FI +3559200512,3559202815,SE 3559202816,3559211007,DE 3559211008,3559219199,SK 3559219200,3559227391,SE @@ -100035,7 +101619,8 @@ 3559940096,3559948287,DE 3559948288,3559956479,RU 3559956480,3559964671,IT -3559964672,3559981055,RU +3559964672,3559976959,RU +3559976960,3559981055,HU 3559981056,3559989247,EE 3559989248,3559997439,PL 3559997440,3560005631,KE @@ -102288,7 +103873,9 @@ 3583410176,3583418367,SE 3583418368,3583426559,TN 3583426560,3583428607,CV -3583428608,3583434751,CI +3583428608,3583430655,CI +3583430656,3583432703,ZA +3583432704,3583434751,CI 3583434752,3583442943,AT 3583442944,3583451135,RU 3583451136,3583459327,IL @@ -102588,12 +104175,32 @@ 3585597440,3585605631,RU 3585605632,3585613823,PL 3585613824,3585622015,EE -3585630208,3585638399,IL +3585630208,3585632255,IL +3585632256,3585632511,GB +3585632512,3585632639,NL +3585632640,3585632767,IL +3585632768,3585633535,GB +3585633536,3585634047,IT +3585634048,3585634303,IL +3585634304,3585634559,IT +3585634560,3585634687,IL +3585634688,3585634815,NL +3585634816,3585635071,IT +3585635072,3585635199,NL +3585635200,3585635455,IL +3585635456,3585635711,NL +3585635712,3585635967,IL +3585635968,3585636095,NL +3585636096,3585637375,IL +3585637376,3585637503,NL +3585637504,3585638399,IL 3585638400,3585646591,RU 3585646592,3585654783,SA 3585654784,3585662975,NO 3585662976,3585671167,BY -3585671168,3585679359,SE +3585671168,3585675306,SE +3585675307,3585675307,DK +3585675308,3585679359,SE 3585679360,3585687551,FI 3585687552,3585695743,DE 3585695744,3585703935,A2 @@ -102726,11 +104333,15 @@ 3586680512,3586680519,GB 3586680520,3586681471,FR 3586681472,3586681487,GB -3586681488,3586681615,FR +3586681488,3586681527,FR +3586681528,3586681535,GB +3586681536,3586681615,FR 3586681616,3586681631,CZ 3586681632,3586682239,FR 3586682240,3586682367,US -3586682368,3586682879,FR +3586682368,3586682415,FR +3586682416,3586682423,DE +3586682424,3586682879,FR 3586682880,3586686975,US 3586686976,3586703359,SE 3586703360,3586719743,CH @@ -103068,7 +104679,9 @@ 3590234112,3590242303,GB 3590242304,3590244351,US 3590244352,3590244607,DE -3590244608,3590245311,FR +3590244608,3590245263,FR +3590245264,3590245271,GB +3590245272,3590245311,FR 3590245312,3590245439,US 3590245440,3590247048,FR 3590247049,3590247049,IT @@ -103290,7 +104903,9 @@ 3628161024,3628161279,CA 3628161280,3628179455,US 3628179456,3628187647,CA -3628187648,3628225387,US +3628187648,3628225097,US +3628225098,3628225098,AT +3628225099,3628225387,US 3628225388,3628225395,GB 3628225396,3628225779,US 3628225780,3628225783,GB @@ -104311,7 +105926,11 @@ 3641941760,3641942015,EU 3641942016,3641950207,DE 3641950208,3641954303,FR -3641954304,3641958399,MD +3641954304,3641957119,MD +3641957120,3641957631,GB +3641957632,3641957887,MD +3641957888,3641958143,GB +3641958144,3641958399,MD 3641958400,3641960447,BE 3641960448,3641960703,NL 3641960704,3641961727,BE @@ -104539,7 +106158,9 @@ 3644919808,3644923903,DE 3644923904,3644924927,IL 3644924928,3644925183,US -3644925184,3644926463,IL +3644925184,3644925439,IL +3644925440,3644925695,US +3644925696,3644926463,IL 3644926464,3644926719,US 3644926720,3644927999,IL 3644928000,3644932095,GI @@ -104603,7 +106224,7 @@ 3645202432,3645206527,CZ 3645206528,3645210623,LV 3645210624,3645214719,RU -3645214720,3645218815,NL +3645214720,3645218815,SE 3645218816,3645222911,DE 3645222912,3645227007,KW 3645227008,3645235199,RU @@ -105224,9 +106845,7 @@ 3650920458,3650920458,GB 3650920459,3650920703,FR 3650920704,3650920895,GB -3650920896,3650920897,GR -3650920898,3650920898,GB -3650920899,3650920927,GR +3650920896,3650920927,GR 3650920928,3650922799,GB 3650922800,3650922815,FR 3650922816,3650926335,GB @@ -105736,7 +107355,7 @@ 3707109376,3707174911,HK 3707174912,3707207679,JP 3707209728,3707211775,CN -3707211776,3707215871,NZ +3707211776,3707215871,ID 3707215872,3707217919,BD 3707217920,3707219967,ID 3707219968,3707222015,AU diff --git a/installer/resources/geoipv6.dat.gz b/installer/resources/geoipv6.dat.gz index 5c00c5c68a551c2e97ab65987093af1845c8a89f..c19c99b8884678b96787e47e694a06b42acd6a96 100644 GIT binary patch literal 143965 zcmYIQ1z3}9+qOU{Q9?u{B?gFegLKyh45UG&OG-LKx`lz#F*+qA2dIQHQb`ep0;48O zTBQDa@B4k1=d#MljU{Iv`J{+sAber@h(vAO{F!Kt0sF8EaO_DtX_ zYngSzF38>~BxW18MqImjS#>jWU}#T(zBH3WiBjaNBBH>ABsE=i>8rZY?EG5P{I<&k zL;*=HqB)b>*qrlgI>y75UEUYIPbnz1(B5J>dYp4g{d^>I+y}GTHrjdUkIA3j_0Kz= z%NFn68M~Y;v%jJ=+GY1%_{Z6*KMr5hd2fHkmPi|*OIQj12!-LNT$)j?| zS-+6U%%M+tjt|tB20SMwI+%kFKKw%J$!?yUFTdm}B|cmD%a7aMz-x7$V`LYOX%$H% z(Zb35A>Sa)=%=uTq@CXJPOCuJfo7&^=5qu!9)Ido*km}$ifEBU_u$u0r4l?Jp{1c1 zR_rzO%}L>SAzs_-wz_B;G^+O5MOy{i3}}Yo3JscjzK%C5RYvX(!~x0v0whqXTNbrD&xx^44Skh^W?>JR_F<wEHjh2KdKeS9BSj~FmDz0 ze@9^hmVRCh?EW2PTSbm}+W;7NdboIXCkRCOh}<9Xar^anc5W{#5(=(Y08Ntm2ZpI? z8kEhj1_)3f*zf%E1Q97-&5{0rWQv}9uj3tCq-FC1&BE6;TKa3YxH!{v%jQ}Q&}5K` zd-%>xqfoELhmnZ7nj-xL$y6=u1<@s`IvFgxizAbe?Ps`X>~fNxDK^)PgU}FT$iW(=I-2+U~Jo`gdH#Z zI%-rc z$eaiJ>Ej&8lLKq3qfG_m$rn$nBcv_zq;Iophpr`YXL4ba*Xq;)c``b>mwtXkkM#a~ zI(Zzw$WYO$iLZmH9*1n5ifaDM>(X!i1gTptH{K{e?wT{+I&Og3oH)Twb$L% zWx!f2tnuRiM!{D83eJFOP@XAR9sOWdKcYgvPG~UPG*>qm-H`<{ zsCLHqp|J>h1NRsFPuMwzbn|1i=#J5^AKbx4uKq=njnZQSkagznx3SLM1}wwje!BadJ;JBf-(vbCcl0nFAB2HqGvj%)qZqmlUIv$(7Qm!}4-d}nU^zzi zQzc(d+S}pXwKXqsT%^9gW=~NJx4UGkXe$H>G+bdq1pcTLO;O=qD`(S$sii~FJO&Dx zhMB~g2DYWpQo|K2gx@%`6LM_0G6|^*SugpN)YfhJa_3IEKOfo|J}QE4LeE8e=A(m{ z(Uj#wIA}mpz+u`}-86EpPRL!}|K*1NJv3$IP&O1(EJRr#BcFL8_|EO$>Li5`#o*jB zL4CWt=#2xZfYjdE9gc(@Po-3OGHj13YvWEw=A_a{ZmP*qy2;T%^$EKA& zZ?_PyTxPmeW_tb*x^4)qXNNVm!*Vt5jH-h&-o~9YP@{Go-D)8C^cD= zcX*R`($xM*mY)t*X8v2Qx@ncJSc^5T#d1yW@J{bo75e6MzjPZOsbk&s{YiUrM=X@i z@+g#hC7@Qhoa?K>Elcc4T+y5}I;HQZZvEF&j}Tjr5Ko`;ESepu?j0#P|J+auQvX~l z|J;1kNF8cK^iSCCG>mC|*!)uKgCFf%Gxs{J{t0A11$IBPc<(dc(|M$FVVa0X|5>i{ z@7GK+UydVjmuhiLf#ru}(?q2{56tPFSsXTb$+kZDZFE@9bP9}qk4rh-!V0SSPjJ7) zUDB%{uO*XN%J4@WI@`P-cFgVWbUq6^9*keamPcM>j!Ql^z5Nz?GS{alNB#V)Ywzne z^;R8=W{R`rnpe+}7Q+K_@*?v6qK?p78^ljb+0piHRj6ufUE~WG0%q!CV@+hJoaR(?w01LL9)!!nN*mkJenMxfOrYH zI=K@Ky?&FM>~b{hx|U?Pr!pFbK?Wf=L6ZhZydYlsNyxjeg_6H6tqGrEBwu(c zp1uofV6nYv3u7`;R!QXLT!1#r!_i%XnS#_Ii|h5TDexXz1K2 zt?K%ht@W}wD-T5LMm@~MyhWYnz7*`YcDME|jw&2?5e;0Awr_x%>7Q9w`tzeLEk++A zf_a1!h4^gc&>(aFHb^qh^zU?~lZieTT5;~$$ znXNOaI8Q_Se3i^e7?`?7rc&nk{#~_ol@Cj!t=%iImDq8WyIpG%InI`fCgC&j5gELwc7a|mfEVP!o>1; zd4P#=i9Exo=p?zT%rw^DVd8Kf||7geI-AW9jwY67g{kF0&+lmaU-(2#aSUN1dOAziH>-RVPUiXR26?Jdr z7vLze4}ikmTvUl+l^(wxLhrETvvb5XZv})KgJ7U74vT|YoJ%!XQ@=klyZ1CT(w#|+ z#&KT`MIC!v{r==1Fy}7F&%PbUZmGT~>wx+h$&OKKS5#k=(NlfFJ~F=aaJ4g~mp9dq zHP)DYTagMcNLWx6Dp0~Ce(x1ss>Eo{IvFUnxr>ctA2D!93TL-`)k~(4v-%bBg546! z2Yh8JO7&P{51U4=YvkBZ&q=dy=fUaK7il$6DZPP7l1oJdn-=cN8mQIDk(6HlMIC-6 zsyg*WU?}{|lquCOUwm&@k!rONT8_-6Jo}fH>8!j__*lF6T%`{?k+IPg-%* zvmXC;-Qj0Ffd+>};yJ6Ee{Q(>xmPj$Cl{zjI`=GZzzhGZ=euoG>slnkh(W*>nVVmF z$)6ulyK`N7RLpa~O`)k&PL=WF?zrpGIB~J9^^53Sv;rg^i*R11H}Rp zp|N@%Jbm;ds?K3{?5cPU zL*Vf1o;<7jHse^Z0)xH1LcZxkhb8Iq<8ZMN%a>i^L1X>CGra|rvl1PY5_C=5jFT4f z4EA!0-3!4Wqpb#NqQj-Bt@acc7Ch2lh&{ye5$X$_qr^rY5RY7U4T_f{os~Gg)5-+s zihzQ|#_@|pvww7}`apR20`o$wt5Hh2$>X`wk1Ie?mQ|S8C>IWNdj9d0vwuXib`%(_ zlEw5ogq4|_JPx2^(qsLHsKRo>hciBqw>~Ev5^t7IWpIvX&?MD z--spo)}^yQmJ|E$neBavYe++b&}KouKYgovaVa#YrQ|*Hg1F8I{-szKxTO{AVsc&i zyLs6)sDq89X?tEYuLX>dx;PYntEv7z$d6!BLI%yo`tJzV*nnxbTqA9&UtIYGvM#w~ zvyV*O>wz9wjJN+^<5L8fN6Gy@u$HydXn6*$Ms_l=7SO*>8v(z63pAt+AeUXMFSjc? zEd7H2gg8856lp6ba?P3Ny-Va;-P6x^3rxE4S>#y1l#`5|0)rL~F!cdVl3(zQpu~SY z*#Web8Gu!Xb*tjc;;-;RyP3zae79UY4*K?%=EM1>G~UU$)azD=TF3jC>W1-+xZN4K zZdTp6bK9jJG4SYZ-`AYa;d~=ZcTLHgAFaZPn;%t4NxRfPC=a%dZ}hs_^8S`qW&)8} zPNz&0F`#kgZ~MN@_gK8Yg{wrrzh&P|IZbX>&1A-ex1x0Mczyu}4EQ&)Y~o93Z<94Y zdK?c*gO$vMUFt=+8m!|>=K9%M>bKT@jrD&sQ~&#-Wk3c)~kIa+L_@mmPx-@?SuZq{bzSqVL7N$I9-W`UD!P<`aOFdE{pBt9x} z>lAcSq~-kn*7;5Dw|$|8q%IzLe?6biEXvvSYs$H7kFH~E;;ncELS`0a=vT4^o}QS# z02bXs^q`|dhuxIyI?#y~t`i94zy&Cp?`*vCYO{pin>PNL#p!@}=4Nn?s<_(xC(tDm zw?O2w9jZG`u5n^&v8_aPPGlhrP9|E1!m@Jg+j4ch5$q#rPBiL^(>b3hHBOAZBU5_o z?)QQ4A9?qRatJt`MXm&}#Gb39gA=5eBZ^exM7%_vYE{EW4s)8)8)^nFMyuaMPp@m7 zu*EW`O6WCu@X!5@X9#KiX`De7#xSzGd6rB3L-oCo>+LXxi#2l~w(f0ubOD@a-XDit zmnT`Jmk?Eo4YQNK2)Q|i*0`W~C9c%>5|j;^eu?7}MJ}V}l_pQBFsh5gVV9sE{WCD` zM;8#+9I#>+IC9ExIb@nwu9u4zC|j!%OgvLT?yeBMdRPwovq$^y6W`xVf5Gqq>7>+p z^UWmf$He!7^U`zI_FA`>1rO=wu0gm+fCjbk0*tKX$`4ifxoeH!@UmN>3S)mko6f35k|W-G{e8y!N>keA zD~OUS)>`tTv6tR*{6=k&HD7s9LGD6go^i?SlCgK$TaIV&{r4GRGgM)GFL3Q-GgPgG zU159|>p3o%T{3N>04_R{m(4D<6#rM`lM6hWE>Q!~Fv0X~RR;*cpl!6EE+ii_3hd++ zW~j(BA=g0cnabiq5(TG})PPEA+?c(hlFiaYvL(nwrkHI#)ualT^t3C5I&XQ1X0M1| zCRNP-VF|9_;ourM##v4e1^Gi9Dadnx{C=j4DX3FTm}=fgy`rc2f?eSi`!$Vlv_^Oe zyI+6x2VzzYC~pf;m`~9vrv8x3B}=`clFGtP;)E3gIyMbZ#=izpr$RyGlu`>;q=D2h zgDQeuVb~W~{Na)!<-C&ae#J%+D*T#7`&#XQoB(Ti(7kKa;Vs@)0;~{Dka}jZO++0Y zkVPFq@_~YT$UM9=bC4SE8>$dnAe6#_xP}qcysa4_yMpNvV3l#$k|n?R@n$+JrpM81 z*rrH2M_BMSXGTvNNGrSf)zLG41c!XbdVyCAc^Qh!QHR+NDX7bAY78S{$KOt=^z=IZ zDcC}klk@WQDBJ#tLElLKiL8t+C(oXT#@iGLRR^;Gl(EmD=j7@61YRcjKb@uBAA21i zjXHr^KiH;rPSk7f2a6&>`nECSzd!jr07cuf+J;f0UD2`V-wiZHLP5HuF#4&7DFQJ1 zhwga^5rB5DfX9A#J9YPCul1u*n;w9AdjE_6#BCwI$W*VswNc&uEt+m4Lg_3kti2p1 zniU;8_x5>k1i&d_Fuz9~55e^QWYng7rf?o+1(J8TdjRp}{4sOCql&^lQ~1J#Uol|d z^laim(>c6~%c@Nu>1~3N9ky<;X54#Ons=@KZtNQ`l^ASH4f1x!y*nNElzrKq0|Y+K zFn&o&y0*tAdQdbgH3X920S7wn{7LL4jB}O}2EI~f(bBJ)38mO9Gy7_|S)nzA& zH#YgGX~oy?_nq#P!ht) zJ5V+u_n_N0r8mB4vtANsyR&fb*}aBxuMdfzQ^A}3Rhpd+C!otF?j+z}jeC-@$L4%# zW6@ZyrctLlN-*h3exLX`uJ)>%@<>(i57npe&LIb;wgTrU_M5WwvGS>(cQ*{wsoILq z!r5O9Iw`4BeMx(DjXluxYTj3~vR#zbG*mTP;f5p16P(VNICzl4r4&eI+r0wtBL|Z;h@k@bA%QCW%e{8R zBB6kZJr$rF*~p4Tm#^SqMM6?#jnwI|;RR4*2%`t}0pSEBBdFUQ%;`Wp>rV@itK>%d z7lWv1P*YhB3}Gs^z-fcT4&Z|-@}V2dJuZPV_l#G=CDe+Yrm zTa3fN&_-#Bdad`Ge?CIoP6#oW*6vjiFTUaNrB+6@SH*V{uWY_oyB>f0Cf)dM`0XdY zLqa17g3muG+SzjV&&iaQr3o&I+!FJ>`NWMWJ{uP+*!9VUI{_~!%O7)dUa;m$|Luh* zD%3iH{fCbxo4gXXWlOhZiK!n4`jinwxd}kOhhpjf!}Q%fhyEpdeFlBa;}mv+NaL|^ zzmK3gm2^3{64Wc%)v1%G_Fk{*W6{uNk5x#0bD-GEqTyns2EvsUpc@~ly3HON%T5TX zBS4rt_Kj7;MZp%Rz9a+y+DxB85r~NhiW5QyWj-|Qv5u7Xz<6Zi7wC319ptDr2qU;D zM=bsr+(^yESO~Dken^~AdB-{zBkR5>0{GX4!gDc>%}g&D1UD&@!5nJQBq{8isbECE z+G}s5_PUkxgK^?Q2wnYQddV(WbKD130=(QW`Rc#(TsC`*b5a6p;vSTb=N;oL%{3Nu zpvG!Kes;_5-0b)>)=oNv}k%SZmGUCFZR>+ zBXehE51Cu9KP~#*4>8*RQQtZhLkLI4IDwA0ok_LokAIq4-}a-Ea2v(Dz@Yi=rzajY z*8pSw!~hVY42etie`uF55=`;Vu9Be2N-!yIsr(Oxa8aL!;fcy*0&>yQ@UB{)=wSk& z<+8ju*2a6oxYMk!XgD0a1{g8aMwP%4dy|@*L^UNsHRZ}Zbv8GlCUE#DCin&je!+%8 zzIww3R9w*z2xs4W2n)Z-UN|`qG>_|OR8x8%&eMU=)b_Rl)$Bs5HA)?_t1V#3Zl`U< zew&{PEkm6^N3uDg11J$@LLy1s2Bm&ibUTkFi;5CQ${P9@)B51z5j9)rr5&!ORWSu} z&Ws7GUhBo;*_7MbIjM@|oVvINF&}!l;KDawKN9nJ#j;4X>P@F?zPKwD=b#D6qEa?c z)N}fO?A5)YLvmAEL4>0zpPhisX<;+5I8V;)^c(fmy~c|wj4DAKQxgw+jTNgJNEUeu zWe-SVa$9SVEYAr>H>5q(NPBf%)*vytYiN=i()Cr&Q8Oepo9wY$%dL)+?7g~Olda;h z;;FMLDZLB>X;GOPIVm!(iz2bqsrKZoX=4%<^ubi_?4rKvi;2b0AspMPo_$Z-G#qkd z_#^MKv{g3ttS%F!4X}F{?i4xo!!)oLH14LOo=W8R!Zaj#Vv(uF3C3v>JpS;S7s%9U zLt-_KI$RbIJ3GNo(k3cHsLt83`Rr~Q7_lQKsuuR?$*5Kif3^J|8O3(g8gr??HnKdl z^!5IxwsLT{6hG5)dOwl&_`dr3X&ucI1)irPd7zQ_W=dV~RHIK^;Qsm$wvTwpqxL?T;9T~8NlJ1l#pV2JqIl2mf_PAZ=18@M7XVcf`vtWIq zuo1S71=dcgYX7sGRm%mvIMOM^)w7hW25|R>Bl2)1pfB*m=@mU8xK9Ky$3`)(O=+Xm zG~p(@XkDXlc(F)$@ofctQwD88Uv<7LaR>cp_eumgh{W}?q>F#3ZZy^2a4Q~JGY70_ zG|ikk-yjUiW{XL;)K-X{@CUcV#YS*Sgt{Y#01*e66)(Wqd%59M6>e~xi2tf|vfaRu6_|1gahFbUrydHkj%1fs8{8=w5C(i7 zjACeRwE^rX4S{v#2Q1e_<+C2kG1`w5fiTkl^wxZ!{(ZTqdF7=Td;Pl=YcTj-1%}ia zwpcKO8p)ZbEX_hU7@B7S&Ob)+9r(WkPoKua4^;s(D{S3!%dF~#m`i=WvDN!qX2Qw@ z_L~D>r5Rjj9^<%QQkea!dn2j}{Lt2}>W`(}1NQ^3rp{!s&ZhKky;}BLc#_iFWh-Gdh9OB9!K+?C)^3pj1C6gK?3=>d=}}aUof@wI*1$^#9(?`l zsdC4yc%PGi?^+}&#J>ilu>pj0Kf71cIqcZ_DkMF&ROE_!i*|eotNh=vr0@%lH(4ky zehs+H3ouKilvUoeD#`I$%B_oEZ?FVUEcb(W%AgO_;3^*9xm5hlT~Y^CCOWQ7jbEp3 zH&~Rd@zVpLiZHr3_HZwi)hx?TFJHvp4;*m8RU+GYQ^!V*K;_H!wKvf8IAgpwFyNbv zfjafPW9MKdXZv`-Wi}n}GGn;#m)x#`1J?HO^WiZGot)CTwO_rCrd5%Siy}1^;f|hR zP0v}%V&|F;Xp3X#_TruV*~B~TiiC8QOVckG$Bys0&J%fLS&H+L6AC1BsLLE{C`x0; zo4OcZaq5oW*&gq8{98NF#ThdmJDnXfSn#x|jz#Hu%9qAia!Gm4rw75dZ*-ojl7AEG z4dkpw#vE$T%>_pJjjjz>kZm98vMMZ|aax^0pW0vX9vslJ=pg&-r4xNM4^KSsD<7O~_NR zyFDyCJO7%sU3ix>Ls;2YRr-pMvag*&je@uRt&$t_^qUuk2*@#VV?NUW+-FH6zsLZ? zz57A{M=C{Qwh~l#$&vmmIp%68dn0eF-aysuJi@rLg_KbC56W}tJA_AZzY-?sH>pSD z!-i<*rLTOBxj=s{rL9!x28-AHTaL>Yg~YW*z@1{hNw8-{-ir(Wk?Mf6n6GMM7`gW6 zIk8{E?<0oVe?B7Se7dzpYNPls@9p#aP0E+Ur$Pd(UenNE$}2Owsq|zG5EDUGGU|qm zSj2tp&l|320?I}LbmI58#rbq!%$9&51_X@E1iYP3qyQ@~=TjR+qrlk4|Af!$91{tZ zr=|D3qN@+?*%m4r9lvUTvV9-C%k*nndnHA-z?swQ^GLa!Q1mYa3t^W59{LqTozXbQMHw|p~+uoXenp_1h)G-?6Z5-pQGG`-mZJ7P^ zCQ{6#vn_>yR+#{0wLnd^XY74Yqjl2+^6E4P{XU`^V}bq{@r!7lPEy`TnyL}XR&`2Z zB6RW#KM)OKu7^O_S?Q$^Tiu08iKH^w)cdR$3&t8`3#MkG04D5?ej>nH75vfUP0D1P zHz3}rLBLx1PS62*J_^vAcg_e4Vdeh$V?=cx>k5m!+xxreFE2$z16o4*nMW^NNmCufof`>#^E z=8Uc5bM6<~REy;iP1cUjeA!&bk`3`W82-;666fLujJ=-HNp3zJQAo|nGg@ZR*b4u9 zDRsHYDCH%)q-@P+Ku?i+K4obe+)$WF9pA0H>oVZz?sdI+xpo~gliJ~C7b6LHsi#Tg z>}9J~k`8HRhxiiLD=dO({)Um`rAfR5$?ii=sW7GSTt~)lnBc@EV%c55Yl(JEI4$C%L zmJ3dwdooaYwyPliroz;`%)og#*pqQ$*+`rk&36=B`g->*N8KSC0lDt@&!kR&A19z& zxs1yIPTCN}a^<)ed`C*9-8*kNLTC1L^M0`rqz-8WQPaTahWQxh0&6%6fNoe&tO)&`?Pnp}mKLiP#wJU7VEtAX4o_@t9FbV}JA z#IKJO_a76uZ9Z%tsCIsk7A@xANtX#QxRVul(EXvp6BPRs_dqLP;}s!4i~v}py+T+Q zSulW5I3F=c&gKDnGZ_t5Wr~L|Q*BO4vmNnCFrm6{I$%-UtH@mj>Uc@5wJdp=z?2uD z_ra>!i4#Kj@%s$ajD8p&QE+tS1vAoFNrV5z=%=J_OA6dYX{@za-L|Sgw%J4Rg?4Gd z{?Mf+Zifd3VPZs`X0R}^$jXfue36~{)>;Zx^h7iIPz*4PJT1LS_O@i~t7uO~IH89~ zdf^W4_Zc4*mWD35a661Xzt~K(*VF`T)xZa6|4K|I$<0VjckcsP&g@l??}7uBh!>%b zgpm7ZOf1b{ND3~14A0BBWv%rS0e*`|wAldxD*AWAz?_y~JDUdP66qDi0ERTCJ4ons zK?T?u`ILcqaa9sV%1Mx{VwDJrJfJWa+lB*%x7`3R_bY(Q^n^4}2h;sy(sn6R`=`oo zO(j@>lf)4sGt!ochi^-seNSiu`A4q}NhlUuA&n&LkXcErz1P3skSn zzW!DHPeP`!X>`vsR;Ey-MrfIYV^~46H?YDMWy*%p3J@dUEFAtn{A;Qh>&MTH(drG< z@F#?h(XIr%t`8(}hg92^Uw07%j8g;ja5mRE$6}|qVy6=7^{oUXaQ?T7kNz+t=J2Zq zcW>Z2qBhfyKi8;=3jc548rzn@Yp`7r6pkctgZg6M7D9ic284RN10v=ywQKnQJM_)} zpReO8oG_YDJAf9GZ9ur#sf>C}gD1H7@!!OAY@&Do4r_vv^->u<)ayMlUm#x3)QVku z;QD4hileAw0xqlU>o`3$tEud(Vdc+5J&(P}{glXdaA=M&6o|^m@@GB zH`Z~U+l3qFS|T?5ommfNZ8KP*SGXqd2bE2Zv$>!}8sO@lra@lLLhTmv1@QU&mn zw)g9wswN$k=x0coy5n#L+Zqc5AQrrNdJ=bvX0N&--c?nSi=(-Gp0~oL(q0M8L2!K8 z0P_X?-RVKLt^;HT`+wSkbZsRet#u#759>0b8L;qNG9b}6jbgCf#69RqY{+W^?nkLK zt+1}@M$kikx!pDBR9C#v6$q}vnf?-D+PmyVLAB^8f#9nFxGJeXQQ1OZQwGyQ2*`qHLZy5xI&8p^7g|&lOh*fW-Q?hb774KtX&QdyYzHir zu`Ed0SA*1-c4a^}v@1ej+*#5!^0AteC(>$!MAsH6qWl*eC>!+lIhH^p%s@MkpD^~rFfeRS)lG5^p4mW?7gV&H zQ|14b#Gui%lRXZWZIvC?B6SWTbplz&P08(w_l@1wNMo^aU6qEc8NALr!u94~I=<6B zZYvV)C#^Sc<8!|;nC`>f>#1S|uLL25QW&7WNXbV&s{OTL-s_32ZHworH=jJ7hd*v} z%JhQAVk;lFY2G(hBY#)f>nZAz1Lg3nikstkWj6W85`j6l>urtqxld@^A~vvrLqA*APL~4IygLwiI%eh&AI(XVzWJ7~sc|Zub}W=W3t? z{pTf|sNA(T+K$*UZ-TxIO>u4aFK5wLfI~4#Fjkz?Jrm^y1Q;WFlwid?D$VbS{?Z80 z&I#}ifJQ@=(0`c;Ulk`mq?mP5rQp`Yo=a7Ks{vUB`I4?{uen#EM_H-8nW*RItf_qG z1Z7b(QDLgdy(GQFSLGR^CYs=2B(iD#guN23vpjV>)`?=gOjNaK)^c)4-Ee%o_Rc++ z>+GHxG)RTR>Q30qJ4|m412~k2iV6G_$#QX3#sgsI$IiEiUqgfs0KyUN~_q)tebkjUq z&ZqOqBY@jw*F!gEIY7AYNG%PN3;aZ96J}C$Cl$y)zF zcQ8^-75QKH<+J}fa*vhP+CTMiFqp1x1_E%Qb}%sJG>8`Su@xe)43Pwsz6P+Hg=lu- zot-7fb*4iB22YoRk|G^OK)aWLaJGd|*jZy9Ew+z~8U;0Ut{b2Oi|~I;q6ipgLXbZ; z0+R3g1vnx$JiC}j? zAqK+HUw|#Ne@@{rE@5rj1x$oXeg8*|nUR3Rm~aQ^(_z8-@~lXcRvXYXa^7>2&+Z3b z#hMk_d-w$KNmWchSZNBvz3YYq;Q@x_yW{;z(I0wBRZbLt#w99vBjgg3vxiW?AV2kz z_#LY;n6jIaUdJ7P{)#U@yP6wV-Dpe1wJWli%uQ?9TqwilcYm>B_o3t+Lf`2#ed%VIHeQEV+5%VPVvFF0R)H(VBr zohv=~AqsGXTZgTMUTk}k-80+6iw-m@+|$Kl$4k2&eP!3pRvCY&v)EK29+Tbc2;Mqb zy^daWG>c7bdZZq+6W^6Uu5Dq@F-^j?*;}^PaX0MfmN{sQys7Wd$PuG0Bh*T`QkCh{ zB#Xw5uiQ+N6afdA@D@1yr-x4oJ;2**M4}K>Bv)ZU9<}WSO!A=gz`cMMjKY-J`M(~e zT{2^U2~eG4*K^qT7LfMYb;C8B(_eA7Iu-#A27!)Q%Ot~I8;pyc74}bcb|OmiYQzVq zv(VIl*TIqiW<_P!NHMLtz<(fUw^74r4COMVoBg)Lzwg&0hmRR6aPY8|6~JFXVwN@S zGyJxsqPhTtU<@BKO7n`vZL|zb6sVg;_OUNGT^un+;Gw(p;7|ft|&;w82|jO_L8aE}37wnz(0#XurY$;gtfylCn*ZZAn35VFZ-UIqft7UInR2T09t0LBuC5V){4`T1ktlSXu;c<o&o-sZPlh5;~Q|0>$sfI=}#~KWeYDyx)+ytSPhbQ-49wdAE|+z zFi43#uQORDj_~P!oknS)Ug!ws*{X5B+&~WDQZ`*pm zskb^0**IcCb3$86&zGeDpFi35Tkl!lp305$E5<&1G>wYj) z)5%sCW#6KC$K{I%`TWsND+L5g?RUm&g%RGh3J8Ts;RvCL`392YP-gMANK2*n4oAt}w7iKY9G_s%^6A64-+8p`!JN z&Q!Mgn+8f16?!-b#k)t;B^riX*R>0^_jk)Nb+3^ql$_Sa>1=$1v92Exns)+Ur|e&{ zbqa^neWmTXgPr{S%=d>Vr0&Z;>XxnPCfLsqyfb=O7?kgH7J|UzS3^3jj$sElOy~vd zRqqKL)UvG0PZo`Xmqva~rQT9&vx5C5Mu?YpV`6qx=cg|sE>|91g@r(U|8gS4_jh|R zbyuNGP+4J!@G0#vrcNA*GV%R;3(->E9dZpD?Hzd)cKu_|{0nB)Bb&Y-$pt4dBWFg4 zmIKu6;VvseX(N|e<>*U@+xYRm7@}o=WYT@L1&Oja47rVcJF@=-B3BxKd9ic--Ornd zdu*H1Fib@NCUU3t>^QyCO76uDwNqlg@{vX^t_&KYdH2{6k)P3H53_@hzJyTnJYZ7w zeJ`EaG^rI7kpA?l#-0{Yn2ireJL3imK}Mwk<+rl1HXVPabeo^-69F`A70?fTX{Wt5`2g{uF9Vd9v#5xq83iEDjqxSPqz4( z<0jABt?{p!`xbDyhppY0Af4LyZ(UT%>$U+oyb)gq_geE55S9-QejLwPEkTx~0&jCv zd#OO#?(Xw1SDhD;A6UW8;OOqclk9;ZrJ*oIR^jiYf|p4nb!wR&6VtR$5784?6X7%h z3)eXyu(QrPzi$W^jN#x>^w717lRe}RktZuctakE+E!mldF@TJr0S)jy9#E^d{tF;} z5(bc2tnmw|OtBjyi1pU8GA~9xtO$4muu2Hzt)TIso0_bDO^PzpBS5O_sU4Ca=XGMX zlV|lMUS6&uG#Q)(L321v5!B(Nq<3?npWp$AYk~_Ni9htcpB2=RUw>o7*vt3QbCAW2 zUK{MOqi-5+BlZ}y?weZ&Om!CTU68Fc%dwAn*=qZ2wrLlzF6)pvA&Dm^GBIYv^G6Lm zlL~V}e#-Wr_+B=ac7x&{IW#E2)&j4ei66i>^ndpk7#S09_y6Fa9()P1aY-K;URq7UKo~W9!=1dgLiArrCL?7n4g;){+TvMJ zf+E&VOdlDPSPgb>U~ZE#w2=QyWPQ!9nj+aW#l4v%zb)|i+o;x zc<&gRPt_^t78Alen{tUG>bXugC&yJR!n?I-CmSxU5l z2%5uX{hrM1N2N)U198Sk5_QyqQ<3#;F7giDXA*LtCb^tk_jZW({*MToX_Arqfgm-S zZNyl*5G`jnYyT#M`Jru*BjNBQfY7oulHEK09fuyn_f+v*rjD}Uk`QhHy#@{JtqYt! z3<5I*sxI&~q{E+~2*qy7x+>AN!=H>`G=GCGF+kcw5)s7J%%-?v4I1}c|8kZtoWuSjV+7ID;`-oTIWoSugMLZMQ zxH%^T_N6`>{2aA)sU_i8mJqVl)?1#`jh=#@D`7DMHqEDtk&ZJ{Jw~kU??5oO)5TS{ z`^!;+apJ0F!}|$~iC;3>>R>2Ase4532~7Inl`+KJ?ju2Z5r*?OA*pCVZ4!?Zu-QY< z-L8*dfcXCK!>g@UExs8#vzOecQDBaMrL=&^(C@p7tdm09OBSiQ-| zp;0^b?c;P%%du}B6XjYA_Fck%X=(gj_C{f6bARmjq|iROIDXif{`844Boqr7adD=x zmkJGh8rX6?_;T@Qz|`MHu~q&gQ{3omPIu)e#d?R;cV{vqM^yorAQx-xYvhu>&JH#* zeM2Lm{cz3%Dp)2&)6n)YM9@O-E=R2p3E~Q0vsj9<#zvL_gnRax>wDGub?m#dthU{j z(L_ug34&zak(dK16bQ|6?>`s~p+w7ewjBu`P7gvYr=*W_jtRE`9)qT#!>B{?vaDT* zKdOGpiV}ay_vNuw+3W7Dy#})tPPC4i$MGH>dNyK`?lUOQzUm%&f9-Uqz)#{>3iC)@ z_%8;Wo+%G&mlA!-Ue7Q%@SqXT>Wbg7;7+jW>}J|>zTDy>;pS22f7#vT&3-tNEKB?zY7c_40g$Ba`%_YiKoZD{$jej?Ph*9Jto-#R~WQY~z<) z@{S_Qu3X_s8ajv!YvwfRjtnwW3%-h#jw{6%xvXKtVPbGEhLV~9DF|cwdXYEW zj=|PU6kqV`Gpqx$U?6)QzQga7*a7i{k9HTGWJ{uzbQcA^iYVOW$~I5a6*Ct1v$8rL z(&V?<@%zV5e}#q6bfd38FYze3Em2h3c`~?vZfblz*Dqa;jDkibh@*NSJv>ThOFjqj z4>!*4sL+en{A5(3ABTY_474(ojfYw#cHV4Qbk`wHQV!q zG~u?KFiyB0V@a);OM%Gbj={gXode;cyim(Rq-E@m=KOjU^k6-}GI7Uga@Q0wo%QOA zbfQoVa!aXAFL*l`vQQS##f&|kq&tR%$nT@BV||?Jr;#Yj{S<~k{50(8M~rwmdFI>0 z#L8&Y^f4#n{sr`9CuSiVe8Lt&d*=8SqY4Ih%F5_-16xqEqXrEDzt3R^T&O&djPO)9 z{)2?LkHg&6{5#NhRVAyLP6QFm^7YPZbbXC!>aFP?YQD1jLm;fqe3QuyP%vHeofyh)Ul0m0T!O znw6>J$80%N~Vnl%7yJ*%#HsRarjco3GBo5{c!T}n3b^)pm4RCtDjuLj?KHDRA{aVyghW} z&D{a55&UVf6X)vTSwn4f&cZSGr1l72whH(yxB>%PR%f*@7C^D0PpWk3i8 zcG~;7-9?PoV~NHK_&OZKGX!sMB0Bp!bvMv>;$^4mT z;0=-AIWk~X92R1**@Jq2OvLyuuAy@34IueU=q?Cn<;PaB-ho*?9=V4>kVT%MO28SwCZZh-lfK7`#@YWmDFrKTf020tUa&I!8vdKLnbIo?k}G zm6Lm2#miN$_#k}xu7gm#j{>}&q54%Ag*Ifs8)?68WTUXb?-1h5G_4`WgWS&oO(LT=ss(I72)tAi8 zu!%P#7|fRYr;;mIS_)A*zM9Q0+-A+6GirJ&GhM#@6-;L}YsM5FvzaxAn6Cm%T7!Uc z3;oZDHTh76R0cD2A|D{ihWua7$B?X~q|D+f^!ggc9%^T}!h%-dj)q>RxUI$rPCj0Y3X(-x$whY=1!}WZGU2jd zJ9>ra3Up-&}`QWk(_zN-{S@@#=Bkaoqp?crGe{Gh?T4}OnOJ$pkZ3v-ALL0It46^Up zD|=arF!qX&HT%AcFhj_`lOc>H*|+zazR&l0-sO+?pU=7O>;7EJeckt*bIhFk7!frU zYmE~Vm>yFt%SZg4=!FCNNkMg<=1z#qGEOkB(?wJucE-k8zGiVeOt z7h|<4Tib*%Za1_j#Kpqn#s>YE;|nWXL4#Xy16IecxXES$?8{}2U&}<;SS8)X+Zj8` znNBnlKI%~0SiNG7w=-T#T{;R~-J~cz_dDK`HrceM-726|7K=G$EymGGK*P?&LA@^6 zH-m>0_N{{Q%#;hQgcGoZ#>(K~Yq<#gtTX2?4O>r@EG~XlL9r*{onA)fhTv z=$WGqCkSdX9Is^KXMRwl~{p&2#89=vNJpxP$}OVz-(<#GOWym zh|6&czv@E6HY8mp6kCL6=j%e%%oEVwdV znKRLVzE^2qCGAqUY@8+((?3)`XHKk!X_jnL1|=#7Mi%A}0o0;9i$G99D+eZ|rX-{u zQ zJeztwqT}NbBEl*9Auac>1QD6V>k(nMx?eD}+NT`jk(_lp{cbLME9f=NySW4{#HB86 z*y0r&cB$(H1FI<$>!q%HE?pdzb9&vd#k9lp=E;${AZ8dOy*MQ9s0z!z!}+pZN{VL+ zj7I483+6=8;%g&wBR>XhKaAY3Rfq_~2>y5Su_~n8UO;Z?S;B8pxgtQCh5b!}+`nFN z>)+}=qg?SOHH$ixO1UDg-HAh4JR4Sx7WXgth+Np(@sDKF_s4@N!s#_ExJljR-;^ublq+yH6=qKO?`eEPPObMV+AFBGdU_?5nGT$^?sz&+s%tH9>u>ew zYe=u8d%#IVT}%5m^cAah`^)O%Z7M*ktyG_!yVc__JDP=Ynrld25*?M=`}Il|%>Ho% zo3wo@EHe=YPOJxI9*dP=qXITd@HqM2FUdW(Zh>Py6>&!(n5)8iU9yc-uDY_GiXa2Uh;6b;&vOy~lh?8tzYYMr&%701C$nY!wzOo!lF2%VgUs z)PR5`?^>AGJ`E$_iL;v61ECXg3WPlF47Q>qdxiy0HZ#Cr&!YnlZL=(cAfpxpxxatPp` zgR4F__!X|Ch^!Jq3uaJT4R)VjgwXB=z{pYgeeEB`$UwKJ8P#p8(Yw+}BNcS(+2aEh zra{#=t88=H@7>spE_f~Q#Lcq*N1^IZn+5!5>nW$O z9qzb$P5mWPmht98W0pEr@dJZ>Z9m1{7K{p48k7dVCL&N$W0=!pGA7VhHX!rSk^aPR zVe{JXGjETMGE?S2+fL?go9S8Ni5|n@GFK1f^@(2VoZr^dI3nu)%H&4DX}!|wkM1i2 zC78isiKn`Qzr_v)Yf=vy1cuujO6}WA2o1w!rXF~tC$p^;AJb?v^RNzT9B^unW^4d~ zR3c7F6+saPoYk#4ZLM^v1{l!)w3)mVWec4E@cOf8o^Q5?O%X{-_J~ivf|~Q z!CuScb(-bPyESHGC)k+h_>9@s)KBERHWV7nMG*A&X721B) z>*{0b!w}+mQR%MPQnv=lpb;sh$l zgl((=8|Zgxnk2^Q&dHi2pu>EcXOivrPzR*%AZxf!@P@QgPD>b#I5$M9uX|7Wt(vm> zGd63bPWY{Az;~{Dub*n{c#RNU1G%UF>~4v&-mDEDzq|W=dD^m>nWPc8{Aagpc)4S& z!G6cfQ$e(6dAgEN^YM?z58@^-lY8ylrunUt`)sFFK8&Z7oZgX+bL_v);_n@mMNbpv@0DS#QyROG1 z9qe%bO{rdt9NUcW=S`l7f!G%3f*>N zn{m60yyC9hX8NxEzMbu#SMT7ZN1rBU=R_}Wq1_cudWYpI*LQa5-d}Na(ubDKt@_S; zo6KF8&c0&z&s(`^D6I5##S^!_w+HX|dL~0~KX@c0_~frJIsIQ6xpcN`?2g*vFt4tA@V?2Wc6A3rp2@!Avqb;*FtjQ%wJ754)|y> z*C2ObEa;Wc4x z*rzlpBbM*d%h=57=GaBUg=q)fYs(tk*sIqXu9+p5&do5v-w(c58p{dB_opt|KfUPk zr2j{HliFfl?-SS^sT#)V@}%^q!4uw++?1fifq*tTsjII1b~-X@dQGFYuhE8SuNax^ z#RU_V!@mZILk*5{1Kbr%F>NqRSS}&Ke?urlYrVFGtof2OoKG@r5`8d;}@0-hQtoys4vv z{jv3w!I@zVl$7uri)$}~1jkkDCB7Go3<5m?lnHO_5+^))(Q>uCVOUMo@5_{4wn%6Y zoLt<|t42}U^4h}I*!Sa%UOVg8qTy&3qRa5dhj4`R8 zV0wsxcAD@Xiz!=YX~1ZmBpKDYg_o2&BKaSr{QncI@0hOajz)-BV^d=yIUFBG7^qcL zFM6Vplt&^;KHP}#RzLfYwmQKx$4CXbu8c+gak#&l#9a{?7{VCw$KiKS@N4esgai%z z9|s3DCHhfi*B>79tz$wv(&dlcd6jEXhHlxFuFz?!$ZVqts8>_{Yn= zUR@8wr8wcs32!R;ivmKQR33k37;Yst_GNec0ujG%Rb>I52i6(>pZ zitET^+Y!-^l213U7{@hHFJ6csJy|>*0 z`zERXO!uQPtaK zW(zm2Q1R~Hisx^q+QP}tqMRpGx7$JGd}-=Tw1|x|N%u=X<<3MjWxqg&YXq-dyI+mU zwHLY<^-8NsUGa=aqmQ-C1MPmiE1iDA&6Inn54M`>6Umfblb%Np@01})O4sA|HJQ?o#UK1U<%qETy-k1JiwAY^_>Iw1u+i(% zpNI}V7}?7o6B-fzo6+C=V&2R^zkcr6*NjVnACWW@JC$bV*C?uQ6VV|H zXU$SO;7DLXj6~#r0;!;l+NQP4#@^u@9IG@C^|U=FM+`ycs{Mwh;xw3^!sgQu~4Q7H`U; z2smg{CYhzMHOV6S;RznPYVyO8wFvZ;*S{UK?6-R4Ely!IttT_0F+2h+y#=b$fNgQn zwv!o}8Yjb^5=GycPiFKL&DY<{iME(M8}<~B&9DLu2kh(D*}3mdrBsXwUC@!p6gAuV z=%1pqmPxKuEMw)K4zkMAQ!Kp^DbVSxC_0_o_o{6oSyR^6xx?Q_hpG4cR{AIE5)ifE z8Kd-djouI+o!{zIhedzzduIUCz%90Xx4YWBf9&G@r9j!uK%D+a zxcE}3>LTgDWWChFd?2^elzf2;J463q@p9p{sblR%(Mp~+@v$@XSI%(7&b&?39!rsC;&MA0 zlF&s_c+J6u3-|k52fyvuK?rjzfA}Kqx8Fu-{9D|wZ|>F~y^_Oz!VlcBGl@gh=UVq= z3X}rept-3!l$_2LyZLs(?aZ2tLlMzvOsQ{e?4VgP;%_%G^Q`bPmsIiv#uCfJmMU<% zTb9W}@cNlw68M*ZFR>x%6HJJ>-ES%(NFcAl+boEO*v+@45>G(cu`iP=EyYznt|ViH zHfi{lZcQ7DEa>ptsJ<3)=iFecA7y;Wq4AiK_t?80JijaL)2GV>gQX`fQfj@OIt8e@Y;6H$!8*=i=vTq(gJB?+rHT%uxc zrS6-I=7zDT{Cw0Lh$^p;GIOAhybaq!FONlDA>xzHhA2)x_z3dNID^w6idPeO zi9cT6xuiMEX!5jv>-5;=6VneuN~J^8oy8=IQRjOvkH`0ET|NJGy(F+JLv1C^L^0)= zW&nt@xwBcR%QN2tF8{J{e&RBk6k+g=x&8a=`O}u?-0!Kq`M~sP)1#GNYxZ8__q_Q( zza(c>b~F-2RjGbyp$9AGw4B34czW{Yf0*CC*x25=P@1>&x#xS&{Ef;T8P+={U(~~t>T?^%l6pJ^mKh$9gURye@$W;2SD*9_K3P9UgK5f)Y?|No zLUM@>m^IKfr%Q^5P)wtKisKnANXO0fO3hu_X0xE=3kv6wImVa(=d1D{&4w-N!PNc5 z(fl>`lzWLi8l`R&aBS1?p`kGn$wZaSccyWKG}En_QKVdLnw_LmOp!EveOCCq!kCqV zG3b82hG*7Ve9j=EoX1??6!evOI-`Txc&6|?NkW)DlV$03lg(zaNdZYTnR+=eMRGYX z3T1s7q(6nBQ`UA5_j77T8}3z|3d>}@U0Hg_teUze@cy?Ysqe=##2A?pad2C#t7ckJ zmAiX;L#zCh(yF(_e2`l0&}PS_niC?huQ zuXG@(^~ObACfkq{N!ySpDx1?FjoCFl+hksMLv`>88}iWzH+beqgwhi%zYfOP8@wIV zUhPyR@(D}v33lW9U*S4lB@TX0aNwiiEy(9VW%7-U-q8Fg&9~ouIX$sc`i8q6;@1ah z>D-V%E1@ar2hCj_V{AGD(@(W%1s3g1Qv=U#lnHk$P|I-PIny5czG~FowpoI(4 zo_xRTSyKa-FG%OQ{}EoU_Kiamc~BmBKLgff!Td@~`;6Y5NOV{tvBd75(4#%-ApI-s~8wU!uD1tgYIpHY(4SwGb6hDqdP)m`Kk|3KWymCId6_&M_l#CJ_~ZOL z{r=d_x8#~LnYTV+*Wb!|CGLH8>XP}Lp4UM_bkfye<~iHj8?Gu zLu*T@2D{~iE$tk&jY#JG1u?H>V2PKQIHc4@GDmffsoVUi{Mhvmb{2l}5m)lH`lYq7 z#H+j0Td~_3eei(gYQd+&hk2a3JNRgC5E-~kR1QVMI0n0YN=aF}CJ96_WhGnv@+oVr z079+7bVe?)ooCh~1@<3=yb;*HGJMRW;d-@q*TEgc1x7L_vr}&257{@rBmEL2)OQ1Sb#oYM@^5}G z)Gj{c3n01YWxV1#{-0RnduGSycg|tWYk`@}Ok(DTk;NkIGKn0FWP)Py7pe8SM=pc@ zc`T9?B8j>8HpvdD9dPH|vw;l=CUhRCde-cajvnzm;Gf^8Rz}WkRkddHwuW{H48$e| z-;nI{?TFvz=1dH885_&v=*~CRvMsm2%Nm?mCsZjQ!_Ni3jj4Jl|Si`C{gJBuA^)b17K!(}_8i4kW0vBixcwxxDr*g-N;o=!5< zaFaWAB^jRPLFGhdO(zX%w<*p4koNZe+{ zE%VR1B8wH?pPxk=5sL7R4LEc@V!Qk?AtIIvBN$t5L~!vW1jOoM*syLUgcq?&m~%Kz zOamwK^}yy$qq9V0WzlZ&CEQ2G_=v-kYyEPn7x&H(@(9gOkgw59uj~0S=+}+>Hu?Z# zMlM4Imfy!8A85{Y3K9<=9}p4*j}-b5wU1&b7jzgf%DXk(xClb$eWVIHU8SCXCPDC2 zVUe@IUpQ76;+Rj36Bcf7;9sZ`qAJWLYSUoQ!-Xt3hcT)4Mt)n5=s@i;vAq8jzI4t3 zz}aD!4CB6C;!Kg$3LUQAXV(fXVB%{Kk-WYui#>y{hSxbhFp4otUM$8MaG~lf|w0)a^A^dYrKU^|HnmFBlY=nZYr~k`?RBZw8QUsgHHG z?yNvA?7VwKi>anTrAhx@sLwV-FEnP`9#~yBIc7QjJWC8a@UD;p7hq5ffN78o-s|zU zZqi^z8#32h{nR*oxgCS6eSBbwW^T073pes06Au_1uxC4k8Zrn8KoB21VZ^FtTLM&( zx73B?CtO7uv&^a*i8%|3`49f^wk9jo-oGs zzXUlvlw@sG;;hzEAF_ZnF10x%M|EsikryTs2Wc=;j@}+vqIKs6ayZ_2+NgP#nw=I^ z(~-QPAyv2dSf2!8M2f-`+;L7uPkFV8OiF`dMx2^=+v4%U2cxfD&{BfkAixNeygZi%qBgshA=_NZGlQr~<&*oYow#HcR} zF=9H8#qC-OVXIj}s~>L^;5`}_t;aV528Txm$T92-Ljc27Lb#gfLV&Qz8`$8mJpkd| z`b9G|3F0>c2ggSS*fBoCp8vreDcSxH_LvEcANnrgI`-It6{25*^~-QD3%4U3POfD8 zG1k|*vmQwQHQ@ow~4WzaD2EQ_9J(}9Gk+LoMIH_;u-b=tw=bBHO^jm zgf%Ai=ObGrWm@W4`i)#Zb0S+*trQQQVW$&cPaB1mF7wtU-1X5cY1uxGW!$hF^5nz? zuY1T><}weRpv%MR&%IP3qTLnBvU&UOgo;$U5+Nfm~VPR!hAx~Nykhg z`V>K=odhi_PS_sn&R@uM-3|oO>=6mRB~Uu1tvO%B#fGhEBh5}d6<*`V7Fu-+zDZ( z20im}A;0qPXAO=!zQx@{GNEOd8uj=cuj0P;IaA_zO12rWDvSM}kTH@0F%5c8(J}RU zeMTjtsj#$7S<`kzYFP-sQ%uPEk+D6(H7v%f*lk_f=($cl6B^Ok0=c7aHveK-g17inop&cZ`&-Mi4Nu@kTZ-o;EMazlx0?b$pG>xnWbhTx#EI9qq}C zvzB>l6Ikwb7nSZxSKe5$G?6JKsimPlEoHRivb=o=K!sp~tu$Qrb*A;J~lpFE>f?%Hc2f* zxt3bE#*K?)jNiC+V(p!JPWt1dg4}eYq>b`b>bGY6+lXBE=GAR+T&?NBsWsbJGoz#^ zx3dIoOCK5nT4@@Movl(&4sl$>UC)^xfW5B6squPb) zt4zZ7$qBIE_vV=w+u>Y?!npR5SyOBbK3VIrLB4ceT~)VHrmb~eL)BBZnv-jp&eddV zL$E`)|FJ=&8!N$icuf+wu(5v%E55hqevA-WAx*Ts|KM@jw<_hIctb9|^|a(I+xn^* z>KfIb)?CYUZY>UD9}-*>W?YTNa`Mg(i_S@7Hy6L|-Wb~~Up?}c)OEZ1g>@xC>KP9Val#K9G5_-Bda80IQx@uWlq$oSt0o ziBa?-TZO@6gTPrF!c*#XeMPIn`S<1SyYIR-CKw1EaLIJN~irL0+_L)u=6L+-AuN zIhNhT`}uZ#(gDR<%I5EIq^xA7Z2jKD%`E+0b)>8t(;oF&VX~BLk`l&Q@S9QK=sY9^a7AGQMaUjC?%75sWREkJC}s^;75%k46g`c1 z#;@r%{6Y5U_ERHK14)R-^P@Mi?y;Uk6}1{{#4bKbZp~!TY;6pQZoJ}V7nQJou5ute z|B1H>x>l6&k+|7mMJ7{re4(-K*Dp3~7?+wy;!?-Wac9@oT<04QM#~?MCR8hB;!H*p_Qf+P76^+H zUEYc(fX>o!0$QlM#evR_-r9!i@4z_S%WU*onGG96bkwFTCG}05rNiA*at$XC{NaL1?U)diYOeFp$$I1>g$TsYCX&-Rm z*i9=QSFnT%Vg+N}j0nZjYYjNQo|hKrCj!`L_2)3tpBsyk2PV~#J_XBb^|)E;4suko z`txlgLMeW&5oe30s^fp`arU`(-Nqh*(1{@=8y)DG*~V+rVdR$EP8gka5PKj8jw`GKXlGvj23i`W9X9wB(64acAQWP`I6y0*+lWWZK8?7 z$63w(iQiE0Rh!-1=ZswZge_3MMt1;piogNXGU}SwE8@$po=irRmMyOI(O=Sicz?UL z*9X%_7a0OALRjMJOSKS^F^?}J*IW|?D7!(~AY4MntN2Kf44|)Ox{0El6tMl2HQ_X9 z)Ign)c&-=40u2Lbd=I9#d*XM-B%qOc^WZ!UN)K}!7evtK3we&hBo1?>+<2i z|IX!0>t}f6A$4x}mshSVB-EPRq42_-&JDj?DdRF!Le*lsUV53lpFFq!si&RSaeekJ zj>;7U&GHwt+}ZPs6UQjC+?N51X;XLp=$*od4u_z)vu!q}s425_X*%BAl~QQ789ksS zut)nshY?yrq2c^r@fZIzHKpZ_UlW3%ufR}3;bq60=fEItP3%xC46y038|m+cEpYwF z4S%X;PYQgbU+Gb&gPoV(dSc$XQQsyjCHt*`>oC57x{8$-ey6NaGH>3~a_=z`l7;_u zXJry^AK(|t!k)nK!6o3KtvQ6R&89NDH84z9~Mq zo42mzoZrXp^2MZYr;%pkW%0q66kHfmYKThnu<=%A`Ki_ced=4!^Xe}D) zZyjl169z~MqlK>V0HAL;)PSpM6B1NUlh72v%L)iz!X00L*}`Zj`-M63y3&z@O8H2E ztt0Y8@{AhSX>y94BS(Ri>^%8j;@#aNnM13`{Dx?eHZdDMNb&);z5h&JpIv}k!5k{t z>k{8aAXl2-s${a)zthq|9AA?9A5p>c_5?XaU|bgD_hF1_>&TD~Gw>wtkYGd%!UYZs zfjf#}7z>LL8fb65)nNo-Mav-H+h7G=TLm~x@fwFPPi3#K%Y*~fm~D!jqD4XmN@y$) z+k1F7??7ug3tH2jocTNKVXh*N_Gxnu$f3BD7}l&qVy$W|Xx8U_dNG=Z3e`J?qlUna zGyx^=_Khd&vSmB$BzaiqpKh@ZMg?;RL3$)qmfjz{_ zmiv>`voOVW0n{Mgkqv&dKx?KW1v0;^zc$FNU;5ZP#KcKzDXH1IglX!69rliV>Bz_P zy@&JFF};V#)`|{)bic=}9@bHSJn*_iXO-x}*FmZOuN$zl@68%_{9Pav5j3_l}vr}{wOoME|eByWv6pzRNn!4&Z=mhhnf&Qt_U*W{~BUT|4$+gZg3eiDzUD#bLBbFYI!rea$ZD@sjQxH&~hEzTc#?qxV~|MhU*O z^PLWPePQIWei=nWXtXbgmjLECDWI(?41oWuTzqhpNiIYGc<=B9!I$rWb<#1blil;g zq~;pJQ0}`H-O3riA+5Wk%UdTKh+&gNWa%&_fozgyp}~UgX?lH`z5bDOxw4+UdJDRx zKZXBEm-}u(XLsJO(sO7+gu+#qM$Ol*bQ*=g6sXH4kQo)A19~ouOb?#`b$I!Uo(pp# z6q^kr3tq1_FO1A?O-NI0wvr&ebF&e;Bu+IPlVJpR*`i4RRnT_8{w&N>ij%#MU3J_Ife85eNX9=(l^I5>Z>;|j2{P$2glG+qNi^UAIXJn~Jay7X`_jt zI#T<{KkJ$0IPhDE?({2tJmyei$M09lI$LTq=0d%S^mEN#V8yyFGO-1$bwjOpeew>w2x(wJ}dHmwAoZbH@3d-vI5>E6S|R6P1l=# z#vo|L5K%=ZCv>BZieAQndR5*pJkhm^Zqhi}`58w8Z?rEHr{|Q{E5P|(T3~-B)&mih zyefaZn(her8u{yS!~sGGv6z7+75MwGA^$MB0UX50(1OdnMJX_iBAM1~piY3*klP^{ zfq6JYiqn$|Li{iYS|!#@`%{dgGoNwD6a6##T*2YzjnhImu=CVY&>;mK4VxGVaO8^! zW8&PK&<_T@1lIq6NjyYKHUYC_uS{?yD#c#HALAWp3*nN9_FW66YG=d)_HFLfo!26nJ!R=2}lpgeB^&5)0z3j-Xm*~-&2jew>UL2GRj07DoS zs{9!}5CvN3TI91?sfeyQ|Lwvv+Siz)FU)^_sX3p{ng0e0mA&__|Gxo_hH-@XZ<)=W zhA@T1`g}U3qGgEtl5h^xObZS9bcavSFgNmwFvtEmtUmI30}-pdH(Xzlrj0WiW>9cG z@g?9D5D$7QfL80yG@%~!dhh|v)zx7V!-nKyszX@nW>c+O%jBaVA4eBE{w5xN@)mi$ zhKd84HCHnP6tR*TYHY&*Mb+!BWS~{}(MSh{{KOB_r>6r|b`lSU8TqHm!eJb20cF{- z&jUFs;%~s5#T2qYz0st4|HBhp?xAgw|B+7@=%_(_WbR}83Pxt<$krmyGMO>;D2Qt> z8)~jJBo8G?t*-m8>g4OfN@6ip41I|(^?)SL5HE-MmwilmVa$>Ha}kQnr%eNj0&6Iz zWsCfJ5fshCiZ;xDz&IWzX(<1$^x!}_=SJIvQBc+Z<{I@qS_Q~%*HZ>2-wT%G6Cd+t z$nl@C9g(G4K{g#}uWzIqZ6__NEFBscR@@9&yPxBPKozmi|IVNFknw-dDg47S=m{u> zB~Wbq!95Fx(f?-*66tp!)wP&ZS0|y@-we*$TNnCQ^G`{ZkZUREDUkv657zh6^%pOf zou6`-(Xto4p?``V)Z=2)PlFb8X>tR~Uc?4xarET|Y`A6xWpUWdjrswa>zAGXm>U3! zgC4Wfz{5NJKLoAQMhP3c=C0|22e1<={x zFwo9vbGZ@5q>?NK`qBcyje;QE*uekc46Paoy`D2T`xg9&l>`Eo5K!RFdY{Ea==Gyz z)2lW6Y+nt|=8v_1tcVAH6)`uVqb$*}9^85)bCcX|uCe;4uq; zGq~ERt(G+~l*2YyYWHW$ID@56 zdzlM*OZVfh{tYl-8uo?$dCy7P;3Zdja5c(L@{Ql60@No17~QKMXW0Bg@=iN@6ckWr zaGY-4Ome2Ou1^a(6%uoJq;8yHy%gN$ZbxP7zh=+gJF`-x)bdQ(29pnB_5@Zhz=c%h+CTyff>um? zrL;+bl!aHNtf6Mai~987 zA#+>b1PT@&0SSedKyIt%!y&aiY{oJ$gcb=y@SGoZ4%{WAyaM$sHKf$iK4BYNTx&YA z@z+JY6b(44r-vC)Cyj3PhHg+TPts3DW*-$N*VjSuJV{o^mv3MD+ErJ{Fj~$zr626B z#VMuL)MG_!6a6fXXBrcnKFl`4e@|Sc3D00DuCk5@jOUrh1ea+~#md~YFKj}wnvL-1 zyA(dOjVjZALd1L?qXlhYwId0MOyDJKzX8wST=-C_)rm8bg?)tIK7tz5xd0iE0J&q5 zD4Q8s-n;7-0>x5hPfE5{@3>f-y7c zLQUsr&Oyzpnn)#7fxoo?tw}?O)tbZv#|+Dl@UJ=`08ah|m1aD{=rZRNCb&5M(@qiO z_ixLzpHiP*T%~Hr!LG0=%bIp9>RBj#6<^oBASZ}9$v>WHk>;$5Z&lLcg)5K2vc$B0 zaKA1Sbi%D831{G*q1g44`%yS9J*QvIZHliVCm}!i^6jd@4N!}F_)O{tmx?T;(}U`( z7`On7oss%V2HPkA%jMhaNx`l>V;6k^Y&=$Sn})4X;9O}C`AlnyRTv<#gA_A;8W??J zQS-#p%eQ}2GC-WlL@LP6X80OHart&rB?Iqre-RyoX)$93gK+ESN`~d)W$;kl=MUaz z6JP%0!6F1&wrIH9)(?h3R+_*d@BQ__Uc>?w&=-aZJo3=WE)cw6-!xQP`cSA)TSh`xb@}&6t$*w09b*D)FSM@OmBtt5I<-Saj-Q-tj@M zJTewxP#5*>JFps)f0sjjWvt`>`Y7lr(T7@jHrGI{ItPRx=y(`ZWKQiosGWF2!MY++ z5r&&wxGbSDwN|TGc02uc(`N?5FD?mJy1Y=FYEc;vc&1c>g$9N6F0INct|Tu z6+QbY)IzqBteYRu%YHFoIo&nN&1n#n!NfV`8MJhieihxM&JUN6y@#ZG9V`Dd(oMoF z=IDXnmj5)|@q1ewUzXcz^B_-`+Z(cP)}pIjb^FFfwW^!faFfoN{>HUq_L=GoEJs&8 z@)~IAMwvO_uhoU#!^Gj_K9HM*Xp>z^I}6@P)qw0yTbHk+mDCUSodh@#skB{F#*v z)HUO3sol_-FAj<4BCeKN)xlJQ?F9{F})tY!F6nh7Ya1XN#4;UKGqW+X~0 z64e)0h>pAS?a}29?^zA_62}p~ka>?{j$9>{Lr_%a`dU(m?T#|Z3xef4yMmn%CNv*w>>qN!52Ef84T zg)8m~(de*}vouph?Y`ch67L_B@B4ZZQ}RXHR6tnwN4D|I)wP%|#6pO6bw}A~i9RCh zRczKPgk{j+c*vJ0*zzaXd>QP1wcCM7HW_C9>Eqp9t>z)al6L|opM-RWHooM>2pG3! zPnou#H^K|*c3d^_7t|da+E%qMd5M-y__hK+E#&V+m+wU9_eF;m32OEg*q8-67g@ct z#`N;*b~!xaYM&P^$k%l>%?>inoD?q{obUVU{$PVv_uKq^%{;;4+IEv{9@C}QN%;=%a!frQ z@wWAqm}vSJIEQ>8dzZ72Q7{#mV@AwgHd)YR%0kCxp%Iqiv6kWpKG9e{QG})7U~ODy zV#t|jE8}*As)^GY8k_GPVg01`5npTbIV0W`s|RauiX(8v5g}1;tsD`3as~M^7TW9I zN>;A)NfZbq3TcW6Yl#T=2?_TL32X8dSmPx7E*4l5FZ0n4N+9}J3yA!&XZ&!6-!R!s zCQ=d|*)%3n?o40KzES-m`0mh(muqfsuw#Q&Lw5LU#rGAIPfFZ}0kfsMi61)6=GPEU zJ=4x7f2cO|(4o2QQ4&L4;ZBh0MqF_(38xoXvoch&;-q)=>-gSSxR0~@v25kjF1OI} zG{>V5Un%^Kc*j&qp{0XH_~p|?R;%Nol3AkjSEZayFLe)o=<`2F_$+IdfghaQV6{d| z$&>M*rMf99> zx^cAkYGsqd_j4%G<`6@iX^b|_QzI9Dq8u|WR|IwMD9Wcl`opfN7W1UI<)CO^SX+#~ zCDGh{(AmKMWz6W1 z$a}15DYG1V`x0{DZexLzHSLg=ON`bBCsWtmSYddolq=)Wp!CLR{FTangZFn$H)EaW z?#1qwVKUSQkA?Pxw#r;#CzzVk?{Y%aTaxN&V*$ zkdfwQNJ<67Qf&pT9%I=LC~Wys>S{0S*z>Pl%w+GWfb|Q_%0Z^Wl?8o-UKl?TvsG zN&j!B+vQYR$BI~r-Yp7@TYtY_P-;yJePLVy(Gk^rz5r&mTc=buYN+RLZ@id!pKHQC zgz*lI*w-Sf=GpxwmQrfM&Mar!Dw8kxCwlRLBbzhN?nu{l{nnb5D?g$ZRZu6LdDdcB z5#Tda;D$=;_xnS(_U4xdT{~!WZj1FgK*Z(H_n%B;9|;2`g<9t}VfmskWMjq!tV7Qd z=&Kbee4ui{cgRQUv8Tg^H;$au*o5J&@*mE;Qq#Nx7YFan4WE9x@)F11XyTy_hr?@} z31?)^z7Z!avs>J^o@+;byH}3Q=e@mrLnb91y`#<+x7xZ8+L&3Z8oxj+8uEz|7KU?D z8h-tvT(6<ZZv#MR2 zePK^Ci&}PjoY2SM6 zoL7thOxvngaH!Pn;5zGy@`Ag`Ce96VymhBK~ke?hH)#c-kMR|LN zCf{p*qvJZ4ScrUDyKP-H4nB-;Au&f$SJyCbBH+6bp-ASEYAN-oFC8m^7d zeb|M*x!YEm&H9PYc97~_?w&e+_A#VXS!x8>X?y$=pJCn5>fWsT0R&5srW~FIe_38L z|2U~sCOP@HSv>9sBt0UZ(rz0Qss#pEi+%!QV)$?w@rm!S51G=Mx zMm-6nAqz+QLSwj!o>T=hR+8#>bVzqp-s6k!EoZnw0G8ZiQY>di@xvBjxl!TghyENr z!)Mq!a{X)DXt1Et*EVPS*^EbSc_}YmMddv?c&|OPzd?n+!fq$>J^QzY00Mu-5MRlF zzp{C}js>u)7SOPfB2J?wP3wd9j3q*@ux&I{K&h~;-=4ZF`?oXkGV~=`D}thQ*<5p* zEZP?nWotg(mF*y!#Uf;%8zTWxr7sHsj_&ibt2RAYad?>R$p~kMZ7d<@GU&xc#qZ|- z*7`6wsWI>bEEnz z`nERofK;g~RiT-i8wIt4D+lmn)bBav=+&B&+!#}J6+3jwwDU6D>u>8S{=Ltl;FRO( zGYk&cCo(=hnaO;FzM|><#reaNnZN=0huM2~mstUkdGcS|EYDaDyXa>;D!-x`_A09X zO5a&x79^g+k2u38D=AV9GZUUK2<%55uUr{;HE8 zj#7a80AmUNp!DvaK#u=_PyjZ3Q+S52pZ*<0DSoBlH4W1{9tBA`AD;ozt}p<3XbV5A zdf9iNKD31S{vB>Y0wOH_rKL-xA$>-KSzbECIeahv-MRlmp})=f)C{cInCOt)C?8XF zS-|f+JUg6&m=OTFTyP$6RlHl_;Cj9_os2W=+>q8mwblo(nVleqqP!7C4ZuBKrDH_C zLv1o5pR4Sfzh}VA6X9@<*TH^&d;g7`igLaQHDjA{W>loTt_#n*$W(`jyK47y5{hc6 zc;7`nY>7%45XSh|zLlouF%BTS$P!*Lsf~UBy zp)Tca+v<~v+~t)w<$0A+x=fPFabF`qn{D8)7V$LE$TIE1Eo-W>+!4@QW7j$o1hxs;rp$ zb3d|(3Vy_)dR(cStui<05K$zm^rhD|bhPkx44+wB5PRtE?iGImfM>$PENmIm$$C0W%LE{3g%>p*|~s5wVo; zF@e-I!yW3>1Vt@%{*aJ*58op(NpYJ`GQj+Dt0A7Z=v`4k%8TfTrvj!iF6v$P@8=b# zd`i{eCs(>Vk9t`Vv6CqDBTD44$6c-N%nq9Q+dBA-_qp7?QGOK>2a{VM`q(Dj)r#1i zHP=;?C0{b=+#VY92HI-aHJ#fIoqK-K5iUjkmv}#G zstt`lf|W8fm~~gJThIV*)m)sZ@2N$Ez4rsr)djR{(Y_858%}DVHN(R~EGp%J_qcc^ zn37iLeOpSgjGbXUFmyT&YqqGCD2G-qb`UnYqt!tFj;4qSY8yGisB>F#zyR`6u;S1m z4gLH52%X#V|BJKtj%zAt+J==PQUs-nC@K&-fN%_zF4IU7%1?a#H0mlzpJK_I)K_JgU!#IWlFY@;z-W#AMD^ z`hi-NF<5MxSbUrpTYz(}W87jpQ2@&s9;j(Lsm_b3)T0 z)wICR3%syjx}l**&Tv(fwjT2$ylQL&9PiEqk9Kgnt8rR=u`{&Y_E2=24GgrmP0JY1tU=40sY_&W4uAhcBxq{0z!RADc%7c!B0N$g(?P3QZ{5&+>!x}Vs4g?BE zjaOJ{qi4i3nRo91g4_$1M2aTfE!pgVY4rC*?W>2<0xz~ZVBayX<*Bi|0`|03T2BO5Ylyx}|%byyW!e{b5CQ zo_8xZE8rR0$KIh35(Mt9&6$_q34Yhn_I;-D)<&BicUo~^w1fJa5?VSLN`86f!#2+q zXq(RtP&N)=(>bNDI@(i(sdTJQt`@5JPHW7w3Eh+nHT-P%I+0zF8~n^#xRWvva2`Lz z`s7yDkv%m%@bhKSoz%xvKEJoAqdWKX7XQ*!N+Fw}gy!Ct!XlD7c+MQ~; zjR}`b|AgzJIFydPcHmI@Ck8V8^tO{M=*aE5OqX~X7&`kz?+`B(k80u6{62o<8k^A0 zq)rx3(@8N-o%By~?w}{6t*Oj*>1Q4yVAFyKT8seOWK4 zg9Kg;QU$7ci(f%oZrg7K@_G5wW-ktMbz`4s*X7XiM0$|(6X4kbvV9x+GWSoYd8-V- zB-fBQXusBS_)z-S%#R=_sS>N-cIG97lvp_Lw1My#qd{OtElptRq1V9#rh6!$lM+gf zM;m=B@1i1`khUV3s&Q(g8z)rR!08x(0+4!nSSNjGAor$XsEZQlri1=7K3N#YE9GB7 zCgMDR&qL`Tw$Y_LfPI(AGo>POT=sX+=UH&f4m0+|;4UQ;gKCaU^ZuJq&-q-hqyQJwnX35xz73q==eRJ%F zqAzG((E-!?NaSgtpI&=;LNIbocs-)gOpZMBzbOHYzHds~32J0jqFss;Ys-7B^@wSz zjw=&_h;`w<@M$Z~zHsuj;I4tQq3=Eu+RJs)l6){F$?`E3)?3weCbU$P6VUfAO4Wj+ zo7q^f@$N`j*tBu7r5#5T3Tnp@NJO&%N-eM0eTHuHmT=b@y7DlJkEzbd85D&oQ>zJd zz>g;B@cFb?>IVRfCZ*c2>S1%UIGbYSRc}g$=8Dn)@kkY*jx}`W)3W-*H>3k8&Zm9i zxIyipG$o!yws62G_?gDnuuLF-)pl?NO|hvWD-BX%glAumxayq-Mt`@|9gJ?n=4Ud6 zciPPfL6EM^pF%*VIvkAMgDYO$s^kdJ;BGnWo%Txa0D#WhAQgSmbRcU#+yRoWlRAwo zC)VEyl$%ZrtJC<(l?6=R#~=KrH06{6^il_;Uk>Nw0;frC+TFlU0ohOHyOY2?=c@Sc zh;}Ul-JDhGSIVJ8Z=2Nntm4>9g4|7E1Ci4jHGKYc8k21HgFCLL*3^2rS)WX^6<+-; zXj+~L)Ca>SxrIzOg-3atxa3=29FEtN8U~km-v!k#?x6_Hn%Ppu#Ppj2LS3q%h60=w zYI@`=90Zz}e!o*g5!@D9GWRb3QQkn1ui5l0umJr~MYne-meF-lGbMvH`Mwz$FUZ>o zHQByAESB+gR8B!nsLq+8Ta)e~n+|B)5ze^`Brn0IH`83nPwj*PJqfHp-2;5o1lMpB zvaDDU?$V^Yks$=ImWSF9{yA+H^m7oRHbqa{Ix3q8?SMC5dZA{|eEQd#Qx?T}%~A_u zo^PEK*U*Fa$1>l`z=P#cOy!ZjSSaTe6Crx=G_|&;x|e}_!I=zNkB_d`Dwqfb-Dg{b z%iKXGW3ogt7U3aPnuv+;8{matE|VoPdsCSb^ymi9RCuSp5U_lLAF>EvICBo543ea( z4SZfuhxf(0>UxG&X;#r+4|$WGcY^;z#k_F0QTtCMLPM{8;(WXT&_hZMYm#43z~h1p z@2mvRo8vlVF+FC(F?K>3hHy|m$Q^vFATV146%?@U0QY5sCBA9|Fr*6icp}uT+D;vw z5*@S12ia};=(Hb@EspI-gyxw(xh*xfC|3(kx2PVHI2=%o?MPwGGyMJl?$WzFiK$Ws zQq9D41p%RcRX|GyRQbafgh7j1TM8~lSOC(lS{YvH>#BLi(eoyvefC*r1M_UU@pxSt zE=B|!|0aY%I#~nJegv%hG;?qr6g&=Wq!OZJ%q7J))K2+-tuPnlsheZ4}4EPi}r zUre;-rV7Z)xA!=5B=4(kBH%YT1%dH<5g_Dp*AjbA?LT&|kdkhKvY%WRWI+lqf%jX{ zuDnFn+4Q{F=#6bJVCJr<!d9wZ2%*dl_IBZc6yQNgwTHPpydYl<}Vz z%Xpv$rr?U>gaC8A9eE!5fYqwzij(-K=olJ(#s_Msl-kQqLQEyc*D*a4b20N`v!^3Z zKTyj~PFHXe`VtKU8M1h?_{d9|+6=eCH8A7lMqEKeo6+Q8K~sP|T_@4!G3%t)4A@eDqr}p1VNFvf@tcb6T;VC9F%RTG zf6XV#A;OyD%V2dgD+X4Kn&XSGw9uF&O4C$;-%J2{v;t)hLyjDkY++6EvFzjMkoj+d z8j5foG}-(hc=on$Tan=oh+|KS=|Lvw#$+H1qVZ`2(d>!Ah(OS1TWECBy+*+bwp{>x z%z)M$Bu9}G8Uv!}9XA6g`4X(OzE@O+{uU$US%5aEe+TTHsRs78z%?SQS;yzkl}L!JPyl?Qq)5Jhfq3l6<6AI2 zOYR>?0yheug)ES$a$(KdQgBMlj2J=l%5F3G_NlPuqJ)r!VtY1$8i>X1Ktg)PEa9wA zdJ-+jXx0)V$erO6WoUl1@BDRd=DXDwznm@osABsj%EA2r)1uc$r=N*5HqLn-H#v_> z-{mnrKa~6U=GxOM+l>sqoUSTw)afPf)QVqEh?in4dIDC@d>T#3NH#%}8TNMm&<7@$s#qN;VMalKAzu(j)QLZQOZExwbCx{Is=VC*d?d%xb1sV>uSVz-`11i-_flnBixQGxFU!UXd&K9 zVXos@tDgeoWPHI+0ydOfsrAt`QiK4dBJk^}T z;A>BWZ3P|{G2&$&8h7kjOGAG~h-=pDan%_W-WFz=fmS}A=x{K{GAa`m-+P0S|6?ML zNpFq11uoCf9(Ig<<*k$VB(GrS7^jjI7Ofa8>LBwbofRq%XLlpRr4L@o1QQ8nFd5xwFK5jk(qCO@Q+9lleJ%L- zt(luVLC0jmTP>6r1zcaDd4rEz%&71vACn1f)liD$cP&F(1|PSa(dTJ7CKK7}q7*6M zT7zZ@#+mcuRAv<7ql0l)GgdqTTrz>JLP`jTYYrq?Y35vfZwT)03l3{(wHed+?ch<{86TcaF4Ut|N+oW-wG?zv zu$C?C2rm|EV?B`?(PgN&yArlfe<WIwDBuXLIYr_@b41iA%s_a5o?bi2E6#!%ZWU25J-a51){Cf7nmNx~$buSc z5D|L+l;f$qqN#yfI>2#VdCxZY8i`fJmT@{-14K5ka~4-NlH8eRI(m#KCz|Lc_y1p zlGP?_7JpDO4IeHc*`7jK6zw2DK>{BY@88h(It z#ExTm8AR|snZeE!Gb%h23FCUJ!V2@q;HnKR7Gg#I5^ntKH{VSTK%S2IgWw?6n8yZ&Hul(z6GUrs%;)$b zP;~&~-`vXh1`N3b+R-3tD+55FR1Uv}Ap=yTKJQd11)dK2#^SNjpfh#~%4@EK%>~dJ z9>8gD!fT;)K_2W3BkvA7VH5VwaM{=R#~rMOL|UGsB9_fsH^4x{27-;X()BZF+sI=m zEy06o1V)UDXR1X!cqA@jdg*&bz@MW`Zhan4DIH!I>Mh~D`)Aj&{NA{KoT*n_a-XER z45b9+OOy^)$67bgK*#1hwja0IZ?0Q~(8UaX|ZV zKZ|>R!Q3rL>^m!|pkZShB=%im1E@5R?9R`^j?zD28V}XT`;95@b1v}4YvhK zFXA_#@88@Oe^bR)9SE}i!P@=N@D&>x?1^Ww2i;kniqq~3P?V<4sy~W9_2w9-XSfHC zad~uFu_PXR!5eHgYpbqb<|(DepMh34E(@26;0vI6UB!AR&?x~A>I!r$GnQ808K<;i zioa;SQG~l_u@N&2>I-lV&&In}Nf6 zHsHIh9q|VxyX#hIN|W(E65AgK6*hu~&1@cGe~1xx>j^xPsoyA)dUnz-fr(sN;1t$h zlnB6z@v+R1E8}U`;N-p_=l;{CO&3HxE5QhZM#A2hGlCy%o0EutW5F0Fb9~Nu=>o;v z!FW(d;Hd>0_Tm&sDX%Qv=7Zrf^Te&Vuc0z@bAlZ*$L8$fK^*~%%z?S1@s{S1Xp2M7 zYG;A2rFEpg3}Oz3{a_UtBx5=Ust8yk9?4vp1GNK=6G6p*7?~q;3LP@EbA0ijWI&V* z=bTl%RxobOF(4Q5IY-L^5i7$sr~R6kbO8AbZ!eK)Kmb(&I&h50D*SGdfc?nF_;?B1 zc5<}?@2WGr4sLa)vE5V9QKFQM0AOsVygqPEAp(6>@)&JgP;Mg(A8;9rTDyMSH7CofqP z#8q<7J?J1;3W(=2zx%ZE$edCR8_yqI2QI)^S1Z*7o$c{C#BG(FVy&G7m zGpCC+`nY{ZqM~i|05V~Alo45t2Yb6ZM)xCw@FyfZT1RP-nfOErkM>b&WE|c^!lP~U z5V8V4CgITmiUf#~cXZ(|N^G`*LIF2|hOKkiZ7-L>C{u5(1Xd2ZuJ~8pn3KnDTdf3D zn$7uOx2?G!p)SvX>Ht>U0jQgEpfG?nw;xJn4ipEl;(mRQS#$fM6y}a#m94k~ zQQC7FSY>N&f0X*%S!|0HcM!^W?pH~Gt8=ti0js0{l;)f&R=_&R4+WnS!e&|}Jw_SM z*<&-UlYCK1bDUUPtKBjH58r$@nlr%KS|Jw^>jnfXr53~%TZGNZl> z9@MK{)G2JJvH1vqpSwKe*R?Xsdtn{6!1PQ118fp?|mJIm! z5>6d8he$8+vJ$JUHI$@Ce6_@CdksCQ01tLswbjs&lJMISs~t5=q&hr}#K~5#eI#Fe zki^M$uY;uL_=grdA|x~H&vq{=5*n{8ak9;efmDqAd=}pVO|JL4B?EwmB!thj>By8w zZubH^|L=JtW=Q1H1C@H-`$>W25BHN4gR;ln>jJhk=hU#`Vnh*ap;g_lt^d|_kGBlx zxUf!Eb-r6lb4FMv>$|gWSplJg7xUlK4(2d8a=fl=2ZE(c{ITFrW7i?U`)r%AyGI+D6T} zuMhbn`4@1iFxw~sCm}F<=a_G|OtdqBFHw?~sNN&<#vYoVj^v+}xL^x2d(pH7)uI2~ z#^(*CO;+y_coQO-pMHaXDq1yzK|X$ueY0ZzOJS8SV%OXFyrA~MX`we>{D`ZT1BVq8>;H5H?l>$H97Mm!X#aC zMqHZsOwQ8kseg-LD8QzR@K5=wJ}`%=W;Ur_=-0V#-lHDL#C?=7kX_J78NFWbJc0=8 zb-!@r=tT+K>t6T+b7pSrxm*TrY&s3OXKCA{?^Jjaf=Y==eOI4PPC}K5L14QqiW?h1 z!@uA=m6xpBLmB<4o)1{q`E4Q7GMMHu>5=e(7PV*FU@pG9(*`q*ii`{R0C~qN$)MDt z*7!Nft%mQo_{Z1t8ni8HJ)av@ujQwIfK1(2yui_ED#O2qc9V zs_yoji*5Ma7^0|?;8MePLL6t&2ftv-yn{J6QFx@FXQEL?S&Sf)18<&)TCZ?k(+G=x zA`G@nfCdAV{Pfq5DJT1%cX+-UMeSg~7x@>QrfSmJiI96d65otqSF*po$Di84q`wZ7 zj5Sn!NN+2w^Dx3W_AWcZzyUHQN-M3_^RBT{Ek8X0GG(J$WdIAwj&&>L8x>WRrni+W zkGhKqNPsNZOqIRR?RgjFT*@~liks+zR~azh#iS<$vLqU+N~<-#i*hS~( zC##{qf%d>O&?Aua z`sLl%+fydsj32ELQC)>MR!6NDI4kLkESOA%7wLW@lBY~|W41+px)$UPRVkWbJT~0} zGG(IrKo4e+7rS1-NA5>w8&Up~@jOMEM__M@;U7EP2EdN$eLc;OCc{>_y1T~r^fR&L zu%MH zF$A*o8sf0JCSXql&|xTNx6RVo4K7ft|5pSr!QPBN76l6bS`>Y$i)1&dzIb0RYMc#W z>jcFV7#(fXyEuScOX65fZrU7qq9sE7@)FIv1O=qug?w7mY<0v{hj` zQ3y7|b4N&`Fl{D$q~+|}xTy6EXQ+wDf|}}A%^n3#FCmX)A`4*79OgLvZPpw5ej6P#m6n{#QmR9{-DzO)WvfU6(Rl#UWikJrw)DjeA> z6cT;;SO?F8`4>S|sX=#7U7k-3I!0MdU%hSg>5OQ{8G8L%wbw!u+p~qao!h8RWaoBG zXKfm)QeAir~si-^fT`&j9GWV-6`7hh&HY3}m4d$@Uf! z@)layUVl!O?8zY~np%GMC7k`;cXcqRE@s*4&En5{z|zSsaP-&1r99Igg$vid4#hR1 zg8%WX0^|y5VBEpq{&fJ{dn>%_-HlW=?5{q-^tU$<=`l-)Y(((`@o$=%+nTWC;>NA; z^C$NXii^P*qrhngBjt?z+aGc7pZ)~PKqR*#Y1eOH^huH7wkJBj`qP*E>hFWtlW6YQ z75^=lcNhn=?xULOE>5Yp(b>WWl)A|d_uK;1thHhPrdbj#xLU9i*l9@!s$(U*$TRx1 zRRRN7f}!;xkfC*v>D}}3E7lOq-&hH+{)u(b`cL))krKbo3OF~oaD!h_aCr+=jB8Kj z;o%NuaJU)#%QGF!{68Vez5CVRU`8i!TNk9PXLZ^V%=^2#C6dy)c#v$LPUC-rsl>4n zX7eIacc()1g@2rm{dW3r-s@imsfWtWe(h0=t!rIF2HV_BzB`4%0ckIq}@{Iq6!Uk>Nq5h2wsC}%Ye6!!00wFqi;#P*elFGuM4FKKo*mpeh@^a(g9wfn~b z!f48Eq>4KE^;guDOgdu!fY{gXI>*67u;Jz1hL&+QLK#SVLHc?@`iE~_)lnnWQQ)yL z0-kOav3=vQG2;N)5RJceHVT}j?n25vAQ>J21AARXvTH?zYDE^p<$(oYr}Qhn{WN&g zXBmO?f~C{4u4c7?W|aXz*u9Fz?CSGhz>49_{55Gc2Wd69v|3dbQ|)gfC9S(goF6!S zeAcA63U^qgBW~$xdg^ID(Cg{P2eJ5wG>peyUWMzYflhn0$Rkke(O-`A{mY~M$h<4y zMw*B9CP^4~!kBjD8}rZ?$g3s#Oj_^l2u4|y0O@+i zylgX7^8xPsBh zp<2=F!04F2yfpSN@5PAVUK)c`KU7P34H=qXo_C_%sBl(7{^bt;@JM7J5(lREH*MA* zVtdA&pKuT!6p(!{RWeKcc-JTh=#NU~Wv5>uF;)HLr>mGpyUF1#J5Ax|;YF{1an^;u z+<2GE(IzWB?8x^N#+@?(5m9|J@{_G{-f)AwO52OH(H`t+Ik&hd=7i-?4 zmhu5I1l|Gk$4*9`@r{f#Z=tu<*8?4?E|~g(Hv|qQwC**4H%fg-C2KOz-vi$QGUHXAPp~c zQKEqxdzneSh~}}@OOZbuS@DPScTut|`_iu0Q+b-h@~fHu@Ylb10Lx4eH`bg45r{T=`q*_>cK>6q^?!nx|$|3S1GLvyI8}# z97^lf6riMsPpTHd37FElH&IpH@&lbDOvzJrJ`_lt=YTynmOV~~`o&kiHCE2Vn(L{j zi134HEfA{*y7?AhonOeiHBnXHYBcyd#P-I1?w1NqjM3z5Ljm@(o_dkUW0p>lKU}hl z%K!@|*p<$FDDrNMT$?HF zMjO>PE5GVGXSgS1NPuNNnl=tA4kX@CU-@|RWCnpsJy=_J9!q z{f#!~o!@-{=kX%j*}I-?-|G1#O8OGw&4~<|&3eEM)dgE1!SR|+9pCbFD%=Tt0**w@ zXx#}^?%p7)jRvGxbMfmbas0+2m)3izJnboJ&rMzMp3k7&=%IRG?^k;cchhVt;M<5% znCUZf@k6!)dVbsWpr!H5s-pPyqB#C8HJ0U!DdTNA;>e&{)#p^;qCJ{{!v`M74@#sJvneYq{i~wS7ZM8t`BlF|A;{d|E0YGCfDEi{xr&U zdII;$8MMF0(O~-QviNo9lURVi0|ku%7uP_9{|KlyeQDhYNX_eUsv% zKtt^=CPiNkQq6MeG)q4HgRj9S>hh*aktbi52=g)d6N)JvJVVw; z=Ccp3EFYOqIp}_q>KnxG2ea==u(^jq3J1>+{gHXEgYNQF-;VovGx`=hHrKnB5_Ed# z&Ea|dgYKeK-&p*9(E8pD=$co`($NEzm^QcrG(_ExQGKKH^QQJa<2Sj&?wjOm-g!CY z+NoDa#gvn$hL{e6;$SQABcQrh!513c4S!h#)xc-}rLVp^+mkuo<`MF*JQU0oZJ`uFkUrbHccTG0!-t1$TO>ui*y^MQ%^S7&C=qSHt=F`cR~ElT1#LldO<+ZhT*gy}@`wipk(9X=&x;>yFX!kQ1RYud@!vaC zP<3EH-`_FMm#zO3?-uwS=2t$)^u-PpU=9o@`8%fh#&%7@?aap{zj}VJ7q)edl`ML} zY23^3y+rp~a%VBFwingS%Qm?Znb+}Ffj(EFTL;_vOzn1F<#K_czC}nuk-~sh>XHz;KYHHD zm)8-}T^`liuHt6RSHj3_LKBkr;H`~q>oH}w2;P#^BPQL!d3FkV=XjPly1#_AIw;=G z)75_cP;r1i)sY1q8$1tJuo^pEwQ|_NI=BF;FupH8`;zifC)xqI&Jl+mab4exMZ;aoqK;>CDK9mn zgam!m90jl_Kaa+m^LxB zzfvVp>>GW#ijJ6}PFP=8>iII2CQ-w)VSO#rUkLFI`s;DlE*$KRW@xxxSr1#bqvAte z_Uv1V509{C8z?&JqUm(pGN)B83L8EN)lN?B&s515GIR{p#-zq(sGJb0N_I|nV9h_K z=%CPjOe39#^~XJ(^c|M`p9(n_yB%(%zhue(s30uU4M(KkW%+SP8{lg9)iHjRoBbzvShzkSdv0lU0;v80`MQfE`6&fbM24Oa&j2|dKvpKxBs;L?{vau`FG&| zjG<2J_-`NoqnjCeZ&1gZpo?SK@8522XDk0l0{*e{f2C53QsqCVvwn^Eds(qoMaT|6 z&+q)~rD~_@^nVI=b2ooC{!e;58pFXTUW*6+FJtjB0b}{hWw`6ag`op0zo)e6Q|5U| zvn@o|l_wTw2N3{tg^6>a>WTZ9vV&~*2x9MK|9_yLLzeOLDt817--q)?gJ;vSP-v8u;p}_cI+(kbcJ}6qZ@w2s5PFB*Me&4jsVxYFYK+T&ycG_~`ZK6g(EM~A8M#qe1R zZ>8dJ2NYEYui=KpumIsG=Bzh&%i1gX?c(po$!3-^DYH-Xce1P*JB)3f`*Gw?Ho3$| z6fieyG`@l#Ri^!LaoDT5ZTl7Kq`>NjId5FelY~u|HF^2;z+dd{c+3B6-W7iRVc5F; zRjuslrVB|PG2XK2aQa^pdph!BPb^UC^zfs4v>ya5zPpGCT6n!?kCE7M6r(B1if}1A zTOifUbW6q#q0#Zm;dvET{z@}#AN08)|IH4CAof1!l&9sbePOE+wCj>*v18s8Kh&4I z{CxQPI;p!Z+rEJdP*|w7fIj0!Yu2n@#z4E_{(A}Io1^A>RFgQ z(_PI0BiPGaEXn2z(lo0i-0NNOd=gj;!8w23j%d{-Q78JjPE;s4n*qgN4U($4b zz(Sb$bsG8L*!9}8d(C=A&|7tls%2qBh zR(~EK6e|(P{6f1CSk$D|610Fr{s_GU$aI2MtA^zTnMVkfpAD3H(RU#Cez#5yEJEr< zfAhK30Q(8r-Yjdwa`iNfeLpn9@P$stIfwX-UW;Sp>bV&EKIq4XvAs3YFT9=9(~|AK zNJjX)=v&$%XVId0p!9ga#qy((D; zvAM5?&kEp-k@)bCQL+YNn~-~*UT`2)!>q}vsAkCS9oCQYxhJzvq9O} zTq&FG<~*m6KXe4E$W`iK$qvEi1Q^6fG}q8Zqa)8D zUQw(x$C|wypM&{N3rw=tejER7@eV#G0w^sR-D3Ym_niM%`!8Wi8gEspH|`o2(!rAP z4n8|VrtEB{)Ld6HZUnn4jNEL-twzZ7LG|=HYAf`9UgbjinBt#D$dsQAlA7ylK0bog z;zHV4BJKcTWtEh}y$`!4zMgPf_vmtAEXQYKKyO>NTYzrSLW2zFv^$PF#A}Hmv#b&2 z_~#gz{{Ig`f>YYAe%D8qA3FDO%3`D(YwmJ?h3bPA8qR5S)HuZdZpw{7#Yhw~e=YZ1A6#)ss_9JFM6Jm?jT76pYf#AotE4&a z|GV(J?=s87B+OchD2Y-CDxa6b7ae9rRYH22t@(2>nlqMVH4p@Y@t9Gl^BQ zv@?vlq{bY>(YofB%t2qXpWTa6^yw^hY0YH}2Y!vh=@Ip%6YQttS;=hJwyc=r7|3i3Ru48h~321YAMh}qa?Mo!%eu(JTg`!8y?AjF7(h43< z!C`_H8W7Rc0L9p%U}komMjp7nHtn8p?STIJp`u_Z_Wov`5q)j0Fgwd`>3SZgM~V~s z!m_M2%0*K#iv1;j6_$;UfXaAh_N0dFIvqR?2HIl(s{XeyLb1H~Z-3xG?~F9i2k32ZxgKAq}!Ms3`Q)C zv#i_LA|PeO=~9@k=BN?&E{ty*wJpx-mt0%ovUTpm2R9+74k0PKapk-}YT$9b|qf zGNNw9_EOK$Fs8W83z#>I3AdyOXwtPlThTXtrYgBVGpm#KbrN3 z&%oEVkLSugnmsHwTDv^fQC&2e6}T0Xcq9HV_@u9imrJ}^o3K&gfTN(LWoL8VY25i* zw$O_({*^0LLteb8`g{SL`uIjxQ}qSa-ik7uRCHZ3bB zs-KvnRFZ>=?x66E10%v7+MI|(9 z8xQY$UagDT{&LzZBJrF1peU2YS^qXuQP1+Hy)zbKGv_$_*AB9m;-1dF6&08{xAl_U z^%=G|0LMRfZtFb8%<*(bhykM2bxqk)V2?#vqaN8-`tF@>)kTmB@7mvJ>(?O zqX%MIYlF|7?Fmp};l2JpNPc#jOaIm7aye;HnOmKlo{>Yy<|N(?TrsiL{;o2+9;1|N z3EDpbcYDU1*LECPgpQ6letX7>mxfDbxb=u9VF>v)NpjTGk?ny#)N` z)~Nz>cM2EkQkGW4D>eFIS{s4Gp7*2K%Z~LqJc>BQwO^`{sqAT?c^$=fsx8`2EHeU) zN-@b4n5zi-@2n$|`RwLtr?{wx1Y4E%OVLR?_(n8(8~zey1yI~(wMx63PR%QJ*uFu9 zUcpeJhsTBOohSNLsC=ekpOJR0V$4l#TE$!9$2`$PVa=v|8>w(XX3uV7naZ-Fr8r(ZScSaa{>T-GiJ3&6Xa4H5^PtJynQZriy0I3J!UeqFPqv2zNY1uynDoV2{I(O zRTCFnYqboyCC=#?GNjgQ%Ciww9C!1o{lgb{=Hj^UT7_kZr8tY;uwc7_hEyn2BPJqM zoz)s?$e&4uf)bb5klfp>)~Ucnf{tnjnkfu%Kb9VwgtRVKSuP*<**VvWm&a ziYatYYmuo^HvpT=K$(iHDt6a@g-YF_i-tNTBE$AyvTs9r2CkJIw$DYsWc~$P4v+%f z4|||^FW)9J_LX5o?q7&_HR4tH($aqOb;B7^lT2I8J^cY0hl`jmhE>IG71kJT(TnmO zwfYaN%QZy{W>gs$!N-U>GI+dfKn$%qMN`*k=6%5-|;T3=^$k({c} zfntW7hKsXe&lzb1K*%fH0s zD4Ls}E67r2G}E37bEl;EkkrezW~reeey;cCmI=j9yc>6#>mr6KIJc#4fnNX>oAG|{ zQTBB9jy$!p#2a2Owc9NvV=_**g!hRgcbivZUUvk{$aJpej}*}5+XAxh-x1tPO8?O5 zk-Nsq%uVR#^WoM*uO5du{;%Nl?9JQrd5l5bQ$=V-k|@)*C=<(eQSlx`_gW;+S_~cC zsbn8Iiixo3lg)b|?i-<|y_%taCN{aF$oNHPOR<+6DLXFt*dQJnV6D<|5OYM#Qok9h z#)!kgWSm{k<1XZam+6`MwvcEV0dWL3u7=d+AI%}agfPYNJ3o7CPm!tmm$2frajZBu zLCf>h0&D{0zeie^R#OQ|`vhRg`w)i(9FDO%+#k{)Kmw=LV&Oawl>*aW*c`8tmCK$pk(bgS$bCi-JL%;nOkoLLpiQ zGHdud%sFu-Fl*=b>6iwguwDv87|DKrrXr5r+3@Wy(RDU#vZv0}!Tljp&LiQuhj3CZ zBlY$ynY*OH-b4Q5WLa1*BVtUOpPm_&ZD-?CmGNa3|%hNFF4De zm~;#7-H!-@?GjoBzW`QY`Sej)oEQN~02=g2<70T-!9r42Wp9-6#;*p?E;6`sq1Gj(~;uy9Ylc5*$m zmmX0F^PXJaI`_r5R{(Jm<~_YmCYNA82$?5wJ}%!H7C3f^lwWE0)@>@=G#FRIupmLn zSt_)Y7I&Rs%K}SyJ4{93caicfRmHuVyv=Sa2}^i4XyYuEo4k9t54YdtKs~3kJmn+< zEP224fw#jH1a_B~k4hDBVw1Oz*wVv{yo4+KN_BAglefVyW@|OdbR^ zF7)R|?fUFsEpSALZa|e7dP9*uB}neKwq2fwTnn$Po^P!^P&;^P^H@ysn|c{_902?f z6D3i?g%JSJ3kC}cLjsUZe$yahi~}&bb(_*Q0rtLrn4ci!{4#{Zs&rAYIf=sZ2D+H{ zlg!l_-plg80Xua>sppn z>o_Ih>@*qXrjI&D9w7p7k#F%s=E2DD{Wv|LczO?L2rkpd0bCn?XxHM4993aoaG5-A zYuw_GtbzRjk_Gj*mcwP61zJ6pRet zaSVjEX)+LqR?Z0UeN|_KyL{#&WGIXbBpGU))>|^*I<*>5Ih|`-C`|HVsh6;P=7U15 z%E9dMCGC}aIhz+^Jrf-eHzYaXz)x0A z;zS4lmb?hmL}M2+5KCEbiPOtewwW;5hG8KB!rA>oa;87YO@!?R(f&czjb7AO9I=-0 z!IX$9B)u9$jW5Zq+)F~rpTv>gHEm7eRug8toC%vhiKGUZ2^q6}1Zv?a3gd@*pnkEg7^M6(^1P2)ocUX)H=0LoSCuvKY1t zZzdVGANEOb9+&cun?#0eRt0#POyk6-Oyj;9plCO%-g=tQ5i%Ut;;C_JiKL84<3*e} zHBr;$3?>L~_F7;=?-XE7fs(&`@cN>u9JP-7;n*%ubV`F0Ei6k@*pKzjIE?UBlTvB889q^yx&UY;eFj4-)4W`$JvIEM4gjnz1)3E)o>=0%bHWw^}~={X^F)H6GLQF z9;?sds@Xm?`s2WA9T#qF+*=w}{o|x3z^36tgu5m}O-3g?+^*EN`5GAg1I(532}9iohz4 zHRVr^Ihr}CM+|-H5(dRxZ`-qG#D^x_pUmzj{U>>2RG`Ne?%lmDg zz&z`Rc?sOk8^K5pm`BKegEY(|4EbNc1ltTo{wI*UoRgeRtZfNSZ3$0Nf32zatbOEJ z`=2;QPpF+9{V$*)cu$Z1h0d()6ZbBqt$6hP2(S9-l=f=-hrB=2BhsUvVeP*+r;q>5Fxh-bskp8PVAqo8QH2ihSLip z9dkD2B{AiH9a@uHd8}kq)?w?;~)%Me)L%Scwsn zHQhfE69)-gO=Q8kSTP5#*0JnS>EPBfwQV8HvtfA2Yn+OZfa^@CM@7S&D2UgmYiM!O z+2hjwB%6uwR6fV=l#jy*d@Ojs09xm-)JhSusX&$ca!eEI&)GqM~ z)TGQKOO?}wUD`L+@#`Y~v~=*FJ89`OueJEVS6_vqCS@i0PG>I0lcR_&52BNa%oqt%P;lH)1)jRw{;f?;Kze#(k|_% z+dCH4dB5}$(WHoy3p)$U@#B89lVsXSy~1V_%IU_5^>nyiA<=}=^MykDLRm=m>1Hp~ zr1zXzw_1cUt;G#oBp$jBu|;eC^Ni?i(cWxM5$M?CPjeE=`N7Lk6)u< zUD{RZ1WK5fG-c+I7j|Rj;YEUI^IhN@>I6!ecQs`ek^TEd{W~##<3+-jt8Y8K@EH8% zc!LO&GrDhI{<`RUCt@yBRAol;YXYB51Qt&4WN3HU2ToZ#r%ZR)CV}yXri>_At`nn+ z55Ghcb%ige(|^g_tSPgKoY09e!-xCPOkCkh>-1lFEyC-+oFSNNHD$!fr#mqR@!`I- z9g~wx%>?+Dq;R!?o-h`#*oLTULjXCyPVpskktVc)EZ&Lv3y-`+6Lf_O)+xSX%4BDKk+MT0l1K#w^7nwIHM~P01C$xQ@Wy%~98c#tK>XE^y^KLMby_6Iw!U z=*BF;6Ez{?C7OgQd|@5xB@@h^MNu-E6L=!rWh^*L1n<*5v=9ZcF{|;!T@cZaX5k87 zR)>1U+@=YwBD-~B4&jNuG%Xrk%LT4jM=oLFH6Z~qts5haCu&1Pf0~yoT%?ZdGY)zn zp?mjtA=fG-vzTl`rY&|U+EBNqgz2YgJ&(Msj=ZcBvlp+TI&dwFC7V$6Dd}rb%yTl* zb5cyxIl;>%Fv?H!X`U>*#>wSUz(gNR;Vug6?2CsVl}y#njS7tRa&-*~jsaKh4b*JHJllC3CT6@e1;qPWE4T z>r1p{(73f9?SLy*uukO_Q$e$MCHYn-`z@0#r#ZQ~4xu_ABSl9t*f-#l0YpSUjmThU z!6!qAh(X#`4E6yrjmo?UFD@rHv)Jn(>p_|dgMAG?=|?R7L`!3^Q{awyTthz;ZHOf20IWw=}W|YqCpHc0X`W_#0}82F<1hTLS^287gvzSS!`*jV~}Re zVBdmIUMAxDX#yDTU7`$?=?|X_CE^BY9SrbCp%`*-Tq8N0!8XB9mXdL!Oc@MUADVnc z#-%>ws=y~xh!B-|LlgIcjAXH8;FAR6WETy`VoN|Ea}&N@!pl z98?P>W^1Y)JDXjj>hR74ygV?V7D&Xy-553fYT?8JquUjzlh9(!>X#NJsM5`=hb zJoLp-J9tE83FO*$+yYWUvR1XWn?De$w4J~l&wUJ8`1Fg40cN6!w zlVwE^OdrcmMa09!*b%sr7b6+{tT{a${Nubwi(#>65(HtfOGbS|H|3Pp2{omxZn29D z-Skb6Eek-sS zF$9ay3)lhvF_yAyT`27jgb7EN5nSXg$JV8n32y|6GJ*#bUm&9(UQ>FS0et||srU%g zT+Nm_>b3@@i~8j0wgf#=c%f&eJap`EA@~u%&q1j~Z!c_Vy21&)od^p^`H7q@OM z(JP%a{06QxI{fZ%Y+`Hc_tu;x^G0NY&6UiqF*RZ2{35yU4Or=t!A+|+s zvupU>L?MJNQ>hGTfqhLi9kc%jb&nTh)JFoqn+{)rGTBi!36Cvbr<+8Fsyap;S?0a^ zNE-O?7@9S6%-2s>D@Qvq-VU}n7IT4S{eNH93LJ@e?1RyYZ z=_!Zlk3`tnNztnr_QUp|+g5id550=Yu0$?lXAcoqHZ4FX3uKodud&npO?hcpek82I zS{^yDm7UFUvgsi3g3EpseUxEOw|BS<9c9|&B_%d_I)nDtNFW|Tpy>!=XvYz7M<7yn zVm%OfV{3qNYvWQx>PT6gS+F*EEt%S|2{A2(P<%FefUq1(>g5ScY|G-5i%kOGs(h?B zurLdx)Jdo%r|>96q)vh{mefT!F(ul_DNk&&$17MJfJiWhW#xWkMTz* z_g{fLm^_RxKtqe&txzD$l|QG~Z^Zwbb>*sh?$edzQ+E8ZBjt4UAM(cRLwKOpo_>nU;` z_(~kzU-K{^NT19kht`-Eo^`$O0!bi!3V;qV`+>+Q-R{}Xk4P*b0m$m!uwW+r>OTW=lbpcP*gp} z8d6T?teDt!+FE~T5OesQD6bd@d&g8N5Qe==4!w|`aR~PAUg!nv(yTaZ-Uayh26Ta% zbqM>el(;LWRQeKc_^}{+pO#`jHkBOgMBQPhyPe`)e(xp_pD!{jR1kw*s6uvn$0_>2 zW`;$Y<-0QCMW%%aV$jE<MXA_9sfp1cB1^*j(}K%YdM|83tJL1$*T{b7V_GMYGOuTBURX=xhSZy zklK)fz1T%C$F>mF`foxf8U05P0NlzGDcF|9**pV<1B5l$i#|nPiQ4Kvad;pny~mFC z6|owTGVIYRz7Uy+I+|wLNkC#*Q=+9U`{F7AEUT9w@|`QWL7~*F`f(Z{fQN~m z6>r><{D_j9YEkoUIhw{QA?neyM6s|(Jo@mdhl@OlQctQu#?&lBEUc8ciP^dc5!Wa( z@sXDq>IQ|(YvDNhLB>T;t8E^yOXGS`;%vvruR1MpU$MvkpaExq*K!y!^vR0%)z^+> zNnl|U%p4%AMJDE%^Gs&39j`#O11L4N<59$r^zp*85+8&RaUXd=G*nB?Y9(LO2~07k zEJnon6v4`fXX$(^T!~B2e7f2^#KIy-pcA!+BUD1X#7-}ERo#GCNL8B_cd;$2o?WcX z+zqH$4H=+?C|<%-NWXQS_eC%1Ma}yz0;O()d!`Xwk@vB=CB)VAti{;eN|6Z|Kh$d! zNST`TihK@qFSwq^j`NaI9zgM{R-LG8Y)4QZ;p-5Ajc!^FP-kE=vfO!&avwpd)T|>M zN8ZoOYK!XrhG(Vw+n(36I%@+}_14_BXxX8vWhLX`da$nk{Pt+Kob;@JGEJ9x%Wpz9 zzX%Je^0I7s|EHGqviy~s*4Wtyyy*Q)c}U^*@x;p~=HIxMBXnBg-3updm4aoEb6wgp`MrZtXT*rd_FEZf~RVwAVp-XdwD{ z!evftd$YDw#rF2J$gQWwMUv!eClPNq)4)Zmvppt&QNKl{xa{)3ZC{h8i~D5%0uU(J|tY0 zx*AD7XM?!kyBOW7_=ol~h4KC}Cqxy;vL#Q^YtJ%ms=SDUjmn+g%a&Z>>JED_x#^|k z6s)ZdVv?@erbU}UcC-4vHaE@W0e4H0ON&VvPsyLZ^IsS96r{$+Nhp@%5JM<79 zBi5`pK6luAmleLN!kxR9wTqdsnw4~8vi`4T_mN`DPZ5W>iI>AZ^-gBLnZ&bO@ozul z+4~{?W92z-eDMeE?;$l~R-=|whrrzzE7B}KwHdF@d2=~#oBcg9%;H_9pY8r-Qn^(Q zWvVTjn4DY*ET@qo32C=z!qU$s`)EFHcbz!Z^Rzhj0XBCcK2AWgqP1yTj!0mW_qk~C z41AL99|u17xYMuXr{F%n%rvb=9~(enIxsz*vE^7hf4b=db8~2tUAi+=yhUJ;U}TQ^ z*P5OdnBIsSZTBGq5?s-r?)K2!oboJ>)m(OLK=ERSWtqgQk(lR4WsBkPBFfjA}kq-dRC77YY2S6Wn|I2t8-c;i6bD6tmFF9WvYEioMU4s zM|o<4=H&t>U#L8$XD5C=yZ7Ch4Du;Cjq4kMG)MK6uQ8kS3&oQvOZA*Is}F(mLY`+m ziJ%hh85nx}PN?@6na9xX6L~{T03)Vpmfu)jErP(dHu@9v}ipU}6 z&ep;aJGqYdF0cwhT({pTBFU5r^ZU9gLg14XK>dV7pjS&J#TA|&feY45H*u~;e~^NW zT!4+4dDWHaokaK6>lHl-wK@l<-sn(KWjDS*Klr+)49Pv!*RTjd*K1=5#dQ*r>xf?j zQoyj?urVec)T>YgL2T?5Fqdp_8Nf3>A}l*VcSYjF48#s57N`N zhVU}}-Ra`g*A7NQ$r+%+N=&qqlUgMJd+P&IbU(Pvu`$kN(9+mO?uaBXlqq^j?s3(Z zRj1?_CzsnLviAzfdFp;Yjgt9}Gwvy5t*L^GX;QYt~(G)lZc?&W}0QM-rbB<21* z#9}6ZO9{!Kgz&tYZeoT2C!%2S4+kVOgRoaeOaq{9K?xdIBC)vQeet)+T~Fwnw!xVmNYaHwNC7VguQi7@>aEV{q~3!MLgZ74)EIw6uo1=t)Rg7Veb4$_2`w*Oh?|z3I=dz?bPCo>U5JQ zStb*c1R+UYzqwfg2FVVrs#^&}YP&=A+_u}>?>Fb}xc7^;S zK`-_*DT)YPo$WGS@1cy5ll)x&0;9)yyk6?1YSLv)C@U2m<%~|io_k+`8Izb$$zZES zj+dL?-x+$2qxN9T9PG9{FL%H#KP8d0_1;*s@HXuMqWR~vjobEJ;K8RQR-@KLOTKFL zw?%U7A8~g2*(SzcBUyWA45jLuOq`R6RtesHy#%^5M_PSrIGDKfgcO^X1#g#?SAi;V+L&GN1;(yJFfdB-4mvi1@Xp8jhm!Jiz6eV`%K$q-0GsSu$UFU5s`q)qy5}Sq zkW!*|^WY;0B$x~WR0f{(V2ne_eSUw0YC6FU6k+#%R1`tvP;lV>Z6|C1MaUMW9vujg z#t|5P1YiIt`V6+GfG4mqHIZ9^IVGneY0N7&KlK*pN21yS#-1Ya*r38H#RtKgV{6Wf zn=}?Z*qPa&8y&~1s7vhUBd#ja z;XFzrj`>UPtg}x;OTjnwu%o zlA-$J;rDMa-CrYl71DA2FK6I)a+r+>sa-Kh&U!LSNIM2ewp+cQ*F1E5vT+c!k2Ji( z44`y0w$%`-neIDytHpodCwN+WpWjB_Vh(^>g5XlhKXAJEeaVE|$Y$Sd+Jm=|oSILp zhU_rrV zcs(C$PTIm_!j0#SHWlCQy0|JQUgF7kuoY3LIfY8EaVZQ*MO_)x&(cZ*A4kkIK)4Pk zn)Nh1DbkgiLw#S`MjC3{@(aBI5DhtfX+M$g&7s|o%l8bo9r(;!`Hf5WnIfd}!y3vY zlL&(Us$Q7D4O31!4Odins3j z0$Tb~Am-@Al_3bTCAEkHiJH#8YwT!U)Z?#gSJ$7`VF1m`>Nx?X6m;Wl0i zH;#KYakhgP_sqKoKl=P~zVldrdrg~0b@|yZMPBL+#Ir3)(1Z388+e@0WXPXT1PSAz zvF-CQQjXB6)_b<#V0yI8wlYf(o7M;XS0MG$L+o0AGrb)|DTo7*zr*&C%Zu#8)RR~9WEE1Jtquay(U0xr z&CF(sK<*+)Vvv4@$4U5YpV zUkmfT?pl96ZC--B4*g#N+*k|Q4E@vLFQr3u#JttV42J4k(B!B%3i|%0u?=2j9oec_SgM*``8<%Hmdnks;?W<-}kQn z6JibVH?pVry!jJea$`bZ52Gx3&o8D$dL zOWMa2+^Y4CX{jzhxoIpj<5qB?(dLAJOryEV#kk;v^%t0 z1!p%IOo@WL$nm4JcB7%x@+r|*c(Wi6uv_eQQc`;hn+oz?AXC`cd{K&wV`u*&-oFA{ z>&7tBH&L5sEt!!QGY*qQtG)eM93DuK`9!V*OgoUtOn5DeU zTLt&K0m3)m%$Jnfa&Mu6ds2WfqyIWILmX=P6csuxw(DK6ef*A?l6t~it-3m+;CS`c zjDo|wGkI@E)@@6xAKA4ntzl%zHs?3Im%){t%SX;CJHHw^s_a}b;-M^Z+Upp2U#Q?f zwRd`fe)U9p0kV2?w287z$;f0>n0>sNOzcOmaq~&m_Gnf=>=-E{ z`yBtpc7bRq-uvwK66LCo`7hec7`MGvR*wgDdza_PRAZF|GS;iV_0OSamLK82o#TIO ziDWcu0V9@`Q!g4Nzj)halFHI^N6ulzO$wb(zEZtpdupfT&LG?L(3}fc1(U*D+XUcC z%Rw>vPP@ji36$-c%5mxD)Z4vHDQrcTIqeSLS+3zt*y+ILuITUC!eH& zL+ZPuF*;g1q1`#-yNhpmInmSfGt}ds3JB18)jJqRs?p#i_&;Vno(i5H;J3-Qq`a`L zuKVb`X?$xNle52Qc;XtVjcKe~G#nQc_Xy73vJvuxv$t>P=*9O_i5ko8ZOlx48f!I# z`}!fG28*2HMIN6^vUAG$D@+-_fEm>DDyb&j55nlc&F-s?)fr)Wby?H-G=g{ zf01IiYnBOL*A6N4H<1G8UbH2eo^7f=qzI>nz8gRqt%0A|Qn0M|$*z%9qD)O%8R|qE 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

y4 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

kDo`8pa@9IQT3?xGt74-c_RfB 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 A`Tzg` From 157d494deeac8f8703a5f31302da30667386ca6a Mon Sep 17 00:00:00 2001 From: kytv Date: Fri, 11 Sep 2015 00:54:45 +0000 Subject: [PATCH 012/111] bump build to -8-rc --- router/java/src/net/i2p/router/RouterVersion.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/router/java/src/net/i2p/router/RouterVersion.java b/router/java/src/net/i2p/router/RouterVersion.java index c76c0f106..74605163f 100644 --- a/router/java/src/net/i2p/router/RouterVersion.java +++ b/router/java/src/net/i2p/router/RouterVersion.java @@ -18,7 +18,7 @@ public class RouterVersion { /** deprecated */ public final static String ID = "Monotone"; public final static String VERSION = CoreVersion.VERSION; - public final static long BUILD = 7; + public final static long BUILD = 8; /** for example "-test" */ public final static String EXTRA = "-rc"; From 9d0542420262d8ae231592b5c1383d16999a5dd1 Mon Sep 17 00:00:00 2001 From: zzz Date: Fri, 11 Sep 2015 13:24:10 +0000 Subject: [PATCH 013/111] Router: Reduce rekey probability from 10% to 5% --- router/java/src/net/i2p/router/RouterVersion.java | 2 +- router/java/src/net/i2p/router/startup/LoadRouterInfoJob.java | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/router/java/src/net/i2p/router/RouterVersion.java b/router/java/src/net/i2p/router/RouterVersion.java index 74605163f..47667df53 100644 --- a/router/java/src/net/i2p/router/RouterVersion.java +++ b/router/java/src/net/i2p/router/RouterVersion.java @@ -18,7 +18,7 @@ public class RouterVersion { /** deprecated */ public final static String ID = "Monotone"; public final static String VERSION = CoreVersion.VERSION; - public final static long BUILD = 8; + public final static long BUILD = 9; /** for example "-test" */ public final static String EXTRA = "-rc"; diff --git a/router/java/src/net/i2p/router/startup/LoadRouterInfoJob.java b/router/java/src/net/i2p/router/startup/LoadRouterInfoJob.java index eebd0f02b..75977e0ab 100644 --- a/router/java/src/net/i2p/router/startup/LoadRouterInfoJob.java +++ b/router/java/src/net/i2p/router/startup/LoadRouterInfoJob.java @@ -113,8 +113,8 @@ class LoadRouterInfoJob extends JobImpl { if (sigTypeChanged && getContext().getProperty(CreateRouterInfoJob.PROP_ROUTER_SIGTYPE) == null) { // Not explicitly configured, and default has changed // Give a 10% chance of rekeying for each restart - // TODO reduce from 10 to ~3 (i.e. increase probability) in future release - if (getContext().random().nextInt(10) > 0) { + // TODO reduce from 20 to ~3 (i.e. increase probability) in future release + if (getContext().random().nextInt(20) > 0) { sigTypeChanged = false; if (_log.shouldWarn()) _log.warn("Deferring RI rekey from " + stype + " to " + cstype); From fd606064d910fac026d6a72ebdda6c68e573d53a Mon Sep 17 00:00:00 2001 From: zzz Date: Sat, 12 Sep 2015 13:55:30 +0000 Subject: [PATCH 014/111] 0.9.22 --- core/java/src/net/i2p/CoreVersion.java | 2 +- history.txt | 2 ++ installer/install.xml | 2 +- router/java/src/net/i2p/router/RouterVersion.java | 4 ++-- 4 files changed, 6 insertions(+), 4 deletions(-) diff --git a/core/java/src/net/i2p/CoreVersion.java b/core/java/src/net/i2p/CoreVersion.java index 4343c9074..2a1175c6e 100644 --- a/core/java/src/net/i2p/CoreVersion.java +++ b/core/java/src/net/i2p/CoreVersion.java @@ -18,7 +18,7 @@ public class CoreVersion { /** deprecated */ public final static String ID = "Monotone"; - public final static String VERSION = "0.9.21"; + public final static String VERSION = "0.9.22"; /** * For Vuze. diff --git a/history.txt b/history.txt index 34ba9f682..94a5475e4 100644 --- a/history.txt +++ b/history.txt @@ -1,3 +1,5 @@ +* 2015-09-12 0.9.22 released + 2015-09-11 kytv * Updates to geoip.txt and geoipv6.dat.gz based on Maxmind GeoLite Country database from 2015-09-02. diff --git a/installer/install.xml b/installer/install.xml index 582e0c284..f7cdcfbbd 100644 --- a/installer/install.xml +++ b/installer/install.xml @@ -4,7 +4,7 @@ i2p - 0.9.21 + 0.9.22 diff --git a/router/java/src/net/i2p/router/RouterVersion.java b/router/java/src/net/i2p/router/RouterVersion.java index 47667df53..a411b0099 100644 --- a/router/java/src/net/i2p/router/RouterVersion.java +++ b/router/java/src/net/i2p/router/RouterVersion.java @@ -18,10 +18,10 @@ public class RouterVersion { /** deprecated */ public final static String ID = "Monotone"; public final static String VERSION = CoreVersion.VERSION; - public final static long BUILD = 9; + public final static long BUILD = 0; /** for example "-test" */ - public final static String EXTRA = "-rc"; + public final static String EXTRA = ""; public final static String FULL_VERSION = VERSION + "-" + BUILD + EXTRA; public static void main(String args[]) { System.out.println("I2P Router version: " + FULL_VERSION); From d5cbccf186a53a5d4f3ae0e88cca0edf3bda7e66 Mon Sep 17 00:00:00 2001 From: zzz Date: Sun, 13 Sep 2015 13:33:00 +0000 Subject: [PATCH 015/111] checklist update --- installer/resources/checklist.txt | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/installer/resources/checklist.txt b/installer/resources/checklist.txt index 80f4c8336..4533e363b 100644 --- a/installer/resources/checklist.txt +++ b/installer/resources/checklist.txt @@ -1,6 +1,20 @@ Release checklist ----------------- +One week before: + Make announcement on Transifex with checkin deadline + + +A day or two before: +Write the release announcement and push to Transifex: + Checkout i2p.newsxml branch + See README for setup + ./create_new_entry.sh + tx push -s + mtn ci + Make announcement on Transifex asking for news translation + + Ensure all translation updates are imported from Transifex Sync with mtn.i2p2.i2p Start with a clean checkout mtn -d i2p.mtn co --branch=i2p.i2p @@ -66,9 +80,11 @@ Generate PGP signatures: (end of tasks automated by 'ant release') ========================================= -Add magnet links to news.xml +Add magnet links, change release dates and release number in to old-format news.xml, +and distribute to news hosts +In the i2p.newsxml branch, edit magnet links, release dates and release number in data/releases.json, and check in -Seed update torrents +Seed update torrents (su2 and su3) Notify the following people: All in-network update hosts From 7117438b048b4b1ba21c1a6e535a2cb5b407b5e4 Mon Sep 17 00:00:00 2001 From: zzz Date: Sun, 13 Sep 2015 13:34:10 +0000 Subject: [PATCH 016/111] RIP ugha --- apps/routerconsole/java/src/net/i2p/router/web/HomeHelper.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/routerconsole/java/src/net/i2p/router/web/HomeHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/HomeHelper.java index 223862576..8f2b48266 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/HomeHelper.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/HomeHelper.java @@ -63,7 +63,7 @@ public class HomeHelper extends HelperBase { "stats.i2p" + S + _x("I2P Network Statistics") + S + "http://stats.i2p/cgi-bin/dashboard.cgi" + S + I + "chart_line.png" + S + _x("Technical Docs") + S + _x("Technical documentation") + S + "http://i2p-projekt.i2p/how" + S + I + "education.png" + S + _x("Trac Wiki") + S + S + "http://trac.i2p2.i2p/" + S + I + "billiard_marker.png" + S + - _x("Ugha's Wiki") + S + S + "http://ugha.i2p/" + S + I + "billiard_marker.png" + S + + //_x("Ugha's Wiki") + S + S + "http://ugha.i2p/" + S + I + "billiard_marker.png" + S + _x("Sponge's main site") + S + _x("Seedless and the Robert BitTorrent applications") + S + "http://sponge.i2p/" + S + I + "user_astronaut.png" + S + ""; From ac1a28e988e1694b59f45a5a3ae12c8949b509ac Mon Sep 17 00:00:00 2001 From: zzz Date: Sun, 13 Sep 2015 13:34:51 +0000 Subject: [PATCH 017/111] print usage if no arg --- .../java/src/net/i2p/router/news/NewsXMLParser.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/apps/routerconsole/java/src/net/i2p/router/news/NewsXMLParser.java b/apps/routerconsole/java/src/net/i2p/router/news/NewsXMLParser.java index 841dba9b4..01ffe4d94 100644 --- a/apps/routerconsole/java/src/net/i2p/router/news/NewsXMLParser.java +++ b/apps/routerconsole/java/src/net/i2p/router/news/NewsXMLParser.java @@ -432,6 +432,10 @@ public class NewsXMLParser { } public static void main(String[] args) { + if (args.length != 1) { + System.err.println("Usage: NewsXMLParser file.xml"); + System.exit(1); + } try { I2PAppContext ctx = new I2PAppContext(); Debug.initialize(ctx); From ed3e444d1e961bf3f22bc10be364f008a3c6b3a8 Mon Sep 17 00:00:00 2001 From: zzz Date: Sun, 13 Sep 2015 13:38:19 +0000 Subject: [PATCH 018/111] log tweak --- router/java/src/net/i2p/router/RouterVersion.java | 2 +- router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/router/java/src/net/i2p/router/RouterVersion.java b/router/java/src/net/i2p/router/RouterVersion.java index a411b0099..87e5bffca 100644 --- a/router/java/src/net/i2p/router/RouterVersion.java +++ b/router/java/src/net/i2p/router/RouterVersion.java @@ -18,7 +18,7 @@ public class RouterVersion { /** deprecated */ public final static String ID = "Monotone"; public final static String VERSION = CoreVersion.VERSION; - public final static long BUILD = 0; + public final static long BUILD = 1; /** for example "-test" */ public final static String EXTRA = ""; diff --git a/router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java b/router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java index c799bd16a..5b2bdfb2a 100644 --- a/router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java +++ b/router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java @@ -640,7 +640,9 @@ class BuildHandler implements Runnable { _context.statManager().addRateData("tunnel.rejectHostile", 1); // We are 2 hops in a row? Drop it without a reply. // No way to recognize if we are every other hop, but see below - _log.error("Dropping build request, we are the next hop"); + // old i2pd + if (_log.shouldWarn()) + _log.warn("Dropping build request, we are the next hop"); return; } // previous test should be sufficient to keep it from getting here but maybe not? From 6f5739b9d8fae513bcb782fc15a7be217501c9b5 Mon Sep 17 00:00:00 2001 From: zzz Date: Mon, 14 Sep 2015 11:06:35 +0000 Subject: [PATCH 019/111] News: Store/load individual news entries as XML in separate files by UUID. WIP, not yet hooked in. --- .../net/i2p/router/news/NewsXMLParser.java | 27 +- .../src/net/i2p/router/news/PersistNews.java | 263 ++++++++++++++++++ 2 files changed, 286 insertions(+), 4 deletions(-) create mode 100644 apps/routerconsole/java/src/net/i2p/router/news/PersistNews.java diff --git a/apps/routerconsole/java/src/net/i2p/router/news/NewsXMLParser.java b/apps/routerconsole/java/src/net/i2p/router/news/NewsXMLParser.java index 01ffe4d94..8850cb141 100644 --- a/apps/routerconsole/java/src/net/i2p/router/news/NewsXMLParser.java +++ b/apps/routerconsole/java/src/net/i2p/router/news/NewsXMLParser.java @@ -247,6 +247,10 @@ public class NewsXMLParser { return rv; } + /** + * This does not check for any missing values. + * Any fields in any NewsEntry may be null. + */ private List extractNewsEntries(Node feed) throws I2PParserException { List rv = new ArrayList(); List entries = getNodes(feed, "entry"); @@ -345,8 +349,10 @@ public class NewsXMLParser { /** * Helper to get all Nodes matching the name + * + * @return non-null */ - private static List getNodes(Node node, String name) { + static List getNodes(Node node, String name) { List rv = new ArrayList(); int count = node.getNNodes(); for (int i = 0; i < count; i++) { @@ -432,8 +438,8 @@ public class NewsXMLParser { } public static void main(String[] args) { - if (args.length != 1) { - System.err.println("Usage: NewsXMLParser file.xml"); + if (args.length <= 0 || args.length > 2) { + System.err.println("Usage: NewsXMLParser file.xml [parserMode]"); System.exit(1); } try { @@ -454,9 +460,22 @@ public class NewsXMLParser { System.out.println("Release timestamp: " + latestRelease.date); System.out.println("Feed timestamp: " + ud.feedUpdated); System.out.println("Found " + entries.size() + " news entries"); + Set uuids = new HashSet(entries.size()); for (int i = 0; i < entries.size(); i++) { NewsEntry e = entries.get(i); - System.out.println("News #" + (i+1) + ": " + e.title + '\n' + e.content); + System.out.println("\n****** News #" + (i+1) + ": " + e.title + '\n' + e.content); + if (e.id == null) + throw new IOException("missing ID"); + if (e.title == null) + throw new IOException("missing title"); + if (e.content == null) + throw new IOException("missing content"); + if (e.authorName == null) + throw new IOException("missing author"); + if (e.updated == 0) + throw new IOException("missing updated"); + if (!uuids.add(e.id)) + throw new IOException("duplicate ID"); } } catch (IOException ioe) { ioe.printStackTrace(); diff --git a/apps/routerconsole/java/src/net/i2p/router/news/PersistNews.java b/apps/routerconsole/java/src/net/i2p/router/news/PersistNews.java new file mode 100644 index 000000000..96b8e062f --- /dev/null +++ b/apps/routerconsole/java/src/net/i2p/router/news/PersistNews.java @@ -0,0 +1,263 @@ +package net.i2p.router.news; + +import java.io.BufferedInputStream; +import java.util.Collections; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.io.OutputStreamWriter; +import java.io.Writer; +import java.util.ArrayList; +import java.util.List; +import java.util.zip.GZIPInputStream; +import java.util.zip.GZIPOutputStream; + +import net.i2p.I2PAppContext; +import net.i2p.data.Base64; +import net.i2p.data.DataHelper; +import net.i2p.data.Hash; +import net.i2p.util.Log; +import net.i2p.util.SecureDirectory; +import net.i2p.util.SecureFileOutputStream; + +import org.cybergarage.util.Debug; +import org.cybergarage.xml.Node; +import org.cybergarage.xml.ParserException; + +/** + * Store and retrieve news entries from disk. + * Each entry is stored in a separate file, with the name + * derived from the UUID. + * + * @since 0.9.23 + */ +public class PersistNews { + + private static final String DIR = "docs/news"; + private static final String PFX = "news-"; + private static final String SFX = ".xml.gz"; + private static final String XML_START = "\n"; + + /** + * Store each entry. + * Old entries are always overwritten, as they may change even without the updated date changing. + * + * @param entries each one should be "entry" at the root + * @return success + */ + public static boolean store(I2PAppContext ctx, List entries) { + Log log = ctx.logManager().getLog(PersistNews.class); + File dir = new SecureDirectory(ctx.getConfigDir(), DIR); + if (!dir.exists()) + dir.mkdirs(); + StringBuilder buf = new StringBuilder(); + boolean rv = true; + for (Node entry : entries) { + Node nid = entry.getNode("id"); + if (nid == null) { + if (log.shouldWarn()) + log.warn("entry without UUID"); + continue; + } + String id = nid.getValue(); + if (id == null) { + if (log.shouldWarn()) + log.warn("entry without UUID"); + continue; + } + String name = idToName(ctx, id); + File file = new File(dir, name); + Writer out = null; + try { + out = new OutputStreamWriter(new GZIPOutputStream(new SecureFileOutputStream(file))); + out.write(XML_START); + XMLParser.toString(buf, entry); + out.write(buf.toString()); + buf.setLength(0); + } catch (IOException ioe) { + if (log.shouldWarn()) + log.warn("failed store to " + file, ioe); + rv = false; + } finally { + if (out != null) try { out.close(); } catch (IOException ioe) {} + } + } + return rv; + } + + /** + * This does not check for any missing values. + * Any fields in any NewsEntry may be null. + * Content is not sanitized by NewsXMLParser here, do that before storing. + * + * @return non-null, sorted by updated date, newest first + */ + public static List load(I2PAppContext ctx) { + Log log = ctx.logManager().getLog(PersistNews.class); + File dir = new File(ctx.getConfigDir(), DIR); + List rv = new ArrayList(); + File[] files = dir.listFiles(); + if (files == null) + return rv; + for (File file : files) { + String name = file.getName(); + if (!name.startsWith(PFX) || !name.endsWith(SFX)) + continue; + XMLParser parser = new XMLParser(ctx); + InputStream in = null; + Node node; + boolean error = false; + try { + in = new GZIPInputStream(new FileInputStream(file)); + node = parser.parse(in); + NewsEntry entry = extract(node); + if (entry != null) { + rv.add(entry); + } else { + if (log.shouldWarn()) + log.warn("load error from " + file); + error = true; + } + } catch (ParserException pe) { + if (log.shouldWarn()) + log.warn("load error from " + file, pe); + error = true; + } catch (IOException ioe) { + if (log.shouldWarn()) + log.warn("load error from " + file, ioe); + error = true; + } finally { + if (in != null) try { in.close(); } catch (IOException ioe) {} + } + if (error) + file.delete(); + } + Collections.sort(rv); + return rv; + } + + /** + * This does not check for any missing values. + * Any fields in any NewsEntry may be null. + * Content is not sanitized by NewsXMLParser here, do that before storing. + * + * @return non-null, throws on errors + */ + private static NewsEntry extract(Node entry) { + NewsEntry e = new NewsEntry(); + Node n = entry.getNode("title"); + if (n != null) { + e.title = n.getValue(); + if (e.title != null) + e.title = e.title.trim(); + } + n = entry.getNode("link"); + if (n != null) { + e.link = n.getValue(); + if (e.link != null) + e.link = e.link.trim(); + } + n = entry.getNode("id"); + if (n != null) { + e.id = n.getValue(); + if (e.id != null) + e.id = e.id.trim(); + } + n = entry.getNode("updated"); + if (n != null) { + String v = n.getValue(); + if (v != null) { + long time = RFC3339Date.parse3339Date(v.trim()); + if (time > 0) + e.updated = time; + } + } + n = entry.getNode("summary"); + if (n != null) { + e.summary = n.getValue(); + if (e.summary != null) + e.summary = e.summary.trim(); + } + n = entry.getNode("author"); + if (n != null) { + n = n.getNode("name"); + if (n != null) { + e.authorName = n.getValue(); + if (e.authorName != null) + e.authorName = e.authorName.trim(); + } + } + n = entry.getNode("content"); + if (n != null) { + String a = n.getAttributeValue("type"); + if (a.length() > 0) + e.contentType = a; + // now recursively sanitize + // and convert everything in the content to string + StringBuilder buf = new StringBuilder(256); + for (int i = 0; i < n.getNNodes(); i++) { + Node sn = n.getNode(i); + XMLParser.toString(buf, sn); + } + e.content = buf.toString(); + } + return e; + } + + /** + * @return success + */ + public static boolean delete(I2PAppContext ctx, NewsEntry entry) { + String id = entry.id; + if (id == null) + return false; + String name = idToName(ctx, id); + File dir = new File(ctx.getConfigDir(), DIR); + File file = new File(dir, name); + return file.delete(); + } + + /** + * @param id non-null + */ + private static String idToName(I2PAppContext ctx, String id) { + byte[] bid = DataHelper.getUTF8(id); + byte[] hash = new byte[Hash.HASH_LENGTH]; + ctx.sha().calculateHash(bid, 0, bid.length, hash, 0); + return PFX + Base64.encode(hash) + SFX; + } + + public static void main(String[] args) { + if (args.length != 1) { + System.err.println("Usage: PersistNews file.xml"); + System.exit(1); + } + I2PAppContext ctx = new I2PAppContext(); + Debug.initialize(ctx); + XMLParser parser = new XMLParser(ctx); + InputStream in = null; + try { + in = new FileInputStream(args[0]); + Node root = parser.parse(in); + List entries = NewsXMLParser.getNodes(root, "entry"); + store(ctx, entries); + System.out.println("Stored " + entries.size() + " entries"); + } catch (ParserException pe) { + System.out.println("load error from " + args[0]); + pe.printStackTrace(); + } catch (IOException ioe) { + System.out.println("load error from " + args[0]); + ioe.printStackTrace(); + } finally { + if (in != null) try { in.close(); } catch (IOException ioe) {} + } + List entries = load(ctx); + System.out.println("Loaded " + entries.size() + " news entries"); + for (int i = 0; i < entries.size(); i++) { + NewsEntry e = entries.get(i); + System.out.println("\n****** News #" + (i+1) + ": " + e.title + '\n' + e.content); + } + } +} From 7912d7650daaa44d42206575f8c90b165b263ac1 Mon Sep 17 00:00:00 2001 From: zzz Date: Mon, 14 Sep 2015 14:49:20 +0000 Subject: [PATCH 020/111] News: new NewsManager to maintain current news entries. WIP, not yet hooked in. --- .../src/net/i2p/router/news/NewsManager.java | 242 ++++++++++++++++++ 1 file changed, 242 insertions(+) create mode 100644 apps/routerconsole/java/src/net/i2p/router/news/NewsManager.java diff --git a/apps/routerconsole/java/src/net/i2p/router/news/NewsManager.java b/apps/routerconsole/java/src/net/i2p/router/news/NewsManager.java new file mode 100644 index 000000000..5fb8cb492 --- /dev/null +++ b/apps/routerconsole/java/src/net/i2p/router/news/NewsManager.java @@ -0,0 +1,242 @@ +package net.i2p.router.news; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.Reader; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Date; +import java.util.List; + +import net.i2p.I2PAppContext; +import net.i2p.app.ClientAppManager; +import net.i2p.app.ClientAppState; +import static net.i2p.app.ClientAppState.*; +import net.i2p.router.app.RouterApp; +import net.i2p.util.FileUtil; +import net.i2p.util.Log; +import net.i2p.util.TranslateReader; + +import org.cybergarage.xml.Node; + +/** + * Manage current news. + * Keeps current entries in memory, and provide methods to + * add new entries and store them to disk. + * + * @since 0.9.23 + */ +public class NewsManager implements RouterApp { + + private final I2PAppContext _context; + private final Log _log; + private final ClientAppManager _cmgr; + private volatile ClientAppState _state = UNINITIALIZED; + private List _currentNews; + private NewsMetadata _currentMetadata; + + public static final String APP_NAME = "news"; + private static final String BUNDLE_NAME = "net.i2p.router.news.messages"; + + /** + * @param args ignored + */ + public NewsManager(I2PAppContext ctx, ClientAppManager listener, String[] args) { + _context = ctx; + _cmgr = listener; + _log = ctx.logManager().getLog(NewsManager.class); + _state = INITIALIZED; + } + + /** + * + * @return non-null, sorted by updated date, newest first + */ + public synchronized List getEntries() { + if (!_currentNews.isEmpty()) + return new ArrayList(_currentNews); + // load old news.xml + List rv = parseOldNews(); + if (!rv.isEmpty()) { + _currentNews = rv; + // don't save to disk as we don't have the UUIDs so they will be dups ?? + return rv; + } + // load and translate initialnews + // We don't save it to _currentNews, as the language may change + return parseInitialNews(); + } + + /** + * Store each entry. + * Old entries are always overwritten, as they may change even without the updated date changing. + * Does NOT update the NewsEntry list. + * + * @param entries each one should be "entry" at the root + * @return success + */ + public synchronized boolean storeEntries(List entries) { + return PersistNews.store(_context, entries); + } + + /** + * Add or replace each entry in the list. + * Does NOT store them to disk. + */ + public synchronized void addEntries(List entries) { + for (NewsEntry e : entries) { + String id = e.id; + if (id == null) + continue; + boolean found = false; + for (int i = 0; i < _currentNews.size(); i++) { + NewsEntry old = _currentNews.get(i); + if (id.equals(old.id)) { + _currentNews.set(i, e); + found = true; + break; + } + } + if (!found) + _currentNews.add(e); + } + Collections.sort(_currentNews); + } + + /////// ClientApp methods + + /** + * ClientApp interface + */ + public synchronized void startup() { + changeState(STARTING); + _currentNews = PersistNews.load(_context); + changeState(RUNNING); + if (_cmgr != null) + _cmgr.register(this); + } + + /** + * ClientApp interface + * @param args ignored + */ + public synchronized void shutdown(String[] args) { + changeState(STOPPED); + } + + public ClientAppState getState() { + return _state; + } + + public String getName() { + return APP_NAME; + } + + public String getDisplayName() { + return "News Manager"; + } + + /////// end ClientApp methods + + private synchronized void changeState(ClientAppState state) { + _state = state; + if (_cmgr != null) + _cmgr.notify(this, state, null, null); + } + + private List parseOldNews() { + File file = new File(_context.getConfigDir(), "docs/news.xml"); + String newsContent = FileUtil.readTextFile(file.toString(), -1, true); + if (newsContent == null || newsContent.equals("")) + return Collections.emptyList(); + return parseNews(newsContent); + } + + private List parseInitialNews() { + NewsEntry entry = new NewsEntry(); + File file = new File(_context.getBaseDir(), "docs/initialNews/initialNews.xml"); + Reader reader = null; + try { + char[] buf = new char[512]; + StringBuilder out = new StringBuilder(2048); + reader = new TranslateReader(_context, BUNDLE_NAME, new FileInputStream(file)); + int len; + while((len = reader.read(buf)) > 0) { + out.append(buf, 0, len); + } + List rv = parseNews(out.toString()); + if (!rv.isEmpty()) { + rv.get(0).updated = RFC3339Date.parse3339Date("2015-01-01"); + } else { + if (_log.shouldWarn()) + _log.warn("failed to load " + file); + } + return rv; + } catch (IOException ioe) { + if (_log.shouldWarn()) + _log.warn("failed to load " + file, ioe); + return Collections.emptyList(); + } finally { + try { + if (reader != null) + reader.close(); + } catch (IOException foo) {} + } + } + + private List parseNews(String newsContent) { + List rv = new ArrayList(); + // Parse news content for headings. + boolean foundEntry = false; + int start = newsContent.indexOf("

"); + while (start >= 0) { + NewsEntry entry = new NewsEntry(); + // Add offset to start: + // 4 - gets rid of

+ // 16 - gets rid of the date as well (assuming form "

yyyy-mm-dd: Foobarbaz...") + // Don't truncate the "congratulations" in initial news + if (newsContent.length() > start + 16 && + newsContent.substring(start + 4, start + 6).equals("20") && + newsContent.substring(start + 14, start + 16).equals(": ")) { + entry.updated = RFC3339Date.parse3339Date(newsContent.substring(start + 4, start + 14)); + newsContent = newsContent.substring(start+16); + } else { + newsContent = newsContent.substring(start+4); + } + int end = newsContent.indexOf("

"); + if (end >= 0) { + String heading = newsContent.substring(0, end); + entry.title = heading; + // use title as UUID + entry.id = heading; + newsContent = newsContent.substring(end + 5); + end = newsContent.indexOf("

"); + if (end > 0) + entry.content = newsContent.substring(0, end); + else + entry.content = newsContent; + rv.add(entry); + start = end; + } + } + Collections.sort(rv); + return rv; + } + + public static void main(String[] args) { + if (args.length != 0) { + System.err.println("Usage: NewsManager"); + System.exit(1); + } + I2PAppContext ctx = new I2PAppContext(); + NewsManager mgr = new NewsManager(ctx, null, null); + mgr.startup(); + List entries = mgr.getEntries(); + System.out.println("Loaded " + entries.size() + " news entries"); + for (int i = 0; i < entries.size(); i++) { + NewsEntry e = entries.get(i); + System.out.println("\n****** News #" + (i+1) + ": " + e.title + ' ' + new Date(e.updated) + '\n' + e.content); + } + } +} From a2e38503febc9f03a51922061b54668079b895f6 Mon Sep 17 00:00:00 2001 From: zzz Date: Mon, 14 Sep 2015 16:15:21 +0000 Subject: [PATCH 021/111] News: New /news page and helper to show all news WIP, not yet hooked in --- .../src/net/i2p/router/news/NewsManager.java | 6 ++ .../src/net/i2p/router/news/PersistNews.java | 2 +- .../net/i2p/router/web/NewsFeedHelper.java | 81 +++++++++++++++++++ apps/routerconsole/jsp/news.jsp | 18 +++++ 4 files changed, 106 insertions(+), 1 deletion(-) create mode 100644 apps/routerconsole/java/src/net/i2p/router/web/NewsFeedHelper.java create mode 100644 apps/routerconsole/jsp/news.jsp diff --git a/apps/routerconsole/java/src/net/i2p/router/news/NewsManager.java b/apps/routerconsole/java/src/net/i2p/router/news/NewsManager.java index 5fb8cb492..91290988c 100644 --- a/apps/routerconsole/java/src/net/i2p/router/news/NewsManager.java +++ b/apps/routerconsole/java/src/net/i2p/router/news/NewsManager.java @@ -57,6 +57,8 @@ public class NewsManager implements RouterApp { if (!_currentNews.isEmpty()) return new ArrayList(_currentNews); // load old news.xml + if (_log.shouldWarn()) + _log.warn("no real XML, falling back to news.xml"); List rv = parseOldNews(); if (!rv.isEmpty()) { _currentNews = rv; @@ -65,6 +67,8 @@ public class NewsManager implements RouterApp { } // load and translate initialnews // We don't save it to _currentNews, as the language may change + if (_log.shouldWarn()) + _log.warn("no news.xml, falling back to initialNews"); return parseInitialNews(); } @@ -112,6 +116,8 @@ public class NewsManager implements RouterApp { public synchronized void startup() { changeState(STARTING); _currentNews = PersistNews.load(_context); + if (_log.shouldWarn()) + _log.warn("Initialized with " + _currentNews.size() + " entries"); changeState(RUNNING); if (_cmgr != null) _cmgr.register(this); diff --git a/apps/routerconsole/java/src/net/i2p/router/news/PersistNews.java b/apps/routerconsole/java/src/net/i2p/router/news/PersistNews.java index 96b8e062f..47fb63e4a 100644 --- a/apps/routerconsole/java/src/net/i2p/router/news/PersistNews.java +++ b/apps/routerconsole/java/src/net/i2p/router/news/PersistNews.java @@ -33,7 +33,7 @@ import org.cybergarage.xml.ParserException; * * @since 0.9.23 */ -public class PersistNews { +class PersistNews { private static final String DIR = "docs/news"; private static final String PFX = "news-"; diff --git a/apps/routerconsole/java/src/net/i2p/router/web/NewsFeedHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/NewsFeedHelper.java new file mode 100644 index 000000000..a70d0061d --- /dev/null +++ b/apps/routerconsole/java/src/net/i2p/router/web/NewsFeedHelper.java @@ -0,0 +1,81 @@ +package net.i2p.router.web; + +import java.text.DateFormat; +import java.util.Collections; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; + +import net.i2p.I2PAppContext; +import net.i2p.app.ClientAppManager; +import net.i2p.router.news.NewsEntry; +import net.i2p.router.news.NewsManager; + + +/** + * HTML-formatted full news entries + * + * @since 0.9.23 + */ +public class NewsFeedHelper extends HelperBase { + + private int _start = 0; + private int _limit = 3; + + /** + * @param limit less than or equal to zero means all + */ + public void setLimit(int limit) { + _limit = limit; + } + + public void setStart(int start) { + _start = start; + } + + public String getEntries() { + return getEntries(_context, _start, _limit); + } + + /** + * @param max less than or equal to zero means all + * @return non-null, "" if none + */ + static String getEntries(I2PAppContext ctx, int start, int max) { + if (max <= 0) + max = Integer.MAX_VALUE; + StringBuilder buf = new StringBuilder(512); + List entries = Collections.emptyList(); + ClientAppManager cmgr = ctx.clientAppManager(); + if (cmgr != null) { + NewsManager nmgr = (NewsManager) cmgr.getRegisteredApp(NewsManager.APP_NAME); + if (nmgr != null) + entries = nmgr.getEntries(); + } + if (!entries.isEmpty()) { + DateFormat fmt = DateFormat.getDateInstance(DateFormat.SHORT); + // the router sets the JVM time zone to UTC but saves the original here so we can get it + String systemTimeZone = ctx.getProperty("i2p.systemTimeZone"); + if (systemTimeZone != null) + fmt.setTimeZone(TimeZone.getTimeZone(systemTimeZone)); + int i = 0; + for (NewsEntry entry : entries) { + if (i++ < start) + continue; + buf.append("

"); + if (entry.updated > 0) { + Date date = new Date(entry.updated); + buf.append(fmt.format(date)) + .append(": "); + } + buf.append(entry.title) + .append("

\n") + .append(entry.content) + .append("\n"); + if (i >= start + max) + break; + } + } + return buf.toString(); + } +} diff --git a/apps/routerconsole/jsp/news.jsp b/apps/routerconsole/jsp/news.jsp new file mode 100644 index 000000000..7629083bd --- /dev/null +++ b/apps/routerconsole/jsp/news.jsp @@ -0,0 +1,18 @@ +<%@page contentType="text/html"%> +<%@page pageEncoding="UTF-8"%> + + + +<%@include file="css.jsi" %> +<%=intl.title("News")%> + +<%@include file="summaryajax.jsi" %> + +<%@include file="summary.jsi" %> +

<%=intl._("Latest News")%>

+
+ +" /> +<% feedHelper.setLimit(0); %> + +
From addc9c5ca339172618c1089a570c176d3906c645 Mon Sep 17 00:00:00 2001 From: zzz Date: Tue, 15 Sep 2015 13:33:29 +0000 Subject: [PATCH 022/111] News: connect it all together (ticket #1425): - Enable new NewsManager to load/store feed items on disk by UUID - News items are stored forever, not lost when they are removed from feed - News read in once at startup, not at every summary bar refresh - Convert old initialNews.xml and news.xml to NewsEntry format - Limit display to 2 news items in summary bar, /home and /console - New /news page to show all news --- .../src/net/i2p/router/news/NewsManager.java | 49 ++++++++++-- .../net/i2p/router/news/NewsXMLParser.java | 11 ++- .../src/net/i2p/router/news/PersistNews.java | 4 +- .../net/i2p/router/update/NewsFetcher.java | 17 ++++- .../net/i2p/router/web/NewsFeedHelper.java | 8 +- .../src/net/i2p/router/web/NewsHelper.java | 32 ++------ .../i2p/router/web/RouterConsoleRunner.java | 5 +- .../i2p/router/web/SummaryBarRenderer.java | 74 ++++++++++--------- apps/routerconsole/jsp/news.jsp | 3 +- history.txt | 6 ++ .../src/net/i2p/router/RouterVersion.java | 2 +- 11 files changed, 130 insertions(+), 81 deletions(-) diff --git a/apps/routerconsole/java/src/net/i2p/router/news/NewsManager.java b/apps/routerconsole/java/src/net/i2p/router/news/NewsManager.java index 91290988c..781449ac9 100644 --- a/apps/routerconsole/java/src/net/i2p/router/news/NewsManager.java +++ b/apps/routerconsole/java/src/net/i2p/router/news/NewsManager.java @@ -4,10 +4,13 @@ import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.Reader; +import java.text.DateFormat; +import java.text.ParseException; import java.util.ArrayList; import java.util.Collections; import java.util.Date; import java.util.List; +import java.util.TimeZone; import net.i2p.I2PAppContext; import net.i2p.app.ClientAppManager; @@ -34,7 +37,13 @@ public class NewsManager implements RouterApp { private final ClientAppManager _cmgr; private volatile ClientAppState _state = UNINITIALIZED; private List _currentNews; - private NewsMetadata _currentMetadata; + // TODO + // Metadata is persisted in the old news.xml format by + // NewsFetcher.outputOldNewsXML() and read in at startup by + // ConsoleUpdateManager.startup() and NewsFetcher.checkForUpdates(). + // While running, the UpdateManager keeps the metadata. + // NewsHelper looks at the news.xml timestamp. + //private NewsMetadata _currentMetadata; public static final String APP_NAME = "news"; private static final String BUNDLE_NAME = "net.i2p.router.news.messages"; @@ -93,10 +102,13 @@ public class NewsManager implements RouterApp { String id = e.id; if (id == null) continue; + String title = e.title; boolean found = false; for (int i = 0; i < _currentNews.size(); i++) { NewsEntry old = _currentNews.get(i); - if (id.equals(old.id)) { + // try to prevent dups with those created from old news.xml, + // where the UUID is the title + if (id.equals(old.id) || (title != null && title.equals(old.id))) { _currentNews.set(i, e); found = true; break; @@ -156,7 +168,7 @@ public class NewsManager implements RouterApp { String newsContent = FileUtil.readTextFile(file.toString(), -1, true); if (newsContent == null || newsContent.equals("")) return Collections.emptyList(); - return parseNews(newsContent); + return parseNews(newsContent, false); } private List parseInitialNews() { @@ -171,7 +183,7 @@ public class NewsManager implements RouterApp { while((len = reader.read(buf)) > 0) { out.append(buf, 0, len); } - List rv = parseNews(out.toString()); + List rv = parseNews(out.toString(), true); if (!rv.isEmpty()) { rv.get(0).updated = RFC3339Date.parse3339Date("2015-01-01"); } else { @@ -191,7 +203,12 @@ public class NewsManager implements RouterApp { } } - private List parseNews(String newsContent) { + /** + * Used for initialNews.xml and news.xml + * + * @param addMissingDiv true for initialNews, false for news.xml + */ + private List parseNews(String newsContent, boolean addMissingDiv) { List rv = new ArrayList(); // Parse news content for headings. boolean foundEntry = false; @@ -205,10 +222,28 @@ public class NewsManager implements RouterApp { if (newsContent.length() > start + 16 && newsContent.substring(start + 4, start + 6).equals("20") && newsContent.substring(start + 14, start + 16).equals(": ")) { + // initialNews.xml, or old news.xml from server entry.updated = RFC3339Date.parse3339Date(newsContent.substring(start + 4, start + 14)); newsContent = newsContent.substring(start+16); } else { newsContent = newsContent.substring(start+4); + int colon = newsContent.indexOf(": "); + if (colon > 0 && colon <= 10) { + // Parse the format we wrote it out in, in NewsFetcher.outputOldNewsXML() + // Doesn't work if the date has a : in it, but SHORT hopefully does not + DateFormat fmt = DateFormat.getDateInstance(DateFormat.SHORT); + // the router sets the JVM time zone to UTC but saves the original here so we can get it + String systemTimeZone = _context.getProperty("i2p.systemTimeZone"); + if (systemTimeZone != null) + fmt.setTimeZone(TimeZone.getTimeZone(systemTimeZone)); + try { + Date date = fmt.parse(newsContent.substring(0, colon)); + entry.updated = date.getTime(); + newsContent = newsContent.substring(colon + 2); + } catch (ParseException pe) { + // can't find date, will be zero + } + } } int end = newsContent.indexOf("

"); if (end >= 0) { @@ -222,6 +257,10 @@ public class NewsManager implements RouterApp { entry.content = newsContent.substring(0, end); else entry.content = newsContent; + // initialNews.xml has the
before the

, not after, so we lose it... + // add it back. + if (addMissingDiv) + entry.content = "
\n" + entry.content; rv.add(entry); start = end; } diff --git a/apps/routerconsole/java/src/net/i2p/router/news/NewsXMLParser.java b/apps/routerconsole/java/src/net/i2p/router/news/NewsXMLParser.java index 8850cb141..20d8746c7 100644 --- a/apps/routerconsole/java/src/net/i2p/router/news/NewsXMLParser.java +++ b/apps/routerconsole/java/src/net/i2p/router/news/NewsXMLParser.java @@ -97,10 +97,11 @@ public class NewsXMLParser { * * @param file XML content only. Any su3 or gunzip handling must have * already happened. + * @return the root node * @throws IOException on any parse error */ - public void parse(File file) throws IOException { - parse(new BufferedInputStream(new FileInputStream(file))); + public Node parse(File file) throws IOException { + return parse(new BufferedInputStream(new FileInputStream(file))); } /** @@ -108,15 +109,17 @@ public class NewsXMLParser { * * @param in XML content only. Any su3 or gunzip handling must have * already happened. + * @return the root node * @throws IOException on any parse error */ - public void parse(InputStream in) throws IOException { + public Node parse(InputStream in) throws IOException { _entries = null; _metadata = null; XMLParser parser = new XMLParser(_context); try { Node root = parser.parse(in); extract(root); + return root; } catch (ParserException pe) { throw new I2PParserException(pe); } @@ -352,7 +355,7 @@ public class NewsXMLParser { * * @return non-null */ - static List getNodes(Node node, String name) { + public static List getNodes(Node node, String name) { List rv = new ArrayList(); int count = node.getNNodes(); for (int i = 0; i < count; i++) { diff --git a/apps/routerconsole/java/src/net/i2p/router/news/PersistNews.java b/apps/routerconsole/java/src/net/i2p/router/news/PersistNews.java index 47fb63e4a..65e17c6bc 100644 --- a/apps/routerconsole/java/src/net/i2p/router/news/PersistNews.java +++ b/apps/routerconsole/java/src/net/i2p/router/news/PersistNews.java @@ -35,7 +35,7 @@ import org.cybergarage.xml.ParserException; */ class PersistNews { - private static final String DIR = "docs/news"; + private static final String DIR = "docs/feed/news"; private static final String PFX = "news-"; private static final String SFX = ".xml.gz"; private static final String XML_START = "\n"; @@ -207,6 +207,8 @@ class PersistNews { } /** + * Unused for now, as we don't have any way to remember it's deleted. + * * @return success */ public static boolean delete(I2PAppContext ctx, NewsEntry entry) { diff --git a/apps/routerconsole/java/src/net/i2p/router/update/NewsFetcher.java b/apps/routerconsole/java/src/net/i2p/router/update/NewsFetcher.java index 19d878908..44ab24e3c 100644 --- a/apps/routerconsole/java/src/net/i2p/router/update/NewsFetcher.java +++ b/apps/routerconsole/java/src/net/i2p/router/update/NewsFetcher.java @@ -21,12 +21,14 @@ import java.util.Map; import java.util.StringTokenizer; import java.util.TimeZone; +import net.i2p.app.ClientAppManager; import net.i2p.crypto.SU3File; import net.i2p.crypto.TrustedUpdate; import net.i2p.data.DataHelper; import net.i2p.router.RouterContext; import net.i2p.router.RouterVersion; import net.i2p.router.news.NewsEntry; +import net.i2p.router.news.NewsManager; import net.i2p.router.news.NewsMetadata; import net.i2p.router.news.NewsXMLParser; import net.i2p.router.util.RFC822Date; @@ -45,6 +47,8 @@ import net.i2p.util.SSLEepGet; import net.i2p.util.Translate; import net.i2p.util.VersionComparator; +import org.cybergarage.xml.Node; + /** * Task to fetch updates to the news.xml, and to keep * track of whether that has an announcement for a new version. @@ -475,10 +479,21 @@ class NewsFetcher extends UpdateRunner { xml = to1; } NewsXMLParser parser = new NewsXMLParser(_context); - parser.parse(xml); + Node root = parser.parse(xml); xml.delete(); NewsMetadata data = parser.getMetadata(); List entries = parser.getEntries(); + // add entries to the news manager + ClientAppManager cmgr = _context.clientAppManager(); + if (cmgr != null) { + NewsManager nmgr = (NewsManager) cmgr.getRegisteredApp(NewsManager.APP_NAME); + if (nmgr != null) { + nmgr.addEntries(entries); + List nodes = NewsXMLParser.getNodes(root, "entry"); + nmgr.storeEntries(nodes); + } + } + // store entries and metadata in old news.xml format String sudVersion = su3.getVersionString(); String signingKeyName = su3.getSignerString(); File to3 = new File(_context.getTempDir(), "tmp3-" + _context.random().nextInt() + ".xml"); diff --git a/apps/routerconsole/java/src/net/i2p/router/web/NewsFeedHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/NewsFeedHelper.java index a70d0061d..7a9adae76 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/NewsFeedHelper.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/NewsFeedHelper.java @@ -20,7 +20,7 @@ import net.i2p.router.news.NewsManager; public class NewsFeedHelper extends HelperBase { private int _start = 0; - private int _limit = 3; + private int _limit = 2; /** * @param limit less than or equal to zero means all @@ -62,16 +62,16 @@ public class NewsFeedHelper extends HelperBase { for (NewsEntry entry : entries) { if (i++ < start) continue; - buf.append("

"); + buf.append("

"); if (entry.updated > 0) { Date date = new Date(entry.updated); buf.append(fmt.format(date)) .append(": "); } buf.append(entry.title) - .append("

\n") + .append("

\n
\n") .append(entry.content) - .append("\n"); + .append("\n
\n"); if (i >= start + max) break; } diff --git a/apps/routerconsole/java/src/net/i2p/router/web/NewsHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/NewsHelper.java index be3b5685b..5b068f4b1 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/NewsHelper.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/NewsHelper.java @@ -204,37 +204,12 @@ public class NewsHelper extends ContentHelper { return mgr.getStatus(); } - private static final String BUNDLE_NAME = "net.i2p.router.news.messages"; - /** * If we haven't downloaded news yet, use the translated initial news file */ @Override public String getContent() { - File news = new File(_page); - if (!news.exists()) { - _page = (new File(_context.getBaseDir(), "docs/initialNews/initialNews.xml")).getAbsolutePath(); - // don't use super, translate on-the-fly - Reader reader = null; - try { - char[] buf = new char[512]; - StringBuilder out = new StringBuilder(2048); - reader = new TranslateReader(_context, BUNDLE_NAME, new FileInputStream(_page)); - int len; - while((len = reader.read(buf)) > 0) { - out.append(buf, 0, len); - } - return out.toString(); - } catch (IOException ioe) { - return ""; - } finally { - try { - if (reader != null) - reader.close(); - } catch (IOException foo) {} - } - } - return super.getContent(); + return NewsFeedHelper.getEntries(_context, 0, 2); } /** @@ -312,7 +287,10 @@ public class NewsHelper extends ContentHelper { buf.append("
") .append(Messages.getString("Show news", ctx)); } - buf.append(""); + buf.append("" + + " - ") + .append(Messages.getString("Show all news", ctx)) + .append(""); } return buf.toString(); } diff --git a/apps/routerconsole/java/src/net/i2p/router/web/RouterConsoleRunner.java b/apps/routerconsole/java/src/net/i2p/router/web/RouterConsoleRunner.java index 0c36391dd..35e96b6ea 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/RouterConsoleRunner.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/RouterConsoleRunner.java @@ -26,8 +26,9 @@ import net.i2p.crypto.KeyStoreUtil; import net.i2p.data.DataHelper; import net.i2p.jetty.I2PLogger; import net.i2p.router.RouterContext; -import net.i2p.router.update.ConsoleUpdateManager; import net.i2p.router.app.RouterApp; +import net.i2p.router.news.NewsManager; +import net.i2p.router.update.ConsoleUpdateManager; import net.i2p.util.Addresses; import net.i2p.util.FileUtil; import net.i2p.util.I2PAppThread; @@ -706,6 +707,8 @@ public class RouterConsoleRunner implements RouterApp { ConsoleUpdateManager um = new ConsoleUpdateManager(_context, _mgr, null); um.start(); + NewsManager nm = new NewsManager(_context, _mgr, null); + nm.startup(); if (PluginStarter.pluginsEnabled(_context)) { t = new I2PAppThread(new PluginStarter(_context), "PluginStarter", true); diff --git a/apps/routerconsole/java/src/net/i2p/router/web/SummaryBarRenderer.java b/apps/routerconsole/java/src/net/i2p/router/web/SummaryBarRenderer.java index 1dd724e95..9f79dbfc7 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/SummaryBarRenderer.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/SummaryBarRenderer.java @@ -3,14 +3,20 @@ package net.i2p.router.web; import java.io.File; import java.io.IOException; import java.io.Writer; +import java.text.DateFormat; import java.util.Collections; +import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.TimeZone; +import net.i2p.app.ClientAppManager; import net.i2p.crypto.SigType; import net.i2p.data.DataHelper; import net.i2p.router.RouterContext; +import net.i2p.router.news.NewsEntry; +import net.i2p.router.news.NewsManager; import net.i2p.util.PortMapper; /** @@ -604,49 +610,45 @@ public class SummaryBarRenderer { String consoleNonce = CSSHelper.getNonce(); if (consoleNonce != null) { // Set up title and pre-headings stuff. - buf.append("

") + //buf.append("

") + buf.append("

") .append(_("News & Updates")) .append("


\n"); // Get news content. - String newsContent = newshelper.getContent(); - if (newsContent != "") { + List entries = Collections.emptyList(); + ClientAppManager cmgr = _context.clientAppManager(); + if (cmgr != null) { + NewsManager nmgr = (NewsManager) cmgr.getRegisteredApp(NewsManager.APP_NAME); + if (nmgr != null) + entries = nmgr.getEntries(); + } + if (!entries.isEmpty()) { buf.append("
    \n"); - // Parse news content for headings. - boolean foundEntry = false; - int start = newsContent.indexOf("

    "); - while (start >= 0) { - // Add offset to start: - // 4 - gets rid of

    - // 16 - gets rid of the date as well (assuming form "

    yyyy-mm-dd: Foobarbaz...") - // Don't truncate the "congratulations" in initial news - if (newsContent.length() > start + 16 && - newsContent.substring(start + 4, start + 6).equals("20") && - newsContent.substring(start + 14, start + 16).equals(": ")) - newsContent = newsContent.substring(start+16, newsContent.length()); - else - newsContent = newsContent.substring(start+4, newsContent.length()); - int end = newsContent.indexOf("

    "); - if (end >= 0) { - String heading = newsContent.substring(0, end); - buf.append("
  • ") - .append(heading) - .append("
  • \n"); - foundEntry = true; + DateFormat fmt = DateFormat.getDateInstance(DateFormat.SHORT); + // the router sets the JVM time zone to UTC but saves the original here so we can get it + String systemTimeZone = _context.getProperty("i2p.systemTimeZone"); + if (systemTimeZone != null) + fmt.setTimeZone(TimeZone.getTimeZone(systemTimeZone)); + int i = 0; + final int max = 2; + for (NewsEntry entry : entries) { + buf.append("
  • "); + if (entry.updated > 0) { + Date date = new Date(entry.updated); + buf.append(fmt.format(date)) + .append(": "); } - start = newsContent.indexOf("

    "); + buf.append(entry.title) + .append("

  • \n"); + if (++i >= max) + break; } buf.append("
\n"); - // Set up string containing to show news. - String requestURI = _helper.getRequestURI(); - if (requestURI.contains("/home") && !foundEntry) { - buf.append("") - .append(_("Show news")) - .append("\n"); - } + //buf.append("") + // .append(_("Show all news")) + // .append("\n"); } else { buf.append("
") .append(_("none")) diff --git a/apps/routerconsole/jsp/news.jsp b/apps/routerconsole/jsp/news.jsp index 7629083bd..422c8b48f 100644 --- a/apps/routerconsole/jsp/news.jsp +++ b/apps/routerconsole/jsp/news.jsp @@ -14,5 +14,6 @@ " /> <% feedHelper.setLimit(0); %> +
-
+

diff --git a/history.txt b/history.txt index 94a5475e4..5b8cecb7d 100644 --- a/history.txt +++ b/history.txt @@ -1,3 +1,9 @@ +2015-09-15 zzz + * Console: + - Store news feed items separately on disk in XML, like a real feed reader + - Limit display to 2 news items in summary bar, /home and /console + - New /news page to show all news (ticket #1425) + * 2015-09-12 0.9.22 released 2015-09-11 kytv diff --git a/router/java/src/net/i2p/router/RouterVersion.java b/router/java/src/net/i2p/router/RouterVersion.java index 87e5bffca..282c18b42 100644 --- a/router/java/src/net/i2p/router/RouterVersion.java +++ b/router/java/src/net/i2p/router/RouterVersion.java @@ -18,7 +18,7 @@ public class RouterVersion { /** deprecated */ public final static String ID = "Monotone"; public final static String VERSION = CoreVersion.VERSION; - public final static long BUILD = 1; + public final static long BUILD = 2; /** for example "-test" */ public final static String EXTRA = ""; From 37597b8c7de6882a4aff149202b40bb7ba8e66dc Mon Sep 17 00:00:00 2001 From: zzz Date: Wed, 16 Sep 2015 14:21:02 +0000 Subject: [PATCH 023/111] Build: - Include geoip in update files for next release - Add created-by string to release torrents i2psnark: - Store torrent added and completed times in config files, display on details page - Display dates on details page in local time zone - Add metainfo creation command line support for created-by string --- .../java/src/org/klomp/snark/MetaInfo.java | 5 ++- .../src/org/klomp/snark/SnarkManager.java | 33 +++++++++++++-- .../java/src/org/klomp/snark/Storage.java | 42 ++++++++++++++++--- .../org/klomp/snark/web/I2PSnarkServlet.java | 30 +++++++++++-- build.xml | 9 +++- 5 files changed, 103 insertions(+), 16 deletions(-) diff --git a/apps/i2psnark/java/src/org/klomp/snark/MetaInfo.java b/apps/i2psnark/java/src/org/klomp/snark/MetaInfo.java index 543753331..a40a68f8d 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/MetaInfo.java +++ b/apps/i2psnark/java/src/org/klomp/snark/MetaInfo.java @@ -74,10 +74,11 @@ public class MetaInfo * @param files null for single-file torrent * @param lengths null for single-file torrent * @param announce_list may be null + * @param created_by may be null */ MetaInfo(String announce, String name, String name_utf8, List> files, List lengths, int piece_length, byte[] piece_hashes, long length, boolean privateTorrent, - List> announce_list) + List> announce_list, String created_by) { this.announce = announce; this.name = name; @@ -91,7 +92,7 @@ public class MetaInfo this.privateTorrent = privateTorrent; this.announce_list = announce_list; this.comment = null; - this.created_by = null; + this.created_by = created_by; this.creation_date = I2PAppContext.getGlobalContext().clock().now(); // TODO if we add a parameter for other keys diff --git a/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java b/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java index 7d64813e5..0552f9c67 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java +++ b/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java @@ -96,6 +96,8 @@ public class SnarkManager implements CompleteListener { private static final String PROP_META_PRIORITY = "priority"; private static final String PROP_META_PRESERVE_NAMES = "preserveFileNames"; private static final String PROP_META_UPLOADED = "uploaded"; + private static final String PROP_META_ADDED = "added"; + private static final String PROP_META_COMPLETED = "completed"; //private static final String PROP_META_BITFIELD_SUFFIX = ".bitfield"; //private static final String PROP_META_PRIORITY_SUFFIX = ".priority"; private static final String PROP_META_MAGNET_PREFIX = "i2psnark.magnet."; @@ -1623,6 +1625,25 @@ public class SnarkManager implements CompleteListener { } return 0; } + + /** + * Get setting for a torrent from the config file. + * @return non-null, rv[0] is added time or 0; rv[1] is completed time or 0 + * @since 0.9.23 + */ + public long[] getSavedAddedAndCompleted(Snark snark) { + long[] rv = new long[2]; + Properties config = getConfig(snark); + if (config != null) { + try { + rv[0] = Long.parseLong(config.getProperty(PROP_META_ADDED)); + } catch (NumberFormatException nfe) {} + try { + rv[1] = Long.parseLong(config.getProperty(PROP_META_COMPLETED)); + } catch (NumberFormatException nfe) {} + } + return rv; + } /** * Save the completion status of a torrent and other data in the config file @@ -1661,19 +1682,25 @@ public class SnarkManager implements CompleteListener { private void locked_saveTorrentStatus(MetaInfo metainfo, BitField bitfield, int[] priorities, File base, boolean preserveNames, long uploaded, boolean stopped) { byte[] ih = metainfo.getInfoHash(); + Properties config = getConfig(ih); + String now = Long.toString(System.currentTimeMillis()); + config.setProperty(PROP_META_STAMP, now); + if (config.getProperty(PROP_META_ADDED) == null) + config.setProperty(PROP_META_ADDED, now); String bfs; if (bitfield.complete()) { bfs = "."; + if (config.getProperty(PROP_META_COMPLETED) == null) + config.setProperty(PROP_META_COMPLETED, now); } else { byte[] bf = bitfield.getFieldBytes(); bfs = Base64.encode(bf); + config.remove(PROP_META_COMPLETED); } - boolean running = !stopped; - Properties config = getConfig(ih); - config.setProperty(PROP_META_STAMP, Long.toString(System.currentTimeMillis())); config.setProperty(PROP_META_BITFIELD, bfs); config.setProperty(PROP_META_PRESERVE_NAMES, Boolean.toString(preserveNames)); config.setProperty(PROP_META_UPLOADED, Long.toString(uploaded)); + boolean running = !stopped; config.setProperty(PROP_META_RUNNING, Boolean.toString(running)); if (base != null) config.setProperty(PROP_META_BASE, base.getAbsolutePath()); diff --git a/apps/i2psnark/java/src/org/klomp/snark/Storage.java b/apps/i2psnark/java/src/org/klomp/snark/Storage.java index 1a4b1fb4c..3156cf497 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/Storage.java +++ b/apps/i2psnark/java/src/org/klomp/snark/Storage.java @@ -39,6 +39,8 @@ import java.util.TreeSet; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.atomic.AtomicInteger; +import gnu.getopt.Getopt; + import net.i2p.I2PAppContext; import net.i2p.crypto.SHA1; import net.i2p.data.ByteArray; @@ -123,10 +125,12 @@ public class Storage implements Closeable * * @param announce may be null * @param listener may be null + * @param created_by may be null * @throws IOException when creating and/or checking files fails. */ public Storage(I2PSnarkUtil util, File baseFile, String announce, List> announce_list, + String created_by, boolean privateTorrent, StorageListener listener) throws IOException { @@ -195,7 +199,7 @@ public class Storage implements Closeable byte[] piece_hashes = fast_digestCreate(); metainfo = new MetaInfo(announce, baseFile.getName(), null, files, lengthsList, piece_size, piece_hashes, total, privateTorrent, - announce_list); + announce_list, created_by); } @@ -1373,18 +1377,44 @@ public class Storage implements Closeable * @since 0.9.4 */ public static void main(String[] args) { - if (args.length < 1 || args.length > 2) { - System.err.println("Usage: Storage file-or-dir [announceURL]"); + boolean error = false; + String created_by = null; + String announce = null; + Getopt g = new Getopt("Storage", args, "a:c:"); + try { + int c; + while ((c = g.getopt()) != -1) { + switch (c) { + case 'a': + announce = g.getOptarg(); + break; + + case 'c': + created_by = g.getOptarg(); + break; + + case '?': + case ':': + default: + error = true; + break; + } // switch + } // while + } catch (Exception e) { + e.printStackTrace(); + error = true; + } + if (error || args.length - g.getOptind() != 1) { + System.err.println("Usage: Storage [-a announceURL] [-c created-by] file-or-dir"); System.exit(1); } - File base = new File(args[0]); - String announce = args.length == 2 ? args[1] : null; + File base = new File(args[g.getOptind()]); I2PAppContext ctx = I2PAppContext.getGlobalContext(); I2PSnarkUtil util = new I2PSnarkUtil(ctx); File file = null; FileOutputStream out = null; try { - Storage storage = new Storage(util, base, announce, null, false, null); + Storage storage = new Storage(util, base, announce, null, created_by, false, null); MetaInfo meta = storage.getMetaInfo(); file = new File(storage.getBaseName() + ".torrent"); out = new FileOutputStream(file); 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 4582bba68..f969687ca 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java +++ b/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java @@ -18,6 +18,7 @@ import java.util.List; import java.util.Locale; import java.util.Map; import java.util.Set; +import java.util.TimeZone; import java.util.TreeMap; import javax.servlet.ServletConfig; @@ -1230,7 +1231,7 @@ public class I2PSnarkServlet extends BasicServlet { // it shouldn't be THAT bad, so keep it in this thread. // TODO thread it for big torrents, perhaps a la FetchAndAdd boolean isPrivate = _manager.getPrivateTrackers().contains(announceURL); - Storage s = new Storage(_manager.util(), baseFile, announceURL, announceList, isPrivate, null); + Storage s = new Storage(_manager.util(), baseFile, announceURL, announceList, null, isPrivate, null); s.close(); // close the files... maybe need a way to pass this Storage to addTorrent rather than starting over MetaInfo info = s.getMetaInfo(); File torrentFile = new File(_manager.getDataDir(), s.getBaseName() + ".torrent"); @@ -2763,13 +2764,17 @@ public class I2PSnarkServlet extends BasicServlet { .append("\n"); } long dat = meta.getCreationDate(); + SimpleDateFormat fmt = new SimpleDateFormat("yyyy-MM-dd HH:mm"); + String systemTimeZone = _context.getProperty("i2p.systemTimeZone"); + if (systemTimeZone != null) + fmt.setTimeZone(TimeZone.getTimeZone(systemTimeZone)); if (dat > 0) { - String date = (new SimpleDateFormat("yyyy-MM-dd HH:mm")).format(new Date(dat)); + String date = fmt.format(new Date(dat)); buf.append(""); toThemeImg(buf, "details"); buf.append(" ") .append(_("Created")).append(": ") - .append(date).append(" UTC") + .append(date) .append("\n"); } String cby = meta.getCreatedBy(); @@ -2783,6 +2788,25 @@ public class I2PSnarkServlet extends BasicServlet { .append(DataHelper.stripHTML(cby)) .append("\n"); } + long[] dates = _manager.getSavedAddedAndCompleted(snark); + if (dates[0] > 0) { + String date = fmt.format(new Date(dates[0])); + buf.append(""); + toThemeImg(buf, "details"); + buf.append(" ") + .append(_("Added")).append(": ") + .append(date) + .append("\n"); + } + if (dates[1] > 0) { + String date = fmt.format(new Date(dates[1])); + buf.append(""); + toThemeImg(buf, "details"); + buf.append(" ") + .append(_("Completed")).append(": ") + .append(date) + .append("\n"); + } } if (meta == null || !meta.isPrivate()) { diff --git a/build.xml b/build.xml index 8190e4fa1..7d409ff1f 100644 --- a/build.xml +++ b/build.xml @@ -100,8 +100,11 @@ - + + + + @@ -1763,9 +1766,11 @@ since preppkg puts too much stuff in pkg-temp --> + + From 3d533a406dbe6fd27c41e9f9086661635ce91b51 Mon Sep 17 00:00:00 2001 From: zzz Date: Wed, 16 Sep 2015 16:42:24 +0000 Subject: [PATCH 024/111] News: - Fix retrieval of entry links from feed - Linkify entry headers --- .../java/src/net/i2p/router/news/NewsManager.java | 5 ++++- .../java/src/net/i2p/router/news/NewsXMLParser.java | 6 +++--- .../java/src/net/i2p/router/news/PersistNews.java | 8 +++++--- .../java/src/net/i2p/router/web/NewsFeedHelper.java | 9 +++++++-- 4 files changed, 19 insertions(+), 9 deletions(-) diff --git a/apps/routerconsole/java/src/net/i2p/router/news/NewsManager.java b/apps/routerconsole/java/src/net/i2p/router/news/NewsManager.java index 781449ac9..9f21bf93c 100644 --- a/apps/routerconsole/java/src/net/i2p/router/news/NewsManager.java +++ b/apps/routerconsole/java/src/net/i2p/router/news/NewsManager.java @@ -269,6 +269,7 @@ public class NewsManager implements RouterApp { return rv; } +/**** public static void main(String[] args) { if (args.length != 0) { System.err.println("Usage: NewsManager"); @@ -281,7 +282,9 @@ public class NewsManager implements RouterApp { System.out.println("Loaded " + entries.size() + " news entries"); for (int i = 0; i < entries.size(); i++) { NewsEntry e = entries.get(i); - System.out.println("\n****** News #" + (i+1) + ": " + e.title + ' ' + new Date(e.updated) + '\n' + e.content); + System.out.println("\n****** News #" + (i+1) + ": " + e.title + ' ' + new Date(e.updated) + + "\nLink: " + e.link + '\n' + e.content); } } +****/ } diff --git a/apps/routerconsole/java/src/net/i2p/router/news/NewsXMLParser.java b/apps/routerconsole/java/src/net/i2p/router/news/NewsXMLParser.java index 20d8746c7..5f35fa8c6 100644 --- a/apps/routerconsole/java/src/net/i2p/router/news/NewsXMLParser.java +++ b/apps/routerconsole/java/src/net/i2p/router/news/NewsXMLParser.java @@ -267,9 +267,9 @@ public class NewsXMLParser { } n = entry.getNode("link"); if (n != null) { - e.link = n.getValue(); - if (e.link != null) - e.link = e.link.trim(); + String a = n.getAttributeValue("href"); + if (a.length() > 0) + e.link = a.trim(); } n = entry.getNode("id"); if (n != null) { diff --git a/apps/routerconsole/java/src/net/i2p/router/news/PersistNews.java b/apps/routerconsole/java/src/net/i2p/router/news/PersistNews.java index 65e17c6bc..164b04422 100644 --- a/apps/routerconsole/java/src/net/i2p/router/news/PersistNews.java +++ b/apps/routerconsole/java/src/net/i2p/router/news/PersistNews.java @@ -155,9 +155,9 @@ class PersistNews { } n = entry.getNode("link"); if (n != null) { - e.link = n.getValue(); - if (e.link != null) - e.link = e.link.trim(); + String a = n.getAttributeValue("href"); + if (a.length() > 0) + e.link = a.trim(); } n = entry.getNode("id"); if (n != null) { @@ -231,6 +231,7 @@ class PersistNews { return PFX + Base64.encode(hash) + SFX; } +/**** public static void main(String[] args) { if (args.length != 1) { System.err.println("Usage: PersistNews file.xml"); @@ -262,4 +263,5 @@ class PersistNews { System.out.println("\n****** News #" + (i+1) + ": " + e.title + '\n' + e.content); } } +****/ } diff --git a/apps/routerconsole/java/src/net/i2p/router/web/NewsFeedHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/NewsFeedHelper.java index 7a9adae76..ef2e7ea37 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/NewsFeedHelper.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/NewsFeedHelper.java @@ -8,6 +8,7 @@ import java.util.TimeZone; import net.i2p.I2PAppContext; import net.i2p.app.ClientAppManager; +import net.i2p.data.DataHelper; import net.i2p.router.news.NewsEntry; import net.i2p.router.news.NewsManager; @@ -68,8 +69,12 @@ public class NewsFeedHelper extends HelperBase { buf.append(fmt.format(date)) .append(": "); } - buf.append(entry.title) - .append("

\n
\n") + if (entry.link != null) + buf.append(""); + buf.append(entry.title); + if (entry.link != null) + buf.append(""); + buf.append("\n
\n") .append(entry.content) .append("\n
\n"); if (i >= start + max) From 0f6176b7bf33b9196197fb01544906f76323b489 Mon Sep 17 00:00:00 2001 From: zzz Date: Wed, 16 Sep 2015 17:26:03 +0000 Subject: [PATCH 025/111] News: Add author to entry headers --- .../java/src/net/i2p/router/web/NewsFeedHelper.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/apps/routerconsole/java/src/net/i2p/router/web/NewsFeedHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/NewsFeedHelper.java index ef2e7ea37..1e4198ad0 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/NewsFeedHelper.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/NewsFeedHelper.java @@ -74,6 +74,11 @@ public class NewsFeedHelper extends HelperBase { buf.append(entry.title); if (entry.link != null) buf.append(""); + if (entry.authorName != null) { + buf.append(" (") + .append(Messages.getString("by {0}", DataHelper.escapeHTML(entry.authorName), ctx)) + .append(")\n"); + } buf.append("\n
\n") .append(entry.content) .append("\n
\n"); From 1de840ce59001fc9bca9da0deafd2245528f2c6d Mon Sep 17 00:00:00 2001 From: zzz Date: Wed, 16 Sep 2015 21:07:46 +0000 Subject: [PATCH 026/111] Profiles: Bias slightly away from floodfills --- history.txt | 9 +++++++++ .../java/src/net/i2p/router/RouterVersion.java | 2 +- .../router/peermanager/CapacityCalculator.java | 18 +++++++++++++++--- 3 files changed, 25 insertions(+), 4 deletions(-) diff --git a/history.txt b/history.txt index 5b8cecb7d..4d83ac343 100644 --- a/history.txt +++ b/history.txt @@ -1,3 +1,12 @@ +2015-09-16 zzz + * Build: + - Include geoip in update files for next release + - Add created-by string to release torrents + * i2psnark: + - Store torrent added and completed times in config files, display on details page + - Add metainfo creation command line support for created-by string + * Profiles: Bias slightly away from floodfills + 2015-09-15 zzz * Console: - Store news feed items separately on disk in XML, like a real feed reader diff --git a/router/java/src/net/i2p/router/RouterVersion.java b/router/java/src/net/i2p/router/RouterVersion.java index 282c18b42..0725033fa 100644 --- a/router/java/src/net/i2p/router/RouterVersion.java +++ b/router/java/src/net/i2p/router/RouterVersion.java @@ -18,7 +18,7 @@ public class RouterVersion { /** deprecated */ public final static String ID = "Monotone"; public final static String VERSION = CoreVersion.VERSION; - public final static long BUILD = 2; + public final static long BUILD = 3; /** for example "-test" */ public final static String EXTRA = ""; diff --git a/router/java/src/net/i2p/router/peermanager/CapacityCalculator.java b/router/java/src/net/i2p/router/peermanager/CapacityCalculator.java index 2c4a96c44..b67189e07 100644 --- a/router/java/src/net/i2p/router/peermanager/CapacityCalculator.java +++ b/router/java/src/net/i2p/router/peermanager/CapacityCalculator.java @@ -1,6 +1,8 @@ package net.i2p.router.peermanager; -import net.i2p.I2PAppContext; +import net.i2p.data.router.RouterInfo; +import net.i2p.router.RouterContext; +import net.i2p.router.networkdb.kademlia.FloodfillNetworkDatabaseFacade; import net.i2p.stat.Rate; import net.i2p.stat.RateAverages; import net.i2p.stat.RateStat; @@ -25,6 +27,9 @@ class CapacityCalculator { private static final double BONUS_SAME_COUNTRY = 0; private static final double BONUS_XOR = .25; private static final double PENALTY_UNREACHABLE = 2; + // we make this a bonus for non-ff, not a penalty for ff, so we + // don't drive the ffs below the default + private static final double BONUS_NON_FLOODFILL = 0.5; public static double calc(PeerProfile profile) { double capacity; @@ -54,7 +59,7 @@ class CapacityCalculator { // now take into account non-rejection tunnel rejections (which haven't // incremented the rejection counter, since they were only temporary) - I2PAppContext context = profile.getContext(); + RouterContext context = profile.getContext(); long now = context.clock().now(); if (profile.getTunnelHistory().getLastRejectedTransient() > now - 5*60*1000) capacity = 1; @@ -83,8 +88,15 @@ class CapacityCalculator { // penalize unreachable peers if (profile.wasUnreachable()) capacity -= PENALTY_UNREACHABLE; + + // credit non-floodfill to reduce conn limit issues at floodfills + // TODO only if we aren't floodfill ourselves? + RouterInfo ri = context.netDb().lookupRouterInfoLocally(profile.getPeer()); + if (!FloodfillNetworkDatabaseFacade.isFloodfill(ri)) + capacity += BONUS_NON_FLOODFILL; + // a tiny tweak to break ties and encourage closeness, -.25 to +.25 - capacity -= profile.getXORDistance() * (BONUS_XOR / 128); + capacity -= profile.getXORDistance() * (BONUS_XOR / 128); capacity += profile.getCapacityBonus(); if (capacity < 0) From d5a0d95c61e9d1b319fbe4c9108fea1cd34f9940 Mon Sep 17 00:00:00 2001 From: zzz Date: Thu, 17 Sep 2015 19:51:01 +0000 Subject: [PATCH 027/111] news appearance tweaks --- .../java/src/net/i2p/router/web/NewsFeedHelper.java | 5 +++-- installer/resources/themes/console/light/console.css | 8 ++++++-- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/apps/routerconsole/java/src/net/i2p/router/web/NewsFeedHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/NewsFeedHelper.java index 1e4198ad0..357887f9e 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/NewsFeedHelper.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/NewsFeedHelper.java @@ -66,8 +66,9 @@ public class NewsFeedHelper extends HelperBase { buf.append("

"); if (entry.updated > 0) { Date date = new Date(entry.updated); - buf.append(fmt.format(date)) - .append(": "); + buf.append("") + .append(fmt.format(date)) + .append(": "); } if (entry.link != null) buf.append(""); diff --git a/installer/resources/themes/console/light/console.css b/installer/resources/themes/console/light/console.css index 463b8e1df..24e34751e 100644 --- a/installer/resources/themes/console/light/console.css +++ b/installer/resources/themes/console/light/console.css @@ -250,8 +250,12 @@ div.newsheadings { div.newsheadings li { list-style: none outside url('images/newsbullet_mini.png'); - margin: 0 -4px 2px 8px; - line-height: 140%; + margin: 4px -4px 2px 10px; + line-height: 120%; +} + +div.newsheadings li:first-child { + margin-top: 0; } div.tunnels { From 84abfa01907e1e6470f65b7760ac2cc7f11dbc55 Mon Sep 17 00:00:00 2001 From: zzz Date: Thu, 17 Sep 2015 20:19:10 +0000 Subject: [PATCH 028/111] Store magnet parameters across restart (ticket #1485) --- .../src/org/klomp/snark/SnarkManager.java | 76 ++++++++++++++++--- history.txt | 4 + .../src/net/i2p/router/RouterVersion.java | 2 +- 3 files changed, 70 insertions(+), 12 deletions(-) diff --git a/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java b/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java index 0552f9c67..ccc331725 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java +++ b/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java @@ -98,6 +98,10 @@ public class SnarkManager implements CompleteListener { private static final String PROP_META_UPLOADED = "uploaded"; private static final String PROP_META_ADDED = "added"; private static final String PROP_META_COMPLETED = "completed"; + private static final String PROP_META_MAGNET = "magnet"; + private static final String PROP_META_MAGNET_DN = "magnet_dn"; + private static final String PROP_META_MAGNET_TR = "magnet_tr"; + private static final String PROP_META_MAGNET_DIR = "magnet_dir"; //private static final String PROP_META_BITFIELD_SUFFIX = ".bitfield"; //private static final String PROP_META_PRIORITY_SUFFIX = ".priority"; private static final String PROP_META_MAGNET_PREFIX = "i2psnark.magnet."; @@ -1357,7 +1361,7 @@ public class SnarkManager implements CompleteListener { // Tell the dir monitor not to delete us _magnets.add(name); if (updateStatus) - saveMagnetStatus(ih); + saveMagnetStatus(ih, dirPath, trackerURL, name); _snarks.put(name, torrent); } if (autoStart) { @@ -1668,6 +1672,7 @@ public class SnarkManager implements CompleteListener { * The status is either a bitfield converted to Base64 or "." for a completed * torrent to save space in the config file and in memory. * + * @param metainfo non-null * @param bitfield non-null * @param priorities may be null * @param base may be null @@ -1730,9 +1735,20 @@ public class SnarkManager implements CompleteListener { } else { config.remove(PROP_META_PRIORITY); } + // magnet properties, no longer apply, we have the metainfo + config.remove(PROP_META_MAGNET); + config.remove(PROP_META_MAGNET_DIR); + config.remove(PROP_META_MAGNET_DN); + config.remove(PROP_META_MAGNET_TR); // TODO save closest DHT nodes too + locked_saveTorrentStatus(ih, config); + } + /** + * @since 0.9.23 + */ + private void locked_saveTorrentStatus(byte[] ih, Properties config) { File conf = configFile(_configDir, ih); File subdir = conf.getParentFile(); if (!subdir.exists()) @@ -1823,14 +1839,38 @@ public class SnarkManager implements CompleteListener { } /** - * Just remember we have it + * Just remember we have it. + * This used to simply store a line in the config file, + * but now we also save it in its own config file, + * just like other torrents, so we can remember the directory, tracker, etc. + * + * @param dir may be null + * @param trackerURL may be null + * @param dn may be null * @since 0.8.4 */ - public void saveMagnetStatus(byte[] ih) { + public void saveMagnetStatus(byte[] ih, String dir, String trackerURL, String dn) { + // i2psnark.config file String infohash = Base64.encode(ih); infohash = infohash.replace('=', '$'); _config.setProperty(PROP_META_MAGNET_PREFIX + infohash, "."); - saveConfig(); + // its own config file + Properties config = new OrderedProperties(); + config.setProperty(PROP_META_MAGNET, "true"); + if (dir != null) + config.setProperty(PROP_META_MAGNET_DIR, dir); + if (trackerURL != null) + config.setProperty(PROP_META_MAGNET_TR, trackerURL); + if (dn != null) + config.setProperty(PROP_META_MAGNET_DN, dn); + String now = Long.toString(System.currentTimeMillis()); + config.setProperty(PROP_META_ADDED, now); + config.setProperty(PROP_META_STAMP, now); + // save + synchronized (_configLock) { + saveConfig(); + locked_saveTorrentStatus(ih, config); + } } /** @@ -1840,8 +1880,8 @@ public class SnarkManager implements CompleteListener { public void removeMagnetStatus(byte[] ih) { String infohash = Base64.encode(ih); infohash = infohash.replace('=', '$'); - _config.remove(PROP_META_MAGNET_PREFIX + infohash); - saveConfig(); + if (_config.remove(PROP_META_MAGNET_PREFIX + infohash) != null) + saveConfig(); } /** @@ -2109,21 +2149,35 @@ public class SnarkManager implements CompleteListener { /** * Add all magnets from the config file + * * @since 0.8.4 */ private void addMagnets() { - for (Object o : _config.keySet()) { - String k = (String) o; + boolean changed = false; + for (Iterator iter = _config.keySet().iterator(); iter.hasNext(); ) { + String k = (String) iter.next(); if (k.startsWith(PROP_META_MAGNET_PREFIX)) { String b64 = k.substring(PROP_META_MAGNET_PREFIX.length()); b64 = b64.replace('$', '='); byte[] ih = Base64.decode(b64); // ignore value - TODO put tracker URL in value - if (ih != null && ih.length == 20) - addMagnet(_("Magnet") + ' ' + I2PSnarkUtil.toHex(ih), ih, null, false); - // else remove from config? + if (ih != null && ih.length == 20) { + Properties config = getConfig(ih); + String name = config.getProperty(PROP_META_MAGNET_DN); + if (name == null) + name = _("Magnet") + ' ' + I2PSnarkUtil.toHex(ih); + String tracker = config.getProperty(PROP_META_MAGNET_TR); + String dir = config.getProperty(PROP_META_MAGNET_DIR); + File dirf = (dir != null) ? (new File(dir)) : null; + addMagnet(name, ih, tracker, false, dirf); + } else { + iter.remove(); + changed = true; + } } } + if (changed) + saveConfig(); } /** diff --git a/history.txt b/history.txt index 4d83ac343..03c584c55 100644 --- a/history.txt +++ b/history.txt @@ -1,3 +1,7 @@ +2015-09-17 zzz + * i2psnark: + - Store magnet parameters across restart (ticket #1485) + 2015-09-16 zzz * Build: - Include geoip in update files for next release diff --git a/router/java/src/net/i2p/router/RouterVersion.java b/router/java/src/net/i2p/router/RouterVersion.java index 0725033fa..f6e6df3a5 100644 --- a/router/java/src/net/i2p/router/RouterVersion.java +++ b/router/java/src/net/i2p/router/RouterVersion.java @@ -18,7 +18,7 @@ public class RouterVersion { /** deprecated */ public final static String ID = "Monotone"; public final static String VERSION = CoreVersion.VERSION; - public final static long BUILD = 3; + public final static long BUILD = 4; /** for example "-test" */ public final static String EXTRA = ""; From bfc6534b205f5489c4fb31e669a86f8cd117cef4 Mon Sep 17 00:00:00 2001 From: zzz Date: Thu, 17 Sep 2015 21:20:21 +0000 Subject: [PATCH 029/111] Don't delete torrent config file after error on initial startup (ticket #1658) --- .../src/org/klomp/snark/SnarkManager.java | 19 ++++++++++++++++--- history.txt | 1 + .../src/net/i2p/router/RouterVersion.java | 2 +- 3 files changed, 18 insertions(+), 4 deletions(-) diff --git a/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java b/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java index ccc331725..1e6f152a9 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java +++ b/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java @@ -1755,6 +1755,8 @@ public class SnarkManager implements CompleteListener { subdir.mkdirs(); try { DataHelper.storeProps(config, conf); + if (_log.shouldInfo()) + _log.info("Saved config to " + conf); } catch (IOException ioe) { _log.error("Unable to save the config to " + conf); } @@ -2013,13 +2015,15 @@ public class SnarkManager implements CompleteListener { File dir = getDataDir(); if (_log.shouldLog(Log.DEBUG)) _log.debug("Directory Monitor loop over " + dir.getAbsolutePath()); + boolean ok; try { // Don't let this interfere with .torrent files being added or deleted synchronized (_snarks) { - monitorTorrents(dir); + ok = monitorTorrents(dir); } } catch (Exception e) { _log.error("Error in the DirectoryMonitor", e); + ok = false; } if (doMagnets) { // first run only @@ -2033,7 +2037,11 @@ public class SnarkManager implements CompleteListener { addMessage(_("Up bandwidth limit is {0} KBps", _util.getMaxUpBW())); // To fix bug where files were left behind, // but also good for when user removes snarks when i2p is not running - cleanupTorrentStatus(); + // Don't run if there was an error, as we would delete the torrent config + // file(s) and we don't want to do that. We'll do the cleanup the next + // time i2psnark starts. See ticket #1658. + if (ok) + cleanupTorrentStatus(); } try { Thread.sleep(60*1000); } catch (InterruptedException ie) {} } @@ -2182,8 +2190,11 @@ public class SnarkManager implements CompleteListener { /** * caller must synchronize on _snarks + * + * @return success, false if an error adding any torrent. */ - private void monitorTorrents(File dir) { + private boolean monitorTorrents(File dir) { + boolean rv = true; String fileNames[] = dir.list(TorrentFilenameFilter.instance()); List foundNames = new ArrayList(0); if (fileNames != null) { @@ -2213,6 +2224,7 @@ public class SnarkManager implements CompleteListener { } catch (Exception e) { addMessage(_("Error: Could not add the torrent {0}", name) + ": " + e); _log.error("Unable to add the torrent " + name, e); + rv = false; } } } @@ -2233,6 +2245,7 @@ public class SnarkManager implements CompleteListener { } } } + return rv; } /** translate */ diff --git a/history.txt b/history.txt index 03c584c55..97cc89d69 100644 --- a/history.txt +++ b/history.txt @@ -1,6 +1,7 @@ 2015-09-17 zzz * i2psnark: - Store magnet parameters across restart (ticket #1485) + - Don't delete torrent config file after error on initial startup (ticket #1658) 2015-09-16 zzz * Build: diff --git a/router/java/src/net/i2p/router/RouterVersion.java b/router/java/src/net/i2p/router/RouterVersion.java index f6e6df3a5..4e28a2c8d 100644 --- a/router/java/src/net/i2p/router/RouterVersion.java +++ b/router/java/src/net/i2p/router/RouterVersion.java @@ -18,7 +18,7 @@ public class RouterVersion { /** deprecated */ public final static String ID = "Monotone"; public final static String VERSION = CoreVersion.VERSION; - public final static long BUILD = 4; + public final static long BUILD = 5; /** for example "-test" */ public final static String EXTRA = ""; From 64889b2bc26df11d7d3540f36cb4f31eeb7f2a4f Mon Sep 17 00:00:00 2001 From: zzz Date: Fri, 18 Sep 2015 14:36:49 +0000 Subject: [PATCH 030/111] Streaming: Move remaining timers from the context to streaming's SimpleTimer2; these were the ones migrated from SimpleScheduler earlier --- .../i2p/client/streaming/impl/Connection.java | 22 ++++++++++++++++--- .../streaming/impl/ConnectionHandler.java | 7 ++++-- .../streaming/impl/ConnectionManager.java | 6 ++--- .../impl/ConnectionPacketHandler.java | 2 +- .../client/streaming/impl/PacketQueue.java | 8 +++---- .../client/streaming/impl/SchedulerImpl.java | 2 +- 6 files changed, 33 insertions(+), 14 deletions(-) diff --git a/apps/streaming/java/src/net/i2p/client/streaming/impl/Connection.java b/apps/streaming/java/src/net/i2p/client/streaming/impl/Connection.java index 1d43a6cef..f5e93ddf0 100644 --- a/apps/streaming/java/src/net/i2p/client/streaming/impl/Connection.java +++ b/apps/streaming/java/src/net/i2p/client/streaming/impl/Connection.java @@ -793,7 +793,7 @@ class Connection { private boolean scheduleDisconnectEvent() { if (!_disconnectScheduledOn.compareAndSet(0, _context.clock().now())) return false; - _context.simpleTimer2().addEvent(new DisconnectEvent(), DISCONNECT_TIMEOUT); + schedule(new DisconnectEvent(), DISCONNECT_TIMEOUT); return true; } @@ -808,6 +808,24 @@ class Connection { } } + /** + * Called from SchedulerImpl + * + * @since 0.9.23 moved here so we can use our timer + */ + public void scheduleConnectionEvent(long msToWait) { + schedule(_connectionEvent, msToWait); + } + + /** + * Schedule something on our timer. + * + * @since 0.9.23 + */ + public void schedule(SimpleTimer.TimedEvent event, long msToWait) { + _timer.addEvent(event, msToWait); + } + private boolean _remotePeerSet = false; /** who are we talking with * @return peer Destination @@ -1254,8 +1272,6 @@ class Connection { return buf.toString(); } - public SimpleTimer.TimedEvent getConnectionEvent() { return _connectionEvent; } - /** * fired to reschedule event notification */ diff --git a/apps/streaming/java/src/net/i2p/client/streaming/impl/ConnectionHandler.java b/apps/streaming/java/src/net/i2p/client/streaming/impl/ConnectionHandler.java index c06ae4a82..b92648d0b 100644 --- a/apps/streaming/java/src/net/i2p/client/streaming/impl/ConnectionHandler.java +++ b/apps/streaming/java/src/net/i2p/client/streaming/impl/ConnectionHandler.java @@ -9,6 +9,7 @@ import net.i2p.I2PAppContext; import net.i2p.data.Destination; import net.i2p.util.Log; import net.i2p.util.SimpleTimer; +import net.i2p.util.SimpleTimer2; /** * Receive new connection attempts @@ -23,6 +24,7 @@ class ConnectionHandler { private final Log _log; private final ConnectionManager _manager; private final LinkedBlockingQueue _synQueue; + private final SimpleTimer2 _timer; private volatile boolean _active; private int _acceptTimeout; @@ -37,10 +39,11 @@ class ConnectionHandler { private static final int MAX_QUEUE_SIZE = 64; /** Creates a new instance of ConnectionHandler */ - public ConnectionHandler(I2PAppContext context, ConnectionManager mgr) { + public ConnectionHandler(I2PAppContext context, ConnectionManager mgr, SimpleTimer2 timer) { _context = context; _log = context.logManager().getLog(ConnectionHandler.class); _manager = mgr; + _timer = timer; _synQueue = new LinkedBlockingQueue(MAX_QUEUE_SIZE); _acceptTimeout = DEFAULT_ACCEPT_TIMEOUT; } @@ -96,7 +99,7 @@ class ConnectionHandler { // also check if expiration of the head is long past for overload detection with peek() ? boolean success = _synQueue.offer(packet); // fail immediately if full if (success) { - _context.simpleTimer2().addEvent(new TimeoutSyn(packet), _acceptTimeout); + _timer.addEvent(new TimeoutSyn(packet), _acceptTimeout); } else { if (_log.shouldLog(Log.WARN)) _log.warn("Dropping new SYN request, as the queue is full"); diff --git a/apps/streaming/java/src/net/i2p/client/streaming/impl/ConnectionManager.java b/apps/streaming/java/src/net/i2p/client/streaming/impl/ConnectionManager.java index c55c8a67d..be2bbed11 100644 --- a/apps/streaming/java/src/net/i2p/client/streaming/impl/ConnectionManager.java +++ b/apps/streaming/java/src/net/i2p/client/streaming/impl/ConnectionManager.java @@ -74,11 +74,11 @@ class ConnectionManager { _pendingPings = new ConcurrentHashMap(4); _messageHandler = new MessageHandler(_context, this); _packetHandler = new PacketHandler(_context, this); - _connectionHandler = new ConnectionHandler(_context, this); _schedulerChooser = new SchedulerChooser(_context); _conPacketHandler = new ConnectionPacketHandler(_context); _timer = new RetransmissionTimer(_context, "Streaming Timer " + session.getMyDestination().calculateHash().toBase64().substring(0, 4)); + _connectionHandler = new ConnectionHandler(_context, this, _timer); _tcbShare = new TCBShare(_context, _timer); // PROTO_ANY is for backward compatibility (pre-0.7.1) // TODO change proto to PROTO_STREAMING someday. @@ -88,7 +88,7 @@ class ConnectionManager { // As of 0.9.1, listen on configured port (default 0 = all) int protocol = defaultOptions.getEnforceProtocol() ? I2PSession.PROTO_STREAMING : I2PSession.PROTO_ANY; _session.addMuxedSessionListener(_messageHandler, protocol, defaultOptions.getLocalPort()); - _outboundQueue = new PacketQueue(_context); + _outboundQueue = new PacketQueue(_context, _timer); _recentlyClosed = new LHMCache(32); /** Socket timeout for accept() */ _soTimeout = -1; @@ -839,7 +839,7 @@ class ConnectionManager { private final PingNotifier _notifier; public PingFailed(Long id, PingNotifier notifier) { - super(_context.simpleTimer2()); + super(_timer); _id = id; _notifier = notifier; } diff --git a/apps/streaming/java/src/net/i2p/client/streaming/impl/ConnectionPacketHandler.java b/apps/streaming/java/src/net/i2p/client/streaming/impl/ConnectionPacketHandler.java index 51516c98d..f87b21e25 100644 --- a/apps/streaming/java/src/net/i2p/client/streaming/impl/ConnectionPacketHandler.java +++ b/apps/streaming/java/src/net/i2p/client/streaming/impl/ConnectionPacketHandler.java @@ -207,7 +207,7 @@ class ConnectionPacketHandler { final long delay = nextSendTime - now; if (_log.shouldLog(Log.INFO)) _log.info("scheduling ack in " + delay); - _context.simpleTimer2().addEvent(new AckDup(con), delay); + con.schedule(new AckDup(con), delay); } } else { diff --git a/apps/streaming/java/src/net/i2p/client/streaming/impl/PacketQueue.java b/apps/streaming/java/src/net/i2p/client/streaming/impl/PacketQueue.java index 34ab43939..943a0c03f 100644 --- a/apps/streaming/java/src/net/i2p/client/streaming/impl/PacketQueue.java +++ b/apps/streaming/java/src/net/i2p/client/streaming/impl/PacketQueue.java @@ -45,11 +45,11 @@ class PacketQueue implements SendMessageStatusListener, Closeable { private static final long REMOVE_EXPIRED_TIME = 67*1000; private static final boolean ENABLE_STATUS_LISTEN = true; - public PacketQueue(I2PAppContext context) { + public PacketQueue(I2PAppContext context, SimpleTimer2 timer) { _context = context; _log = context.logManager().getLog(PacketQueue.class); _messageStatusMap = new ConcurrentHashMap(16); - new RemoveExpired(); + new RemoveExpired(timer); // all createRateStats in ConnectionManager } @@ -328,8 +328,8 @@ class PacketQueue implements SendMessageStatusListener, Closeable { */ private class RemoveExpired extends SimpleTimer2.TimedEvent { - public RemoveExpired() { - super(_context.simpleTimer2(), REMOVE_EXPIRED_TIME); + public RemoveExpired(SimpleTimer2 timer) { + super(timer, REMOVE_EXPIRED_TIME); } public void timeReached() { diff --git a/apps/streaming/java/src/net/i2p/client/streaming/impl/SchedulerImpl.java b/apps/streaming/java/src/net/i2p/client/streaming/impl/SchedulerImpl.java index 41085a30d..bc54ba3c8 100644 --- a/apps/streaming/java/src/net/i2p/client/streaming/impl/SchedulerImpl.java +++ b/apps/streaming/java/src/net/i2p/client/streaming/impl/SchedulerImpl.java @@ -16,7 +16,7 @@ abstract class SchedulerImpl implements TaskScheduler { } protected void reschedule(long msToWait, Connection con) { - _context.simpleTimer2().addEvent(con.getConnectionEvent(), msToWait); + con.scheduleConnectionEvent(msToWait); } @Override From 1a385b6dca6051fd33aa158b3d4f05473cd9ddd2 Mon Sep 17 00:00:00 2001 From: zzz Date: Fri, 18 Sep 2015 18:15:32 +0000 Subject: [PATCH 031/111] i2ptunnel: - Pass Accept-Encoding header through HTTP client and server proxies, to allow end-to-end compression - Don't do transparent response compression if response Content-Encoding indicates it is already compressed - Minor encoding cleanups EepGet: - Send Accept-Encoding: gzip even when proxied - Minor cleanups --- .../i2ptunnel/HTTPResponseOutputStream.java | 24 ++++++++++++------- .../i2p/i2ptunnel/I2PTunnelHTTPClient.java | 8 ++++--- .../i2p/i2ptunnel/I2PTunnelHTTPServer.java | 23 +++++++++++------- core/java/src/net/i2p/util/EepGet.java | 15 ++++++------ 4 files changed, 42 insertions(+), 28 deletions(-) diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/HTTPResponseOutputStream.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/HTTPResponseOutputStream.java index 83fbb6d0a..2fc344a71 100644 --- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/HTTPResponseOutputStream.java +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/HTTPResponseOutputStream.java @@ -39,7 +39,10 @@ class HTTPResponseOutputStream extends FilterOutputStream { private final byte _buf1[]; protected boolean _gzip; protected long _dataExpected; + /** lower-case, trimmed */ protected String _contentType; + /** lower-case, trimmed */ + protected String _contentEncoding; private static final int CACHE_SIZE = 8*1024; private static final ByteCache _cache = ByteCache.getInstance(8, CACHE_SIZE); @@ -151,7 +154,7 @@ class HTTPResponseOutputStream extends FilterOutputStream { responseLine = (responseLine.trim() + "\r\n"); if (_log.shouldLog(Log.INFO)) _log.info("Response: " + responseLine.trim()); - out.write(responseLine.getBytes()); + out.write(DataHelper.getUTF8(responseLine)); } else { for (int j = lastEnd+1; j < i; j++) { if (_headerBuffer.getData()[j] == ':') { @@ -160,7 +163,7 @@ class HTTPResponseOutputStream extends FilterOutputStream { if ( (keyLen <= 0) || (valLen < 0) ) throw new IOException("Invalid header @ " + j); String key = DataHelper.getUTF8(_headerBuffer.getData(), lastEnd+1, keyLen); - String val = null; + String val; if (valLen == 0) val = ""; else @@ -171,10 +174,10 @@ class HTTPResponseOutputStream extends FilterOutputStream { String lcKey = key.toLowerCase(Locale.US); if ("connection".equals(lcKey)) { - out.write("Connection: close\r\n".getBytes()); + out.write(DataHelper.getASCII("Connection: close\r\n")); connectionSent = true; } else if ("proxy-connection".equals(lcKey)) { - out.write("Proxy-Connection: close\r\n".getBytes()); + out.write(DataHelper.getASCII("Proxy-Connection: close\r\n")); proxyConnectionSent = true; } else if ("content-encoding".equals(lcKey) && "x-i2p-gzip".equals(val.toLowerCase(Locale.US))) { _gzip = true; @@ -189,7 +192,10 @@ class HTTPResponseOutputStream extends FilterOutputStream { } catch (NumberFormatException nfe) {} } else if ("content-type".equals(lcKey)) { // save for compress decision on server side - _contentType = val; + _contentType = val.toLowerCase(Locale.US); + } else if ("content-encoding".equals(lcKey)) { + // save for compress decision on server side + _contentEncoding = val.toLowerCase(Locale.US); } else if ("set-cookie".equals(lcKey)) { String lcVal = val.toLowerCase(Locale.US); if (lcVal.contains("domain=b32.i2p") || @@ -203,7 +209,7 @@ class HTTPResponseOutputStream extends FilterOutputStream { break; } } - out.write((key.trim() + ": " + val.trim() + "\r\n").getBytes()); + out.write(DataHelper.getUTF8(key.trim() + ": " + val + "\r\n")); } break; } @@ -214,9 +220,9 @@ class HTTPResponseOutputStream extends FilterOutputStream { } if (!connectionSent) - out.write("Connection: close\r\n".getBytes()); + out.write(DataHelper.getASCII("Connection: close\r\n")); if (!proxyConnectionSent) - out.write("Proxy-Connection: close\r\n".getBytes()); + out.write(DataHelper.getASCII("Proxy-Connection: close\r\n")); finishHeaders(); @@ -237,7 +243,7 @@ class HTTPResponseOutputStream extends FilterOutputStream { protected boolean shouldCompress() { return _gzip; } protected void finishHeaders() throws IOException { - out.write("\r\n".getBytes()); // end of the headers + out.write(DataHelper.getASCII("\r\n")); // end of the headers } @Override diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java index 74fcaccb1..8645b686f 100644 --- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java @@ -881,7 +881,9 @@ public class I2PTunnelHTTPClient extends I2PTunnelHTTPClientBase implements Runn } else if(lowercaseLine.startsWith("accept")) { // strip the accept-blah headers, as they vary dramatically from // browser to browser - if(!Boolean.parseBoolean(getTunnel().getClientOptions().getProperty(PROP_ACCEPT))) { + // But allow Accept-Encoding: gzip, deflate + if(!lowercaseLine.startsWith("accept-encoding: ") && + !Boolean.parseBoolean(getTunnel().getClientOptions().getProperty(PROP_ACCEPT))) { line = null; continue; } @@ -933,8 +935,8 @@ public class I2PTunnelHTTPClient extends I2PTunnelHTTPClientBase implements Runn // according to rfc2616 s14.3, this *should* force identity, even if // an explicit q=0 for gzip doesn't. tested against orion.i2p, and it // seems to work. - if(!Boolean.parseBoolean(getTunnel().getClientOptions().getProperty(PROP_ACCEPT))) - newRequest.append("Accept-Encoding: \r\n"); + //if (!Boolean.parseBoolean(getTunnel().getClientOptions().getProperty(PROP_ACCEPT))) + // newRequest.append("Accept-Encoding: \r\n"); if (!usingInternalOutproxy) newRequest.append("X-Accept-Encoding: x-i2p-gzip;q=1.0, identity;q=0.5, deflate;q=0, gzip;q=0, *;q=0\r\n"); } diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPServer.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPServer.java index 6b3b41720..35dd6f132 100644 --- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPServer.java +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPServer.java @@ -419,12 +419,14 @@ public class I2PTunnelHTTPServer extends I2PTunnelServer { setEntry(headers, "Connection", "close"); // we keep the enc sent by the browser before clobbering it, since it may have // been x-i2p-gzip - String enc = getEntryOrNull(headers, "Accept-encoding"); - String altEnc = getEntryOrNull(headers, "X-Accept-encoding"); + String enc = getEntryOrNull(headers, "Accept-Encoding"); + String altEnc = getEntryOrNull(headers, "X-Accept-Encoding"); // according to rfc2616 s14.3, this *should* force identity, even if // "identity;q=1, *;q=0" didn't. - setEntry(headers, "Accept-encoding", ""); + // as of 0.9.23, the client passes this header through, and we do the same, + // so if the server and browser can do the compression/decompression, we don't have to + //setEntry(headers, "Accept-Encoding", ""); socket.setReadTimeout(readTimeout); Socket s = getSocket(socket.getPeerDestination().calculateHash(), socket.getLocalPort()); @@ -432,7 +434,7 @@ public class I2PTunnelHTTPServer extends I2PTunnelServer { // instead of i2ptunnelrunner, use something that reads the HTTP // request from the socket, modifies the headers, sends the request to the // server, reads the response headers, rewriting to include Content-encoding: x-i2p-gzip - // if it was one of the Accept-encoding: values, and gzip the payload + // if it was one of the Accept-Encoding: values, and gzip the payload boolean allowGZIP = true; String val = opts.getProperty("i2ptunnel.gzip"); if ( (val != null) && (!Boolean.parseBoolean(val)) ) @@ -443,7 +445,7 @@ public class I2PTunnelHTTPServer extends I2PTunnelServer { boolean useGZIP = alt || ( (enc != null) && (enc.indexOf("x-i2p-gzip") >= 0) ); // Don't pass this on, outproxies should strip so I2P traffic isn't so obvious but they probably don't if (alt) - headers.remove("X-Accept-encoding"); + headers.remove("X-Accept-Encoding"); String modifiedHeader = formatHeaders(headers, command); if (_log.shouldLog(Log.DEBUG)) @@ -671,6 +673,7 @@ public class I2PTunnelHTTPServer extends I2PTunnelServer { /** * Don't compress small responses or images. + * Don't compress things that are already compressed. * Compression is inline but decompression on the client side * creates a new thread. */ @@ -687,7 +690,11 @@ public class I2PTunnelHTTPServer extends I2PTunnelServer { (!_contentType.equals("application/x-bzip")) && (!_contentType.equals("application/x-bzip2")) && (!_contentType.equals("application/x-gzip")) && - (!_contentType.equals("application/zip")))); + (!_contentType.equals("application/zip")))) && + (_contentEncoding == null || + ((!_contentEncoding.equals("gzip")) && + (!_contentEncoding.equals("compress")) && + (!_contentEncoding.equals("deflate")))); } @Override @@ -877,9 +884,9 @@ public class I2PTunnelHTTPServer extends I2PTunnelServer { String lcName = name.toLowerCase(Locale.US); if ("accept-encoding".equals(lcName)) - name = "Accept-encoding"; + name = "Accept-Encoding"; else if ("x-accept-encoding".equals(lcName)) - name = "X-Accept-encoding"; + name = "X-Accept-Encoding"; else if ("x-forwarded-for".equals(lcName)) name = "X-Forwarded-For"; else if ("x-forwarded-server".equals(lcName)) diff --git a/core/java/src/net/i2p/util/EepGet.java b/core/java/src/net/i2p/util/EepGet.java index c31184dbd..a098a997a 100644 --- a/core/java/src/net/i2p/util/EepGet.java +++ b/core/java/src/net/i2p/util/EepGet.java @@ -755,6 +755,8 @@ public class EepGet { Thread pusher = null; _decompressException = null; if (_isGzippedResponse) { + if (_log.shouldInfo()) + _log.info("Gzipped response, starting decompressor"); PipedInputStream pi = BigPipedInputStream.getInstance(); PipedOutputStream po = new PipedOutputStream(pi); pusher = new I2PAppThread(new Gunzipper(pi, _out), "EepGet Decompressor"); @@ -1160,17 +1162,13 @@ public class EepGet { lookahead[1] = lookahead[2]; lookahead[2] = (byte)cur; } + private static boolean isEndOfHeaders(byte lookahead[]) { - byte first = lookahead[0]; - byte second = lookahead[1]; - byte third = lookahead[2]; - return (isNL(second) && isNL(third)) || // \n\n - (isNL(first) && isNL(third)); // \n\r\n + return lookahead[2] == NL && + (lookahead[0] == NL || lookahead[1] == NL); // \n\n or \n\r\n } - /** we ignore any potential \r, since we trim it on write anyway */ private static final byte NL = '\n'; - private static boolean isNL(byte b) { return (b == NL); } /** * @param timeout may be null @@ -1315,7 +1313,8 @@ public class EepGet { buf.append("Content-length: ").append(_postData.length()).append("\r\n"); // This will be replaced if we are going through I2PTunnelHTTPClient buf.append("Accept-Encoding: "); - if ((!_shouldProxy) && + // as of 0.9.23, the proxy passes the Accept-Encoding header through + if ( /* (!_shouldProxy) && */ // This is kindof a hack, but if we are downloading a gzip file // we don't want to transparently gunzip it and save it as a .gz file. (!path.endsWith(".gz")) && (!path.endsWith(".tgz"))) From ff420278c596baa11bb978651557a2e917693b1f Mon Sep 17 00:00:00 2001 From: zzz Date: Fri, 18 Sep 2015 20:08:40 +0000 Subject: [PATCH 032/111] only log once --- .../java/src/net/i2p/router/transport/udp/UDPTransport.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/router/java/src/net/i2p/router/transport/udp/UDPTransport.java b/router/java/src/net/i2p/router/transport/udp/UDPTransport.java index c616e5a82..d109cb099 100644 --- a/router/java/src/net/i2p/router/transport/udp/UDPTransport.java +++ b/router/java/src/net/i2p/router/transport/udp/UDPTransport.java @@ -86,6 +86,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority private final DHSessionKeyBuilder.Factory _dhFactory; private int _mtu; private int _mtu_ipv6; + private boolean _mismatchLogged; /** * Do we have a public IPv6 address? @@ -1229,10 +1230,12 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority _expireEvent.remove(oldPeer2); } - if (_log.shouldLog(Log.WARN) && _peersByIdent.size() != _peersByRemoteHost.size()) + if (_log.shouldLog(Log.WARN) && !_mismatchLogged && _peersByIdent.size() != _peersByRemoteHost.size()) { + _mismatchLogged = true; _log.warn("Size Mismatch after add: " + peer + " byIDsz = " + _peersByIdent.size() + " byHostsz = " + _peersByRemoteHost.size()); + } _activeThrottle.unchoke(peer.getRemotePeer()); markReachable(peer.getRemotePeer(), peer.isInbound()); From 83791b2d1065cc99b27ca48515d23b93250824e5 Mon Sep 17 00:00:00 2001 From: zzz Date: Fri, 18 Sep 2015 20:15:06 +0000 Subject: [PATCH 033/111] i2psnark: Don't display "Tracker Error" if torrent is stopped (ticket #1654) --- .../org/klomp/snark/web/I2PSnarkServlet.java | 21 ++++++++++--------- 1 file changed, 11 insertions(+), 10 deletions(-) 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 f969687ca..549ac435f 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java +++ b/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java @@ -1475,7 +1475,8 @@ public class I2PSnarkServlet extends BasicServlet { } else if (snark.isAllocating()) { statusString = toThemeImg("stalled", "", _("Allocating")) + "" + "" + _("Allocating"); - } else if (err != null && curPeers == 0) { + } else if (err != null && isRunning && curPeers == 0) { + //} else if (err != null && curPeers == 0) { // Also don't show if seeding... but then we won't see the not-registered error // && remaining != 0 && needed != 0) { // let's only show this if we have no peers, otherwise PEX and DHT should bail us out, user doesn't care @@ -1486,19 +1487,19 @@ public class I2PSnarkServlet extends BasicServlet { // curPeers + thinsp(noThinsp) + // ngettext("1 peer", "{0} peers", knownPeers) + ""; //else if (isRunning) - if (isRunning) + //if (isRunning) { statusString = toThemeImg("trackererror", "", err) + "" + "" + _("Tracker Error") + ": " + curPeers + thinsp(noThinsp) + ngettext("1 peer", "{0} peers", knownPeers); - else { - if (err.length() > MAX_DISPLAYED_ERROR_LENGTH) - err = DataHelper.escapeHTML(err.substring(0, MAX_DISPLAYED_ERROR_LENGTH)) + "…"; - else - err = DataHelper.escapeHTML(err); - statusString = toThemeImg("trackererror", "", err) + "" + - "" + _("Tracker Error"); - } + //} else { + // if (err.length() > MAX_DISPLAYED_ERROR_LENGTH) + // err = DataHelper.escapeHTML(err.substring(0, MAX_DISPLAYED_ERROR_LENGTH)) + "…"; + // else + // err = DataHelper.escapeHTML(err); + // statusString = toThemeImg("trackererror", "", err) + "" + + // "" + _("Tracker Error"); + //} } else if (snark.isStarting()) { statusString = toThemeImg("stalled", "", _("Starting")) + "" + "" + _("Starting"); From b8a909c4cccc8e337597c78f7f7a50e2f4b53f3d Mon Sep 17 00:00:00 2001 From: zzz Date: Fri, 18 Sep 2015 20:43:54 +0000 Subject: [PATCH 034/111] Fix eepget man page (ticket #1631) retry default was changed to 0 a while ago --- installer/resources/man/eepget.1 | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/installer/resources/man/eepget.1 b/installer/resources/man/eepget.1 index 8e4a4e3c4..c24e0fe0c 100644 --- a/installer/resources/man/eepget.1 +++ b/installer/resources/man/eepget.1 @@ -1,4 +1,4 @@ -.TH EEEPGET 1 "February 5, 2014" "" "Eepget - I2P Downloader" +.TH EEEPGET 1 "September 18, 2015" "" "Eepget - I2P Downloader" .SH NAME Eepget \- I2P downloader @@ -15,7 +15,7 @@ regular Internet are supported. .P Eepget is able to cope with slow or unstable network connections; if a download is not successful because of a network problem, it will keep retrying until the -whole file has been retrieved (by default up to three times). If supported by +whole file has been retrieved (if the -n option is set). If supported by the remote server, eepget will instruct the server to continue the download from the point of interruption. @@ -53,7 +53,7 @@ Controls the progress display. \fB\ markSize \fP is the number of bytes one '#' .B \fB\-n\fR retries .TP -Specify the number of times to retry downloading if the download isn't successful. If this option is not specified, eepget will retry downloading the file 5 times. +Specify the number of times to retry downloading if the download isn't successful. If this option is not specified, eepget will not retry. .TP .B From 462c882f4e31b881bace77eabe409e5d7c1ab12f Mon Sep 17 00:00:00 2001 From: zzz Date: Fri, 18 Sep 2015 22:54:32 +0000 Subject: [PATCH 035/111] i2psnark: Improve directory listing efficiency (ticket #1079) --- .../java/src/org/klomp/snark/Storage.java | 56 +++++++++++++++---- .../org/klomp/snark/web/I2PSnarkServlet.java | 4 +- .../java/src/org/klomp/snark/web/Sorters.java | 5 +- history.txt | 16 +++++- .../src/net/i2p/router/RouterVersion.java | 2 +- 5 files changed, 66 insertions(+), 17 deletions(-) diff --git a/apps/i2psnark/java/src/org/klomp/snark/Storage.java b/apps/i2psnark/java/src/org/klomp/snark/Storage.java index 3156cf497..d7f5d3988 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/Storage.java +++ b/apps/i2psnark/java/src/org/klomp/snark/Storage.java @@ -341,29 +341,28 @@ public class Storage implements Closeable * @return number of bytes remaining; -1 if unknown file * @since 0.7.14 */ +/**** public long remaining(int fileIndex) { if (fileIndex < 0 || fileIndex >= _torrentFiles.size()) return -1; + if (complete()) + return 0; long bytes = 0; for (int i = 0; i < _torrentFiles.size(); i++) { TorrentFile tf = _torrentFiles.get(i); if (i == fileIndex) { - File f = tf.RAFfile; - if (complete()) - return 0; - int psz = piece_size; long start = bytes; long end = start + tf.length; - int pc = (int) (bytes / psz); + int pc = (int) (bytes / piece_size); long rv = 0; if (!bitfield.get(pc)) - rv = Math.min(psz - (start % psz), tf.length); - for (int j = pc + 1; (((long)j) * psz) < end && j < pieces; j++) { + rv = Math.min(piece_size - (start % piece_size), tf.length); + for (int j = pc + 1; (((long)j) * piece_size) < end && j < pieces; j++) { if (!bitfield.get(j)) { - if (((long)(j+1))*psz < end) - rv += psz; + if (((long)(j+1))*piece_size < end) + rv += piece_size; else - rv += end - (((long)j) * psz); + rv += end - (((long)j) * piece_size); } } return rv; @@ -372,6 +371,40 @@ public class Storage implements Closeable } return -1; } +****/ + + /** + * For efficiency, calculate remaining bytes for all files at once + * + * @return number of bytes remaining for each file, use indexOf() to get index for a file + * @since 0.9.23 + */ + public long[] remaining() { + long[] rv = new long[_torrentFiles.size()]; + if (complete()) + return rv; + long bytes = 0; + for (int i = 0; i < _torrentFiles.size(); i++) { + TorrentFile tf = _torrentFiles.get(i); + long start = bytes; + long end = start + tf.length; + int pc = (int) (bytes / piece_size); + long rvi = 0; + if (!bitfield.get(pc)) + rvi = Math.min(piece_size - (start % piece_size), tf.length); + for (int j = pc + 1; (((long)j) * piece_size) < end && j < pieces; j++) { + if (!bitfield.get(j)) { + if (((long)(j+1))*piece_size < end) + rvi += piece_size; + else + rvi += end - (((long)j) * piece_size); + } + } + rv[i] = rvi; + bytes += tf.length; + } + return rv; + } /** * @param fileIndex as obtained from indexOf @@ -455,9 +488,8 @@ public class Storage implements Closeable int file = 0; long pcEnd = -1; long fileEnd = _torrentFiles.get(0).length - 1; - int psz = piece_size; for (int i = 0; i < rv.length; i++) { - pcEnd += psz; + pcEnd += piece_size; int pri = _torrentFiles.get(file).priority; while (fileEnd <= pcEnd && file < _torrentFiles.size() - 1) { file++; 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 549ac435f..9d576f06e 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java +++ b/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java @@ -2936,8 +2936,10 @@ public class I2PSnarkServlet extends BasicServlet { Storage storage = snark != null ? snark.getStorage() : null; List fileList = new ArrayList(ls.length); + // precompute remaining for all files for efficiency + long[] remainingArray = (storage != null) ? storage.remaining() : null; for (int i = 0; i < ls.length; i++) { - fileList.add(new Sorters.FileAndIndex(ls[i], storage)); + fileList.add(new Sorters.FileAndIndex(ls[i], storage, remainingArray)); } boolean showSort = fileList.size() > 1; diff --git a/apps/i2psnark/java/src/org/klomp/snark/web/Sorters.java b/apps/i2psnark/java/src/org/klomp/snark/web/Sorters.java index 3b71cf3f1..0bf598fd9 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/web/Sorters.java +++ b/apps/i2psnark/java/src/org/klomp/snark/web/Sorters.java @@ -356,13 +356,14 @@ class Sorters { /** * @param storage may be null + * @param remaining precomputed, non-null iff storage is non-null */ - public FileAndIndex(File file, Storage storage) { + public FileAndIndex(File file, Storage storage, long[] remainingArray) { this.file = file; index = storage != null ? storage.indexOf(file) : -1; if (index >= 0) { isDirectory = false; - remaining = storage.remaining(index); + remaining = remainingArray[index]; priority = storage.getPriority(index); } else { isDirectory = file.isDirectory(); diff --git a/history.txt b/history.txt index 97cc89d69..fec2331ba 100644 --- a/history.txt +++ b/history.txt @@ -1,7 +1,21 @@ +2015-09-18 zzz + * EepGet: + - Send Accept-Encoding: gzip even when proxied + - Fix man page (ticket #1631) + * i2psnark: + - Don't display "Tracker Error" if torrent is stopped (ticket #1654) + - Improve directory listing efficiency (ticket #1079) + * i2ptunnel: + - Pass Accept-Encoding header through HTTP client and server proxies, + to allow end-to-end compression + - Don't do transparent response compression if response + Content-Encoding indicates it is already compressed + * Streaming: Move remaining timers from the context to streaming's SimpleTimer2 + 2015-09-17 zzz * i2psnark: - Store magnet parameters across restart (ticket #1485) - - Don't delete torrent config file after error on initial startup (ticket #1658) + - Don't delete torrent config file after error on initial startup (tickets #1575, #1658) 2015-09-16 zzz * Build: diff --git a/router/java/src/net/i2p/router/RouterVersion.java b/router/java/src/net/i2p/router/RouterVersion.java index 4e28a2c8d..c10128fe6 100644 --- a/router/java/src/net/i2p/router/RouterVersion.java +++ b/router/java/src/net/i2p/router/RouterVersion.java @@ -18,7 +18,7 @@ public class RouterVersion { /** deprecated */ public final static String ID = "Monotone"; public final static String VERSION = CoreVersion.VERSION; - public final static long BUILD = 5; + public final static long BUILD = 6; /** for example "-test" */ public final static String EXTRA = ""; From 287f94ad19e805db20f61cc933091dbd7aa0da82 Mon Sep 17 00:00:00 2001 From: zzz Date: Sat, 19 Sep 2015 17:05:09 +0000 Subject: [PATCH 036/111] i2psnark: Add recheck/start/stop buttons to details page (ticket #372) remove dup CSS item --- .../java/src/org/klomp/snark/Snark.java | 3 +- .../src/org/klomp/snark/SnarkManager.java | 90 +++++++++++++++---- .../java/src/org/klomp/snark/Storage.java | 24 +++++ .../org/klomp/snark/web/I2PSnarkServlet.java | 53 +++++++++-- history.txt | 3 + .../resources/themes/snark/ubergine/snark.css | 18 ++-- .../resources/themes/snark/vanilla/snark.css | 12 +++ .../src/net/i2p/router/RouterVersion.java | 2 +- 8 files changed, 176 insertions(+), 29 deletions(-) diff --git a/apps/i2psnark/java/src/org/klomp/snark/Snark.java b/apps/i2psnark/java/src/org/klomp/snark/Snark.java index 60e8f6189..ba62cf627 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/Snark.java +++ b/apps/i2psnark/java/src/org/klomp/snark/Snark.java @@ -1264,7 +1264,8 @@ public class Snark public void setWantedPieces(Storage storage) { - coordinator.setWantedPieces(); + if (coordinator != null) + coordinator.setWantedPieces(); } ///////////// End StorageListener methods diff --git a/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java b/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java index 1e6f152a9..f140d4bab 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java +++ b/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java @@ -8,6 +8,7 @@ import java.io.FilenameFilter; import java.io.IOException; import java.io.OutputStream; import java.io.Serializable; +import java.text.DecimalFormat; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; @@ -2364,28 +2365,36 @@ public class SnarkManager implements CompleteListener { public void startTorrent(byte[] infoHash) { for (Snark snark : _snarks.values()) { if (DataHelper.eq(infoHash, snark.getInfoHash())) { - if (snark.isStarting() || !snark.isStopped()) { - addMessage("Torrent already started"); - return; - } - boolean connected = _util.connected(); - if ((!connected) && !_util.isConnecting()) - addMessage(_("Opening the I2P tunnel")); - addMessage(_("Starting up torrent {0}", snark.getBaseName())); - if (connected) { - snark.startTorrent(); - } else { - // mark it for the UI - snark.setStarting(); - (new I2PAppThread(new ThreadedStarter(snark), "TorrentStarter", true)).start(); - try { Thread.sleep(200); } catch (InterruptedException ie) {} - } + startTorrent(snark); return; } } addMessage("Torrent not found?"); } + /** + * If not connected, thread it, otherwise inline + * @since 0.9.23 + */ + public void startTorrent(Snark snark) { + if (snark.isStarting() || !snark.isStopped()) { + addMessage("Torrent already started"); + return; + } + boolean connected = _util.connected(); + if ((!connected) && !_util.isConnecting()) + addMessage(_("Opening the I2P tunnel")); + addMessage(_("Starting up torrent {0}", snark.getBaseName())); + if (connected) { + snark.startTorrent(); + } else { + // mark it for the UI + snark.setStarting(); + (new I2PAppThread(new ThreadedStarter(snark), "TorrentStarter", true)).start(); + try { Thread.sleep(200); } catch (InterruptedException ie) {} + } + } + /** * If not connected, thread it, otherwise inline * @since 0.9.1 @@ -2498,6 +2507,55 @@ public class SnarkManager implements CompleteListener { } } } + + /** + * Threaded. Torrent must be stopped. + * @since 0.9.23 + */ + public void recheckTorrent(Snark snark) { + if (snark.isStarting() || !snark.isStopped()) { + addMessage("Cannot check " + snark.getBaseName() + ", torrent already started"); + return; + } + Storage storage = snark.getStorage(); + if (storage == null) { + addMessage("Cannot check " + snark.getBaseName() + ", no storage"); + return; + } + (new I2PAppThread(new ThreadedRechecker(snark), "TorrentRechecker", true)).start(); + try { Thread.sleep(200); } catch (InterruptedException ie) {} + } + + /** + * @since 0.9.23 + */ + private class ThreadedRechecker implements Runnable { + private final Snark snark; + /** must have non-null storage */ + public ThreadedRechecker(Snark s) { snark = s; } + public void run() { + try { + if (_log.shouldWarn()) + _log.warn("Starting recheck of " + snark.getBaseName()); + boolean changed = snark.getStorage().recheck(); + if (changed) + updateStatus(snark); + if (_log.shouldWarn()) + _log.warn("Finished recheck of " + snark.getBaseName() + " changed? " + changed); + if (changed) { + int pieces = snark.getPieces(); + double completion = (pieces - snark.getNeeded()) / (double) pieces; + String complete = (new DecimalFormat("0.00%")).format(completion); + addMessage(_("Finished recheck of torrent {0}, now {1} complete", snark.getBaseName(), complete)); + } else { + addMessage(_("Finished recheck of torrent {0}, unchanged", snark.getBaseName())); + } + } catch (Exception e) { + _log.error("Error rechecking " + snark.getBaseName(), e); + addMessage(_("Error checking the torrent {0}", snark.getBaseName()) + ": " + e); + } + } + } /** * ignore case, current locale diff --git a/apps/i2psnark/java/src/org/klomp/snark/Storage.java b/apps/i2psnark/java/src/org/klomp/snark/Storage.java index d7f5d3988..6d73ed658 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/Storage.java +++ b/apps/i2psnark/java/src/org/klomp/snark/Storage.java @@ -533,6 +533,9 @@ public class Storage implements Closeable /** * Creates (and/or checks) all files from the metainfo file list. * Only call this once, and only after the constructor with the metainfo. + * Use recheck() to check again later. + * + * @throws IllegalStateException if called more than once */ public void check() throws IOException { @@ -543,6 +546,9 @@ public class Storage implements Closeable * Creates (and/or checks) all files from the metainfo file list. * Use a saved bitfield and timestamp from a config file. * Only call this once, and only after the constructor with the metainfo. + * Use recheck() to check again later. + * + * @throws IllegalStateException if called more than once */ public void check(long savedTime, BitField savedBitField) throws IOException { @@ -821,6 +827,24 @@ public class Storage implements Closeable return rv; } + /** + * Blocking. Holds lock. + * Recommend running only when stopped. + * Caller should thread. + * Calls listener.setWantedPieces() on completion if anything changed. + * + * @return true if anything changed, false otherwise + * @since 0.9.23 + */ + public boolean recheck() throws IOException { + int previousNeeded = needed; + checkCreateFiles(true); + boolean changed = previousNeeded != needed; + if (listener != null && changed) + listener.setWantedPieces(this); + return changed; + } + /** * This is called at the beginning, and at presumed completion, * so we have to be careful about locking. 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 9d576f06e..2368c7536 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java +++ b/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java @@ -2613,10 +2613,21 @@ public class I2PSnarkServlet extends BasicServlet { String[] val = postParams.get("nonce"); if (val != null) { String nonce = val[0]; - if (String.valueOf(_nonce).equals(nonce)) - savePriorities(snark, postParams); - else + if (String.valueOf(_nonce).equals(nonce)) { + if (postParams.get("savepri") != null) { + savePriorities(snark, postParams); + } else if (postParams.get("stop") != null) { + _manager.stopTorrent(snark, false); + } else if (postParams.get("start") != null) { + _manager.startTorrent(snark); + } else if (postParams.get("recheck") != null) { + _manager.recheckTorrent(snark); + } else { + _manager.addMessage("Unknown command"); + } + } else { _manager.addMessage("Please retry form submission (bad nonce)"); + } } return null; } @@ -2639,6 +2650,7 @@ public class I2PSnarkServlet extends BasicServlet { r = new File(""); } + boolean showStopStart = snark != null; boolean showPriority = snark != null && snark.getStorage() != null && !snark.getStorage().complete() && r.isDirectory(); @@ -2668,7 +2680,8 @@ public class I2PSnarkServlet extends BasicServlet { if (parent) // always true buf.append("
"); - if (showPriority) { + // for stop/start/check + if (showStopStart || showPriority) { buf.append("
\n"); buf.append("\n"); if (sortParam != null) { @@ -2905,7 +2918,36 @@ public class I2PSnarkServlet extends BasicServlet { .append(": ") .append(formatSize(snark.getPieceLength(0))) .append("\n"); + + // buttons + if (showStopStart) { + buf.append(""); + toThemeImg(buf, "file"); + if (snark.isChecking()) { + buf.append(" ").append(_("Checking")).append("…   ") + .append("") + .append(_("Refresh page for results")).append(""); + } else if (snark.isStarting()) { + buf.append(" ").append(_("Starting")).append("…"); + } else if (snark.isAllocating()) { + buf.append(" ").append(_("Allocating")).append("…"); + } else { + boolean isRunning = !snark.isStopped(); + buf.append(" \n"); + else + buf.append(_("Start")).append("\" name=\"start\" class=\"starttorrent\">\n"); + buf.append("   \n"); + else + buf.append("\" class=\"reload\">\n"); + } + buf.append("\n"); + } } else { + // snark == null // shouldn't happen buf.append("Not found
resource=\"").append(r.toString()) .append("\"
base=\"").append(base) @@ -3158,7 +3200,8 @@ public class I2PSnarkServlet extends BasicServlet { "\n"); } buf.append("\n"); - if (showPriority) + // for stop/start/check + if (showStopStart || showPriority) buf.append("
"); buf.append("
\n"); diff --git a/history.txt b/history.txt index fec2331ba..b88780ae4 100644 --- a/history.txt +++ b/history.txt @@ -1,3 +1,6 @@ +2015-09-19 zzz + * i2psnark: Add recheck/start/stop buttons to details page (ticket #372) + 2015-09-18 zzz * EepGet: - Send Accept-Encoding: gzip even when proxied diff --git a/installer/resources/themes/snark/ubergine/snark.css b/installer/resources/themes/snark/ubergine/snark.css index f2e09b4f9..facb2fae5 100644 --- a/installer/resources/themes/snark/ubergine/snark.css +++ b/installer/resources/themes/snark/ubergine/snark.css @@ -656,12 +656,6 @@ input.add { min-height: 22px; } -input.create { - background: #989 url('images/create.png') no-repeat 2px center; - padding: 2px 3px 2px 20px !important; - min-height: 22px; -} - input.cancel { background: #989 url('../../console/images/cancel.png') no-repeat 2px center; padding: 2px 3px 2px 20px !important; @@ -686,6 +680,18 @@ input.reload { min-height: 22px; } +input.starttorrent { + background: #989 url('images/start.png') no-repeat 2px center; + padding: 2px 3px 2px 20px !important; + min-height: 22px; +} + +input.stoptorrent { + background: #989 url('images/stop.png') no-repeat 2px center; + padding: 2px 3px 2px 20px !important; + min-height: 22px; +} + select { background: #333; background: url('/themes/snark/ubergine/images/graytile.png') !important; diff --git a/installer/resources/themes/snark/vanilla/snark.css b/installer/resources/themes/snark/vanilla/snark.css index ddbcd8e8c..b5ab1155b 100644 --- a/installer/resources/themes/snark/vanilla/snark.css +++ b/installer/resources/themes/snark/vanilla/snark.css @@ -694,6 +694,18 @@ input.reload { min-height: 22px; } +input.starttorrent { + background: #f3efc7 url('images/start.png') no-repeat 2px center; + padding: 2px 3px 2px 20px !important; + min-height: 22px; +} + +input.stoptorrent { + background: #f3efc7 url('images/stop.png') no-repeat 2px center; + padding: 2px 3px 2px 20px !important; + min-height: 22px; +} + select { background: #fff; /* background: url('/themes/snark/ubergine/images/graytile.png') !important;*/ diff --git a/router/java/src/net/i2p/router/RouterVersion.java b/router/java/src/net/i2p/router/RouterVersion.java index c10128fe6..fecba78d6 100644 --- a/router/java/src/net/i2p/router/RouterVersion.java +++ b/router/java/src/net/i2p/router/RouterVersion.java @@ -18,7 +18,7 @@ public class RouterVersion { /** deprecated */ public final static String ID = "Monotone"; public final static String VERSION = CoreVersion.VERSION; - public final static long BUILD = 6; + public final static long BUILD = 7; /** for example "-test" */ public final static String EXTRA = ""; From 2a3b55f3a405755fbd2382c54b6f8bcb2099cfca Mon Sep 17 00:00:00 2001 From: zzz Date: Sat, 19 Sep 2015 17:54:07 +0000 Subject: [PATCH 037/111] i2psnark: Add check progress output --- .../java/src/org/klomp/snark/Snark.java | 12 ++++++++++ .../java/src/org/klomp/snark/Storage.java | 22 +++++++++++++++++++ .../org/klomp/snark/web/I2PSnarkServlet.java | 8 ++++--- 3 files changed, 39 insertions(+), 3 deletions(-) diff --git a/apps/i2psnark/java/src/org/klomp/snark/Snark.java b/apps/i2psnark/java/src/org/klomp/snark/Snark.java index ba62cf627..c8fd37970 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/Snark.java +++ b/apps/i2psnark/java/src/org/klomp/snark/Snark.java @@ -745,6 +745,18 @@ public class Snark return storage != null && storage.isChecking(); } + /** + * If checking is in progress, return completion 0-100, + * else return 100. + * @since 0.9.23 + */ + public double getCheckingProgress() { + if (storage != null && storage.isChecking()) + return storage.getCheckingProgress(); + else + return 100.0d; + } + /** * Disk allocation (ballooning) in progress. * @since 0.9.3 diff --git a/apps/i2psnark/java/src/org/klomp/snark/Storage.java b/apps/i2psnark/java/src/org/klomp/snark/Storage.java index 6d73ed658..7d80aa291 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/Storage.java +++ b/apps/i2psnark/java/src/org/klomp/snark/Storage.java @@ -73,6 +73,7 @@ public class Storage implements Closeable private boolean changed; private volatile boolean _isChecking; private final AtomicInteger _allocateCount = new AtomicInteger(); + private final AtomicInteger _checkProgress = new AtomicInteger(); /** The default piece size. */ private static final int DEFAULT_PIECE_SIZE = 256*1024; @@ -311,6 +312,18 @@ public class Storage implements Closeable return _isChecking; } + /** + * If checking is in progress, return completion 0-100, + * else return 100. + * @since 0.9.23 + */ + public double getCheckingProgress() { + if (_isChecking) + return _checkProgress.get() / (double) pieces; + else + return 100.0d; + } + /** * Disk allocation (ballooning) in progress. * Always false on Windows. @@ -869,6 +882,7 @@ public class Storage implements Closeable private void locked_checkCreateFiles(boolean recheck) throws IOException { + _checkProgress.set(0); // Whether we are resuming or not, // if any of the files already exists we assume we are resuming. boolean resume = false; @@ -885,13 +899,16 @@ public class Storage implements Closeable // Make sure all files are available and of correct length // The files should all exist as they have been created with zero length by createFilesFromNames() + long lengthProgress = 0; for (TorrentFile tf : _torrentFiles) { long length = tf.RAFfile.length(); + lengthProgress += tf.length; if(tf.RAFfile.exists() && length == tf.length) { if (listener != null) listener.storageAllocated(this, length); + _checkProgress.set(0); resume = true; // XXX Could dynamicly check } else if (length == 0) { @@ -903,6 +920,8 @@ public class Storage implements Closeable tf.closeRAF(); } catch (IOException ioe) {} } + if (!resume) + _checkProgress.set((int) (pieces * lengthProgress / total_length)); } else { String msg = "File '" + tf.name + "' exists, but has wrong length (expected " + tf.length + " but found " + length + ") - repairing corruption"; @@ -911,6 +930,7 @@ public class Storage implements Closeable _log.error(msg); changed = true; resume = true; + _checkProgress.set(0); _probablyComplete = false; // to force RW synchronized(tf) { RandomAccessFile raf = tf.checkRAF(); @@ -931,6 +951,7 @@ public class Storage implements Closeable long pieceEnd = 0; for (int i = 0; i < pieces; i++) { + _checkProgress.set(i); int length = getUncheckedPiece(i, piece); boolean correctHash = metainfo.checkPiece(i, piece, 0, length); // close as we go so we don't run out of file descriptors @@ -957,6 +978,7 @@ public class Storage implements Closeable } } + _checkProgress.set(pieces); _probablyComplete = complete(); // close all the files so we don't end up with a zillion open ones; // we will reopen as needed 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 2368c7536..f59ae0bdc 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java +++ b/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java @@ -1471,7 +1471,8 @@ public class I2PSnarkServlet extends BasicServlet { String statusString; if (snark.isChecking()) { statusString = toThemeImg("stalled", "", _("Checking")) + "" + - "" + _("Checking"); + "" + _("Checking") + ' ' + + (new DecimalFormat("0.00%")).format(snark.getCheckingProgress()); } else if (snark.isAllocating()) { statusString = toThemeImg("stalled", "", _("Allocating")) + "" + "" + _("Allocating"); @@ -2924,8 +2925,9 @@ public class I2PSnarkServlet extends BasicServlet { buf.append(""); toThemeImg(buf, "file"); if (snark.isChecking()) { - buf.append(" ").append(_("Checking")).append("…   ") - .append("") + buf.append(" ").append(_("Checking")).append("… ") + .append((new DecimalFormat("0.00%")).format(snark.getCheckingProgress())) + .append("   ") .append(_("Refresh page for results")).append(""); } else if (snark.isStarting()) { buf.append(" ").append(_("Starting")).append("…"); From cfc0664756fb66c83b3371178c762696d02b6ed7 Mon Sep 17 00:00:00 2001 From: zzz Date: Sat, 19 Sep 2015 19:06:07 +0000 Subject: [PATCH 038/111] Don't try to fetch subscriptions, news, or plugin updates while in VM Comm system --- .../java/src/net/i2p/addressbook/SubscriptionIterator.java | 3 ++- .../java/src/net/i2p/router/update/NewsFetcher.java | 5 +++++ .../java/src/net/i2p/router/web/PluginStarter.java | 6 ++++++ 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/apps/addressbook/java/src/net/i2p/addressbook/SubscriptionIterator.java b/apps/addressbook/java/src/net/i2p/addressbook/SubscriptionIterator.java index b8b1df28b..74e946f95 100644 --- a/apps/addressbook/java/src/net/i2p/addressbook/SubscriptionIterator.java +++ b/apps/addressbook/java/src/net/i2p/addressbook/SubscriptionIterator.java @@ -76,7 +76,8 @@ class SubscriptionIterator implements Iterator { public AddressBook next() { Subscription sub = this.subIterator.next(); if (sub.getLastFetched() + this.delay < I2PAppContext.getGlobalContext().clock().now() && - I2PAppContext.getGlobalContext().portMapper().getPort(PortMapper.SVC_HTTP_PROXY) >= 0) { + I2PAppContext.getGlobalContext().portMapper().getPort(PortMapper.SVC_HTTP_PROXY) >= 0 && + !I2PAppContext.getGlobalContext().getBooleanProperty("i2p.vmCommSystem")) { //System.err.println("Fetching addressbook from " + sub.getLocation()); return new AddressBook(sub, this.proxyHost, this.proxyPort); } else { diff --git a/apps/routerconsole/java/src/net/i2p/router/update/NewsFetcher.java b/apps/routerconsole/java/src/net/i2p/router/update/NewsFetcher.java index 44ab24e3c..209d91253 100644 --- a/apps/routerconsole/java/src/net/i2p/router/update/NewsFetcher.java +++ b/apps/routerconsole/java/src/net/i2p/router/update/NewsFetcher.java @@ -99,6 +99,11 @@ class NewsFetcher extends UpdateRunner { _log.warn("Cannot fetch news - HTTP client tunnel not running"); return; } + if (shouldProxy && _context.commSystem().isDummy()) { + if (_log.shouldWarn()) + _log.warn("Cannot fetch news - VM Comm system"); + return; + } for (URI uri : _urls) { _currentURI = addLang(uri); diff --git a/apps/routerconsole/java/src/net/i2p/router/web/PluginStarter.java b/apps/routerconsole/java/src/net/i2p/router/web/PluginStarter.java index d0a6277e0..608de2aea 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/PluginStarter.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/PluginStarter.java @@ -157,6 +157,12 @@ public class PluginStarter implements Runnable { Messages.getString("HTTP client proxy tunnel must be running", ctx)); return; } + if (ctx.commSystem().isDummy()) { + mgr.notifyComplete(null, Messages.getString("Plugin update check failed", ctx) + + " - " + + "VM Comm System"); + return; + } Log log = ctx.logManager().getLog(PluginStarter.class); int updated = 0; From 02a0ef3526fe874861d965baf6b8a9145213391c Mon Sep 17 00:00:00 2001 From: zzz Date: Sun, 20 Sep 2015 00:44:51 +0000 Subject: [PATCH 039/111] include man pages in the update --- build.xml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/build.xml b/build.xml index 7d409ff1f..ea10ca4bb 100644 --- a/build.xml +++ b/build.xml @@ -1402,6 +1402,9 @@ ---------------- EARLIER HISTORY IS AVAILABLE IN THE SOURCE PACKAGE" + + + From b81cbedd5ca33d9ce75ec7be3c8dfe15e653322a Mon Sep 17 00:00:00 2001 From: zzz Date: Sun, 20 Sep 2015 11:08:27 +0000 Subject: [PATCH 040/111] format multiplies by 100, so complete is 1.0 --- apps/i2psnark/java/src/org/klomp/snark/Snark.java | 6 +++--- apps/i2psnark/java/src/org/klomp/snark/Storage.java | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/apps/i2psnark/java/src/org/klomp/snark/Snark.java b/apps/i2psnark/java/src/org/klomp/snark/Snark.java index c8fd37970..952850597 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/Snark.java +++ b/apps/i2psnark/java/src/org/klomp/snark/Snark.java @@ -746,15 +746,15 @@ public class Snark } /** - * If checking is in progress, return completion 0-100, - * else return 100. + * If checking is in progress, return completion 0.0 ... 1.0, + * else return 1.0. * @since 0.9.23 */ public double getCheckingProgress() { if (storage != null && storage.isChecking()) return storage.getCheckingProgress(); else - return 100.0d; + return 1.0d; } /** diff --git a/apps/i2psnark/java/src/org/klomp/snark/Storage.java b/apps/i2psnark/java/src/org/klomp/snark/Storage.java index 7d80aa291..62cb1aa45 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/Storage.java +++ b/apps/i2psnark/java/src/org/klomp/snark/Storage.java @@ -313,15 +313,15 @@ public class Storage implements Closeable } /** - * If checking is in progress, return completion 0-100, - * else return 100. + * If checking is in progress, return completion 0.0 ... 1.0, + * else return 1.0. * @since 0.9.23 */ public double getCheckingProgress() { if (_isChecking) return _checkProgress.get() / (double) pieces; else - return 100.0d; + return 1.0d; } /** From c56f686d8c65403fdd28d6511e358cea3f896a14 Mon Sep 17 00:00:00 2001 From: dg2-new Date: Sun, 20 Sep 2015 19:23:50 +0000 Subject: [PATCH 041/111] Fix typo. --- apps/i2psnark/java/src/org/klomp/snark/Snark.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/i2psnark/java/src/org/klomp/snark/Snark.java b/apps/i2psnark/java/src/org/klomp/snark/Snark.java index 952850597..f8dadb627 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/Snark.java +++ b/apps/i2psnark/java/src/org/klomp/snark/Snark.java @@ -1286,7 +1286,7 @@ public class Snark /** SnarkSnutdown callback unused */ public void shutdown() { - // Should not be necessary since all non-deamon threads should + // Should not be necessary since all non-daemon threads should // have died. But in reality this does not always happen. //System.exit(0); } From 6685b81834ece39789654e738cea542ec927406e Mon Sep 17 00:00:00 2001 From: dg2-new Date: Sun, 20 Sep 2015 19:28:11 +0000 Subject: [PATCH 042/111] /configreseed: Add 'Reset URL list' button for revert to default hosts (ticket #1554, thanks dzirtt@gmail.com) --- .../java/src/net/i2p/router/web/ConfigReseedHandler.java | 9 +++++++++ apps/routerconsole/jsp/configreseed.jsp | 4 +++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/apps/routerconsole/java/src/net/i2p/router/web/ConfigReseedHandler.java b/apps/routerconsole/java/src/net/i2p/router/web/ConfigReseedHandler.java index 2dd4330a1..8ae56c77c 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/ConfigReseedHandler.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/ConfigReseedHandler.java @@ -96,10 +96,19 @@ public class ConfigReseedHandler extends FormHandler { } } else if (_action.equals(_("Save changes"))) { saveChanges(); + } else if (_action.equals(_("Reset URL list"))) { + resetUrlList(); } //addFormError(_("Unsupported") + ' ' + _action + '.'); } + private void resetUrlList() { + if (_context.router().saveConfig(Reseeder.PROP_RESEED_URL, null)) + addFormNotice(_("URL list reset successfully")); + else + addFormError(_("URL list reset failed")); + } + /** @since 0.8.9 */ private void saveString(String config, String param) { String val = getJettyString(param); diff --git a/apps/routerconsole/jsp/configreseed.jsp b/apps/routerconsole/jsp/configreseed.jsp index b78b4cb14..de2351e9e 100644 --- a/apps/routerconsole/jsp/configreseed.jsp +++ b/apps/routerconsole/jsp/configreseed.jsp @@ -77,7 +77,9 @@ > <%=intl._("Use non-SSL only")%> <%=intl._("Reseed URLs")%>: - + +
" />
+ <%=intl._("Enable HTTP Proxy?")%> > From 7dd438b5f0a8f7db22f0a14ba567828c2a94d63d Mon Sep 17 00:00:00 2001 From: dg2-new Date: Sun, 20 Sep 2015 19:29:47 +0000 Subject: [PATCH 043/111] bump --- router/java/src/net/i2p/router/RouterVersion.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/router/java/src/net/i2p/router/RouterVersion.java b/router/java/src/net/i2p/router/RouterVersion.java index fecba78d6..a6204817e 100644 --- a/router/java/src/net/i2p/router/RouterVersion.java +++ b/router/java/src/net/i2p/router/RouterVersion.java @@ -18,7 +18,7 @@ public class RouterVersion { /** deprecated */ public final static String ID = "Monotone"; public final static String VERSION = CoreVersion.VERSION; - public final static long BUILD = 7; + public final static long BUILD = 8; /** for example "-test" */ public final static String EXTRA = ""; From 5a2f22b00f660ca8fe710d1bf19df949431fdd4f Mon Sep 17 00:00:00 2001 From: dg2-new Date: Sun, 20 Sep 2015 19:34:10 +0000 Subject: [PATCH 044/111] history --- history.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/history.txt b/history.txt index b88780ae4..b6097d90a 100644 --- a/history.txt +++ b/history.txt @@ -1,3 +1,6 @@ +2015-09-20 dg + * /configreseed: Add 'Reset URL list' button for revert to default hosts (ticket #1554, thanks dzirtt@gmail.com) + 2015-09-19 zzz * i2psnark: Add recheck/start/stop buttons to details page (ticket #372) From 62acfc0cae044bf72bf22d6d19821ba3eabf3ed0 Mon Sep 17 00:00:00 2001 From: zzz Date: Mon, 21 Sep 2015 12:35:39 +0000 Subject: [PATCH 045/111] use standard error message --- .../java/src/net/i2p/router/web/ConfigReseedHandler.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/routerconsole/java/src/net/i2p/router/web/ConfigReseedHandler.java b/apps/routerconsole/java/src/net/i2p/router/web/ConfigReseedHandler.java index 8ae56c77c..ba45058f4 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/ConfigReseedHandler.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/ConfigReseedHandler.java @@ -106,7 +106,7 @@ public class ConfigReseedHandler extends FormHandler { if (_context.router().saveConfig(Reseeder.PROP_RESEED_URL, null)) addFormNotice(_("URL list reset successfully")); else - addFormError(_("URL list reset failed")); + addFormError(_("Error saving the configuration (applied but not saved) - please see the error logs")); } /** @since 0.8.9 */ From 53ae7279357ae3082917dab5dc7414449dde27d5 Mon Sep 17 00:00:00 2001 From: zzz Date: Mon, 21 Sep 2015 14:54:08 +0000 Subject: [PATCH 046/111] synch fix --- apps/jetty/java/src/net/i2p/jetty/JettyStart.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/jetty/java/src/net/i2p/jetty/JettyStart.java b/apps/jetty/java/src/net/i2p/jetty/JettyStart.java index 73b4b4d78..6cac1cbae 100644 --- a/apps/jetty/java/src/net/i2p/jetty/JettyStart.java +++ b/apps/jetty/java/src/net/i2p/jetty/JettyStart.java @@ -98,7 +98,7 @@ public class JettyStart implements ClientApp { } } - public void startup() { + public synchronized void startup() { if (_state != INITIALIZED) return; if (_jettys.isEmpty()) { From 3f213cf1dbfbcdce50eec622506e4f7d8d6058c4 Mon Sep 17 00:00:00 2001 From: zzz Date: Mon, 21 Sep 2015 15:13:39 +0000 Subject: [PATCH 047/111] register I2CP with the PortMapper --- core/java/src/net/i2p/util/PortMapper.java | 2 ++ .../net/i2p/router/client/ClientListenerRunner.java | 13 ++++++++++++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/core/java/src/net/i2p/util/PortMapper.java b/core/java/src/net/i2p/util/PortMapper.java index 816020433..d32a4f5a5 100644 --- a/core/java/src/net/i2p/util/PortMapper.java +++ b/core/java/src/net/i2p/util/PortMapper.java @@ -33,6 +33,8 @@ public class PortMapper { public static final String SVC_BOB = "BOB"; /** not necessary, already in config? */ public static final String SVC_I2CP = "I2CP"; + /** @since 0.9.23 */ + public static final String SVC_I2CP_SSL = "I2CP-SSL"; /** * @param context unused for now diff --git a/router/java/src/net/i2p/router/client/ClientListenerRunner.java b/router/java/src/net/i2p/router/client/ClientListenerRunner.java index e88339b0e..10e924106 100644 --- a/router/java/src/net/i2p/router/client/ClientListenerRunner.java +++ b/router/java/src/net/i2p/router/client/ClientListenerRunner.java @@ -18,6 +18,7 @@ import net.i2p.client.I2PClient; import net.i2p.router.Router; import net.i2p.router.RouterContext; import net.i2p.util.Log; +import net.i2p.util.PortMapper; /** * Listen for connections on the specified port, and toss them onto the client manager's @@ -78,13 +79,18 @@ class ClientListenerRunner implements Runnable { protected void runServer() { _running = true; int curDelay = 1000; + final String portMapperService = (this instanceof SSLClientListenerRunner) ? PortMapper.SVC_I2CP_SSL + : PortMapper.SVC_I2CP; while (_running) { try { _socket = getServerSocket(); if (_log.shouldLog(Log.DEBUG)) _log.debug("ServerSocket created, before accept: " + _socket); - + if (_port > 0) { + // not for DomainClientListenerRunner + _context.portMapper().register(portMapperService, _socket.getInetAddress().getHostAddress(), _port); + } curDelay = 1000; _listening = true; while (_running) { @@ -115,6 +121,11 @@ class ClientListenerRunner implements Runnable { } catch (IOException ioe) { if (isAlive()) _log.error("Error listening on port " + _port, ioe); + } finally { + if (_port > 0) { + // not for DomainClientListenerRunner + _context.portMapper().unregister(portMapperService); + } } _listening = false; From 04d653a8b919047aae12f85bed368ed01c30ef38 Mon Sep 17 00:00:00 2001 From: zzz Date: Mon, 21 Sep 2015 15:21:54 +0000 Subject: [PATCH 048/111] comment out main() --- core/java/src/net/i2p/crypto/KeyStoreUtil.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/core/java/src/net/i2p/crypto/KeyStoreUtil.java b/core/java/src/net/i2p/crypto/KeyStoreUtil.java index c374ad120..06b73cea8 100644 --- a/core/java/src/net/i2p/crypto/KeyStoreUtil.java +++ b/core/java/src/net/i2p/crypto/KeyStoreUtil.java @@ -501,6 +501,7 @@ public class KeyStoreUtil { l.log(level, msg, t); } +/**** public static void main(String[] args) { try { if (args.length > 0) { @@ -521,4 +522,5 @@ public class KeyStoreUtil { e.printStackTrace(); } } +****/ } From 0faa5ba2f4b429f48d679795ce5e71fb9005f3b5 Mon Sep 17 00:00:00 2001 From: zzz Date: Thu, 24 Sep 2015 18:28:26 +0000 Subject: [PATCH 049/111] i2psnark: - Rename bad .torrent files instead of deleting them - Add mime type for .xz --- .../src/org/klomp/snark/SnarkManager.java | 58 ++++++++++--------- .../org/klomp/snark/web/I2PSnarkServlet.java | 2 +- apps/i2psnark/mime.properties | 1 + 3 files changed, 33 insertions(+), 28 deletions(-) diff --git a/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java b/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java index f140d4bab..af9293db0 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java +++ b/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java @@ -1242,30 +1242,34 @@ public class SnarkManager implements CompleteListener { } String rejectMessage = validateTorrent(info); if (rejectMessage != null) { - sfile.delete(); - addMessage(rejectMessage); - return; - } else { - // TODO load saved closest DHT nodes and pass to the Snark ? - // This may take a LONG time - if (baseFile == null) - baseFile = getSavedBaseFile(info.getInfoHash()); - if (_log.shouldLog(Log.INFO)) - _log.info("New Snark, torrent: " + filename + " base: " + baseFile); - torrent = new Snark(_util, filename, null, -1, null, null, this, - _peerCoordinatorSet, _connectionAcceptor, - shouldAutoStart(), dataDir.getPath(), baseFile); - loadSavedFilePriorities(torrent); - synchronized (_snarks) { - _snarks.put(filename, torrent); - } + throw new IOException(rejectMessage); + } + + // TODO load saved closest DHT nodes and pass to the Snark ? + // This may take a LONG time + if (baseFile == null) + baseFile = getSavedBaseFile(info.getInfoHash()); + if (_log.shouldLog(Log.INFO)) + _log.info("New Snark, torrent: " + filename + " base: " + baseFile); + torrent = new Snark(_util, filename, null, -1, null, null, this, + _peerCoordinatorSet, _connectionAcceptor, + shouldAutoStart(), dataDir.getPath(), baseFile); + loadSavedFilePriorities(torrent); + synchronized (_snarks) { + _snarks.put(filename, torrent); } } catch (IOException ioe) { - String err = _("Torrent in \"{0}\" is invalid", sfile.getName()) + ": " + ioe.getMessage(); + String err = _("Torrent in \"{0}\" is invalid", sfile.toString()) + ": " + ioe.getMessage(); addMessage(err); _log.error(err, ioe); - if (sfile.exists()) - sfile.delete(); + File rename = new File(filename + ".BAD"); + if (rename.exists()) { + if (sfile.delete()) + addMessage(_("Torrent file deleted: {0}", sfile.toString())); + } else { + if (FileUtil.rename(sfile, rename)) + addMessage(_("Torrent file moved from {0} to {1}", sfile.toString(), rename.toString())); + } return; } catch (OutOfMemoryError oom) { addMessage(_("ERROR - Out of memory, cannot create torrent from {0}", sfile.getName()) + ": " + oom.getMessage()); @@ -1895,18 +1899,18 @@ public class SnarkManager implements CompleteListener { private String validateTorrent(MetaInfo info) { List> files = info.getFiles(); if ( (files != null) && (files.size() > MAX_FILES_PER_TORRENT) ) { - return _("Too many files in \"{0}\" ({1}), deleting it!", info.getName(), files.size()); + return _("Too many files in \"{0}\" ({1})!", info.getName(), files.size()); } else if ( (files == null) && (info.getName().endsWith(".torrent")) ) { - return _("Torrent file \"{0}\" cannot end in \".torrent\", deleting it!", info.getName()); + return _("Torrent file \"{0}\" cannot end in \".torrent\"!", info.getName()); } else if (info.getPieces() <= 0) { - return _("No pieces in \"{0}\", deleting it!", info.getName()); + return _("No pieces in \"{0}\"!", info.getName()); } else if (info.getPieces() > Storage.MAX_PIECES) { - return _("Too many pieces in \"{0}\", limit is {1}, deleting it!", info.getName(), Storage.MAX_PIECES); + return _("Too many pieces in \"{0}\", limit is {1}!", info.getName(), Storage.MAX_PIECES); } else if (info.getPieceLength(0) > Storage.MAX_PIECE_SIZE) { - return _("Pieces are too large in \"{0}\" ({1}B), deleting it.", info.getName(), DataHelper.formatSize2(info.getPieceLength(0))) + ' ' + + return _("Pieces are too large in \"{0}\" ({1}B)!", info.getName(), DataHelper.formatSize2(info.getPieceLength(0))) + ' ' + _("Limit is {0}B", DataHelper.formatSize2(Storage.MAX_PIECE_SIZE)); } else if (info.getTotalLength() <= 0) { - return _("Torrent \"{0}\" has no data, deleting it!", info.getName()); + return _("Torrent \"{0}\" has no data!", info.getName()); } else if (info.getTotalLength() > Storage.MAX_TOTAL_SIZE) { System.out.println("torrent info: " + info.toString()); List lengths = info.getLengths(); @@ -1914,7 +1918,7 @@ public class SnarkManager implements CompleteListener { for (int i = 0; i < lengths.size(); i++) System.out.println("File " + i + " is " + lengths.get(i) + " long."); - return _("Torrents larger than {0}B are not supported yet, deleting \"{1}\"", Storage.MAX_TOTAL_SIZE, info.getName()); + return _("Torrents larger than {0}B are not supported yet \"{1}\"!", Storage.MAX_TOTAL_SIZE, info.getName()); } else { // ok return null; 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 f59ae0bdc..08ea4c24f 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java +++ b/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java @@ -3274,7 +3274,7 @@ public class I2PSnarkServlet extends BasicServlet { icon = "itoopie_xxsm"; else icon = "compress"; - } else if (mime.equals("application/x-gtar") || + } else if (mime.equals("application/x-gtar") || mime.equals("application/x-xz") || mime.equals("application/compress") || mime.equals("application/gzip") || mime.equals("application/x-7z-compressed") || mime.equals("application/x-rar-compressed") || mime.equals("application/x-tar") || mime.equals("application/x-bzip2")) diff --git a/apps/i2psnark/mime.properties b/apps/i2psnark/mime.properties index 6739efc49..7f21bea1c 100644 --- a/apps/i2psnark/mime.properties +++ b/apps/i2psnark/mime.properties @@ -31,3 +31,4 @@ war = application/java-archive webm = video/webm wma = audio/x-ms-wma wmv = video/x-ms-wmv +xz = application/x-xz From 04690bed9f1be9bb1b1b5c7c8e7cf21bba983eec Mon Sep 17 00:00:00 2001 From: zzz Date: Thu, 24 Sep 2015 19:08:36 +0000 Subject: [PATCH 050/111] close before rename --- apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java b/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java index af9293db0..ee9aa5ccb 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java +++ b/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java @@ -1259,6 +1259,8 @@ public class SnarkManager implements CompleteListener { _snarks.put(filename, torrent); } } catch (IOException ioe) { + // close before rename/delete for windows + if (fis != null) try { fis.close(); fis = null; } catch (IOException ioe2) {} String err = _("Torrent in \"{0}\" is invalid", sfile.toString()) + ": " + ioe.getMessage(); addMessage(err); _log.error(err, ioe); From 22b9876b68a8fb6bc40d7b8c313d75dac678e116 Mon Sep 17 00:00:00 2001 From: dg2-new Date: Fri, 25 Sep 2015 19:55:36 +0000 Subject: [PATCH 051/111] Rename _() for translation to _t() for Java 9 compatibility (ticket #1456) --- apps/desktopgui/bundle-messages.sh | 10 +- .../i2p/desktopgui/ExternalTrayManager.java | 4 +- .../i2p/desktopgui/InternalTrayManager.java | 8 +- .../src/net/i2p/desktopgui/TrayManager.java | 4 +- .../gui/DesktopguiConfigurationFrame.java | 8 +- .../desktopgui/i18n/DesktopguiTranslator.java | 4 +- apps/i2psnark/java/bundle-messages.sh | 4 +- .../src/org/klomp/snark/I2PSnarkUtil.java | 2 +- .../src/org/klomp/snark/SnarkManager.java | 190 +++---- .../src/org/klomp/snark/web/FetchAndAdd.java | 24 +- .../org/klomp/snark/web/I2PSnarkServlet.java | 514 +++++++++--------- apps/i2psnark/locale/messages_ar.po | 2 +- apps/i2psnark/locale/messages_cs.po | 2 +- apps/i2psnark/locale/messages_de.po | 2 +- apps/i2psnark/locale/messages_en.po | 2 +- apps/i2psnark/locale/messages_es.po | 2 +- apps/i2psnark/locale/messages_fr.po | 2 +- apps/i2psnark/locale/messages_hu.po | 2 +- apps/i2psnark/locale/messages_it.po | 2 +- apps/i2psnark/locale/messages_nb.po | 2 +- apps/i2psnark/locale/messages_nl.po | 2 +- apps/i2psnark/locale/messages_pl.po | 2 +- apps/i2psnark/locale/messages_pt.po | 2 +- apps/i2psnark/locale/messages_pt_bR.po | 2 +- apps/i2psnark/locale/messages_ro.po | 2 +- apps/i2psnark/locale/messages_ru.po | 2 +- apps/i2psnark/locale/messages_sk.po | 2 +- apps/i2psnark/locale/messages_sv.po | 2 +- apps/i2psnark/locale/messages_vi.po | 2 +- apps/i2psnark/locale/messages_zh.po | 2 +- apps/i2ptunnel/java/bundle-messages-proxy.sh | 6 +- apps/i2ptunnel/java/bundle-messages.sh | 6 +- .../i2p/i2ptunnel/I2PTunnelHTTPClient.java | 22 +- .../i2ptunnel/I2PTunnelHTTPClientBase.java | 12 +- .../localServer/LocalHTTPServer.java | 28 +- .../net/i2p/i2ptunnel/ui/GeneralHelper.java | 8 +- .../src/net/i2p/i2ptunnel/web/EditBean.java | 10 +- .../src/net/i2p/i2ptunnel/web/IndexBean.java | 60 +- .../src/net/i2p/i2ptunnel/web/Messages.java | 8 +- apps/i2ptunnel/jsp/editClient.jsp | 194 +++---- apps/i2ptunnel/jsp/editServer.jsp | 200 +++---- apps/i2ptunnel/jsp/index.jsp | 116 ++-- apps/i2ptunnel/jsp/wizard.jsp | 192 +++---- apps/ministreaming/java/bundle-messages.sh | 4 +- .../client/streaming/I2PSocketException.java | 6 +- .../java/bundle-messages-countries.sh | 8 +- .../java/bundle-messages-news.sh | 6 +- apps/routerconsole/java/bundle-messages.sh | 10 +- .../router/update/ConsoleUpdateManager.java | 32 +- .../router/update/DevSU3UpdateChecker.java | 6 +- .../router/update/DevSU3UpdateHandler.java | 2 +- .../i2p/router/update/DevSU3UpdateRunner.java | 2 +- .../net/i2p/router/update/NewsFetcher.java | 8 +- .../router/update/PluginUpdateChecker.java | 4 +- .../router/update/PluginUpdateHandler.java | 4 +- .../i2p/router/update/PluginUpdateRunner.java | 84 +-- .../router/update/UnsignedUpdateChecker.java | 4 +- .../router/update/UnsignedUpdateHandler.java | 2 +- .../router/update/UnsignedUpdateRunner.java | 2 +- .../net/i2p/router/update/UpdateHandler.java | 2 +- .../net/i2p/router/update/UpdateRunner.java | 18 +- .../net/i2p/router/web/BanlistRenderer.java | 22 +- .../src/net/i2p/router/web/CSSHelper.java | 4 +- .../i2p/router/web/ConfigAdvancedHandler.java | 10 +- .../i2p/router/web/ConfigClientsHandler.java | 94 ++-- .../i2p/router/web/ConfigClientsHelper.java | 66 +-- .../net/i2p/router/web/ConfigHomeHandler.java | 22 +- .../i2p/router/web/ConfigKeyringHandler.java | 20 +- .../i2p/router/web/ConfigLoggingHandler.java | 4 +- .../i2p/router/web/ConfigLoggingHelper.java | 12 +- .../net/i2p/router/web/ConfigNavHelper.java | 2 +- .../net/i2p/router/web/ConfigNetHandler.java | 68 +-- .../net/i2p/router/web/ConfigNetHelper.java | 12 +- .../net/i2p/router/web/ConfigPeerHandler.java | 28 +- .../i2p/router/web/ConfigReseedHandler.java | 42 +- .../net/i2p/router/web/ConfigRestartBean.java | 26 +- .../i2p/router/web/ConfigServiceHandler.java | 56 +- .../i2p/router/web/ConfigStatsHandler.java | 10 +- .../net/i2p/router/web/ConfigStatsHelper.java | 4 +- .../i2p/router/web/ConfigSummaryHandler.java | 48 +- .../i2p/router/web/ConfigTunnelsHandler.java | 8 +- .../i2p/router/web/ConfigTunnelsHelper.java | 26 +- .../net/i2p/router/web/ConfigUIHandler.java | 30 +- .../net/i2p/router/web/ConfigUIHelper.java | 16 +- .../i2p/router/web/ConfigUpdateHandler.java | 38 +- .../i2p/router/web/ConfigUpdateHelper.java | 14 +- .../net/i2p/router/web/EventLogHelper.java | 28 +- .../src/net/i2p/router/web/FormHandler.java | 14 +- .../src/net/i2p/router/web/GraphHelper.java | 60 +- .../src/net/i2p/router/web/HelperBase.java | 10 +- .../src/net/i2p/router/web/HomeHelper.java | 14 +- .../net/i2p/router/web/JobQueueHelper.java | 36 +- .../src/net/i2p/router/web/LogsHelper.java | 16 +- .../java/src/net/i2p/router/web/Messages.java | 2 +- .../src/net/i2p/router/web/NetDbHelper.java | 4 +- .../src/net/i2p/router/web/NetDbRenderer.java | 76 +-- .../router/web/ProfileOrganizerRenderer.java | 110 ++-- .../net/i2p/router/web/ProfilesHelper.java | 4 +- .../src/net/i2p/router/web/SearchHelper.java | 2 +- .../net/i2p/router/web/StatSummarizer.java | 4 +- .../net/i2p/router/web/StatsGenerator.java | 56 +- .../i2p/router/web/SummaryBarRenderer.java | 190 +++---- .../src/net/i2p/router/web/SummaryHelper.java | 122 ++--- .../net/i2p/router/web/SummaryRenderer.java | 30 +- .../net/i2p/router/web/TunnelRenderer.java | 60 +- apps/routerconsole/java/strings/Strings.java | 100 ++-- apps/routerconsole/jsp/config.jsp | 32 +- apps/routerconsole/jsp/configadvanced.jsp | 28 +- apps/routerconsole/jsp/configclients.jsp | 98 ++-- apps/routerconsole/jsp/confighome.jsp | 44 +- apps/routerconsole/jsp/configkeyring.jsp | 24 +- apps/routerconsole/jsp/configlogging.jsp | 32 +- apps/routerconsole/jsp/confignet.jsp | 240 ++++---- apps/routerconsole/jsp/configpeer.jsp | 28 +- apps/routerconsole/jsp/configreseed.jsp | 84 +-- apps/routerconsole/jsp/configservice.jsp | 70 +-- apps/routerconsole/jsp/configsidebar.jsp | 14 +- apps/routerconsole/jsp/configstats.jsp | 26 +- apps/routerconsole/jsp/configtunnels.jsp | 24 +- apps/routerconsole/jsp/configui.jsp | 26 +- apps/routerconsole/jsp/configupdate.jsp | 44 +- apps/routerconsole/jsp/console.jsp | 4 +- apps/routerconsole/jsp/dns.jsp | 6 +- apps/routerconsole/jsp/error.jsp | 4 +- apps/routerconsole/jsp/error500.jsp | 20 +- apps/routerconsole/jsp/events.jsp | 2 +- apps/routerconsole/jsp/graph.jsp | 2 +- apps/routerconsole/jsp/graphs.jsp | 2 +- apps/routerconsole/jsp/home.jsp | 16 +- apps/routerconsole/jsp/i2ptunnelmgr.jsp | 6 +- apps/routerconsole/jsp/jobs.jsp | 2 +- apps/routerconsole/jsp/logs.jsp | 22 +- apps/routerconsole/jsp/netdb.jsp | 2 +- apps/routerconsole/jsp/news.jsp | 2 +- apps/routerconsole/jsp/nowebapp.jsp | 6 +- apps/routerconsole/jsp/peers.jsp | 2 +- apps/routerconsole/jsp/profiles.jsp | 2 +- apps/routerconsole/jsp/stats.jsp | 2 +- apps/routerconsole/jsp/summary.jsi | 6 +- apps/routerconsole/jsp/summaryajax.jsi | 2 +- apps/routerconsole/jsp/summaryframe.jsp | 6 +- apps/routerconsole/jsp/summarynoframe.jsi | 2 +- apps/routerconsole/jsp/torrents.jsp | 6 +- apps/routerconsole/jsp/tunnels.jsp | 2 +- apps/routerconsole/jsp/viewprofile.jsp | 4 +- apps/routerconsole/jsp/webmail.jsp | 6 +- apps/routerconsole/locale/messages_ar.po | 4 +- apps/routerconsole/locale/messages_cs.po | 4 +- apps/routerconsole/locale/messages_da.po | 4 +- apps/routerconsole/locale/messages_de.po | 4 +- apps/routerconsole/locale/messages_el.po | 4 +- apps/routerconsole/locale/messages_en.po | 4 +- apps/routerconsole/locale/messages_es.po | 4 +- apps/routerconsole/locale/messages_et.po | 4 +- apps/routerconsole/locale/messages_fi.po | 4 +- apps/routerconsole/locale/messages_fr.po | 4 +- apps/routerconsole/locale/messages_hu.po | 4 +- apps/routerconsole/locale/messages_it.po | 4 +- apps/routerconsole/locale/messages_ja.po | 4 +- apps/routerconsole/locale/messages_nb.po | 4 +- apps/routerconsole/locale/messages_nl.po | 4 +- apps/routerconsole/locale/messages_pl.po | 4 +- apps/routerconsole/locale/messages_pt.po | 4 +- apps/routerconsole/locale/messages_pt_BR.po | 4 +- apps/routerconsole/locale/messages_ro.po | 4 +- apps/routerconsole/locale/messages_ru.po | 4 +- apps/routerconsole/locale/messages_sv.po | 4 +- apps/routerconsole/locale/messages_tr.po | 4 +- apps/routerconsole/locale/messages_uk.po | 4 +- apps/routerconsole/locale/messages_vi.po | 4 +- apps/routerconsole/locale/messages_zh.po | 4 +- apps/susidns/src/bundle-messages.sh | 6 +- .../java/src/i2p/susi/dns/AddressBean.java | 42 +- .../src/i2p/susi/dns/AddressbookBean.java | 40 +- .../src/java/src/i2p/susi/dns/BaseBean.java | 6 +- .../src/java/src/i2p/susi/dns/ConfigBean.java | 12 +- .../src/java/src/i2p/susi/dns/Messages.java | 4 +- .../src/i2p/susi/dns/NamingServiceBean.java | 42 +- .../src/i2p/susi/dns/SubscriptionsBean.java | 14 +- apps/susidns/src/jsp/addressbook.jsp | 70 +-- apps/susidns/src/jsp/config.jsp | 64 +-- apps/susidns/src/jsp/details.jsp | 56 +- apps/susidns/src/jsp/index.jsp | 44 +- apps/susidns/src/jsp/subscriptions.jsp | 36 +- apps/susimail/bundle-messages.sh | 4 +- apps/susimail/locale/messages_cs.po | 10 +- apps/susimail/locale/messages_da.po | 10 +- apps/susimail/locale/messages_de.po | 10 +- apps/susimail/locale/messages_en.po | 10 +- apps/susimail/locale/messages_es.po | 10 +- apps/susimail/locale/messages_fi.po | 10 +- apps/susimail/locale/messages_fr.po | 10 +- apps/susimail/locale/messages_hu.po | 10 +- apps/susimail/locale/messages_in.po | 10 +- apps/susimail/locale/messages_it.po | 10 +- apps/susimail/locale/messages_ja.po | 10 +- apps/susimail/locale/messages_mg.po | 10 +- apps/susimail/locale/messages_nl.po | 10 +- apps/susimail/locale/messages_pl.po | 10 +- apps/susimail/locale/messages_pt.po | 10 +- apps/susimail/locale/messages_pt_BR.po | 10 +- apps/susimail/locale/messages_ro.po | 10 +- apps/susimail/locale/messages_ru.po | 10 +- apps/susimail/locale/messages_sq.po | 10 +- apps/susimail/locale/messages_sv.po | 10 +- apps/susimail/locale/messages_uk.po | 10 +- apps/susimail/locale/messages_vi.po | 10 +- apps/susimail/locale/messages_zh.po | 10 +- .../src/src/i2p/susi/webmail/MailPart.java | 4 +- .../src/src/i2p/susi/webmail/Messages.java | 2 +- .../src/src/i2p/susi/webmail/WebMail.java | 274 +++++----- .../i2p/susi/webmail/pop3/POP3MailBox.java | 16 +- .../src/i2p/susi/webmail/smtp/SMTPClient.java | 16 +- core/java/src/net/i2p/data/DataHelper.java | 6 +- core/java/src/net/i2p/util/LogWriterBase.java | 4 +- core/java/src/net/i2p/util/Translate.java | 2 +- history.txt | 3 + router/java/src/net/i2p/router/Blocklist.java | 12 +- .../src/net/i2p/router/RouterVersion.java | 2 +- .../i2p/router/networkdb/reseed/Reseeder.java | 24 +- .../transport/CommSystemFacadeImpl.java | 4 +- .../i2p/router/transport/TransportImpl.java | 4 +- .../router/transport/TransportManager.java | 68 +-- .../src/net/i2p/router/transport/UPnP.java | 74 +-- .../net/i2p/router/transport/UPnPManager.java | 4 +- .../router/transport/ntcp/NTCPTransport.java | 36 +- .../router/transport/udp/UDPTransport.java | 86 +-- 227 files changed, 2930 insertions(+), 2927 deletions(-) diff --git a/apps/desktopgui/bundle-messages.sh b/apps/desktopgui/bundle-messages.sh index 957199923..997c76887 100644 --- a/apps/desktopgui/bundle-messages.sh +++ b/apps/desktopgui/bundle-messages.sh @@ -64,19 +64,19 @@ do echo "Updating the $i file from the tags..." # extract strings from java and jsp files, and update messages.po files # translate calls must be one of the forms: - # _("foo") + # _t("foo") # _x("foo") - # intl._("foo") + # intl._t("foo") # intl.title("foo") - # handler._("foo") - # formhandler._("foo") + # handler._t("foo") + # formhandler._t("foo") # net.i2p.router.web.Messages.getString("foo") # In a jsp, you must use a helper or handler that has the context set. # To start a new translation, copy the header from an old translation to the new .po file, # then ant distclean updater. find $JPATHS -name *.java > $TMPFILE xgettext -f $TMPFILE -F -L java --from-code=UTF-8 --add-comments\ - --keyword=_ --keyword=_x --keyword=intl._ --keyword=intl.title \ + --keyword=_t --keyword=_x --keyword=intl._ --keyword=intl.title \ --keyword=handler._ --keyword=formhandler._ \ --keyword=net.i2p.router.web.Messages.getString \ -o ${i}t diff --git a/apps/desktopgui/src/net/i2p/desktopgui/ExternalTrayManager.java b/apps/desktopgui/src/net/i2p/desktopgui/ExternalTrayManager.java index 6fea46fef..2a3a16b63 100644 --- a/apps/desktopgui/src/net/i2p/desktopgui/ExternalTrayManager.java +++ b/apps/desktopgui/src/net/i2p/desktopgui/ExternalTrayManager.java @@ -20,7 +20,7 @@ public class ExternalTrayManager extends TrayManager { @Override public PopupMenu getMainMenu() { PopupMenu popup = new PopupMenu(); - MenuItem startItem = new MenuItem(_("Start I2P")); + MenuItem startItem = new MenuItem(_t("Start I2P")); startItem.addActionListener(new ActionListener() { @Override @@ -35,7 +35,7 @@ public class ExternalTrayManager extends TrayManager { @Override protected void done() { - trayIcon.displayMessage(_("Starting"), _("I2P is starting!"), TrayIcon.MessageType.INFO); + trayIcon.displayMessage(_t("Starting"), _t("I2P is starting!"), TrayIcon.MessageType.INFO); //Hide the tray icon. //We cannot stop the desktopgui program entirely, //since that risks killing the I2P process as well. diff --git a/apps/desktopgui/src/net/i2p/desktopgui/InternalTrayManager.java b/apps/desktopgui/src/net/i2p/desktopgui/InternalTrayManager.java index e1247dde6..1cb464308 100644 --- a/apps/desktopgui/src/net/i2p/desktopgui/InternalTrayManager.java +++ b/apps/desktopgui/src/net/i2p/desktopgui/InternalTrayManager.java @@ -23,7 +23,7 @@ public class InternalTrayManager extends TrayManager { public PopupMenu getMainMenu() { PopupMenu popup = new PopupMenu(); - MenuItem browserLauncher = new MenuItem(_("Launch I2P Browser")); + MenuItem browserLauncher = new MenuItem(_t("Launch I2P Browser")); browserLauncher.addActionListener(new ActionListener() { @Override @@ -47,7 +47,7 @@ public class InternalTrayManager extends TrayManager { }.execute(); } }); - MenuItem desktopguiConfigurationLauncher = new MenuItem(_("Configure desktopgui")); + MenuItem desktopguiConfigurationLauncher = new MenuItem(_t("Configure desktopgui")); desktopguiConfigurationLauncher.addActionListener(new ActionListener() { @Override @@ -64,7 +64,7 @@ public class InternalTrayManager extends TrayManager { } }); - MenuItem restartItem = new MenuItem(_("Restart I2P")); + MenuItem restartItem = new MenuItem(_t("Restart I2P")); restartItem.addActionListener(new ActionListener() { @Override @@ -82,7 +82,7 @@ public class InternalTrayManager extends TrayManager { } }); - MenuItem stopItem = new MenuItem(_("Stop I2P")); + MenuItem stopItem = new MenuItem(_t("Stop I2P")); stopItem.addActionListener(new ActionListener() { @Override diff --git a/apps/desktopgui/src/net/i2p/desktopgui/TrayManager.java b/apps/desktopgui/src/net/i2p/desktopgui/TrayManager.java index f124ee3f6..227050735 100644 --- a/apps/desktopgui/src/net/i2p/desktopgui/TrayManager.java +++ b/apps/desktopgui/src/net/i2p/desktopgui/TrayManager.java @@ -78,7 +78,7 @@ public abstract class TrayManager { return image; } - protected static String _(String s) { - return DesktopguiTranslator._(s); + protected static String _t(String s) { + return DesktopguiTranslator._t(s); } } diff --git a/apps/desktopgui/src/net/i2p/desktopgui/gui/DesktopguiConfigurationFrame.java b/apps/desktopgui/src/net/i2p/desktopgui/gui/DesktopguiConfigurationFrame.java index 1e49f6609..a697c5779 100644 --- a/apps/desktopgui/src/net/i2p/desktopgui/gui/DesktopguiConfigurationFrame.java +++ b/apps/desktopgui/src/net/i2p/desktopgui/gui/DesktopguiConfigurationFrame.java @@ -40,10 +40,10 @@ public class DesktopguiConfigurationFrame extends javax.swing.JFrame { cancelButton = new javax.swing.JButton(); setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); - setTitle(_("Tray icon configuration")); + setTitle(_t("Tray icon configuration")); desktopguiEnabled.setSelected(true); - desktopguiEnabled.setText(_("Should tray icon be enabled?")); + desktopguiEnabled.setText(_t("Should tray icon be enabled?")); desktopguiEnabled.setActionCommand("shouldDesktopguiBeEnabled"); okButton.setText("OK"); @@ -98,8 +98,8 @@ public class DesktopguiConfigurationFrame extends javax.swing.JFrame { configureDesktopgui(); }//GEN-LAST:event_okButtonMouseReleased - protected static String _(String s) { - return DesktopguiTranslator._(s); + protected static String _t(String s) { + return DesktopguiTranslator._t(s); } private void configureDesktopgui() { diff --git a/apps/desktopgui/src/net/i2p/desktopgui/i18n/DesktopguiTranslator.java b/apps/desktopgui/src/net/i2p/desktopgui/i18n/DesktopguiTranslator.java index e95cbc01f..3778c4ad9 100644 --- a/apps/desktopgui/src/net/i2p/desktopgui/i18n/DesktopguiTranslator.java +++ b/apps/desktopgui/src/net/i2p/desktopgui/i18n/DesktopguiTranslator.java @@ -16,11 +16,11 @@ public class DesktopguiTranslator { return ctx; } - public static String _(String s) { + public static String _t(String s) { return Translate.getString(s, getRouterContext(), BUNDLE_NAME); } - public static String _(String s, Object o) { + public static String _t(String s, Object o) { return Translate.getString(s, o, getRouterContext(), BUNDLE_NAME); } } diff --git a/apps/i2psnark/java/bundle-messages.sh b/apps/i2psnark/java/bundle-messages.sh index 033e1195b..9632ee958 100755 --- a/apps/i2psnark/java/bundle-messages.sh +++ b/apps/i2psnark/java/bundle-messages.sh @@ -63,13 +63,13 @@ do echo "Updating the $i file from the tags..." # extract strings from java and jsp files, and update messages.po files # translate calls must be one of the forms: - # _("foo") + # _t("foo") # _x("foo") # To start a new translation, copy the header from an old translation to the new .po file, # then ant distclean poupdate. find $JPATHS -name *.java > $TMPFILE xgettext -f $TMPFILE -F -L java --from-code=UTF-8 --add-comments\ - --keyword=_ --keyword=_x \ + --keyword=_t --keyword=_x \ -o ${i}t if [ $? -ne 0 ] then diff --git a/apps/i2psnark/java/src/org/klomp/snark/I2PSnarkUtil.java b/apps/i2psnark/java/src/org/klomp/snark/I2PSnarkUtil.java index 75570e04a..e75ef301e 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/I2PSnarkUtil.java +++ b/apps/i2psnark/java/src/org/klomp/snark/I2PSnarkUtil.java @@ -660,7 +660,7 @@ public class I2PSnarkUtil { * The {0} will be replaced by the parameter. * Single quotes must be doubled, i.e. ' -> '' in the string. * @param o parameter, not translated. - * To tranlslate parameter also, use _("foo {0} bar", _("baz")) + * To tranlslate parameter also, use _t("foo {0} bar", _t("baz")) * Do not double the single quotes in the parameter. * Use autoboxing to call with ints, longs, floats, etc. */ diff --git a/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java b/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java index ee9aa5ccb..bcb4fa34c 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java +++ b/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java @@ -776,9 +776,9 @@ public class SnarkManager implements CompleteListener { _util.setMaxUploaders(limit); changed = true; _config.setProperty(PROP_UPLOADERS_TOTAL, Integer.toString(limit)); - addMessage(_("Total uploaders limit changed to {0}", limit)); + addMessage(_t("Total uploaders limit changed to {0}", limit)); } else { - addMessage(_("Minimum total uploaders limit is {0}", Snark.MIN_TOTAL_UPLOADERS)); + addMessage(_t("Minimum total uploaders limit is {0}", Snark.MIN_TOTAL_UPLOADERS)); } } } @@ -790,9 +790,9 @@ public class SnarkManager implements CompleteListener { _util.setMaxUpBW(limit); changed = true; _config.setProperty(PROP_UPBW_MAX, Integer.toString(limit)); - addMessage(_("Up BW limit changed to {0}KBps", limit)); + addMessage(_t("Up BW limit changed to {0}KBps", limit)); } else { - addMessage(_("Minimum up bandwidth limit is {0}KBps", MIN_UP_BW)); + addMessage(_t("Minimum up bandwidth limit is {0}KBps", MIN_UP_BW)); } } } @@ -804,7 +804,7 @@ public class SnarkManager implements CompleteListener { _util.setStartupDelay(minutes); changed = true; _config.setProperty(PROP_STARTUP_DELAY, Integer.toString(minutes)); - addMessage(_("Startup delay changed to {0}", DataHelper.formatDuration2(minutes * (60L * 1000)))); + addMessage(_t("Startup delay changed to {0}", DataHelper.formatDuration2(minutes * (60L * 1000)))); } } @@ -815,9 +815,9 @@ public class SnarkManager implements CompleteListener { changed = true; _config.setProperty(PROP_REFRESH_DELAY, Integer.toString(secs)); if (secs >= 0) - addMessage(_("Refresh time changed to {0}", DataHelper.formatDuration2(secs * 1000))); + addMessage(_t("Refresh time changed to {0}", DataHelper.formatDuration2(secs * 1000))); else - addMessage(_("Refresh disabled")); + addMessage(_t("Refresh disabled")); } } catch (NumberFormatException nfe) {} } @@ -833,7 +833,7 @@ public class SnarkManager implements CompleteListener { changed = true; pageSize = Integer.toString(size); _config.setProperty(PROP_PAGE_SIZE, pageSize); - addMessage(_("Page size changed to {0}", pageSize)); + addMessage(_t("Page size changed to {0}", pageSize)); } } catch (NumberFormatException nfe) {} } @@ -842,18 +842,18 @@ public class SnarkManager implements CompleteListener { dataDir = DataHelper.stripHTML(dataDir.trim()); File dd = new File(dataDir); if (!dd.isAbsolute()) { - addMessage(_("Data directory must be an absolute path") + ": " + dataDir); + addMessage(_t("Data directory must be an absolute path") + ": " + dataDir); } else if (!dd.exists()) { - addMessage(_("Data directory does not exist") + ": " + dataDir); + addMessage(_t("Data directory does not exist") + ": " + dataDir); } else if (!dd.isDirectory()) { - addMessage(_("Not a directory") + ": " + dataDir); + addMessage(_t("Not a directory") + ": " + dataDir); } else if (!dd.canRead()) { - addMessage(_("Unreadable") + ": " + dataDir); + addMessage(_t("Unreadable") + ": " + dataDir); } else { changed = true; interruptMonitor = true; _config.setProperty(PROP_DIR, dataDir); - addMessage(_("Data directory changed to {0}", dataDir)); + addMessage(_t("Data directory changed to {0}", dataDir)); } } @@ -908,37 +908,37 @@ public class SnarkManager implements CompleteListener { p.putAll(opts); _util.setI2CPConfig(i2cpHost, port, p); _util.setMaxUpBW(getInt(PROP_UPBW_MAX, DEFAULT_MAX_UP_BW)); - addMessage(_("I2CP and tunnel changes will take effect after stopping all torrents")); + addMessage(_t("I2CP and tunnel changes will take effect after stopping all torrents")); } else if (!reconnect) { // The usual case, the other two are if not in router context _config.setProperty(PROP_I2CP_OPTS, i2cpOpts.trim()); - addMessage(_("I2CP options changed to {0}", i2cpOpts)); + addMessage(_t("I2CP options changed to {0}", i2cpOpts)); _util.setI2CPConfig(oldI2CPHost, oldI2CPPort, opts); } else { // Won't happen, I2CP host/port, are hidden in the GUI if in router context if (_util.connected()) { _util.disconnect(); - addMessage(_("Disconnecting old I2CP destination")); + addMessage(_t("Disconnecting old I2CP destination")); } - addMessage(_("I2CP settings changed to {0}", i2cpHost + ':' + port + ' ' + i2cpOpts)); + addMessage(_t("I2CP settings changed to {0}", i2cpHost + ':' + port + ' ' + i2cpOpts)); _util.setI2CPConfig(i2cpHost, port, opts); _util.setMaxUpBW(getInt(PROP_UPBW_MAX, DEFAULT_MAX_UP_BW)); boolean ok = _util.connect(); if (!ok) { - addMessage(_("Unable to connect with the new settings, reverting to the old I2CP settings")); + addMessage(_t("Unable to connect with the new settings, reverting to the old I2CP settings")); _util.setI2CPConfig(oldI2CPHost, oldI2CPPort, oldOpts); ok = _util.connect(); if (!ok) - addMessage(_("Unable to reconnect with the old settings!")); + addMessage(_t("Unable to reconnect with the old settings!")); } else { - addMessage(_("Reconnected on the new I2CP destination")); + addMessage(_t("Reconnected on the new I2CP destination")); _config.setProperty(PROP_I2CP_HOST, i2cpHost.trim()); _config.setProperty(PROP_I2CP_PORT, "" + port); _config.setProperty(PROP_I2CP_OPTS, i2cpOpts.trim()); // no PeerAcceptors/I2PServerSockets to deal with, since all snarks are inactive for (Snark snark : _snarks.values()) { if (snark.restartAcceptor()) { - addMessage(_("I2CP listener restarted for \"{0}\"", snark.getBaseName())); + addMessage(_t("I2CP listener restarted for \"{0}\"", snark.getBaseName())); // this is the common ConnectionAcceptor, so we only need to do it once break; } @@ -952,44 +952,44 @@ public class SnarkManager implements CompleteListener { _config.setProperty(PROP_FILES_PUBLIC, Boolean.toString(filesPublic)); _util.setFilesPublic(filesPublic); if (filesPublic) - addMessage(_("New files will be publicly readable")); + addMessage(_t("New files will be publicly readable")); else - addMessage(_("New files will not be publicly readable")); + addMessage(_t("New files will not be publicly readable")); changed = true; } if (shouldAutoStart() != autoStart) { _config.setProperty(PROP_AUTO_START, Boolean.toString(autoStart)); if (autoStart) - addMessage(_("Enabled autostart")); + addMessage(_t("Enabled autostart")); else - addMessage(_("Disabled autostart")); + addMessage(_t("Disabled autostart")); changed = true; } if (_util.shouldUseOpenTrackers() != useOpenTrackers) { _config.setProperty(PROP_USE_OPENTRACKERS, useOpenTrackers + ""); if (useOpenTrackers) - addMessage(_("Enabled open trackers - torrent restart required to take effect.")); + addMessage(_t("Enabled open trackers - torrent restart required to take effect.")); else - addMessage(_("Disabled open trackers - torrent restart required to take effect.")); + addMessage(_t("Disabled open trackers - torrent restart required to take effect.")); _util.setUseOpenTrackers(useOpenTrackers); changed = true; } if (_util.shouldUseDHT() != useDHT) { _config.setProperty(PROP_USE_DHT, Boolean.toString(useDHT)); if (useDHT) - addMessage(_("Enabled DHT.")); + addMessage(_t("Enabled DHT.")); else - addMessage(_("Disabled DHT.")); + addMessage(_t("Disabled DHT.")); if (_util.connected()) - addMessage(_("DHT change requires tunnel shutdown and reopen")); + addMessage(_t("DHT change requires tunnel shutdown and reopen")); _util.setUseDHT(useDHT); changed = true; } if (theme != null) { if(!theme.equals(_config.getProperty(PROP_THEME))) { _config.setProperty(PROP_THEME, theme); - addMessage(_("{0} theme loaded, return to main i2psnark page to view.", theme)); + addMessage(_t("{0} theme loaded, return to main i2psnark page to view.", theme)); changed = true; } } @@ -999,7 +999,7 @@ public class SnarkManager implements CompleteListener { // Data dir changed. this will stop and remove all old torrents, and add the new ones _monitor.interrupt(); } else { - addMessage(_("Configuration unchanged.")); + addMessage(_t("Configuration unchanged.")); } } @@ -1031,7 +1031,7 @@ public class SnarkManager implements CompleteListener { if (ot == null) ot = getListConfig(PROP_OPENTRACKERS, DEFAULT_OPENTRACKERS); _util.setOpenTrackers(ot); - addMessage(_("Open Tracker list changed - torrent restart required to take effect.")); + addMessage(_t("Open Tracker list changed - torrent restart required to take effect.")); saveConfig(); } @@ -1041,7 +1041,7 @@ public class SnarkManager implements CompleteListener { */ public void savePrivateTrackers(List pt) { setListConfig(PROP_PRIVATETRACKERS, pt); - addMessage(_("Private tracker list changed - affects newly created torrents only.")); + addMessage(_t("Private tracker list changed - affects newly created torrents only.")); saveConfig(); } @@ -1087,7 +1087,7 @@ public class SnarkManager implements CompleteListener { DataHelper.storeProps(_config, _configFile); } } catch (IOException ioe) { - addMessage(_("Unable to save the config to {0}", _configFile.getAbsolutePath())); + addMessage(_t("Unable to save the config to {0}", _configFile.getAbsolutePath())); } } @@ -1168,10 +1168,10 @@ public class SnarkManager implements CompleteListener { */ private void addTorrent(String filename, File baseFile, boolean dontAutoStart, File dataDir) { if ((!dontAutoStart) && !_util.connected()) { - addMessage(_("Connecting to I2P")); + addMessage(_t("Connecting to I2P")); boolean ok = _util.connect(); if (!ok) { - addMessage(_("Error connecting to I2P - check your I2CP settings!")); + addMessage(_t("Error connecting to I2P - check your I2CP settings!")); return; } } @@ -1180,7 +1180,7 @@ public class SnarkManager implements CompleteListener { filename = sfile.getCanonicalPath(); } catch (IOException ioe) { _log.error("Unable to add the torrent " + filename, ioe); - addMessage(_("Error: Could not add the torrent {0}", filename) + ": " + ioe); + addMessage(_t("Error: Could not add the torrent {0}", filename) + ": " + ioe); return; } if (dataDir == null) @@ -1203,7 +1203,7 @@ public class SnarkManager implements CompleteListener { fis = new FileInputStream(sfile); } catch (IOException ioe) { // catch this here so we don't try do delete it below - addMessage(_("Cannot open \"{0}\"", sfile.getName()) + ": " + ioe.getMessage()); + addMessage(_t("Cannot open \"{0}\"", sfile.getName()) + ": " + ioe.getMessage()); return; } @@ -1222,21 +1222,21 @@ public class SnarkManager implements CompleteListener { Snark snark = getTorrentByInfoHash(info.getInfoHash()); if (snark != null) { // TODO - if the existing one is a magnet, delete it and add the metainfo instead? - addMessage(_("Torrent with this info hash is already running: {0}", snark.getBaseName())); + addMessage(_t("Torrent with this info hash is already running: {0}", snark.getBaseName())); return; } if (!TrackerClient.isValidAnnounce(info.getAnnounce())) { if (info.isPrivate()) { - addMessage(_("ERROR - No I2P trackers in private torrent \"{0}\"", info.getName())); + addMessage(_t("ERROR - No I2P trackers in private torrent \"{0}\"", info.getName())); } else if (!_util.getOpenTrackers().isEmpty()) { - addMessage(_("Warning - No I2P trackers in \"{0}\", will announce to I2P open trackers and DHT only.", info.getName())); - //addMessage(_("Warning - No I2P trackers in \"{0}\", will announce to I2P open trackers only.", info.getName())); + addMessage(_t("Warning - No I2P trackers in \"{0}\", will announce to I2P open trackers and DHT only.", info.getName())); + //addMessage(_t("Warning - No I2P trackers in \"{0}\", will announce to I2P open trackers only.", info.getName())); } else if (_util.shouldUseDHT()) { - addMessage(_("Warning - No I2P trackers in \"{0}\", and open trackers are disabled, will announce to DHT only.", info.getName())); + addMessage(_t("Warning - No I2P trackers in \"{0}\", and open trackers are disabled, will announce to DHT only.", info.getName())); } else { - addMessage(_("Warning - No I2P trackers in \"{0}\", and DHT and open trackers are disabled, you should enable open trackers or DHT before starting the torrent.", info.getName())); - //addMessage(_("Warning - No I2P Trackers found in \"{0}\". Make sure Open Tracker is enabled before starting this torrent.", info.getName())); + addMessage(_t("Warning - No I2P trackers in \"{0}\", and DHT and open trackers are disabled, you should enable open trackers or DHT before starting the torrent.", info.getName())); + //addMessage(_t("Warning - No I2P Trackers found in \"{0}\". Make sure Open Tracker is enabled before starting this torrent.", info.getName())); dontAutoStart = true; } } @@ -1261,20 +1261,20 @@ public class SnarkManager implements CompleteListener { } catch (IOException ioe) { // close before rename/delete for windows if (fis != null) try { fis.close(); fis = null; } catch (IOException ioe2) {} - String err = _("Torrent in \"{0}\" is invalid", sfile.toString()) + ": " + ioe.getMessage(); + String err = _t("Torrent in \"{0}\" is invalid", sfile.toString()) + ": " + ioe.getMessage(); addMessage(err); _log.error(err, ioe); File rename = new File(filename + ".BAD"); if (rename.exists()) { if (sfile.delete()) - addMessage(_("Torrent file deleted: {0}", sfile.toString())); + addMessage(_t("Torrent file deleted: {0}", sfile.toString())); } else { if (FileUtil.rename(sfile, rename)) - addMessage(_("Torrent file moved from {0} to {1}", sfile.toString(), rename.toString())); + addMessage(_t("Torrent file moved from {0} to {1}", sfile.toString(), rename.toString())); } return; } catch (OutOfMemoryError oom) { - addMessage(_("ERROR - Out of memory, cannot create torrent from {0}", sfile.getName()) + ": " + oom.getMessage()); + addMessage(_t("ERROR - Out of memory, cannot create torrent from {0}", sfile.getName()) + ": " + oom.getMessage()); return; } finally { if (fis != null) try { fis.close(); } catch (IOException ioe) {} @@ -1295,9 +1295,9 @@ public class SnarkManager implements CompleteListener { // Were we running last time? if (!dontAutoStart && shouldAutoStart() && running) { torrent.startTorrent(); - addMessage(_("Torrent added and started: \"{0}\"", torrent.getBaseName())); + addMessage(_t("Torrent added and started: \"{0}\"", torrent.getBaseName())); } else { - addMessage(_("Torrent added: \"{0}\"", torrent.getBaseName())); + addMessage(_t("Torrent added: \"{0}\"", torrent.getBaseName())); } } @@ -1362,7 +1362,7 @@ public class SnarkManager implements CompleteListener { synchronized (_snarks) { Snark snark = getTorrentByInfoHash(ih); if (snark != null) { - addMessage(_("Torrent with this info hash is already running: {0}", snark.getBaseName())); + addMessage(_t("Torrent with this info hash is already running: {0}", snark.getBaseName())); return null; } // Tell the dir monitor not to delete us @@ -1373,17 +1373,17 @@ public class SnarkManager implements CompleteListener { } if (autoStart) { startTorrent(ih); - addMessage(_("Fetching {0}", name)); + addMessage(_t("Fetching {0}", name)); DHT dht = _util.getDHT(); boolean shouldWarn = _util.connected() && _util.getOpenTrackers().isEmpty() && ((!_util.shouldUseDHT()) || dht == null || dht.size() <= 0); if (shouldWarn) { - addMessage(_("Open trackers are disabled and we have no DHT peers. " + + addMessage(_t("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.", name)); } } else { - addMessage(_("Adding {0}", name)); + addMessage(_t("Adding {0}", name)); } return torrent; } @@ -1416,7 +1416,7 @@ public class SnarkManager implements CompleteListener { synchronized (_snarks) { Snark snark = getTorrentByInfoHash(torrent.getInfoHash()); if (snark != null) { - addMessage(_("Download already running: {0}", snark.getBaseName())); + addMessage(_t("Download already running: {0}", snark.getBaseName())); return; } String name = torrent.getName(); @@ -1450,7 +1450,7 @@ public class SnarkManager implements CompleteListener { synchronized (_snarks) { Snark snark = getTorrentByInfoHash(metainfo.getInfoHash()); if (snark != null) { - addMessage(_("Torrent with this info hash is already running: {0}", snark.getBaseName())); + addMessage(_t("Torrent with this info hash is already running: {0}", snark.getBaseName())); return false; } else { saveTorrentStatus(metainfo, bitfield, null, baseFile, true, 0, true); // no file priorities @@ -1461,7 +1461,7 @@ public class SnarkManager implements CompleteListener { // hold the lock for a long time addTorrent(filename, baseFile, dontAutoStart); } catch (IOException ioe) { - addMessage(_("Failed to copy torrent file to {0}", filename)); + addMessage(_t("Failed to copy torrent file to {0}", filename)); _log.error("Failed to write torrent file", ioe); return false; } @@ -1487,7 +1487,7 @@ public class SnarkManager implements CompleteListener { synchronized (_snarks) { boolean success = FileUtil.copy(fromfile.getAbsolutePath(), filename, false); if (!success) { - addMessage(_("Failed to copy torrent file to {0}", filename)); + addMessage(_t("Failed to copy torrent file to {0}", filename)); _log.error("Failed to write torrent file to " + filename); return; } @@ -1901,18 +1901,18 @@ public class SnarkManager implements CompleteListener { private String validateTorrent(MetaInfo info) { List> files = info.getFiles(); if ( (files != null) && (files.size() > MAX_FILES_PER_TORRENT) ) { - return _("Too many files in \"{0}\" ({1})!", info.getName(), files.size()); + return _t("Too many files in \"{0}\" ({1})!", info.getName(), files.size()); } else if ( (files == null) && (info.getName().endsWith(".torrent")) ) { - return _("Torrent file \"{0}\" cannot end in \".torrent\"!", info.getName()); + return _t("Torrent file \"{0}\" cannot end in \".torrent\"!", info.getName()); } else if (info.getPieces() <= 0) { - return _("No pieces in \"{0}\"!", info.getName()); + return _t("No pieces in \"{0}\"!", info.getName()); } else if (info.getPieces() > Storage.MAX_PIECES) { - return _("Too many pieces in \"{0}\", limit is {1}!", info.getName(), Storage.MAX_PIECES); + return _t("Too many pieces in \"{0}\", limit is {1}!", info.getName(), Storage.MAX_PIECES); } else if (info.getPieceLength(0) > Storage.MAX_PIECE_SIZE) { - return _("Pieces are too large in \"{0}\" ({1}B)!", info.getName(), DataHelper.formatSize2(info.getPieceLength(0))) + ' ' + - _("Limit is {0}B", DataHelper.formatSize2(Storage.MAX_PIECE_SIZE)); + return _t("Pieces are too large in \"{0}\" ({1}B)!", info.getName(), DataHelper.formatSize2(info.getPieceLength(0))) + ' ' + + _t("Limit is {0}B", DataHelper.formatSize2(Storage.MAX_PIECE_SIZE)); } else if (info.getTotalLength() <= 0) { - return _("Torrent \"{0}\" has no data!", info.getName()); + return _t("Torrent \"{0}\" has no data!", info.getName()); } else if (info.getTotalLength() > Storage.MAX_TOTAL_SIZE) { System.out.println("torrent info: " + info.toString()); List lengths = info.getLengths(); @@ -1920,7 +1920,7 @@ public class SnarkManager implements CompleteListener { for (int i = 0; i < lengths.size(); i++) System.out.println("File " + i + " is " + lengths.get(i) + " long."); - return _("Torrents larger than {0}B are not supported yet \"{1}\"!", Storage.MAX_TOTAL_SIZE, info.getName()); + return _t("Torrents larger than {0}B are not supported yet \"{1}\"!", Storage.MAX_TOTAL_SIZE, info.getName()); } else { // ok return null; @@ -1937,7 +1937,7 @@ public class SnarkManager implements CompleteListener { filename = sfile.getCanonicalPath(); } catch (IOException ioe) { _log.error("Unable to remove the torrent " + filename, ioe); - addMessage(_("Error: Could not remove the torrent {0}", filename) + ": " + ioe.getMessage()); + addMessage(_t("Error: Could not remove the torrent {0}", filename) + ": " + ioe.getMessage()); return null; } int remaining = 0; @@ -1960,7 +1960,7 @@ public class SnarkManager implements CompleteListener { if (shouldRemove) removeTorrentStatus(torrent); if (!wasStopped) - addMessage(_("Torrent stopped: \"{0}\"", torrent.getBaseName())); + addMessage(_t("Torrent stopped: \"{0}\"", torrent.getBaseName())); } return torrent; } @@ -1979,7 +1979,7 @@ public class SnarkManager implements CompleteListener { boolean wasStopped = torrent.isStopped(); torrent.stopTorrent(); if (!wasStopped) - addMessage(_("Torrent stopped: \"{0}\"", torrent.getBaseName())); + addMessage(_t("Torrent stopped: \"{0}\"", torrent.getBaseName())); if (shouldRemove) removeTorrentStatus(torrent); } @@ -1999,7 +1999,7 @@ public class SnarkManager implements CompleteListener { File torrentFile = new File(filename); torrentFile.delete(); } - addMessage(_("Torrent removed: \"{0}\"", torrent.getBaseName())); + addMessage(_t("Torrent removed: \"{0}\"", torrent.getBaseName())); } private class DirMonitor implements Runnable { @@ -2007,7 +2007,7 @@ public class SnarkManager implements CompleteListener { // don't bother delaying if auto start is false long delay = (60L * 1000) * getStartupDelayMinutes(); if (delay > 0 && shouldAutoStart()) { - addMessage(_("Adding torrents in {0}", DataHelper.formatDuration2(delay))); + addMessage(_t("Adding torrents in {0}", DataHelper.formatDuration2(delay))); try { Thread.sleep(delay); } catch (InterruptedException ie) {} // Remove that first message if (_messages.size() == 1) @@ -2041,7 +2041,7 @@ public class SnarkManager implements CompleteListener { _log.error("Error in the DirectoryMonitor", e); } if (!_snarks.isEmpty()) - addMessage(_("Up bandwidth limit is {0} KBps", _util.getMaxUpBW())); + addMessage(_t("Up bandwidth limit is {0} KBps", _util.getMaxUpBW())); // To fix bug where files were left behind, // but also good for when user removes snarks when i2p is not running // Don't run if there was an error, as we would delete the torrent config @@ -2072,7 +2072,7 @@ public class SnarkManager implements CompleteListener { buf.append('/'); buf.append("\">").append(base).append(""); if (snark.getDownloaded() > 0) - addMessageNoEscape(_("Download finished: {0}", buf.toString())); // + " (" + _("size: {0}B", DataHelper.formatSize2(len)) + ')'); + addMessageNoEscape(_t("Download finished: {0}", buf.toString())); // + " (" + _t("size: {0}B", DataHelper.formatSize2(len)) + ')'); updateStatus(snark); } @@ -2127,11 +2127,11 @@ public class SnarkManager implements CompleteListener { } _magnets.remove(snark.getName()); removeMagnetStatus(snark.getInfoHash()); - addMessage(_("Metainfo received for {0}", snark.getName())); - addMessage(_("Starting up torrent {0}", storage.getBaseName())); + addMessage(_t("Metainfo received for {0}", snark.getName())); + addMessage(_t("Starting up torrent {0}", storage.getBaseName())); return name; } catch (IOException ioe) { - addMessage(_("Failed to copy torrent file to {0}", name)); + addMessage(_t("Failed to copy torrent file to {0}", name)); _log.error("Failed to write torrent file", ioe); } } @@ -2143,7 +2143,7 @@ public class SnarkManager implements CompleteListener { * @since 0.9 */ public void fatal(Snark snark, String error) { - addMessage(_("Error on torrent {0}", snark.getName()) + ": " + error); + addMessage(_t("Error on torrent {0}", snark.getName()) + ": " + error); } /** @@ -2180,7 +2180,7 @@ public class SnarkManager implements CompleteListener { Properties config = getConfig(ih); String name = config.getProperty(PROP_META_MAGNET_DN); if (name == null) - name = _("Magnet") + ' ' + I2PSnarkUtil.toHex(ih); + name = _t("Magnet") + ' ' + I2PSnarkUtil.toHex(ih); String tracker = config.getProperty(PROP_META_MAGNET_TR); String dir = config.getProperty(PROP_META_MAGNET_DIR); File dirf = (dir != null) ? (new File(dir)) : null; @@ -2223,13 +2223,13 @@ public class SnarkManager implements CompleteListener { // already known. noop } else { if (shouldAutoStart() && !_util.connect()) - addMessage(_("Unable to connect to I2P!")); + addMessage(_t("Unable to connect to I2P!")); try { // Snark.fatal() throws a RuntimeException // don't let one bad torrent kill the whole loop addTorrent(name, null, !shouldAutoStart()); } catch (Exception e) { - addMessage(_("Error: Could not add the torrent {0}", name) + ": " + e); + addMessage(_t("Error: Could not add the torrent {0}", name) + ": " + e); _log.error("Unable to add the torrent " + name, e); rv = false; } @@ -2256,17 +2256,17 @@ public class SnarkManager implements CompleteListener { } /** translate */ - private String _(String s) { + private String _t(String s) { return _util.getString(s); } /** translate */ - private String _(String s, Object o) { + private String _t(String s, Object o) { return _util.getString(s, o); } /** translate */ - private String _(String s, Object o, Object o2) { + private String _t(String s, Object o, Object o2) { return _util.getString(s, o, o2); } @@ -2389,8 +2389,8 @@ public class SnarkManager implements CompleteListener { } boolean connected = _util.connected(); if ((!connected) && !_util.isConnecting()) - addMessage(_("Opening the I2P tunnel")); - addMessage(_("Starting up torrent {0}", snark.getBaseName())); + addMessage(_t("Opening the I2P tunnel")); + addMessage(_t("Starting up torrent {0}", snark.getBaseName())); if (connected) { snark.startTorrent(); } else { @@ -2409,7 +2409,7 @@ public class SnarkManager implements CompleteListener { if (_util.connected()) { startAll(); } else { - addMessage(_("Opening the I2P tunnel and starting all torrents.")); + addMessage(_t("Opening the I2P tunnel and starting all torrents.")); for (Snark snark : _snarks.values()) { // mark it for the UI snark.setStarting(); @@ -2472,7 +2472,7 @@ public class SnarkManager implements CompleteListener { for (Snark snark : _snarks.values()) { if (!snark.isStopped()) { if (count == 0) - addMessage(_("Stopping all torrents and closing the I2P tunnel.")); + addMessage(_t("Stopping all torrents and closing the I2P tunnel.")); count++; if (finalShutdown) snark.stopTorrent(true); @@ -2491,14 +2491,14 @@ public class SnarkManager implements CompleteListener { // Schedule this even for final shutdown, as there's a chance // that it's just this webapp that is stopping. _context.simpleTimer2().addEvent(new Disconnector(), 60*1000); - addMessage(_("Closing I2P tunnel after notifying trackers.")); + addMessage(_t("Closing I2P tunnel after notifying trackers.")); if (finalShutdown) { try { Thread.sleep(5*1000); } catch (InterruptedException ie) {} } } else { _util.disconnect(); _stopping = false; - addMessage(_("I2P tunnel closed.")); + addMessage(_t("I2P tunnel closed.")); } } } @@ -2509,7 +2509,7 @@ public class SnarkManager implements CompleteListener { if (_util.connected()) { _util.disconnect(); _stopping = false; - addMessage(_("I2P tunnel closed.")); + addMessage(_t("I2P tunnel closed.")); } } } @@ -2552,13 +2552,13 @@ public class SnarkManager implements CompleteListener { int pieces = snark.getPieces(); double completion = (pieces - snark.getNeeded()) / (double) pieces; String complete = (new DecimalFormat("0.00%")).format(completion); - addMessage(_("Finished recheck of torrent {0}, now {1} complete", snark.getBaseName(), complete)); + addMessage(_t("Finished recheck of torrent {0}, now {1} complete", snark.getBaseName(), complete)); } else { - addMessage(_("Finished recheck of torrent {0}, unchanged", snark.getBaseName())); + addMessage(_t("Finished recheck of torrent {0}, unchanged", snark.getBaseName())); } } catch (Exception e) { _log.error("Error rechecking " + snark.getBaseName(), e); - addMessage(_("Error checking the torrent {0}", snark.getBaseName()) + ": " + e); + addMessage(_t("Error checking the torrent {0}", snark.getBaseName()) + ": " + e); } } } diff --git a/apps/i2psnark/java/src/org/klomp/snark/web/FetchAndAdd.java b/apps/i2psnark/java/src/org/klomp/snark/web/FetchAndAdd.java index 99e2f62a6..5537b33f1 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/web/FetchAndAdd.java +++ b/apps/i2psnark/java/src/org/klomp/snark/web/FetchAndAdd.java @@ -77,7 +77,7 @@ public class FetchAndAdd extends Snark implements EepGet.StatusListener, Runnabl _log = ctx.logManager().getLog(FetchAndAdd.class); _mgr = mgr; _url = url; - _name = _("Download torrent file from {0}", url); + _name = _t("Download torrent file from {0}", url); _dataDir = dataDir; byte[] fake = null; try { @@ -90,7 +90,7 @@ public class FetchAndAdd extends Snark implements EepGet.StatusListener, Runnabl * Set off by startTorrent() */ public void run() { - _mgr.addMessageNoEscape(_("Fetching {0}", urlify(_url))); + _mgr.addMessageNoEscape(_t("Fetching {0}", urlify(_url))); File file = get(); if (!_isRunning) // stopped? return; @@ -100,7 +100,7 @@ public class FetchAndAdd extends Snark implements EepGet.StatusListener, Runnabl _mgr.deleteMagnet(this); add(file); } else { - _mgr.addMessageNoEscape(_("Torrent was not retrieved from {0}", urlify(_url)) + + _mgr.addMessageNoEscape(_t("Torrent was not retrieved from {0}", urlify(_url)) + ((_failCause != null) ? (": " + DataHelper.stripHTML(_failCause)) : "")); } if (file != null) @@ -127,7 +127,7 @@ public class FetchAndAdd extends Snark implements EepGet.StatusListener, Runnabl out.deleteOnExit(); if (!_mgr.util().connected()) { - _mgr.addMessage(_("Opening the I2P tunnel")); + _mgr.addMessage(_t("Opening the I2P tunnel")); if (!_mgr.util().connect()) return null; } @@ -154,7 +154,7 @@ public class FetchAndAdd extends Snark implements EepGet.StatusListener, Runnabl * This Snark may then be deleted. */ private void add(File file) { - _mgr.addMessageNoEscape(_("Torrent fetched from {0}", urlify(_url))); + _mgr.addMessageNoEscape(_t("Torrent fetched from {0}", urlify(_url))); FileInputStream in = null; try { in = new FileInputStream(file); @@ -163,7 +163,7 @@ public class FetchAndAdd extends Snark implements EepGet.StatusListener, Runnabl try { in.close(); } catch (IOException ioe) {} Snark snark = _mgr.getTorrentByInfoHash(fileInfoHash); if (snark != null) { - _mgr.addMessage(_("Torrent with this info hash is already running: {0}", snark.getBaseName())); + _mgr.addMessage(_t("Torrent with this info hash is already running: {0}", snark.getBaseName())); return; } @@ -175,9 +175,9 @@ public class FetchAndAdd extends Snark implements EepGet.StatusListener, Runnabl if (torrentFile.exists()) { if (_mgr.getTorrent(canonical) != null) - _mgr.addMessage(_("Torrent already running: {0}", name)); + _mgr.addMessage(_t("Torrent already running: {0}", name)); else - _mgr.addMessage(_("Torrent already in the queue: {0}", name)); + _mgr.addMessage(_t("Torrent already in the queue: {0}", name)); } else { // This may take a LONG time to create the storage. _mgr.copyAndAddTorrent(file, canonical, _dataDir); @@ -188,9 +188,9 @@ public class FetchAndAdd extends Snark implements EepGet.StatusListener, Runnabl throw new IOException("Unknown error - check logs"); } } catch (IOException ioe) { - _mgr.addMessageNoEscape(_("Torrent at {0} was not valid", urlify(_url)) + ": " + DataHelper.stripHTML(ioe.getMessage())); + _mgr.addMessageNoEscape(_t("Torrent at {0} was not valid", urlify(_url)) + ": " + DataHelper.stripHTML(ioe.getMessage())); } catch (OutOfMemoryError oom) { - _mgr.addMessageNoEscape(_("ERROR - Out of memory, cannot create torrent from {0}", urlify(_url)) + ": " + DataHelper.stripHTML(oom.getMessage())); + _mgr.addMessageNoEscape(_t("ERROR - Out of memory, cannot create torrent from {0}", urlify(_url)) + ": " + DataHelper.stripHTML(oom.getMessage())); } finally { try { if (in != null) in.close(); } catch (IOException ioe) {} } @@ -345,11 +345,11 @@ public class FetchAndAdd extends Snark implements EepGet.StatusListener, Runnabl // End of EepGet status listeners - private String _(String s) { + private String _t(String s) { return _mgr.util().getString(s); } - private String _(String s, String o) { + private String _t(String s, String o) { return _mgr.util().getString(s, o); } 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 08ea4c24f..72ea2ecad 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java +++ b/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java @@ -266,14 +266,14 @@ public class I2PSnarkServlet extends BasicServlet { "\n" + ""); if (_contextName.equals(DEFAULT_NAME)) - out.write(_("I2PSnark")); + out.write(_t("I2PSnark")); else out.write(_contextName); out.write(" - "); if (isConfigure) - out.write(_("Configuration")); + out.write(_t("Configuration")); else - out.write(_("Anonymous BitTorrent Client")); + out.write(_t("Anonymous BitTorrent Client")); String peerParam = req.getParameter("p"); if ("2".equals(peerParam)) out.write(" | Debug Mode"); @@ -287,7 +287,7 @@ public class I2PSnarkServlet extends BasicServlet { //out.write("<meta http-equiv=\"refresh\" content=\"" + delay + ";/i2psnark/" + peerString + "\">\n"); out.write("<script src=\"/js/ajax.js\" type=\"text/javascript\"></script>\n" + "<script type=\"text/javascript\">\n" + - "var failMessage = \"<div class=\\\"routerdown\\\"><b>" + _("Router is down") + "<\\/b><\\/div>\";\n" + + "var failMessage = \"<div class=\\\"routerdown\\\"><b>" + _t("Router is down") + "<\\/b><\\/div>\";\n" + "function requestAjax1() { ajax(\"" + _contextPath + "/.ajax/xhr1.html" + peerString.replace("&", "&") + // don't html escape in js "\", \"mainsection\", " + (delay*1000) + "); }\n" + @@ -304,27 +304,27 @@ public class I2PSnarkServlet extends BasicServlet { List<Tracker> sortedTrackers = null; if (isConfigure) { out.write("<div class=\"snarknavbar\"><a href=\"" + _contextPath + "/\" title=\""); - out.write(_("Torrents")); + out.write(_t("Torrents")); out.write("\" class=\"snarkRefresh\">"); out.write(toThemeImg("arrow_refresh")); out.write("  "); if (_contextName.equals(DEFAULT_NAME)) - out.write(_("I2PSnark")); + out.write(_t("I2PSnark")); else out.write(_contextName); out.write("</a>"); } else { out.write("<div class=\"snarknavbar\"><a href=\"" + _contextPath + '/' + peerString + "\" title=\""); - out.write(_("Refresh page")); + out.write(_t("Refresh page")); out.write("\" class=\"snarkRefresh\">"); out.write(toThemeImg("arrow_refresh")); out.write("  "); if (_contextName.equals(DEFAULT_NAME)) - out.write(_("I2PSnark")); + out.write(_t("I2PSnark")); else out.write(_contextName); out.write("</a> <a href=\"http://forum.i2p/viewforum.php?f=21\" class=\"snarkRefresh\" target=\"_blank\">"); - out.write(_("Forum")); + out.write(_t("Forum")); out.write("</a>\n"); sortedTrackers = _manager.getSortedTrackers(); @@ -339,7 +339,7 @@ public class I2PSnarkServlet extends BasicServlet { out.write("</div>\n"); String newURL = req.getParameter("newURL"); if (newURL != null && newURL.trim().length() > 0 && req.getMethod().equals("GET")) - _manager.addMessage(_("Click \"Add torrent\" button to fetch torrent")); + _manager.addMessage(_t("Click \"Add torrent\" button to fetch torrent")); out.write("<div class=\"page\"><div id=\"mainsection\" class=\"mainsection\">"); writeMessages(out, isConfigure, peerString); @@ -392,7 +392,7 @@ public class I2PSnarkServlet extends BasicServlet { else out.write("?"); out.write("action=Clear&nonce=" + _nonce + "\">"); - String tx = _("clear messages"); + String tx = _t("clear messages"); out.write(toThemeImg("delete", tx, tx)); out.write("</a>" + "<ul>"); @@ -447,9 +447,9 @@ public class I2PSnarkServlet extends BasicServlet { out.write("<a href=\"" + _contextPath + '/' + getQueryString(req, null, null, sort)); out.write("\">"); } - String tx = _("Status"); + String tx = _t("Status"); out.write(toThemeImg("status", tx, - showSort ? _("Sort by {0}", tx) + showSort ? _t("Sort by {0}", tx) : tx)); if (showSort) out.write("</a>"); @@ -460,13 +460,13 @@ public class I2PSnarkServlet extends BasicServlet { // disable peer view out.write(getQueryString(req, "", null, null)); out.write("\">"); - tx = _("Hide Peers"); + tx = _t("Hide Peers"); out.write(toThemeImg("hidepeers", tx, tx)); } else { // enable peer view out.write(getQueryString(req, "1", null, null)); out.write("\">"); - tx = _("Show Peers"); + tx = _t("Show Peers"); out.write(toThemeImg("showpeers", tx, tx)); } out.write("</a><br>\n"); @@ -489,9 +489,9 @@ public class I2PSnarkServlet extends BasicServlet { out.write("<a href=\"" + _contextPath + '/' + getQueryString(req, null, null, sort)); out.write("\">"); } - tx = _("Torrent"); + tx = _t("Torrent"); out.write(toThemeImg("torrent", tx, - showSort ? _("Sort by {0}", (isTypeSort ? _("File type") : tx)) + showSort ? _t("Sort by {0}", (isTypeSort ? _t("File type") : tx)) : tx)); if (showSort) out.write("</a>"); @@ -507,10 +507,10 @@ public class I2PSnarkServlet extends BasicServlet { out.write("\">"); } // Translators: Please keep short or translate as " " - tx = _("ETA"); + tx = _t("ETA"); out.write(toThemeImg("eta", tx, - showSort ? _("Sort by {0}", _("Estimated time remaining")) - : _("Estimated time remaining"))); + showSort ? _t("Sort by {0}", _t("Estimated time remaining")) + : _t("Estimated time remaining"))); if (showSort) out.write("</a>"); } @@ -533,10 +533,10 @@ public class I2PSnarkServlet extends BasicServlet { out.write("\">"); } // Translators: Please keep short or translate as " " - tx = _("RX"); + tx = _t("RX"); out.write(toThemeImg("head_rx", tx, - showSort ? _("Sort by {0}", (isDlSort ? _("Downloaded") : _("Size"))) - : _("Downloaded"))); + showSort ? _t("Sort by {0}", (isDlSort ? _t("Downloaded") : _t("Size"))) + : _t("Downloaded"))); if (showSort) out.write("</a>"); out.write("</th>\n<th align=\"right\">"); @@ -564,10 +564,10 @@ public class I2PSnarkServlet extends BasicServlet { out.write("\">"); } // Translators: Please keep short or translate as " " - tx = _("TX"); + tx = _t("TX"); out.write(toThemeImg("head_tx", tx, - showSort ? _("Sort by {0}", (nextRatSort ? _("Upload ratio") : _("Uploaded"))) - : _("Uploaded"))); + showSort ? _t("Sort by {0}", (nextRatSort ? _t("Upload ratio") : _t("Uploaded"))) + : _t("Uploaded"))); if (showSort) out.write("</a>"); } @@ -579,10 +579,10 @@ public class I2PSnarkServlet extends BasicServlet { out.write("\">"); } // Translators: Please keep short or translate as " " - tx = _("RX Rate"); + tx = _t("RX Rate"); out.write(toThemeImg("head_rxspeed", tx, - showSort ? _("Sort by {0}", _("Down Rate")) - : _("Down Rate"))); + showSort ? _t("Sort by {0}", _t("Down Rate")) + : _t("Down Rate"))); if (showSort) out.write("</a>"); } @@ -594,10 +594,10 @@ public class I2PSnarkServlet extends BasicServlet { out.write("\">"); } // Translators: Please keep short or translate as " " - tx = _("TX Rate"); + tx = _t("TX Rate"); out.write(toThemeImg("head_txspeed", tx, - showSort ? _("Sort by {0}", _("Up Rate")) - : _("Up Rate"))); + showSort ? _t("Sort by {0}", _t("Up Rate")) + : _t("Up Rate"))); if (showSort) out.write("</a>"); } @@ -613,9 +613,9 @@ public class I2PSnarkServlet extends BasicServlet { //out.write("<input type=\"image\" name=\"action\" value=\"StopAll\" title=\""); out.write("<input type=\"image\" name=\"action_StopAll\" value=\"foo\" title=\""); } - out.write(_("Stop all torrents and the I2P tunnel")); + out.write(_t("Stop all torrents and the I2P tunnel")); out.write("\" src=\"" + _imgPath + "stop_all.png\" alt=\""); - out.write(_("Stop All")); + out.write(_t("Stop All")); out.write("\">"); if (isDegraded) out.write("</a>"); @@ -627,9 +627,9 @@ public class I2PSnarkServlet extends BasicServlet { out.write("<a href=\"" + _contextPath + "/?action=StartAll&nonce=" + _nonce + "\"><img title=\""); else out.write("<input type=\"image\" name=\"action_StartAll\" value=\"foo\" title=\""); - out.write(_("Start all stopped torrents")); + out.write(_t("Start all stopped torrents")); out.write("\" src=\"" + _imgPath + "start_all.png\" alt=\""); - out.write(_("Start All")); + out.write(_t("Start All")); out.write("\">"); if (isDegraded) out.write("</a>"); @@ -641,9 +641,9 @@ public class I2PSnarkServlet extends BasicServlet { out.write("<a href=\"" + _contextPath + "/?action=StartAll&nonce=" + _nonce + "\"><img title=\""); else out.write("<input type=\"image\" name=\"action_StartAll\" value=\"foo\" title=\""); - out.write(_("Start all torrents and the I2P tunnel")); + out.write(_t("Start all torrents and the I2P tunnel")); out.write("\" src=\"" + _imgPath + "start_all.png\" alt=\""); - out.write(_("Start All")); + out.write(_t("Start All")); out.write("\">"); if (isDegraded) out.write("</a>"); @@ -666,13 +666,13 @@ public class I2PSnarkServlet extends BasicServlet { out.write("<tr class=\"snarkTorrentNoneLoaded\">" + "<td class=\"snarkTorrentNoneLoaded\"" + " colspan=\"11\"><i>"); - out.write(_("No torrents loaded.")); + out.write(_t("No torrents loaded.")); out.write("</i></td></tr>\n"); } else /** if (snarks.size() > 1) */ { out.write("<tfoot><tr>\n" + " <th align=\"left\" colspan=\"6\">"); out.write(" "); - out.write(_("Totals")); + out.write(_t("Totals")); out.write(": "); out.write(ngettext("1 torrent", "{0} torrents", total)); out.write(", "); @@ -693,7 +693,7 @@ public class I2PSnarkServlet extends BasicServlet { if(!IPString.equals("unknown")) { // Only truncate if it's an actual dest out.write("; "); - out.write(_("Dest")); + out.write(_t("Dest")); out.write(": <tt>"); out.write(IPString.substring(0, 4)); out.write("</tt>"); @@ -821,7 +821,7 @@ public class I2PSnarkServlet extends BasicServlet { out.write("<a href=\"" + _contextPath); out.write(getQueryString(req, null, "", null)); out.write("\">"); - out.write(toThemeImg("control_rewind_blue", _("First"), _("First page"))); + out.write(toThemeImg("control_rewind_blue", _t("First"), _t("First page"))); out.write("</a> "); int prev = Math.max(0, start - pageSize); //if (prev > 0) { @@ -831,7 +831,7 @@ public class I2PSnarkServlet extends BasicServlet { String sprev = (prev > 0) ? Integer.toString(prev) : ""; out.write(getQueryString(req, null, sprev, null)); out.write("\">"); - out.write(toThemeImg("control_back_blue", _("Prev"), _("Previous page"))); + out.write(toThemeImg("control_back_blue", _t("Prev"), _t("Previous page"))); out.write("</a> "); } } else { @@ -853,7 +853,7 @@ public class I2PSnarkServlet extends BasicServlet { page = pages; else page = 1 + (start / pageSize); - //out.write(" " + _("Page {0}", page) + thinsp(noThinsp) + pages + " "); + //out.write(" " + _t("Page {0}", page) + thinsp(noThinsp) + pages + " "); out.write("  " + page + thinsp(noThinsp) + pages + "  "); } if (start + pageSize < total) { @@ -864,7 +864,7 @@ public class I2PSnarkServlet extends BasicServlet { out.write(" <a href=\"" + _contextPath); out.write(getQueryString(req, null, Integer.toString(next), null)); out.write("\">"); - out.write(toThemeImg("control_play_blue", _("Next"), _("Next page"))); + out.write(toThemeImg("control_play_blue", _t("Next"), _t("Next page"))); out.write("</a> "); } // Last @@ -872,7 +872,7 @@ public class I2PSnarkServlet extends BasicServlet { out.write(" <a href=\"" + _contextPath); out.write(getQueryString(req, null, Integer.toString(last), null)); out.write("\">"); - out.write(toThemeImg("control_fastforward_blue", _("Last"), _("Last page"))); + out.write(toThemeImg("control_fastforward_blue", _t("Last"), _t("Last page"))); out.write("</a> "); } else { out.write(" " + @@ -918,7 +918,7 @@ public class I2PSnarkServlet extends BasicServlet { if ( (newFile != null) && (newFile.trim().length() > 0) ) f = new File(newFile.trim()); if ( (f != null) && (!f.exists()) ) { - _manager.addMessage(_("Torrent file {0} does not exist", newFile)); + _manager.addMessage(_t("Torrent file {0} does not exist", newFile)); } if ( (f != null) && (f.exists()) ) { // NOTE - All this is disabled - load from local file disabled @@ -929,16 +929,16 @@ public class I2PSnarkServlet extends BasicServlet { if (local.exists()) { if (_manager.getTorrent(canonical) != null) - _manager.addMessage(_("Torrent already running: {0}", newFile)); + _manager.addMessage(_t("Torrent already running: {0}", newFile)); else - _manager.addMessage(_("Torrent already in the queue: {0}", newFile)); + _manager.addMessage(_t("Torrent already in the queue: {0}", newFile)); } else { boolean ok = FileUtil.copy(f.getAbsolutePath(), local.getAbsolutePath(), true); if (ok) { - _manager.addMessage(_("Copying torrent to {0}", local.getAbsolutePath())); + _manager.addMessage(_t("Copying torrent to {0}", local.getAbsolutePath())); _manager.addTorrent(canonical); } else { - _manager.addMessage(_("Unable to copy the torrent to {0}", local.getAbsolutePath()) + ' ' + _("from {0}", f.getAbsolutePath())); + _manager.addMessage(_t("Unable to copy the torrent to {0}", local.getAbsolutePath()) + ' ' + _t("from {0}", f.getAbsolutePath())); } } } catch (IOException ioe) { @@ -954,11 +954,11 @@ public class I2PSnarkServlet extends BasicServlet { if (newDir.length() > 0) { dir = new SecureFile(newDir); if (!dir.isAbsolute()) { - _manager.addMessage(_("Data directory must be an absolute path") + ": " + dir); + _manager.addMessage(_t("Data directory must be an absolute path") + ": " + dir); return; } if (!dir.isDirectory() && !dir.mkdirs()) { - _manager.addMessage(_("Data directory cannot be created") + ": " + dir); + _manager.addMessage(_t("Data directory cannot be created") + ": " + dir); return; } Collection<Snark> snarks = _manager.getTorrents(); @@ -968,7 +968,7 @@ public class I2PSnarkServlet extends BasicServlet { continue; File sbase = storage.getBase(); if (isParentOf(sbase, dir)) { - _manager.addMessage(_("Cannot add torrent {0} inside another torrent: {1}", + _manager.addMessage(_t("Cannot add torrent {0} inside another torrent: {1}", dir.getAbsolutePath(), sbase)); return; } @@ -983,7 +983,7 @@ public class I2PSnarkServlet extends BasicServlet { } else if (newURL.length() == 40 && newURL.replaceAll("[a-fA-F0-9]", "").length() == 0) { addMagnet(MagnetURI.MAGNET_FULL + newURL, dir); } else { - _manager.addMessage(_("Invalid URL: Must start with \"http://\", \"{0}\", or \"{1}\"", + _manager.addMessage(_t("Invalid URL: Must start with \"http://\", \"{0}\", or \"{1}\"", MagnetURI.MAGNET, MagnetURI.MAGGOT)); } } else { @@ -1024,7 +1024,7 @@ public class I2PSnarkServlet extends BasicServlet { // magnet - remove and delete are the same thing // Remove not shown on UI so we shouldn't get here _manager.deleteMagnet(snark); - _manager.addMessage(_("Magnet deleted: {0}", name)); + _manager.addMessage(_t("Magnet deleted: {0}", name)); return; } _manager.stopTorrent(snark, true); @@ -1032,7 +1032,7 @@ public class I2PSnarkServlet extends BasicServlet { // yeah, need to, otherwise it'll get autoadded again (at the moment File f = new File(name); f.delete(); - _manager.addMessage(_("Torrent file deleted: {0}", f.getAbsolutePath())); + _manager.addMessage(_t("Torrent file deleted: {0}", f.getAbsolutePath())); break; } } @@ -1051,15 +1051,15 @@ public class I2PSnarkServlet extends BasicServlet { // magnet - remove and delete are the same thing _manager.deleteMagnet(snark); if (snark instanceof FetchAndAdd) - _manager.addMessage(_("Download deleted: {0}", name)); + _manager.addMessage(_t("Download deleted: {0}", name)); else - _manager.addMessage(_("Magnet deleted: {0}", name)); + _manager.addMessage(_t("Magnet deleted: {0}", name)); return; } _manager.stopTorrent(snark, true); File f = new File(name); f.delete(); - _manager.addMessage(_("Torrent file deleted: {0}", f.getAbsolutePath())); + _manager.addMessage(_t("Torrent file deleted: {0}", f.getAbsolutePath())); Storage storage = snark.getStorage(); if (storage == null) break; @@ -1068,18 +1068,18 @@ public class I2PSnarkServlet extends BasicServlet { for (File df : storage.getFiles()) { // should be only one if (df.delete()) - _manager.addMessage(_("Data file deleted: {0}", df.getAbsolutePath())); + _manager.addMessage(_t("Data file deleted: {0}", df.getAbsolutePath())); else - _manager.addMessage(_("Data file could not be deleted: {0}", df.getAbsolutePath())); + _manager.addMessage(_t("Data file could not be deleted: {0}", df.getAbsolutePath())); } break; } // step 1 delete files for (File df : storage.getFiles()) { if (df.delete()) { - //_manager.addMessage(_("Data file deleted: {0}", df.getAbsolutePath())); + //_manager.addMessage(_t("Data file deleted: {0}", df.getAbsolutePath())); } else { - _manager.addMessage(_("Data file could not be deleted: {0}", df.getAbsolutePath())); + _manager.addMessage(_t("Data file could not be deleted: {0}", df.getAbsolutePath())); } } // step 2 delete dirs bottom-up @@ -1092,17 +1092,17 @@ public class I2PSnarkServlet extends BasicServlet { for (File df : dirs) { if (df.delete()) { ok = true; - //_manager.addMessage(_("Data dir deleted: {0}", df.getAbsolutePath())); + //_manager.addMessage(_t("Data dir deleted: {0}", df.getAbsolutePath())); } else { ok = false; - _manager.addMessage(_("Directory could not be deleted: {0}", df.getAbsolutePath())); + _manager.addMessage(_t("Directory could not be deleted: {0}", df.getAbsolutePath())); if (_log.shouldLog(Log.WARN)) _log.warn("Could not delete dir " + df); } } // step 3 message for base (last one) if (ok) - _manager.addMessage(_("Directory deleted: {0}", storage.getBase())); + _manager.addMessage(_t("Directory deleted: {0}", storage.getBase())); break; } } @@ -1153,18 +1153,18 @@ public class I2PSnarkServlet extends BasicServlet { if (baseFile.exists()) { String torrentName = baseFile.getName(); if (torrentName.toLowerCase(Locale.US).endsWith(".torrent")) { - _manager.addMessage(_("Cannot add a torrent ending in \".torrent\": {0}", baseFile.getAbsolutePath())); + _manager.addMessage(_t("Cannot add a torrent ending in \".torrent\": {0}", baseFile.getAbsolutePath())); return; } Snark snark = _manager.getTorrentByBaseName(torrentName); if (snark != null) { - _manager.addMessage(_("Torrent with this name is already running: {0}", torrentName)); + _manager.addMessage(_t("Torrent with this name is already running: {0}", torrentName)); return; } if (isParentOf(baseFile,_manager.getDataDir()) || isParentOf(baseFile, _manager.util().getContext().getBaseDir()) || isParentOf(baseFile, _manager.util().getContext().getConfigDir())) { - _manager.addMessage(_("Cannot add a torrent including an I2P directory: {0}", baseFile.getAbsolutePath())); + _manager.addMessage(_t("Cannot add a torrent including an I2P directory: {0}", baseFile.getAbsolutePath())); return; } Collection<Snark> snarks = _manager.getTorrents(); @@ -1174,12 +1174,12 @@ public class I2PSnarkServlet extends BasicServlet { continue; File sbase = storage.getBase(); if (isParentOf(sbase, baseFile)) { - _manager.addMessage(_("Cannot add torrent {0} inside another torrent: {1}", + _manager.addMessage(_t("Cannot add torrent {0} inside another torrent: {1}", baseFile.getAbsolutePath(), sbase)); return; } if (isParentOf(baseFile, sbase)) { - _manager.addMessage(_("Cannot add torrent {0} including another torrent: {1}", + _manager.addMessage(_t("Cannot add torrent {0} including another torrent: {1}", baseFile.getAbsolutePath(), sbase)); return; } @@ -1205,7 +1205,7 @@ public class I2PSnarkServlet extends BasicServlet { if (!backupURLs.isEmpty()) { // BEP 12 - Put primary first, then the others, each as the sole entry in their own list if (announceURL == null) { - _manager.addMessage(_("Error - Cannot include alternate trackers without a primary tracker")); + _manager.addMessage(_t("Error - Cannot include alternate trackers without a primary tracker")); return; } backupURLs.add(0, announceURL); @@ -1218,7 +1218,7 @@ public class I2PSnarkServlet extends BasicServlet { hasPublic = true; } if (hasPrivate && hasPublic) { - _manager.addMessage(_("Error - Cannot mix private and public trackers in a torrent")); + _manager.addMessage(_t("Error - Cannot mix private and public trackers in a torrent")); return; } announceList = new ArrayList<List<String>>(backupURLs.size()); @@ -1240,18 +1240,18 @@ public class I2PSnarkServlet extends BasicServlet { boolean ok = _manager.addTorrent(info, s.getBitField(), torrentFile.getAbsolutePath(), baseFile, true); if (!ok) return; - _manager.addMessage(_("Torrent created for \"{0}\"", baseFile.getName()) + ": " + torrentFile.getAbsolutePath()); + _manager.addMessage(_t("Torrent created for \"{0}\"", baseFile.getName()) + ": " + torrentFile.getAbsolutePath()); if (announceURL != null && !_manager.util().getOpenTrackers().contains(announceURL)) - _manager.addMessage(_("Many I2P trackers require you to register new torrents before seeding - please do so before starting \"{0}\"", baseFile.getName())); + _manager.addMessage(_t("Many I2P trackers require you to register new torrents before seeding - please do so before starting \"{0}\"", baseFile.getName())); } catch (IOException ioe) { - _manager.addMessage(_("Error creating a torrent for \"{0}\"", baseFile.getAbsolutePath()) + ": " + ioe); + _manager.addMessage(_t("Error creating a torrent for \"{0}\"", baseFile.getAbsolutePath()) + ": " + ioe); _log.error("Error creating a torrent", ioe); } } else { - _manager.addMessage(_("Cannot create a torrent for the nonexistent data: {0}", baseFile.getAbsolutePath())); + _manager.addMessage(_t("Cannot create a torrent for the nonexistent data: {0}", baseFile.getAbsolutePath())); } } else { - _manager.addMessage(_("Error creating torrent - you must enter a file or directory")); + _manager.addMessage(_t("Error creating torrent - you must enter a file or directory")); } } else if ("StopAll".equals(action)) { _manager.stopAllTorrents(false); @@ -1282,7 +1282,7 @@ public class I2PSnarkServlet extends BasicServlet { /** @since 0.9 */ private void processTrackerForm(String action, HttpServletRequest req) { - if (action.equals(_("Delete selected")) || action.equals(_("Save tracker configuration"))) { + if (action.equals(_t("Delete selected")) || action.equals(_t("Save tracker configuration"))) { boolean changed = false; Map<String, Tracker> trackers = _manager.getTrackerMap(); List<String> removed = new ArrayList<String>(); @@ -1299,7 +1299,7 @@ public class I2PSnarkServlet extends BasicServlet { Tracker t; if ((t = trackers.remove(k)) != null) { removed.add(t.announceURL); - _manager.addMessage(_("Removed") + ": " + DataHelper.stripHTML(k)); + _manager.addMessage(_t("Removed") + ": " + DataHelper.stripHTML(k)); changed = true; } } else if (k.startsWith("ttype_")) { @@ -1331,7 +1331,7 @@ public class I2PSnarkServlet extends BasicServlet { if (!priv.equals(oldPriv)) _manager.savePrivateTrackers(priv); - } else if (action.equals(_("Add tracker"))) { + } else if (action.equals(_t("Add tracker"))) { String name = req.getParameter("tname"); String hurl = req.getParameter("thurl"); String aurl = req.getParameter("taurl"); @@ -1354,15 +1354,15 @@ public class I2PSnarkServlet extends BasicServlet { _manager.savePrivateTrackers(newPriv); } } else { - _manager.addMessage(_("Enter valid tracker name and URLs")); + _manager.addMessage(_t("Enter valid tracker name and URLs")); } } else { - _manager.addMessage(_("Enter valid tracker name and URLs")); + _manager.addMessage(_t("Enter valid tracker name and URLs")); } - } else if (action.equals(_("Restore defaults"))) { + } else if (action.equals(_t("Restore defaults"))) { _manager.setDefaultTrackerMap(); _manager.saveOpenTrackers(null); - _manager.addMessage(_("Restored default trackers")); + _manager.addMessage(_t("Restored default trackers")); } else { _manager.addMessage("Unknown POST action: \"" + action + '\"'); } @@ -1470,12 +1470,12 @@ public class I2PSnarkServlet extends BasicServlet { String rowClass = (row % 2 == 0 ? "snarkTorrentEven" : "snarkTorrentOdd"); String statusString; if (snark.isChecking()) { - statusString = toThemeImg("stalled", "", _("Checking")) + "</td>" + - "<td class=\"snarkTorrentStatus\">" + _("Checking") + ' ' + + statusString = toThemeImg("stalled", "", _t("Checking")) + "</td>" + + "<td class=\"snarkTorrentStatus\">" + _t("Checking") + ' ' + (new DecimalFormat("0.00%")).format(snark.getCheckingProgress()); } else if (snark.isAllocating()) { - statusString = toThemeImg("stalled", "", _("Allocating")) + "</td>" + - "<td class=\"snarkTorrentStatus\">" + _("Allocating"); + statusString = toThemeImg("stalled", "", _t("Allocating")) + "</td>" + + "<td class=\"snarkTorrentStatus\">" + _t("Allocating"); } else if (err != null && isRunning && curPeers == 0) { //} else if (err != null && curPeers == 0) { // Also don't show if seeding... but then we won't see the not-registered error @@ -1483,14 +1483,14 @@ public class I2PSnarkServlet extends BasicServlet { // let's only show this if we have no peers, otherwise PEX and DHT should bail us out, user doesn't care //if (isRunning && curPeers > 0 && !showPeers) // statusString = "<img alt=\"\" border=\"0\" src=\"" + _imgPath + "trackererror.png\" title=\"" + err + "\"></td>" + - // "<td class=\"snarkTorrentStatus " + rowClass + "\">" + _("Tracker Error") + + // "<td class=\"snarkTorrentStatus " + rowClass + "\">" + _t("Tracker Error") + // ": <a href=\"" + uri + "?p=" + Base64.encode(snark.getInfoHash()) + "\">" + // curPeers + thinsp(noThinsp) + // ngettext("1 peer", "{0} peers", knownPeers) + "</a>"; //else if (isRunning) //if (isRunning) { statusString = toThemeImg("trackererror", "", err) + "</td>" + - "<td class=\"snarkTorrentStatus\">" + _("Tracker Error") + + "<td class=\"snarkTorrentStatus\">" + _t("Tracker Error") + ": " + curPeers + thinsp(noThinsp) + ngettext("1 peer", "{0} peers", knownPeers); //} else { @@ -1499,11 +1499,11 @@ public class I2PSnarkServlet extends BasicServlet { // else // err = DataHelper.escapeHTML(err); // statusString = toThemeImg("trackererror", "", err) + "</td>" + - // "<td class=\"snarkTorrentStatus\">" + _("Tracker Error"); + // "<td class=\"snarkTorrentStatus\">" + _t("Tracker Error"); //} } else if (snark.isStarting()) { - statusString = toThemeImg("stalled", "", _("Starting")) + "</td>" + - "<td class=\"snarkTorrentStatus\">" + _("Starting"); + statusString = toThemeImg("stalled", "", _t("Starting")) + "</td>" + + "<td class=\"snarkTorrentStatus\">" + _t("Starting"); } else if (remaining == 0 || needed == 0) { // < 0 means no meta size yet // partial complete or seeding if (isRunning) { @@ -1511,11 +1511,11 @@ public class I2PSnarkServlet extends BasicServlet { String txt; if (remaining == 0) { img = "seeding"; - txt = _("Seeding"); + txt = _t("Seeding"); } else { // partial img = "complete"; - txt = _("Complete"); + txt = _t("Complete"); } if (curPeers > 0 && !showPeers) statusString = toThemeImg(img, "", txt) + "</td>" + @@ -1529,42 +1529,42 @@ public class I2PSnarkServlet extends BasicServlet { ": " + curPeers + thinsp(noThinsp) + ngettext("1 peer", "{0} peers", knownPeers); } else { - statusString = toThemeImg("complete", "", _("Complete")) + "</td>" + - "<td class=\"snarkTorrentStatus\">" + _("Complete"); + statusString = toThemeImg("complete", "", _t("Complete")) + "</td>" + + "<td class=\"snarkTorrentStatus\">" + _t("Complete"); } } else { if (isRunning && curPeers > 0 && downBps > 0 && !showPeers) - statusString = toThemeImg("downloading", "", _("OK")) + "</td>" + - "<td class=\"snarkTorrentStatus\">" + _("OK") + + statusString = toThemeImg("downloading", "", _t("OK")) + "</td>" + + "<td class=\"snarkTorrentStatus\">" + _t("OK") + ": <a href=\"" + uri + getQueryString(req, Base64.encode(snark.getInfoHash()), null, null) + "\">" + curPeers + thinsp(noThinsp) + ngettext("1 peer", "{0} peers", knownPeers) + "</a>"; else if (isRunning && curPeers > 0 && downBps > 0) - statusString = toThemeImg("downloading", "", _("OK")) + "</td>" + - "<td class=\"snarkTorrentStatus\">" + _("OK") + + statusString = toThemeImg("downloading", "", _t("OK")) + "</td>" + + "<td class=\"snarkTorrentStatus\">" + _t("OK") + ": " + curPeers + thinsp(noThinsp) + ngettext("1 peer", "{0} peers", knownPeers); else if (isRunning && curPeers > 0 && !showPeers) - statusString = toThemeImg("stalled", "", _("Stalled")) + "</td>" + - "<td class=\"snarkTorrentStatus\">" + _("Stalled") + + statusString = toThemeImg("stalled", "", _t("Stalled")) + "</td>" + + "<td class=\"snarkTorrentStatus\">" + _t("Stalled") + ": <a href=\"" + uri + getQueryString(req, Base64.encode(snark.getInfoHash()), null, null) + "\">" + curPeers + thinsp(noThinsp) + ngettext("1 peer", "{0} peers", knownPeers) + "</a>"; else if (isRunning && curPeers > 0) - statusString = toThemeImg("stalled", "", _("Stalled")) + "</td>" + - "<td class=\"snarkTorrentStatus\">" + _("Stalled") + + statusString = toThemeImg("stalled", "", _t("Stalled")) + "</td>" + + "<td class=\"snarkTorrentStatus\">" + _t("Stalled") + ": " + curPeers + thinsp(noThinsp) + ngettext("1 peer", "{0} peers", knownPeers); else if (isRunning && knownPeers > 0) - statusString = toThemeImg("nopeers", "", _("No Peers")) + "</td>" + - "<td class=\"snarkTorrentStatus\">" + _("No Peers") + + statusString = toThemeImg("nopeers", "", _t("No Peers")) + "</td>" + + "<td class=\"snarkTorrentStatus\">" + _t("No Peers") + ": 0" + thinsp(noThinsp) + knownPeers ; else if (isRunning) - statusString = toThemeImg("nopeers", "", _("No Peers")) + "</td>" + - "<td class=\"snarkTorrentStatus\">" + _("No Peers"); + statusString = toThemeImg("nopeers", "", _t("No Peers")) + "</td>" + + "<td class=\"snarkTorrentStatus\">" + _t("No Peers"); else - statusString = toThemeImg("stopped", "", _("Stopped")) + "</td>" + - "<td class=\"snarkTorrentStatus\">" + _("Stopped"); + statusString = toThemeImg("stopped", "", _t("Stopped")) + "</td>" + + "<td class=\"snarkTorrentStatus\">" + _t("Stopped"); } out.write("<tr class=\"" + rowClass + "\">"); @@ -1593,7 +1593,7 @@ public class I2PSnarkServlet extends BasicServlet { // gets us to the details page instead of the file. StringBuilder buf = new StringBuilder(128); buf.append("<a href=\"").append(encodedBaseName) - .append("/\" title=\"").append(_("Torrent details")) + .append("/\" title=\"").append(_t("Torrent details")) .append("\">"); out.write(buf.toString()); } @@ -1628,9 +1628,9 @@ public class I2PSnarkServlet extends BasicServlet { buf.append('/'); buf.append("\" title=\""); if (isMultiFile) - buf.append(_("View files")); + buf.append(_t("View files")); else - buf.append(_("Open file")); + buf.append(_t("Open file")); buf.append("\">"); out.write(buf.toString()); } @@ -1682,9 +1682,9 @@ public class I2PSnarkServlet extends BasicServlet { getQueryString(req, "", null, null).replace("?", "&") + "\"><img title=\""); else out.write("<input type=\"image\" name=\"action_Stop_" + b64 + "\" value=\"foo\" title=\""); - out.write(_("Stop the torrent")); + out.write(_t("Stop the torrent")); out.write("\" src=\"" + _imgPath + "stop.png\" alt=\""); - out.write(_("Stop")); + out.write(_t("Stop")); out.write("\">"); if (isDegraded) out.write("</a>"); @@ -1697,9 +1697,9 @@ public class I2PSnarkServlet extends BasicServlet { getQueryString(req, "", null, null).replace("?", "&") + "\"><img title=\""); else out.write("<input type=\"image\" name=\"action_Start_" + b64 + "\" value=\"foo\" title=\""); - out.write(_("Start the torrent")); + out.write(_t("Start the torrent")); out.write("\" src=\"" + _imgPath + "start.png\" alt=\""); - out.write(_("Start")); + out.write(_t("Start")); out.write("\">"); if (isDegraded) out.write("</a>"); @@ -1712,16 +1712,16 @@ public class I2PSnarkServlet extends BasicServlet { getQueryString(req, "", null, null).replace("?", "&") + "\"><img title=\""); else out.write("<input type=\"image\" name=\"action_Remove_" + b64 + "\" value=\"foo\" title=\""); - out.write(_("Remove the torrent from the active list, deleting the .torrent file")); + out.write(_t("Remove the torrent from the active list, deleting the .torrent file")); out.write("\" onclick=\"if (!confirm('"); // Can't figure out how to escape double quotes inside the onclick string. // Single quotes in translate strings with parameters must be doubled. // Then the remaining single quote must be escaped - out.write(_("Are you sure you want to delete the file \\''{0}\\'' (downloaded data will not be deleted) ?", + out.write(_t("Are you sure you want to delete the file \\''{0}\\'' (downloaded data will not be deleted) ?", escapeJSString(snark.getName()))); out.write("')) { return false; }\""); out.write(" src=\"" + _imgPath + "remove.png\" alt=\""); - out.write(_("Remove")); + out.write(_t("Remove")); out.write("\">"); if (isDegraded) out.write("</a>"); @@ -1734,16 +1734,16 @@ public class I2PSnarkServlet extends BasicServlet { getQueryString(req, "", null, null).replace("?", "&") + "\"><img title=\""); else out.write("<input type=\"image\" name=\"action_Delete_" + b64 + "\" value=\"foo\" title=\""); - out.write(_("Delete the .torrent file and the associated data file(s)")); + out.write(_t("Delete the .torrent file and the associated data file(s)")); out.write("\" onclick=\"if (!confirm('"); // Can't figure out how to escape double quotes inside the onclick string. // Single quotes in translate strings with parameters must be doubled. // Then the remaining single quote must be escaped - out.write(_("Are you sure you want to delete the torrent \\''{0}\\'' and all downloaded data?", + out.write(_t("Are you sure you want to delete the torrent \\''{0}\\'' and all downloaded data?", escapeJSString(fullBasename))); out.write("')) { return false; }\""); out.write(" src=\"" + _imgPath + "delete.png\" alt=\""); - out.write(_("Delete")); + out.write(_t("Delete")); out.write("\">"); if (isDegraded) out.write("</a>"); @@ -1763,7 +1763,7 @@ public class I2PSnarkServlet extends BasicServlet { String ch = pid != null ? pid.toString().substring(0, 4) : "????"; String client; if ("AwMD".equals(ch)) - client = _("I2PSnark"); + client = _t("I2PSnark"); else if ("BFJT".equals(ch)) client = "I2PRufus"; else if ("TTMt".equals(ch)) @@ -1779,7 +1779,7 @@ public class I2PSnarkServlet extends BasicServlet { else if ("LUtU".equals(ch)) client = "KTorrent" + getAzVersion(pid.getID()); else - client = _("Unknown") + " (" + ch + ')'; + client = _t("Unknown") + " (" + ch + ')'; out.write(client + "  <tt>" + peer.toString().substring(5, 9)+ "</tt>"); if (showDebug) out.write(" inactive " + (peer.getInactiveTime() / 1000) + "s"); @@ -1791,7 +1791,7 @@ public class I2PSnarkServlet extends BasicServlet { if (isValid) { pct = (float) (100.0 * peer.completed() / meta.getPieces()); if (pct >= 100.0) - out.write(_("Seed")); + out.write(_t("Seed")); else { String ps = String.valueOf(pct); if (ps.length() > 5) @@ -1814,9 +1814,9 @@ public class I2PSnarkServlet extends BasicServlet { } else { out.write("<span class=\"choked\"><a title=\""); if (!peer.isInteresting()) - out.write(_("Uninteresting (The peer has no pieces we need)")); + out.write(_t("Uninteresting (The peer has no pieces we need)")); else - out.write(_("Choked (The peer is not allowing us to request pieces)")); + out.write(_t("Choked (The peer is not allowing us to request pieces)")); out.write("\">"); out.write(formatSize(peer.getDownloadRate()) + "ps</a></span>"); } @@ -1836,9 +1836,9 @@ public class I2PSnarkServlet extends BasicServlet { } else { out.write("<span class=\"choked\"><a title=\""); if (!peer.isInterested()) - out.write(_("Uninterested (We have no pieces the peer needs)")); + out.write(_t("Uninterested (We have no pieces the peer needs)")); else - out.write(_("Choking (We are not allowing the peer to request pieces)")); + out.write(_t("Choking (We are not allowing the peer to request pieces)")); out.write("\">"); out.write(formatSize(peer.getUploadRate()) + "ps</a></span>"); } @@ -1954,7 +1954,7 @@ public class I2PSnarkServlet extends BasicServlet { StringBuilder buf = new StringBuilder(128); buf.append("<a href=\"").append(baseURL).append("details.php?dllist=1&filelist=1&info_hash=") .append(TrackerClient.urlencode(infohash)) - .append("\" title=\"").append(_("Details at {0} tracker", name)).append("\" target=\"_blank\">"); + .append("\" title=\"").append(_t("Details at {0} tracker", name)).append("\" target=\"_blank\">"); return buf.toString(); } } @@ -1971,7 +1971,7 @@ public class I2PSnarkServlet extends BasicServlet { if (linkUrl != null) { StringBuilder buf = new StringBuilder(128); buf.append(linkUrl); - toThemeImg(buf, "details", _("Info"), ""); + toThemeImg(buf, "details", _t("Info"), ""); buf.append("</a>"); return buf.toString(); } @@ -2044,31 +2044,31 @@ public class I2PSnarkServlet extends BasicServlet { out.write("<div class=\"addtorrentsection\"><span class=\"snarkConfigTitle\">"); out.write(toThemeImg("add")); out.write(' '); - out.write(_("Add Torrent")); + out.write(_t("Add Torrent")); out.write("</span><hr>\n<table border=\"0\"><tr><td>"); - out.write(_("From URL")); + out.write(_t("From URL")); out.write(":<td><input type=\"text\" name=\"nofilter_newURL\" size=\"85\" value=\"" + newURL + "\" spellcheck=\"false\""); out.write(" title=\""); - out.write(_("Enter the torrent file download URL (I2P only), magnet link, maggot link, or info hash")); + out.write(_t("Enter the torrent file download URL (I2P only), magnet link, maggot link, or info hash")); out.write("\"> \n"); // not supporting from file at the moment, since the file name passed isn't always absolute (so it may not resolve) //out.write("From file: <input type=\"file\" name=\"newFile\" size=\"50\" value=\"" + newFile + "\" /><br>"); out.write("<input type=\"submit\" class=\"add\" value=\""); - out.write(_("Add torrent")); + out.write(_t("Add torrent")); out.write("\" name=\"foo\" ><br>\n" + "<tr><td>"); - out.write(_("Data dir")); + out.write(_t("Data dir")); out.write(":<td><input type=\"text\" name=\"nofilter_newDir\" size=\"85\" value=\"\" spellcheck=\"false\""); out.write(" title=\""); - out.write(_("Enter the directory to save the data in (default {0})", _manager.getDataDir().getAbsolutePath())); + out.write(_t("Enter the directory to save the data in (default {0})", _manager.getDataDir().getAbsolutePath())); out.write("\"></td></tr>\n"); out.write("<tr><td> <td><span class=\"snarkAddInfo\">"); - out.write(_("You can also copy .torrent files to: {0}.", "<code>" + _manager.getDataDir().getAbsolutePath() + "</code>")); + out.write(_t("You can also copy .torrent files to: {0}.", "<code>" + _manager.getDataDir().getAbsolutePath() + "</code>")); out.write("\n"); - out.write(_("Removing a .torrent will cause it to stop.")); + out.write(_t("Removing a .torrent will cause it to stop.")); out.write("<br></span></table>\n"); out.write("</div></form></div>"); } @@ -2081,24 +2081,24 @@ public class I2PSnarkServlet extends BasicServlet { out.write("<span class=\"snarkConfigTitle\">"); out.write(toThemeImg("create")); out.write(' '); - out.write(_("Create Torrent")); + out.write(_t("Create Torrent")); out.write("</span><hr>\n<table border=\"0\"><tr><td>"); //out.write("From file: <input type=\"file\" name=\"newFile\" size=\"50\" value=\"" + newFile + "\" /><br>\n"); - out.write(_("Data to seed")); + out.write(_t("Data to seed")); out.write(":<td>" + "<input type=\"text\" name=\"nofilter_baseFile\" size=\"85\" value=\"" + "\" spellcheck=\"false\" title=\""); - out.write(_("File or directory to seed (full path or within the directory {0} )", + out.write(_t("File or directory to seed (full path or within the directory {0} )", _manager.getDataDir().getAbsolutePath() + File.separatorChar)); out.write("\" ><tr><td>\n"); - out.write(_("Trackers")); + out.write(_t("Trackers")); out.write(":<td><table style=\"width: 30%;\"><tr><td></td><td align=\"center\">"); - out.write(_("Primary")); + out.write(_t("Primary")); out.write("</td><td align=\"center\">"); - out.write(_("Alternates")); + out.write(_t("Alternates")); out.write("</td><td rowspan=\"0\">" + " <input type=\"submit\" class=\"create\" value=\""); - out.write(_("Create torrent")); + out.write(_t("Create torrent")); out.write("\" name=\"foo\" >" + "</td></tr>\n"); for (Tracker t : sortedTrackers) { @@ -2116,16 +2116,16 @@ public class I2PSnarkServlet extends BasicServlet { out.write("\" value=\"foo\"></td></tr>\n"); } out.write("<tr><td><i>"); - out.write(_("none")); + out.write(_t("none")); out.write("</i></td><td align=\"center\"><input type=\"radio\" name=\"announceURL\" value=\"none\""); if (_lastAnnounceURL == null) out.write(" checked"); out.write("></td><td></td></tr></table>\n"); // make the user add a tracker on the config form now - //out.write(_("or")); + //out.write(_t("or")); //out.write(" <input type=\"text\" name=\"announceURLOther\" size=\"57\" value=\"http://\" " + // "title=\""); - //out.write(_("Specify custom tracker announce URL")); + //out.write(_t("Specify custom tracker announce URL")); //out.write("\" > " + out.write("</td></tr>" + "</table>\n" + @@ -2149,32 +2149,32 @@ public class I2PSnarkServlet extends BasicServlet { out.write("<span class=\"snarkConfigTitle\">"); out.write(toThemeImg("config")); out.write(' '); - out.write(_("Configuration")); + out.write(_t("Configuration")); out.write("</span><hr>\n" + "<table border=\"0\"><tr><td>"); - out.write(_("Data directory")); + out.write(_t("Data directory")); out.write(": <td><input name=\"nofilter_dataDir\" size=\"80\" value=\"" + DataHelper.escapeHTML(dataDir) + "\" spellcheck=\"false\"></td>\n" + "<tr><td>"); - out.write(_("Files readable by all")); + out.write(_t("Files readable by all")); out.write(": <td><input type=\"checkbox\" class=\"optbox\" name=\"filesPublic\" value=\"true\" " + (filesPublic ? "checked " : "") + "title=\""); - out.write(_("If checked, other users may access the downloaded files")); + out.write(_t("If checked, other users may access the downloaded files")); out.write("\" >" + "<tr><td>"); - out.write(_("Auto start torrents")); + out.write(_t("Auto start torrents")); out.write(": <td><input type=\"checkbox\" class=\"optbox\" name=\"autoStart\" value=\"true\" " + (autoStart ? "checked " : "") + "title=\""); - out.write(_("If checked, automatically start torrents that are added")); + out.write(_t("If checked, automatically start torrents that are added")); out.write("\" >" + "<tr><td>"); - out.write(_("Theme")); + out.write(_t("Theme")); out.write(": <td><select name='theme'>"); String theme = _manager.getTheme(); String[] themes = _manager.getThemes(); @@ -2188,7 +2188,7 @@ public class I2PSnarkServlet extends BasicServlet { out.write("</select>\n" + "<tr><td>"); - out.write(_("Refresh time")); + out.write(_t("Refresh time")); out.write(": <td><select name=\"refreshDelay\">"); int delay = _manager.getRefreshDelaySeconds(); for (int i = 0; i < times.length; i++) { @@ -2201,21 +2201,21 @@ public class I2PSnarkServlet extends BasicServlet { if (times[i] > 0) out.write(DataHelper.formatDuration2(times[i] * 1000)); else - out.write(_("Never")); + out.write(_t("Never")); out.write("</option>\n"); } out.write("</select><br>" + "<tr><td>"); - out.write(_("Startup delay")); + out.write(_t("Startup delay")); out.write(": <td><input name=\"startupDelay\" size=\"4\" class=\"r\" value=\"" + _manager.util().getStartupDelay() + "\"> "); - out.write(_("minutes")); + out.write(_t("minutes")); out.write("<br>\n" + "<tr><td>"); - out.write(_("Page size")); + out.write(_t("Page size")); out.write(": <td><input name=\"pageSize\" size=\"4\" maxlength=\"6\" class=\"r\" value=\"" + _manager.getPageSize() + "\"> "); - out.write(_("torrents")); + out.write(_t("torrents")); out.write("<br>\n"); @@ -2239,39 +2239,39 @@ public class I2PSnarkServlet extends BasicServlet { out.write("</select><br>\n"); */ out.write("<tr><td>"); - out.write(_("Total uploader limit")); + out.write(_t("Total uploader limit")); out.write(": <td><input type=\"text\" name=\"upLimit\" class=\"r\" value=\"" + _manager.util().getMaxUploaders() + "\" size=\"4\" maxlength=\"3\" > "); - out.write(_("peers")); + out.write(_t("peers")); out.write("<br>\n" + "<tr><td>"); - out.write(_("Up bandwidth limit")); + out.write(_t("Up bandwidth limit")); out.write(": <td><input type=\"text\" name=\"upBW\" class=\"r\" value=\"" + _manager.util().getMaxUpBW() + "\" size=\"4\" maxlength=\"4\" > KBps <i>"); - out.write(_("Half available bandwidth recommended.")); + out.write(_t("Half available bandwidth recommended.")); out.write(" [<a href=\"/config.jsp\" target=\"blank\">"); - out.write(_("View or change router bandwidth")); + out.write(_t("View or change router bandwidth")); out.write("</a>]</i><br>\n" + "<tr><td>"); - out.write(_("Use open trackers also")); + out.write(_t("Use open trackers also")); out.write(": <td><input type=\"checkbox\" class=\"optbox\" name=\"useOpenTrackers\" value=\"true\" " + (useOpenTrackers ? "checked " : "") + "title=\""); - out.write(_("If checked, announce torrents to open trackers as well as the tracker listed in the torrent file")); + out.write(_t("If checked, announce torrents to open trackers as well as the tracker listed in the torrent file")); out.write("\" ></td></tr>\n" + "<tr><td>"); - out.write(_("Enable DHT")); + out.write(_t("Enable DHT")); out.write(": <td><input type=\"checkbox\" class=\"optbox\" name=\"useDHT\" value=\"true\" " + (useDHT ? "checked " : "") + "title=\""); - out.write(_("If checked, use DHT")); + out.write(_t("If checked, use DHT")); out.write("\" ></td></tr>\n"); // "<tr><td>"); - //out.write(_("Open tracker announce URLs")); + //out.write(_t("Open tracker announce URLs")); //out.write(": <td><input type=\"text\" name=\"openTrackers\" value=\"" // + openTrackers + "\" size=\"50\" ><br>\n"); @@ -2283,13 +2283,13 @@ public class I2PSnarkServlet extends BasicServlet { Map<String, String> options = new TreeMap<String, String>(_manager.util().getI2CPOptions()); out.write("<tr><td>"); - out.write(_("Inbound Settings")); + out.write(_t("Inbound Settings")); out.write(":<td>"); out.write(renderOptions(1, 10, 3, options.remove("inbound.quantity"), "inbound.quantity", TUNNEL)); out.write("     "); out.write(renderOptions(0, 4, 3, options.remove("inbound.length"), "inbound.length", HOP)); out.write("<tr><td>"); - out.write(_("Outbound Settings")); + out.write(_t("Outbound Settings")); out.write(":<td>"); out.write(renderOptions(1, 10, 3, options.remove("outbound.quantity"), "outbound.quantity", TUNNEL)); out.write("     "); @@ -2297,12 +2297,12 @@ public class I2PSnarkServlet extends BasicServlet { if (!_context.isRouterContext()) { out.write("<tr><td>"); - out.write(_("I2CP host")); + out.write(_t("I2CP host")); out.write(": <td><input type=\"text\" name=\"i2cpHost\" value=\"" + _manager.util().getI2CPHost() + "\" size=\"15\" > " + "<tr><td>"); - out.write(_("I2CP port")); + out.write(_t("I2CP port")); out.write(": <td><input type=\"text\" name=\"i2cpPort\" class=\"r\" value=\"" + + _manager.util().getI2CPPort() + "\" size=\"5\" maxlength=\"5\" > <br>\n"); } @@ -2317,12 +2317,12 @@ public class I2PSnarkServlet extends BasicServlet { opts.append(key).append('=').append(val).append(' '); } out.write("<tr><td>"); - out.write(_("I2CP options")); + out.write(_t("I2CP options")); out.write(": <td><textarea name=\"i2cpOpts\" cols=\"60\" rows=\"1\" wrap=\"off\" spellcheck=\"false\" >" + opts.toString() + "</textarea><br>\n" + "<tr><td colspan=\"2\"> \n" + // spacer "<tr><td> <td><input type=\"submit\" class=\"accept\" value=\""); - out.write(_("Save configuration")); + out.write(_t("Save configuration")); out.write("\" name=\"foo\" >\n" + "<tr><td colspan=\"2\"> \n" + // spacer "</table></div></div></form>"); @@ -2337,22 +2337,22 @@ public class I2PSnarkServlet extends BasicServlet { buf.append("<span class=\"snarkConfigTitle\">"); toThemeImg(buf, "config"); buf.append(' '); - buf.append(_("Trackers")); + buf.append(_t("Trackers")); buf.append("</span><hr>\n" + "<table class=\"trackerconfig\"><tr><th>") - //.append(_("Remove")) + //.append(_t("Remove")) .append("</th><th>") - .append(_("Name")) + .append(_t("Name")) .append("</th><th>") - .append(_("Website URL")) + .append(_t("Website URL")) .append("</th><th>") - .append(_("Standard")) + .append(_t("Standard")) .append("</th><th>") - .append(_("Open")) + .append(_t("Open")) .append("</th><th>") - .append(_("Private")) + .append(_t("Private")) .append("</th><th>") - .append(_("Announce URL")) + .append(_t("Announce URL")) .append("</th></tr>\n"); List<String> openTrackers = _manager.util().getOpenTrackers(); List<String> privateTrackers = _manager.getPrivateTrackers(); @@ -2364,7 +2364,7 @@ public class I2PSnarkServlet extends BasicServlet { boolean isKnownOpen = _manager.util().isKnownOpenTracker(t.announceURL); boolean isOpen = isKnownOpen || openTrackers.contains(t.announceURL); buf.append("<tr><td><input type=\"checkbox\" class=\"optbox\" name=\"delete_") - .append(name).append("\" title=\"").append(_("Delete")).append("\">" + + .append(name).append("\" title=\"").append(_t("Delete")).append("\">" + "</td><td>").append(name) .append("</td><td>").append(urlify(homeURL, 35)) .append("</td><td><input type=\"radio\" class=\"optbox\" value=\"0\" name=\"ttype_") @@ -2396,7 +2396,7 @@ public class I2PSnarkServlet extends BasicServlet { .append("</td></tr>\n"); } buf.append("<tr><td><b>") - .append(_("Add")).append(":</b></td>" + + .append(_t("Add")).append(":</b></td>" + "<td><input type=\"text\" class=\"trackername\" name=\"tname\" spellcheck=\"false\"></td>" + "<td><input type=\"text\" class=\"trackerhome\" name=\"thurl\" spellcheck=\"false\"></td>" + "<td><input type=\"radio\" class=\"optbox\" value=\"0\" name=\"add_tracker_type\" checked=\"checked\"></td>" + @@ -2405,12 +2405,12 @@ public class I2PSnarkServlet extends BasicServlet { "<td><input type=\"text\" class=\"trackerannounce\" name=\"taurl\" spellcheck=\"false\"></td></tr>\n" + "<tr><td colspan=\"7\"> </td></tr>\n" + // spacer "<tr><td colspan=\"2\"></td><td colspan=\"5\">\n" + - "<input type=\"submit\" name=\"taction\" class=\"default\" value=\"").append(_("Add tracker")).append("\">\n" + - "<input type=\"submit\" name=\"taction\" class=\"delete\" value=\"").append(_("Delete selected")).append("\">\n" + - "<input type=\"submit\" name=\"taction\" class=\"add\" value=\"").append(_("Add tracker")).append("\">\n" + - "<input type=\"submit\" name=\"taction\" class=\"accept\" value=\"").append(_("Save tracker configuration")).append("\">\n" + - // "<input type=\"reset\" class=\"cancel\" value=\"").append(_("Cancel")).append("\">\n" + - "<input type=\"submit\" name=\"taction\" class=\"reload\" value=\"").append(_("Restore defaults")).append("\">\n" + + "<input type=\"submit\" name=\"taction\" class=\"default\" value=\"").append(_t("Add tracker")).append("\">\n" + + "<input type=\"submit\" name=\"taction\" class=\"delete\" value=\"").append(_t("Delete selected")).append("\">\n" + + "<input type=\"submit\" name=\"taction\" class=\"add\" value=\"").append(_t("Add tracker")).append("\">\n" + + "<input type=\"submit\" name=\"taction\" class=\"accept\" value=\"").append(_t("Save tracker configuration")).append("\">\n" + + // "<input type=\"reset\" class=\"cancel\" value=\"").append(_t("Cancel")).append("\">\n" + + "<input type=\"submit\" name=\"taction\" class=\"reload\" value=\"").append(_t("Restore defaults")).append("\">\n" + "</td></tr>" + "<tr><td colspan=\"7\"> </td></tr>\n" + // spacer "</table></div></div></form>\n"); @@ -2422,7 +2422,7 @@ public class I2PSnarkServlet extends BasicServlet { "<span class=\"snarkConfigTitle\"><a href=\"configure\">"); out.write(toThemeImg("config")); out.write(' '); - out.write(_("Configuration")); + out.write(_t("Configuration")); out.write("</a></span></span></div>\n"); } @@ -2439,7 +2439,7 @@ public class I2PSnarkServlet extends BasicServlet { String trackerURL = magnet.getTrackerURL(); _manager.addMagnet(name, ih, trackerURL, true, dataDir); } catch (IllegalArgumentException iae) { - _manager.addMessage(_("Invalid magnet URL {0}", url)); + _manager.addMessage(_t("Invalid magnet URL {0}", url)); } } @@ -2474,17 +2474,17 @@ public class I2PSnarkServlet extends BasicServlet { } /** translate */ - private String _(String s) { + private String _t(String s) { return _manager.util().getString(s); } /** translate */ - private String _(String s, Object o) { + private String _t(String s, Object o) { return _manager.util().getString(s, o); } /** translate */ - private String _(String s, Object o, Object o2) { + private String _t(String s, Object o, Object o2) { return _manager.util().getString(s, o, o2); } @@ -2660,7 +2660,7 @@ public class I2PSnarkServlet extends BasicServlet { if (title.endsWith("/")) title = title.substring(0, title.length() - 1); String directory = title; - title = _("Torrent") + ": " + DataHelper.escapeHTML(title); + title = _t("Torrent") + ": " + DataHelper.escapeHTML(title); buf.append(title); buf.append("\n").append(HEADER_A).append(_themePath).append(HEADER_B) .append("\n"); @@ -2674,7 +2674,7 @@ public class I2PSnarkServlet extends BasicServlet { toThemeImg(buf, "arrow_refresh"); buf.append("  "); if (_contextName.equals(DEFAULT_NAME)) - buf.append(_("I2PSnark")); + buf.append(_t("I2PSnark")); else buf.append(_contextName); buf.append("

\n"); @@ -2694,7 +2694,7 @@ public class I2PSnarkServlet extends BasicServlet { // first table - torrent info buf.append("\n"); buf.append("\n"); @@ -2704,7 +2704,7 @@ public class I2PSnarkServlet extends BasicServlet { buf.append("\n"); @@ -2712,7 +2712,7 @@ public class I2PSnarkServlet extends BasicServlet { buf.append("\n"); @@ -2721,7 +2721,7 @@ public class I2PSnarkServlet extends BasicServlet { buf.append("\n"); @@ -2740,7 +2740,7 @@ public class I2PSnarkServlet extends BasicServlet { buf.append(trackerLink); else toThemeImg(buf, "details"); - buf.append(" ").append(_("Primary Tracker")).append(": "); + buf.append(" ").append(_t("Primary Tracker")).append(": "); buf.append(getShortTrackerLink(announce, snark.getInfoHash())); buf.append(""); } @@ -2749,7 +2749,7 @@ public class I2PSnarkServlet extends BasicServlet { buf.append("\n"); } @@ -2788,7 +2788,7 @@ public class I2PSnarkServlet extends BasicServlet { buf.append("\n"); } @@ -2799,7 +2799,7 @@ public class I2PSnarkServlet extends BasicServlet { buf.append("\n"); } @@ -2809,7 +2809,7 @@ public class I2PSnarkServlet extends BasicServlet { buf.append("\n"); } @@ -2818,7 +2818,7 @@ public class I2PSnarkServlet extends BasicServlet { buf.append("\n"); } @@ -2830,7 +2830,7 @@ public class I2PSnarkServlet extends BasicServlet { if (announce != null) buf.append("&tr=").append(announce); buf.append("\">") - .append(toImg("magnet", _("Magnet link"))) + .append(toImg("magnet", _t("Magnet link"))) .append("Magnet:\n"); } else { buf.append("\n"); } // We don't have the hash of the torrent file - //buf.append(""); buf.append("\n"); @@ -2925,22 +2925,22 @@ public class I2PSnarkServlet extends BasicServlet { buf.append("
") - .append(_("Torrent")) + .append(_t("Torrent")) .append(": ") .append(DataHelper.escapeHTML(snark.getBaseName())) .append("
"); toThemeImg(buf, "file"); buf.append(" ") - .append(_("Torrent file")) + .append(_t("Torrent file")) .append(": ") .append(DataHelper.escapeHTML(fullPath)) .append("
"); toThemeImg(buf, "file"); buf.append(" ") - .append(_("Data location")) + .append(_t("Data location")) .append(": ") .append(DataHelper.escapeHTML(snark.getStorage().getBase().getPath())) .append("
"); toThemeImg(buf, "details"); buf.append(" ") - .append(_("Info hash")) + .append(_t("Info hash")) .append(": ") .append(hex.toUpperCase(Locale.US)) .append("
"); toThemeImg(buf, "details"); buf.append(" ") - .append(_("Tracker List")).append(": "); + .append(_t("Tracker List")).append(": "); for (List alist2 : alist) { buf.append('['); boolean more = false; @@ -2774,7 +2774,7 @@ public class I2PSnarkServlet extends BasicServlet { buf.append("
"); toThemeImg(buf, "details"); buf.append(" ") - .append(_("Comment")).append(": ") + .append(_t("Comment")).append(": ") .append(DataHelper.stripHTML(com)) .append("
"); toThemeImg(buf, "details"); buf.append(" ") - .append(_("Created")).append(": ") + .append(_t("Created")).append(": ") .append(date) .append("
"); toThemeImg(buf, "details"); buf.append(" ") - .append(_("Created By")).append(": ") + .append(_t("Created By")).append(": ") .append(DataHelper.stripHTML(cby)) .append("
"); toThemeImg(buf, "details"); buf.append(" ") - .append(_("Added")).append(": ") + .append(_t("Added")).append(": ") .append(date) .append("
"); toThemeImg(buf, "details"); buf.append(" ") - .append(_("Completed")).append(": ") + .append(_t("Completed")).append(": ") .append(date) .append("
") - .append(_("Private torrent")) + .append(_t("Private torrent")) .append("
").append(_("Maggot link")).append(": ") + //buf.append("
").append(_t("Maggot link")).append(": ") // .append(MAGGOT).append(hex).append(':').append(hex).append("
"); toThemeImg(buf, "size"); buf.append(" ") - .append(_("Size")) + .append(_t("Size")) .append(": ") .append(formatSize(snark.getTotalLength())); int pieces = snark.getPieces(); @@ -2863,16 +2863,16 @@ public class I2PSnarkServlet extends BasicServlet { toThemeImg(buf, "head_rx"); buf.append(" "); if (completion < 1.0) - buf.append(_("Completion")) + buf.append(_t("Completion")) .append(": ") .append((new DecimalFormat("0.00%")).format(completion)); else - buf.append(_("Complete")).append(""); + buf.append(_t("Complete")).append(""); // up ratio buf.append(" "); toThemeImg(buf, "head_tx"); buf.append(" ") - .append(_("Upload ratio")) + .append(_t("Upload ratio")) .append(": "); long uploaded = snark.getUploaded(); if (uploaded > 0) { @@ -2892,7 +2892,7 @@ public class I2PSnarkServlet extends BasicServlet { buf.append(" "); toThemeImg(buf, "head_rx"); buf.append(" ") - .append(_("Remaining")) + .append(_t("Remaining")) .append(": ") .append(formatSize(needed)); } @@ -2902,20 +2902,20 @@ public class I2PSnarkServlet extends BasicServlet { buf.append(" "); toThemeImg(buf, "file"); buf.append(" ") - .append(_("Files")) + .append(_t("Files")) .append(": ") .append(fileCount); } buf.append(" "); toThemeImg(buf, "file"); buf.append(" ") - .append(_("Pieces")) + .append(_t("Pieces")) .append(": ") .append(pieces); buf.append(" "); toThemeImg(buf, "file"); buf.append(" ") - .append(_("Piece size")) + .append(_t("Piece size")) .append(": ") .append(formatSize(snark.getPieceLength(0))) .append("
"); toThemeImg(buf, "file"); if (snark.isChecking()) { - buf.append(" ").append(_("Checking")).append("… ") + buf.append(" ").append(_t("Checking")).append("… ") .append((new DecimalFormat("0.00%")).format(snark.getCheckingProgress())) .append("   ") - .append(_("Refresh page for results")).append(""); + .append(_t("Refresh page for results")).append(""); } else if (snark.isStarting()) { - buf.append(" ").append(_("Starting")).append("…"); + buf.append(" ").append(_t("Starting")).append("…"); } else if (snark.isAllocating()) { - buf.append(" ").append(_("Allocating")).append("…"); + buf.append(" ").append(_t("Allocating")).append("…"); } else { boolean isRunning = !snark.isStopped(); buf.append(" \n"); + buf.append(_t("Stop")).append("\" name=\"stop\" class=\"stoptorrent\">\n"); else - buf.append(_("Start")).append("\" name=\"start\" class=\"starttorrent\">\n"); - buf.append("   \n"); + buf.append("   \n"); else @@ -3001,7 +3001,7 @@ public class I2PSnarkServlet extends BasicServlet { buf.append("\n"); buf.append("\n") .append("\n\n"); @@ -3101,21 +3101,21 @@ public class I2PSnarkServlet extends BasicServlet { int priority = 0; if (fai.isDirectory) { complete = true; - //status = toImg("tick") + ' ' + _("Directory"); + //status = toImg("tick") + ' ' + _t("Directory"); } else { if (snark == null || snark.getStorage() == null) { // Assume complete, perhaps he removed a completed torrent but kept a bookmark complete = true; - status = toImg("cancel") + ' ' + _("Torrent not found?"); + status = toImg("cancel") + ' ' + _t("Torrent not found?"); } else { long remaining = fai.remaining; if (remaining < 0) { complete = true; - status = toImg("cancel") + ' ' + _("File not found in torrent?"); + status = toImg("cancel") + ' ' + _t("File not found in torrent?"); } else if (remaining == 0 || length <= 0) { complete = true; - status = toImg("tick") + ' ' + _("Complete"); + status = toImg("tick") + ' ' + _t("Complete"); } else { priority = fai.priority; if (priority < 0) @@ -3125,8 +3125,8 @@ public class I2PSnarkServlet extends BasicServlet { else status = toImg("clock_red"); status += " " + - (100 * (length - remaining) / length) + "% " + _("complete") + - " (" + DataHelper.formatSize2(remaining) + "B " + _("remaining") + ")"; + (100 * (length - remaining) / length) + "% " + _t("complete") + + " (" + DataHelper.formatSize2(remaining) + "B " + _t("remaining") + ")"; } } @@ -3148,7 +3148,7 @@ public class I2PSnarkServlet extends BasicServlet { buf.append("\"\""); } else { - buf.append(toImg(icon, _("Open"))).append(""); + buf.append(toImg(icon, _t("Open"))).append(""); } } else { buf.append(toImg(icon)); @@ -3172,17 +3172,17 @@ public class I2PSnarkServlet extends BasicServlet { buf.append("\n 0) buf.append("checked=\"checked\""); - buf.append('>').append(_("High")); + buf.append('>').append(_t("High")); buf.append("\n').append(_("Normal")); + buf.append('>').append(_t("Normal")); buf.append("\n').append(_("Skip")); + buf.append('>').append(_t("Skip")); showSaveButton = true; } buf.append(""); @@ -3192,12 +3192,12 @@ public class I2PSnarkServlet extends BasicServlet { if (showSaveButton) { buf.append("\n"); } diff --git a/apps/i2psnark/locale/messages_ar.po b/apps/i2psnark/locale/messages_ar.po index 5410a2daa..502c69b90 100644 --- a/apps/i2psnark/locale/messages_ar.po +++ b/apps/i2psnark/locale/messages_ar.po @@ -826,7 +826,7 @@ msgid "Enter valid tracker name and URLs" msgstr "" #. "\n" + +#. value=\"").append(_t("Cancel")).append("\">\n" + #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1361 #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2410 msgid "Restore defaults" diff --git a/apps/i2psnark/locale/messages_cs.po b/apps/i2psnark/locale/messages_cs.po index b107d9e86..c2690f07f 100644 --- a/apps/i2psnark/locale/messages_cs.po +++ b/apps/i2psnark/locale/messages_cs.po @@ -817,7 +817,7 @@ msgid "Enter valid tracker name and URLs" msgstr "" #. "\n" + +#. value=\"").append(_t("Cancel")).append("\">\n" + #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1361 #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2410 msgid "Restore defaults" diff --git a/apps/i2psnark/locale/messages_de.po b/apps/i2psnark/locale/messages_de.po index 927df100d..dcdd0cb11 100644 --- a/apps/i2psnark/locale/messages_de.po +++ b/apps/i2psnark/locale/messages_de.po @@ -826,7 +826,7 @@ msgid "Enter valid tracker name and URLs" msgstr "Geben Sie einen gültigen Tracker-Namen und die URLs ein" #. "\n" + +#. value=\"").append(_t("Cancel")).append("\">\n" + #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1361 #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2410 msgid "Restore defaults" diff --git a/apps/i2psnark/locale/messages_en.po b/apps/i2psnark/locale/messages_en.po index d29a692a6..e34056fed 100644 --- a/apps/i2psnark/locale/messages_en.po +++ b/apps/i2psnark/locale/messages_en.po @@ -808,7 +808,7 @@ msgstr "" msgid "Enter valid tracker name and URLs" msgstr "" -#. "\n" + +#. "\n" + #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1361 #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2410 msgid "Restore defaults" diff --git a/apps/i2psnark/locale/messages_es.po b/apps/i2psnark/locale/messages_es.po index b173cff24..c7a293fd0 100644 --- a/apps/i2psnark/locale/messages_es.po +++ b/apps/i2psnark/locale/messages_es.po @@ -824,7 +824,7 @@ msgid "Enter valid tracker name and URLs" msgstr "Introduzca nombre y URLs de tracker (rastreador) válidos" #. "\n" + +#. value=\"").append(_t("Cancel")).append("\">\n" + #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1361 #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2410 msgid "Restore defaults" diff --git a/apps/i2psnark/locale/messages_fr.po b/apps/i2psnark/locale/messages_fr.po index 9aa06fb15..c8987da9a 100644 --- a/apps/i2psnark/locale/messages_fr.po +++ b/apps/i2psnark/locale/messages_fr.po @@ -821,7 +821,7 @@ msgid "Enter valid tracker name and URLs" msgstr "Entrez nom de tracker valide et URLs" #. "\n" + +#. value=\"").append(_t("Cancel")).append("\">\n" + #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1361 #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2410 msgid "Restore defaults" diff --git a/apps/i2psnark/locale/messages_hu.po b/apps/i2psnark/locale/messages_hu.po index 102974283..6710e744e 100644 --- a/apps/i2psnark/locale/messages_hu.po +++ b/apps/i2psnark/locale/messages_hu.po @@ -814,7 +814,7 @@ msgid "Enter valid tracker name and URLs" msgstr "Adj meg érvényes követő (tracker) nevet és URL címeket" #. "\n" + +#. value=\"").append(_t("Cancel")).append("\">\n" + #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1361 #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2410 msgid "Restore defaults" diff --git a/apps/i2psnark/locale/messages_it.po b/apps/i2psnark/locale/messages_it.po index 5ad5f6edc..e0315ca19 100644 --- a/apps/i2psnark/locale/messages_it.po +++ b/apps/i2psnark/locale/messages_it.po @@ -818,7 +818,7 @@ msgid "Enter valid tracker name and URLs" msgstr "Inserisci nome e URL validi per il tracker" #. "\n" + +#. value=\"").append(_t("Cancel")).append("\">\n" + #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1361 #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2410 msgid "Restore defaults" diff --git a/apps/i2psnark/locale/messages_nb.po b/apps/i2psnark/locale/messages_nb.po index dc7cde85e..43d9111cc 100644 --- a/apps/i2psnark/locale/messages_nb.po +++ b/apps/i2psnark/locale/messages_nb.po @@ -813,7 +813,7 @@ msgid "Enter valid tracker name and URLs" msgstr "Skriv inn valid tracker navn og URLer" #. "\n" + +#. value=\"").append(_t("Cancel")).append("\">\n" + #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1361 #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2410 msgid "Restore defaults" diff --git a/apps/i2psnark/locale/messages_nl.po b/apps/i2psnark/locale/messages_nl.po index 84b867411..20ff93044 100644 --- a/apps/i2psnark/locale/messages_nl.po +++ b/apps/i2psnark/locale/messages_nl.po @@ -816,7 +816,7 @@ msgid "Enter valid tracker name and URLs" msgstr "Geef een geldige trackernaam en URLs in" #. "\n" + +#. value=\"").append(_t("Cancel")).append("\">\n" + #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1361 #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2410 msgid "Restore defaults" diff --git a/apps/i2psnark/locale/messages_pl.po b/apps/i2psnark/locale/messages_pl.po index 854c90672..3a6784054 100644 --- a/apps/i2psnark/locale/messages_pl.po +++ b/apps/i2psnark/locale/messages_pl.po @@ -823,7 +823,7 @@ msgid "Enter valid tracker name and URLs" msgstr "Podaj prawidłową nazwę trackera i URL" #. "\n" + +#. value=\"").append(_t("Cancel")).append("\">\n" + #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1361 #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2410 msgid "Restore defaults" diff --git a/apps/i2psnark/locale/messages_pt.po b/apps/i2psnark/locale/messages_pt.po index 8d356e627..5cd2d6c44 100644 --- a/apps/i2psnark/locale/messages_pt.po +++ b/apps/i2psnark/locale/messages_pt.po @@ -822,7 +822,7 @@ msgid "Enter valid tracker name and URLs" msgstr "Insira um nome válido para o tracker e URLs" #. "\n" + +#. value=\"").append(_t("Cancel")).append("\">\n" + #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1361 #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2410 msgid "Restore defaults" diff --git a/apps/i2psnark/locale/messages_pt_bR.po b/apps/i2psnark/locale/messages_pt_bR.po index 4b20ea31f..251188047 100644 --- a/apps/i2psnark/locale/messages_pt_bR.po +++ b/apps/i2psnark/locale/messages_pt_bR.po @@ -814,7 +814,7 @@ msgid "Enter valid tracker name and URLs" msgstr "" #. "\n" + +#. value=\"").append(_t("Cancel")).append("\">\n" + #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1361 #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2410 msgid "Restore defaults" diff --git a/apps/i2psnark/locale/messages_ro.po b/apps/i2psnark/locale/messages_ro.po index 98d4bb92c..d0575dd0f 100644 --- a/apps/i2psnark/locale/messages_ro.po +++ b/apps/i2psnark/locale/messages_ro.po @@ -817,7 +817,7 @@ msgid "Enter valid tracker name and URLs" msgstr "Introduceți numele tracker valid și URL-uri" #. "\n" + +#. value=\"").append(_t("Cancel")).append("\">\n" + #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1361 #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2410 msgid "Restore defaults" diff --git a/apps/i2psnark/locale/messages_ru.po b/apps/i2psnark/locale/messages_ru.po index 19652c105..92a831679 100644 --- a/apps/i2psnark/locale/messages_ru.po +++ b/apps/i2psnark/locale/messages_ru.po @@ -829,7 +829,7 @@ msgid "Enter valid tracker name and URLs" msgstr "Введите действительное название и URL трекера" #. "\n" + +#. value=\"").append(_t("Cancel")).append("\">\n" + #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1361 #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2410 msgid "Restore defaults" diff --git a/apps/i2psnark/locale/messages_sk.po b/apps/i2psnark/locale/messages_sk.po index c4780b725..339f35426 100644 --- a/apps/i2psnark/locale/messages_sk.po +++ b/apps/i2psnark/locale/messages_sk.po @@ -816,7 +816,7 @@ msgid "Enter valid tracker name and URLs" msgstr "Zadajte platný názov a URL stopovača" #. "\n" + +#. value=\"").append(_t("Cancel")).append("\">\n" + #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1361 #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2410 msgid "Restore defaults" diff --git a/apps/i2psnark/locale/messages_sv.po b/apps/i2psnark/locale/messages_sv.po index 7f653edea..ec566c4eb 100644 --- a/apps/i2psnark/locale/messages_sv.po +++ b/apps/i2psnark/locale/messages_sv.po @@ -822,7 +822,7 @@ msgid "Enter valid tracker name and URLs" msgstr "Ange giltigt namn och adresser för trackern " #. "\n" + +#. value=\"").append(_t("Cancel")).append("\">\n" + #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1361 #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2410 msgid "Restore defaults" diff --git a/apps/i2psnark/locale/messages_vi.po b/apps/i2psnark/locale/messages_vi.po index cad895268..d7d0e8067 100644 --- a/apps/i2psnark/locale/messages_vi.po +++ b/apps/i2psnark/locale/messages_vi.po @@ -810,7 +810,7 @@ msgid "Enter valid tracker name and URLs" msgstr "" #. "\n" + +#. value=\"").append(_t("Cancel")).append("\">\n" + #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1361 #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2410 msgid "Restore defaults" diff --git a/apps/i2psnark/locale/messages_zh.po b/apps/i2psnark/locale/messages_zh.po index 5017281a9..cb4216a40 100644 --- a/apps/i2psnark/locale/messages_zh.po +++ b/apps/i2psnark/locale/messages_zh.po @@ -814,7 +814,7 @@ msgid "Enter valid tracker name and URLs" msgstr "请输入有效的 Tracker 名称与链接" #. "\n" + +#. value=\"").append(_t("Cancel")).append("\">\n" + #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1361 #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2410 msgid "Restore defaults" diff --git a/apps/i2ptunnel/java/bundle-messages-proxy.sh b/apps/i2ptunnel/java/bundle-messages-proxy.sh index 8ffdc5a9e..147e32952 100755 --- a/apps/i2ptunnel/java/bundle-messages-proxy.sh +++ b/apps/i2ptunnel/java/bundle-messages-proxy.sh @@ -62,16 +62,16 @@ do echo "Updating the $i file from the tags..." # extract strings from java and jsp files, and update messages.po files # translate calls must be one of the forms: - # _("foo") + # _t("foo") # _x("foo") - # intl._("foo") + # intl._t("foo") # intl.title("foo") # In a jsp, you must use a helper or handler that has the context set. # To start a new translation, copy the header from an old translation to the new .po file, # then ant distclean updater. find $JPATHS -name *.java > $TMPFILE xgettext -f $TMPFILE -F -L java --from-code=UTF-8 --add-comments\ - --keyword=_ \ + --keyword=_t \ -o ${i}t if [ $? -ne 0 ] then diff --git a/apps/i2ptunnel/java/bundle-messages.sh b/apps/i2ptunnel/java/bundle-messages.sh index a8769f0dc..29a0bec93 100755 --- a/apps/i2ptunnel/java/bundle-messages.sh +++ b/apps/i2ptunnel/java/bundle-messages.sh @@ -61,16 +61,16 @@ do echo "Updating the $i file from the tags..." # extract strings from java and jsp files, and update messages.po files # translate calls must be one of the forms: - # _("foo") + # _t("foo") # _x("foo") - # intl._("foo") + # intl._t("foo") # intl.title("foo") # In a jsp, you must use a helper or handler that has the context set. # To start a new translation, copy the header from an old translation to the new .po file, # then ant distclean updater. find $JPATHS -name *.java > $TMPFILE xgettext -f $TMPFILE -F -L java --from-code=UTF-8 --add-comments\ - --keyword=_ --keyword=_x --keyword=intl._ --keyword=intl.title \ + --keyword=_t --keyword=_x --keyword=intl._ --keyword=intl.title \ -o ${i}t if [ $? -ne 0 ] then diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java index 8645b686f..4183ce399 100644 --- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java @@ -631,8 +631,8 @@ public class I2PTunnelHTTPClient extends I2PTunnelHTTPClientBase implements Runn String header = getErrorPage("ahelper-notfound", ERR_AHELPER_NOTFOUND); try { out.write(header.getBytes("UTF-8")); - out.write(("

" + _("This seems to be a bad destination:") + " " + ahelperKey + " " + - _("i2paddresshelper cannot help you with a destination like that!") + + out.write(("

" + _t("This seems to be a bad destination:") + " " + ahelperKey + " " + + _t("i2paddresshelper cannot help you with a destination like that!") + "

").getBytes("UTF-8")); writeFooter(out); reader.drain(); @@ -706,7 +706,7 @@ public class I2PTunnelHTTPClient extends I2PTunnelHTTPClientBase implements Runn String conflictURL = conflictURI.toASCIIString(); String header = getErrorPage("ahelper-conflict", ERR_AHELPER_CONFLICT); out.write(header.getBytes("UTF-8")); - out.write(_("To visit the destination in your host database, click here. To visit the conflicting addresshelper destination, click here.", + out.write(_t("To visit the destination in your host database, click here. To visit the conflicting addresshelper destination, click here.", trustedURL, conflictURL).getBytes("UTF-8")); out.write("

".getBytes("UTF-8")); writeFooter(out); @@ -1118,7 +1118,7 @@ public class I2PTunnelHTTPClient extends I2PTunnelHTTPClientBase implements Runn header = getErrorPage("dnfb", ERR_DESTINATION_UNKNOWN); } else if(destination.length() == 60 && destination.toLowerCase(Locale.US).endsWith(".b32.i2p")) { header = getErrorPage("nols", ERR_DESTINATION_UNKNOWN); - extraMessage = _("Destination lease set not found"); + extraMessage = _t("Destination lease set not found"); } else { header = getErrorPage("dnfh", ERR_DESTINATION_UNKNOWN); jumpServers = getTunnel().getClientOptions().getProperty(PROP_JUMP_SERVERS); @@ -1270,31 +1270,31 @@ public class I2PTunnelHTTPClient extends I2PTunnelHTTPClientBase implements Runn Writer out = new BufferedWriter(new OutputStreamWriter(outs, "UTF-8")); String header = getErrorPage("ahelper-new", ERR_AHELPER_NEW); out.write(header); - out.write("
"); - String tx = _("Directory"); + String tx = _t("Directory"); // cycle through sort by name or type String sort; boolean isTypeSort = false; @@ -3021,7 +3021,7 @@ public class I2PSnarkServlet extends BasicServlet { .append(getQueryString(sort)).append("\">"); } toThemeImg(buf, "file", tx, - showSort ? _("Sort by {0}", (isTypeSort ? _("File type") : _("Name"))) + showSort ? _t("Sort by {0}", (isTypeSort ? _t("File type") : _t("Name"))) : tx + ": " + directory); if (showSort) buf.append(""); @@ -3036,9 +3036,9 @@ public class I2PSnarkServlet extends BasicServlet { buf.append(""); } - tx = _("Size"); + tx = _t("Size"); toThemeImg(buf, "size", tx, - showSort ? _("Sort by {0}", tx) : tx); + showSort ? _t("Sort by {0}", tx) : tx); if (showSort) buf.append(""); buf.append(""); @@ -3048,9 +3048,9 @@ public class I2PSnarkServlet extends BasicServlet { buf.append(""); } - tx = _("Status"); + tx = _t("Status"); toThemeImg(buf, "status", tx, - showRemainingSort ? _("Sort by {0}", _("Remaining")) : tx); + showRemainingSort ? _t("Sort by {0}", _t("Remaining")) : tx); if (showRemainingSort) buf.append(""); if (showPriority) { @@ -3060,9 +3060,9 @@ public class I2PSnarkServlet extends BasicServlet { buf.append(""); } - tx = _("Priority"); + tx = _t("Priority"); toThemeImg(buf, "priority", tx, - showSort ? _("Sort by {0}", tx) : tx); + showSort ? _t("Sort by {0}", tx) : tx); if (showSort) buf.append(""); } @@ -3072,7 +3072,7 @@ public class I2PSnarkServlet extends BasicServlet { buf.append("\">"); toThemeImg(buf, "up"); buf.append(' ') - .append(_("Up to higher level directory")) + .append(_t("Up to higher level directory")) .append("
 " + "") - .append(toImg("clock_red")).append(_("Set all high")).append("\n" + + .append(toImg("clock_red")).append(_t("Set all high")).append("\n" + "") - .append(toImg("clock")).append(_("Set all normal")).append("\n" + + .append(toImg("clock")).append(_t("Set all normal")).append("\n" + "") - .append(toImg("cancel")).append(_("Skip all")).append("\n" + - "

\n" + + "

\n" + "
"); + buf.append(""); else if (in.getLength() <= 1 || in.getLength() + in.getLengthVariance() <= 1 || out.getLength() <= 1 || out.getLength() + out.getLengthVariance() <= 1) - buf.append(""); + buf.append(""); if (in.getLength() + Math.abs(in.getLengthVariance()) >= WARN_LENGTH || out.getLength() + Math.abs(out.getLengthVariance()) >= WARN_LENGTH) - buf.append(""); + buf.append(""); if (in.getTotalQuantity() >= WARN_QUANTITY || out.getTotalQuantity() >= WARN_QUANTITY) - buf.append(""); + buf.append(""); - buf.append("\n"); + buf.append("\n"); // buf.append("\n"); // tunnel depth int maxLength = advanced ? MAX_ADVANCED_LENGTH : MAX_LENGTH; - buf.append("\n"); + buf.append("\n"); buf.append("\n"); // tunnel depth variance - buf.append("\n"); + buf.append("\n"); buf.append("\n"); + buf.append("\n"); buf.append("\n"); + buf.append("\n"); buf.append("\n" + + buf.append("\n" + "\n" + + buf.append("\n" + "
" + _("Host") + + out.write("\n"); try { String b32 = Base32.encode(SHA256Generator.getInstance().calculateHash(Base64.decode(ahelperKey)).getData()); - out.write("" + + out.write("" + ""); } catch(Exception e) { } - out.write("
" + _t("Host") + "" + destination + "
" + _("Base 32") + "
" + _t("Base 32") + "" + b32 + ".b32.i2p
" + _("Destination") + "" + + out.write("
" + _t("Destination") + "" + "
\n" + "
" + // FIXME if there is a query remaining it is lost "
" + - "" + + "" + "
\n
" + "\n" + "\n" + "\n" + "
\n"); + _t("Save {0} to router address book and continue to website", destination) + "
\n"); if(_context.namingService().getName().equals("BlockfileNamingService")) { // only blockfile supports multiple books - out.write("

\n"); - out.write("\n"); + out.write("

\n"); + out.write("\n"); } // Firefox (and others?) don't send referer to meta refresh target, which is // what the jump servers use, so this isn't that useful. diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClientBase.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClientBase.java index 5824f1fc3..5e39cf3b8 100644 --- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClientBase.java +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClientBase.java @@ -684,7 +684,7 @@ public abstract class I2PTunnelHTTPClientBase extends I2PTunnelClientBase implem out.write(""); if (usingWWWProxy) { out.write("

"); - out.write(_("HTTP Outproxy")); + out.write(_t("HTTP Outproxy")); out.write(": " + wwwProxy); } if (extraMessage != null) { @@ -723,7 +723,7 @@ public abstract class I2PTunnelHTTPClientBase extends I2PTunnelClientBase implem if (first) { first = false; out.write("

"); - out.write(_("Click a link below for an address helper from a jump service")); + out.write(_t("Click a link below for an address helper from a jump service")); out.write("

\n"); } else { out.write("
"); @@ -733,7 +733,7 @@ public abstract class I2PTunnelHTTPClientBase extends I2PTunnelClientBase implem out.write(uri); out.write("\">"); // Translators: parameter is a host name - out.write(_("{0} jump service", jumphost)); + out.write(_t("{0} jump service", jumphost)); out.write("\n"); } } @@ -778,7 +778,7 @@ public abstract class I2PTunnelHTTPClientBase extends I2PTunnelClientBase implem * Translate * @since 0.9.14 moved from I2PTunnelHTTPClient */ - protected String _(String key) { + protected String _t(String key) { return Translate.getString(key, _context, BUNDLE_NAME); } @@ -787,7 +787,7 @@ public abstract class I2PTunnelHTTPClientBase extends I2PTunnelClientBase implem * {0} * @since 0.9.14 moved from I2PTunnelHTTPClient */ - protected String _(String key, Object o) { + protected String _t(String key, Object o) { return Translate.getString(key, o, _context, BUNDLE_NAME); } @@ -796,7 +796,7 @@ public abstract class I2PTunnelHTTPClientBase extends I2PTunnelClientBase implem * {0} and {1} * @since 0.9.14 moved from I2PTunnelHTTPClient */ - protected String _(String key, Object o, Object o2) { + protected String _t(String key, Object o, Object o2) { return Translate.getString(key, o, o2, _context, BUNDLE_NAME); } } diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java index 2d70caed0..15e67de74 100644 --- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java @@ -166,9 +166,9 @@ public abstract class LocalHTTPServer { nsOptions.setProperty("list", book); if (referer != null && referer.startsWith("http")) { String from = "" + referer + ""; - nsOptions.setProperty("s", _("Added via address helper from {0}", from)); + nsOptions.setProperty("s", _t("Added via address helper from {0}", from)); } else { - nsOptions.setProperty("s", _("Added via address helper")); + nsOptions.setProperty("s", _t("Added via address helper")); } boolean success = ns.put(host, dest, nsOptions); writeRedirectPage(out, success, host, book, url); @@ -185,11 +185,11 @@ public abstract class LocalHTTPServer { private static void writeRedirectPage(OutputStream out, boolean success, String host, String book, String url) throws IOException { String tbook; if ("hosts.txt".equals(book)) - tbook = _("router"); + tbook = _t("router"); else if ("userhosts.txt".equals(book)) - tbook = _("master"); + tbook = _t("master"); else if ("privatehosts.txt".equals(book)) - tbook = _("private"); + tbook = _t("private"); else tbook = book; out.write(("HTTP/1.1 200 OK\r\n"+ @@ -198,22 +198,22 @@ public abstract class LocalHTTPServer { "Proxy-Connection: close\r\n"+ "\r\n"+ ""+ - "" + _("Redirecting to {0}", host) + "\n" + + "" + _t("Redirecting to {0}", host) + "\n" + "\n" + "\n" + "\n" + "\n" + "" + "
\n" + "

" + (success ? - _("Saved {0} to the {1} addressbook, redirecting now.", host, tbook) : - _("Failed to save {0} to the {1} addressbook, redirecting now.", host, tbook)) + + _t("Saved {0} to the {1} addressbook, redirecting now.", host, tbook) : + _t("Failed to save {0} to the {1} addressbook, redirecting now.", host, tbook)) + "

\n

" + - _("Click here if you are not redirected automatically.") + + _t("Click here if you are not redirected automatically.") + "

").getBytes("UTF-8")); I2PTunnelHTTPClient.writeFooter(out); out.flush(); @@ -248,17 +248,17 @@ public abstract class LocalHTTPServer { private static final String BUNDLE_NAME = "net.i2p.i2ptunnel.proxy.messages"; /** lang in routerconsole.lang property, else current locale */ - protected static String _(String key) { + protected static String _t(String key) { return Translate.getString(key, I2PAppContext.getGlobalContext(), BUNDLE_NAME); } /** {0} */ - protected static String _(String key, Object o) { + protected static String _t(String key, Object o) { return Translate.getString(key, o, I2PAppContext.getGlobalContext(), BUNDLE_NAME); } /** {0} and {1} */ - protected static String _(String key, Object o, Object o2) { + protected static String _t(String key, Object o, Object o2) { return Translate.getString(key, o, o2, I2PAppContext.getGlobalContext(), BUNDLE_NAME); } diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/ui/GeneralHelper.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/ui/GeneralHelper.java index 0cc4e5278..b2b38398e 100644 --- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/ui/GeneralHelper.java +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/ui/GeneralHelper.java @@ -146,11 +146,11 @@ public class GeneralHelper { List rv = tcg.clearAllMessages(); try { tcg.saveConfig(); - rv.add(0, _("Configuration changes saved", context)); + rv.add(0, _t("Configuration changes saved", context)); } catch (IOException ioe) { Log log = context.logManager().getLog(GeneralHelper.class); log.error("Failed to save config file", ioe); - rv.add(0, _("Failed to save configuration", context) + ": " + ioe.toString()); + rv.add(0, _t("Failed to save configuration", context) + ": " + ioe.toString()); } return rv; } @@ -714,7 +714,7 @@ public class GeneralHelper { return def; } - protected static String _(String key, I2PAppContext context) { - return Messages._(key, context); + protected static String _t(String key, I2PAppContext context) { + return Messages._t(key, context); } } 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 ebc495098..fb9b137b2 100644 --- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/web/EditBean.java +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/web/EditBean.java @@ -358,7 +358,7 @@ public class EditBean extends IndexBean { public String getI2CPHost(int tunnel) { if (_context.isRouterContext()) - return _("internal"); + return _t("internal"); TunnelController tun = getController(tunnel); if (tun != null) return tun.getI2CPHost(); @@ -368,7 +368,7 @@ public class EditBean extends IndexBean { public String getI2CPPort(int tunnel) { if (_context.isRouterContext()) - return _("internal"); + return _t("internal"); TunnelController tun = getController(tunnel); if (tun != null) return tun.getI2CPPort(); @@ -406,11 +406,11 @@ public class EditBean extends IndexBean { if (i <= 3) { buf.append(" ("); if (i == 1) - buf.append(_("lower bandwidth and reliability")); + buf.append(_t("lower bandwidth and reliability")); else if (i == 2) - buf.append(_("standard bandwidth and reliability")); + buf.append(_t("standard bandwidth and reliability")); else if (i == 3) - buf.append(_("higher bandwidth and reliability")); + buf.append(_t("higher bandwidth and reliability")); buf.append(')'); } buf.append("\n"); 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 ccb30ca99..15eb3f29e 100644 --- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/web/IndexBean.java +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/web/IndexBean.java @@ -84,7 +84,7 @@ public class IndexBean { String error; try { tcg = TunnelControllerGroup.getInstance(); - error = tcg == null ? _("Tunnels are not initialized yet, please reload in two minutes.") + error = tcg == null ? _t("Tunnels are not initialized yet, please reload in two minutes.") : null; } catch (IllegalArgumentException iae) { tcg = null; @@ -157,9 +157,9 @@ public class IndexBean { // 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.") + return _t("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."); + _t("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)) @@ -205,7 +205,7 @@ public class IndexBean { private String reloadConfig() { _group.reloadControllers(); - return _("Configuration reloaded for all tunnels"); + return _t("Configuration reloaded for all tunnels"); } private String start() { @@ -219,7 +219,7 @@ public class IndexBean { try { Thread.sleep(1000); } catch (InterruptedException ie) {} // and give them something to look at in any case // FIXME name will be HTML escaped twice - return _("Starting tunnel") + ' ' + getTunnelName(_tunnel) + "..."; + return _t("Starting tunnel") + ' ' + getTunnelName(_tunnel) + "..."; } private String stop() { @@ -233,7 +233,7 @@ public class IndexBean { try { Thread.sleep(1000); } catch (InterruptedException ie) {} // and give them something to look at in any case // FIXME name will be HTML escaped twice - return _("Stopping tunnel") + ' ' + getTunnelName(_tunnel) + "..."; + return _t("Stopping tunnel") + ' ' + getTunnelName(_tunnel) + "..."; } private String saveChanges() { @@ -322,7 +322,7 @@ public class IndexBean { if (name != null) return DataHelper.escapeHTML(name); else - return _("New Tunnel"); + return _t("New Tunnel"); } /** @@ -342,13 +342,13 @@ public class IndexBean { if (tun != null && tun.getListenPort() != null) { String port = tun.getListenPort(); if (port.length() == 0) - return "" + _("Port not set") + ""; + return "" + _t("Port not set") + ""; int iport = Addresses.getPort(port); if (iport == 0) - return "" + _("Invalid port") + ' ' + port + ""; + return "" + _t("Invalid port") + ' ' + port + ""; if (iport < 1024) return "" + - _("Warning - ports less than 1024 are not recommended") + + _t("Warning - ports less than 1024 are not recommended") + ": " + port + ""; // dup check, O(n**2) List controllers = _group.getControllers(); @@ -357,12 +357,12 @@ public class IndexBean { continue; if (port.equals(controllers.get(i).getListenPort())) return "" + - _("Warning - duplicate port") + + _t("Warning - duplicate port") + ": " + port + ""; } return port; } - return "" + _("Port not set") + ""; + return "" + _t("Port not set") + ""; } public String getTunnelType(int tunnel) { @@ -374,18 +374,18 @@ public class IndexBean { } public String getTypeName(String internalType) { - if (TunnelController.TYPE_STD_CLIENT.equals(internalType)) return _("Standard client"); - else if (TunnelController.TYPE_HTTP_CLIENT.equals(internalType)) return _("HTTP/HTTPS client"); - else if (TunnelController.TYPE_IRC_CLIENT.equals(internalType)) return _("IRC client"); - else if (TunnelController.TYPE_STD_SERVER.equals(internalType)) return _("Standard server"); - else if (TunnelController.TYPE_HTTP_SERVER.equals(internalType)) return _("HTTP server"); - else if (TunnelController.TYPE_SOCKS.equals(internalType)) return _("SOCKS 4/4a/5 proxy"); - else if (TunnelController.TYPE_SOCKS_IRC.equals(internalType)) return _("SOCKS IRC proxy"); - else if (TunnelController.TYPE_CONNECT.equals(internalType)) return _("CONNECT/SSL/HTTPS proxy"); - else if (TunnelController.TYPE_IRC_SERVER.equals(internalType)) return _("IRC server"); - else if (TunnelController.TYPE_STREAMR_CLIENT.equals(internalType)) return _("Streamr client"); - else if (TunnelController.TYPE_STREAMR_SERVER.equals(internalType)) return _("Streamr server"); - else if (TunnelController.TYPE_HTTP_BIDIR_SERVER.equals(internalType)) return _("HTTP bidir"); + if (TunnelController.TYPE_STD_CLIENT.equals(internalType)) return _t("Standard client"); + else if (TunnelController.TYPE_HTTP_CLIENT.equals(internalType)) return _t("HTTP/HTTPS client"); + else if (TunnelController.TYPE_IRC_CLIENT.equals(internalType)) return _t("IRC client"); + else if (TunnelController.TYPE_STD_SERVER.equals(internalType)) return _t("Standard server"); + else if (TunnelController.TYPE_HTTP_SERVER.equals(internalType)) return _t("HTTP server"); + else if (TunnelController.TYPE_SOCKS.equals(internalType)) return _t("SOCKS 4/4a/5 proxy"); + else if (TunnelController.TYPE_SOCKS_IRC.equals(internalType)) return _t("SOCKS IRC proxy"); + else if (TunnelController.TYPE_CONNECT.equals(internalType)) return _t("CONNECT/SSL/HTTPS proxy"); + else if (TunnelController.TYPE_IRC_SERVER.equals(internalType)) return _t("IRC server"); + else if (TunnelController.TYPE_STREAMR_CLIENT.equals(internalType)) return _t("Streamr client"); + else if (TunnelController.TYPE_STREAMR_SERVER.equals(internalType)) return _t("Streamr server"); + else if (TunnelController.TYPE_HTTP_BIDIR_SERVER.equals(internalType)) return _t("HTTP bidir"); else return internalType; } @@ -442,15 +442,15 @@ public class IndexBean { host = tun.getTargetHost(); String port = tun.getTargetPort(); if (host == null || host.length() == 0) - host = "" + _("Host not set") + ""; + host = "" + _t("Host not set") + ""; else if (Addresses.getIP(host) == null) - host = "" + _("Invalid address") + ' ' + host + ""; + host = "" + _t("Invalid address") + ' ' + host + ""; else if (host.indexOf(':') >= 0) host = '[' + host + ']'; if (port == null || port.length() == 0) - port = "" + _("Port not set") + ""; + port = "" + _t("Port not set") + ""; else if (Addresses.getPort(port) == 0) - port = "" + _("Invalid port") + ' ' + port + ""; + port = "" + _t("Invalid port") + ' ' + port + ""; return host + ':' + port; } else return ""; @@ -1074,8 +1074,8 @@ public class IndexBean { } } - protected String _(String key) { - return Messages._(key, _context); + protected String _t(String key) { + return Messages._t(key, _context); } /** translate (ngettext) diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/web/Messages.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/web/Messages.java index d4a2fb4bd..89e2bfc43 100644 --- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/web/Messages.java +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/web/Messages.java @@ -16,11 +16,11 @@ public class Messages { } /** lang in routerconsole.lang property, else current locale */ - public String _(String key) { + public String _t(String key) { return Translate.getString(key, _context, BUNDLE_NAME); } - public static String _(String key, I2PAppContext ctx) { + public static String _t(String key, I2PAppContext ctx) { return Translate.getString(key, ctx, BUNDLE_NAME); } @@ -32,11 +32,11 @@ public class Messages { * The {0} will be replaced by the parameter. * Single quotes must be doubled, i.e. ' -> '' in the string. * @param o parameter, not translated. - * To tranlslate parameter also, use _("foo {0} bar", _("baz")) + * To tranlslate parameter also, use _t("foo {0} bar", _t("baz")) * Do not double the single quotes in the parameter. * Use autoboxing to call with ints, longs, floats, etc. */ - public String _(String s, Object o) { + public String _t(String s, Object o) { return Translate.getString(s, o, _context, BUNDLE_NAME); } diff --git a/apps/i2ptunnel/jsp/editClient.jsp b/apps/i2ptunnel/jsp/editClient.jsp index c0dd04cf4..5fbc62dd4 100644 --- a/apps/i2ptunnel/jsp/editClient.jsp +++ b/apps/i2ptunnel/jsp/editClient.jsp @@ -16,7 +16,7 @@ %> - <%=intl._("Hidden Services Manager")%> - <%=intl._("Edit Client Tunnel")%> + <%=intl._t("Hidden Services Manager")%> - <%=intl._t("Edit Client Tunnel")%> @@ -49,11 +49,11 @@ input.default { width: 1px; height: 1px; visibility: hidden; } if (curTunnel >= 0) { tunnelTypeName = editBean.getTunnelType(curTunnel); tunnelType = editBean.getInternalType(curTunnel); - %>

<%=intl._("Edit proxy settings")%>

<% + %>

<%=intl._t("Edit proxy settings")%>

<% } else { tunnelTypeName = editBean.getTypeName(request.getParameter("type")); tunnelType = net.i2p.data.DataHelper.stripHTML(request.getParameter("type")); - %>

<%=intl._("New proxy settings")%>

<% + %>

<%=intl._t("New proxy settings")%>

<% } %> @@ -87,17 +87,17 @@ input.default { width: 1px; height: 1px; visibility: hidden; }
- + <%=tunnelTypeName%>
@@ -108,9 +108,9 @@ input.default { width: 1px; height: 1px; visibility: hidden; }
<% if ("streamrclient".equals(tunnelType)) { %> - + <% } else { %> - + <% } /* streamrclient */ %>
@@ -119,7 +119,7 @@ input.default { width: 1px; height: 1px; visibility: hidden; } <% String value = editBean.getClientPort(curTunnel); if (value == null || "".equals(value.trim())) { out.write(" ("); - out.write(intl._("required")); + out.write(intl._t("required")); out.write(")"); } %> @@ -134,14 +134,14 @@ input.default { width: 1px; height: 1px; visibility: hidden; } String targetHost = editBean.getTargetHost(curTunnel); if (targetHost == null || "".equals(targetHost.trim())) { out.write(" ("); - out.write(intl._("required")); + out.write(intl._t("required")); out.write(")"); } %> <% } else { %> - <%=intl._("Reachable by")%>(R): + <%=intl._t("Reachable by")%>(R): class="tickbox" />
@@ -176,41 +176,41 @@ input.default { width: 1px; height: 1px; visibility: hidden; } <% if ("httpclient".equals(tunnelType) || "connectclient".equals(tunnelType) || "sockstunnel".equals(tunnelType) || "socksirctunnel".equals(tunnelType)) { %>
<% if ("httpclient".equals(tunnelType)) { %>
<% } // httpclient %>
class="tickbox" /> - <%=intl._("(Check the Box for 'YES')")%> + <%=intl._t("(Check the Box for 'YES')")%>
<% } else if ("client".equals(tunnelType) || "ircclient".equals(tunnelType) || "streamrclient".equals(tunnelType)) { %>
- (<%=intl._("name, name:port, or destination")%> + (<%=intl._t("name, name:port, or destination")%> <% if ("streamrclient".equals(tunnelType)) { /* deferred resolution unimplemented in streamr client */ %> - - <%=intl._("b32 not recommended")%> + - <%=intl._t("b32 not recommended")%> <% } %> )
@@ -218,26 +218,26 @@ input.default { width: 1px; height: 1px; visibility: hidden; } <% if (!"streamrclient".equals(tunnelType)) { %>
class="tickbox" /> - <%=intl._("(Share tunnels with other clients and irc/httpclients? Change requires restart of client proxy)")%> + <%=intl._t("(Share tunnels with other clients and irc/httpclients? Change requires restart of client proxy)")%>
<% } // !streamrclient %>
class="tickbox" /> - <%=intl._("(Check the Box for 'YES')")%> + <%=intl._t("(Check the Box for 'YES')")%>
<% if ("ircclient".equals(tunnelType)) { %>
class="tickbox" /> - <%=intl._("(Check the Box for 'YES')")%> + <%=intl._t("(Check the Box for 'YES')")%>
<% } // ircclient %> @@ -247,8 +247,8 @@ input.default { width: 1px; height: 1px; visibility: hidden; }
-

<%=intl._("Advanced networking options")%>


- <%=intl._("(NOTE: when this client proxy is configured to share tunnels, then these options are for all the shared proxy clients!)")%> +

<%=intl._t("Advanced networking options")%>


+ <%=intl._t("(NOTE: when this client proxy is configured to share tunnels, then these options are for all the shared proxy clients!)")%>
@@ -256,42 +256,42 @@ input.default { width: 1px; height: 1px; visibility: hidden; }
- +
<% int tunnelBackupQuantity = editBean.getTunnelBackupQuantity(curTunnel, 0); - %> - - - + %> + + + <% if (tunnelBackupQuantity > 3) { - %> + %> <% } %>
@@ -320,20 +320,20 @@ input.default { width: 1px; height: 1px; visibility: hidden; } <% if (!"streamrclient".equals(tunnelType)) { %>
class="tickbox" /> - (<%=intl._("for request/response connections")%>) + (<%=intl._t("for request/response connections")%>)
@@ -342,17 +342,17 @@ input.default { width: 1px; height: 1px; visibility: hidden; } <% } // !streamrclient %>
- +
readonly="readonly" <% } %> />
readonly="readonly" <% } %> />
@@ -364,12 +364,12 @@ input.default { width: 1px; height: 1px; visibility: hidden; }
class="tickbox" />
@@ -381,24 +381,24 @@ input.default { width: 1px; height: 1px; visibility: hidden; }
class="tickbox" />
@@ -409,31 +409,31 @@ input.default { width: 1px; height: 1px; visibility: hidden; }
class="tickbox" />
- + - +
class="tickbox" /><%=intl._("Enable")%><%=intl._t("Enable")%> class="tickbox" /><%=intl._("Disable")%>
<%=intl._t("Disable")%>
@@ -445,16 +445,16 @@ input.default { width: 1px; height: 1px; visibility: hidden; } <% if ("client".equals(tunnelType) || "ircclient".equals(tunnelType) || "socksirctunnel".equals(tunnelType) || "sockstunnel".equals(tunnelType)) { %>
- + class="tickbox" />
- +
<% @@ -462,12 +462,12 @@ input.default { width: 1px; height: 1px; visibility: hidden; } if (destb64.length() > 0) { %>
- + <%=editBean.getDestHashBase32(curTunnel)%>
<% } // if destb64 %> @@ -479,31 +479,31 @@ input.default { width: 1px; height: 1px; visibility: hidden; } <% if ("httpclient".equals(tunnelType)) { %>
- +
- + class="tickbox" />

- +
- + class="tickbox" />

- +
- + class="tickbox" />

- +
- + class="tickbox" />
@@ -516,8 +516,8 @@ input.default { width: 1px; height: 1px; visibility: hidden; } %>
@@ -558,23 +558,23 @@ input.default { width: 1px; height: 1px; visibility: hidden; } <% if ("httpclient".equals(tunnelType) || "connectclient".equals(tunnelType) || "sockstunnel".equals(tunnelType) || "socksirctunnel".equals(tunnelType)) { %>
- +
class="tickbox" />
@@ -582,23 +582,23 @@ input.default { width: 1px; height: 1px; visibility: hidden; }
- +
class="tickbox" />
@@ -609,7 +609,7 @@ input.default { width: 1px; height: 1px; visibility: hidden; } <% if ("httpclient".equals(tunnelType)) { %>
- +
@@ -621,7 +621,7 @@ input.default { width: 1px; height: 1px; visibility: hidden; }
@@ -634,9 +634,9 @@ input.default { width: 1px; height: 1px; visibility: hidden; }
diff --git a/apps/i2ptunnel/jsp/editServer.jsp b/apps/i2ptunnel/jsp/editServer.jsp index 0d7c05093..4a0a7eabf 100644 --- a/apps/i2ptunnel/jsp/editServer.jsp +++ b/apps/i2ptunnel/jsp/editServer.jsp @@ -16,7 +16,7 @@ %> - <%=intl._("Hidden Services Manager")%> - <%=intl._("Edit Hidden Service")%> + <%=intl._t("Hidden Services Manager")%> - <%=intl._t("Edit Hidden Service")%> @@ -49,11 +49,11 @@ input.default { width: 1px; height: 1px; visibility: hidden; } if (curTunnel >= 0) { tunnelTypeName = editBean.getTunnelType(curTunnel); tunnelType = editBean.getInternalType(curTunnel); - %>

<%=intl._("Edit server settings")%>

<% + %>

<%=intl._t("Edit server settings")%>

<% } else { tunnelTypeName = editBean.getTypeName(request.getParameter("type")); tunnelType = net.i2p.data.DataHelper.stripHTML(request.getParameter("type")); - %>

<%=intl._("New server settings")%>

<% + %>

<%=intl._t("New server settings")%>

<% } %> @@ -87,26 +87,26 @@ input.default { width: 1px; height: 1px; visibility: hidden; }
- + <%=tunnelTypeName%>
class="tickbox" /> - <%=intl._("(Check the Box for 'YES')")%> + <%=intl._t("(Check the Box for 'YES')")%>
@@ -115,26 +115,26 @@ input.default { width: 1px; height: 1px; visibility: hidden; }
<% if ("streamrserver".equals(tunnelType)) { %> - + <% } else { %> - + <% } %>
<% if (!"streamrserver".equals(tunnelType)) { %>
<% } /* !streamrserver */ %>
- +
") - .append(_("Start")).append(" ").append(index).append(""); + .append(_t("Start")).append(" ").append(index).append(""); } if (showStopButton && (!edit)) buf.append(""); + .append(_t("Stop")).append(" ").append(index).append(""); if (isClientChangeEnabled() && showEditButton && (!edit) && !ro) buf.append(""); + .append(_t("Edit")).append(" ").append(index).append(""); if (showUpdateButton && (!edit) && !ro) { buf.append(""); + .append(_t("Check for updates")).append(" ").append(index).append(""); buf.append(""); + .append(_t("Update")).append(" ").append(index).append(""); } if (showDeleteButton && (!edit) && !ro) { buf.append(""); + .append(_t("Delete")).append(" ").append(index).append(""); } buf.append(""); if (edit && !ro) { diff --git a/apps/routerconsole/java/src/net/i2p/router/web/ConfigHomeHandler.java b/apps/routerconsole/java/src/net/i2p/router/web/ConfigHomeHandler.java index 5e426988e..f26b182a0 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/ConfigHomeHandler.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/ConfigHomeHandler.java @@ -18,15 +18,15 @@ public class ConfigHomeHandler extends FormHandler { protected void processForm() { if (_action == null) return; String group = getJettyString("group"); - boolean deleting = _action.equals(_("Delete selected")); - boolean adding = _action.equals(_("Add item")); - boolean restoring = _action.equals(_("Restore defaults")); - if (_action.equals(_("Save")) && "0".equals(group)) { + boolean deleting = _action.equals(_t("Delete selected")); + boolean adding = _action.equals(_t("Add item")); + boolean restoring = _action.equals(_t("Restore defaults")); + if (_action.equals(_t("Save")) && "0".equals(group)) { boolean old = _context.getBooleanProperty(HomeHelper.PROP_OLDHOME); boolean nnew = getJettyString("oldHome") != null; if (old != nnew) { _context.router().saveConfig(HomeHelper.PROP_OLDHOME, "" + nnew); - addFormNotice(_("Home page changed")); + addFormNotice(_t("Home page changed")); } } else if (adding || deleting || restoring) { String prop; @@ -48,7 +48,7 @@ public class ConfigHomeHandler extends FormHandler { //_context.router().saveConfig(prop, dflt); // remove config so user will see updates _context.router().saveConfig(prop, null); - addFormNotice(_("Restored default settings")); + addFormNotice(_t("Restored default settings")); return; } String config = _context.getProperty(prop, dflt); @@ -60,12 +60,12 @@ public class ConfigHomeHandler extends FormHandler { if (adding) { String name = getJettyString("nofilter_name"); if (name == null || name.length() <= 0) { - addFormError(_("No name entered")); + addFormError(_t("No name entered")); return; } String url = getJettyString("nofilter_url"); if (url == null || url.length() <= 0) { - addFormError(_("No URL entered")); + addFormError(_t("No URL entered")); return; } // these would get double-escaped so we can't do it this way... @@ -81,7 +81,7 @@ public class ConfigHomeHandler extends FormHandler { else app = new HomeHelper.App(name, "", url, "/themes/console/images/question.png"); apps.add(app); - addFormNotice(_("Added") + ": " + app.name); + addFormNotice(_t("Added") + ": " + app.name); } else { // deleting Set toDelete = new HashSet(); @@ -98,13 +98,13 @@ public class ConfigHomeHandler extends FormHandler { HomeHelper.App app = iter.next(); if (toDelete.contains(app.name)) { iter.remove(); - addFormNotice(_("Removed") + ": " + app.name); + addFormNotice(_t("Removed") + ": " + app.name); } } } HomeHelper.saveApps(_context, prop, apps, !("3".equals(group))); } else { - //addFormError(_("Unsupported")); + //addFormError(_t("Unsupported")); } } } diff --git a/apps/routerconsole/java/src/net/i2p/router/web/ConfigKeyringHandler.java b/apps/routerconsole/java/src/net/i2p/router/web/ConfigKeyringHandler.java index 97b8cb3a6..b5930895b 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/ConfigKeyringHandler.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/ConfigKeyringHandler.java @@ -15,12 +15,12 @@ public class ConfigKeyringHandler extends FormHandler { @Override protected void processForm() { if (_action == null) return; - boolean adding = _action.equals(_("Add key")); - if (adding || _action.equals(_("Delete key"))) { + boolean adding = _action.equals(_t("Add key")); + if (adding || _action.equals(_t("Delete key"))) { if (_peer == null) - addFormError(_("You must enter a destination")); + addFormError(_t("You must enter a destination")); if (_key == null && adding) - addFormError(_("You must enter a key")); + addFormError(_t("You must enter a key")); if (_peer == null || (_key == null && adding)) return; Hash h = ConvertToHash.getHash(_peer); @@ -31,22 +31,22 @@ public class ConfigKeyringHandler extends FormHandler { } catch (DataFormatException dfe) {} if (h != null && h.getData() != null && sk.getData() != null) { _context.keyRing().put(h, sk); - addFormNotice(_("Key for") + " " + h.toBase64() + " " + _("added to keyring")); + addFormNotice(_t("Key for") + " " + h.toBase64() + " " + _t("added to keyring")); } else { - addFormError(_("Invalid destination or key")); + addFormError(_t("Invalid destination or key")); } } else { // Delete if (h != null && h.getData() != null) { if (_context.keyRing().remove(h) != null) - addFormNotice(_("Key for") + " " + h.toBase64() + " " + _("removed from keyring")); + addFormNotice(_t("Key for") + " " + h.toBase64() + " " + _t("removed from keyring")); else - addFormNotice(_("Key for") + " " + h.toBase64() + " " + _("not found in keyring")); + addFormNotice(_t("Key for") + " " + h.toBase64() + " " + _t("not found in keyring")); } else { - addFormError(_("Invalid destination")); + addFormError(_t("Invalid destination")); } } } else { - //addFormError(_("Unsupported")); + //addFormError(_t("Unsupported")); } } diff --git a/apps/routerconsole/java/src/net/i2p/router/web/ConfigLoggingHandler.java b/apps/routerconsole/java/src/net/i2p/router/web/ConfigLoggingHandler.java index e98528a96..e902e9c72 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/ConfigLoggingHandler.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/ConfigLoggingHandler.java @@ -79,7 +79,7 @@ public class ConfigLoggingHandler extends FormHandler { props.setProperty(_newLogClass, _newLogLevel); _context.logManager().setLimits(props); shouldSave = true; - addFormNotice(_("Log overrides updated")); + addFormNotice(_t("Log overrides updated")); } catch (IOException ioe) { // shouldn't ever happen (BAIS shouldnt cause an IOE) _context.logManager().getLog(ConfigLoggingHandler.class).error("Error reading from the props?", ioe); @@ -160,7 +160,7 @@ public class ConfigLoggingHandler extends FormHandler { boolean saved = _context.logManager().saveConfig(); if (saved) - addFormNotice(_("Log configuration saved")); + addFormNotice(_t("Log configuration saved")); else addFormError("Error saving the configuration (applied but not saved) - please see the error logs"); } diff --git a/apps/routerconsole/java/src/net/i2p/router/web/ConfigLoggingHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/ConfigLoggingHelper.java index aa064e627..1a9354a2d 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/ConfigLoggingHelper.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/ConfigLoggingHelper.java @@ -42,9 +42,9 @@ public class ConfigLoggingHelper extends HelperBase { buf.append(prefix).append('=').append(level).append('\n'); } buf.append("
\n"); - buf.append("").append(_("Add additional logging statements above. Example: net.i2p.router.tunnel=WARN")).append("
"); - buf.append("").append(_("Or put entries in the logger.config file. Example: logger.record.net.i2p.router.tunnel=WARN")).append("
"); - buf.append("").append(_("Valid levels are DEBUG, INFO, WARN, ERROR, CRIT")).append("\n"); + buf.append("").append(_t("Add additional logging statements above. Example: net.i2p.router.tunnel=WARN")).append("
"); + buf.append("").append(_t("Or put entries in the logger.config file. Example: logger.record.net.i2p.router.tunnel=WARN")).append("
"); + buf.append("").append(_t("Valid levels are DEBUG, INFO, WARN, ERROR, CRIT")).append("\n"); /**** // this is too big and ugly @@ -78,11 +78,11 @@ public class ConfigLoggingHelper extends HelperBase { buf.append("\n"); + buf.append('>').append(_t(l)).append("\n"); } if (showRemove) - buf.append(""); + buf.append(""); buf.append("\n"); return buf.toString(); } @@ -119,7 +119,7 @@ public class ConfigLoggingHelper extends HelperBase { StringBuilder buf = new StringBuilder(65536); buf.append("
" + _("ANONYMITY WARNING - Settings include 0-hop tunnels.") + "
" + _t("ANONYMITY WARNING - Settings include 0-hop tunnels.") + "
" + _("ANONYMITY WARNING - Settings include 1-hop tunnels.") + "
" + _t("ANONYMITY WARNING - Settings include 1-hop tunnels.") + "
" + _("PERFORMANCE WARNING - Settings include very long tunnels.") + "
" + _t("PERFORMANCE WARNING - Settings include very long tunnels.") + "
" + _("PERFORMANCE WARNING - Settings include high tunnel quantities.") + "
" + _t("PERFORMANCE WARNING - Settings include high tunnel quantities.") + "
\"Inbound\"  " + _("Inbound") + "\"Outbound  " + _("Outbound") + "
\"Inbound\"  " + _t("Inbound") + "\"Outbound  " + _t("Outbound") + "
InboundOutbound
" + _("Length") + ":
" + _t("Length") + ":
" + _("Randomization") + ":
" + _t("Randomization") + ":
" + _("Quantity") + ":
" + _t("Quantity") + ":
" + _("Backup quantity") + ":
" + _t("Backup quantity") + ":
" + _("Inbound options") + ":
" + _t("Inbound options") + ":" + _("Outbound options") + ":
" + _t("Outbound options") + ":" + - _("Refresh the page to view.") + + _t("Refresh the page to view.") + ""); if (oldForceMobileConsole != _forceMobileConsole) - addFormNoticeNoEscape(_("Mobile console option saved.") + + addFormNoticeNoEscape(_t("Mobile console option saved.") + " " + - _("Refresh the page to view.") + + _t("Refresh the page to view.") + ""); } else { - addFormError(_("Error saving the configuration (applied but not saved) - please see the error logs.")); + addFormError(_t("Error saving the configuration (applied but not saved) - please see the error logs.")); } } private void addUser() { String name = getJettyString("name"); if (name == null || name.length() <= 0) { - addFormError(_("No user name entered")); + addFormError(_t("No user name entered")); return; } String pw = getJettyString("nofilter_pw"); if (pw == null || pw.length() <= 0) { - addFormError(_("No password entered")); + addFormError(_t("No password entered")); return; } ConsolePasswordManager mgr = new ConsolePasswordManager(_context); @@ -90,10 +90,10 @@ public class ConfigUIHandler extends FormHandler { if (mgr.saveMD5(RouterConsoleRunner.PROP_CONSOLE_PW, RouterConsoleRunner.JETTY_REALM, name, pw)) { if (!_context.getBooleanProperty(RouterConsoleRunner.PROP_PW_ENABLE)) _context.router().saveConfig(RouterConsoleRunner.PROP_PW_ENABLE, "true"); - addFormNotice(_("Added user {0}", name)); - addFormError(_("Restart required to take effect")); + addFormNotice(_t("Added user {0}", name)); + addFormError(_t("Restart required to take effect")); } else { - addFormError(_("Error saving the configuration (applied but not saved) - please see the error logs.")); + addFormError(_t("Error saving the configuration (applied but not saved) - please see the error logs.")); } } @@ -108,13 +108,13 @@ public class ConfigUIHandler extends FormHandler { continue; k = k.substring(7); if (mgr.remove(RouterConsoleRunner.PROP_CONSOLE_PW, k)) { - addFormNotice(_("Removed user {0}", k)); + addFormNotice(_t("Removed user {0}", k)); success = true; } else { - addFormError(_("Error saving the configuration (applied but not saved) - please see the error logs.")); + addFormError(_t("Error saving the configuration (applied but not saved) - please see the error logs.")); } } if (success) - addFormError(_("Restart required to take effect")); + addFormError(_t("Restart required to take effect")); } } diff --git a/apps/routerconsole/java/src/net/i2p/router/web/ConfigUIHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/ConfigUIHelper.java index 294cc6dc0..1432de98b 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/ConfigUIHelper.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/ConfigUIHelper.java @@ -15,14 +15,14 @@ public class ConfigUIHelper extends HelperBase { buf.append("").append(_(theme)).append("
\n"); + buf.append("value=\"").append(theme).append("\">").append(_t(theme)).append("
\n"); } boolean universalTheming = _context.getBooleanProperty(CSSHelper.PROP_UNIVERSAL_THEMING); buf.append("") - .append(_("Set theme universally across all apps")) + .append(_t("Set theme universally across all apps")) .append("
\n"); return buf.toString(); } @@ -34,7 +34,7 @@ public class ConfigUIHelper extends HelperBase { if (forceMobileConsole) buf.append("checked=\"checked\" "); buf.append("value=\"1\">") - .append(_("Force the mobile console to be used")) + .append(_t("Force the mobile console to be used")) .append("
\n"); return buf.toString(); } @@ -163,13 +163,13 @@ public class ConfigUIHelper extends HelperBase { buf.append(""); if (userpw.isEmpty()) { buf.append(""); } else { buf.append("\n"); for (String name : userpw.keySet()) { buf.append("" + "
"); - buf.append(_("Add a user and password to enable.")); + buf.append(_t("Add a user and password to enable.")); buf.append("
") - .append(_("Remove")) + .append(_t("Remove")) .append("") - .append(_("User Name")) + .append(_t("User Name")) .append(" 
") - .append(_("Add")).append(":" + + .append(_t("Add")).append(":" + "" + ""); - buf.append(_("Password")).append(": " + + buf.append(_t("Password")).append(": " + "
\n"); return buf.toString(); diff --git a/apps/routerconsole/java/src/net/i2p/router/web/ConfigUpdateHandler.java b/apps/routerconsole/java/src/net/i2p/router/web/ConfigUpdateHandler.java index 7f8c75dfd..744d99683 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/ConfigUpdateHandler.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/ConfigUpdateHandler.java @@ -157,14 +157,14 @@ public class ConfigUpdateHandler extends FormHandler { protected void processForm() { if (_action == null) return; - if (_action.equals(_("Check for updates"))) { + if (_action.equals(_t("Check for updates"))) { ConsoleUpdateManager mgr = UpdateHandler.updateManager(_context); if (mgr == null) { addFormError("Update manager not registered, cannot check"); return; } if (mgr.isUpdateInProgress() || mgr.isCheckInProgress()) { - addFormError(_("Update or check already in progress")); + addFormError(_t("Update or check already in progress")); return; } @@ -174,7 +174,7 @@ public class ConfigUpdateHandler extends FormHandler { if (shouldProxy && proxyPort == ConfigUpdateHandler.DEFAULT_PROXY_PORT_INT && proxyHost.equals(ConfigUpdateHandler.DEFAULT_PROXY_HOST) && _context.portMapper().getPort(PortMapper.SVC_HTTP_PROXY) < 0) { - addFormError(_("HTTP client proxy tunnel must be running")); + addFormError(_t("HTTP client proxy tunnel must be running")); return; } @@ -187,19 +187,19 @@ public class ConfigUpdateHandler extends FormHandler { a3 = mgr.checkAvailable(ROUTER_UNSIGNED, 40*1000) != null; if (a1 || a2 || a3) { if ( (_updatePolicy == null) || (!_updatePolicy.equals("notify")) ) - addFormNotice(_("Update available, attempting to download now")); + addFormNotice(_t("Update available, attempting to download now")); else - addFormNotice(_("Update available, click button on left to download")); + addFormNotice(_t("Update available, click button on left to download")); // So that update() will post a status to the summary bar before we reload try { Thread.sleep(1000); } catch (InterruptedException ie) {} } else - addFormNotice(_("No update available")); + addFormNotice(_t("No update available")); return; } - if (!_action.equals(_("Save"))) + if (!_action.equals(_t("Save"))) return; Map changes = new HashMap(); @@ -213,26 +213,26 @@ public class ConfigUpdateHandler extends FormHandler { changes.put(PROP_NEWS_URL, _newsURL); // this invalidates the news changes.put(NewsHelper.PROP_LAST_CHECKED, "0"); - addFormNotice(_("Updating news URL to {0}", _newsURL)); + addFormNotice(_t("Updating news URL to {0}", _newsURL)); } else { addFormError("Changing news URL disabled"); } } } - if (_proxyHost != null && _proxyHost.length() > 0 && !_proxyHost.equals(_("internal"))) { + if (_proxyHost != null && _proxyHost.length() > 0 && !_proxyHost.equals(_t("internal"))) { String oldHost = _context.router().getConfigSetting(PROP_PROXY_HOST); if ( (oldHost == null) || (!_proxyHost.equals(oldHost)) ) { changes.put(PROP_PROXY_HOST, _proxyHost); - addFormNotice(_("Updating proxy host to {0}", _proxyHost)); + addFormNotice(_t("Updating proxy host to {0}", _proxyHost)); } } - if (_proxyPort != null && _proxyPort.length() > 0 && !_proxyPort.equals(_("internal"))) { + if (_proxyPort != null && _proxyPort.length() > 0 && !_proxyPort.equals(_t("internal"))) { String oldPort = _context.router().getConfigSetting(PROP_PROXY_PORT); if ( (oldPort == null) || (!_proxyPort.equals(oldPort)) ) { changes.put(PROP_PROXY_PORT, _proxyPort); - addFormNotice(_("Updating proxy port to {0}", _proxyPort)); + addFormNotice(_t("Updating proxy port to {0}", _proxyPort)); } } @@ -248,15 +248,15 @@ public class ConfigUpdateHandler extends FormHandler { try { oldFreq = Long.parseLong(oldFreqStr); } catch (NumberFormatException nfe) {} if (_refreshFrequency != oldFreq) { changes.put(PROP_REFRESH_FREQUENCY, ""+_refreshFrequency); - addFormNoticeNoEscape(_("Updating refresh frequency to {0}", - _refreshFrequency <= 0 ? _("Never") : DataHelper.formatDuration2(_refreshFrequency))); + addFormNoticeNoEscape(_t("Updating refresh frequency to {0}", + _refreshFrequency <= 0 ? _t("Never") : DataHelper.formatDuration2(_refreshFrequency))); } if ( (_updatePolicy != null) && (_updatePolicy.length() > 0) ) { String oldPolicy = _context.router().getConfigSetting(PROP_UPDATE_POLICY); if ( (oldPolicy == null) || (!_updatePolicy.equals(oldPolicy)) ) { changes.put(PROP_UPDATE_POLICY, _updatePolicy); - addFormNotice(_("Updating update policy to {0}", _updatePolicy)); + addFormNotice(_t("Updating update policy to {0}", _updatePolicy)); } } @@ -265,7 +265,7 @@ public class ConfigUpdateHandler extends FormHandler { String oldURL = _context.router().getConfigSetting(PROP_UPDATE_URL); if ( (oldURL == null) || (!_updateURL.equals(oldURL)) ) { changes.put(PROP_UPDATE_URL, _updateURL); - addFormNotice(_("Updating update URLs.")); + addFormNotice(_t("Updating update URLs.")); } } @@ -277,7 +277,7 @@ public class ConfigUpdateHandler extends FormHandler { // note that keys are not validated here and no console error message will be generated if (isAdvanced()) { changes.put(PROP_TRUSTED_KEYS, _trustedKeys); - addFormNotice(_("Updating trusted keys.")); + addFormNotice(_t("Updating trusted keys.")); } else { addFormError("Changing trusted keys disabled"); } @@ -289,7 +289,7 @@ public class ConfigUpdateHandler extends FormHandler { if ( (oldURL == null) || (!_zipURL.equals(oldURL)) ) { if (isAdvanced()) { changes.put(PROP_ZIP_URL, _zipURL); - addFormNotice(_("Updating unsigned update URL to {0}", _zipURL)); + addFormNotice(_t("Updating unsigned update URL to {0}", _zipURL)); } else { addFormError("Changing unsigned update URL disabled"); } @@ -301,7 +301,7 @@ public class ConfigUpdateHandler extends FormHandler { if ( (oldURL == null) || (!_devSU3URL.equals(oldURL)) ) { if (isAdvanced()) { changes.put(PROP_DEV_SU3_URL, _devSU3URL); - addFormNotice(_("Updating signed development build URL to {0}", _devSU3URL)); + addFormNotice(_t("Updating signed development build URL to {0}", _devSU3URL)); } else { addFormError("Changing signed update URL disabled"); } diff --git a/apps/routerconsole/java/src/net/i2p/router/web/ConfigUpdateHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/ConfigUpdateHelper.java index 3df84ceb5..93644982f 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/ConfigUpdateHelper.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/ConfigUpdateHelper.java @@ -51,13 +51,13 @@ public class ConfigUpdateHelper extends HelperBase { public String getProxyHost() { if (isInternal()) - return _("internal") + "\" readonly=\"readonly"; + return _t("internal") + "\" readonly=\"readonly"; return _context.getProperty(ConfigUpdateHandler.PROP_PROXY_HOST, ConfigUpdateHandler.DEFAULT_PROXY_HOST); } public String getProxyPort() { if (isInternal()) - return _("internal") + "\" readonly=\"readonly"; + return _t("internal") + "\" readonly=\"readonly"; return Integer.toString(ConfigUpdateHandler.proxyPort(_context)); } @@ -127,9 +127,9 @@ public class ConfigUpdateHelper extends HelperBase { buf.append("\" selected=\"selected"); if (PERIODS[i] == -1) - buf.append("\">").append(_("Never")).append("\n"); + buf.append("\">").append(_t("Never")).append("\n"); else - buf.append("\">").append(_("Every")).append(' ').append(DataHelper.formatDuration2(PERIODS[i])).append("\n"); + buf.append("\">").append(_t("Every")).append(' ').append(DataHelper.formatDuration2(PERIODS[i])).append("\n"); } buf.append("\n"); return buf.toString(); @@ -147,14 +147,14 @@ public class ConfigUpdateHelper extends HelperBase { buf.append(""); + buf.append('>').append(_t("Notify only")).append(""); buf.append(""); + buf.append('>').append(_t("Download and verify only")).append(""); if (_context.hasWrapper()) { buf.append(""); + buf.append('>').append(_t("Download, verify, and restart")).append(""); } buf.append("\n"); diff --git a/apps/routerconsole/java/src/net/i2p/router/web/EventLogHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/EventLogHelper.java index 492c006e2..f42e1cd6e 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/EventLogHelper.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/EventLogHelper.java @@ -66,7 +66,7 @@ public class EventLogHelper extends FormHandler { public void setContextId(String contextId) { super.setContextId(contextId); for (int i = 0; i < _events.length; i += 2) { - _xevents.put(_events[i], _(_events[i + 1])); + _xevents.put(_events[i], _t(_events[i + 1])); } } @@ -99,27 +99,27 @@ public class EventLogHelper extends FormHandler { // So just use the "shared/console nonce". String nonce = CSSHelper.getNonce(); try { - _out.write("

" + _("Display Events") + "

"); + _out.write("

" + _t("Display Events") + "

"); _out.write("
\n" + "\n" + "\n"); - _out.write(_("Events since") + ": "); for (int i = 0; i < _times.length; i++) { writeOption(_times[i]); } _out.write("
"); - _out.write(_("Event type") + ": "); // sorted by translated display string Map events = new TreeMap(Collator.getInstance()); for (int i = 0; i < _events.length; i += 2) { events.put(_xevents.get(_events[i]), _events[i]); } - writeOption(_("All events"), ALL); + writeOption(_t("All events"), ALL); for (Map.Entry e : events.entrySet()) { writeOption(e.getKey(), e.getValue()); } _out.write("" + - "
"); + "
"); } catch (IOException ioe) { ioe.printStackTrace(); } @@ -145,7 +145,7 @@ public class EventLogHelper extends FormHandler { _out.write(" selected=\"selected\""); _out.write(">"); if (age == 0) - _out.write(_("All events")); + _out.write(_t("All events")); else _out.write(DataHelper.formatDuration2(age)); _out.write("\n"); @@ -167,21 +167,21 @@ public class EventLogHelper extends FormHandler { if (events.isEmpty()) { if (isAll) { if (_age == 0) - return _("No events found"); - return _("No events found in previous {0}", DataHelper.formatDuration2(_age)); + return _t("No events found"); + return _t("No events found in previous {0}", DataHelper.formatDuration2(_age)); } if (_age == 0) - return _("No \"{0}\" events found", xev); - return _("No \"{0}\" events found in previous {1}", xev, DataHelper.formatDuration2(_age)); + return _t("No \"{0}\" events found", xev); + return _t("No \"{0}\" events found in previous {1}", xev, DataHelper.formatDuration2(_age)); } StringBuilder buf = new StringBuilder(2048); buf.append("
"); - buf.append(_("Time")); + buf.append(_t("Time")); buf.append(""); if (isAll) { - buf.append(_("Event")); + buf.append(_t("Event")); buf.append(""); - buf.append(_("Details")); + buf.append(_t("Details")); } else { buf.append(xev); } diff --git a/apps/routerconsole/java/src/net/i2p/router/web/FormHandler.java b/apps/routerconsole/java/src/net/i2p/router/web/FormHandler.java index a56f8f7ad..1b2dabb3a 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/FormHandler.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/FormHandler.java @@ -248,9 +248,9 @@ public abstract class FormHandler { } if (!_nonce.equals(_nonce1) && !_nonce.equals(_nonce2)) { - addFormError(_("Invalid form submission, probably because you used the 'back' or 'reload' button on your browser. Please resubmit.") + addFormError(_t("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.")); + _t("If the problem persists, verify that you have cookies enabled in your browser.")); _valid = false; } } @@ -291,28 +291,28 @@ public abstract class FormHandler { } /** translate a string */ - public String _(String s) { + public String _t(String s) { return Messages.getString(s, _context); } /** * translate a string with a parameter - * This is a lot more expensive than _(s), so use sparingly. + * This is a lot more expensive than _t(s), so use sparingly. * * @param s string to be translated containing {0} * The {0} will be replaced by the parameter. * Single quotes must be doubled, i.e. ' -> '' in the string. * @param o parameter, not translated. - * To tranlslate parameter also, use _("foo {0} bar", _("baz")) + * To tranlslate parameter also, use _t("foo {0} bar", _t("baz")) * Do not double the single quotes in the parameter. * Use autoboxing to call with ints, longs, floats, etc. */ - public String _(String s, Object o) { + public String _t(String s, Object o) { return Messages.getString(s, o, _context); } /** two params @since 0.8.2 */ - public String _(String s, Object o, Object o2) { + public String _t(String s, Object o, Object o2) { return Messages.getString(s, o, o2, _context); } diff --git a/apps/routerconsole/java/src/net/i2p/router/web/GraphHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/GraphHelper.java index eff8dc3e3..ab35a104a 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/GraphHelper.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/GraphHelper.java @@ -159,7 +159,7 @@ public class GraphHelper extends FormHandler { + "&w=" + (3 * _width) + "&h=" + (3 * _height) + "\">"); - String title = _("Combined bandwidth graph"); + String title = _t("Combined bandwidth graph"); _out.write("" + _("All times are UTC.") + "

\n"); + //_out.write("

" + _t("All times are UTC.") + "

\n"); } catch (IOException ioe) { ioe.printStackTrace(); } @@ -220,7 +220,7 @@ public class GraphHelper extends FormHandler { if (_stat.equals("bw.combined")) { period = 60000; name = _stat; - displayName = _("Bandwidth usage"); + displayName = _t("Bandwidth usage"); } else { Set rates = StatSummarizer.instance().parseSpecs(_stat); if (rates.size() != 1) { @@ -233,9 +233,9 @@ public class GraphHelper extends FormHandler { displayName = name; } _out.write("

"); - _out.write(_("{0} for {1}", displayName, DataHelper.formatDuration2(_periodCount * period))); + _out.write(_t("{0} for {1}", displayName, DataHelper.formatDuration2(_periodCount * period))); if (_end > 0) - _out.write(' ' + _("ending {0} ago", DataHelper.formatDuration2(_end * period))); + _out.write(' ' + _t("ending {0} ago", DataHelper.formatDuration2(_end * period))); _out.write("

- "); } if (_width > MIN_X && _height > MIN_Y) { _out.write(link(_stat, _showEvents, _periodCount, _end, _width * 2 / 3, _height * 2 / 3)); - _out.write(_("Smaller")); + _out.write(_t("Smaller")); _out.write(" - "); } if (_height < MAX_Y) { _out.write(link(_stat, _showEvents, _periodCount, _end, _width, _height * 3 / 2)); - _out.write(_("Taller")); + _out.write(_t("Taller")); _out.write(" - "); } if (_height > MIN_Y) { _out.write(link(_stat, _showEvents, _periodCount, _end, _width, _height * 2 / 3)); - _out.write(_("Shorter")); + _out.write(_t("Shorter")); _out.write(" - "); } if (_width < MAX_X) { _out.write(link(_stat, _showEvents, _periodCount, _end, _width * 3 / 2, _height)); - _out.write(_("Wider")); + _out.write(_t("Wider")); _out.write(" - "); } if (_width > MIN_X) { _out.write(link(_stat, _showEvents, _periodCount, _end, _width * 2 / 3, _height)); - _out.write(_("Narrower")); + _out.write(_t("Narrower")); _out.write(""); } _out.write("
"); if (_periodCount < MAX_C) { _out.write(link(_stat, _showEvents, _periodCount * 2, _end, _width, _height)); - _out.write(_("Larger interval")); + _out.write(_t("Larger interval")); _out.write(" - "); } if (_periodCount > MIN_C) { _out.write(link(_stat, _showEvents, _periodCount / 2, _end, _width, _height)); - _out.write(_("Smaller interval")); + _out.write(_t("Smaller interval")); _out.write(""); } _out.write("
"); if (_periodCount < MAX_C) { _out.write(link(_stat, _showEvents, _periodCount, _end + _periodCount, _width, _height)); - _out.write(_("Previous interval")); + _out.write(_t("Previous interval")); _out.write(""); } @@ -311,17 +311,17 @@ public class GraphHelper extends FormHandler { if (_periodCount < MAX_C) _out.write(" - "); _out.write(link(_stat, _showEvents, _periodCount, end, _width, _height)); - _out.write(_("Next interval")); + _out.write(_t("Next interval")); _out.write(" "); } _out.write("
"); _out.write(link(_stat, !_showEvents, _periodCount, _end, _width, _height)); if (!_stat.equals("bw.combined")) - _out.write(_showEvents ? _("Plot averages") : _("plot events")); + _out.write(_showEvents ? _t("Plot averages") : _t("plot events")); _out.write(""); - _out.write("

" + _("All times are UTC.") + "

\n"); + _out.write("

" + _t("All times are UTC.") + "

\n"); } catch (IOException ioe) { ioe.printStackTrace(); } @@ -353,17 +353,17 @@ public class GraphHelper extends FormHandler { // So just use the "shared/console nonce". String nonce = CSSHelper.getNonce(); try { - _out.write("

" + _("Configure Graph Display") + " [" + _("Select Stats") + "]

"); + _out.write("

" + _t("Configure Graph Display") + " [" + _t("Select Stats") + "]

"); _out.write("
\n" + "\n" + "\n"); - _out.write(_("Periods") + ":
\n"); - _out.write(_("Plot averages") + ": "); - _out.write(_("or")+ " " +_("plot events") + ":
\n"); - _out.write(_("Image sizes") + ": " + _("width") + ": " + _("pixels") + ", " + _("height") + ": " + _("pixels") + "
\n"); - _out.write(_("Refresh delay") + ":
\n"); + _out.write(_t("Plot averages") + ": "); + _out.write(_t("or")+ " " +_t("plot events") + ":
\n"); + _out.write(_t("Image sizes") + ": " + _t("width") + ": " + _t("pixels") + ", " + _t("height") + ": " + _t("pixels") + "
\n"); + _out.write(_t("Refresh delay") + ":
\n" + - _("Store graph data on disk?") + + _t("Store graph data on disk?") + " " + - "
"); + "
"); } catch (IOException ioe) { ioe.printStackTrace(); } @@ -440,7 +440,7 @@ public class GraphHelper extends FormHandler { changes.put(PROP_EVENTS, "" + _showEvents); changes.put(SummaryListener.PROP_PERSISTENT, "" + _persistent); _context.router().saveConfig(changes, null); - addFormNotice(_("Graph settings saved")); + addFormNotice(_t("Graph settings saved")); } } diff --git a/apps/routerconsole/java/src/net/i2p/router/web/HelperBase.java b/apps/routerconsole/java/src/net/i2p/router/web/HelperBase.java index ff0dc8059..1c14848dc 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/HelperBase.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/HelperBase.java @@ -44,28 +44,28 @@ public abstract class HelperBase { public void storeWriter(Writer out) { _out = out; } /** translate a string */ - public String _(String s) { + public String _t(String s) { return Messages.getString(s, _context); } /** * translate a string with a parameter - * This is a lot more expensive than _(s), so use sparingly. + * This is a lot more expensive than _t(s), so use sparingly. * * @param s string to be translated containing {0} * The {0} will be replaced by the parameter. * Single quotes must be doubled, i.e. ' -> '' in the string. * @param o parameter, not translated. - * To tranlslate parameter also, use _("foo {0} bar", _("baz")) + * To tranlslate parameter also, use _t("foo {0} bar", _t("baz")) * Do not double the single quotes in the parameter. * Use autoboxing to call with ints, longs, floats, etc. */ - public String _(String s, Object o) { + public String _t(String s, Object o) { return Messages.getString(s, o, _context); } /** two params @since 0.7.14 */ - public String _(String s, Object o, Object o2) { + public String _t(String s, Object o, Object o2) { return Messages.getString(s, o, o2, _context); } diff --git a/apps/routerconsole/java/src/net/i2p/router/web/HomeHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/HomeHelper.java index 8f2b48266..d9a8de301 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/HomeHelper.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/HomeHelper.java @@ -105,9 +105,9 @@ public class HomeHelper extends HelperBase { public String getProxyStatus() { int port = _context.portMapper().getPort(PortMapper.SVC_HTTP_PROXY); if (port <= 0) - return _("The HTTP proxy is not up"); + return _t("The HTTP proxy is not up"); return "\"""; } @@ -168,7 +168,7 @@ public class HomeHelper extends HelperBase { } private String renderApps(Collection apps) { - String website = _("Website"); + String website = _t("Website"); StringBuilder buf = new StringBuilder(1024); buf.append("
"); for (App app : apps) { @@ -205,11 +205,11 @@ public class HomeHelper extends HelperBase { private String renderConfig(Collection apps) { StringBuilder buf = new StringBuilder(1024); buf.append("\n"); for (App app : apps) { buf.append("\n"); } buf.append("" + ""); buf.append("
") - .append(_("Remove")) + .append(_t("Remove")) .append("") - .append(_("Name")) + .append(_t("Name")) .append("") - .append(_("URL")) + .append(_t("URL")) .append("
") - .append(_("Add")).append(":" + + .append(_t("Add")).append(":" + "
\n"); diff --git a/apps/routerconsole/java/src/net/i2p/router/web/JobQueueHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/JobQueueHelper.java index e6dc09a20..7bc28287f 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/JobQueueHelper.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/JobQueueHelper.java @@ -47,29 +47,29 @@ public class JobQueueHelper extends HelperBase { int numRunners = _context.jobQueue().getJobs(readyJobs, timedJobs, activeJobs, justFinishedJobs); StringBuilder buf = new StringBuilder(32*1024); - buf.append("

").append(_("I2P Job Queue")).append("


") - .append(_("Job runners")).append(": ").append(numRunners) + buf.append("

").append(_t("I2P Job Queue")).append("


") + .append(_t("Job runners")).append(": ").append(numRunners) .append("
\n"); long now = _context.clock().now(); - buf.append("
").append(_("Active jobs")).append(": ").append(activeJobs.size()).append("
    \n"); + buf.append("
    ").append(_t("Active jobs")).append(": ").append(activeJobs.size()).append("
      \n"); for (int i = 0; i < activeJobs.size(); i++) { Job j = activeJobs.get(i); - buf.append("
    1. (").append(_("started {0} ago", DataHelper.formatDuration2(now-j.getTiming().getStartAfter()))).append("): "); + buf.append("
    2. (").append(_t("started {0} ago", DataHelper.formatDuration2(now-j.getTiming().getStartAfter()))).append("): "); buf.append(j.toString()).append("
    3. \n"); } buf.append("
    \n"); - buf.append("
    ").append(_("Just finished jobs")).append(": ").append(justFinishedJobs.size()).append("
      \n"); + buf.append("
      ").append(_t("Just finished jobs")).append(": ").append(justFinishedJobs.size()).append("
        \n"); for (int i = 0; i < justFinishedJobs.size(); i++) { Job j = justFinishedJobs.get(i); - buf.append("
      1. (").append(_("finished {0} ago", DataHelper.formatDuration2(now-j.getTiming().getActualEnd()))).append("): "); + buf.append("
      2. (").append(_t("finished {0} ago", DataHelper.formatDuration2(now-j.getTiming().getActualEnd()))).append("): "); buf.append(j.toString()).append("
      3. \n"); } buf.append("
      \n"); - buf.append("
      ").append(_("Ready/waiting jobs")).append(": ").append(readyJobs.size()).append("
        \n"); + buf.append("
        ").append(_t("Ready/waiting jobs")).append(": ").append(readyJobs.size()).append("
          \n"); ObjectCounter counter = new ObjectCounter(); for (int i = 0; i < readyJobs.size(); i++) { Job j = readyJobs.get(i); @@ -86,7 +86,7 @@ public class JobQueueHelper extends HelperBase { out.write(buf.toString()); buf.setLength(0); - buf.append("
          ").append(_("Scheduled jobs")).append(": ").append(timedJobs.size()).append("
            \n"); + buf.append("
            ").append(_t("Scheduled jobs")).append(": ").append(timedJobs.size()).append("
              \n"); long prev = Long.MIN_VALUE; counter.clear(); for (int i = 0; i < timedJobs.size(); i++) { @@ -96,7 +96,7 @@ public class JobQueueHelper extends HelperBase { continue; long time = j.getTiming().getStartAfter() - now; // translators: {0} is a job name, {1} is a time, e.g. 6 min - buf.append("
            1. ").append(_("{0} will start in {1}", j.getName(), DataHelper.formatDuration2(time))); + buf.append("
            2. ").append(_t("{0} will start in {1}", j.getName(), DataHelper.formatDuration2(time))); // debug, don't bother translating if (time < 0) buf.append(" DELAYED"); @@ -110,7 +110,7 @@ public class JobQueueHelper extends HelperBase { out.write(buf.toString()); buf.setLength(0); - buf.append("
              ").append(_("Total Job Statistics")).append("\n"); + buf.append("
              ").append(_t("Total Job Statistics")).append("\n"); getJobStats(buf); out.write(buf.toString()); } @@ -121,7 +121,7 @@ public class JobQueueHelper extends HelperBase { if (names.size() < 4) return; buf.append("\n" + - "
              ").append(_("Job")).append("").append(_("Queued")).append(""); + "
              ").append(_t("Job")).append("").append(_t("Queued")).append(""); Collections.sort(names, new JobCountComparator(counter)); for (String name : names) { buf.append("
              ").append(name) @@ -138,12 +138,12 @@ public class JobQueueHelper extends HelperBase { */ private void getJobStats(StringBuilder buf) { buf.append("\n" + - "" + - "" + - "" + - "\n"); + "" + + "" + + "" + + "\n"); long totRuns = 0; long totDropped = 0; long totExecTime = 0; @@ -194,7 +194,7 @@ public class JobQueueHelper extends HelperBase { } buf.append(""); - buf.append(""); + buf.append(""); buf.append(""); buf.append(""); buf.append(""); diff --git a/apps/routerconsole/java/src/net/i2p/router/web/LogsHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/LogsHelper.java index e3845df9d..dbed0c82e 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/LogsHelper.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/LogsHelper.java @@ -46,7 +46,7 @@ public class LogsHelper extends HelperBase { */ public String getLogs() { String str = formatMessages(_context.logManager().getBuffer().getMostRecentMessages()); - return "

              " + _("File location") + ": " + _context.logManager().currentFile() + "

              " + str; + return "

              " + _t("File location") + ": " + _context.logManager().currentFile() + "

              " + str; } /** @@ -97,10 +97,10 @@ public class LogsHelper extends HelperBase { str = FileUtil.readTextFile(f.getAbsolutePath(), 250, false); } if (str == null) { - return "

              " + _("File not found") + ": " + f.getAbsolutePath() + "

              "; + return "

              " + _t("File not found") + ": " + f.getAbsolutePath() + "

              "; } else { str = str.replace("&", "&").replace("<", "<").replace(">", ">"); - return "

              " + _("File location") + ": " + f.getAbsolutePath() + "

              " + str + "
              "; + return "

              " + _t("File location") + ": " + f.getAbsolutePath() + "

              " + str + "
              "; } } @@ -115,7 +115,7 @@ public class LogsHelper extends HelperBase { /** formats in reverse order */ private String formatMessages(List msgs) { if (msgs.isEmpty()) - return "

              " + _("No log messages") + "

              "; + return "

              " + _t("No log messages") + "

              "; boolean colorize = _context.getBooleanPropertyDefaultTrue("routerconsole.logs.color"); StringBuilder buf = new StringBuilder(16*1024); buf.append("
                "); @@ -138,13 +138,13 @@ public class LogsHelper extends HelperBase { // Homeland Security Advisory System // http://www.dhs.gov/xinfoshare/programs/Copy_of_press_release_0046.shtm // but pink instead of yellow for WARN - if (msg.contains(_("CRIT"))) + if (msg.contains(_t("CRIT"))) color = "#cc0000"; - else if (msg.contains(_("ERROR"))) + else if (msg.contains(_t("ERROR"))) color = "#ff3300"; - else if (msg.contains(_("WARN"))) + else if (msg.contains(_t("WARN"))) color = "#ff00cc"; - else if (msg.contains(_("INFO"))) + else if (msg.contains(_t("INFO"))) color = "#000099"; else color = "#006600"; diff --git a/apps/routerconsole/java/src/net/i2p/router/web/Messages.java b/apps/routerconsole/java/src/net/i2p/router/web/Messages.java index c76f260e8..e138c0ffd 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/Messages.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/Messages.java @@ -24,7 +24,7 @@ public class Messages extends Translate { * The {0} will be replaced by the parameter. * Single quotes must be doubled, i.e. ' -> '' in the string. * @param o parameter, not translated. - * To tranlslate parameter also, use _("foo {0} bar", _("baz")) + * To tranlslate parameter also, use _t("foo {0} bar", _t("baz")) * Do not double the single quotes in the parameter. * Use autoboxing to call with ints, longs, floats, etc. */ diff --git a/apps/routerconsole/java/src/net/i2p/router/web/NetDbHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/NetDbHelper.java index 496f49ac1..808297fb5 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/NetDbHelper.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/NetDbHelper.java @@ -125,12 +125,12 @@ public class NetDbHelper extends HelperBase { // we are there if (span) buf.append(""); - buf.append(_(titles[i])); + buf.append(_t(titles[i])); } else { // we are not there, make a link if (span) buf.append(""); - buf.append("").append(_(titles[i])).append(""); + buf.append("").append(_t(titles[i])).append(""); } if (span) buf.append(" \n"); diff --git a/apps/routerconsole/java/src/net/i2p/router/web/NetDbRenderer.java b/apps/routerconsole/java/src/net/i2p/router/web/NetDbRenderer.java index 89b4a7000..e0340f68a 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/NetDbRenderer.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/NetDbRenderer.java @@ -102,14 +102,14 @@ public class NetDbRenderer { } } if (notFound) { - buf.append(_("Router")).append(' '); + buf.append(_t("Router")).append(' '); if (routerPrefix != null) buf.append(routerPrefix); else if (version != null) buf.append(version); else if (country != null) buf.append(country); - buf.append(' ').append(_("not found in network database")); + buf.append(' ').append(_t("not found in network database")); } } out.write(buf.toString()); @@ -153,12 +153,12 @@ public class NetDbRenderer { for (LeaseSet ls : leases) { Destination dest = ls.getDestination(); Hash key = dest.calculateHash(); - buf.append("").append(_("LeaseSet")).append(": ").append(key.toBase64()).append("\n"); + buf.append("").append(_t("LeaseSet")).append(": ").append(key.toBase64()).append("\n"); if (_context.clientManager().isLocal(dest)) { - buf.append(" (" + _("Local") + " "); + buf.append(" (" + _t("Local") + " "); if (! _context.clientManager().shouldPublishLeaseSet(key)) - buf.append(_("Unpublished") + ' '); - buf.append(_("Destination") + ' '); + buf.append(_t("Unpublished") + ' '); + buf.append(_t("Destination") + ' '); TunnelPoolSettings in = _context.tunnelManager().getInboundSettings(key); if (in != null && in.getDestinationNickname() != null) buf.append(in.getDestinationNickname()); @@ -170,10 +170,10 @@ public class NetDbRenderer { String host = _context.namingService().reverseLookup(dest); if (host == null) { buf.append("").append(_("Add to local addressbook")).append("
                \n"); + .append(dest.toBase64()).append("#add\">").append(_t("Add to local addressbook")).append("
                \n"); } } else { - buf.append(" (").append(_("Destination")).append(' '); + buf.append(" (").append(_t("Destination")).append(' '); String host = _context.namingService().reverseLookup(dest); if (host != null) { buf.append("").append(host).append(")
                \n"); @@ -182,14 +182,14 @@ public class NetDbRenderer { buf.append(dest.toBase64().substring(0, 6)).append(")
                \n" + "").append(b32).append("
                \n" + "").append(_("Add to local addressbook")).append("
                \n"); + .append(dest.toBase64()).append("#add\">").append(_t("Add to local addressbook")).append("
                \n"); } } long exp = ls.getLatestLeaseDate()-now; if (exp > 0) - buf.append(_("Expires in {0}", DataHelper.formatDuration2(exp))); + buf.append(_t("Expires in {0}", DataHelper.formatDuration2(exp))); else - buf.append(_("Expired {0} ago", DataHelper.formatDuration2(0-exp))); + buf.append(_t("Expired {0} ago", DataHelper.formatDuration2(0-exp))); buf.append("
                \n"); if (debug) { buf.append("RAP? " + ls.getReceivedAsPublished()); @@ -208,15 +208,15 @@ public class NetDbRenderer { } for (int i = 0; i < ls.getLeaseCount(); i++) { Lease lease = ls.getLease(i); - buf.append(_("Lease")).append(' ').append(i + 1).append(": ").append(_("Gateway")).append(' '); + buf.append(_t("Lease")).append(' ').append(i + 1).append(": ").append(_t("Gateway")).append(' '); buf.append(_context.commSystem().renderPeerHTML(lease.getGateway())); - buf.append(' ').append(_("Tunnel")).append(' ').append(lease.getTunnelId().getTunnelId()).append(' '); + buf.append(' ').append(_t("Tunnel")).append(' ').append(lease.getTunnelId().getTunnelId()).append(' '); if (debug) { long exl = lease.getEndDate().getTime() - now; if (exl > 0) - buf.append(_("Expires in {0}", DataHelper.formatDuration2(exl))); + buf.append(_t("Expires in {0}", DataHelper.formatDuration2(exl))); else - buf.append(_("Expired {0} ago", DataHelper.formatDuration2(0-exl))); + buf.append(_t("Expired {0} ago", DataHelper.formatDuration2(0-exl))); } buf.append("
                \n"); } @@ -277,7 +277,7 @@ public class NetDbRenderer { */ public void renderStatusHTML(Writer out, int mode) throws IOException { if (!_context.netDb().isInitialized()) { - out.write(_("Not initialized")); + out.write(_t("Not initialized")); out.flush(); return; } @@ -327,14 +327,14 @@ public class NetDbRenderer { // the summary table buf.append("
              ").append(_("Job")).append("").append(_("Runs")).append("").append(_("Dropped")).append("").append(_("Time")).append("").append(_("Avg")).append("") - .append(_("Max")).append("").append(_("Min")).append("").append(_("Pending")).append("").append(_("Avg")).append("") - .append(_("Max")).append("").append(_("Min")).append("
              ").append(_t("Job")).append("").append(_t("Runs")).append("").append(_t("Dropped")).append("").append(_t("Time")).append("").append(_t("Avg")).append("") + .append(_t("Max")).append("").append(_t("Min")).append("").append(_t("Pending")).append("").append(_t("Avg")).append("") + .append(_t("Max")).append("").append(_t("Min")).append("
              ").append(_("Summary")).append("").append(_t("Summary")).append("").append(totRuns).append("").append(totDropped).append("").append(DataHelper.formatDuration2(totExecTime)).append("
              ") - .append(_("Network Database Router Statistics")) + .append(_t("Network Database Router Statistics")) .append("
              "); // versions table List versionList = new ArrayList(versions.objects()); if (!versionList.isEmpty()) { Collections.sort(versionList, Collections.reverseOrder(new VersionComparator())); buf.append("\n"); - buf.append("\n"); + buf.append("\n"); for (String routerVersion : versionList) { int num = versions.count(routerVersion); String ver = DataHelper.stripHTML(routerVersion); @@ -349,11 +349,11 @@ public class NetDbRenderer { // transports table buf.append("
              " + _("Version") + "" + _("Count") + "
              " + _t("Version") + "" + _t("Count") + "
              \n"); - buf.append("\n"); + buf.append("\n"); for (int i = 0; i < TNAMES.length; i++) { int num = transportCount[i]; if (num > 0) { - buf.append("\n"); } } @@ -367,7 +367,7 @@ public class NetDbRenderer { if (!countryList.isEmpty()) { Collections.sort(countryList, new CountryComparator()); buf.append("
              " + _("Transports") + "" + _("Count") + "
              " + _t("Transports") + "" + _t("Count") + "
              ").append(_(TNAMES[i])); + buf.append("
              ").append(_t(TNAMES[i])); buf.append("").append(num).append("
              \n"); - buf.append("\n"); + buf.append("\n"); for (String country : countryList) { int num = countries.count(country); buf.append("\n"); if (full) { - buf.append("
              " + _("Country") + "" + _("Count") + "
              " + _t("Country") + "" + _t("Count") + "
              \"").append(country.toUpperCase(Locale.US)).append("\"");
              "); if (isUs) { - buf.append("" + _("Our info") + ": ").append(hash).append("
              \n"); + buf.append("" + _t("Our info") + ": ").append(hash).append("
              \n"); } else { - buf.append("" + _("Peer info for") + ": ").append(hash).append("\n"); + buf.append("" + _t("Peer info for") + ": ").append(hash).append("\n"); if (!full) { - buf.append("[").append(_("Full entry")).append("]"); + buf.append("[").append(_t("Full entry")).append("]"); } buf.append("
              \n"); } long age = _context.clock().now() - info.getPublished(); if (isUs && _context.router().isHidden()) { - buf.append("").append(_("Hidden")).append(", ").append(_("Updated")).append(": ") - .append(_("{0} ago", DataHelper.formatDuration2(age))).append("
              \n"); + buf.append("").append(_t("Hidden")).append(", ").append(_t("Updated")).append(": ") + .append(_t("{0} ago", DataHelper.formatDuration2(age))).append("
              \n"); } else if (age > 0) { - buf.append("").append(_("Published")).append(": ") - .append(_("{0} ago", DataHelper.formatDuration2(age))).append("
              \n"); + buf.append("").append(_t("Published")).append(": ") + .append(_t("{0} ago", DataHelper.formatDuration2(age))).append("
              \n"); } else { // shouldnt happen - buf.append("" + _("Published") + ": in ").append(DataHelper.formatDuration2(0-age)).append("???
              \n"); + buf.append("" + _t("Published") + ": in ").append(DataHelper.formatDuration2(0-age)).append("???
              \n"); } - buf.append("").append(_("Signing Key")).append(": ") + buf.append("").append(_t("Signing Key")).append(": ") .append(info.getIdentity().getSigningPublicKey().getType().toString()); - buf.append("
              \n" + _("Address(es)") + ": "); + buf.append("
              \n" + _t("Address(es)") + ": "); String country = _context.commSystem().getCountry(info.getIdentity().getHash()); if(country != null) { buf.append("\"").append(country.toUpperCase(Locale.US)).append('\"');").append(DataHelper.stripHTML(style)).append(": "); int cost = addr.getCost(); if (!((style.equals("SSU") && cost == 5) || (style.equals("NTCP") && cost == 10))) - buf.append('[').append(_("cost")).append('=').append("" + cost).append("] "); + buf.append('[').append(_t("cost")).append('=').append("" + cost).append("] "); Map p = addr.getOptionsMap(); for (Map.Entry e : p.entrySet()) { String name = (String) e.getKey(); String val = (String) e.getValue(); - buf.append('[').append(_(DataHelper.stripHTML(name))).append('=').append(DataHelper.stripHTML(val)).append("] "); + buf.append('[').append(_t(DataHelper.stripHTML(name))).append('=').append(DataHelper.stripHTML(val)).append("] "); } } buf.append("
              " + _("Stats") + ":
              "); + buf.append("
              " + _t("Stats") + ":
              "); Map p = info.getOptionsMap(); for (Map.Entry e : p.entrySet()) { String key = (String) e.getKey(); @@ -514,7 +514,7 @@ public class NetDbRenderer { } /** translate a string */ - private String _(String s) { + private String _t(String s) { return Messages.getString(s, _context); } @@ -525,17 +525,17 @@ public class NetDbRenderer { /** * translate a string with a parameter - * This is a lot more expensive than _(s), so use sparingly. + * This is a lot more expensive than _t(s), so use sparingly. * * @param s string to be translated containing {0} * The {0} will be replaced by the parameter. * Single quotes must be doubled, i.e. ' -> '' in the string. * @param o parameter, not translated. - * To tranlslate parameter also, use _("foo {0} bar", _("baz")) + * To tranlslate parameter also, use _t("foo {0} bar", _t("baz")) * Do not double the single quotes in the parameter. * Use autoboxing to call with ints, longs, floats, etc. */ - private String _(String s, Object o) { + private String _t(String s, Object o) { return Messages.getString(s, o, _context); } } diff --git a/apps/routerconsole/java/src/net/i2p/router/web/ProfileOrganizerRenderer.java b/apps/routerconsole/java/src/net/i2p/router/web/ProfileOrganizerRenderer.java index ef70b170a..2cb7e311f 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/ProfileOrganizerRenderer.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/ProfileOrganizerRenderer.java @@ -75,7 +75,7 @@ class ProfileOrganizerRenderer { //// if (mode < 2) { - //buf.append("

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

              \n

              "); + //buf.append("

              ").append(_t("Peer Profiles")).append("

              \n

              "); buf.append(ngettext("Showing 1 recent profile.", "Showing {0} recent profiles.", order.size())).append('\n'); if (older > 0) buf.append(ngettext("Hiding 1 older profile.", "Hiding {0} older profiles.", older)).append('\n'); @@ -84,12 +84,12 @@ class ProfileOrganizerRenderer { buf.append("

              "); buf.append(""); buf.append(""); - buf.append(""); - buf.append(""); - buf.append(""); - buf.append(""); - buf.append(""); - buf.append(""); + buf.append(""); + buf.append(""); + buf.append(""); + buf.append(""); + buf.append(""); + buf.append(""); buf.append(""); buf.append(""); int prevTier = 1; @@ -127,12 +127,12 @@ class ProfileOrganizerRenderer { buf.append(""); //buf.append("\n"); buf.append(""); // let's not build the whole page in memory (~500 bytes per peer) @@ -193,26 +193,26 @@ class ProfileOrganizerRenderer { //// } else { - //buf.append("

              ").append(_("Floodfill and Integrated Peers")) + //buf.append("

              ").append(_t("Floodfill and Integrated Peers")) // .append(" (").append(integratedPeers.size()).append(")

              \n"); buf.append("
              ").append(_("Peer")).append("").append(_("Groups (Caps)")).append("").append(_("Speed")).append("").append(_("Capacity")).append("").append(_("Integration")).append("").append(_("Status")).append("").append(_t("Peer")).append("").append(_t("Groups (Caps)")).append("").append(_t("Speed")).append("").append(_t("Capacity")).append("").append(_t("Integration")).append("").append(_t("Status")).append(" 
              "); switch (tier) { - case 1: buf.append(_("Fast, High Capacity")); break; - case 2: buf.append(_("High Capacity")); break; - case 3: buf.append(_("Standard")); break; - default: buf.append(_("Failing")); break; + case 1: buf.append(_t("Fast, High Capacity")); break; + case 2: buf.append(_t("High Capacity")); break; + case 3: buf.append(_t("Standard")); break; + default: buf.append(_t("Failing")); break; } - if (isIntegrated) buf.append(", ").append(_("Integrated")); + if (isIntegrated) buf.append(", ").append(_t("Integrated")); RouterInfo info = _context.netDb().lookupRouterInfoLocally(peer); if (info != null) { // prevent HTML injection in the caps and version @@ -163,9 +163,9 @@ class ProfileOrganizerRenderer { } buf.append("").append(num(prof.getIntegrationValue())); buf.append(""); - if (_context.banlist().isBanlisted(peer)) buf.append(_("Banned")); - if (prof.getIsFailing()) buf.append(' ').append(_("Failing")); - if (_context.commSystem().wasUnreachable(peer)) buf.append(' ').append(_("Unreachable")); + if (_context.banlist().isBanlisted(peer)) buf.append(_t("Banned")); + if (prof.getIsFailing()) buf.append(' ').append(_t("Failing")); + if (_context.commSystem().wasUnreachable(peer)) buf.append(' ').append(_t("Unreachable")); RateAverages ra = RateAverages.getTemp(); Rate failed = prof.getTunnelHistory().getFailedRate().getRate(30*60*1000); long fails = failed.computeAverages(ra, false).getTotalEventCount(); @@ -173,13 +173,13 @@ class ProfileOrganizerRenderer { Rate accepted = prof.getTunnelCreateResponseTime().getRate(30*60*1000); long total = fails + accepted.computeAverages(ra, false).getTotalEventCount(); if (total / fails <= 10) // hide if < 10% - buf.append(' ').append(fails).append('/').append(total).append(' ').append(_("Test Fails")); + buf.append(' ').append(fails).append('/').append(total).append(' ').append(_t("Test Fails")); } buf.append(" ").append(_("profile")).append(""); + // .append(peer.toBase64().substring(0,6)).append("\">").append(_t("profile")).append(""); buf.append("").append(_("profile")).append(""); + .append(peer.toBase64()).append("\">").append(_t("profile")).append(""); buf.append(" +-
              "); buf.append(""); - buf.append(""); - buf.append(""); - buf.append(""); - buf.append(""); - buf.append(""); - buf.append(""); - buf.append(""); - buf.append(""); - buf.append(""); - buf.append(""); - buf.append(""); - buf.append(""); - buf.append(""); - buf.append(""); - buf.append(""); - buf.append(""); + buf.append(""); + buf.append(""); + buf.append(""); + buf.append(""); + buf.append(""); + buf.append(""); + buf.append(""); + buf.append(""); + buf.append(""); + buf.append(""); + buf.append(""); + buf.append(""); + buf.append(""); + buf.append(""); + buf.append(""); + buf.append(""); buf.append(""); RateAverages ra = RateAverages.getTemp(); for (PeerProfile prof : order) { @@ -244,7 +244,7 @@ class ProfileOrganizerRenderer { buf.append(""); } else { for (int i = 0; i < 6; i++) - buf.append("\n"); } @@ -256,20 +256,20 @@ class ProfileOrganizerRenderer { } if (mode < 2) { - buf.append("

              ").append(_("Thresholds")).append("

              "); - buf.append("

              ").append(_("Speed")).append(": ").append(num(_organizer.getSpeedThreshold())) - .append(" (").append(fast).append(' ').append(_("fast peers")).append(")
              "); - buf.append("").append(_("Capacity")).append(": ").append(num(_organizer.getCapacityThreshold())) - .append(" (").append(reliable).append(' ').append(_("high capacity peers")).append(")
              "); - buf.append("").append(_("Integration")).append(": ").append(num(_organizer.getIntegrationThreshold())) - .append(" (").append(integrated).append(' ').append(_(" well integrated peers")).append(")

              "); - buf.append("

              ").append(_("Definitions")).append("

                "); - buf.append("
              • ").append(_("groups")).append(": ").append(_("as determined by the profile organizer")).append("
              • "); - buf.append("
              • ").append(_("caps")).append(": ").append(_("capabilities in the netDb, not used to determine profiles")).append("
              • "); - buf.append("
              • ").append(_("speed")).append(": ").append(_("peak throughput (bytes per second) over a 1 minute period that the peer has sustained in a single tunnel")).append("
              • "); - buf.append("
              • ").append(_("capacity")).append(": ").append(_("how many tunnels can we ask them to join in an hour?")).append("
              • "); - buf.append("
              • ").append(_("integration")).append(": ").append(_("how many new peers have they told us about lately?")).append("
              • "); - buf.append("
              • ").append(_("status")).append(": ").append(_("is the peer banned, or unreachable, or failing tunnel tests?")).append("
              • "); + buf.append("

                ").append(_t("Thresholds")).append("

                "); + buf.append("

                ").append(_t("Speed")).append(": ").append(num(_organizer.getSpeedThreshold())) + .append(" (").append(fast).append(' ').append(_t("fast peers")).append(")
                "); + buf.append("").append(_t("Capacity")).append(": ").append(num(_organizer.getCapacityThreshold())) + .append(" (").append(reliable).append(' ').append(_t("high capacity peers")).append(")
                "); + buf.append("").append(_t("Integration")).append(": ").append(num(_organizer.getIntegrationThreshold())) + .append(" (").append(integrated).append(' ').append(_t(" well integrated peers")).append(")

                "); + buf.append("

                ").append(_t("Definitions")).append("

                  "); + buf.append("
                • ").append(_t("groups")).append(": ").append(_t("as determined by the profile organizer")).append("
                • "); + buf.append("
                • ").append(_t("caps")).append(": ").append(_t("capabilities in the netDb, not used to determine profiles")).append("
                • "); + buf.append("
                • ").append(_t("speed")).append(": ").append(_t("peak throughput (bytes per second) over a 1 minute period that the peer has sustained in a single tunnel")).append("
                • "); + buf.append("
                • ").append(_t("capacity")).append(": ").append(_t("how many tunnels can we ask them to join in an hour?")).append("
                • "); + buf.append("
                • ").append(_t("integration")).append(": ").append(_t("how many new peers have they told us about lately?")).append("
                • "); + buf.append("
                • ").append(_t("status")).append(": ").append(_t("is the peer banned, or unreachable, or failing tunnel tests?")).append("
                • "); buf.append("
                "); //// @@ -336,13 +336,13 @@ class ProfileOrganizerRenderer { private String avg (PeerProfile prof, long rate, RateAverages ra) { RateStat rs = prof.getDbResponseTime(); if (rs == null) - return _(NA); + return _t(NA); Rate r = rs.getRate(rate); if (r == null) - return _(NA); + return _t(NA); r.computeAverages(ra, false); if (ra.getTotalEventCount() == 0) - return _(NA); + return _t(NA); return DataHelper.formatDuration2(Math.round(ra.getAverage())); } @@ -363,12 +363,12 @@ class ProfileOrganizerRenderer { /** @since 0.9.21 */ private String formatInterval(long now, long then) { if (then <= 0) - return _(NA); + return _t(NA); return DataHelper.formatDuration2(now - then); } /** translate a string */ - private String _(String s) { + private String _t(String s) { return Messages.getString(s, _context); } diff --git a/apps/routerconsole/java/src/net/i2p/router/web/ProfilesHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/ProfilesHelper.java index 6645558d5..3236d1f12 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/ProfilesHelper.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/ProfilesHelper.java @@ -104,12 +104,12 @@ public class ProfilesHelper extends HelperBase { // we are there if (span) buf.append(""); - buf.append(_(titles[i])); + buf.append(_t(titles[i])); } else { // we are not there, make a link if (span) buf.append(""); - buf.append("").append(_(titles[i])).append(""); + buf.append("").append(_t(titles[i])).append(""); } if (span) buf.append(" \n"); diff --git a/apps/routerconsole/java/src/net/i2p/router/web/SearchHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/SearchHelper.java index 3ee03289b..e04809d6f 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/SearchHelper.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/SearchHelper.java @@ -71,7 +71,7 @@ public class SearchHelper extends HelperBase { } } StringBuilder buf = new StringBuilder(1024); - buf.append(""); for (String name : _engines.keySet()) { buf.append("\n"); + buf.append(_t(group)).append("\n"); // let's just do the groups //Set stats = (Set)entry.getValue(); //for (Iterator statIter = stats.iterator(); statIter.hasNext(); ) { @@ -54,14 +54,14 @@ public class StatsGenerator { //out.write(buf.toString()); //buf.setLength(0); } - buf.append(" "); + buf.append(" "); buf.append(""); - buf.append(_("Statistics gathered during this router's uptime")).append(" ("); + buf.append(_t("Statistics gathered during this router's uptime")).append(" ("); long uptime = _context.router().getUptime(); buf.append(DataHelper.formatDuration2(uptime)); - buf.append("). ").append( _("The data gathered is quantized over a 1 minute period, so should just be used as an estimate.")); - buf.append(' ').append( _("These statistics are primarily used for development and debugging.")); + buf.append("). ").append( _t("The data gathered is quantized over a 1 minute period, so should just be used as an estimate.")); + buf.append(' ').append( _t("These statistics are primarily used for development and debugging.")); out.write(buf.toString()); buf.setLength(0); @@ -72,7 +72,7 @@ public class StatsGenerator { buf.append("

                "); - buf.append(_(group)); + buf.append(_t(group)); buf.append("

                "); buf.append("
                  "); out.write(buf.toString()); @@ -102,7 +102,7 @@ public class StatsGenerator { buf.append(freq.getDescription()); buf.append("
                  "); if (freq.getEventCount() <= 0) { - buf.append(_("No lifetime events")).append("
                  \n"); + buf.append(_t("No lifetime events")).append("
                  \n"); return; } long uptime = _context.router().getUptime(); @@ -113,15 +113,15 @@ public class StatsGenerator { if (periods[i] > uptime) break; buf.append("
                • "); - renderPeriod(buf, periods[i], _("frequency")); + renderPeriod(buf, periods[i], _t("frequency")); Frequency curFreq = freq.getFrequency(periods[i]); buf.append(DataHelper.formatDuration2(Math.round(curFreq.getAverageInterval()))); buf.append("; "); - buf.append(_("Rolling average events per period")); + buf.append(_t("Rolling average events per period")); buf.append(": "); buf.append(num(curFreq.getAverageEventsPerPeriod())); buf.append("; "); - buf.append(_("Highest events per period")); + buf.append(_t("Highest events per period")); buf.append(": "); buf.append(num(curFreq.getMaxAverageEventsPerPeriod())); buf.append("; "); @@ -132,12 +132,12 @@ public class StatsGenerator { //} //buf.append(" avg interval between updates: (").append(num(curFreq.getAverageInterval())).append("ms, min "); //buf.append(num(curFreq.getMinAverageInterval())).append("ms)"); - buf.append(_("Lifetime average events per period")).append(": "); + buf.append(_t("Lifetime average events per period")).append(": "); buf.append(num(curFreq.getStrictAverageEventsPerPeriod())); buf.append("
                • \n"); } // Display the strict average - buf.append("
                • ").append(_("Lifetime average frequency")).append(": "); + buf.append("
                • ").append(_t("Lifetime average frequency")).append(": "); buf.append(DataHelper.formatDuration2(freq.getFrequency())); buf.append(" ("); buf.append(ngettext("1 event", "{0} events", (int) freq.getEventCount())); @@ -153,7 +153,7 @@ public class StatsGenerator { buf.append("
                  "); } if (rate.getLifetimeEventCount() <= 0) { - buf.append(_("No lifetime events")).append("
                  \n"); + buf.append(_t("No lifetime events")).append("
                  \n"); return; } long now = _context.clock().now(); @@ -165,12 +165,12 @@ public class StatsGenerator { if (curRate.getLastCoalesceDate() <= curRate.getCreationDate()) break; buf.append("
                • "); - renderPeriod(buf, periods[i], _("rate")); + renderPeriod(buf, periods[i], _t("rate")); if (curRate.getLastEventCount() > 0) { - buf.append(_("Average")).append(": "); + buf.append(_t("Average")).append(": "); buf.append(num(curRate.getAverageValue())); buf.append("; "); - buf.append(_("Highest average")); + buf.append(_t("Highest average")); buf.append(": "); buf.append(num(curRate.getExtremeAverageValue())); buf.append("; "); @@ -199,16 +199,16 @@ public class StatsGenerator { buf.append(ngettext("There was 1 event in this period.", "There were {0} events in this period.", (int)curRate.getLastEventCount())); buf.append(' '); - buf.append(_("The period ended {0} ago.", DataHelper.formatDuration2(now - curRate.getLastCoalesceDate()))); + buf.append(_t("The period ended {0} ago.", DataHelper.formatDuration2(now - curRate.getLastCoalesceDate()))); } else { - buf.append(" ").append(_("No events")).append(" "); + buf.append(" ").append(_t("No events")).append(" "); } long numPeriods = curRate.getLifetimePeriods(); if (numPeriods > 0) { double avgFrequency = curRate.getLifetimeEventCount() / (double)numPeriods; - buf.append(" (").append(_("Average event count")).append(": "); + buf.append(" (").append(_t("Average event count")).append(": "); buf.append(num(avgFrequency)); - buf.append("; ").append(_("Events in peak period")).append(": "); + buf.append("; ").append(_t("Events in peak period")).append(": "); // This isn't really the highest event count, but the event count during the period with the highest total value. buf.append(curRate.getExtremeEventCount()); buf.append(")"); @@ -216,19 +216,19 @@ public class StatsGenerator { if (curRate.getSummaryListener() != null) { buf.append(" ").append(_("Graph Data")).append(" - "); + buf.append("\">").append(_t("Graph Data")).append(" - "); buf.append(" ").append(_("Graph Event Count")).append(""); + buf.append("&showEvents=true\">").append(_t("Graph Event Count")).append(""); // This can really blow up your browser if you click on it //buf.append(" - ").append(_("Export Data as XML")).append(""); + //buf.append("&format=xml\">").append(_t("Export Data as XML")).append(""); } buf.append("
                • \n"); } // Display the strict average - buf.append("
                • ").append(_("Lifetime average value")).append(": "); + buf.append("
                • ").append(_t("Lifetime average value")).append(": "); buf.append(num(rate.getLifetimeAverageValue())); buf.append(" ("); buf.append(ngettext("1 event", "{0} events", (int) rate.getLifetimeEventCount())); @@ -258,19 +258,19 @@ public class StatsGenerator { */ private class AlphaComparator implements Comparator { public int compare(String lhs, String rhs) { - String lname = _(lhs); - String rname = _(rhs); + String lname = _t(lhs); + String rname = _t(rhs); return Collator.getInstance().compare(lname, rname); } } /** translate a string */ - private String _(String s) { + private String _t(String s) { return Messages.getString(s, _context); } /** translate a string */ - private String _(String s, Object o) { + private String _t(String s, Object o) { return Messages.getString(s, o, _context); } diff --git a/apps/routerconsole/java/src/net/i2p/router/web/SummaryBarRenderer.java b/apps/routerconsole/java/src/net/i2p/router/web/SummaryBarRenderer.java index 9f79dbfc7..29223c7bf 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/SummaryBarRenderer.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/SummaryBarRenderer.java @@ -124,9 +124,9 @@ public class SummaryBarRenderer { public String renderHelpAndFAQHTML() { StringBuilder buf = new StringBuilder(512); buf.append("

                  ") - .append(_("Help & FAQ")) + .append(_t("Help & FAQ")) .append("

                  "); return buf.toString(); } @@ -134,23 +134,23 @@ public class SummaryBarRenderer { public String renderI2PServicesHTML() { StringBuilder buf = new StringBuilder(512); buf.append("

                  ") - .append(_("I2P Services")) + .append(_t("I2P Services")) .append("

                  \n" + "
              ").append(_("Peer")).append("").append(_("Caps")).append("").append(_("Integ. Value")).append("").append(_("Last Heard About")).append("").append(_("Last Heard From")).append("").append(_("Last Good Send")).append("").append(_("Last Bad Send")).append("").append(_("10m Resp. Time")).append("").append(_("1h Resp. Time")).append("").append(_("1d Resp. Time")).append("").append(_("Last Good Lookup")).append("").append(_("Last Bad Lookup")).append("").append(_("Last Good Store")).append("").append(_("Last Bad Store")).append("").append(_("1h Fail Rate")).append("").append(_("1d Fail Rate")).append("").append(_t("Peer")).append("").append(_t("Caps")).append("").append(_t("Integ. Value")).append("").append(_t("Last Heard About")).append("").append(_t("Last Heard From")).append("").append(_t("Last Good Send")).append("").append(_t("Last Bad Send")).append("").append(_t("10m Resp. Time")).append("").append(_t("1h Resp. Time")).append("").append(_t("1d Resp. Time")).append("").append(_t("Last Good Lookup")).append("").append(_t("Last Bad Lookup")).append("").append(_t("Last Good Store")).append("").append(_t("Last Bad Store")).append("").append(_t("1h Fail Rate")).append("").append(_t("1d Fail Rate")).append("
              ").append(davg(dbh, 24*60*60*1000l, ra)).append("").append(_(NA)); + buf.append("").append(_t(NA)); } buf.append("
              " + "") - .append(nbsp(_("Email"))) + .append(nbsp(_t("Email"))) .append("\n" + "") - .append(nbsp(_("Torrents"))) + .append(nbsp(_t("Torrents"))) .append("\n" + "") - .append(nbsp(_("Website"))) + .append(nbsp(_t("Website"))) .append("\n") .append(NavHelper.getClientAppLinks(_context)) @@ -172,73 +172,73 @@ public class SummaryBarRenderer { public String renderI2PInternalsHTML() { StringBuilder buf = new StringBuilder(512); buf.append("

              ") - .append(_("I2P Internals")) + .append(_t("I2P Internals")) .append("


              \n" + "
              \n" + "") - .append(nbsp(_("Tunnels"))) + .append(nbsp(_t("Tunnels"))) .append("\n" + "") - .append(nbsp(_("Peers"))) + .append(nbsp(_t("Peers"))) .append("\n" + "") - .append(nbsp(_("Profiles"))) + .append(nbsp(_t("Profiles"))) .append("\n" + "") - .append(nbsp(_("NetDB"))) + .append(nbsp(_t("NetDB"))) .append("\n" + "") - .append(nbsp(_("Logs"))) + .append(nbsp(_t("Logs"))) .append("\n"); // "") - // .append(_("Jobs")) + // .append(_t("Jobs")) // .append("\n" + if (!StatSummarizer.isDisabled()) { buf.append("") - .append(nbsp(_("Graphs"))) + .append(nbsp(_t("Graphs"))) .append("\n"); } buf.append("") - .append(nbsp(_("Stats"))) + .append(nbsp(_t("Stats"))) .append("\n" + "") - .append(nbsp(_("Addressbook"))) + .append(nbsp(_t("Addressbook"))) .append("\n" + "") - .append(nbsp(_("Hidden Services Manager"))) + .append(nbsp(_t("Hidden Services Manager"))) .append("\n"); if (_context.getBooleanProperty(HelperBase.PROP_ADVANCED)) @@ -254,44 +254,44 @@ public class SummaryBarRenderer { if (_helper == null) return ""; StringBuilder buf = new StringBuilder(512); buf.append("

              ") - .append(_("General")) + .append(_t("General")) .append("


              \n" + "" + "" + "\n" + "" + "" + "\n" + "" + "" + "
              ") - .append(_("Local Identity")) + .append(_t("Local Identity")) .append(":" + "") - .append(_("show")) + .append(_t("show")) .append("
              ") - .append(_("Version")) + .append(_t("Version")) .append(":") .append(_helper.getVersion()) .append("
              ") - .append(_("Uptime")) + .append(_t("Uptime")) .append(":") .append(_helper.getUptime()) @@ -304,20 +304,20 @@ public class SummaryBarRenderer { StringBuilder buf = new StringBuilder(512); buf.append("" + "" + "" + "\n" + "" + "" + ""); if (sessionObject.folder.getPages() > 1 && i > 30) { @@ -2270,27 +2270,27 @@ public class WebMail extends HttpServlet out.println("\n"); } out.println( "
              ") - .append(_("Version")) + .append(_t("Version")) .append(":") .append(_helper.getVersion()) .append("
              ") - .append(_("Uptime")) + .append(_t("Uptime")) .append(":") .append(_helper.getUptime()) @@ -329,9 +329,9 @@ public class SummaryBarRenderer { if (_helper == null) return ""; StringBuilder buf = new StringBuilder(512); buf.append("

              ") - .append(_("Network")) + .append(_t("Network")) .append(": ") .append(_helper.getReachability()) .append("

              \n"); @@ -340,9 +340,9 @@ public class SummaryBarRenderer { if ("ru".equals(Messages.getLanguage(_context))) buf.append("-ru"); buf.append("\" target=\"_top\" title=\"") - .append(_("See more information on the wiki")) + .append(_t("See more information on the wiki")) .append("\">") - .append(_("Warning: ECDSA is not available. Update your Java or OS")) + .append(_t("Warning: ECDSA is not available. Update your Java or OS")) .append("\n"); } return buf.toString(); @@ -354,9 +354,9 @@ public class SummaryBarRenderer { if ("".equals(updateStatus)) return ""; StringBuilder buf = new StringBuilder(512); buf.append("

              ") - .append(_("I2P Update")) + .append(_t("I2P Update")) .append("


              \n"); buf.append(updateStatus); return buf.toString(); @@ -373,18 +373,18 @@ public class SummaryBarRenderer { if (_helper == null) return ""; StringBuilder buf = new StringBuilder(512); buf.append("

              ") - .append(_("Peers")) + .append(_t("Peers")) .append("


              \n" + "\n" + "" + "\n" + "" + "\n" + "" + "\n" + "" + "\n" + "" + "\n" + @@ -443,9 +443,9 @@ public class SummaryBarRenderer { if (_helper == null) return ""; StringBuilder buf = new StringBuilder(512); buf.append("

              ") - .append(_("Bandwidth in/out")) + .append(_t("Bandwidth in/out")) .append("


              " + "
              ") - .append(_("Active")) + .append(_t("Active")) .append(":"); int active = _helper.getActivePeers(); buf.append(active) @@ -393,37 +393,37 @@ public class SummaryBarRenderer { .append("
              ") - .append(_("Fast")) + .append(_t("Fast")) .append(":") .append(_helper.getFastPeers()) .append("
              ") - .append(_("High capacity")) + .append(_t("High capacity")) .append(":") .append(_helper.getHighCapacityPeers()) .append("
              ") - .append(_("Integrated")) + .append(_t("Integrated")) .append(":") .append(_helper.getWellIntegratedPeers()) .append("
              ") - .append(_("Known")) + .append(_t("Known")) .append(":") .append(_helper.getAllPeers()) .append("
              \n" + @@ -465,14 +465,14 @@ public class SummaryBarRenderer { if (_context.router().getUptime() > 2*60*1000) { buf.append("\n"); } buf.append("\n
              ") - .append(_("Total")) + .append(_t("Total")) .append(":") .append(_helper.getLifetimeKBps()) .append("Bps
              ") - .append(_("Used")) + .append(_t("Used")) .append(":") .append(_helper.getInboundTransferred()) .append(SummaryHelper.THINSP) @@ -487,44 +487,44 @@ public class SummaryBarRenderer { if (_helper == null) return ""; StringBuilder buf = new StringBuilder(512); buf.append("

              ") - .append(_("Tunnels")) + .append(_t("Tunnels")) .append("


              " + "\n" + "" + "\n" + "" + "\n" + "" + "\n" + "" + "\n" + @@ -537,46 +537,46 @@ public class SummaryBarRenderer { if (_helper == null) return ""; StringBuilder buf = new StringBuilder(512); buf.append("

              ") - .append(_("Congestion")) + .append(_t("Congestion")) .append("


              " + "
              ") - .append(_("Exploratory")) + .append(_t("Exploratory")) .append(":") .append(_helper.getInboundTunnels() + _helper.getOutboundTunnels()) .append("
              ") - .append(_("Client")) + .append(_t("Client")) .append(":") .append(_helper.getInboundClientTunnels() + _helper.getOutboundClientTunnels()) .append("
              ") - .append(_("Participating")) + .append(_t("Participating")) .append(":") .append(_helper.getParticipatingTunnels()) .append("
              ") - .append(_("Share ratio")) + .append(_t("Share ratio")) .append(":") .append(_helper.getShareRatio()) .append("
              \n" + "" + "\n" + "" + "\n"); if (!_context.getBooleanPropertyDefaultTrue("router.disableTunnelTesting")) { buf.append("" + "\n"); } buf.append("" + "\n" + @@ -589,7 +589,7 @@ public class SummaryBarRenderer { if (_helper == null) return ""; StringBuilder buf = new StringBuilder(50); buf.append("

              ") - .append(_(_helper.getTunnelStatus())) + .append(_t(_helper.getTunnelStatus())) .append("

              \n"); return buf.toString(); } @@ -612,7 +612,7 @@ public class SummaryBarRenderer { // Set up title and pre-headings stuff. //buf.append("

              ") buf.append("

              ") - .append(_("News & Updates")) + .append(_t("News & Updates")) .append("


              \n"); // Get news content. List entries = Collections.emptyList(); @@ -647,11 +647,11 @@ public class SummaryBarRenderer { } buf.append("\n"); //buf.append("") - // .append(_("Show all news")) + // .append(_t("Show all news")) // .append("\n"); } else { buf.append("
              ") - .append(_("none")) + .append(_t("none")) .append("
              "); } // Add post-headings stuff. @@ -661,7 +661,7 @@ public class SummaryBarRenderer { } /** translate a string */ - private String _(String s) { + private String _t(String s) { return Messages.getString(s, _context); } diff --git a/apps/routerconsole/java/src/net/i2p/router/web/SummaryHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/SummaryHelper.java index 1cd207e45..88a0e43d9 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/SummaryHelper.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/SummaryHelper.java @@ -114,7 +114,7 @@ public class SummaryHelper extends HelperBase { long diff = Math.abs(ms); if (diff < 3000) return ""; - return " (" + DataHelper.formatDuration2(diff) + " " + _("skew") + ")"; + return " (" + DataHelper.formatDuration2(diff) + " " + _t("skew") + ")"; } **/ @@ -140,19 +140,19 @@ public class SummaryHelper extends HelperBase { return "VM Comm System"; if (_context.router().getUptime() > 60*1000 && (!_context.router().gracefulShutdownInProgress()) && !_context.clientManager().isAlive()) - return _("ERR-Client Manager I2CP Error - check logs"); // not a router problem but the user should know + return _t("ERR-Client Manager I2CP Error - check logs"); // not a router problem but the user should know // Warn based on actual skew from peers, not update status, so if we successfully offset // the clock, we don't complain. //if (!_context.clock().getUpdatedSuccessfully()) long skew = _context.commSystem().getFramedAveragePeerClockSkew(33); // Display the actual skew, not the offset if (Math.abs(skew) > 30*1000) - return _("ERR-Clock Skew of {0}", DataHelper.formatDuration2(Math.abs(skew))); + return _t("ERR-Clock Skew of {0}", DataHelper.formatDuration2(Math.abs(skew))); if (_context.router().isHidden()) - return _("Hidden"); + return _t("Hidden"); RouterInfo routerInfo = _context.router().getRouterInfo(); if (routerInfo == null) - return _("Testing"); + return _t("Testing"); Status status = _context.commSystem().getStatus(); switch (status) { @@ -164,37 +164,37 @@ public class SummaryHelper extends HelperBase { case IPV4_SNAT_IPV6_OK: RouterAddress ra = routerInfo.getTargetAddress("NTCP"); if (ra == null) - return _(status.toStatusString()); + return _t(status.toStatusString()); byte[] ip = ra.getIP(); if (ip == null) - return _("ERR-Unresolved TCP Address"); + return _t("ERR-Unresolved TCP Address"); // TODO set IPv6 arg based on configuration? if (TransportUtil.isPubliclyRoutable(ip, true)) - return _(status.toStatusString()); - return _("ERR-Private TCP Address"); + return _t(status.toStatusString()); + return _t("ERR-Private TCP Address"); case IPV4_SNAT_IPV6_UNKNOWN: case DIFFERENT: - return _("ERR-SymmetricNAT"); + return _t("ERR-SymmetricNAT"); case REJECT_UNSOLICITED: case IPV4_DISABLED_IPV6_FIREWALLED: if (routerInfo.getTargetAddress("NTCP") != null) - return _("WARN-Firewalled with Inbound TCP Enabled"); + return _t("WARN-Firewalled with Inbound TCP Enabled"); // fall through... case IPV4_FIREWALLED_IPV6_OK: case IPV4_FIREWALLED_IPV6_UNKNOWN: if (((FloodfillNetworkDatabaseFacade)_context.netDb()).floodfillEnabled()) - return _("WARN-Firewalled and Floodfill"); + return _t("WARN-Firewalled and Floodfill"); //if (_context.router().getRouterInfo().getCapabilities().indexOf('O') >= 0) - // return _("WARN-Firewalled and Fast"); - return _(status.toStatusString()); + // return _t("WARN-Firewalled and Fast"); + return _t(status.toStatusString()); case DISCONNECTED: - return _("Disconnected - check network cable"); + return _t("Disconnected - check network cable"); case HOSED: - return _("ERR-UDP Port In Use - Set i2np.udp.internalPort=xxxx in advanced config and restart"); + return _t("ERR-UDP Port In Use - Set i2np.udp.internalPort=xxxx in advanced config and restart"); case UNKNOWN: case IPV4_UNKNOWN_IPV6_FIREWALLED: @@ -203,14 +203,14 @@ public class SummaryHelper extends HelperBase { ra = routerInfo.getTargetAddress("SSU"); if (ra == null && _context.router().getUptime() > 5*60*1000) { if (getActivePeers() <= 0) - return _("ERR-No Active Peers, Check Network Connection and Firewall"); + return _t("ERR-No Active Peers, Check Network Connection and Firewall"); else if (_context.getProperty(ConfigNetHelper.PROP_I2NP_NTCP_HOSTNAME) == null || _context.getProperty(ConfigNetHelper.PROP_I2NP_NTCP_PORT) == null) - return _("ERR-UDP Disabled and Inbound TCP host/port not set"); + return _t("ERR-UDP Disabled and Inbound TCP host/port not set"); else - return _("WARN-Firewalled with UDP Disabled"); + return _t("WARN-Firewalled with UDP Disabled"); } - return _(status.toStatusString()); + return _t(status.toStatusString()); } } @@ -434,8 +434,8 @@ public class SummaryHelper extends HelperBase { StringBuilder buf = new StringBuilder(512); buf.append("

              ").append(_("Local Tunnels")) + .append(_t("Add/remove/edit & control your client and server tunnels")) + .append("\">").append(_t("Local Tunnels")) .append("


              "); if (!clients.isEmpty()) { Collections.sort(clients, new AlphaComparator()); @@ -447,11 +447,11 @@ public class SummaryHelper extends HelperBase { buf.append("

              \n"); + buf.append("\n"); } else { // green light - buf.append("\n"); + buf.append("\n"); } } else { // yellow light - buf.append("\n"); + buf.append("\n"); } } buf.append("
              ") - .append(_("Job lag")) + .append(_t("Job lag")) .append(":") .append(_helper.getJobLag()) .append("
              ") - .append(_("Message delay")) + .append(_t("Message delay")) .append(":") .append(_helper.getMessageDelay()) .append("
              ") - .append(_("Tunnel lag")) + .append(_t("Tunnel lag")) .append(":") .append(_helper.getTunnelLag()) .append("
              ") - .append(_("Backlog")) + .append(_t("Backlog")) .append(":") .append(_helper.getInboundBacklog()) .append("
              \"Server\""); + buf.append("server.png\" alt=\"Server\" title=\"").append(_t("Hidden Service")).append("\">"); else - buf.append("client.png\" alt=\"Client\" title=\"").append(_("Client")).append("\">"); + buf.append("client.png\" alt=\"Client\" title=\"").append(_t("Client")).append("\">"); buf.append(""); + buf.append("\" target=\"_top\" title=\"").append(_t("Show tunnels")).append("\">"); if (name.length() <= 20) buf.append(DataHelper.escapeHTML(name)); else @@ -462,20 +462,20 @@ public class SummaryHelper extends HelperBase { long timeToExpire = ls.getEarliestLeaseDate() - _context.clock().now(); if (timeToExpire < 0) { // red or yellow light - buf.append("\"").append(_("Rebuilding")).append("…\"
              \"").append(_t("Rebuilding")).append("…\"
              \"Ready\"
              \"Ready\"
              \"").append(_("Building")).append("…\"
              \"").append(_t("Building")).append("…\"
              "); } else { - buf.append("
              ").append(_("none")).append("
              "); + buf.append("
              ").append(_t("none")).append("
              "); } buf.append("\n"); return buf.toString(); @@ -486,7 +486,7 @@ public class SummaryHelper extends HelperBase { * Inner class, can't be Serializable */ private class AlphaComparator implements Comparator { - private final String xsc = _("shared clients"); + private final String xsc = _t("shared clients"); public int compare(Destination lhs, Destination rhs) { String lname = getName(lhs); @@ -511,9 +511,9 @@ public class SummaryHelper extends HelperBase { if (name == null) name = d.calculateHash().toBase64().substring(0,6); else - name = _(name); + name = _t(name); } else { - name = _(name); + name = _t(name); } return name; } @@ -712,12 +712,12 @@ public class SummaryHelper extends HelperBase { buf.append("
              "); else needSpace = true; - buf.append("

              ").append(_("Update downloaded")).append("
              "); + buf.append("

              ").append(_t("Update downloaded")).append("
              "); if (_context.hasWrapper()) - buf.append(_("Click Restart to install")); + buf.append(_t("Click Restart to install")); else - buf.append(_("Click Shutdown and restart to install")); - buf.append(' ').append(_("Version {0}", DataHelper.escapeHTML(dver))); + buf.append(_t("Click Shutdown and restart to install")); + buf.append(' ').append(_t("Version {0}", DataHelper.escapeHTML(dver))); buf.append("

              "); } boolean avail = updateAvailable(); @@ -731,8 +731,8 @@ public class SummaryHelper extends HelperBase { buf.append("
              "); else needSpace = true; - buf.append("

              ").append(_("Update available")).append(":
              "); - buf.append(_("Version {0}", getUpdateVersion())).append("
              "); + buf.append("

              ").append(_t("Update available")).append(":
              "); + buf.append(_t("Version {0}", getUpdateVersion())).append("
              "); buf.append(constraint).append("

              "); avail = false; } @@ -755,7 +755,7 @@ public class SummaryHelper extends HelperBase { if (avail) { buf.append("
              \n"); } if (devSU3Avail) { @@ -763,7 +763,7 @@ public class SummaryHelper extends HelperBase { // Note to translators: parameter is a router version, e.g. "0.9.19-16" //
              is optional, to help the browser make the lines even in the button // If the translation is shorter than the English, you should probably not include
              - .append(_("Download Signed
              Development Update
              {0}", getDevSU3UpdateVersion())) + .append(_t("Download Signed
              Development Update
              {0}", getDevSU3UpdateVersion())) .append("
              \n"); } if (unsignedAvail) { @@ -771,7 +771,7 @@ public class SummaryHelper extends HelperBase { // Note to translators: parameter is a date and time, e.g. "02-Mar 20:34 UTC" //
              is optional, to help the browser make the lines even in the button // If the translation is shorter than the English, you should probably not include
              - .append(_("Download Unsigned
              Update {0}", getUnsignedUpdateVersion())) + .append(_t("Download Unsigned
              Update {0}", getUnsignedUpdateVersion())) .append("
              \n"); } buf.append("\n"); @@ -795,9 +795,9 @@ public class SummaryHelper extends HelperBase { StringBuilder buf = new StringBuilder(256); if (showFirewallWarning()) { buf.append("

              ") - .append(_("Check network connection and NAT/firewall")) + .append(_t("Check network connection and NAT/firewall")) .append("

              "); } @@ -816,7 +816,7 @@ public class SummaryHelper extends HelperBase { String uri = getRequestURI(); buf.append("

              \n"); buf.append("\n"); - buf.append("

              \n"); + buf.append("

              \n"); } } // If a new reseed ain't running, and the last reseed had errors, show error message @@ -901,18 +901,18 @@ public class SummaryHelper extends HelperBase { StringBuilder buf = new StringBuilder(2048); buf.append("\n"); for (String section : sections) { int i = sections.indexOf(section); buf.append("\n"); } buf.append("" + "") .append("
              ") - .append(_("Remove")) + .append(_t("Remove")) .append("") - .append(_("Name")) + .append(_t("Name")) .append("") - .append(_("Order")) + .append(_t("Order")) .append("
              ") - .append(_(sectionNames.get(section))) + .append(_t(sectionNames.get(section))) .append("\"")"); buf.append(""); } buf.append(""); @@ -945,34 +945,34 @@ public class SummaryHelper extends HelperBase { buf.append(""); buf.append(""); } buf.append("
              " + "") - .append(_("Add")).append(": " + + .append(_t("Add")).append(": " + "" + "
              \n"); return buf.toString(); diff --git a/apps/routerconsole/java/src/net/i2p/router/web/SummaryRenderer.java b/apps/routerconsole/java/src/net/i2p/router/web/SummaryRenderer.java index 06d6e9af5..d97d185a8 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/SummaryRenderer.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/SummaryRenderer.java @@ -139,9 +139,9 @@ class SummaryRenderer { else p = DataHelper.formatDuration2(period).replace(" ", " "); if (showEvents) - title = name + ' ' + _("events in {0}", p); + title = name + ' ' + _t("events in {0}", p); else - title = name + ' ' + _("averaged for {0}", p); + title = name + ' ' + _t("averaged for {0}", p); def.setTitle(title); } String path = _listener.getData().getPath(); @@ -151,7 +151,7 @@ class SummaryRenderer { if (showEvents) { // include the average event count on the plot plotName = dsNames[1]; - descr = _("Events per period"); + descr = _t("Events per period"); } else { // include the average value plotName = dsNames[0]; @@ -159,12 +159,12 @@ class SummaryRenderer { // (there are over 500 of them) // but the descriptions for the default graphs are tagged in // Strings.java - descr = _(_listener.getRate().getRateStat().getDescription()); + descr = _t(_listener.getRate().getRateStat().getDescription()); } //long started = ((RouterContext)_context).router().getWhenStarted(); //if (started > start && started < end) - // def.vrule(started / 1000, RESTART_BAR_COLOR, _("Restart"), 4.0f); + // def.vrule(started / 1000, RESTART_BAR_COLOR, _t("Restart"), 4.0f); def.datasource(plotName, path, plotName, SummaryListener.CF, _listener.getBackendName()); if (descr.length() > 0) { @@ -173,22 +173,22 @@ class SummaryRenderer { def.area(plotName, Color.BLUE); } if (!hideLegend) { - def.gprint(plotName, SummaryListener.CF, _("avg") + ": %.2f %s"); - def.gprint(plotName, "MAX", ' ' + _("max") + ": %.2f %S"); - def.gprint(plotName, "LAST", ' ' + _("now") + ": %.2f %S\\r"); + def.gprint(plotName, SummaryListener.CF, _t("avg") + ": %.2f %s"); + def.gprint(plotName, "MAX", ' ' + _t("max") + ": %.2f %S"); + def.gprint(plotName, "LAST", ' ' + _t("now") + ": %.2f %S\\r"); } String plotName2 = null; if (lsnr2 != null) { String dsNames2[] = lsnr2.getData().getDsNames(); plotName2 = dsNames2[0]; String path2 = lsnr2.getData().getPath(); - String descr2 = _(lsnr2.getRate().getRateStat().getDescription()); + String descr2 = _t(lsnr2.getRate().getRateStat().getDescription()); def.datasource(plotName2, path2, plotName2, SummaryListener.CF, lsnr2.getBackendName()); def.line(plotName2, Color.RED, descr2 + "\\r", 3); if (!hideLegend) { - def.gprint(plotName2, SummaryListener.CF, _("avg") + ": %.2f %s"); - def.gprint(plotName2, "MAX", ' ' + _("max") + ": %.2f %S"); - def.gprint(plotName2, "LAST", ' ' + _("now") + ": %.2f %S\\r"); + def.gprint(plotName2, SummaryListener.CF, _t("avg") + ": %.2f %s"); + def.gprint(plotName2, "MAX", ' ' + _t("max") + ": %.2f %S"); + def.gprint(plotName2, "LAST", ' ' + _t("now") + ": %.2f %S\\r"); } } if (!hideLegend) { @@ -198,7 +198,7 @@ class SummaryRenderer { for (Map.Entry event : events.entrySet()) { long started = event.getKey().longValue(); if (started > start && started < end) { - String legend = _("Restart") + ' ' + sdf.format(new Date(started)) + " UTC " + event.getValue() + "\\r"; + String legend = _t("Restart") + ' ' + sdf.format(new Date(started)) + " UTC " + event.getValue() + "\\r"; def.vrule(started / 1000, RESTART_BAR_COLOR, legend, 4.0f); } } @@ -271,7 +271,7 @@ class SummaryRenderer { private static final boolean IS_WIN = SystemVersion.isWindows(); /** translate a string */ - private String _(String s) { + private String _t(String s) { // the RRD font doesn't have zh chars, at least on my system // Works on 1.5.9 except on windows if (IS_WIN && "zh".equals(Messages.getLanguage(_context))) @@ -282,7 +282,7 @@ class SummaryRenderer { /** * translate a string with a parameter */ - private String _(String s, String o) { + private String _t(String s, String o) { // the RRD font doesn't have zh chars, at least on my system // Works on 1.5.9 except on windows if (IS_WIN && "zh".equals(Messages.getLanguage(_context))) diff --git a/apps/routerconsole/java/src/net/i2p/router/web/TunnelRenderer.java b/apps/routerconsole/java/src/net/i2p/router/web/TunnelRenderer.java index 9fff49d1e..3784e4a30 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/TunnelRenderer.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/TunnelRenderer.java @@ -33,7 +33,7 @@ public class TunnelRenderer { } public void renderStatusHTML(Writer out) throws IOException { - out.write("

              " + _("Exploratory tunnels") + " (" + _("configure") + ")

              \n"); + out.write("

              " + _t("Exploratory tunnels") + " (" + _t("configure") + ")

              \n"); renderPool(out, _context.tunnelManager().getInboundExploratoryPool(), _context.tunnelManager().getOutboundExploratoryPool()); List destinations = null; @@ -57,20 +57,20 @@ public class TunnelRenderer { if (name == null) name = client.toBase64().substring(0,4); out.write("

              " + _("Client tunnels for") + ' ' + DataHelper.escapeHTML(_(name))); + + "\" >" + _t("Client tunnels for") + ' ' + DataHelper.escapeHTML(_t(name))); if (isLocal) - out.write(" (" + _("configure") + ")

              \n"); + out.write(" (" + _t("configure") + ")

              \n"); else - out.write(" (" + _("dead") + ")

              \n"); + out.write(" (" + _t("dead") + ")\n"); renderPool(out, in, outPool); } List participating = _context.tunnelDispatcher().listParticipatingTunnels(); Collections.sort(participating, new TunnelComparator()); - out.write("

              " + _("Participating tunnels") + "

              \n"); - out.write("" - + "\n"); + out.write("

              " + _t("Participating tunnels") + "

              " + _("Receive on") + "" + _("From") + "" - + _("Send on") + "" + _("To") + "" + _("Expiration") + "" + _("Usage") + "" + _("Rate") + "" + _("Role") + "
              \n"); + out.write("" + + "\n"); long processed = 0; RateStat rs = _context.statManager().getRate("tunnel.participatingMessageCount"); if (rs != null) @@ -108,7 +108,7 @@ public class TunnelRenderer { if (timeLeft > 0) out.write(""); else - out.write(""); + out.write(""); out.write(""); int lifetime = (int) ((_context.clock().now() - cfg.getCreation()) / 1000); if (lifetime <= 0) @@ -118,18 +118,18 @@ public class TunnelRenderer { int bps = 1024 * cfg.getProcessedMessagesCount() / lifetime; out.write(""); if (cfg.getSendTo() == null) - out.write(""); + out.write(""); else if (cfg.getReceiveFrom() == null) - out.write(""); + out.write(""); else - out.write(""); + out.write(""); out.write("\n"); } out.write("
              " + _t("Receive on") + "" + _t("From") + "" + + _t("Send on") + "" + _t("To") + "" + _t("Expiration") + "" + _t("Usage") + "" + _t("Rate") + "" + _t("Role") + "
              " + DataHelper.formatDuration2(timeLeft) + "(" + _("grace period") + ")(" + _t("grace period") + ")" + cfg.getProcessedMessagesCount() + " KB" + bps + " Bps" + _("Outbound Endpoint") + "" + _t("Outbound Endpoint") + "" + _("Inbound Gateway") + "" + _t("Inbound Gateway") + "" + _("Participant") + "" + _t("Participant") + "
              \n"); if (displayed > DISPLAY_LIMIT) - out.write("
              " + _("Limited display to the {0} tunnels with the highest usage", DISPLAY_LIMIT) + "
              \n"); - out.write("
              " + _("Inactive participating tunnels") + ": " + inactive + "
              \n"); - out.write("
              " + _("Lifetime bandwidth usage") + ": " + DataHelper.formatSize2(processed*1024) + "B
              \n"); + out.write("
              " + _t("Limited display to the {0} tunnels with the highest usage", DISPLAY_LIMIT) + "
              \n"); + out.write("
              " + _t("Inactive participating tunnels") + ": " + inactive + "
              \n"); + out.write("
              " + _t("Lifetime bandwidth usage") + ": " + DataHelper.formatSize2(processed*1024) + "B
              \n"); //renderPeers(out); out.write(""); } @@ -159,16 +159,16 @@ public class TunnelRenderer { if (info.getLength() > maxLength) maxLength = info.getLength(); } - out.write(""); + out.write("
              " + _("In/Out") + "" + _("Expiry") + "" + _("Usage") + "" + _("Gateway") + "
              "); if (maxLength > 3) { out.write(""); + out.write("\">" + _t("Participants") + ""); } else if (maxLength == 3) { - out.write(""); + out.write(""); } if (maxLength > 1) { - out.write(""); + out.write(""); } out.write("\n"); for (int i = 0; i < tunnels.size(); i++) { @@ -208,22 +208,22 @@ public class TunnelRenderer { if (in != null) { List pending = in.listPending(); if (!pending.isEmpty()) { - out.write("
              " + _("Build in progress") + ": " + pending.size() + " " + _("inbound") + "
              \n"); + out.write("
              " + _t("Build in progress") + ": " + pending.size() + " " + _t("inbound") + "
              \n"); live += pending.size(); } } if (outPool != null) { List pending = outPool.listPending(); if (!pending.isEmpty()) { - out.write("
              " + _("Build in progress") + ": " + pending.size() + " " + _("outbound") + "
              \n"); + out.write("
              " + _t("Build in progress") + ": " + pending.size() + " " + _t("outbound") + "
              \n"); live += pending.size(); } } if (live <= 0) - out.write("
              " + _("No tunnels; waiting for the grace period to end.") + "
              \n"); - out.write("
              " + _("Lifetime bandwidth usage") + ": " + - DataHelper.formatSize2(processedIn*1024) + "B " + _("in") + ", " + - DataHelper.formatSize2(processedOut*1024) + "B " + _("out") + "
              "); + out.write("
              " + _t("No tunnels; waiting for the grace period to end.") + "
              \n"); + out.write("
              " + _t("Lifetime bandwidth usage") + ": " + + DataHelper.formatSize2(processedIn*1024) + "B " + _t("in") + ", " + + DataHelper.formatSize2(processedOut*1024) + "B " + _t("out") + "
              "); } /**** @@ -241,8 +241,8 @@ public class TunnelRenderer { List peerList = new ArrayList(peers); Collections.sort(peerList, new CountryComparator(this._context.commSystem())); - out.write("

              " + _("Tunnel Counts By Peer") + "

              \n"); - out.write("
              " + _t("In/Out") + "" + _t("Expiry") + "" + _t("Usage") + "" + _t("Gateway") + "" + _("Participants") + "" + _("Participant") + "" + _t("Participant") + "" + _("Endpoint") + "" + _t("Endpoint") + "
              \n"); + out.write("

              " + _t("Tunnel Counts By Peer") + "

              \n"); + out.write("
              " + _("Peer") + "" + _("Our Tunnels") + "" + _("% of total") + "" + _("Participating Tunnels") + "" + _("% of total") + "
              \n"); for (Hash h : peerList) { out.write("
              " + _t("Peer") + "" + _t("Our Tunnels") + "" + _t("% of total") + "" + _t("Participating Tunnels") + "" + _t("% of total") + "
              "); out.write(netDbLink(h)); @@ -260,7 +260,7 @@ public class TunnelRenderer { out.write('0'); out.write('\n'); } - out.write("
              " + _("Totals") + " " + tunnelCount); + out.write("
              " + _t("Totals") + " " + tunnelCount); out.write("   " + partCount); out.write("  
              \n"); } @@ -343,12 +343,12 @@ public class TunnelRenderer { } /** translate a string */ - private String _(String s) { + private String _t(String s) { return Messages.getString(s, _context); } /** translate a string */ - public String _(String s, Object o) { + public String _t(String s, Object o) { return Messages.getString(s, o, _context); } } diff --git a/apps/routerconsole/java/strings/Strings.java b/apps/routerconsole/java/strings/Strings.java index 462938017..8254d657b 100644 --- a/apps/routerconsole/java/strings/Strings.java +++ b/apps/routerconsole/java/strings/Strings.java @@ -9,76 +9,76 @@ package dummy; class Dummy { void dummy { // wars for ConfigClientsHelper - _("addressbook"); - _("i2psnark"); - _("i2ptunnel"); - _("susimail"); - _("susidns"); - _("routerconsole"); + _t("addressbook"); + _t("i2psnark"); + _t("i2ptunnel"); + _t("susimail"); + _t("susidns"); + _t("routerconsole"); // clients, taken from clients.config, for ConfigClientsHelper // note that if the wording changes in clients.config, we have to // keep the old string here as well for existing installs - _("Web console"); - _("SAM application bridge"); - _("Application tunnels"); - _("My eepsite web server"); - _("I2P webserver (eepsite)"); - _("Browser launch at startup"); - _("BOB application bridge"); - _("I2P Router Console"); - _("Open Router Console in web browser at startup"); + _t("Web console"); + _t("SAM application bridge"); + _t("Application tunnels"); + _t("My eepsite web server"); + _t("I2P webserver (eepsite)"); + _t("Browser launch at startup"); + _t("BOB application bridge"); + _t("I2P Router Console"); + _t("Open Router Console in web browser at startup"); // tunnel nicknames, taken from i2ptunnel.config so they will display // nicely under 'local destinations' in the summary bar // note that if the wording changes in i2ptunnel.config, we have to // keep the old string here as well for existing installs - _("shared clients"); - _("shared clients (DSA)"); - _("IRC proxy"); - _("eepsite"); - _("I2P webserver"); - _("HTTP Proxy"); + _t("shared clients"); + _t("shared clients (DSA)"); + _t("IRC proxy"); + _t("eepsite"); + _t("I2P webserver"); + _t("HTTP Proxy"); // older names for pre-0.7.4 installs - _("eepProxy"); - _("ircProxy"); + _t("eepProxy"); + _t("ircProxy"); // hardcoded in i2psnark - _("I2PSnark"); + _t("I2PSnark"); // hardcoded in iMule? - _("iMule"); + _t("iMule"); // standard themes for ConfigUIHelper - _("classic"); - _("dark"); - _("light"); - _("midnight"); + _t("classic"); + _t("dark"); + _t("light"); + _t("midnight"); // stat groups for stats.jsp - _("Bandwidth"); - _("BandwidthLimiter"); - _("ClientMessages"); - _("Encryption"); - _("i2cp"); - _("I2PTunnel"); - _("InNetPool"); - _("JobQueue"); - _("NetworkDatabase"); - _("ntcp"); - _("Peers"); - _("Router"); - _("Stream"); - _("Throttle"); - _("Transport"); - _("Tunnels"); - _("udp"); + _t("Bandwidth"); + _t("BandwidthLimiter"); + _t("ClientMessages"); + _t("Encryption"); + _t("i2cp"); + _t("I2PTunnel"); + _t("InNetPool"); + _t("JobQueue"); + _t("NetworkDatabase"); + _t("ntcp"); + _t("Peers"); + _t("Router"); + _t("Stream"); + _t("Throttle"); + _t("Transport"); + _t("Tunnels"); + _t("udp"); // parameters in transport addresses (netdb.jsp) // may or may not be worth translating - _("host"); - _("key"); - _("port"); + _t("host"); + _t("key"); + _t("port"); // capabilities - _("caps"); + _t("caps"); } } diff --git a/apps/routerconsole/jsp/config.jsp b/apps/routerconsole/jsp/config.jsp index 538fb8a5f..5e9c0de92 100644 --- a/apps/routerconsole/jsp/config.jsp +++ b/apps/routerconsole/jsp/config.jsp @@ -14,7 +14,7 @@ " /> -

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

              +

              <%=intl._t("I2P Bandwidth Configuration")%>

              <%@include file="confignav.jsi" %> @@ -25,12 +25,12 @@ -

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

              +

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

              - <%=intl._("I2P will work best if you configure your rates to match the speed of your internet connection.")%> + <%=intl._t("I2P will work best if you configure your rates to match the speed of your internet connection.")%>

              <% /******** *********/ %> - +
              " > - <%=intl._("KBps In")%> + <%=intl._t("KBps In")%> ()
              <%=intl._("Share")%> <%=intl._t("Share")%> ()

              <% int share = nethelper.getShareBandwidth(); if (share < 12) { out.print(""); - out.print(intl._("NOTE")); + out.print(intl._t("NOTE")); out.print(": "); - out.print(intl._("You have configured I2P to share only {0} KBps.", share)); + out.print(intl._t("You have configured I2P to share only {0} KBps.", share)); out.print("\n"); - out.print(intl._("I2P requires at least 12KBps to enable sharing. ")); - out.print(intl._("Please enable sharing (participating in tunnels) by configuring more bandwidth. ")); - out.print(intl._("It improves your anonymity by creating cover traffic, and helps the network.")); + out.print(intl._t("I2P requires at least 12KBps to enable sharing. ")); + out.print(intl._t("Please enable sharing (participating in tunnels) by configuring more bandwidth. ")); + out.print(intl._t("It improves your anonymity by creating cover traffic, and helps the network.")); } else { - out.print(intl._("You have configured I2P to share {0} KBps.", share)); + out.print(intl._t("You have configured I2P to share {0} KBps.", share)); out.print("\n"); - out.print(intl._("The higher the share bandwidth the more you improve your anonymity and help the network.")); + out.print(intl._t("The higher the share bandwidth the more you improve your anonymity and help the network.")); } %>

              -

              <%=intl._("Advanced network configuration page")%>


              +

              <%=intl._t("Advanced network configuration page")%>


              -" > -" > +" > +" >
              diff --git a/apps/routerconsole/jsp/configadvanced.jsp b/apps/routerconsole/jsp/configadvanced.jsp index 961ac83fa..3ba2deed1 100644 --- a/apps/routerconsole/jsp/configadvanced.jsp +++ b/apps/routerconsole/jsp/configadvanced.jsp @@ -15,7 +15,7 @@ " /> -

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

              +

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

              <%@include file="confignav.jsi" %> @@ -24,14 +24,14 @@ <%@include file="formhandler.jsi" %>
              -

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

              -

              <%=intl._("Floodill participation helps the network, but may use more of your computer's resources.")%> +

              <%=intl._t("Floodfill Configuration")%>

              +

              <%=intl._t("Floodill participation helps the network, but may use more of your computer's resources.")%>

              <% if (advancedhelper.isFloodfill()) { -%><%=intl._("This router is currently a floodfill participant.")%><% +%><%=intl._t("This router is currently a floodfill participant.")%><% } else { -%><%=intl._("This router is not currently a floodfill participant.")%><% +%><%=intl._t("This router is not currently a floodfill participant.")%><% } %>

              @@ -39,15 +39,15 @@ > -<%=intl._("Automatic")%>
              +<%=intl._t("Automatic")%>
              > -<%=intl._("Force On")%>
              +<%=intl._t("Force On")%>
              > -<%=intl._("Disable")%>
              +<%=intl._t("Disable")%>
              -" > +" >
              -

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

              +

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

              <% if (advancedhelper.isAdvanced()) { %>
              @@ -56,11 +56,11 @@

              <% if (advancedhelper.isAdvanced()) { %>
              - " > - " > -
              <%=intl._("NOTE")%>: <%=intl._("Some changes may require a restart to take effect.")%> + " > + " > +
              <%=intl._t("NOTE")%>: <%=intl._t("Some changes may require a restart to take effect.")%>
              <% } else { %> -<%=intl._("To make changes, edit the file {0}.", "" + advancedhelper.getConfigFileName() + "")%> +<%=intl._t("To make changes, edit the file {0}.", "" + advancedhelper.getConfigFileName() + "")%> <% } // isAdvanced %>
              diff --git a/apps/routerconsole/jsp/configclients.jsp b/apps/routerconsole/jsp/configclients.jsp index 65f67daf5..cbb9710d4 100644 --- a/apps/routerconsole/jsp/configclients.jsp +++ b/apps/routerconsole/jsp/configclients.jsp @@ -20,43 +20,43 @@ input.default { width: 1px; height: 1px; visibility: hidden; } " /> " /> -

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

              +

              <%=intl._t("I2P Client Configuration")%>

              <%@include file="confignav.jsi" %> <%@include file="formhandler.jsi" %>
              -

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

              - <%=intl._("The Java clients listed below are started by the router and run in the same JVM.")%>
              - <%=intl._("Be careful changing any settings here. The 'router console' and 'application tunnels' are required for most uses of I2P. Only advanced users should change these.")%> +

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

              + <%=intl._t("The Java clients listed below are started by the router and run in the same JVM.")%>
              + <%=intl._t("Be careful changing any settings here. The 'router console' and 'application tunnels' are required for most uses of I2P. Only advanced users should change these.")%>

              -

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

              <%=intl._t("To change other client options, edit the file")%> <%=net.i2p.router.startup.ClientAppConfig.configFile(net.i2p.I2PAppContext.getGlobalContext()).getAbsolutePath()%>. - <%=intl._("All changes require restart to take effect.")%> + <%=intl._t("All changes require restart to take effect.")%>


              - " /> + " /> <% if (clientshelper.isClientChangeEnabled() && request.getParameter("edit") == null) { %> - " /> + " /> <% } %> - " /> + " />
              -

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

              +

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

              -<%=intl._("External I2CP (I2P Client Protocol) Interface Configuration")%>
              +<%=intl._t("External I2CP (I2P Client Protocol) Interface Configuration")%>
              > -<%=intl._("Enabled without SSL")%>
              +<%=intl._t("Enabled without SSL")%>
              > -<%=intl._("Enabled with SSL required")%>
              +<%=intl._t("Enabled with SSL required")%>
              > -<%=intl._("Disabled - Clients outside this Java process may not connect")%>
              -<%=intl._("I2CP Interface")%>: +<%=intl._t("Disabled - Clients outside this Java process may not connect")%>
              +<%=intl._t("I2CP Interface")%>:
              -<%=intl._("I2CP Port")%>: +<%=intl._t("I2CP Port")%>: " >
              -<%=intl._("Authorization")%>
              +<%=intl._t("Authorization")%>
              > -<%=intl._("Require username and password")%>
              -<%=intl._("Username")%>: +<%=intl._t("Require username and password")%>
              +<%=intl._t("Username")%>:
              -<%=intl._("Password")%>: +<%=intl._t("Password")%>:
              -

              <%=intl._("The default settings will work for most people.")%> -<%=intl._("Any changes made here must also be configured in the external client.")%> -<%=intl._("Many clients do not support SSL or authorization.")%> -<%=intl._("All changes require restart to take effect.")%> +

              <%=intl._t("The default settings will work for most people.")%> +<%=intl._t("Any changes made here must also be configured in the external client.")%> +<%=intl._t("Many clients do not support SSL or authorization.")%> +<%=intl._t("All changes require restart to take effect.")%>


              -" /> -" /> -" /> +" /> +" /> +" />
              -

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

              - <%=intl._("The Java web applications listed below are started by the webConsole client and run in the same JVM as the router. They are usually web applications accessible through the router console. They may be complete applications (e.g. i2psnark),front-ends to another client or application which must be separately enabled (e.g. susidns, i2ptunnel), or have no web interface at all (e.g. addressbook).")%> +

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

              + <%=intl._t("The Java web applications listed below are started by the webConsole client and run in the same JVM as the router. They are usually web applications accessible through the router console. They may be complete applications (e.g. i2psnark),front-ends to another client or application which must be separately enabled (e.g. susidns, i2ptunnel), or have no web interface at all (e.g. addressbook).")%>

              - <%=intl._("A web app may also be disabled by removing the .war file from the webapps directory; however the .war file and web app will reappear when you update your router to a newer version, so disabling the web app here is the preferred method.")%> + <%=intl._t("A web app may also be disabled by removing the .war file from the webapps directory; however the .war file and web app will reappear when you update your router to a newer version, so disabling the web app here is the preferred method.")%>

              -

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

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


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

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

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

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

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

              - " /> - " /> + " /> + " />
              <% } // pluginUpdateEnabled if (clientshelper.isPluginInstallEnabled()) { %> -

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

              - <%=intl._("Look for available plugins on {0}.", "plugins.i2p")%> - <%=intl._("To install a plugin, enter the download URL:")%> +

              <%=intl._t("Plugin Installation from URL")%>

              + <%=intl._t("Look for available plugins on {0}.", "plugins.i2p")%> + <%=intl._t("To install a plugin, enter the download URL:")%>

              @@ -133,31 +133,31 @@ input.default { width: 1px; height: 1px; visibility: hidden; }


              - " /> - " /> - " /> + " /> + " /> + " />
              -

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

              +

              <%=intl._t("Plugin Installation from File")%>

              -

              <%=intl._("Install plugin from file.")%> -
              <%=intl._("Select xpi2p or su3 file")%> : +

              <%=intl._t("Install plugin from file.")%> +
              <%=intl._t("Select xpi2p or su3 file")%> :


              -" /> +" />
              <% } // pluginInstallEnabled if (clientshelper.isPluginUpdateEnabled()) { %> -

              <%=intl._("Update All Plugins")%>

              +

              <%=intl._t("Update All Plugins")%>

              - " /> + " />
              <% } // pluginUpdateEnabled diff --git a/apps/routerconsole/jsp/confighome.jsp b/apps/routerconsole/jsp/confighome.jsp index bf1f59d45..56be7b8bd 100644 --- a/apps/routerconsole/jsp/confighome.jsp +++ b/apps/routerconsole/jsp/confighome.jsp @@ -17,7 +17,7 @@ input.default { <%@include file="summary.jsi" %> -

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

              +

              <%=intl._t("I2P Home Page Configuration")%>

              <%@include file="confignav.jsi" %> @@ -26,60 +26,60 @@ input.default { " /> -

              <%=intl._("Default Home Page")%>

              +

              <%=intl._t("Default Home Page")%>

              > - <%=intl._("Use old home page")%> - " > + <%=intl._t("Use old home page")%> + " >
              <% if (homehelper.shouldShowSearch()) { %> -

              <%=intl._("Search Engines")%>

              +

              <%=intl._t("Search Engines")%>

              - " > - " > - " > - " > - " > + " > + " > + " > + " > + " >
              <% } // shouldShowSearch() %> -

              <%=intl._("Hidden Services of Interest")%>

              +

              <%=intl._t("Hidden Services of Interest")%>

              - " > - " > - " > - " > - " > + " > + " > + " > + " > + " >
              -

              <%=intl._("Applications and Configuration")%>

              +

              <%=intl._t("Applications and Configuration")%>

              - " > - " > - " > - " > - " > + " > + " > + " > + " > + " >
              diff --git a/apps/routerconsole/jsp/configkeyring.jsp b/apps/routerconsole/jsp/configkeyring.jsp index b2f5ef657..3653a9479 100644 --- a/apps/routerconsole/jsp/configkeyring.jsp +++ b/apps/routerconsole/jsp/configkeyring.jsp @@ -10,7 +10,7 @@ <%@include file="summary.jsi" %> -

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

              +

              <%=intl._t("I2P Keyring Configuration")%>

              <%@include file="confignav.jsi" %> @@ -18,29 +18,29 @@ <%@include file="formhandler.jsi" %> " /> -

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

              - <%=intl._("The router keyring is used to decrypt encrypted leaseSets.")%> - <%=intl._("The keyring may contain keys for local or remote encrypted destinations.")%>

              +

              <%=intl._t("Keyring")%>

              + <%=intl._t("The router keyring is used to decrypt encrypted leaseSets.")%> + <%=intl._t("The keyring may contain keys for local or remote encrypted destinations.")%>

              -

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

              - <%=intl._("Enter keys for encrypted remote destinations here.")%> - <%=intl._("Keys for local destinations must be entered on the")%> <%=intl._("I2PTunnel page")%>. +

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

              + <%=intl._t("Enter keys for encrypted remote destinations here.")%> + <%=intl._t("Keys for local destinations must be entered on the")%> <%=intl._t("I2PTunnel page")%>.

              - + - +
              <%=intl._("Dest. name, hash, or full key")%>:<%=intl._t("Dest. name, hash, or full key")%>:
              <%=intl._("Encryption Key")%>:<%=intl._t("Encryption Key")%>:
              -" > -" > -" > +" > +" > +" >
              diff --git a/apps/routerconsole/jsp/configlogging.jsp b/apps/routerconsole/jsp/configlogging.jsp index 9e3be5cc7..84f10ac80 100644 --- a/apps/routerconsole/jsp/configlogging.jsp +++ b/apps/routerconsole/jsp/configlogging.jsp @@ -13,7 +13,7 @@ " /> <%@include file="summary.jsi" %> -

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

              +

              <%=intl._t("I2P Logging Configuration")%>

              <%@include file="confignav.jsi" %> @@ -23,31 +23,31 @@
              -

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

              +

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

              - - - + + + - + - + - - + - + - +
              <%=intl._("Log file")%>:" value="" > -
              <%=intl._("(the symbol '@' will be replaced during log rotation)")%>
              <%=intl._("Log record format")%>:
              <%=intl._t("Log file")%>:" value="" > +
              <%=intl._t("(the symbol '@' will be replaced during log rotation)")%>
              <%=intl._t("Log record format")%>: " > -
              <%=intl._("(use 'd' = date, 'c' = class, 't' = thread, 'p' = priority, 'm' = message)")%> +
              <%=intl._t("(use 'd' = date, 'c' = class, 't' = thread, 'p' = priority, 'm' = message)")%>
              <%=intl._("Log date format")%>:
              <%=intl._t("Log date format")%>: " > -
              <%=intl._("('MM' = month, 'dd' = day, 'HH' = hour, 'mm' = minute, 'ss' = second, 'SSS' = millisecond)")%> +
              <%=intl._t("('MM' = month, 'dd' = day, 'HH' = hour, 'mm' = minute, 'ss' = second, 'SSS' = millisecond)")%>
              <%=intl._("Max log file size")%>:
              <%=intl._t("Max log file size")%>: " >
              <%=intl._("Default log level")%>:
              <%=intl._("(DEBUG and INFO are not recommended defaults, as they will drastically slow down your router)")%> +
              <%=intl._t("Default log level")%>:
              <%=intl._t("(DEBUG and INFO are not recommended defaults, as they will drastically slow down your router)")%>
              <%=intl._("Log level overrides")%>:
              <%=intl._t("Log level overrides")%>:
              <%=intl._("New override")%>:
              <%=intl._t("New override")%>:

              - " > - " > + " > + " >
              diff --git a/apps/routerconsole/jsp/confignet.jsp b/apps/routerconsole/jsp/confignet.jsp index 27fdfef7e..7b81518e3 100644 --- a/apps/routerconsole/jsp/confignet.jsp +++ b/apps/routerconsole/jsp/confignet.jsp @@ -13,7 +13,7 @@ " /> -

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

              +

              <%=intl._t("I2P Network Configuration")%>

              <%@include file="confignav.jsi" %> @@ -23,55 +23,55 @@
              -

              <%=intl._("IP and Transport Configuration")%>

              +

              <%=intl._t("IP and Transport Configuration")%>

              - <%=intl._("The default settings will work for most people.")%> - <%=intl._("There is help below.")%> -

              <%=intl._("UPnP Configuration")%>:
              + <%=intl._t("The default settings will work for most people.")%> + <%=intl._t("There is help below.")%> +

              <%=intl._t("UPnP Configuration")%>:
              > - <%=intl._("Enable UPnP to open firewall ports")%> - <%=intl._("UPnP status")%> -

              <%=intl._("IP Configuration")%>:
              - <%=intl._("Externally reachable hostname or IP address")%>:
              + <%=intl._t("Enable UPnP to open firewall ports")%> - <%=intl._t("UPnP status")%> +

              <%=intl._t("IP Configuration")%>:
              + <%=intl._t("Externally reachable hostname or IP address")%>:
              > - <%=intl._("Use all auto-detect methods")%>
              + <%=intl._t("Use all auto-detect methods")%>
              > - <%=intl._("Disable UPnP IP address detection")%>
              + <%=intl._t("Disable UPnP IP address detection")%>
              > - <%=intl._("Ignore local interface IP address")%>
              + <%=intl._t("Ignore local interface IP address")%>
              > - <%=intl._("Use SSU IP address detection only")%>
              + <%=intl._t("Use SSU IP address detection only")%>
              > - <%=intl._("Hidden mode - do not publish IP")%> <%=intl._("(prevents participating traffic)")%>
              + <%=intl._t("Hidden mode - do not publish IP")%> <%=intl._t("(prevents participating traffic)")%>
              > - <%=intl._("Specify hostname or IP")%>:
              + <%=intl._t("Specify hostname or IP")%>:
              <%=nethelper.getAddressSelector() %>

              - <%=intl._("Action when IP changes")%>:
              + <%=intl._t("Action when IP changes")%>:
              > - <%=intl._("Laptop mode - Change router identity and UDP port when IP changes for enhanced anonymity")%> - (<%=intl._("Experimental")%>) + <%=intl._t("Laptop mode - Change router identity and UDP port when IP changes for enhanced anonymity")%> + (<%=intl._t("Experimental")%>)

              - <%=intl._("IPv4 Configuration")%>:
              + <%=intl._t("IPv4 Configuration")%>:
              > - <%=intl._("Disable inbound (Firewalled by Carrier-grade NAT or DS-Lite)")%> + <%=intl._t("Disable inbound (Firewalled by Carrier-grade NAT or DS-Lite)")%>

              - <%=intl._("IPv6 Configuration")%>:
              + <%=intl._t("IPv6 Configuration")%>:
              > - <%=intl._("Disable IPv6")%>
              + <%=intl._t("Disable IPv6")%>
              > - <%=intl._("Enable IPv6")%>
              + <%=intl._t("Enable IPv6")%>
              > - <%=intl._("Prefer IPv4 over IPv6")%>
              + <%=intl._t("Prefer IPv4 over IPv6")%>
              > - <%=intl._("Prefer IPv6 over IPv4")%>
              + <%=intl._t("Prefer IPv6 over IPv4")%>
              > - <%=intl._("Use IPv6 only (disable IPv4)")%> - (<%=intl._("Experimental")%>)
              -

              <%=intl._("UDP Configuration:")%>
              - <%=intl._("UDP port:")%> + <%=intl._t("Use IPv6 only (disable IPv4)")%> + (<%=intl._t("Experimental")%>)
              +

              <%=intl._t("UDP Configuration:")%>
              + <%=intl._t("UDP port:")%> " >
              > - <%=intl._("Completely disable")%> <%=intl._("(select only if behind a firewall that blocks outbound UDP)")%>
              + <%=intl._t("Completely disable")%> <%=intl._t("(select only if behind a firewall that blocks outbound UDP)")%>
              <% /******** *********/ %>

              - <%=intl._("TCP Configuration")%>:
              - <%=intl._("Externally reachable hostname or IP address")%>:
              + <%=intl._t("TCP Configuration")%>:
              + <%=intl._t("Externally reachable hostname or IP address")%>:
              > - <%=intl._("Use auto-detected IP address")%> - (<%=intl._("currently")%> ) - <%=intl._("if we are not firewalled")%>
              + <%=intl._t("Use auto-detected IP address")%> + (<%=intl._t("currently")%> ) + <%=intl._t("if we are not firewalled")%>
              > - <%=intl._("Always use auto-detected IP address (Not firewalled)")%>
              + <%=intl._t("Always use auto-detected IP address (Not firewalled)")%>
              > - <%=intl._("Specify hostname or IP")%>: + <%=intl._t("Specify hostname or IP")%>: " >
              > - <%=intl._("Disable inbound (Firewalled)")%>
              + <%=intl._t("Disable inbound (Firewalled)")%>
              > - <%=intl._("Completely disable")%> <%=intl._("(select only if behind a firewall that throttles or blocks outbound TCP)")%>
              + <%=intl._t("Completely disable")%> <%=intl._t("(select only if behind a firewall that throttles or blocks outbound TCP)")%>

              - <%=intl._("Externally reachable TCP port")%>:
              + <%=intl._t("Externally reachable TCP port")%>:
              > - <%=intl._("Use the same port configured for UDP")%> - (<%=intl._("currently")%> )
              + <%=intl._t("Use the same port configured for UDP")%> + (<%=intl._t("currently")%> )
              > - <%=intl._("Specify Port")%>: + <%=intl._t("Specify Port")%>: " >
              -

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

              +

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


              -" > -" > -

              <%=intl._("Configuration Help")%>:

              - <%=intl._("While I2P will work fine behind most firewalls, your speeds and network integration will generally improve if the I2P port is forwarded for both UDP and TCP.")%> +" > +" > +

              <%=intl._t("Configuration Help")%>:

              + <%=intl._t("While I2P will work fine behind most firewalls, your speeds and network integration will generally improve if the I2P port is forwarded for both UDP and TCP.")%>

              - <%=intl._("If you can, please poke a hole in your firewall to allow unsolicited UDP and TCP packets to reach you.")%> - <%=intl._("If you can't, I2P supports UPnP (Universal Plug and Play) and UDP hole punching with \"SSU introductions\" to relay traffic.")%> - <%=intl._("Most of the options above are for special situations, for example where UPnP does not work correctly, or a firewall not under your control is doing harm.")%> - <%=intl._("Certain firewalls such as symmetric NATs may not work well with I2P.")%> + <%=intl._t("If you can, please poke a hole in your firewall to allow unsolicited UDP and TCP packets to reach you.")%> + <%=intl._t("If you can't, I2P supports UPnP (Universal Plug and Play) and UDP hole punching with \"SSU introductions\" to relay traffic.")%> + <%=intl._t("Most of the options above are for special situations, for example where UPnP does not work correctly, or a firewall not under your control is doing harm.")%> + <%=intl._t("Certain firewalls such as symmetric NATs may not work well with I2P.")%>

              <% /******** *********/ %>

              - <%=intl._("UPnP is used to communicate with Internet Gateway Devices (IGDs) to detect the external IP address and forward ports.")%> - <%=intl._("UPnP support is beta, and may not work for any number of reasons")%>: + <%=intl._t("UPnP is used to communicate with Internet Gateway Devices (IGDs) to detect the external IP address and forward ports.")%> + <%=intl._t("UPnP support is beta, and may not work for any number of reasons")%>:

                -
              • <%=intl._("No UPnP-compatible device present")%> -
              • <%=intl._("UPnP disabled on the device")%> -
              • <%=intl._("Software firewall interference with UPnP")%> -
              • <%=intl._("Bugs in the device's UPnP implementation")%> -
              • <%=intl._("Multiple firewall/routers in the internet connection path")%> -
              • <%=intl._("UPnP device change, reset, or address change")%> +
              • <%=intl._t("No UPnP-compatible device present")%> +
              • <%=intl._t("UPnP disabled on the device")%> +
              • <%=intl._t("Software firewall interference with UPnP")%> +
              • <%=intl._t("Bugs in the device's UPnP implementation")%> +
              • <%=intl._t("Multiple firewall/routers in the internet connection path")%> +
              • <%=intl._t("UPnP device change, reset, or address change")%>
              -

              <%=intl._("Review the UPnP status here.")%> -<%=intl._("UPnP may be enabled or disabled above, but a change requires a router restart to take effect.")%>

              -

              <%=intl._("Hostnames entered above will be published in the network database.")%> - <%=intl._("They are not private.")%> - <%=intl._("Also, do not enter a private IP address like 127.0.0.1 or 192.168.1.1.")%> - <%=intl._("If you specify the wrong IP address or hostname, or do not properly configure your NAT or firewall, your network performance will degrade substantially.")%> - <%=intl._("When in doubt, leave the settings at the defaults.")%> +

              <%=intl._t("Review the UPnP status here.")%> +<%=intl._t("UPnP may be enabled or disabled above, but a change requires a router restart to take effect.")%>

              +

              <%=intl._t("Hostnames entered above will be published in the network database.")%> + <%=intl._t("They are not private.")%> + <%=intl._t("Also, do not enter a private IP address like 127.0.0.1 or 192.168.1.1.")%> + <%=intl._t("If you specify the wrong IP address or hostname, or do not properly configure your NAT or firewall, your network performance will degrade substantially.")%> + <%=intl._t("When in doubt, leave the settings at the defaults.")%>

              -

              <%=intl._("Reachability Help")%>:

              - <%=intl._("While I2P will work fine behind most firewalls, your speeds and network integration will generally improve if the I2P port is forwarded for both UDP and TCP.")%> - <%=intl._("If you think you have opened up your firewall and I2P still thinks you are firewalled, remember that you may have multiple firewalls, for example both software packages and external hardware routers.")%> - <%=intl._("If there is an error, the logs may also help diagnose the problem.")%> +

              <%=intl._t("Reachability Help")%>:

              + <%=intl._t("While I2P will work fine behind most firewalls, your speeds and network integration will generally improve if the I2P port is forwarded for both UDP and TCP.")%> + <%=intl._t("If you think you have opened up your firewall and I2P still thinks you are firewalled, remember that you may have multiple firewalls, for example both software packages and external hardware routers.")%> + <%=intl._t("If there is an error, the logs may also help diagnose the problem.")%>

                -
              • <%=intl._("OK")%> - - <%=intl._("Your UDP port does not appear to be firewalled.")%> -
              • <%=intl._("Firewalled")%> - - <%=intl._("Your UDP port appears to be firewalled.")%> - <%=intl._("As the firewall detection methods are not 100% reliable, this may occasionally be displayed in error.")%> - <%=intl._("However, if it appears consistently, you should check whether both your external and internal firewalls are open for your port.")%> - <%=intl._("I2P will work fine when firewalled, there is no reason for concern. When firewalled, the router uses \"introducers\" to relay inbound connections.")%> - <%=intl._("However, you will get more participating traffic and help the network more if you can open your firewall(s).")%> - <%=intl._("If you think you have already done so, remember that you may have both a hardware and a software firewall, or be behind an additional, institutional firewall you cannot control.")%> - <%=intl._("Also, some routers cannot correctly forward both TCP and UDP on a single port, or may have other limitations or bugs that prevent them from passing traffic through to I2P.")%> -
              • <%=intl._("Testing")%> - - <%=intl._("The router is currently testing whether your UDP port is firewalled.")%> -
              • <%=intl._("Hidden")%> - - <%=intl._("The router is not configured to publish its address, therefore it does not expect incoming connections.")%> - <%=intl._("Hidden mode is automatically enabled for added protection in certain countries.")%> -
              • <%=intl._("WARN - Firewalled and Fast")%> - - <%=intl._("You have configured I2P to share more than 128KBps of bandwidth, but you are firewalled.")%> - <%=intl._("While I2P will work fine in this configuration, if you really have over 128KBps of bandwidth to share, it will be much more helpful to the network if you open your firewall.")%> -
              • <%=intl._("WARN - Firewalled and Floodfill")%> - - <%=intl._("You have configured I2P to be a floodfill router, but you are firewalled.")%> - <%=intl._("For best participation as a floodfill router, you should open your firewall.")%> -
              • <%=intl._("WARN - Firewalled with Inbound TCP Enabled")%> - - <%=intl._("You have configured inbound TCP, however your UDP port is firewalled, and therefore it is likely that your TCP port is firewalled as well.")%> - <%=intl._("If your TCP port is firewalled with inbound TCP enabled, routers will not be able to contact you via TCP, which will hurt the network.")%> - <%=intl._("Please open your firewall or disable inbound TCP above.")%> -
              • <%=intl._("WARN - Firewalled with UDP Disabled")%> - - <%=intl._("You have configured inbound TCP, however you have disabled UDP.")%> - <%=intl._("You appear to be firewalled on TCP, therefore your router cannot accept inbound connections.")%> - <%=intl._("Please open your firewall or enable UDP.")%> -
              • <%=intl._("ERR - Clock Skew")%> - - <%=intl._("Your system's clock is skewed, which will make it difficult to participate in the network.")%> - <%=intl._("Correct your clock setting if this error persists.")%> -
              • <%=intl._("ERR - Private TCP Address")%> - - <%=intl._("You must never advertise an unroutable IP address such as 127.0.0.1 or 192.168.1.1 as your external address.")%> - <%=intl._("Correct the address or disable inbound TCP above.")%> -
              • <%=intl._("ERR - SymmetricNAT")%> - - <%=intl._("I2P detected that you are firewalled by a Symmetric NAT.")%> - <%=intl._("I2P does not work well behind this type of firewall. You will probably not be able to accept inbound connections, which will limit your participation in the network.")%> -
              • <%=intl._("ERR - UDP Port In Use - Set i2np.udp.internalPort=xxxx in advanced config and restart")%> - - <%=intl._("I2P was unable to bind to the configured port noted on the advanced network configuration page .")%> - <%=intl._("Check to see if another program is using the configured port. If so, stop that program or configure I2P to use a different port.")%> - <%=intl._("This may be a transient error, if the other program is no longer using the port.")%> - <%=intl._("However, a restart is always required after this error.")%> -
              • <%=intl._("ERR - UDP Disabled and Inbound TCP host/port not set")%> - - <%=intl._("You have not configured inbound TCP with a hostname and port above, however you have disabled UDP.")%> - <%=intl._("Therefore your router cannot accept inbound connections.")%> - <%=intl._("Please configure a TCP host and port above or enable UDP.")%> -
              • <%=intl._("ERR - Client Manager I2CP Error - check logs")%> - - <%=intl._("This is usually due to a port 7654 conflict. Check the logs to verify.")%> - <%=intl._("Do you have another I2P instance running? Stop the conflicting program and restart I2P.")%> +
              • <%=intl._t("OK")%> - + <%=intl._t("Your UDP port does not appear to be firewalled.")%> +
              • <%=intl._t("Firewalled")%> - + <%=intl._t("Your UDP port appears to be firewalled.")%> + <%=intl._t("As the firewall detection methods are not 100% reliable, this may occasionally be displayed in error.")%> + <%=intl._t("However, if it appears consistently, you should check whether both your external and internal firewalls are open for your port.")%> + <%=intl._t("I2P will work fine when firewalled, there is no reason for concern. When firewalled, the router uses \"introducers\" to relay inbound connections.")%> + <%=intl._t("However, you will get more participating traffic and help the network more if you can open your firewall(s).")%> + <%=intl._t("If you think you have already done so, remember that you may have both a hardware and a software firewall, or be behind an additional, institutional firewall you cannot control.")%> + <%=intl._t("Also, some routers cannot correctly forward both TCP and UDP on a single port, or may have other limitations or bugs that prevent them from passing traffic through to I2P.")%> +
              • <%=intl._t("Testing")%> - + <%=intl._t("The router is currently testing whether your UDP port is firewalled.")%> +
              • <%=intl._t("Hidden")%> - + <%=intl._t("The router is not configured to publish its address, therefore it does not expect incoming connections.")%> + <%=intl._t("Hidden mode is automatically enabled for added protection in certain countries.")%> +
              • <%=intl._t("WARN - Firewalled and Fast")%> - + <%=intl._t("You have configured I2P to share more than 128KBps of bandwidth, but you are firewalled.")%> + <%=intl._t("While I2P will work fine in this configuration, if you really have over 128KBps of bandwidth to share, it will be much more helpful to the network if you open your firewall.")%> +
              • <%=intl._t("WARN - Firewalled and Floodfill")%> - + <%=intl._t("You have configured I2P to be a floodfill router, but you are firewalled.")%> + <%=intl._t("For best participation as a floodfill router, you should open your firewall.")%> +
              • <%=intl._t("WARN - Firewalled with Inbound TCP Enabled")%> - + <%=intl._t("You have configured inbound TCP, however your UDP port is firewalled, and therefore it is likely that your TCP port is firewalled as well.")%> + <%=intl._t("If your TCP port is firewalled with inbound TCP enabled, routers will not be able to contact you via TCP, which will hurt the network.")%> + <%=intl._t("Please open your firewall or disable inbound TCP above.")%> +
              • <%=intl._t("WARN - Firewalled with UDP Disabled")%> - + <%=intl._t("You have configured inbound TCP, however you have disabled UDP.")%> + <%=intl._t("You appear to be firewalled on TCP, therefore your router cannot accept inbound connections.")%> + <%=intl._t("Please open your firewall or enable UDP.")%> +
              • <%=intl._t("ERR - Clock Skew")%> - + <%=intl._t("Your system's clock is skewed, which will make it difficult to participate in the network.")%> + <%=intl._t("Correct your clock setting if this error persists.")%> +
              • <%=intl._t("ERR - Private TCP Address")%> - + <%=intl._t("You must never advertise an unroutable IP address such as 127.0.0.1 or 192.168.1.1 as your external address.")%> + <%=intl._t("Correct the address or disable inbound TCP above.")%> +
              • <%=intl._t("ERR - SymmetricNAT")%> - + <%=intl._t("I2P detected that you are firewalled by a Symmetric NAT.")%> + <%=intl._t("I2P does not work well behind this type of firewall. You will probably not be able to accept inbound connections, which will limit your participation in the network.")%> +
              • <%=intl._t("ERR - UDP Port In Use - Set i2np.udp.internalPort=xxxx in advanced config and restart")%> - + <%=intl._t("I2P was unable to bind to the configured port noted on the advanced network configuration page .")%> + <%=intl._t("Check to see if another program is using the configured port. If so, stop that program or configure I2P to use a different port.")%> + <%=intl._t("This may be a transient error, if the other program is no longer using the port.")%> + <%=intl._t("However, a restart is always required after this error.")%> +
              • <%=intl._t("ERR - UDP Disabled and Inbound TCP host/port not set")%> - + <%=intl._t("You have not configured inbound TCP with a hostname and port above, however you have disabled UDP.")%> + <%=intl._t("Therefore your router cannot accept inbound connections.")%> + <%=intl._t("Please configure a TCP host and port above or enable UDP.")%> +
              • <%=intl._t("ERR - Client Manager I2CP Error - check logs")%> - + <%=intl._t("This is usually due to a port 7654 conflict. Check the logs to verify.")%> + <%=intl._t("Do you have another I2P instance running? Stop the conflicting program and restart I2P.")%>

              <% /******** <% } %>
              -

              <%=intl._("Adjust Profile Bonuses")%>

              -

              <%=intl._("Bonuses may be positive or negative, and affect the peer's inclusion in Fast and High Capacity tiers. Fast peers are used for client tunnels, and High Capacity peers are used for some exploratory tunnels. Current bonuses are displayed on the")%> <%=intl._("profiles page")%>.

              +

              <%=intl._t("Adjust Profile Bonuses")%>

              +

              <%=intl._t("Bonuses may be positive or negative, and affect the peer's inclusion in Fast and High Capacity tiers. Fast peers are used for client tunnels, and High Capacity peers are used for some exploratory tunnels. Current bonuses are displayed on the")%> <%=intl._t("profiles page")%>.

              <% long speed = 0; long capacity = 0; if (! "".equals(peer)) { // get existing bonus values? } %> -

              <%=intl._("Speed")%>: +

              <%=intl._t("Speed")%>: - <%=intl._("Capacity")%>: + <%=intl._t("Capacity")%>: - " />

              + " />

              -

              <%=intl._("Banned Peers")%>

              +

              <%=intl._t("Banned Peers")%>

              " /> <% profilesHelper.storeWriter(out); %> -

              <%=intl._("Banned IPs")%>

              +

              <%=intl._t("Banned IPs")%>


              diff --git a/apps/routerconsole/jsp/configreseed.jsp b/apps/routerconsole/jsp/configreseed.jsp index de2351e9e..ebc94b9c9 100644 --- a/apps/routerconsole/jsp/configreseed.jsp +++ b/apps/routerconsole/jsp/configreseed.jsp @@ -13,107 +13,107 @@ " /> -

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

              +

              <%=intl._t("I2P Reseeding Configuration")%>

              <%@include file="confignav.jsi" %> <%@include file="formhandler.jsi" %> -

              <%=intl._("Reseeding is the bootstrapping process used to find other routers when you first install I2P, or when your router has too few router references remaining.")%> -<%=intl._("If reseeding has failed, you should first check your network connection.")%> -<%=intl._("See {0} for instructions on reseeding manually.", "" + intl._("the FAQ") + "")%> +

              <%=intl._t("Reseeding is the bootstrapping process used to find other routers when you first install I2P, or when your router has too few router references remaining.")%> +<%=intl._t("If reseeding has failed, you should first check your network connection.")%> +<%=intl._t("See {0} for instructions on reseeding manually.", "" + intl._t("the FAQ") + "")%>

              -

              <%=intl._("Manual Reseed from URL")%>

              -

              <%=intl._("Enter zip or su3 URL")%> : +

              <%=intl._t("Manual Reseed from URL")%>

              +

              <%=intl._t("Enter zip or su3 URL")%> : -
              <%=intl._("The su3 format is preferred, as it will be verified as signed by a trusted source.")%> -<%=intl._("The zip format is unsigned; use a zip file only from a source that you trust.")%> +
              <%=intl._t("The su3 format is preferred, as it will be verified as signed by a trusted source.")%> +<%=intl._t("The zip format is unsigned; use a zip file only from a source that you trust.")%>

              -" /> +" />
              -

              <%=intl._("Manual Reseed from File")%>

              -

              <%=intl._("Select zip or su3 file")%> : +

              <%=intl._t("Manual Reseed from File")%>

              +

              <%=intl._t("Select zip or su3 file")%> : -
              <%=intl._("The su3 format is preferred, as it will be verified as signed by a trusted source.")%> -<%=intl._("The zip format is unsigned; use a zip file only from a source that you trust.")%> +
              <%=intl._t("The su3 format is preferred, as it will be verified as signed by a trusted source.")%> +<%=intl._t("The zip format is unsigned; use a zip file only from a source that you trust.")%>

              -" /> +" />
              -

              <%=intl._("Create Reseed File")%>

              -

              <%=intl._("Create a new reseed zip file you may share for others to reseed manually.")%> -<%=intl._("This file will never contain your own router's identity or IP.")%> +

              <%=intl._t("Create Reseed File")%>

              +

              <%=intl._t("Create a new reseed zip file you may share for others to reseed manually.")%> +<%=intl._t("This file will never contain your own router's identity or IP.")%>

              -" /> +" />
              -

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

              -

              <%=intl._("The default settings will work for most people.")%> -<%=intl._("Change these only if HTTPS is blocked by a restrictive firewall and reseed has failed.")%> +

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

              +

              <%=intl._t("The default settings will work for most people.")%> +<%=intl._t("Change these only if HTTPS is blocked by a restrictive firewall and reseed has failed.")%>

              - + - +<%=intl._t("Use non-SSL only")%> + - + - + - + - + - + - +
              <%=intl._("Reseed URL Selection")%>:
              <%=intl._t("Reseed URL Selection")%>: > -<%=intl._("Try SSL first then non-SSL")%>
              +<%=intl._t("Try SSL first then non-SSL")%>
              > -<%=intl._("Use SSL only")%>
              +<%=intl._t("Use SSL only")%>
              > -<%=intl._("Use non-SSL only")%>
              <%=intl._("Reseed URLs")%>:
              <%=intl._t("Reseed URLs")%>: -
              " />
              +
              " />
              <%=intl._("Enable HTTP Proxy?")%>
              <%=intl._t("Enable HTTP Proxy?")%> >
              <%=intl._("HTTP Proxy Host")%>:
              <%=intl._t("HTTP Proxy Host")%>: " >
              <%=intl._("HTTP Proxy Port")%>:
              <%=intl._t("HTTP Proxy Port")%>: " >
              <%=intl._("Use HTTP Proxy Authorization?")%>
              <%=intl._t("Use HTTP Proxy Authorization?")%> >
              <%=intl._("HTTP Proxy Username")%>:
              <%=intl._t("HTTP Proxy Username")%>: " >
              <%=intl._("HTTP Proxy Password")%>:
              <%=intl._t("HTTP Proxy Password")%>: " >
              -" /> -" /> -" /> +" /> +" /> +" />
              diff --git a/apps/routerconsole/jsp/configservice.jsp b/apps/routerconsole/jsp/configservice.jsp index f12c9b95c..987aefdeb 100644 --- a/apps/routerconsole/jsp/configservice.jsp +++ b/apps/routerconsole/jsp/configservice.jsp @@ -10,7 +10,7 @@ <%@include file="summary.jsi" %> -

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

              +

              <%=intl._t("I2P Service Configuration")%>

              <%@include file="confignav.jsi" %> @@ -19,63 +19,63 @@
              -

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

              -

              <%=intl._("Graceful shutdown lets the router satisfy the agreements it has already made before shutting down, but may take a few minutes.")%> - <%=intl._("If you need to kill the router immediately, that option is available as well.")%>

              +

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

              +

              <%=intl._t("Graceful shutdown lets the router satisfy the agreements it has already made before shutting down, but may take a few minutes.")%> + <%=intl._t("If you need to kill the router immediately, that option is available as well.")%>


              - " > - " > + " > + " > <% if (formhandler.shouldShowCancelGraceful()) { %> - " > + " > <% } %>
              <% if (System.getProperty("wrapper.version") != null) { %> -

              <%=intl._("If you want the router to restart itself after shutting down, you can choose one of the following.")%> - <%=intl._("This is useful in some situations - for example, if you changed some settings that client applications only read at startup, such as the routerconsole password or the interface it listens on.")%> - <%=intl._("A graceful restart will take a few minutes (but your peers will appreciate your patience), while a hard restart does so immediately.")%> - <%=intl._("After tearing down the router, it will wait 1 minute before starting back up again.")%>

              +

              <%=intl._t("If you want the router to restart itself after shutting down, you can choose one of the following.")%> + <%=intl._t("This is useful in some situations - for example, if you changed some settings that client applications only read at startup, such as the routerconsole password or the interface it listens on.")%> + <%=intl._t("A graceful restart will take a few minutes (but your peers will appreciate your patience), while a hard restart does so immediately.")%> + <%=intl._t("After tearing down the router, it will wait 1 minute before starting back up again.")%>


              - " > - " > + " > + " > <% } %>
              <% if ( (System.getProperty("os.name") != null) && (System.getProperty("os.name").startsWith("Win")) ) { %> -

              <%=intl._("Systray integration")%>

              -

              <%=intl._("On the windows platform, there is a small application to sit in the system tray, allowing you to view the router's status")%> - <%=intl._("(later on, I2P client applications will be able to integrate their own functionality into the system tray as well).")%> - <%=intl._("If you are on windows, you can either enable or disable that icon here.")%>

              +

              <%=intl._t("Systray integration")%>

              +

              <%=intl._t("On the windows platform, there is a small application to sit in the system tray, allowing you to view the router's status")%> + <%=intl._t("(later on, I2P client applications will be able to integrate their own functionality into the system tray as well).")%> + <%=intl._t("If you are on windows, you can either enable or disable that icon here.")%>


              - " > - " > + " > + " >
              -

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

              -

              <%=intl._("You can control whether I2P is run on startup or not by selecting one of the following options - I2P will install (or remove) a service accordingly.")%> - <%=intl._("If you prefer the command line, you can also run the ")%> install_i2p_service_winnt.bat (<%=intl._("or")%> +

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

              +

              <%=intl._t("You can control whether I2P is run on startup or not by selecting one of the following options - I2P will install (or remove) a service accordingly.")%> + <%=intl._t("If you prefer the command line, you can also run the ")%> install_i2p_service_winnt.bat (<%=intl._t("or")%> uninstall_i2p_service_winnt.bat).


              - " > -" >
              -

              <%=intl._("Note")%>: <%=intl._("If you are running I2P as service right now, removing it will shut down your router immediately.")%> - <%=intl._("You may want to consider shutting down gracefully, as above, then running uninstall_i2p_service_winnt.bat.")%>

              + " > +" >
              +

              <%=intl._t("Note")%>: <%=intl._t("If you are running I2P as service right now, removing it will shut down your router immediately.")%> + <%=intl._t("You may want to consider shutting down gracefully, as above, then running uninstall_i2p_service_winnt.bat.")%>

              <% } %> -

              <%=intl._("Debugging")%>

              -

              <%=intl._("View the job queue")%> +

              <%=intl._t("Debugging")%>

              +

              <%=intl._t("View the job queue")%> <% if (System.getProperty("wrapper.version") != null) { %> -

              <%=intl._("At times, it may be helpful to debug I2P by getting a thread dump. To do so, please select the following option and review the thread dumped to wrapper.log.")%>

              +

              <%=intl._t("At times, it may be helpful to debug I2P by getting a thread dump. To do so, please select the following option and review the thread dumped to wrapper.log.")%>


              <% } %>
              - " > + " > <% if (System.getProperty("wrapper.version") != null) { %> - " > + " > <% } %>
              -

              <%=intl._("Launch browser on router startup?")%>

              -

              <%=intl._("I2P's main configuration interface is this web console, so for your convenience I2P can launch a web browser on startup pointing at")%> +

              <%=intl._t("Launch browser on router startup?")%>

              +

              <%=intl._t("I2P's main configuration interface is this web console, so for your convenience I2P can launch a web browser on startup pointing at")%> http://127.0.0.1:7657/ .


              - " > - " > + " > + " >
              diff --git a/apps/routerconsole/jsp/configsidebar.jsp b/apps/routerconsole/jsp/configsidebar.jsp index 129feaa10..63c3ed18c 100644 --- a/apps/routerconsole/jsp/configsidebar.jsp +++ b/apps/routerconsole/jsp/configsidebar.jsp @@ -17,7 +17,7 @@ input.default { <%@include file="summary.jsi" %> -

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

              +

              <%=intl._t("I2P Summary Bar Configuration")%>

              <%@include file="confignav.jsi" %> @@ -29,23 +29,23 @@ input.default { " /> -

              <%=intl._("Refresh Interval")%>

              +

              <%=intl._t("Refresh Interval")%>

              " > - <%=intl._("seconds")%> - " > + <%=intl._t("seconds")%> + " >
              -

              <%=intl._("Customize Summary Bar")%>

              +

              <%=intl._t("Customize Summary Bar")%>

              - " > - " > + " > + " >
              diff --git a/apps/routerconsole/jsp/configstats.jsp b/apps/routerconsole/jsp/configstats.jsp index 4100a4b1e..802d615e5 100644 --- a/apps/routerconsole/jsp/configstats.jsp +++ b/apps/routerconsole/jsp/configstats.jsp @@ -61,7 +61,7 @@ function toggleAll(category) <%@include file="summary.jsi" %> -

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

              +

              <%=intl._t("I2P Stats Configuration")%>

              <%@include file="confignav.jsi" %> @@ -73,44 +73,44 @@ function toggleAll(category)
              -

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

              -

              <%=intl._("Enable full stats?")%> +

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

              +

              <%=intl._t("Enable full stats?")%> checked="checked" <% } %> > - (<%=intl._("change requires restart to take effect")%>)
              + (<%=intl._t("change requires restart to take effect")%>)
              <% // stats.log for devs only and grows without bounds, not recommended boolean shouldShowLog = statshelper.shouldShowLog(); if (shouldShowLog) { -%><%=intl._("Stat file")%>:
              +%><%=intl._t("Stat file")%>:
              Warning - Log with care, stat file grows without limit.
              <% } // shouldShowLog -%><%=intl._("Filter")%>: (<%=intl._("toggle all")%>)

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

              <% while (statshelper.hasMoreStats()) { while (statshelper.groupRequired()) { %> <% if (shouldShowLog) { -%> +%> <% } // shouldShowLog -%> +%> <% } // end iterating over required groups for the current stat %> @@ -139,14 +139,14 @@ Warning - Log with care, stat file grows without limit.
              %> - <% } // shouldShowLog %>
              > - <%=intl._(statshelper.getCurrentGroupName())%> - (<%=intl._("toggle all")%>) + <%=intl._t(statshelper.getCurrentGroupName())%> + (<%=intl._t("toggle all")%>)
              <%=intl._("Log")%><%=intl._t("Log")%><%=intl._("Graph")%><%=intl._t("Graph")%>
              <%=intl._("Advanced filter")%>: + <%=intl._t("Advanced filter")%>:
              -" > -" > +" > +" >
              diff --git a/apps/routerconsole/jsp/configtunnels.jsp b/apps/routerconsole/jsp/configtunnels.jsp index de82f0027..09a2ceee9 100644 --- a/apps/routerconsole/jsp/configtunnels.jsp +++ b/apps/routerconsole/jsp/configtunnels.jsp @@ -13,28 +13,28 @@ " /> -

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

              +

              <%=intl._t("I2P Tunnel Configuration")%>

              <%@include file="confignav.jsi" %> <%@include file="formhandler.jsi" %>

              - <%=intl._("NOTE")%>: - <%=intl._("The default settings work for most people.")%> - <%=intl._("There is a fundamental tradeoff between anonymity and performance.")%> - <%=intl._("Tunnels longer than 3 hops (for example 2 hops + 0-2 hops, 3 hops + 0-1 hops, 3 hops + 0-2 hops), or a high quantity + backup quantity, may severely reduce performance or reliability.")%> - <%=intl._("High CPU and/or high outbound bandwidth usage may result.")%> - <%=intl._("Change these settings with care, and adjust them if you have problems.")%> + <%=intl._t("NOTE")%>: + <%=intl._t("The default settings work for most people.")%> + <%=intl._t("There is a fundamental tradeoff between anonymity and performance.")%> + <%=intl._t("Tunnels longer than 3 hops (for example 2 hops + 0-2 hops, 3 hops + 0-1 hops, 3 hops + 0-2 hops), or a high quantity + backup quantity, may severely reduce performance or reliability.")%> + <%=intl._t("High CPU and/or high outbound bandwidth usage may result.")%> + <%=intl._t("Change these settings with care, and adjust them if you have problems.")%>

              - <%=intl._("Note")%>: <%=intl._("Exploratory tunnel setting changes are stored in the router.config file.")%> - <%=intl._("Client tunnel changes are temporary and are not saved.")%> -<%=intl._("To make permanent client tunnel changes see the")%> <%=intl._("i2ptunnel page")%>. + <%=intl._t("Note")%>: <%=intl._t("Exploratory tunnel setting changes are stored in the router.config file.")%> + <%=intl._t("Client tunnel changes are temporary and are not saved.")%> +<%=intl._t("To make permanent client tunnel changes see the")%> <%=intl._t("i2ptunnel page")%>.
              -" > -" > +" > +" >
              diff --git a/apps/routerconsole/jsp/configui.jsp b/apps/routerconsole/jsp/configui.jsp index 7635ab1e3..73d0ec565 100644 --- a/apps/routerconsole/jsp/configui.jsp +++ b/apps/routerconsole/jsp/configui.jsp @@ -22,14 +22,14 @@ input.default { " /> -

              <%=uihelper._("I2P UI Configuration")%>

              +

              <%=uihelper._t("I2P UI Configuration")%>

              <%@include file="confignav.jsi" %> <%@include file="formhandler.jsi" %> -

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

              +

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

              @@ -40,28 +40,28 @@ input.default { %> <% } else { %> -<%=uihelper._("Theme selection disabled for Internet Explorer, sorry.")%> +<%=uihelper._t("Theme selection disabled for Internet Explorer, sorry.")%>
              -<%=uihelper._("If you're not using IE, it's likely that your browser is pretending to be IE; please configure your browser (or proxy) to use a different User Agent string if you'd like to access the console themes.")%> +<%=uihelper._t("If you're not using IE, it's likely that your browser is pretending to be IE; please configure your browser (or proxy) to use a different User Agent string if you'd like to access the console themes.")%> <% } %> -

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

              +

              <%=uihelper._t("Router Console Language")%>

              -

              <%=uihelper._("Please contribute to the router console translation project! Contact the developers in #i2p-dev on IRC to help.")%> +

              <%=uihelper._t("Please contribute to the router console translation project! Contact the developers in #i2p-dev on IRC to help.")%>


              -" > -" > +" > +" >
              -

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

              +

              <%=uihelper._t("Router Console Password")%>

              - " > - " > - " > - " > + " > + " > + " > + " >
              diff --git a/apps/routerconsole/jsp/configupdate.jsp b/apps/routerconsole/jsp/configupdate.jsp index 1171fbcab..e1e073404 100644 --- a/apps/routerconsole/jsp/configupdate.jsp +++ b/apps/routerconsole/jsp/configupdate.jsp @@ -11,7 +11,7 @@ <%@include file="summary.jsi" %> -

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

              +

              <%=intl._t("I2P Update Configuration")%>

              <%@include file="confignav.jsi" %> @@ -27,57 +27,57 @@ <% /* set hidden default */ %> <% if (updatehelper.canInstall()) { %> -

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

              +

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

              - + <% } else { %> -

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

              +

              <%=intl._t("Check for news updates")%>

              <%=intl._("News & I2P Updates")%>:
              <%=intl._t("News & I2P Updates")%>:
              - + <% } // if canInstall %> - - + - <% if (updatehelper.canInstall()) { %> - + <% } // if canInstall %> - + - + <% if (updatehelper.isAdvanced()) { %> - + - + <% } // if isAdvanced %> <% if (updatehelper.canInstall()) { %> <% if (updatehelper.isAdvanced()) { %> - + - + - + - + - + - + <% } // if isAdvanced %> <% } else { %> - + <% } // if canInstall %>
              <%=intl._("News Updates")%>:
              <%=intl._t("News Updates")%>: <% if ("true".equals(System.getProperty("net.i2p.router.web.UpdateHandler.updateInProgress", "false"))) { %> <%=intl._("Update In Progress")%>
              <% } else { %> " /> +
              <% if ("true".equals(System.getProperty("net.i2p.router.web.UpdateHandler.updateInProgress", "false"))) { %> <%=intl._t("Update In Progress")%>
              <% } else { %> " /> <% } %>

              <%=intl._("News URL")%>:
              <%=intl._t("News URL")%>: readonly="readonly"<% } %> value="">
              <%=intl._("Refresh frequency")%>: +
              <%=intl._t("Refresh frequency")%>:
              <%=formhandler._("Update policy")%>:
              <%=formhandler._t("Update policy")%>:
              <%=intl._("Fetch news through the eepProxy?")%>
              <%=intl._t("Fetch news through the eepProxy?")%>
              <%=intl._("Update through the eepProxy?")%>
              <%=intl._t("Update through the eepProxy?")%>
              <%=intl._("eepProxy host")%>:
              <%=intl._t("eepProxy host")%>: " />
              <%=intl._("eepProxy port")%>:
              <%=intl._t("eepProxy port")%>: " />
              <%=intl._("Update URLs")%>:
              <%=intl._t("Update URLs")%>:
              <%=intl._("Trusted keys")%>:
              <%=intl._t("Trusted keys")%>:
              <%=intl._("Update with signed development builds?")%>
              <%=intl._t("Update with signed development builds?")%>
              <%=intl._("Signed Build URL")%>:
              <%=intl._t("Signed Build URL")%>: ">
              <%=intl._("Update with unsigned development builds?")%>
              <%=intl._t("Update with unsigned development builds?")%>
              <%=intl._("Unsigned Build URL")%>:
              <%=intl._t("Unsigned Build URL")%>: ">
              <%=intl._("Updates will be dispatched via your package manager.")%>
              <%=intl._t("Updates will be dispatched via your package manager.")%>
              - " > - " > + " > + " >
              diff --git a/apps/routerconsole/jsp/console.jsp b/apps/routerconsole/jsp/console.jsp index ffed509dd..1cff1e369 100644 --- a/apps/routerconsole/jsp/console.jsp +++ b/apps/routerconsole/jsp/console.jsp @@ -15,7 +15,7 @@ <%@include file="summary.jsi" %> -

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

              +

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

              <% if (newshelper.shouldShowNews()) { @@ -61,7 +61,7 @@ Tiếng Việt
              -

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

              +

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

              <% java.io.File fpath = new java.io.File(net.i2p.I2PAppContext.getGlobalContext().getBaseDir(), "docs/readme.html"); %> diff --git a/apps/routerconsole/jsp/dns.jsp b/apps/routerconsole/jsp/dns.jsp index 8080c115b..23a353416 100644 --- a/apps/routerconsole/jsp/dns.jsp +++ b/apps/routerconsole/jsp/dns.jsp @@ -30,11 +30,11 @@ <%@include file="summary.jsi" %> -

              <%=intl._("I2P Addressbook")%> ">images/newtab.png" />

              +

              <%=intl._t("I2P Addressbook")%> ">images/newtab.png" />

              <% diff --git a/apps/routerconsole/jsp/error.jsp b/apps/routerconsole/jsp/error.jsp index 5dfba993e..663b61431 100644 --- a/apps/routerconsole/jsp/error.jsp +++ b/apps/routerconsole/jsp/error.jsp @@ -25,6 +25,6 @@ <%@include file="summary.jsi" %>

              <%=ERROR_CODE%> <%=ERROR_MESSAGE%>

              -<%=intl._("Sorry! You appear to be requesting a non-existent Router Console page or resource.")%>
              -<%=intl._("Error 404")%>: <%=ERROR_URI%> <%=intl._("not found")%>. +<%=intl._t("Sorry! You appear to be requesting a non-existent Router Console page or resource.")%>
              +<%=intl._t("Error 404")%>: <%=ERROR_URI%> <%=intl._t("not found")%>.
              diff --git a/apps/routerconsole/jsp/error500.jsp b/apps/routerconsole/jsp/error500.jsp index 223b4d5de..c56b1f7ea 100644 --- a/apps/routerconsole/jsp/error500.jsp +++ b/apps/routerconsole/jsp/error500.jsp @@ -22,26 +22,26 @@

              <%=ERROR_CODE%> <%=ERROR_MESSAGE%>

              -<%=intl._("Sorry! There has been an internal error.")%> +<%=intl._t("Sorry! There has been an internal error.")%>

              <% /* note to translators - both parameters are URLs */ -%><%=intl._("Please report bugs on {0} or {1}.", +%><%=intl._t("Please report bugs on {0} or {1}.", "trac.i2p2.i2p", "trac.i2p2.de")%> -

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

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

              -

              <%=intl._("Error Details")%>

              +

              <%=intl._t("Error Details")%>

              -<%=intl._("Error {0}", ERROR_CODE)%>: <%=ERROR_URI%> <%=ERROR_MESSAGE%> +<%=intl._t("Error {0}", ERROR_CODE)%>: <%=ERROR_URI%> <%=ERROR_MESSAGE%>

              <% if (ERROR_THROWABLE != null) { @@ -56,7 +56,7 @@ } %>

              -

              <%=intl._("I2P Version and Running Environment")%>

              +

              <%=intl._t("I2P Version and Running Environment")%>

              I2P version: <%=net.i2p.router.RouterVersion.FULL_VERSION%>
              Java version: <%=System.getProperty("java.vendor")%> <%=System.getProperty("java.version")%> (<%=System.getProperty("java.runtime.name")%> <%=System.getProperty("java.runtime.version")%>)
              @@ -71,5 +71,5 @@ Jbigi: <%=net.i2p.util.NativeBigInteger.loadStatus()%>
              Encoding: <%=System.getProperty("file.encoding")%>
              Charset: <%=java.nio.charset.Charset.defaultCharset().name()%>

              -

              <%=intl._("Note that system information, log timestamps, and log messages may provide clues to your location; please review everything you include in a bug report.")%>

              +

              <%=intl._t("Note that system information, log timestamps, and log messages may provide clues to your location; please review everything you include in a bug report.")%>

              diff --git a/apps/routerconsole/jsp/events.jsp b/apps/routerconsole/jsp/events.jsp index b67aa5dd5..29838e7a7 100644 --- a/apps/routerconsole/jsp/events.jsp +++ b/apps/routerconsole/jsp/events.jsp @@ -18,7 +18,7 @@ <%@include file="summaryajax.jsi" %> <%@include file="summary.jsi" %> -

              <%=intl._("I2P Event Log")%>

              +

              <%=intl._t("I2P Event Log")%>

              diff --git a/apps/routerconsole/jsp/graph.jsp b/apps/routerconsole/jsp/graph.jsp index 92c6f508f..1d5c5bf1f 100644 --- a/apps/routerconsole/jsp/graph.jsp +++ b/apps/routerconsole/jsp/graph.jsp @@ -16,7 +16,7 @@ <%@include file="summaryajax.jsi" %> <%@include file="summary.jsi" %> -

              <%=intl._("I2P Performance Graphs")%>

              +

              <%=intl._t("I2P Performance Graphs")%>

              diff --git a/apps/routerconsole/jsp/graphs.jsp b/apps/routerconsole/jsp/graphs.jsp index 8d4aff752..6cde50131 100644 --- a/apps/routerconsole/jsp/graphs.jsp +++ b/apps/routerconsole/jsp/graphs.jsp @@ -23,7 +23,7 @@ <%@include file="summaryajax.jsi" %> <%@include file="summary.jsi" %> -

              <%=intl._("I2P Performance Graphs")%>

              +

              <%=intl._t("I2P Performance Graphs")%>

              diff --git a/apps/routerconsole/jsp/home.jsp b/apps/routerconsole/jsp/home.jsp index 8553e56e6..ec00c6b08 100644 --- a/apps/routerconsole/jsp/home.jsp +++ b/apps/routerconsole/jsp/home.jsp @@ -23,12 +23,12 @@ -

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

              +

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

              <% if (newshelper.shouldShowNews()) { @@ -57,7 +57,7 @@ " /> <% if (homehelper.shouldShowWelcome()) { %> -
              "> +
              ">
              English عربية @@ -87,7 +87,7 @@ Українська Tiếng Việt
              -

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

              +

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

              <% } // shouldShowWelcome %> @@ -100,7 +100,7 @@ - - - + + + - + @@ -172,8 +172,8 @@ ${book.loadBookMessages}

              -" > -" > +" > +" >

              @@ -188,14 +188,14 @@ ${book.loadBookMessages} -" /> +" />

              <% /* book.notEmpty */ %>
              -

              <%=intl._("This address book is empty.")%>

              +

              <%=intl._t("This address book is empty.")%>

              @@ -204,16 +204,16 @@ ${book.loadBookMessages}
              -

              <%=intl._("Add new destination")%>:

              +

              <%=intl._t("Add new destination")%>:

              -<%=intl._("Host Name")%> +<%=intl._t("Host Name")%>
              -<%=intl._("Destination")%> +<%=intl._t("Destination")%>

              -" > -" > -" > +" > +" > +" >

              diff --git a/apps/susidns/src/jsp/config.jsp b/apps/susidns/src/jsp/config.jsp index 6a650d3f5..27e57a6e9 100644 --- a/apps/susidns/src/jsp/config.jsp +++ b/apps/susidns/src/jsp/config.jsp @@ -44,24 +44,24 @@ -<%=intl._("configuration")%> - susidns +<%=intl._t("configuration")%> - susidns


              @@ -74,65 +74,65 @@
              -" > -" > +" > +" >
              -

              <%=intl._("Hints")%>

              +

              <%=intl._t("Hints")%>

              1. -<%=intl._("File and directory paths here are relative to the addressbook's working directory, which is normally ~/.i2p/addressbook/ (Linux) or %APPDATA%\\I2P\\addressbook\\ (Windows).")%> +<%=intl._t("File and directory paths here are relative to the addressbook's working directory, which is normally ~/.i2p/addressbook/ (Linux) or %APPDATA%\\I2P\\addressbook\\ (Windows).")%>
              2. -<%=intl._("If you want to manually add lines to an addressbook, add them to the private or master addressbooks.")%> -<%=intl._("The router addressbook and the published addressbook are updated by the addressbook application.")%> +<%=intl._t("If you want to manually add lines to an addressbook, add them to the private or master addressbooks.")%> +<%=intl._t("The router addressbook and the published addressbook are updated by the addressbook application.")%>
              3. -<%=intl._("When you publish your addressbook, ALL destinations from the master and router addressbooks appear there.")%> -<%=intl._("Use the private addressbook for private destinations, these are not published.")%> +<%=intl._t("When you publish your addressbook, ALL destinations from the master and router addressbooks appear there.")%> +<%=intl._t("Use the private addressbook for private destinations, these are not published.")%>
              -

              <%=intl._("Options")%>

              +

              <%=intl._t("Options")%>

              • subscriptions - -<%=intl._("File containing the list of subscriptions URLs (no need to change)")%> +<%=intl._t("File containing the list of subscriptions URLs (no need to change)")%>
              • update_delay - -<%=intl._("Update interval in hours")%> +<%=intl._t("Update interval in hours")%>
              • published_addressbook - -<%=intl._("Your public hosts.txt file (choose a path within your webserver document root)")%> +<%=intl._t("Your public hosts.txt file (choose a path within your webserver document root)")%>
              • router_addressbook - -<%=intl._("Your hosts.txt (don't change)")%> +<%=intl._t("Your hosts.txt (don't change)")%>
              • master_addressbook - -<%=intl._("Your personal addressbook, these hosts will be published")%> +<%=intl._t("Your personal addressbook, these hosts will be published")%>
              • private_addressbook - -<%=intl._("Your private addressbook, it is never published")%> +<%=intl._t("Your private addressbook, it is never published")%>
              • proxy_port - -<%=intl._("Port for your eepProxy (no need to change)")%> +<%=intl._t("Port for your eepProxy (no need to change)")%>
              • proxy_host - -<%=intl._("Hostname for your eepProxy (no need to change)")%> +<%=intl._t("Hostname for your eepProxy (no need to change)")%>
              • should_publish - -<%=intl._("Whether to update the published addressbook")%> +<%=intl._t("Whether to update the published addressbook")%>
              • etags - -<%=intl._("File containing the etags header from the fetched subscription URLs (no need to change)")%> +<%=intl._t("File containing the etags header from the fetched subscription URLs (no need to change)")%>
              • last_modified - -<%=intl._("File containing the modification timestamp for each fetched subscription URL (no need to change)")%> +<%=intl._t("File containing the modification timestamp for each fetched subscription URL (no need to change)")%>
              • log - -<%=intl._("File to log activity to (change to /dev/null if you like)")%> +<%=intl._t("File to log activity to (change to /dev/null if you like)")%>
              • theme - -<%=intl._("Name of the theme to use (defaults to 'light')")%> +<%=intl._t("Name of the theme to use (defaults to 'light')")%>
              diff --git a/apps/susidns/src/jsp/details.jsp b/apps/susidns/src/jsp/details.jsp index 9334e43ca..a5660b677 100644 --- a/apps/susidns/src/jsp/details.jsp +++ b/apps/susidns/src/jsp/details.jsp @@ -42,31 +42,31 @@ -${book.book} <%=intl._("addressbook")%> - susidns +${book.book} <%=intl._t("addressbook")%> - susidns


              -

              <%=intl._("Address book")%>: <%=intl._(book.getBook())%>

              -

              <%=intl._("Storage")%>: ${book.displayName}

              +

              <%=intl._t("Address book")%>: <%=intl._t(book.getBook())%>

              +

              <%=intl._t("Storage")%>: ${book.displayName}

              @@ -85,49 +85,49 @@ - + <% if (addr.isIDN()) { %> - + <% } %> - + - + - - + + - - + + - + - + - + - + - + - + - +
              <%=intl._("Host Name")%><%=intl._t("Host Name")%> <%=addr.getDisplayName()%>
              <%=intl._("Encoded Name")%><%=intl._t("Encoded Name")%> <%=addr.getName()%>
              <%=intl._("Base 32 Address")%><%=intl._t("Base 32 Address")%> <%=b32%>
              <%=intl._("Base 64 Hash")%><%=intl._t("Base 64 Hash")%> <%=addr.getB64()%>
              <%=intl._("Address Helper")%><%=intl._("link")%><%=intl._t("Address Helper")%><%=intl._t("link")%>
              <%=intl._("Public Key")%><%=intl._("ElGamal 2048 bit")%><%=intl._t("Public Key")%><%=intl._t("ElGamal 2048 bit")%>
              <%=intl._("Signing Key")%><%=intl._t("Signing Key")%> <%=addr.getSigType()%>
              <%=intl._("Certificate")%><%=intl._t("Certificate")%> <%=addr.getCert()%>
              <%=intl._("Added Date")%><%=intl._t("Added Date")%> <%=addr.getAdded()%>
              <%=intl._("Source")%><%=intl._t("Source")%> <%=addr.getSource()%>
              <%=intl._("Last Modified")%><%=intl._t("Last Modified")%> <%=addr.getModded()%>
              <%=intl._("Notes")%><%=intl._t("Notes")%> <%=addr.getNotes()%>
              <%=intl._("Destination")%><%=intl._t("Destination")%>
              @@ -138,7 +138,7 @@ -" > +" >

              diff --git a/apps/susidns/src/jsp/index.jsp b/apps/susidns/src/jsp/index.jsp index 505beeec7..67c96c680 100644 --- a/apps/susidns/src/jsp/index.jsp +++ b/apps/susidns/src/jsp/index.jsp @@ -42,7 +42,7 @@ -<%=intl._("Introduction")%> - SusiDNS +<%=intl._t("Introduction")%> - SusiDNS @@ -53,39 +53,39 @@

              -

              <%=intl._("What is the addressbook?")%>

              +

              <%=intl._t("What is the addressbook?")%>

              -<%=intl._("The addressbook application is part of your I2P installation.")%> -<%=intl._("It regularly updates your hosts.txt file from distributed sources or \"subscriptions\".")%> +<%=intl._t("The addressbook application is part of your I2P installation.")%> +<%=intl._t("It regularly updates your hosts.txt file from distributed sources or \"subscriptions\".")%>

              -<%=intl._("In the default configuration, the address book is only subscribed to {0}.", "i2p-projekt.i2p")%> -<%=intl._("Subscribing to additional sites is easy, just add them to your subscriptions file.")%> +<%=intl._t("In the default configuration, the address book is only subscribed to {0}.", "i2p-projekt.i2p")%> +<%=intl._t("Subscribing to additional sites is easy, just add them to your subscriptions file.")%>

              -<%=intl._("For more information on naming in I2P, see the overview.")%> +<%=intl._t("For more information on naming in I2P, see the overview.")%>

              -

              <%=intl._("How does the addressbook application work?")%>

              +

              <%=intl._t("How does the addressbook application work?")%>

              -<%=intl._("The addressbook application regularly polls your subscriptions and merges their content into your \"router\" address book.")%> -<%=intl._("Then it merges your \"master\" address book into the router address book as well.")%> -<%=intl._("If configured, the router address book is now written to the \"published\" address book, which will be publicly available if you are running an eepsite.")%> +<%=intl._t("The addressbook application regularly polls your subscriptions and merges their content into your \"router\" address book.")%> +<%=intl._t("Then it merges your \"master\" address book into the router address book as well.")%> +<%=intl._t("If configured, the router address book is now written to the \"published\" address book, which will be publicly available if you are running an eepsite.")%>

              -<%=intl._("The router also uses a private address book (not shown in the picture), which is not merged or published.")%> -<%=intl._("Hosts in the private address book can be accessed by you but their addresses are never distributed to others.")%> -<%=intl._("The private address book can also be used for aliases of hosts in your other address books.")%> +<%=intl._t("The router also uses a private address book (not shown in the picture), which is not merged or published.")%> +<%=intl._t("Hosts in the private address book can be accessed by you but their addresses are never distributed to others.")%> +<%=intl._t("The private address book can also be used for aliases of hosts in your other address books.")%>

              address book working scheme
              diff --git a/apps/susidns/src/jsp/subscriptions.jsp b/apps/susidns/src/jsp/subscriptions.jsp index db588c6a8..25ec21261 100644 --- a/apps/susidns/src/jsp/subscriptions.jsp +++ b/apps/susidns/src/jsp/subscriptions.jsp @@ -43,24 +43,24 @@ -<%=intl._("subscriptions")%> - susidns +<%=intl._t("subscriptions")%> - susidns


              @@ -73,18 +73,18 @@
              -" > -" > +" > +" >

              -<%=intl._("The subscription file contains a list of i2p URLs.")%> -<%=intl._("The addressbook application regularly checks this list for new eepsites.")%> -<%=intl._("Those URLs refer to published hosts.txt files.")%> -<%=intl._("The default subscription is the hosts.txt from {0}, which is updated infrequently.", "i2p-projekt.i2p")%> -<%=intl._("So it is a good idea to add additional subscriptions to sites that have the latest addresses.")%> -<%=intl._("See the FAQ for a list of subscription URLs.")%> +<%=intl._t("The subscription file contains a list of i2p URLs.")%> +<%=intl._t("The addressbook application regularly checks this list for new eepsites.")%> +<%=intl._t("Those URLs refer to published hosts.txt files.")%> +<%=intl._t("The default subscription is the hosts.txt from {0}, which is updated infrequently.", "i2p-projekt.i2p")%> +<%=intl._t("So it is a good idea to add additional subscriptions to sites that have the latest addresses.")%> +<%=intl._t("See the FAQ for a list of subscription URLs.")%>

              " + _t("No messages") + "
              "); if (i > 0) { out.println( "

              "); if( sessionObject.reallyDelete ) { // TODO ngettext - out.println("

              " + _("Really delete the marked messages?") + - "

              " + button( REALLYDELETE, _("Yes, really delete them!") ) + - "
              " + button( CLEAR, _("Cancel"))); + out.println("

              " + _t("Really delete the marked messages?") + + "

              " + button( REALLYDELETE, _t("Yes, really delete them!") ) + + "
              " + button( CLEAR, _t("Cancel"))); } else { - out.println(button( DELETE, _("Delete Selected") ) + "
              "); + out.println(button( DELETE, _t("Delete Selected") ) + "
              "); out.print( - button( MARKALL, _("Mark All") ) + + button( MARKALL, _t("Mark All") ) + " " + - button( CLEAR, _("Clear All") )); + button( CLEAR, _t("Clear All") )); //"
              " + - //button( INVERT, _("Invert Selection") ) + + //button( INVERT, _t("Invert Selection") ) + //"
              "); } out.print("
              "); // moved to config page //out.print( - // _("Page Size") + ": " + + // _t("Page Size") + ": " + // " " + - // button( SETPAGESIZE, _("Set") ) ); + // button( SETPAGESIZE, _t("Set") ) ); out.print("
              "); - out.print(button(CONFIGURE, _("Settings"))); + out.print(button(CONFIGURE, _t("Settings"))); out.println("
              "); @@ -2303,14 +2303,14 @@ public class WebMail extends HttpServlet out.println( "
              " + ( folder.isFirstPage() ? - button2( FIRSTPAGE, _("First") ) + " " + button2( PREVPAGE, _("Previous") ) : - button( FIRSTPAGE, _("First") ) + " " + button( PREVPAGE, _("Previous") ) ) + + button2( FIRSTPAGE, _t("First") ) + " " + button2( PREVPAGE, _t("Previous") ) : + button( FIRSTPAGE, _t("First") ) + " " + button( PREVPAGE, _t("Previous") ) ) + "      " + - _("Page {0} of {1}", folder.getCurrentPage(), folder.getPages()) + + _t("Page {0} of {1}", folder.getCurrentPage(), folder.getPages()) + "      " + ( folder.isLastPage() ? - button2( NEXTPAGE, _("Next") ) + " " + button2( LASTPAGE, _("Last") ) : - button( NEXTPAGE, _("Next") ) + " " + button( LASTPAGE, _("Last") ) ) + button2( NEXTPAGE, _t("Next") ) + " " + button2( LASTPAGE, _t("Last") ) : + button( NEXTPAGE, _t("Next") ) + " " + button( LASTPAGE, _t("Last") ) ) ); } @@ -2322,7 +2322,7 @@ public class WebMail extends HttpServlet private static void showMessage( PrintWriter out, SessionObject sessionObject ) { if( sessionObject.reallyDelete ) { - out.println( "

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

              " ); + out.println( "

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

              " ); } Mail mail = sessionObject.mailCache.getMail( sessionObject.showUIDL, MailCache.FetchMode.ALL ); if(!RELEASE && mail != null && mail.hasBody()) { @@ -2334,31 +2334,31 @@ public class WebMail extends HttpServlet out.println( "-->" ); } out.println("
              "); - out.println( button( NEW, _("New") ) + spacer + - button( REPLY, _("Reply") ) + - button( REPLYALL, _("Reply All") ) + - button( FORWARD, _("Forward") ) + spacer + - button( SAVE_AS, _("Save As") ) + spacer); + out.println( button( NEW, _t("New") ) + spacer + + button( REPLY, _t("Reply") ) + + button( REPLYALL, _t("Reply All") ) + + button( FORWARD, _t("Forward") ) + spacer + + button( SAVE_AS, _t("Save As") ) + spacer); if (sessionObject.reallyDelete) - out.println(button2(DELETE, _("Delete"))); + out.println(button2(DELETE, _t("Delete"))); else - out.println(button(DELETE, _("Delete"))); + out.println(button(DELETE, _t("Delete"))); out.println("
              " + - ( sessionObject.folder.isFirstElement( sessionObject.showUIDL ) ? button2( PREV, _("Previous") ) : button( PREV, _("Previous") ) ) + spacer + - button( LIST, _("Back to Folder") ) + spacer + - ( sessionObject.folder.isLastElement( sessionObject.showUIDL ) ? button2( NEXT, _("Next") ) : button( NEXT, _("Next") ) )); + ( sessionObject.folder.isFirstElement( sessionObject.showUIDL ) ? button2( PREV, _t("Previous") ) : button( PREV, _t("Previous") ) ) + spacer + + button( LIST, _t("Back to Folder") ) + spacer + + ( sessionObject.folder.isLastElement( sessionObject.showUIDL ) ? button2( NEXT, _t("Next") ) : button( NEXT, _t("Next") ) )); out.println("
              "); //if (Config.hasConfigFile()) - // out.println(button( RELOAD, _("Reload Config") ) + spacer); - //out.println(button( LOGOUT, _("Logout") ) ); + // out.println(button( RELOAD, _t("Reload Config") ) + spacer); + //out.println(button( LOGOUT, _t("Logout") ) ); if( mail != null ) { out.println( "\n" + "\n" + - "\n" + - "\n" + - "\n" + "" ); if( mail.hasPart()) { @@ -2366,11 +2366,11 @@ public class WebMail extends HttpServlet showPart( out, mail.getPart(), 0, SHOW_HTML ); } else { - out.println( "" ); + out.println( "" ); } } else { - out.println( "" ); + out.println( "" ); } out.println( "\n

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

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

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

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

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


              " ); } @@ -2388,13 +2388,13 @@ public class WebMail extends HttpServlet sz = Config.getProperty(Folder.PAGESIZE, Folder.DEFAULT_PAGESIZE); out.println("
              "); out.println( - _("Folder Page Size") + ": " + " " + - button( SETPAGESIZE, _("Set") ) ); + button( SETPAGESIZE, _t("Set") ) ); out.println("

              "); out.println("

              "); - out.print(_("Advanced Configuration")); + out.print(_t("Advanced Configuration")); Properties config = Config.getProperties(); out.print(":

              "); out.println("
              "); out.println("
              "); - out.println(button(SAVE, _("Save Configuration"))); - out.println(button(CANCEL, _("Cancel"))); + out.println(button(SAVE, _t("Save Configuration"))); + out.println(button(CANCEL, _t("Cancel"))); out.println("
              "); } /** translate */ - private static String _(String s) { + private static String _t(String s) { return Messages.getString(s); } /** translate */ - private static String _(String s, Object o) { + private static String _t(String s, Object o) { return Messages.getString(s, o); } /** translate */ - private static String _(String s, Object o, Object o2) { + private static String _t(String s, Object o, Object o2) { return Messages.getString(s, o, o2); } diff --git a/apps/susimail/src/src/i2p/susi/webmail/pop3/POP3MailBox.java b/apps/susimail/src/src/i2p/susi/webmail/pop3/POP3MailBox.java index f688ddc16..5ed201827 100644 --- a/apps/susimail/src/src/i2p/susi/webmail/pop3/POP3MailBox.java +++ b/apps/susimail/src/src/i2p/susi/webmail/pop3/POP3MailBox.java @@ -99,7 +99,7 @@ public class POP3MailBox implements NewMailListener { sizes = new HashMap(); synchronizer = new Object(); // this appears in the UI so translate - lastLine = _("No response from server"); + lastLine = _t("No response from server"); lastActive = new AtomicLong(System.currentTimeMillis()); lastChecked = new AtomicLong(); delayedDeleter = new DelayedDeleter(this); @@ -665,15 +665,15 @@ public class POP3MailBox implements NewMailListener { idleCloser = new IdleCloser(this); } else { if (lastError.equals("")) - lastError = _("Error connecting to server"); + lastError = _t("Error connecting to server"); close(); } } catch (NumberFormatException e1) { - lastError = _("Error opening mailbox") + ": " + e1; + lastError = _t("Error opening mailbox") + ": " + e1; } catch (IOException e1) { - lastError = _("Error opening mailbox") + ": " + e1.getLocalizedMessage(); + lastError = _t("Error opening mailbox") + ": " + e1.getLocalizedMessage(); } } } @@ -748,7 +748,7 @@ public class POP3MailBox implements NewMailListener { } } else { Debug.debug(Debug.DEBUG, "sendCmd1a: (" + cmd + ") NO RESPONSE"); - lastError = _("No response from server"); + lastError = _t("No response from server"); throw new IOException(lastError); } return result; @@ -790,7 +790,7 @@ public class POP3MailBox implements NewMailListener { String foo = DataHelper.readLine(in); updateActivity(); if (foo == null) { - lastError = _("No response from server"); + lastError = _t("No response from server"); throw new IOException(lastError); } sr.response = foo.trim(); @@ -1022,7 +1022,7 @@ public class POP3MailBox implements NewMailListener { e = e.substring(5); // translate this common error if (e.trim().equals("Login failed.")) - e = _("Login failed"); + e = _t("Login failed"); return e; } @@ -1257,7 +1257,7 @@ public class POP3MailBox implements NewMailListener { } /** translate */ - private static String _(String s) { + private static String _t(String s) { return Messages.getString(s); } } diff --git a/apps/susimail/src/src/i2p/susi/webmail/smtp/SMTPClient.java b/apps/susimail/src/src/i2p/susi/webmail/smtp/SMTPClient.java index f3f755698..046dcbef5 100644 --- a/apps/susimail/src/src/i2p/susi/webmail/smtp/SMTPClient.java +++ b/apps/susimail/src/src/i2p/susi/webmail/smtp/SMTPClient.java @@ -211,7 +211,7 @@ public class SMTPClient { try { socket = new Socket( host, port ); } catch (Exception e) { - error += _("Cannot connect") + ": " + e.getMessage() + '\n'; + error += _t("Cannot connect") + ": " + e.getMessage() + '\n'; ok = false; } try { @@ -222,7 +222,7 @@ public class SMTPClient { socket.setSoTimeout(120*1000); int result = sendCmd(null); if (result != 220) { - error += _("Server refused connection") + " (" + result + ")\n"; + error += _t("Server refused connection") + " (" + result + ")\n"; ok = false; } } @@ -234,7 +234,7 @@ public class SMTPClient { if (r.result == 250) { supportsPipelining = r.recv.contains("PIPELINING"); } else { - error += _("Server refused connection") + " (" + r.result + ")\n"; + error += _t("Server refused connection") + " (" + r.result + ")\n"; ok = false; } } @@ -246,7 +246,7 @@ public class SMTPClient { cmds.add(new SendExpect(base64.encode(user), 334)); cmds.add(new SendExpect(base64.encode(pass), 235)); if (sendCmds(cmds) != 3) { - error += _("Login failed") + '\n'; + error += _t("Login failed") + '\n'; ok = false; } } @@ -259,7 +259,7 @@ public class SMTPClient { cmds.add(new SendExpect("DATA", 354)); if (sendCmds(cmds) != cmds.size()) { // TODO which recipient? - error += _("Mail rejected") + '\n'; + error += _t("Mail rejected") + '\n'; ok = false; } } @@ -273,10 +273,10 @@ public class SMTPClient { if (result == 250) mailSent = true; else - error += _("Error sending mail") + " (" + result + ")\n"; + error += _t("Error sending mail") + " (" + result + ")\n"; } } catch (IOException e) { - error += _("Error sending mail") + ": " + e.getMessage() + '\n'; + error += _t("Error sending mail") + ": " + e.getMessage() + '\n'; } catch (EncodingException e) { error += e.getMessage(); @@ -324,7 +324,7 @@ public class SMTPClient { } /** translate */ - private static String _(String s) { + private static String _t(String s) { return Messages.getString(s); } } diff --git a/core/java/src/net/i2p/data/DataHelper.java b/core/java/src/net/i2p/data/DataHelper.java index f35a6ddb6..352529a6e 100644 --- a/core/java/src/net/i2p/data/DataHelper.java +++ b/core/java/src/net/i2p/data/DataHelper.java @@ -1546,7 +1546,7 @@ public class DataHelper { // years t = ngettext("1 year", "{0} years", (int) (ms / (365L * 24 * 60 * 60 * 1000))); } else { - return _("n/a"); + return _t("n/a"); } // Replace minus sign to work around // bug in Chrome (and IE?), line breaks at the minus sign @@ -1593,7 +1593,7 @@ public class DataHelper { // years t = ngettext("1 year", "{0} years", (int) (ms / (365L * 24 * 60 * 60 * 1000))); } else { - return _("n/a"); + return _t("n/a"); } if (ms < 0) t = t.replace("-", "−"); @@ -1602,7 +1602,7 @@ public class DataHelper { private static final String BUNDLE_NAME = "net.i2p.router.web.messages"; - private static String _(String key) { + private static String _t(String key) { return Translate.getString(key, I2PAppContext.getGlobalContext(), BUNDLE_NAME); } diff --git a/core/java/src/net/i2p/util/LogWriterBase.java b/core/java/src/net/i2p/util/LogWriterBase.java index 053cccdc6..08683b622 100644 --- a/core/java/src/net/i2p/util/LogWriterBase.java +++ b/core/java/src/net/i2p/util/LogWriterBase.java @@ -145,7 +145,7 @@ abstract class LogWriterBase implements Runnable { private String dupMessage(int dupCount, LogRecord lastRecord, boolean reverse) { String arrows = reverse ? "↓↓↓" : "^^^"; return LogRecordFormatter.getWhen(_manager, lastRecord) + ' ' + arrows + ' ' + - _(dupCount, "1 similar message omitted", "{0} similar messages omitted") + ' ' + arrows + '\n'; + _t(dupCount, "1 similar message omitted", "{0} similar messages omitted") + ' ' + arrows + '\n'; } private static final String BUNDLE_NAME = "net.i2p.router.web.messages"; @@ -154,7 +154,7 @@ abstract class LogWriterBase implements Runnable { * gettext * @since 0.9.3 */ - private String _(int a, String b, String c) { + private String _t(int a, String b, String c) { return Translate.getString(a, b, c, _manager.getContext(), BUNDLE_NAME); } diff --git a/core/java/src/net/i2p/util/Translate.java b/core/java/src/net/i2p/util/Translate.java index d83036d02..3b5ab1b53 100644 --- a/core/java/src/net/i2p/util/Translate.java +++ b/core/java/src/net/i2p/util/Translate.java @@ -65,7 +65,7 @@ public abstract class Translate { * The {0} will be replaced by the parameter. * Single quotes must be doubled, i.e. ' -> '' in the string. * @param o parameter, not translated. - * To tranlslate parameter also, use _("foo {0} bar", _("baz")) + * To tranlslate parameter also, use _t("foo {0} bar", _t("baz")) * Do not double the single quotes in the parameter. * Use autoboxing to call with ints, longs, floats, etc. */ diff --git a/history.txt b/history.txt index b6097d90a..2a0172d77 100644 --- a/history.txt +++ b/history.txt @@ -1,3 +1,6 @@ +2015-09-25 dg + * Rename _() for translation to _t() for Java 9 compatibility (ticket #1456) + 2015-09-20 dg * /configreseed: Add 'Reset URL list' button for revert to default hosts (ticket #1554, thanks dzirtt@gmail.com) diff --git a/router/java/src/net/i2p/router/Blocklist.java b/router/java/src/net/i2p/router/Blocklist.java index 4e931f665..3ad8e7387 100644 --- a/router/java/src/net/i2p/router/Blocklist.java +++ b/router/java/src/net/i2p/router/Blocklist.java @@ -917,7 +917,7 @@ public class Blocklist { singles.addAll(_singleIPBlocklist); if (!(singles.isEmpty() && _singleIPv6Blocklist.isEmpty())) { out.write(""); // first 0 - 127 for (Integer ii : singles) { @@ -954,11 +954,11 @@ public class Blocklist { } if (_blocklistSize > 0) { out.write("
              "); - out.write(_("IPs Banned Until Restart")); + out.write(_t("IPs Banned Until Restart")); out.write("
              "); int max = Math.min(_blocklistSize, MAX_DISPLAY); int displayed = 0; @@ -994,7 +994,7 @@ public class Blocklist { out.write("
              "); - out.write(_("IPs Permanently Banned")); + out.write(_t("IPs Permanently Banned")); out.write("
              "); - out.write(_("From")); + out.write(_t("From")); out.write(""); - out.write(_("To")); + out.write(_t("To")); out.write("
              "); } else { out.write("
              "); - out.write(_("none")); + out.write(_t("none")); out.write(""); } out.flush(); @@ -1030,7 +1030,7 @@ public class Blocklist { private static final String BUNDLE_NAME = "net.i2p.router.web.messages"; /** translate */ - private String _(String key) { + private String _t(String key) { return Translate.getString(key, _context, BUNDLE_NAME); } diff --git a/router/java/src/net/i2p/router/RouterVersion.java b/router/java/src/net/i2p/router/RouterVersion.java index a6204817e..f2522cd4e 100644 --- a/router/java/src/net/i2p/router/RouterVersion.java +++ b/router/java/src/net/i2p/router/RouterVersion.java @@ -18,7 +18,7 @@ public class RouterVersion { /** deprecated */ public final static String ID = "Monotone"; public final static String VERSION = CoreVersion.VERSION; - public final static long BUILD = 8; + public final static long BUILD = 9; /** for example "-test" */ public final static String EXTRA = ""; diff --git a/router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java b/router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java index f619391ec..bc7b1eeb1 100644 --- a/router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java +++ b/router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java @@ -209,7 +209,7 @@ public class Reseeder { if (fetched <= 0) throw new IOException("No seeds extracted"); _checker.setStatus( - _("Reseeding: got router info from file ({0} successful, {1} errors).", fetched, errors)); + _t("Reseeding: got router info from file ({0} successful, {1} errors).", fetched, errors)); System.err.println("Reseed got " + fetched + " router infos from file with " + errors + " errors"); _context.router().eventLog().addEvent(EventLog.RESEED, fetched + " from file"); return fetched; @@ -281,7 +281,7 @@ public class Reseeder { private void run2() { _isRunning = true; _checker.setError(""); - _checker.setStatus(_("Reseeding")); + _checker.setStatus(_t("Reseeding")); if (_context.getBooleanProperty(PROP_PROXY_ENABLE)) { _proxyHost = _context.getProperty(PROP_PROXY_HOST); _proxyPort = _context.getProperty(PROP_PROXY_PORT, -1); @@ -313,9 +313,9 @@ public class Reseeder { "and if nothing helps, read the FAQ about reseeding manually."); } // else < 0, no valid URLs String old = _checker.getError(); - _checker.setError(_("Reseed failed.") + ' ' + - _("See {0} for help.", - "" + _("reseed configuration page") + "") + + _checker.setError(_t("Reseed failed.") + ' ' + + _t("See {0} for help.", + "" + _t("reseed configuration page") + "") + "
              " + old); } _isRunning = false; @@ -563,7 +563,7 @@ public class Reseeder { try { // Don't use context clock as we may be adjusting the time final long timeLimit = System.currentTimeMillis() + MAX_TIME_PER_HOST; - _checker.setStatus(_("Reseeding: fetching seed URL.")); + _checker.setStatus(_t("Reseeding: fetching seed URL.")); System.err.println("Reseeding from " + seedURL); byte contentRaw[] = readURL(seedURL); if (contentRaw == null) { @@ -620,7 +620,7 @@ public class Reseeder { iter.hasNext() && fetched < 200 && System.currentTimeMillis() < timeLimit; ) { try { _checker.setStatus( - _("Reseeding: fetching router info from seed URL ({0} successful, {1} errors).", fetched, errors)); + _t("Reseeding: fetching router info from seed URL ({0} successful, {1} errors).", fetched, errors)); if (!fetchSeed(seedURL.toString(), iter.next())) continue; @@ -694,7 +694,7 @@ public class Reseeder { int errors = 0; File contentRaw = null; try { - _checker.setStatus(_("Reseeding: fetching seed URL.")); + _checker.setStatus(_t("Reseeding: fetching seed URL.")); System.err.println("Reseeding from " + seedURL); // don't use context time, as we may be step-changing it // from the server header @@ -730,7 +730,7 @@ public class Reseeder { contentRaw.delete(); } _checker.setStatus( - _("Reseeding: fetching router info from seed URL ({0} successful, {1} errors).", fetched, errors)); + _t("Reseeding: fetching router info from seed URL ({0} successful, {1} errors).", fetched, errors)); System.err.println("Reseed got " + fetched + " router infos from " + seedURL + " with " + errors + " errors"); return fetched; } @@ -1002,17 +1002,17 @@ public class Reseeder { private static final String BUNDLE_NAME = "net.i2p.router.web.messages"; /** translate */ - private String _(String key) { + private String _t(String key) { return Translate.getString(key, _context, BUNDLE_NAME); } /** translate */ - private String _(String s, Object o) { + private String _t(String s, Object o) { return Translate.getString(s, o, _context, BUNDLE_NAME); } /** translate */ - private String _(String s, Object o, Object o2) { + private String _t(String s, Object o, Object o2) { return Translate.getString(s, o, o2, _context, BUNDLE_NAME); } diff --git a/router/java/src/net/i2p/router/transport/CommSystemFacadeImpl.java b/router/java/src/net/i2p/router/transport/CommSystemFacadeImpl.java index a9b802060..fbea02990 100644 --- a/router/java/src/net/i2p/router/transport/CommSystemFacadeImpl.java +++ b/router/java/src/net/i2p/router/transport/CommSystemFacadeImpl.java @@ -499,7 +499,7 @@ public class CommSystemFacadeImpl extends CommSystemFacade { buf.append(""); boolean found = _context.netDb().lookupRouterInfoLocally(peer) != null; if (found) - buf.append(""); + buf.append(""); buf.append(h); if (found) buf.append(""); @@ -519,7 +519,7 @@ public class CommSystemFacadeImpl extends CommSystemFacade { /** * Translate */ - private final String _(String s) { + private final String _t(String s) { return Translate.getString(s, _context, BUNDLE_NAME); } diff --git a/router/java/src/net/i2p/router/transport/TransportImpl.java b/router/java/src/net/i2p/router/transport/TransportImpl.java index ce2d643a6..11fb08b96 100644 --- a/router/java/src/net/i2p/router/transport/TransportImpl.java +++ b/router/java/src/net/i2p/router/transport/TransportImpl.java @@ -983,7 +983,7 @@ public abstract class TransportImpl implements Transport { * Translate * @since 0.9.8 moved from transports */ - protected String _(String s) { + protected String _t(String s) { return Translate.getString(s, _context, BUNDLE_NAME); } @@ -991,7 +991,7 @@ public abstract class TransportImpl implements Transport { * Translate * @since 0.9.8 moved from transports */ - protected String _(String s, Object o) { + protected String _t(String s, Object o) { return Translate.getString(s, o, _context, BUNDLE_NAME); } diff --git a/router/java/src/net/i2p/router/transport/TransportManager.java b/router/java/src/net/i2p/router/transport/TransportManager.java index 4c0f325bb..b49ff1551 100644 --- a/router/java/src/net/i2p/router/transport/TransportManager.java +++ b/router/java/src/net/i2p/router/transport/TransportManager.java @@ -671,9 +671,9 @@ public class TransportManager implements TransportEventListener { public void renderStatusHTML(Writer out, String urlBase, int sortFlags) throws IOException { if (_context.getBooleanProperty(PROP_ADVANCED)) { out.write("

              "); - out.write(_("Status")); + out.write(_t("Status")); out.write(": "); - out.write(_(getReachabilityStatus().toStatusString())); + out.write(_t(getReachabilityStatus().toStatusString())); out.write("

              "); } TreeMap transports = new TreeMap(); @@ -689,7 +689,7 @@ public class TransportManager implements TransportEventListener { } StringBuilder buf = new StringBuilder(4*1024); - buf.append("

              ").append(_("Router Transport Addresses")).append("

              \n");
              +        buf.append("

              ").append(_t("Router Transport Addresses")).append("

              \n");
                       for (Transport t : _transports.values()) {
                           if (t.hasCurrentAddress()) {
                               for (RouterAddress ra : t.getCurrentAddresses()) {
              @@ -697,7 +697,7 @@ public class TransportManager implements TransportEventListener {
                                   buf.append("\n\n");
                               }
                           } else {
              -                buf.append(_("{0} is used for outbound connections only", t.getStyle()));
              +                buf.append(_t("{0} is used for outbound connections only", t.getStyle()));
                               buf.append("\n\n");
                           }
                       }
              @@ -708,7 +708,7 @@ public class TransportManager implements TransportEventListener {
                       } else if (_upnpManager != null) {
                           out.write(_upnpManager.renderStatusHTML());
                       } else {
              -            out.write("

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

              \n"); + out.write("

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

              \n"); } out.write("

              \n"); out.flush(); @@ -717,38 +717,38 @@ public class TransportManager implements TransportEventListener { private final String getTransportsLegend() { StringBuilder buf = new StringBuilder(1024); - buf.append("

              ").append(_("Help")).append("

              ") - .append(_("Your transport connection limits are automatically set based on your configured bandwidth.")) + buf.append("

              ").append(_t("Help")).append("

              ") + .append(_t("Your transport connection limits are automatically set based on your configured bandwidth.")) .append('\n') - .append(_("To override these limits, add the settings i2np.ntcp.maxConnections=nnn and i2np.udp.maxConnections=nnn on the advanced configuration page.")) + .append(_t("To override these limits, add the settings i2np.ntcp.maxConnections=nnn and i2np.udp.maxConnections=nnn on the advanced configuration page.")) .append("

              \n"); - buf.append("

              ").append(_("Definitions")).append("

              " + - "

              ").append(_("Peer")).append(": ").append(_("The remote peer, identified by router hash")).append("
              \n" + - "").append(_("Dir")).append(": " + - "\"Inbound\" ").append(_("Inbound connection")).append("
              \n" + + buf.append("

              ").append(_t("Definitions")).append("

              " + + "

              ").append(_t("Peer")).append(": ").append(_t("The remote peer, identified by router hash")).append("
              \n" + + "").append(_t("Dir")).append(": " + + "\"Inbound\" ").append(_t("Inbound connection")).append("
              \n" + "       " + - "\"Outbound\" ").append(_("Outbound connection")).append("
              \n" + + "\"Outbound\" ").append(_t("Outbound connection")).append("
              \n" + "       " + - "\"V\" ").append(_("They offered to introduce us (help other peers traverse our firewall)")).append("
              \n" + + "\"V\" ").append(_t("They offered to introduce us (help other peers traverse our firewall)")).append("
              \n" + "       " + - "\"^\" ").append(_("We offered to introduce them (help other peers traverse their firewall)")).append("
              \n" + - "").append(_("Idle")).append(": ").append(_("How long since a packet has been received / sent")).append("
              \n" + - "").append(_("In/Out")).append(": ").append(_("The smoothed inbound / outbound transfer rate (KBytes per second)")).append("
              \n" + - "").append(_("Up")).append(": ").append(_("How long ago this connection was established")).append("
              \n" + - "").append(_("Skew")).append(": ").append(_("The difference between the peer's clock and your own")).append("
              \n" + - "CWND: ").append(_("The congestion window, which is how many bytes can be sent without an acknowledgement")).append(" /
              \n" + - "        ").append(_("The number of sent messages awaiting acknowledgement")).append(" /
              \n" + - "        ").append(_("The maximum number of concurrent messages to send")).append(" /
              \n"+ - "        ").append(_("The number of pending sends which exceed congestion window")).append("
              \n" + - "SST: ").append(_("The slow start threshold")).append("
              \n" + - "RTT: ").append(_("The round trip time in milliseconds")).append("
              \n" + - //"").append(_("Dev")).append(": ").append(_("The standard deviation of the round trip time in milliseconds")).append("
              \n" + - "RTO: ").append(_("The retransmit timeout in milliseconds")).append("
              \n" + - "MTU: ").append(_("Current maximum send packet size / estimated maximum receive packet size (bytes)")).append("
              \n" + - "").append(_("TX")).append(": ").append(_("The total number of packets sent to the peer")).append("
              \n" + - "").append(_("RX")).append(": ").append(_("The total number of packets received from the peer")).append("
              \n" + - "").append(_("Dup TX")).append(": ").append(_("The total number of packets retransmitted to the peer")).append("
              \n" + - "").append(_("Dup RX")).append(": ").append(_("The total number of duplicate packets received from the peer")).append("

              " + + "\"^\" ").append(_t("We offered to introduce them (help other peers traverse their firewall)")).append("
              \n" + + "").append(_t("Idle")).append(": ").append(_t("How long since a packet has been received / sent")).append("
              \n" + + "").append(_t("In/Out")).append(": ").append(_t("The smoothed inbound / outbound transfer rate (KBytes per second)")).append("
              \n" + + "").append(_t("Up")).append(": ").append(_t("How long ago this connection was established")).append("
              \n" + + "").append(_t("Skew")).append(": ").append(_t("The difference between the peer's clock and your own")).append("
              \n" + + "CWND: ").append(_t("The congestion window, which is how many bytes can be sent without an acknowledgement")).append(" /
              \n" + + "        ").append(_t("The number of sent messages awaiting acknowledgement")).append(" /
              \n" + + "        ").append(_t("The maximum number of concurrent messages to send")).append(" /
              \n"+ + "        ").append(_t("The number of pending sends which exceed congestion window")).append("
              \n" + + "SST: ").append(_t("The slow start threshold")).append("
              \n" + + "RTT: ").append(_t("The round trip time in milliseconds")).append("
              \n" + + //"").append(_t("Dev")).append(": ").append(_t("The standard deviation of the round trip time in milliseconds")).append("
              \n" + + "RTO: ").append(_t("The retransmit timeout in milliseconds")).append("
              \n" + + "MTU: ").append(_t("Current maximum send packet size / estimated maximum receive packet size (bytes)")).append("
              \n" + + "").append(_t("TX")).append(": ").append(_t("The total number of packets sent to the peer")).append("
              \n" + + "").append(_t("RX")).append(": ").append(_t("The total number of packets received from the peer")).append("
              \n" + + "").append(_t("Dup TX")).append(": ").append(_t("The total number of packets retransmitted to the peer")).append("
              \n" + + "").append(_t("Dup RX")).append(": ").append(_t("The total number of duplicate packets received from the peer")).append("

              " + "
              \n"); return buf.toString(); } @@ -770,14 +770,14 @@ public class TransportManager implements TransportEventListener { /** * Translate */ - private final String _(String s) { + private final String _t(String s) { return Translate.getString(s, _context, BUNDLE_NAME); } /** * Translate */ - private final String _(String s, Object o) { + private final String _t(String s, Object o) { return Translate.getString(s, o, _context, BUNDLE_NAME); } } diff --git a/router/java/src/net/i2p/router/transport/UPnP.java b/router/java/src/net/i2p/router/transport/UPnP.java index 29e0a037c..baec7ab62 100644 --- a/router/java/src/net/i2p/router/transport/UPnP.java +++ b/router/java/src/net/i2p/router/transport/UPnP.java @@ -557,68 +557,68 @@ class UPnP extends ControlPoint implements DeviceChangeListener, EventListener { for(int i=0; i").append(_("Service")).append(": "); + sb.append("
            3. ").append(_t("Service")).append(": "); // NOTE: Group all toString() of common actions together // to avoid excess fetches, since toString() caches. if("urn:schemas-upnp-org:service:WANCommonInterfaceConfig:1".equals(serv.getServiceType())){ - sb.append(_("WAN Common Interface Configuration")); - sb.append("
              • ").append(_("Status")).append(": ") + sb.append(_t("WAN Common Interface Configuration")); + sb.append("
                • ").append(_t("Status")).append(": ") .append(toString("GetCommonLinkProperties", "NewPhysicalLinkStatus", serv)); - sb.append("
                • ").append(_("Type")).append(": ") + sb.append("
                • ").append(_t("Type")).append(": ") .append(toString("GetCommonLinkProperties", "NewWANAccessType", serv)); - sb.append("
                • ").append(_("Upstream")).append(": ") + sb.append("
                • ").append(_t("Upstream")).append(": ") .append(toString("GetCommonLinkProperties", "NewLayer1UpstreamMaxBitRate", serv)); - sb.append("
                • ").append(_("Downstream")).append(": ") + sb.append("
                • ").append(_t("Downstream")).append(": ") .append(toString("GetCommonLinkProperties", "NewLayer1DownstreamMaxBitRate", serv)) .append("
                • "); }else if("urn:schemas-upnp-org:service:WANPPPConnection:1".equals(serv.getServiceType())){ - sb.append(_("WAN PPP Connection")); - sb.append("
                  • ").append(_("Status")).append(": ") + sb.append(_t("WAN PPP Connection")); + sb.append("
                    • ").append(_t("Status")).append(": ") .append(toString("GetStatusInfo", "NewConnectionStatus", serv)); String up = toString("GetStatusInfo", "NewUptime", serv); if (up != null) { try { long uptime = Long.parseLong(up); uptime *= 1000; - sb.append("
                    • ").append(_("Uptime")).append(": ") + sb.append("
                    • ").append(_t("Uptime")).append(": ") .append(DataHelper.formatDuration2(uptime)); } catch (NumberFormatException nfe) {} } - sb.append("
                    • ").append(_("Type")).append(": ") + sb.append("
                    • ").append(_t("Type")).append(": ") .append(toString("GetConnectionTypeInfo", "NewConnectionType", serv)); - sb.append("
                    • ").append(_("Upstream")).append(": ") + sb.append("
                    • ").append(_t("Upstream")).append(": ") .append(toString("GetLinkLayerMaxBitRates", "NewUpstreamMaxBitRate", serv)); - sb.append("
                    • ").append(_("Downstream")).append(": ") + sb.append("
                    • ").append(_t("Downstream")).append(": ") .append(toString("GetLinkLayerMaxBitRates", "NewDownstreamMaxBitRate", serv) + "
                      "); - sb.append("
                    • ").append(_("External IP")).append(": ") + sb.append("
                    • ").append(_t("External IP")).append(": ") .append(toString("GetExternalIPAddress", "NewExternalIPAddress", serv)) .append("
                    • "); }else if("urn:schemas-upnp-org:service:Layer3Forwarding:1".equals(serv.getServiceType())){ - sb.append(_("Layer 3 Forwarding")); - sb.append("
                      • ").append(_("Default Connection Service")).append(": ") + sb.append(_t("Layer 3 Forwarding")); + sb.append("
                        • ").append(_t("Default Connection Service")).append(": ") .append(toString("GetDefaultConnectionService", "NewDefaultConnectionService", serv)) .append("
                        • "); }else if(WAN_IP_CONNECTION.equals(serv.getServiceType())){ - sb.append(_("WAN IP Connection")); - sb.append("
                          • ").append(_("Status")).append(": ") + sb.append(_t("WAN IP Connection")); + sb.append("
                            • ").append(_t("Status")).append(": ") .append(toString("GetStatusInfo", "NewConnectionStatus", serv)); String up = toString("GetStatusInfo", "NewUptime", serv); if (up != null) { try { long uptime = Long.parseLong(up); uptime *= 1000; - sb.append("
                            • ").append(_("Uptime")).append(": ") + sb.append("
                            • ").append(_t("Uptime")).append(": ") .append(DataHelper.formatDuration2(uptime)); } catch (NumberFormatException nfe) {} } - sb.append("
                            • ").append(_("Type")).append(": ") + sb.append("
                            • ").append(_t("Type")).append(": ") .append(toString("GetConnectionTypeInfo", "NewConnectionType", serv)); - sb.append("
                            • ").append(_("External IP")).append(": ") + sb.append("
                            • ").append(_t("External IP")).append(": ") .append(toString("GetExternalIPAddress", "NewExternalIPAddress", serv)) .append("
                            • "); }else if("urn:schemas-upnp-org:service:WANEthernetLinkConfig:1".equals(serv.getServiceType())){ - sb.append(_("WAN Ethernet Link Configuration")); - sb.append("
                              • ").append(_("Status")).append(": ") + sb.append(_t("WAN Ethernet Link Configuration")); + sb.append("
                                • ").append(_t("Status")).append(": ") .append(toString("GetEthernetLinkStatus", "NewEthernetLinkStatus", serv)) .append("
                                • "); } else { @@ -638,9 +638,9 @@ class UPnP extends ControlPoint implements DeviceChangeListener, EventListener { private void listSubDev(String prefix, Device dev, StringBuilder sb){ if (prefix == null) - sb.append("

                                  ").append(_("Found Device")).append(": "); + sb.append("

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

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

                                  "); @@ -661,11 +661,11 @@ class UPnP extends ControlPoint implements DeviceChangeListener, EventListener { /** warning - slow */ public String renderStatusHTML() { final StringBuilder sb = new StringBuilder(); - sb.append("

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

                                  "); + sb.append("

                                  ").append(_t("UPnP Status")).append("

                                  "); synchronized(_otherUDNs) { if (!_otherUDNs.isEmpty()) { - sb.append(_("Disabled UPnP Devices")); + sb.append(_t("Disabled UPnP Devices")); sb.append("
                                    "); for (Map.Entry e : _otherUDNs.entrySet()) { String udn = e.getKey(); @@ -679,10 +679,10 @@ class UPnP extends ControlPoint implements DeviceChangeListener, EventListener { } if(isDisabled) { - sb.append(_("UPnP has been disabled; Do you have more than one UPnP Internet Gateway Device on your LAN ?")); + sb.append(_t("UPnP has been disabled; Do you have more than one UPnP Internet Gateway Device on your LAN ?")); return sb.toString(); } else if(!isNATPresent()) { - sb.append(_("UPnP has not found any UPnP-aware, compatible device on your LAN.")); + sb.append(_t("UPnP has not found any UPnP-aware, compatible device on your LAN.")); return sb.toString(); } @@ -690,15 +690,15 @@ class UPnP extends ControlPoint implements DeviceChangeListener, EventListener { String addr = getNATAddress(); sb.append("

                                    "); if (addr != null) - sb.append(_("The current external IP address reported by UPnP is {0}", DataHelper.escapeHTML(addr))); + sb.append(_t("The current external IP address reported by UPnP is {0}", DataHelper.escapeHTML(addr))); else - sb.append(_("The current external IP address is not available.")); + sb.append(_t("The current external IP address is not available.")); int downstreamMaxBitRate = getDownstreamMaxBitRate(); int upstreamMaxBitRate = getUpstreamMaxBitRate(); if(downstreamMaxBitRate > 0) - sb.append("
                                    ").append(_("UPnP reports the maximum downstream bit rate is {0}bits/sec", DataHelper.formatSize2(downstreamMaxBitRate))); + sb.append("
                                    ").append(_t("UPnP reports the maximum downstream bit rate is {0}bits/sec", DataHelper.formatSize2(downstreamMaxBitRate))); if(upstreamMaxBitRate > 0) - sb.append("
                                    ").append(_("UPnP reports the maximum upstream bit rate is {0}bits/sec", DataHelper.formatSize2(upstreamMaxBitRate))); + sb.append("
                                    ").append(_t("UPnP reports the maximum upstream bit rate is {0}bits/sec", DataHelper.formatSize2(upstreamMaxBitRate))); synchronized(lock) { for(ForwardPort port : portsToForward) { sb.append("
                                    "); @@ -706,9 +706,9 @@ class UPnP extends ControlPoint implements DeviceChangeListener, EventListener { // {0} is TCP or UDP // {1,number,#####} prevents 12345 from being output as 12,345 in the English locale. // If you want the digit separator in your locale, translate as {1}. - sb.append(_("{0} port {1,number,#####} was successfully forwarded by UPnP.", protoToString(port.protocol), port.portNumber)); + sb.append(_t("{0} port {1,number,#####} was successfully forwarded by UPnP.", protoToString(port.protocol), port.portNumber)); else - sb.append(_("{0} port {1,number,#####} was not forwarded by UPnP.", protoToString(port.protocol), port.portNumber)); + sb.append(_t("{0} port {1,number,#####} was not forwarded by UPnP.", protoToString(port.protocol), port.portNumber)); } } @@ -1101,21 +1101,21 @@ class UPnP extends ControlPoint implements DeviceChangeListener, EventListener { /** * Translate */ - private final String _(String s) { + private final String _t(String s) { return Translate.getString(s, _context, BUNDLE_NAME); } /** * Translate */ - private final String _(String s, Object o) { + private final String _t(String s, Object o) { return Translate.getString(s, o, _context, BUNDLE_NAME); } /** * Translate */ - private final String _(String s, Object o, Object o2) { + private final String _t(String s, Object o, Object o2) { return Translate.getString(s, o, o2, _context, BUNDLE_NAME); } } diff --git a/router/java/src/net/i2p/router/transport/UPnPManager.java b/router/java/src/net/i2p/router/transport/UPnPManager.java index 0ff6d5d84..370ba813e 100644 --- a/router/java/src/net/i2p/router/transport/UPnPManager.java +++ b/router/java/src/net/i2p/router/transport/UPnPManager.java @@ -280,7 +280,7 @@ class UPnPManager { */ public String renderStatusHTML() { if (!_isRunning) - return "

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

                                    \n"; + return "

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

                                    \n"; return _upnp.renderStatusHTML(); } @@ -289,7 +289,7 @@ class UPnPManager { /** * Translate */ - private final String _(String s) { + private final String _t(String s) { return Translate.getString(s, _context, BUNDLE_NAME); } diff --git a/router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java b/router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java index 382d4d89e..c38e932d5 100644 --- a/router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java +++ b/router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java @@ -1341,26 +1341,26 @@ public class NTCPTransport extends TransportImpl { } StringBuilder buf = new StringBuilder(512); - buf.append("

                                    ").append(_("NTCP connections")).append(": ").append(peers.size()); - buf.append(". ").append(_("Limit")).append(": ").append(getMaxConnections()); - buf.append(". ").append(_("Timeout")).append(": ").append(DataHelper.formatDuration2(_pumper.getIdleTimeout())); + buf.append("

                                    ").append(_t("NTCP connections")).append(": ").append(peers.size()); + buf.append(". ").append(_t("Limit")).append(": ").append(getMaxConnections()); + buf.append(". ").append(_t("Timeout")).append(": ").append(DataHelper.formatDuration2(_pumper.getIdleTimeout())); if (_context.getBooleanProperty(PROP_ADVANCED)) { - buf.append(". ").append(_("Status")).append(": ").append(_(getReachabilityStatus().toStatusString())); + buf.append(". ").append(_t("Status")).append(": ").append(_t(getReachabilityStatus().toStatusString())); } buf.append(".

                                    \n" + "\n" + - "" + - "" + - "" + - "" + - "" + - "" + - "" + - "" + - "" + - "" + - "" + - //"" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + //"" + " \n"); out.write(buf.toString()); buf.setLength(0); @@ -1372,9 +1372,9 @@ public class NTCPTransport extends TransportImpl { // buf.append(' ').append(_context.blocklist().toStr(ip)); buf.append(""); } List> alist = meta.getAnnounceList(); - if (alist != null) { + if (alist != null && !alist.isEmpty()) { buf.append(""); + buf.append("\n"); } } if (meta != null) { String com = meta.getComment(); - if (com != null) { + if (com != null && com.length() > 0) { if (com.length() > 1024) com = com.substring(0, 1024); buf.append("\n"); } String cby = meta.getCreatedBy(); - if (cby != null) { + if (cby != null && cby.length() > 0) { if (cby.length() > 128) cby = com.substring(0, 128); buf.append("
                                    ").append(_("Peer")).append("").append(_("Dir")).append("").append(_("IPv6")).append("").append(_("Idle")).append("").append(_("In/Out")).append("").append(_("Up")).append("").append(_("Skew")).append("").append(_("TX")).append("").append(_("RX")).append("").append(_("Out Queue")).append("").append(_("Backlogged?")).append("").append(_("Reading?")).append("
                                    ").append(_t("Peer")).append("").append(_t("Dir")).append("").append(_t("IPv6")).append("").append(_t("Idle")).append("").append(_t("In/Out")).append("").append(_t("Up")).append("").append(_t("Skew")).append("").append(_t("TX")).append("").append(_t("RX")).append("").append(_t("Out Queue")).append("").append(_t("Backlogged?")).append("").append(_t("Reading?")).append("
                                    "); if (con.isInbound()) - buf.append("\"Inbound\""); + buf.append("\"Inbound\""); else - buf.append("\"Outbound\""); + buf.append("\"Outbound\""); buf.append(""); if (con.isIPv6()) buf.append("✓"); diff --git a/router/java/src/net/i2p/router/transport/udp/UDPTransport.java b/router/java/src/net/i2p/router/transport/udp/UDPTransport.java index d109cb099..223f655f5 100644 --- a/router/java/src/net/i2p/router/transport/udp/UDPTransport.java +++ b/router/java/src/net/i2p/router/transport/udp/UDPTransport.java @@ -2465,58 +2465,58 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority int numPeers = 0; StringBuilder buf = new StringBuilder(512); - buf.append("

                                    ").append(_("UDP connections")).append(": ").append(peers.size()); - buf.append(". ").append(_("Limit")).append(": ").append(getMaxConnections()); - buf.append(". ").append(_("Timeout")).append(": ").append(DataHelper.formatDuration2(_expireTimeout)); + buf.append("

                                    ").append(_t("UDP connections")).append(": ").append(peers.size()); + buf.append(". ").append(_t("Limit")).append(": ").append(getMaxConnections()); + buf.append(". ").append(_t("Timeout")).append(": ").append(DataHelper.formatDuration2(_expireTimeout)); if (_context.getBooleanProperty(PROP_ADVANCED)) { - buf.append(". ").append(_("Status")).append(": ").append(_(_reachabilityStatus.toStatusString())); + buf.append(". ").append(_t("Status")).append(": ").append(_t(_reachabilityStatus.toStatusString())); } buf.append(".

                                    \n"); buf.append("\n"); - buf.append(""); - buf.append("\n"); - buf.append("\n"); buf.append("\n"); buf.append("\n"); buf.append("\n"); - buf.append("\n"); out.write(buf.toString()); buf.setLength(0); @@ -2532,17 +2532,17 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority // buf.append(' ').append(_context.blocklist().toStr(ip)); buf.append(""); buf.append(" +<% if (book.getEntries().length > 0) { /* Don't show if no results. Can't figure out how to do this with c:if */ %> @@ -166,18 +167,23 @@ ${book.loadBookMessages} +<% } /* book..getEntries().length() > 0 */ %>
                                    ").append(_("Peer")).append("
                                    "); + buf.append("
                                    ").append(_t("Peer")).append("
                                    "); if (sortFlags != FLAG_ALPHA) - appendSortLinks(buf, urlBase, sortFlags, _("Sort by peer hash"), FLAG_ALPHA); + appendSortLinks(buf, urlBase, sortFlags, _t("Sort by peer hash"), FLAG_ALPHA); buf.append("
                                    ").append(_("Dir")) - .append("").append(_("IPv6")) - .append("").append(_("Idle")).append("
                                    "); - appendSortLinks(buf, urlBase, sortFlags, _("Sort by idle inbound"), FLAG_IDLE_IN); + .append(_t("Direction/Introduction")).append("\">").append(_t("Dir")) + .append("
                                    ").append(_t("IPv6")) + .append("").append(_t("Idle")).append("
                                    "); + appendSortLinks(buf, urlBase, sortFlags, _t("Sort by idle inbound"), FLAG_IDLE_IN); buf.append(" / "); - appendSortLinks(buf, urlBase, sortFlags, _("Sort by idle outbound"), FLAG_IDLE_OUT); + appendSortLinks(buf, urlBase, sortFlags, _t("Sort by idle outbound"), FLAG_IDLE_OUT); buf.append("
                                    ").append(_("In/Out")).append("
                                    "); - appendSortLinks(buf, urlBase, sortFlags, _("Sort by inbound rate"), FLAG_RATE_IN); + buf.append("
                                    ").append(_t("In/Out")).append("
                                    "); + appendSortLinks(buf, urlBase, sortFlags, _t("Sort by inbound rate"), FLAG_RATE_IN); buf.append(" / "); - appendSortLinks(buf, urlBase, sortFlags, _("Sort by outbound rate"), FLAG_RATE_OUT); + appendSortLinks(buf, urlBase, sortFlags, _t("Sort by outbound rate"), FLAG_RATE_OUT); buf.append("
                                    ").append(_("Up")).append("
                                    "); - appendSortLinks(buf, urlBase, sortFlags, _("Sort by connection uptime"), FLAG_UPTIME); - buf.append("
                                    ").append(_("Skew")).append("
                                    "); - appendSortLinks(buf, urlBase, sortFlags, _("Sort by clock skew"), FLAG_SKEW); + buf.append("
                                    ").append(_t("Up")).append("
                                    "); + appendSortLinks(buf, urlBase, sortFlags, _t("Sort by connection uptime"), FLAG_UPTIME); + buf.append("
                                    ").append(_t("Skew")).append("
                                    "); + appendSortLinks(buf, urlBase, sortFlags, _t("Sort by clock skew"), FLAG_SKEW); buf.append("
                                    CWND
                                    "); - appendSortLinks(buf, urlBase, sortFlags, _("Sort by congestion window"), FLAG_CWND); + appendSortLinks(buf, urlBase, sortFlags, _t("Sort by congestion window"), FLAG_CWND); buf.append("
                                    SST
                                    "); - appendSortLinks(buf, urlBase, sortFlags, _("Sort by slow start threshold"), FLAG_SSTHRESH); + appendSortLinks(buf, urlBase, sortFlags, _t("Sort by slow start threshold"), FLAG_SSTHRESH); buf.append("
                                    RTT
                                    "); - appendSortLinks(buf, urlBase, sortFlags, _("Sort by round trip time"), FLAG_RTT); - //buf.append("
                                    ").append(_("Dev")).append("
                                    "); - //appendSortLinks(buf, urlBase, sortFlags, _("Sort by round trip time deviation"), FLAG_DEV); + appendSortLinks(buf, urlBase, sortFlags, _t("Sort by round trip time"), FLAG_RTT); + //buf.append("
                                    ").append(_t("Dev")).append("
                                    "); + //appendSortLinks(buf, urlBase, sortFlags, _t("Sort by round trip time deviation"), FLAG_DEV); buf.append("
                                    RTO
                                    "); - appendSortLinks(buf, urlBase, sortFlags, _("Sort by retransmission timeout"), FLAG_RTO); + appendSortLinks(buf, urlBase, sortFlags, _t("Sort by retransmission timeout"), FLAG_RTO); buf.append("
                                    MTU
                                    "); - appendSortLinks(buf, urlBase, sortFlags, _("Sort by outbound maximum transmit unit"), FLAG_MTU); - buf.append("
                                    ").append(_("TX")).append("
                                    "); - appendSortLinks(buf, urlBase, sortFlags, _("Sort by packets sent"), FLAG_SEND); - buf.append("
                                    ").append(_("RX")).append("
                                    "); - appendSortLinks(buf, urlBase, sortFlags, _("Sort by packets received"), FLAG_RECV); + appendSortLinks(buf, urlBase, sortFlags, _t("Sort by outbound maximum transmit unit"), FLAG_MTU); + buf.append("
                                    ").append(_t("TX")).append("
                                    "); + appendSortLinks(buf, urlBase, sortFlags, _t("Sort by packets sent"), FLAG_SEND); + buf.append("
                                    ").append(_t("RX")).append("
                                    "); + appendSortLinks(buf, urlBase, sortFlags, _t("Sort by packets received"), FLAG_RECV); buf.append("
                                    ").append(_("Dup TX")).append("
                                    "); - appendSortLinks(buf, urlBase, sortFlags, _("Sort by packets retransmitted"), FLAG_RESEND); - buf.append("
                                    ").append(_("Dup RX")).append("
                                    "); - appendSortLinks(buf, urlBase, sortFlags, _("Sort by packets received more than once"), FLAG_DUP); + buf.append("
                                    ").append(_t("Dup TX")).append("
                                    "); + appendSortLinks(buf, urlBase, sortFlags, _t("Sort by packets retransmitted"), FLAG_RESEND); + buf.append("
                                    ").append(_t("Dup RX")).append("
                                    "); + appendSortLinks(buf, urlBase, sortFlags, _t("Sort by packets received more than once"), FLAG_DUP); buf.append("
                                    "); if (peer.isInbound()) - buf.append("\"Inbound\""); + buf.append("\"Inbound\""); else - buf.append("\"Outbound\""); + buf.append("\"Outbound\""); if (peer.getWeRelayToThemAs() > 0) - buf.append("  \"^\""); + buf.append("  \"^\""); if (peer.getTheyRelayToUsAs() > 0) - buf.append("  \"V\""); + buf.append("  \"V\""); boolean appended = false; if (_activeThrottle.isChoked(peer.getRemotePeer())) { - buf.append("
                                    ").append(_("Choked")).append(""); + buf.append("
                                    ").append(_t("Choked")).append(""); appended = true; } int cfs = peer.getConsecutiveFailedSends(); @@ -2550,15 +2550,15 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority if (!appended) buf.append("
                                    "); buf.append(" "); if (cfs == 1) - buf.append(_("1 fail")); + buf.append(_t("1 fail")); else - buf.append(_("{0} fails", cfs)); + buf.append(_t("{0} fails", cfs)); buf.append(""); appended = true; } if (_context.banlist().isBanlisted(peer.getRemotePeer(), STYLE)) { if (!appended) buf.append("
                                    "); - buf.append(" ").append(_("Banned")).append(""); + buf.append(" ").append(_t("Banned")).append(""); appended = true; } //byte[] ip = getIP(peer.getRemotePeer()); @@ -2617,7 +2617,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority buf.append(THINSP).append(peer.getConcurrentSendWindow()); buf.append(THINSP).append(peer.getConsecutiveSendRejections()); if (peer.isBacklogged()) - buf.append(' ').append(_("backlogged")); + buf.append(' ').append(_t("backlogged")); buf.append("
                                    "); @@ -2949,7 +2949,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority " from: ", new Exception("traceback")); if (old != Status.UNKNOWN) _context.router().eventLog().addEvent(EventLog.REACHABILITY, - "from " + _(old.toStatusString()) + " to " + _(status.toStatusString())); + "from " + _t(old.toStatusString()) + " to " + _t(status.toStatusString())); // Always rebuild when the status changes, even if our address hasn't changed, // as rebuildExternalAddress() calls replaceAddress() which calls CSFI.notifyReplaceAddress() // which will start up NTCP inbound when we transition to OK. From 89c14c2e9a454f98728c413f28849bf642764abc Mon Sep 17 00:00:00 2001 From: dg2-new Date: Fri, 25 Sep 2015 20:21:03 +0000 Subject: [PATCH 052/111] javadoc --- apps/i2psnark/java/src/org/klomp/snark/web/Sorters.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/i2psnark/java/src/org/klomp/snark/web/Sorters.java b/apps/i2psnark/java/src/org/klomp/snark/web/Sorters.java index 0bf598fd9..39120d6cc 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/web/Sorters.java +++ b/apps/i2psnark/java/src/org/klomp/snark/web/Sorters.java @@ -356,7 +356,7 @@ class Sorters { /** * @param storage may be null - * @param remaining precomputed, non-null iff storage is non-null + * @param remainingArray precomputed, non-null iff storage is non-null */ public FileAndIndex(File file, Storage storage, long[] remainingArray) { this.file = file; From a13552dd8db8f5a7f7723e8118d4c2cf63d3136f Mon Sep 17 00:00:00 2001 From: dg2-new Date: Fri, 25 Sep 2015 21:49:47 +0000 Subject: [PATCH 053/111] Fix news (ant poupdate), typos in bundle-* --- apps/desktopgui/bundle-messages.sh | 2 +- apps/i2psnark/java/bundle-messages.sh | 2 +- apps/i2ptunnel/java/bundle-messages-proxy.sh | 2 +- apps/i2ptunnel/java/bundle-messages.sh | 2 +- apps/ministreaming/java/bundle-messages.sh | 2 +- apps/routerconsole/java/bundle-messages-countries.sh | 2 +- apps/routerconsole/java/bundle-messages-news.sh | 2 +- apps/routerconsole/java/bundle-messages.sh | 2 +- apps/susidns/src/bundle-messages.sh | 2 +- apps/susimail/bundle-messages.sh | 2 +- core/java/src/net/i2p/util/TranslateReader.java | 2 +- installer/resources/locale/bundle-messages.sh | 2 +- 12 files changed, 12 insertions(+), 12 deletions(-) diff --git a/apps/desktopgui/bundle-messages.sh b/apps/desktopgui/bundle-messages.sh index 997c76887..6823dde03 100644 --- a/apps/desktopgui/bundle-messages.sh +++ b/apps/desktopgui/bundle-messages.sh @@ -31,7 +31,7 @@ if which find|grep -q -i windows ; then export PATH=.:/bin:/usr/local/bin:$PATH fi # Fast mode - update ondemond -# set LG2 to the language you need in envrionment varibales to enable this +# set LG2 to the language you need in environment variables to enable this # add ../java/ so the refs will work in the po file JPATHS="src" diff --git a/apps/i2psnark/java/bundle-messages.sh b/apps/i2psnark/java/bundle-messages.sh index 9632ee958..7ef207a6d 100755 --- a/apps/i2psnark/java/bundle-messages.sh +++ b/apps/i2psnark/java/bundle-messages.sh @@ -30,7 +30,7 @@ if which find|grep -q -i windows ; then export PATH=.:/bin:/usr/local/bin:$PATH fi # Fast mode - update ondemond -# set LG2 to the language you need in envrionment varibales to enable this +# set LG2 to the language you need in environment variables to enable this # add ../java/ so the refs will work in the po file JPATHS="../java/src" diff --git a/apps/i2ptunnel/java/bundle-messages-proxy.sh b/apps/i2ptunnel/java/bundle-messages-proxy.sh index 147e32952..a777a5eed 100755 --- a/apps/i2ptunnel/java/bundle-messages-proxy.sh +++ b/apps/i2ptunnel/java/bundle-messages-proxy.sh @@ -30,7 +30,7 @@ if which find|grep -q -i windows ; then export PATH=.:/bin:/usr/local/bin:$PATH fi # Fast mode - update ondemond -# set LG2 to the language you need in envrionment varibales to enable this +# set LG2 to the language you need in environment variables to enable this # add ../java/ so the refs will work in the po file JPATHS="../java/build/Proxy.java ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java" diff --git a/apps/i2ptunnel/java/bundle-messages.sh b/apps/i2ptunnel/java/bundle-messages.sh index 29a0bec93..0b426cb4d 100755 --- a/apps/i2ptunnel/java/bundle-messages.sh +++ b/apps/i2ptunnel/java/bundle-messages.sh @@ -29,7 +29,7 @@ if which find|grep -q -i windows ; then export PATH=.:/bin:/usr/local/bin:$PATH fi # Fast mode - update ondemond -# set LG2 to the language you need in envrionment varibales to enable this +# set LG2 to the language you need in environment variables to enable this # add ../java/ so the refs will work in the po file JPATHS="../java/src/net/i2p/i2ptunnel/web ../jsp/WEB-INF" diff --git a/apps/ministreaming/java/bundle-messages.sh b/apps/ministreaming/java/bundle-messages.sh index 5c3395114..140efc61e 100755 --- a/apps/ministreaming/java/bundle-messages.sh +++ b/apps/ministreaming/java/bundle-messages.sh @@ -30,7 +30,7 @@ if which find|grep -q -i windows ; then export PATH=.:/bin:/usr/local/bin:$PATH fi # Fast mode - update ondemond -# set LG2 to the language you need in envrionment varibales to enable this +# set LG2 to the language you need in environment variables to enable this # add ../java/ so the refs will work in the po file JPATHS="../java/src" diff --git a/apps/routerconsole/java/bundle-messages-countries.sh b/apps/routerconsole/java/bundle-messages-countries.sh index d4f1b9e71..23588e440 100755 --- a/apps/routerconsole/java/bundle-messages-countries.sh +++ b/apps/routerconsole/java/bundle-messages-countries.sh @@ -30,7 +30,7 @@ if which find|grep -q -i windows ; then export PATH=.:/bin:/usr/local/bin:$PATH fi # Fast mode - update ondemond -# set LG2 to the language you need in envrionment varibales to enable this +# set LG2 to the language you need in environment variables to enable this # # generate strings/Countries.java from ../../../installer/resources/countries.txt diff --git a/apps/routerconsole/java/bundle-messages-news.sh b/apps/routerconsole/java/bundle-messages-news.sh index 4b71ea4fc..759a3137b 100755 --- a/apps/routerconsole/java/bundle-messages-news.sh +++ b/apps/routerconsole/java/bundle-messages-news.sh @@ -30,7 +30,7 @@ if which find|grep -q -i windows ; then export PATH=.:/bin:/usr/local/bin:$PATH fi # Fast mode - update ondemond -# set LG2 to the language you need in envrionment varibales to enable this +# set LG2 to the language you need in environment variables to enable this # add ../java/ so the refs will work in the po file JPATHS="../java/build/News.java" diff --git a/apps/routerconsole/java/bundle-messages.sh b/apps/routerconsole/java/bundle-messages.sh index ebe925b3e..dd100561b 100755 --- a/apps/routerconsole/java/bundle-messages.sh +++ b/apps/routerconsole/java/bundle-messages.sh @@ -30,7 +30,7 @@ if which find|grep -q -i windows ; then export PATH=.:/bin:/usr/local/bin:$PATH fi # Fast mode - update ondemond -# set LG2 to the language you need in envrionment varibales to enable this +# set LG2 to the language you need in environment variables to enable this # list specific files in core/ and router/ here, so we don't scan the whole tree diff --git a/apps/susidns/src/bundle-messages.sh b/apps/susidns/src/bundle-messages.sh index 6ae1e111f..25bfae4d7 100755 --- a/apps/susidns/src/bundle-messages.sh +++ b/apps/susidns/src/bundle-messages.sh @@ -30,7 +30,7 @@ if which find|grep -q -i windows ; then export PATH=.:/bin:/usr/local/bin:$PATH fi # Fast mode - update ondemond -# set LG2 to the language you need in envrionment varibales to enable this +# set LG2 to the language you need in environment variables to enable this # add ../src/ so the refs will work in the po file JPATHS="../src/java/ ../src/tmp/" diff --git a/apps/susimail/bundle-messages.sh b/apps/susimail/bundle-messages.sh index 82945802a..8d8b55fc5 100644 --- a/apps/susimail/bundle-messages.sh +++ b/apps/susimail/bundle-messages.sh @@ -30,7 +30,7 @@ if which find|grep -q -i windows ; then export PATH=.:/bin:/usr/local/bin:$PATH fi # Fast mode - update ondemond -# set LG2 to the language you need in envrionment varibales to enable this +# set LG2 to the language you need in environment variables to enable this # add ../java/ so the refs will work in the po file JPATHS="src" diff --git a/core/java/src/net/i2p/util/TranslateReader.java b/core/java/src/net/i2p/util/TranslateReader.java index bc26bbe59..5ab9bf2cb 100644 --- a/core/java/src/net/i2p/util/TranslateReader.java +++ b/core/java/src/net/i2p/util/TranslateReader.java @@ -351,7 +351,7 @@ public class TranslateReader extends FilterReader { public void tag(List args) { if (args.size() <= 0) return; - _out.print("\t_("); + _out.print("\t_t("); for (int i = 0; i < args.size(); i++) { if (i > 0) _out.print(", "); diff --git a/installer/resources/locale/bundle-messages.sh b/installer/resources/locale/bundle-messages.sh index d49b553b0..ce5704d7e 100755 --- a/installer/resources/locale/bundle-messages.sh +++ b/installer/resources/locale/bundle-messages.sh @@ -24,7 +24,7 @@ if which find|grep -q -i windows ; then export PATH=.:/bin:/usr/local/bin:$PATH fi # Fast mode - update ondemond -# set LG2 to the language you need in envrionment varibales to enable this +# set LG2 to the language you need in environment variables to enable this JPATHS=".." for i in po/messages_*.po From ea4dd12bff4226235099ec5c76122526c3980491 Mon Sep 17 00:00:00 2001 From: zzz Date: Sun, 27 Sep 2015 15:10:59 +0000 Subject: [PATCH 054/111] SimpleTimer2: - Fix bug in forceReschedule() that caused subsequent uncaught IllegalStateException; forceReschedule() is only used by streaming timers - Log uncaught exceptions - Enforce 5 second minimum delay for periodic events - atomic count - de-wtf --- core/java/src/net/i2p/util/SimpleTimer2.java | 53 ++++++++++++++------ 1 file changed, 37 insertions(+), 16 deletions(-) diff --git a/core/java/src/net/i2p/util/SimpleTimer2.java b/core/java/src/net/i2p/util/SimpleTimer2.java index ec4f2528d..fa803338c 100644 --- a/core/java/src/net/i2p/util/SimpleTimer2.java +++ b/core/java/src/net/i2p/util/SimpleTimer2.java @@ -6,6 +6,7 @@ import java.util.concurrent.ScheduledThreadPoolExecutor; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; import java.util.concurrent.ThreadFactory; +import java.util.concurrent.atomic.AtomicInteger; import net.i2p.I2PAppContext; @@ -38,7 +39,7 @@ public class SimpleTimer2 { private static final int MAX_THREADS = 4; private final ScheduledThreadPoolExecutor _executor; private final String _name; - private volatile int _count; + private final AtomicInteger _count = new AtomicInteger(); private final int _threads; /** @@ -102,7 +103,7 @@ public class SimpleTimer2 { super.afterExecute(r, t); if (t != null) { // shoudn't happen, caught in RunnableEvent.run() Log log = I2PAppContext.getGlobalContext().logManager().getLog(SimpleTimer2.class); - log.log(Log.CRIT, "wtf, event borked: " + r, t); + log.log(Log.CRIT, "event borked: " + r, t); } } } @@ -110,7 +111,7 @@ public class SimpleTimer2 { private class CustomThreadFactory implements ThreadFactory { public Thread newThread(Runnable r) { Thread rv = Executors.defaultThreadFactory().newThread(r); - rv.setName(_name + ' ' + (++_count) + '/' + _threads); + rv.setName(_name + ' ' + _count.incrementAndGet() + '/' + _threads); // Uncomment this to test threadgrouping, but we should be all safe now that the constructor preallocates! // String name = rv.getThreadGroup().getName(); // if(!name.equals("main")) { @@ -164,7 +165,8 @@ public class SimpleTimer2 { * New code should use SimpleTimer2.TimedEvent. * * @since 0.9.20 - * @param timeoutMs run first and subsequent iterations of this event every timeoutMs ms + * @param timeoutMs run subsequent iterations of this event every timeoutMs ms, 5000 minimum + * @throws IllegalArgumentException if timeoutMs less than 5000 */ public void addPeriodicEvent(final SimpleTimer.TimedEvent event, final long timeoutMs) { addPeriodicEvent(event, timeoutMs, timeoutMs); @@ -183,7 +185,8 @@ public class SimpleTimer2 { * * @since 0.9.20 * @param delay run the first iteration of this event after delay ms - * @param timeoutMs run subsequent iterations of this event every timeoutMs ms + * @param timeoutMs run subsequent iterations of this event every timeoutMs ms, 5000 minimum + * @throws IllegalArgumentException if timeoutMs less than 5000 */ public void addPeriodicEvent(final SimpleTimer.TimedEvent event, final long delay, final long timeoutMs) { @@ -286,9 +289,12 @@ public class SimpleTimer2 { public synchronized void schedule(long timeoutMs) { if (_log.shouldLog(Log.DEBUG)) _log.debug("Scheduling: " + this + " timeout = " + timeoutMs + " state: " + _state); - if (timeoutMs <= 0 && _log.shouldLog(Log.WARN)) + if (timeoutMs <= 0) { + if (_log.shouldLog(Log.WARN)) + _log.warn("Timeout <= 0: " + this + " timeout = " + timeoutMs + " state: " + _state); timeoutMs = 1; // otherwise we may execute before _future is updated, which is fine // except it triggers 'early execution' warning logging + } // always set absolute time of execution _nextRun = timeoutMs + System.currentTimeMillis(); @@ -352,11 +358,13 @@ public class SimpleTimer2 { * @param timeoutMs */ public synchronized void forceReschedule(long timeoutMs) { - cancel(); + // don't cancel while running! + if (_state == TimedEventState.SCHEDULED) + cancel(); schedule(timeoutMs); } - /** returns true if cancelled */ + /** @return true if cancelled */ public synchronized boolean cancel() { // always clear _rescheduleAfterRun = false; @@ -378,20 +386,29 @@ public class SimpleTimer2 { } public void run() { + try { + run2(); + } catch (RuntimeException re) { + _log.error("timer error", re); + throw re; + } + } + + private void run2() { if (_log.shouldLog(Log.DEBUG)) _log.debug("Running: " + this); long before = System.currentTimeMillis(); long delay = 0; synchronized(this) { if (_rescheduleAfterRun) - throw new IllegalStateException("rescheduleAfterRun cannot be true here"); + throw new IllegalStateException(this + " rescheduleAfterRun cannot be true here"); switch(_state) { case CANCELLED: return; // goodbye case IDLE: // fall through case RUNNING: - throw new IllegalStateException("not possible to be in " + _state); + throw new IllegalStateException(this + " not possible to be in " + _state); case SCHEDULED: // proceed, switch to IDLE in case I need to reschedule _state = TimedEventState.IDLE; } @@ -411,12 +428,12 @@ public class SimpleTimer2 { if (_future != null) delay = _future.getDelay(TimeUnit.MILLISECONDS); else if (_log.shouldLog(Log.WARN)) - _log.warn(_pool + " wtf, no _future " + this); + _log.warn(_pool + " no _future " + this); // This can be an incorrect warning especially after a schedule(0) if (_log.shouldLog(Log.WARN) && delay > 100) - _log.warn(_pool + " wtf, early execution " + delay + ": " + this); + _log.warn(_pool + " early execution " + delay + ": " + this); else if (_log.shouldLog(Log.WARN) && delay < -1000) - _log.warn(" wtf, late execution " + (0 - delay) + ": " + this + _pool.debug()); + _log.warn(" late execution " + (0 - delay) + ": " + this + _pool.debug()); try { timeReached(); } catch (Throwable t) { @@ -426,7 +443,7 @@ public class SimpleTimer2 { switch(_state) { case SCHEDULED: // fall through case IDLE: - throw new IllegalStateException("can't be " + _state); + throw new IllegalStateException(this + " can't be " + _state); case CANCELLED: break; // nothing case RUNNING: @@ -441,7 +458,7 @@ public class SimpleTimer2 { } long time = System.currentTimeMillis() - before; if (time > 500 && _log.shouldLog(Log.WARN)) - _log.warn(_pool + " wtf, event execution took " + time + ": " + this); + _log.warn(_pool + " event execution took " + time + ": " + this); if (_log.shouldLog(Log.INFO)) { // this call is slow - iterates through a HashMap - // would be better to have a local AtomicLong if we care @@ -470,6 +487,7 @@ public class SimpleTimer2 { return _executor.getCompletedTaskCount(); } + /** warning - slow */ private String debug() { _executor.purge(); // Remove cancelled tasks from the queue so we get a good queue size stat return @@ -490,10 +508,13 @@ public class SimpleTimer2 { * Schedule periodic event * * @param delay run the first iteration of this event after delay ms - * @param timeoutMs run subsequent iterations of this event every timeoutMs ms + * @param timeoutMs run subsequent iterations of this event every timeoutMs ms, 5000 minimum + * @throws IllegalArgumentException if timeoutMs less than 5000 */ public PeriodicTimedEvent(SimpleTimer2 pool, long delay, long timeoutMs) { super(pool, delay); + if (timeoutMs < 5000) + throw new IllegalArgumentException("timeout minimum 5000"); _timeoutMs = timeoutMs; } From 3ea8b477d88d607d6ccbea6ad14391f2ef8b2d3f Mon Sep 17 00:00:00 2001 From: zzz Date: Sun, 27 Sep 2015 15:14:18 +0000 Subject: [PATCH 055/111] Streaming: Move throttler from context timer to streaming timer --- .../src/net/i2p/client/streaming/impl/ConnThrottler.java | 8 ++++---- .../net/i2p/client/streaming/impl/ConnectionManager.java | 9 ++++++--- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/apps/streaming/java/src/net/i2p/client/streaming/impl/ConnThrottler.java b/apps/streaming/java/src/net/i2p/client/streaming/impl/ConnThrottler.java index 51941d219..3b69c1137 100644 --- a/apps/streaming/java/src/net/i2p/client/streaming/impl/ConnThrottler.java +++ b/apps/streaming/java/src/net/i2p/client/streaming/impl/ConnThrottler.java @@ -25,7 +25,7 @@ class ConnThrottler { * @param totalMax for all peers, 0 for unlimited * @param period ms */ - ConnThrottler(int max, int totalMax, long period) { + ConnThrottler(int max, int totalMax, long period, SimpleTimer2 timer) { _max = max; _totalMax = totalMax; this.counter = new ObjectCounter(); @@ -33,9 +33,9 @@ class ConnThrottler { // shorten the initial period by a random amount // to prevent correlation across destinations // and identification of router startup time - SimpleTimer2.getInstance().addPeriodicEvent(new Cleaner(), - (period / 2) + RandomSource.getInstance().nextLong(period / 2), - period); + timer.addPeriodicEvent(new Cleaner(), + (period / 2) + RandomSource.getInstance().nextLong(period / 2), + period); } /* diff --git a/apps/streaming/java/src/net/i2p/client/streaming/impl/ConnectionManager.java b/apps/streaming/java/src/net/i2p/client/streaming/impl/ConnectionManager.java index be2bbed11..5861be6d1 100644 --- a/apps/streaming/java/src/net/i2p/client/streaming/impl/ConnectionManager.java +++ b/apps/streaming/java/src/net/i2p/client/streaming/impl/ConnectionManager.java @@ -178,21 +178,24 @@ class ConnectionManager { if ((_defaultOptions.getMaxConnsPerMinute() > 0 || _defaultOptions.getMaxTotalConnsPerMinute() > 0) && _minuteThrottler == null) { _context.statManager().createRateStat("stream.con.throttledMinute", "Dropped for conn limit", "Stream", new long[] { 5*60*1000 }); - _minuteThrottler = new ConnThrottler(_defaultOptions.getMaxConnsPerMinute(), _defaultOptions.getMaxTotalConnsPerMinute(), 60*1000); + _minuteThrottler = new ConnThrottler(_defaultOptions.getMaxConnsPerMinute(), _defaultOptions.getMaxTotalConnsPerMinute(), + 60*1000, _timer); } else if (_minuteThrottler != null) { _minuteThrottler.updateLimits(_defaultOptions.getMaxConnsPerMinute(), _defaultOptions.getMaxTotalConnsPerMinute()); } if ((_defaultOptions.getMaxConnsPerHour() > 0 || _defaultOptions.getMaxTotalConnsPerHour() > 0) && _hourThrottler == null) { _context.statManager().createRateStat("stream.con.throttledHour", "Dropped for conn limit", "Stream", new long[] { 5*60*1000 }); - _hourThrottler = new ConnThrottler(_defaultOptions.getMaxConnsPerHour(), _defaultOptions.getMaxTotalConnsPerHour(), 60*60*1000); + _hourThrottler = new ConnThrottler(_defaultOptions.getMaxConnsPerHour(), _defaultOptions.getMaxTotalConnsPerHour(), + 60*60*1000, _timer); } else if (_hourThrottler != null) { _hourThrottler.updateLimits(_defaultOptions.getMaxConnsPerHour(), _defaultOptions.getMaxTotalConnsPerHour()); } if ((_defaultOptions.getMaxConnsPerDay() > 0 || _defaultOptions.getMaxTotalConnsPerDay() > 0) && _dayThrottler == null) { _context.statManager().createRateStat("stream.con.throttledDay", "Dropped for conn limit", "Stream", new long[] { 5*60*1000 }); - _dayThrottler = new ConnThrottler(_defaultOptions.getMaxConnsPerDay(), _defaultOptions.getMaxTotalConnsPerDay(), 24*60*60*1000); + _dayThrottler = new ConnThrottler(_defaultOptions.getMaxConnsPerDay(), _defaultOptions.getMaxTotalConnsPerDay(), + 24*60*60*1000, _timer); } else if (_dayThrottler != null) { _dayThrottler.updateLimits(_defaultOptions.getMaxConnsPerDay(), _defaultOptions.getMaxTotalConnsPerDay()); } From 4d7ad6ef7f80637ff21b6903a0da0beb8354af74 Mon Sep 17 00:00:00 2001 From: zzz Date: Sun, 27 Sep 2015 15:53:37 +0000 Subject: [PATCH 056/111] Console: show 'none' if no leases log timing for /netdb (ticket #1532) --- .../src/net/i2p/router/web/NetDbRenderer.java | 34 ++++++++++++++++--- 1 file changed, 29 insertions(+), 5 deletions(-) diff --git a/apps/routerconsole/java/src/net/i2p/router/web/NetDbRenderer.java b/apps/routerconsole/java/src/net/i2p/router/web/NetDbRenderer.java index e0340f68a..ff6b092a2 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/NetDbRenderer.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/NetDbRenderer.java @@ -35,6 +35,7 @@ import net.i2p.router.RouterContext; import net.i2p.router.TunnelPoolSettings; import net.i2p.router.util.HashDistance; // debug import net.i2p.router.networkdb.kademlia.FloodfillNetworkDatabaseFacade; +import net.i2p.util.Log; import net.i2p.util.ObjectCounter; import net.i2p.util.Translate; import net.i2p.util.VersionComparator; @@ -141,16 +142,20 @@ public class NetDbRenderer { int rapCount = 0; BigInteger median = null; int c = 0; - if (debug) { + if (leases.isEmpty()) { + if (!debug) + buf.append("").append(_t("none")).append(""); + } else { + if (debug) { // Find the center of the RAP leasesets for (LeaseSet ls : leases) { if (ls.getReceivedAsPublished()) rapCount++; } medianCount = rapCount / 2; - } - long now = _context.clock().now(); - for (LeaseSet ls : leases) { + } + long now = _context.clock().now(); + for (LeaseSet ls : leases) { Destination dest = ls.getDestination(); Hash key = dest.calculateHash(); buf.append("").append(_t("LeaseSet")).append(": ").append(key.toBase64()).append("\n"); @@ -223,7 +228,8 @@ public class NetDbRenderer { buf.append("
                                    \n"); out.write(buf.toString()); buf.setLength(0); - } + } // for each + } // !empty if (debug) { FloodfillNetworkDatabaseFacade netdb = (FloodfillNetworkDatabaseFacade)_context.netDb(); buf.append("

                                    Total Leasesets: ").append(leases.size()); @@ -281,6 +287,8 @@ public class NetDbRenderer { out.flush(); return; } + Log log = _context.logManager().getLog(NetDbRenderer.class); + long start = System.currentTimeMillis(); boolean full = mode == 1; boolean shortStats = mode == 2; @@ -319,6 +327,10 @@ public class NetDbRenderer { transportCount[classifyTransports(ri)]++; } } + long end = System.currentTimeMillis(); + if (log.shouldWarn()) + log.warn("part 1 took " + (end - start)); + start = end; // // don't bother to reindent @@ -346,6 +358,10 @@ public class NetDbRenderer { buf.append("

                                    "); out.write(buf.toString()); buf.setLength(0); + end = System.currentTimeMillis(); + if (log.shouldWarn()) + log.warn("part 2 took " + (end - start)); + start = end; // transports table buf.append("\n"); @@ -361,6 +377,10 @@ public class NetDbRenderer { buf.append("
                                    "); out.write(buf.toString()); buf.setLength(0); + end = System.currentTimeMillis(); + if (log.shouldWarn()) + log.warn("part 3 took " + (end - start)); + start = end; // country table List countryList = new ArrayList(countries.objects()); @@ -379,6 +399,10 @@ public class NetDbRenderer { } buf.append("
                                    "); + end = System.currentTimeMillis(); + if (log.shouldWarn()) + log.warn("part 4 took " + (end - start)); + start = end; // // don't bother to reindent From 1c3527e1a41ab3fc27061f8661be1248f5200a9d Mon Sep 17 00:00:00 2001 From: zzz Date: Sun, 27 Sep 2015 15:56:03 +0000 Subject: [PATCH 057/111] Console: - Export SSL cert on creation - new /certs page to show local SSL certs --- .../src/net/i2p/router/web/CertHelper.java | 81 +++++++++++++++++++ .../i2p/router/web/RouterConsoleRunner.java | 7 ++ apps/routerconsole/jsp/certs.jsp | 17 ++++ 3 files changed, 105 insertions(+) create mode 100644 apps/routerconsole/java/src/net/i2p/router/web/CertHelper.java create mode 100644 apps/routerconsole/jsp/certs.jsp diff --git a/apps/routerconsole/java/src/net/i2p/router/web/CertHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/CertHelper.java new file mode 100644 index 000000000..f476c1dfe --- /dev/null +++ b/apps/routerconsole/java/src/net/i2p/router/web/CertHelper.java @@ -0,0 +1,81 @@ +package net.i2p.router.web; + +import java.io.File; +import java.io.IOException; + +import net.i2p.util.FileUtil; + + +/** + * Dump out our local SSL certs, if any + * + * @since 0.9.23 + */ +public class CertHelper extends HelperBase { + + private static final String DIR = "certificates"; + private static final String I2CP = "i2cp/i2cp.local.crt"; + private static final String CONSOLE = "console/console.local.crt"; + private static final String I2PTUNNEL_DIR = "i2ptunnel"; + + public String getSummary() { + File dir = new File(_context.getConfigDir(), DIR); + try { + _out.write("

                                    "); + _out.write(_t("Local SSL Certificates")); + _out.write("

                                    \n"); + // console + output("Console", new File(dir, CONSOLE)); + // I2CP + output("I2CP", new File(dir, I2CP)); + // i2ptunnel clients + File tunnelDir = new File(_context.getConfigDir(), I2PTUNNEL_DIR); + boolean hasTunnels = false; + File[] tunnels = tunnelDir.listFiles(); + if (tunnels != null) { + for (int i = 0; i < tunnels.length; i++) { + File f = tunnels[i]; + if (!f.isFile()) + continue; + String name = f.getName(); + if (!name.endsWith(".local.crt")) + continue; + if (!name.startsWith("i2ptunnel-")) + continue; + String b32 = name.substring(10, name.length() - 10); + output(_t("I2PTunnel") + ' ' + b32, f); + hasTunnels = true; + } + } + if (!hasTunnels) + output(_t("I2PTunnel"), null); + // anything else? plugins? + } catch (IOException ioe) { + ioe.printStackTrace(); + } + return ""; + } + + /** + * @param file may be null + */ + private void output(String name, File file) throws IOException { + _out.write("

                                    "); + _out.write("

                                    "); + _out.write(name); + if (file != null && file.exists()) { + String cert = FileUtil.readTextFile(file.toString(), -1, true); + if (cert != null) { + _out.write("\n\n"); + } else { + _out.write(": read failure"); + } + } else { + _out.write(": "); + _out.write(_t("none")); + } + _out.write("

                                    \n"); + } +} diff --git a/apps/routerconsole/java/src/net/i2p/router/web/RouterConsoleRunner.java b/apps/routerconsole/java/src/net/i2p/router/web/RouterConsoleRunner.java index 35e96b6ea..91483b97f 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/RouterConsoleRunner.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/RouterConsoleRunner.java @@ -760,6 +760,13 @@ public class RouterConsoleRunner implements RouterApp { changes.put(PROP_KEY_PASSWORD, keyPassword); _context.router().saveConfig(changes, null); } catch (Exception e) {} // class cast exception + // export cert, fails silently + File dir = new SecureDirectory(_context.getConfigDir(), "certificates"); + dir.mkdir(); + dir = new SecureDirectory(dir, "console"); + dir.mkdir(); + File certFile = new File(dir, "console.local.crt"); + KeyStoreUtil.exportCert(ks, DEFAULT_KEYSTORE_PASSWORD, "console", certFile); } } if (success) { diff --git a/apps/routerconsole/jsp/certs.jsp b/apps/routerconsole/jsp/certs.jsp new file mode 100644 index 000000000..3c4e59cf6 --- /dev/null +++ b/apps/routerconsole/jsp/certs.jsp @@ -0,0 +1,17 @@ +<%@page contentType="text/html"%> +<%@page trimDirectiveWhitespaces="true"%> +<%@page pageEncoding="UTF-8"%> + + +<%@include file="css.jsi" %> +<%=intl.title("Certificates")%> + +<%@include file="summaryajax.jsi" %> + +<%@include file="summary.jsi" %>

                                    <%=intl._t("Certificates")%>

                                    +
                                    + +" /> +<% certhelper.storeWriter(out); %> + +
                                    From b22a6bc163a12b7a6bc07514bed3c9acef6dc762 Mon Sep 17 00:00:00 2001 From: zzz Date: Sun, 27 Sep 2015 15:57:22 +0000 Subject: [PATCH 058/111] log tweak --- .../src/net/i2p/router/update/ConsoleUpdateManager.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/routerconsole/java/src/net/i2p/router/update/ConsoleUpdateManager.java b/apps/routerconsole/java/src/net/i2p/router/update/ConsoleUpdateManager.java index 4c72544ba..7999b2b47 100644 --- a/apps/routerconsole/java/src/net/i2p/router/update/ConsoleUpdateManager.java +++ b/apps/routerconsole/java/src/net/i2p/router/update/ConsoleUpdateManager.java @@ -323,7 +323,7 @@ public class ConsoleUpdateManager implements UpdateManager, RouterApp { t = r.checker.check(type, r.method, id, current, maxWait); if (t != null) { if (_log.shouldLog(Log.INFO)) - _log.info("Starting " + r); + _log.info("Starting " + r, new Exception()); _activeCheckers.add(t); t.start(); } @@ -366,7 +366,7 @@ public class ConsoleUpdateManager implements UpdateManager, RouterApp { UpdateTask t = r.checker.check(type, r.method, id, current, DEFAULT_CHECK_TIME); if (t != null) { if (_log.shouldLog(Log.INFO)) - _log.info("Starting " + r); + _log.info("Starting " + r, new Exception()); _activeCheckers.add(t); t.start(); break; @@ -670,7 +670,7 @@ public class ConsoleUpdateManager implements UpdateManager, RouterApp { // race window here // store the remaining ones for retrying if (_log.shouldLog(Log.INFO)) - _log.info("Starting " + r); + _log.info("Starting " + r, new Exception()); _downloaders.put(t, toTry); t.start(); return t; From d21777fbc1d2382fd84d8fde5c1a2c0282a9ca27 Mon Sep 17 00:00:00 2001 From: zzz Date: Sun, 27 Sep 2015 15:57:53 +0000 Subject: [PATCH 059/111] log tweak --- core/java/src/net/i2p/util/EepGet.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/java/src/net/i2p/util/EepGet.java b/core/java/src/net/i2p/util/EepGet.java index a098a997a..2c29c09e4 100644 --- a/core/java/src/net/i2p/util/EepGet.java +++ b/core/java/src/net/i2p/util/EepGet.java @@ -1098,7 +1098,7 @@ public class EepGet { */ private int handleStatus(String line) { if (_log.shouldLog(Log.DEBUG)) - _log.debug("Status line: [" + line + "]"); + _log.debug("Status line: [" + line.trim() + "]"); String[] toks = line.split(" ", 3); if (toks.length < 2) { if (_log.shouldLog(Log.WARN)) From 22417715e776c070205c459d0806eb6e8804a191 Mon Sep 17 00:00:00 2001 From: zzz Date: Sun, 27 Sep 2015 15:58:47 +0000 Subject: [PATCH 060/111] javadoc --- core/java/src/net/i2p/util/TranslateReader.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/core/java/src/net/i2p/util/TranslateReader.java b/core/java/src/net/i2p/util/TranslateReader.java index 5ab9bf2cb..171edd4a8 100644 --- a/core/java/src/net/i2p/util/TranslateReader.java +++ b/core/java/src/net/i2p/util/TranslateReader.java @@ -373,6 +373,9 @@ public class TranslateReader extends FilterReader { } } + /** + * Do not comment out, used to extract tags as a part of the build process. + */ public static void main(String[] args) { try { if (args.length >= 2 && args[0].equals("test")) From 39b810bd799f3e45b86ddbc80461d4b0d0f27cb1 Mon Sep 17 00:00:00 2001 From: zzz Date: Sun, 27 Sep 2015 16:01:22 +0000 Subject: [PATCH 061/111] Tunnels: Use max of 2 not-failing peers in an exploratory tunnel, use high cap for the rest; change outbound exploratory default length from 2 + 0-1 to 3+0. --- history.txt | 12 ++++ .../src/net/i2p/router/RouterVersion.java | 2 +- .../net/i2p/router/TunnelPoolSettings.java | 8 +-- .../tunnel/pool/ExploratoryPeerSelector.java | 71 +++++++++++-------- 4 files changed, 57 insertions(+), 36 deletions(-) diff --git a/history.txt b/history.txt index 2a0172d77..363362832 100644 --- a/history.txt +++ b/history.txt @@ -1,3 +1,15 @@ +2015-09-27 zzz + * Console: + - Export SSL cert on creation + - New /certs page to show local SSL certs + - Show 'none' if no leasesets + * SimpleTimer2: Fix bug in forceReschedule() that caused subsequent uncaught IllegalStateException, + affected streaming timers + * Streaming: Move throttler from context timer to streaming timer + * Tunnels: Use max of 2 not-failing peers in an exploratory tunnel, + use high cap for the rest; change outbound exploratory + default length from 2 + 0-1 to 3+0. + 2015-09-25 dg * Rename _() for translation to _t() for Java 9 compatibility (ticket #1456) diff --git a/router/java/src/net/i2p/router/RouterVersion.java b/router/java/src/net/i2p/router/RouterVersion.java index f2522cd4e..7ca1a3ec2 100644 --- a/router/java/src/net/i2p/router/RouterVersion.java +++ b/router/java/src/net/i2p/router/RouterVersion.java @@ -18,7 +18,7 @@ public class RouterVersion { /** deprecated */ public final static String ID = "Monotone"; public final static String VERSION = CoreVersion.VERSION; - public final static long BUILD = 9; + public final static long BUILD = 10; /** for example "-test" */ public final static String EXTRA = ""; diff --git a/router/java/src/net/i2p/router/TunnelPoolSettings.java b/router/java/src/net/i2p/router/TunnelPoolSettings.java index b7984c085..24184cc14 100644 --- a/router/java/src/net/i2p/router/TunnelPoolSettings.java +++ b/router/java/src/net/i2p/router/TunnelPoolSettings.java @@ -76,11 +76,11 @@ public class TunnelPoolSettings { private static final int DEFAULT_LENGTH_VARIANCE = 0; /** expl only */ private static final int DEFAULT_IB_EXPL_LENGTH = 2; - //private static final int DEFAULT_OB_EXPL_LENGTH = isSlow ? 2 : 3; - private static final int DEFAULT_OB_EXPL_LENGTH = 2; + private static final int DEFAULT_OB_EXPL_LENGTH = isSlow ? 2 : 3; + //private static final int DEFAULT_OB_EXPL_LENGTH = 2; private static final int DEFAULT_IB_EXPL_LENGTH_VARIANCE = isSlow ? 0 : 1; - //private static final int DEFAULT_OB_EXPL_LENGTH_VARIANCE = 0; - private static final int DEFAULT_OB_EXPL_LENGTH_VARIANCE = isSlow ? 0 : 1; + private static final int DEFAULT_OB_EXPL_LENGTH_VARIANCE = 0; + //private static final int DEFAULT_OB_EXPL_LENGTH_VARIANCE = isSlow ? 0 : 1; public static final boolean DEFAULT_ALLOW_ZERO_HOP = true; public static final int DEFAULT_IP_RESTRICTION = 2; // class B (/16) diff --git a/router/java/src/net/i2p/router/tunnel/pool/ExploratoryPeerSelector.java b/router/java/src/net/i2p/router/tunnel/pool/ExploratoryPeerSelector.java index 6bb81fbc8..b6b141e7a 100644 --- a/router/java/src/net/i2p/router/tunnel/pool/ExploratoryPeerSelector.java +++ b/router/java/src/net/i2p/router/tunnel/pool/ExploratoryPeerSelector.java @@ -33,12 +33,12 @@ class ExploratoryPeerSelector extends TunnelPeerSelector { return null; } - if (false && shouldSelectExplicit(settings)) { - List rv = selectExplicit(settings, length); - if (l.shouldLog(Log.DEBUG)) - l.debug("Explicit peers selected: " + rv); - return rv; - } + //if (false && shouldSelectExplicit(settings)) { + // List rv = selectExplicit(settings, length); + // if (l.shouldLog(Log.DEBUG)) + // l.debug("Explicit peers selected: " + rv); + // return rv; + //} Set exclude = getExclude(settings.isInbound(), true); exclude.add(ctx.routerHash()); @@ -55,34 +55,43 @@ class ExploratoryPeerSelector extends TunnelPeerSelector { // FloodfillNetworkDatabaseFacade fac = (FloodfillNetworkDatabaseFacade)ctx.netDb(); // exclude.addAll(fac.getFloodfillPeers()); HashSet matches = new HashSet(length); - boolean exploreHighCap = shouldPickHighCap(); - // - // We don't honor IP Restriction here, to be fixed - // + if (length > 0) { + boolean exploreHighCap = shouldPickHighCap(); - // If hidden and inbound, use fast peers - that we probably have recently - // connected to and so they have our real RI - to maximize the chance - // that the adjacent hop can connect to us. - if (settings.isInbound() && ctx.router().isHidden()) { - if (l.shouldLog(Log.INFO)) - l.info("EPS SFP " + length + (settings.isInbound() ? " IB" : " OB") + " exclude " + exclude.size()); - ctx.profileOrganizer().selectFastPeers(length, exclude, matches); - } else if (exploreHighCap) { - if (l.shouldLog(Log.INFO)) - l.info("EPS SHCP " + length + (settings.isInbound() ? " IB" : " OB") + " exclude " + exclude.size()); - ctx.profileOrganizer().selectHighCapacityPeers(length, exclude, matches); - } else if (ctx.commSystem().haveHighOutboundCapacity()) { - if (l.shouldLog(Log.INFO)) - l.info("EPS SNFP " + length + (settings.isInbound() ? " IB" : " OB") + " exclude " + exclude.size()); - ctx.profileOrganizer().selectNotFailingPeers(length, exclude, matches, false); - } else { // use only connected peers so we don't make more connections - if (l.shouldLog(Log.INFO)) - l.info("EPS SANFP " + length + (settings.isInbound() ? " IB" : " OB") + " exclude " + exclude.size()); - ctx.profileOrganizer().selectActiveNotFailingPeers(length, exclude, matches); + // + // We don't honor IP Restriction here, to be fixed + // + + // If hidden and inbound, use fast peers - that we probably have recently + // connected to and so they have our real RI - to maximize the chance + // that the adjacent hop can connect to us. + if (settings.isInbound() && ctx.router().isHidden()) { + if (l.shouldLog(Log.INFO)) + l.info("EPS SFP " + length + (settings.isInbound() ? " IB" : " OB") + " exclude " + exclude.size()); + ctx.profileOrganizer().selectFastPeers(length, exclude, matches); + } else if (exploreHighCap) { + if (l.shouldLog(Log.INFO)) + l.info("EPS SHCP " + length + (settings.isInbound() ? " IB" : " OB") + " exclude " + exclude.size()); + ctx.profileOrganizer().selectHighCapacityPeers(length, exclude, matches); + } else if (ctx.commSystem().haveHighOutboundCapacity()) { + if (l.shouldLog(Log.INFO)) + l.info("EPS SNFP " + length + (settings.isInbound() ? " IB" : " OB") + " exclude " + exclude.size()); + // As of 0.9.23, we include a max of 2 not failing peers, + // to improve build success on 3-hop tunnels. + // Peer org credits existing items in matches + if (length > 2) + ctx.profileOrganizer().selectHighCapacityPeers(length - 2, exclude, matches); + ctx.profileOrganizer().selectNotFailingPeers(length, exclude, matches, false); + } else { // use only connected peers so we don't make more connections + if (l.shouldLog(Log.INFO)) + l.info("EPS SANFP " + length + (settings.isInbound() ? " IB" : " OB") + " exclude " + exclude.size()); + ctx.profileOrganizer().selectActiveNotFailingPeers(length, exclude, matches); + } + + matches.remove(ctx.routerHash()); } - - matches.remove(ctx.routerHash()); + ArrayList rv = new ArrayList(matches); if (rv.size() > 1) orderPeers(rv, settings.getRandomKey()); From f46a902256b0095eb73f05f8bf449a2f71f24db0 Mon Sep 17 00:00:00 2001 From: dg2-new Date: Sun, 27 Sep 2015 21:15:51 +0000 Subject: [PATCH 062/111] Router: Fix soft restarts for 'massive' clock jumps (over +150s or -61s) and recover from standby/hibernate (ticket #1014). I2P should now recover (better) from a system hibernate/standby and be able to reconnect to peers automatically. --- history.txt | 2 ++ router/java/src/net/i2p/router/Router.java | 6 ++++-- router/java/src/net/i2p/router/RouterVersion.java | 2 +- router/java/src/net/i2p/router/tasks/Restarter.java | 4 ++-- 4 files changed, 9 insertions(+), 5 deletions(-) diff --git a/history.txt b/history.txt index 363362832..a9580a192 100644 --- a/history.txt +++ b/history.txt @@ -9,6 +9,8 @@ * Tunnels: Use max of 2 not-failing peers in an exploratory tunnel, use high cap for the rest; change outbound exploratory default length from 2 + 0-1 to 3+0. + * Router: Fix soft restarts for 'massive' clock jumps (over +150s or -61s) and recover from standby + and hibernate (ticket #1014). 2015-09-25 dg * Rename _() for translation to _t() for Java 9 compatibility (ticket #1456) diff --git a/router/java/src/net/i2p/router/Router.java b/router/java/src/net/i2p/router/Router.java index a76d4b7fa..fd68b7b69 100644 --- a/router/java/src/net/i2p/router/Router.java +++ b/router/java/src/net/i2p/router/Router.java @@ -1443,8 +1443,10 @@ public class Router implements RouterClock.ClockShiftListener { _eventLog.addEvent(EventLog.CLOCK_SHIFT, Long.toString(delta)); // update the routing key modifier _context.routerKeyGenerator().generateDateBasedModData(); - if (_context.commSystem().countActivePeers() <= 0) - return; + // Commented because this check makes no sense (#1014) + // .. and 'active' is relative to our broken time. + //if (_context.commSystem().countActivePeers() <= 0) + // return; if (delta > 0) _log.error("Restarting after large clock shift forward by " + DataHelper.formatDuration(delta)); else diff --git a/router/java/src/net/i2p/router/RouterVersion.java b/router/java/src/net/i2p/router/RouterVersion.java index 7ca1a3ec2..5a58b19bc 100644 --- a/router/java/src/net/i2p/router/RouterVersion.java +++ b/router/java/src/net/i2p/router/RouterVersion.java @@ -18,7 +18,7 @@ public class RouterVersion { /** deprecated */ public final static String ID = "Monotone"; public final static String VERSION = CoreVersion.VERSION; - public final static long BUILD = 10; + public final static long BUILD = 11; /** for example "-test" */ public final static String EXTRA = ""; diff --git a/router/java/src/net/i2p/router/tasks/Restarter.java b/router/java/src/net/i2p/router/tasks/Restarter.java index c904cad50..23991ae0e 100644 --- a/router/java/src/net/i2p/router/tasks/Restarter.java +++ b/router/java/src/net/i2p/router/tasks/Restarter.java @@ -30,9 +30,9 @@ public class Restarter implements Runnable { log.logAlways(Log.WARN, "Stopping the tunnel manager"); try { _context.tunnelManager().restart(); } catch (Throwable t) { log.log(Log.CRIT, "Error restarting the tunnel manager", t); } - //try { _context.peerManager().restart(); } catch (Throwable t) { log.log(Log.CRIT, "Error restarting the peer manager", t); } + try { _context.peerManager().restart(); } catch (Throwable t) { log.log(Log.CRIT, "Error restarting the peer manager", t); } //try { _context.netDb().restart(); } catch (Throwable t) { log.log(Log.CRIT, "Error restarting the networkDb", t); } - //try { _context.jobQueue().restart(); } catch (Throwable t) { log.log(Log.CRIT, "Error restarting the job queue", t); } + try { _context.jobQueue().restart(); } catch (Throwable t) { log.log(Log.CRIT, "Error restarting the job queue", t); } log.logAlways(Log.WARN, "Router teardown complete, restarting the router..."); try { Thread.sleep(10*1000); } catch (InterruptedException ie) {} From 59b05d4214a28fab555b8f11b8fffd3b640ae50e Mon Sep 17 00:00:00 2001 From: zzz Date: Sun, 27 Sep 2015 21:54:14 +0000 Subject: [PATCH 063/111] Util: Speed up IP address validation by using Apache's implementation (ticket #1198) --- core/java/src/net/i2p/util/Addresses.java | 9 ++++----- history.txt | 7 +++++-- router/java/src/net/i2p/data/router/RouterAddress.java | 6 ++++-- router/java/src/net/i2p/router/RouterVersion.java | 2 +- .../src/net/i2p/router/transport/udp/UDPAddress.java | 9 ++++----- 5 files changed, 18 insertions(+), 15 deletions(-) diff --git a/core/java/src/net/i2p/util/Addresses.java b/core/java/src/net/i2p/util/Addresses.java index d522167f4..b33839b48 100644 --- a/core/java/src/net/i2p/util/Addresses.java +++ b/core/java/src/net/i2p/util/Addresses.java @@ -15,6 +15,8 @@ import java.util.Set; import java.util.SortedSet; import java.util.TreeSet; +import org.apache.http.conn.util.InetAddressUtils; + import net.i2p.I2PAppContext; /** @@ -260,12 +262,9 @@ public abstract class Addresses { } if (rv == null) { try { - boolean isIPv4 = host.replaceAll("[0-9\\.]", "").length() == 0; - if (isIPv4 && host.replaceAll("[0-9]", "").length() != 3) - return null; rv = InetAddress.getByName(host).getAddress(); - if (isIPv4 || - host.replaceAll("[0-9a-fA-F:]", "").length() == 0) { + if (InetAddressUtils.isIPv4Address(host) || + InetAddressUtils.isIPv6Address(host)) { synchronized (_IPAddress) { _IPAddress.put(host, rv); } diff --git a/history.txt b/history.txt index a9580a192..fc5a07713 100644 --- a/history.txt +++ b/history.txt @@ -1,3 +1,7 @@ +2015-09-27 dg + * Router: Fix soft restarts for 'massive' clock jumps (over +150s or -61s) and recover from standby + and hibernate (ticket #1014). + 2015-09-27 zzz * Console: - Export SSL cert on creation @@ -9,8 +13,7 @@ * Tunnels: Use max of 2 not-failing peers in an exploratory tunnel, use high cap for the rest; change outbound exploratory default length from 2 + 0-1 to 3+0. - * Router: Fix soft restarts for 'massive' clock jumps (over +150s or -61s) and recover from standby - and hibernate (ticket #1014). + * Util: Speed up IP address validation by using Apache's implementation (ticket #1198) 2015-09-25 dg * Rename _() for translation to _t() for Java 9 compatibility (ticket #1456) diff --git a/router/java/src/net/i2p/data/router/RouterAddress.java b/router/java/src/net/i2p/data/router/RouterAddress.java index ca0f94d08..e7cd0d684 100644 --- a/router/java/src/net/i2p/data/router/RouterAddress.java +++ b/router/java/src/net/i2p/data/router/RouterAddress.java @@ -17,6 +17,8 @@ import java.util.Date; import java.util.Map; import java.util.Properties; +import org.apache.http.conn.util.InetAddressUtils; + import net.i2p.data.DataFormatException; import net.i2p.data.DataHelper; import net.i2p.data.DataStructureImpl; @@ -219,8 +221,8 @@ public class RouterAddress extends DataStructureImpl { if (host != null) { rv = Addresses.getIP(host); if (rv != null && - (host.replaceAll("[0-9\\.]", "").length() == 0 || - host.replaceAll("[0-9a-fA-F:]", "").length() == 0)) { + (InetAddressUtils.isIPv4Address(host) || + InetAddressUtils.isIPv6Address(host))) { _ip = rv; } } diff --git a/router/java/src/net/i2p/router/RouterVersion.java b/router/java/src/net/i2p/router/RouterVersion.java index 5a58b19bc..e36cd3b14 100644 --- a/router/java/src/net/i2p/router/RouterVersion.java +++ b/router/java/src/net/i2p/router/RouterVersion.java @@ -18,7 +18,7 @@ public class RouterVersion { /** deprecated */ public final static String ID = "Monotone"; public final static String VERSION = CoreVersion.VERSION; - public final static long BUILD = 11; + public final static long BUILD = 12; /** for example "-test" */ public final static String EXTRA = ""; diff --git a/router/java/src/net/i2p/router/transport/udp/UDPAddress.java b/router/java/src/net/i2p/router/transport/udp/UDPAddress.java index 691601933..3d22e41b7 100644 --- a/router/java/src/net/i2p/router/transport/udp/UDPAddress.java +++ b/router/java/src/net/i2p/router/transport/udp/UDPAddress.java @@ -4,6 +4,8 @@ import java.net.InetAddress; import java.net.UnknownHostException; import java.util.Map; +import org.apache.http.conn.util.InetAddressUtils; + import net.i2p.data.Base64; import net.i2p.data.router.RouterAddress; import net.i2p.data.SessionKey; @@ -262,12 +264,9 @@ class UDPAddress { } if (rv == null) { try { - boolean isIPv4 = host.replaceAll("[0-9\\.]", "").length() == 0; - if (isIPv4 && host.replaceAll("[0-9]", "").length() != 3) - return null; rv = InetAddress.getByName(host); - if (isIPv4 || - host.replaceAll("[0-9a-fA-F:]", "").length() == 0) { + if (InetAddressUtils.isIPv4Address(host) || + InetAddressUtils.isIPv6Address(host)) { synchronized (_inetAddressCache) { _inetAddressCache.put(host, rv); } From 58ccfed41d2f35329122f9d5c1c7434c49292801 Mon Sep 17 00:00:00 2001 From: zzz Date: Mon, 28 Sep 2015 14:50:53 +0000 Subject: [PATCH 064/111] Addressbook: - Use Patterns instead of replaceAll() - Fix isValidDest() for EC/Ed dests --- .../src/net/i2p/addressbook/AddressBook.java | 54 ++++++++++++++++--- 1 file changed, 48 insertions(+), 6 deletions(-) diff --git a/apps/addressbook/java/src/net/i2p/addressbook/AddressBook.java b/apps/addressbook/java/src/net/i2p/addressbook/AddressBook.java index 40eeff590..fea030774 100644 --- a/apps/addressbook/java/src/net/i2p/addressbook/AddressBook.java +++ b/apps/addressbook/java/src/net/i2p/addressbook/AddressBook.java @@ -27,6 +27,7 @@ import java.util.Collections; import java.util.HashMap; import java.util.Iterator; import java.util.Map; +import java.util.regex.Pattern; import net.i2p.I2PAppContext; import net.i2p.util.EepGet; @@ -49,6 +50,26 @@ class AddressBook { private boolean modified; private static final boolean DEBUG = false; + private static final int MIN_DEST_LENGTH = 516; + private static final int MAX_DEST_LENGTH = MIN_DEST_LENGTH + 100; // longer than any known cert type for now + + /** + * 5-67 chars lower/upper case + */ + private static final Pattern HOST_PATTERN = + Pattern.compile("^[0-9a-zA-Z\\.-]{5,67}$"); + + /** + * 52 chars lower/upper case + * Always ends in 'a' or 'q' + */ + private static final Pattern B32_PATTERN = + Pattern.compile("^[2-7a-zA-Z]{51}[aAqQ]$"); + + /** not a complete qualification, just a quick check */ + private static final Pattern B64_PATTERN = + Pattern.compile("^[0-9a-zA-Z~-]{" + MIN_DEST_LENGTH + ',' + MAX_DEST_LENGTH + "}={0,2}$"); + /** * Construct an AddressBook from the contents of the Map addresses. * @@ -206,9 +227,6 @@ class AddressBook { return "Map containing " + this.addresses.size() + " entries"; } - private static final int MIN_DEST_LENGTH = 516; - private static final int MAX_DEST_LENGTH = MIN_DEST_LENGTH + 100; // longer than any known cert type for now - /** * Do basic validation of the hostname * hostname was already converted to lower case by ConfigParser.parse() @@ -225,9 +243,10 @@ class AddressBook { host.indexOf("..") < 0 && // IDN - basic check, not complete validation (host.indexOf("--") < 0 || host.startsWith("xn--") || host.indexOf(".xn--") > 0) && - host.replaceAll("[a-z0-9.-]", "").length() == 0 && + HOST_PATTERN.matcher(host).matches() && // Base32 spoofing (52chars.i2p) - (! (host.length() == 56 && host.substring(0,52).replaceAll("[a-z2-7]", "").length() == 0)) && + // We didn't do it this way, we use a .b32.i2p suffix, but let's prohibit it anyway + (! (host.length() == 56 && B32_PATTERN.matcher(host.substring(0,52)).matches())) && // ... or maybe we do Base32 this way ... (! host.equals("b32.i2p")) && (! host.endsWith(".b32.i2p")) && @@ -251,7 +270,7 @@ class AddressBook { (dest.length() > MIN_DEST_LENGTH && dest.length() <= MAX_DEST_LENGTH)) && // B64 comes in groups of 2, 3, or 4 chars, but never 1 ((dest.length() % 4) != 1) && - dest.replaceAll("[a-zA-Z0-9~-]", "").length() == 0 + B64_PATTERN.matcher(dest).matches() ; } @@ -337,4 +356,27 @@ class AddressBook { protected void finalize() { delete(); } + +/**** + public static void main(String[] args) { + String[] tests = { "foo.i2p", + "3bnipzzu67cdq2rcygyxz52xhvy6ylokn4zfrk36ywn6pixmaoza.b32.i2p", + "9rhEy4dT9fMlcSOhDzfWRxCV2aen4Zp4eSthOf5f9gVKMa4PtQJ-wEzm2KEYeDXkbM6wEDvMQ6ou4LIniSE6bSAwy7fokiXk5oabels-sJmftnQWRbZyyXEAsLc3gpJJvp9km7kDyZ0z0YGL5tf3S~OaWdptB5tSBOAOjm6ramcYZMWhyUqm~xSL1JyXUqWEHRYwhoDJNL6-L516VpDYVigMBpIwskjeFGcqK8BqWAe0bRwxIiFTPN6Ck8SDzQvS1l1Yj-zfzg3X3gOknzwR8nrHUkjsWtEB6nhbOr8AR21C9Hs0a7MUJvSe2NOuBoNTrtxT76jDruI78JcG5r~WKl6M12yM-SqeBNE9hQn2QCHeHAKju7FdRCbqaZ99IwyjfwvZbkiYYQVN1xlUuGaXrj98XDzK7GORYdH-PrVGfEbMXQ40KLHUWHz8w4tQXAOQrCHEichod0RIzuuxo3XltCWKrf1xGZhkAo9bk2qXi6digCijvYNaKmQdXZYWW~RtAAAA", + "6IZTYacjlXjSAxu-uXEO5oGsj-f4tfePHEvGjs5pu-AMXMwD7-xFdi8kdobDMJp9yRAl96U7yLl~0t9zHeqqYmNeZnDSkTmAcSC2PT45ZJDXBobKi1~a77zuqfPwnzEatYfW3GL1JQAEkAmiwNJoG7ThTZ3zT7W9ekVJpHi9mivpTbaI~rALLfuAg~Mvr60nntZHjqhEZuiU4dTXrmc5nykl~UaMnBdwHL4jKmoN5CotqHyLYZfp74fdD-Oq4SkhuBhU8wkBIM3lz3Ul1o6-s0lNUMdYJq1CyxnyP7jeekdfAlSx4P4sU4M0dPaYvPdOFWPWwBuEh0pCs5Mj01B2xeEBhpV~xSLn6ru5Vq98TrmaR33KHxd76OYYFsWwzVbBuMVSd800XpBghGFucGw01YHYsPh3Afb01sXbf8Nb1bkxCy~DsrmoH4Ww3bpx66JhRTWvg5al3oWlCX51CnJUqaaK~dPL-pBvAyLKIA5aYvl8ca66jtA7AFDxsOb2texBBQAEAAcAAA==", + "te9Ky7XvVcLLr5vQqvfmOasg915P3-ddP3iDqpMMk7v5ufFKobLAX~1k-E4WVsJVlkYvkHVOjxix-uT1IdewKmLd81s5wZtz0GQ3ZC6p0C3S2cOxz7kQqf7QYSR0BrhZC~2du3-GdQO9TqNmsnHrah5lOZf0LN2JFEFPqg8ZB5JNm3JjJeSqePBRk3zAUogNaNK3voB1MVI0ZROKopXAJM4XMERNqI8tIH4ngGtV41SEJJ5pUFrrTx~EiUPqmSEaEA6UDYZiqd23ZlewZ31ExXQj97zvkuhKCoS9A9MNkzZejJhP-TEXWF8~KHur9f51H--EhwZ42Aj69-3GuNjsMdTwglG5zyIfhd2OspxJrXzCPqIV2sXn80IbPgwxHu0CKIJ6X43B5vTyVu87QDI13MIRNGWNZY5KmM5pilGP7jPkOs4xQDo4NHzpuJR5igjWgJIBPU6fI9Pzq~BMzjLiZOMp8xNWey1zKC96L0eX4of1MG~oUvq0qmIHGNa1TlUwBQAEAAEAAA==", + "(*&(*&(*&(*", + "9rhEy4dT9fMlcSOhDzfWRxCV2aen4Zp4eSthOf5f9gVKMa4PtQJ-wEzm2KEYeDXkbM6wEDvMQ6ou4LIniSE6bSAwy7fokiXk5oabels-sJmftnQWRbZyyXEAsLc3gpJJvp9km7kDyZ0z0YGL5tf3S~OaWdptB5tSBOAOjm6ramcYZMWhyUqm~xSL1JyXUqWEHRYwhoDJNL6-L516VpDYVigMBpIwskjeFGcqK8BqWAe0bRwxIiFTPN6Ck8SDzQvS1l1Yj-zfzg3X3gOknzwR8nrHUkjsWtEB6nhbOr8AR21C9Hs0a7MUJvSe2NOuBoNTrtxT76jDruI78JcG5r~WKl6M12yM-SqeBNE9hQn2QCHeHAKju7FdRCbqaZ99IwyjfwvZbkiYYQVN1xlUuGaXrj98XDzK7GORYdH-PrVGfEbMXQ40KLHUWHz8w4tQXAOQrCHEichod0RIzuuxo3XltCWKrf1xGZhkAo9bk2qXi6digCijvYNaKmQdXZYWW~RtAAA", + "6IZTYacjlXjSAxu-uXEO5oGsj-f4tfePHEvGjs5pu-AMXMwD7-xFdi8kdobDMJp9yRAl96U7yLl~0t9zHeqqYmNeZnDSkTmAcSC2PT45ZJDXBobKi1~a77zuqfPwnzEatYfW3GL1JQAEkAmiwNJoG7ThTZ3zT7W9ekVJpHi9mivpTbaI~rALLfuAg~Mvr60nntZHjqhEZuiU4dTXrmc5nykl~UaMnBdwHL4jKmoN5CotqHyLYZfp74fdD-Oq4SkhuBhU8wkBIM3lz3Ul1o6-s0lNUMdYJq1CyxnyP7jeekdfAlSx4P4sU4M0dPaYvPdOFWPWwBuEh0pCs5Mj01B2xeEBhpV~xSLn6ru5Vq98TrmaR33KHxd76OYYFsWwzVbBuMVSd800XpBghGFucGw01YHYsPh3Afb01sXbf8Nb1bkxCy~DsrmoH4Ww3bpx66JhRTWvg5al3oWlCX51CnJUqaaK~dPL-pBvAyLKIA5aYvl8ca66jtA7AFDxsOb2texBBQAEAAcAAA===", + "!e9Ky7XvVcLLr5vQqvfmOasg915P3-ddP3iDqpMMk7v5ufFKobLAX~1k-E4WVsJVlkYvkHVOjxix-uT1IdewKmLd81s5wZtz0GQ3ZC6p0C3S2cOxz7kQqf7QYSR0BrhZC~2du3-GdQO9TqNmsnHrah5lOZf0LN2JFEFPqg8ZB5JNm3JjJeSqePBRk3zAUogNaNK3voB1MVI0ZROKopXAJM4XMERNqI8tIH4ngGtV41SEJJ5pUFrrTx~EiUPqmSEaEA6UDYZiqd23ZlewZ31ExXQj97zvkuhKCoS9A9MNkzZejJhP-TEXWF8~KHur9f51H--EhwZ42Aj69-3GuNjsMdTwglG5zyIfhd2OspxJrXzCPqIV2sXn80IbPgwxHu0CKIJ6X43B5vTyVu87QDI13MIRNGWNZY5KmM5pilGP7jPkOs4xQDo4NHzpuJR5igjWgJIBPU6fI9Pzq~BMzjLiZOMp8xNWey1zKC96L0eX4of1MG~oUvq0qmIHGNa1TlUwBQAEAAEAAA==", + "x" + }; + for (String s : tests) { + test(s); + } + } + + public static void test(String s) { + System.out.println(s + " valid host? " + isValidKey(s) + " valid dest? " + isValidDest(s)); + } +****/ } From ccc8c04782e57a66f04c268c844bdbb8f91eb877 Mon Sep 17 00:00:00 2001 From: zzz Date: Mon, 28 Sep 2015 14:52:55 +0000 Subject: [PATCH 065/111] i2psnark: Support adding plain base 32 hashes convert plain hashes to upper case --- .../java/src/org/klomp/snark/web/I2PSnarkServlet.java | 6 ++++++ 1 file changed, 6 insertions(+) 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 72ea2ecad..fdd70c0d9 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java +++ b/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java @@ -981,6 +981,12 @@ public class I2PSnarkServlet extends BasicServlet { } else if (newURL.startsWith(MagnetURI.MAGNET) || newURL.startsWith(MagnetURI.MAGGOT)) { addMagnet(newURL, dir); } else if (newURL.length() == 40 && newURL.replaceAll("[a-fA-F0-9]", "").length() == 0) { + // hex + newURL = newURL.toUpperCase(Locale.US); + addMagnet(MagnetURI.MAGNET_FULL + newURL, dir); + } else if (newURL.length() == 32 && newURL.replaceAll("[a-zA-Z2-7]", "").length() == 0) { + // b32 + newURL = newURL.toUpperCase(Locale.US); addMagnet(MagnetURI.MAGNET_FULL + newURL, dir); } else { _manager.addMessage(_t("Invalid URL: Must start with \"http://\", \"{0}\", or \"{1}\"", From 5d345f65a3446c1341a141d0296f91c9f5b83a95 Mon Sep 17 00:00:00 2001 From: zzz Date: Mon, 28 Sep 2015 16:58:18 +0000 Subject: [PATCH 066/111] SusiDNS: Hide table headers and buttons if there are no search results --- apps/susidns/src/jsp/addressbook.jsp | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/apps/susidns/src/jsp/addressbook.jsp b/apps/susidns/src/jsp/addressbook.jsp index 60ee04d67..20ff0bfef 100644 --- a/apps/susidns/src/jsp/addressbook.jsp +++ b/apps/susidns/src/jsp/addressbook.jsp @@ -147,6 +147,7 @@ ${book.loadBookMessages}
                                      <%=intl._t("Name")%> <%=intl._t("Links")%> <%=intl._t("Destination")%>
                                    +<% if (book.getEntries().length > 0) { /* Don't show if no results. Can't figure out how to do this with c:if */ %>

                                    " > " >

                                    -
                                    +
                                    +<% } /* book..getEntries().length() > 0 */ %> + +<% if (book.getEntries().length > 0) { /* Don't show if no results. Can't figure out how to do this with c:if */ %>

                                    @@ -190,6 +196,7 @@ ${book.loadBookMessages} " />

                                    +<% } /* book..getEntries().length() > 0 */ %> <% /* book.notEmpty */ %> From 2f92b274466123b5b8a0c42a82c60a280713c9d6 Mon Sep 17 00:00:00 2001 From: kytv Date: Tue, 29 Sep 2015 19:30:13 +0000 Subject: [PATCH 067/111] Ticket #1596 - part 2 Removing 193.150.121.66 as a reseed host from the source and its certificate. --- .../certificates/ssl/193.150.121.66.crt | 21 ------------------- .../i2p/router/networkdb/reseed/Reseeder.java | 3 --- 2 files changed, 24 deletions(-) delete mode 100644 installer/resources/certificates/ssl/193.150.121.66.crt diff --git a/installer/resources/certificates/ssl/193.150.121.66.crt b/installer/resources/certificates/ssl/193.150.121.66.crt deleted file mode 100644 index 450581d23..000000000 --- a/installer/resources/certificates/ssl/193.150.121.66.crt +++ /dev/null @@ -1,21 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIDgDCCAmgCCQCAKEkFUJcEezANBgkqhkiG9w0BAQUFADCBgTELMAkGA1UEBhMC -Tk8xDTALBgNVBAgMBE9zbG8xDTALBgNVBAcMBE9zbG8xDDAKBgNVBAoMA0kyUDEM -MAoGA1UECwwDSTJQMRcwFQYDVQQDDA4xOTMuMTUwLjEyMS42NjEfMB0GCSqGSIb3 -DQEJARYQbWVlaEBpMnBtYWlsLm9yZzAeFw0xMzA2MjcxODM2MjhaFw0yMDA2MjUx -ODM2MjhaMIGBMQswCQYDVQQGEwJOTzENMAsGA1UECAwET3NsbzENMAsGA1UEBwwE -T3NsbzEMMAoGA1UECgwDSTJQMQwwCgYDVQQLDANJMlAxFzAVBgNVBAMMDjE5My4x -NTAuMTIxLjY2MR8wHQYJKoZIhvcNAQkBFhBtZWVoQGkycG1haWwub3JnMIIBIjAN -BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuBuFY4ZFvsbr5l1/s/GeUBLIWQLB -nqrRkonrwCyxgjSnnG1uz/Z5nf6QDUjiVnFKMXenLaDn4KCmEi4LjWQllhK9r6pj -BRkR7C0DTHq7WqfyvWnGSZZsOJDiH2vLlivV8N9oGdjxvv0N9No3AJcsmLYrxSLi -6/JF8xZ2HGuT/oWW6aWvpIOKpIqti865BJw5P5KgYAS24J8vHRFM3FA4dfLNTBA2 -IGqPqYLQA+2zfOC4z01aArmcYnT1iJLT7krgKnr/BXdJfGQ2GjxkRSt8IwB6WmXA -byz6QdNYM/0eubi102/zpD/DrySTU2kc8xKjknGUqBJvVdsL+iLK98uJrQIDAQAB -MA0GCSqGSIb3DQEBBQUAA4IBAQCTimMu3X7+ztXxlIFhwGh42GfMjeBYT0NHOLAy -ZtQNRqhNvkl3jZ4ERPLxP99+bcAfCX0wgVpgD32OWEZopwveRyMImP8HfFr4NnZ+ -edbM37fRYiVJv57kbi6O0rhEC7J5JF+fnCaZVLCuvYIrIXTdxTjvxuLhyan6Ej7V -7iGDJ8t16tpLVJgcXfRg+dvAa6aDOK6x3w78j0bvh6rhvpOd9sW/Nk3LBKP4Xgkx -PHkqm3hNfDIu8Hubeav9SA1kLVMS/uce52VyYMEDauObfC65ds0GRmCtYhZqMvj+ -FFCbssLraVJE9Hi/ZKGu33jNngDCG+wG+nmleksMYE1yTSRt ------END CERTIFICATE----- diff --git a/router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java b/router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java index bc7b1eeb1..d19147688 100644 --- a/router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java +++ b/router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java @@ -81,7 +81,6 @@ public class Reseeder { // Disabling everything, use SSL //"http://i2p.mooo.com/netDb/" + "," + - //"http://193.150.121.66/netDb/" + "," + //"http://uk.reseed.i2p2.no/" + "," + //"http://netdb.i2p2.no/"; // Only SU3 (v3) support ""; @@ -92,8 +91,6 @@ public class Reseeder { //"https://netdb.rows.io:444/" + "," + // Only HTTPS and SU3 (v3) support "https://i2pseed.zarrenspry.info/" + "," + // Only HTTPS and SU3 (v3) support "https://i2p.mooo.com/netDb/" + "," + - // ticket #1596 - // "https://193.150.121.66/netDb/" + "," + "https://netdb.i2p2.no/" + "," + // Only SU3 (v3) support, SNI required "https://us.reseed.i2p2.no:444/" + "," + "https://uk.reseed.i2p2.no:444/" + "," + From 5fa059b4a8ce910053c6fe81fda87e37eb8d8f2b Mon Sep 17 00:00:00 2001 From: kytv Date: Tue, 29 Sep 2015 19:41:01 +0000 Subject: [PATCH 068/111] Adding the new reseed server hosted by our friends at TorontoCrypto. Thanks. :) --- .../reseed/j_at_torontocrypto.org.crt | 34 +++++++++++++++++++ .../src/net/i2p/router/RouterVersion.java | 2 +- .../i2p/router/networkdb/reseed/Reseeder.java | 1 + 3 files changed, 36 insertions(+), 1 deletion(-) create mode 100644 installer/resources/certificates/reseed/j_at_torontocrypto.org.crt diff --git a/installer/resources/certificates/reseed/j_at_torontocrypto.org.crt b/installer/resources/certificates/reseed/j_at_torontocrypto.org.crt new file mode 100644 index 000000000..4a2789ec0 --- /dev/null +++ b/installer/resources/certificates/reseed/j_at_torontocrypto.org.crt @@ -0,0 +1,34 @@ +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- diff --git a/router/java/src/net/i2p/router/RouterVersion.java b/router/java/src/net/i2p/router/RouterVersion.java index e36cd3b14..7f4edb975 100644 --- a/router/java/src/net/i2p/router/RouterVersion.java +++ b/router/java/src/net/i2p/router/RouterVersion.java @@ -18,7 +18,7 @@ public class RouterVersion { /** deprecated */ public final static String ID = "Monotone"; public final static String VERSION = CoreVersion.VERSION; - public final static long BUILD = 12; + public final static long BUILD = 13; /** for example "-test" */ public final static String EXTRA = ""; diff --git a/router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java b/router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java index d19147688..59e697253 100644 --- a/router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java +++ b/router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java @@ -94,6 +94,7 @@ public class Reseeder { "https://netdb.i2p2.no/" + "," + // Only SU3 (v3) support, SNI required "https://us.reseed.i2p2.no:444/" + "," + "https://uk.reseed.i2p2.no:444/" + "," + + "https://www.torontocrypto.org:8443/" + "," + "https://reseed.i2p.vzaws.com:8443/" + ", " + // Only SU3 (v3) support "https://user.mx24.eu/" + "," + // Only HTTPS and SU3 (v3) support "https://ieb9oopo.mooo.com/"; // Only HTTPS and SU3 (v3) support From b068f9a262b05d14dc7349eb8cc213c39c01681c Mon Sep 17 00:00:00 2001 From: zzz Date: Fri, 2 Oct 2015 13:43:54 +0000 Subject: [PATCH 069/111] Router: Don't check config files for reload on Android --- core/java/src/net/i2p/util/LogWriterBase.java | 4 +++- .../src/net/i2p/router/startup/BootCommSystemJob.java | 10 +++++++--- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/core/java/src/net/i2p/util/LogWriterBase.java b/core/java/src/net/i2p/util/LogWriterBase.java index 08683b622..b9b98e10d 100644 --- a/core/java/src/net/i2p/util/LogWriterBase.java +++ b/core/java/src/net/i2p/util/LogWriterBase.java @@ -67,10 +67,12 @@ abstract class LogWriterBase implements Runnable { public void run() { _write = true; + // don't bother on Android + final boolean shouldReadConfig = !SystemVersion.isAndroid(); try { while (_write) { flushRecords(); - if (_write) + if (_write && shouldReadConfig) rereadConfig(); } } catch (Exception e) { diff --git a/router/java/src/net/i2p/router/startup/BootCommSystemJob.java b/router/java/src/net/i2p/router/startup/BootCommSystemJob.java index 2b3be5586..bb9f30846 100644 --- a/router/java/src/net/i2p/router/startup/BootCommSystemJob.java +++ b/router/java/src/net/i2p/router/startup/BootCommSystemJob.java @@ -14,6 +14,7 @@ import net.i2p.router.RouterContext; import net.i2p.router.RouterClock; import net.i2p.router.tasks.ReadConfigJob; import net.i2p.util.Log; +import net.i2p.util.SystemVersion; /** This actually boots almost everything */ class BootCommSystemJob extends JobImpl { @@ -46,9 +47,12 @@ class BootCommSystemJob extends JobImpl { // start I2CP getContext().jobQueue().addJob(new StartAcceptingClientsJob(getContext())); - Job j = new ReadConfigJob(getContext()); - j.getTiming().setStartAfter(getContext().clock().now() + 2*60*1000); - getContext().jobQueue().addJob(j); + if (!SystemVersion.isAndroid()) { + Job j = new ReadConfigJob(getContext()); + j.getTiming().setStartAfter(getContext().clock().now() + 2*60*1000); + getContext().jobQueue().addJob(j); + } + ((RouterClock) getContext().clock()).addShiftListener(getContext().router()); } From f93da93cf0097c414a8460b0c032e5abfb3f789e Mon Sep 17 00:00:00 2001 From: zzz Date: Fri, 2 Oct 2015 13:45:42 +0000 Subject: [PATCH 070/111] Router: Minor cleanup, remove some deprecated and small methods --- router/java/src/net/i2p/router/Router.java | 35 ++++------------------ 1 file changed, 6 insertions(+), 29 deletions(-) diff --git a/router/java/src/net/i2p/router/Router.java b/router/java/src/net/i2p/router/Router.java index fd68b7b69..0bad3eced 100644 --- a/router/java/src/net/i2p/router/Router.java +++ b/router/java/src/net/i2p/router/Router.java @@ -62,7 +62,7 @@ import net.i2p.util.Translate; /** * Main driver for the router. * - * For embedded use, instantiate and then call runRouter(). + * For embedded use, instantiate, call setKillVMOnEnd(false), and then call runRouter(). * */ public class Router implements RouterClock.ClockShiftListener { @@ -77,7 +77,6 @@ public class Router implements RouterClock.ClockShiftListener { public final Object routerInfoFileLock = new Object(); private final Object _configFileLock = new Object(); private long _started; - private boolean _higherVersionSeen; private boolean _killVMOnEnd; private int _gracefulExitCode; private I2PThread.OOMEventListener _oomListener; @@ -392,7 +391,6 @@ public class Router implements RouterClock.ClockShiftListener { CryptoChecker.warnUnavailableCrypto(_context); _routerInfo = null; - _higherVersionSeen = false; if (_log.shouldLog(Log.INFO)) _log.info("New router created with config file " + _configFilename); _oomListener = new OOMListener(_context); @@ -510,20 +508,6 @@ public class Router implements RouterClock.ClockShiftListener { _context.jobQueue().addJob(new PersistRouterInfoJob(_context)); } - /** - * True if the router has tried to communicate with another router who is running a higher - * incompatible protocol version. - * @deprecated unused - */ - public boolean getHigherVersionSeen() { return _higherVersionSeen; } - - /** - * True if the router has tried to communicate with another router who is running a higher - * incompatible protocol version. - * @deprecated unused - */ - public void setHigherVersionSeen(boolean seen) { _higherVersionSeen = seen; } - /** * Used only by routerconsole.. to be deprecated? */ @@ -577,7 +561,9 @@ public class Router implements RouterClock.ClockShiftListener { if (!SystemVersion.isAndroid()) I2PThread.addOOMEventListener(_oomListener); - setupHandlers(); + // message handlers + _context.inNetMessagePool().registerHandlerJobBuilder(GarlicMessage.MESSAGE_TYPE, new GarlicMessageHandler(_context)); + //if (ALLOW_DYNAMIC_KEYS) { // if ("true".equalsIgnoreCase(_context.getProperty(Router.PROP_HIDDEN, "false"))) // killKeys(); @@ -586,7 +572,7 @@ public class Router implements RouterClock.ClockShiftListener { _context.messageValidator().startup(); _context.tunnelDispatcher().startup(); _context.inNetMessagePool().startup(); - startupQueue(); + _context.jobQueue().runQueue(1); //_context.jobQueue().addJob(new CoalesceStatsJob(_context)); _context.simpleTimer2().addPeriodicEvent(new CoalesceStatsEvent(_context), COALESCE_TIME); _context.jobQueue().addJob(new UpdateRoutingKeyModifierJob(_context)); @@ -1080,15 +1066,6 @@ public class Router implements RouterClock.ClockShiftListener { saveConfig(PROP_JBIGI, loaded); } - private void startupQueue() { - _context.jobQueue().runQueue(1); - } - - private void setupHandlers() { - _context.inNetMessagePool().registerHandlerJobBuilder(GarlicMessage.MESSAGE_TYPE, new GarlicMessageHandler(_context)); - //_context.inNetMessagePool().registerHandlerJobBuilder(TunnelMessage.MESSAGE_TYPE, new TunnelMessageHandler(_context)); - } - /** shut down after all tunnels are gone */ public static final int EXIT_GRACEFUL = 2; /** shut down immediately */ @@ -1582,7 +1559,7 @@ public class Router implements RouterClock.ClockShiftListener { if (f.exists()) { long lastWritten = f.lastModified(); if (System.currentTimeMillis()-lastWritten > LIVELINESS_DELAY) { - System.err.println("WARN: Old router was not shut down gracefully, deleting router.ping"); + System.err.println("WARN: Old router was not shut down gracefully, deleting " + f); f.delete(); } else { return false; From f4a6cf200214ed6815650c11bc39f428cf328eec Mon Sep 17 00:00:00 2001 From: zzz Date: Sat, 3 Oct 2015 14:06:12 +0000 Subject: [PATCH 071/111] Show 'none' if no part. tunnels on /tunnels --- .../src/net/i2p/router/web/TunnelRenderer.java | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/apps/routerconsole/java/src/net/i2p/router/web/TunnelRenderer.java b/apps/routerconsole/java/src/net/i2p/router/web/TunnelRenderer.java index 3784e4a30..aab84c630 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/TunnelRenderer.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/TunnelRenderer.java @@ -66,11 +66,13 @@ public class TunnelRenderer { } List participating = _context.tunnelDispatcher().listParticipatingTunnels(); - Collections.sort(participating, new TunnelComparator()); - out.write("

                                    " + _t("Participating tunnels") + "

                                    \n"); - out.write("
                                    " + _t("Receive on") + "" + _t("From") + "" + out.write("

                                    " + _t("Participating tunnels") + "

                                    \n"); + if (!participating.isEmpty()) { + Collections.sort(participating, new TunnelComparator()); + out.write("" + "\n"); + } long processed = 0; RateStat rs = _context.statManager().getRate("tunnel.participatingMessageCount"); if (rs != null) @@ -125,10 +127,14 @@ public class TunnelRenderer { out.write(""); out.write("\n"); } - out.write("
                                    " + _t("Receive on") + "" + _t("From") + "" + _t("Send on") + "" + _t("To") + "" + _t("Expiration") + "" + _t("Usage") + "" + _t("Rate") + "" + _t("Role") + "
                                    " + _t("Participant") + "
                                    \n"); + if (!participating.isEmpty()) + out.write("
                                    \n"); if (displayed > DISPLAY_LIMIT) out.write("
                                    " + _t("Limited display to the {0} tunnels with the highest usage", DISPLAY_LIMIT) + "
                                    \n"); - out.write("
                                    " + _t("Inactive participating tunnels") + ": " + inactive + "
                                    \n"); + if (inactive > 0) + out.write("
                                    " + _t("Inactive participating tunnels") + ": " + inactive + "
                                    \n"); + else if (displayed <= 0) + out.write("
                                    " + _t("none") + "
                                    \n"); out.write("
                                    " + _t("Lifetime bandwidth usage") + ": " + DataHelper.formatSize2(processed*1024) + "B
                                    \n"); //renderPeers(out); out.write(""); From 03f9df4ff0d4f78434a42da147462db7a1f1ab9a Mon Sep 17 00:00:00 2001 From: dg2-new Date: Sun, 4 Oct 2015 15:17:26 +0000 Subject: [PATCH 072/111] JobQueue: Listen to clock shifts as well as clock changes (ticket #1014). Restarter: Don't restart the JobQueue or PeerManager (ticket #1014)/undo previous commit. More to do. --- router/java/src/net/i2p/router/JobQueue.java | 9 ++++++++- router/java/src/net/i2p/router/JobTiming.java | 7 ++++++- router/java/src/net/i2p/router/RouterVersion.java | 2 +- router/java/src/net/i2p/router/tasks/Restarter.java | 4 ++-- 4 files changed, 17 insertions(+), 5 deletions(-) diff --git a/router/java/src/net/i2p/router/JobQueue.java b/router/java/src/net/i2p/router/JobQueue.java index da08c521a..b08bf9058 100644 --- a/router/java/src/net/i2p/router/JobQueue.java +++ b/router/java/src/net/i2p/router/JobQueue.java @@ -27,6 +27,7 @@ import java.util.concurrent.atomic.AtomicInteger; import net.i2p.data.DataHelper; import net.i2p.router.message.HandleGarlicMessageJob; import net.i2p.router.networkdb.kademlia.HandleFloodfillDatabaseLookupMessageJob; +import net.i2p.router.RouterClock; import net.i2p.util.Clock; import net.i2p.util.I2PThread; import net.i2p.util.Log; @@ -516,9 +517,10 @@ public class JobQueue { * max number of runners. * */ - private final class QueuePumper implements Runnable, Clock.ClockUpdateListener { + private final class QueuePumper implements Runnable, Clock.ClockUpdateListener, RouterClock.ClockShiftListener { public QueuePumper() { _context.clock().addUpdateListener(this); + ((RouterClock) _context.clock()).addShiftListener(this); } public void run() { try { @@ -590,6 +592,7 @@ public class JobQueue { } // while (_alive) } catch (Throwable t) { _context.clock().removeUpdateListener(this); + ((RouterClock) _context.clock()).removeShiftListener(this); if (_log.shouldLog(Log.ERROR)) _log.error("pumper killed?!", t); } @@ -602,6 +605,10 @@ public class JobQueue { } } + public void clockShift(long delta) { + offsetChanged(delta); + } + } /** diff --git a/router/java/src/net/i2p/router/JobTiming.java b/router/java/src/net/i2p/router/JobTiming.java index 98d8e67c7..f934f1556 100644 --- a/router/java/src/net/i2p/router/JobTiming.java +++ b/router/java/src/net/i2p/router/JobTiming.java @@ -8,6 +8,7 @@ package net.i2p.router; * */ +import net.i2p.router.RouterClock; import net.i2p.util.Clock; /** @@ -15,7 +16,7 @@ import net.i2p.util.Clock; * * For use by the router only. Not to be used by applications or plugins. */ -public class JobTiming implements Clock.ClockUpdateListener { +public class JobTiming implements Clock.ClockUpdateListener, RouterClock.ClockShiftListener { private volatile long _start; private volatile long _actualStart; private volatile long _actualEnd; @@ -81,4 +82,8 @@ public class JobTiming implements Clock.ClockUpdateListener { if (_actualEnd != 0) _actualEnd += delta; } + + public void clockShift(long delta) { + offsetChanged(delta); + } } diff --git a/router/java/src/net/i2p/router/RouterVersion.java b/router/java/src/net/i2p/router/RouterVersion.java index 7f4edb975..31c35f8c3 100644 --- a/router/java/src/net/i2p/router/RouterVersion.java +++ b/router/java/src/net/i2p/router/RouterVersion.java @@ -18,7 +18,7 @@ public class RouterVersion { /** deprecated */ public final static String ID = "Monotone"; public final static String VERSION = CoreVersion.VERSION; - public final static long BUILD = 13; + public final static long BUILD = 14; /** for example "-test" */ public final static String EXTRA = ""; diff --git a/router/java/src/net/i2p/router/tasks/Restarter.java b/router/java/src/net/i2p/router/tasks/Restarter.java index 23991ae0e..c904cad50 100644 --- a/router/java/src/net/i2p/router/tasks/Restarter.java +++ b/router/java/src/net/i2p/router/tasks/Restarter.java @@ -30,9 +30,9 @@ public class Restarter implements Runnable { log.logAlways(Log.WARN, "Stopping the tunnel manager"); try { _context.tunnelManager().restart(); } catch (Throwable t) { log.log(Log.CRIT, "Error restarting the tunnel manager", t); } - try { _context.peerManager().restart(); } catch (Throwable t) { log.log(Log.CRIT, "Error restarting the peer manager", t); } + //try { _context.peerManager().restart(); } catch (Throwable t) { log.log(Log.CRIT, "Error restarting the peer manager", t); } //try { _context.netDb().restart(); } catch (Throwable t) { log.log(Log.CRIT, "Error restarting the networkDb", t); } - try { _context.jobQueue().restart(); } catch (Throwable t) { log.log(Log.CRIT, "Error restarting the job queue", t); } + //try { _context.jobQueue().restart(); } catch (Throwable t) { log.log(Log.CRIT, "Error restarting the job queue", t); } log.logAlways(Log.WARN, "Router teardown complete, restarting the router..."); try { Thread.sleep(10*1000); } catch (InterruptedException ie) {} From 419d6a8e186c467a4cb513e29b7cb757ec5c5d7e Mon Sep 17 00:00:00 2001 From: zzz Date: Thu, 8 Oct 2015 13:42:31 +0000 Subject: [PATCH 073/111] SimpleTimer2: Additional fix for uncaught IllegalStateException affecting streaming timers (ticket #1672) Minor streaming cleanup --- .../i2p/client/streaming/impl/Connection.java | 4 ++- core/java/src/net/i2p/util/SimpleTimer2.java | 25 +++++++++++++------ history.txt | 12 +++++++++ .../src/net/i2p/router/RouterVersion.java | 2 +- 4 files changed, 34 insertions(+), 9 deletions(-) diff --git a/apps/streaming/java/src/net/i2p/client/streaming/impl/Connection.java b/apps/streaming/java/src/net/i2p/client/streaming/impl/Connection.java index f5e93ddf0..478afcdb8 100644 --- a/apps/streaming/java/src/net/i2p/client/streaming/impl/Connection.java +++ b/apps/streaming/java/src/net/i2p/client/streaming/impl/Connection.java @@ -1311,7 +1311,9 @@ class Connection { } public long getNextSendTime() { return _nextSend; } + public void timeReached() { retransmit(); } + /** * Retransmit the packet if we need to. * @@ -1323,7 +1325,7 @@ class Connection { * * @return true if the packet was sent, false if it was not */ - public boolean retransmit() { + private boolean retransmit() { if (_packet.getAckTime() > 0) return false; diff --git a/core/java/src/net/i2p/util/SimpleTimer2.java b/core/java/src/net/i2p/util/SimpleTimer2.java index fa803338c..aff0b61f6 100644 --- a/core/java/src/net/i2p/util/SimpleTimer2.java +++ b/core/java/src/net/i2p/util/SimpleTimer2.java @@ -257,6 +257,8 @@ public class SimpleTimer2 { private long _nextRun; /** whether this was scheduled during RUNNING state. LOCKING: this */ private boolean _rescheduleAfterRun; + /** whether this was cancelled during RUNNING state. LOCKING: this */ + private boolean _cancelAfterRun; /** must call schedule() later */ public TimedEvent(SimpleTimer2 pool) { @@ -290,7 +292,8 @@ public class SimpleTimer2 { if (_log.shouldLog(Log.DEBUG)) _log.debug("Scheduling: " + this + " timeout = " + timeoutMs + " state: " + _state); if (timeoutMs <= 0) { - if (_log.shouldLog(Log.WARN)) + // streaming timers do call with timeoutMs == 0 + if (timeoutMs < 0 && _log.shouldLog(Log.WARN)) _log.warn("Timeout <= 0: " + this + " timeout = " + timeoutMs + " state: " + _state); timeoutMs = 1; // otherwise we may execute before _future is updated, which is fine // except it triggers 'early execution' warning logging @@ -298,6 +301,7 @@ public class SimpleTimer2 { // always set absolute time of execution _nextRun = timeoutMs + System.currentTimeMillis(); + _cancelAfterRun = false; switch(_state) { case RUNNING: @@ -373,7 +377,9 @@ public class SimpleTimer2 { case CANCELLED: // fall through case IDLE: break; // my preference is to throw IllegalState here, but let it be. - case RUNNING: // fall through + case RUNNING: + _cancelAfterRun = true; + return true; case SCHEDULED: boolean cancelled = _future.cancel(false); if (cancelled) @@ -447,11 +453,16 @@ public class SimpleTimer2 { case CANCELLED: break; // nothing case RUNNING: - _state = TimedEventState.IDLE; - // do we need to reschedule? - if (_rescheduleAfterRun) { - _rescheduleAfterRun = false; - schedule(_nextRun - System.currentTimeMillis()); + if (_cancelAfterRun) { + _cancelAfterRun = false; + _state = TimedEventState.CANCELLED; + } else { + _state = TimedEventState.IDLE; + // do we need to reschedule? + if (_rescheduleAfterRun) { + _rescheduleAfterRun = false; + schedule(_nextRun - System.currentTimeMillis()); + } } } } diff --git a/history.txt b/history.txt index fc5a07713..bd4cde9e3 100644 --- a/history.txt +++ b/history.txt @@ -1,3 +1,15 @@ +2015-10-08 zzz + * SimpleTimer2: Additional fix for uncaught IllegalStateException + affecting streaming timers (ticket #1672) + +2015-10-02 zzz + * Router: Don't check config files for reload on Android + +2015-09-28 zzz + * Addressbook: Fix isValidDest() for EC/Ed dests + * i2psnark: Support adding plain base 32 hashes + * Susimail: Hide headers and buttons if search results are empty + 2015-09-27 dg * Router: Fix soft restarts for 'massive' clock jumps (over +150s or -61s) and recover from standby and hibernate (ticket #1014). diff --git a/router/java/src/net/i2p/router/RouterVersion.java b/router/java/src/net/i2p/router/RouterVersion.java index 31c35f8c3..ea17ad55f 100644 --- a/router/java/src/net/i2p/router/RouterVersion.java +++ b/router/java/src/net/i2p/router/RouterVersion.java @@ -18,7 +18,7 @@ public class RouterVersion { /** deprecated */ public final static String ID = "Monotone"; public final static String VERSION = CoreVersion.VERSION; - public final static long BUILD = 14; + public final static long BUILD = 15; /** for example "-test" */ public final static String EXTRA = ""; From b32c8d5fa4cec3cc5cf617ef6e003aeceae04ee1 Mon Sep 17 00:00:00 2001 From: zzz Date: Sat, 10 Oct 2015 12:29:52 +0000 Subject: [PATCH 074/111] NamingServices: Add support for lookups prefixed with "www." --- .../client/naming/BlockfileNamingService.java | 22 +++++++++++++++++++ .../naming/SingleFileNamingService.java | 4 ++++ 2 files changed, 26 insertions(+) diff --git a/core/java/src/net/i2p/client/naming/BlockfileNamingService.java b/core/java/src/net/i2p/client/naming/BlockfileNamingService.java index ec12eb792..efa8b3e06 100644 --- a/core/java/src/net/i2p/client/naming/BlockfileNamingService.java +++ b/core/java/src/net/i2p/client/naming/BlockfileNamingService.java @@ -621,11 +621,33 @@ public class BlockfileNamingService extends DummyNamingService { ////////// Start NamingService API /* + * + * Will strip a "www." prefix and retry if lookup fails + * + * @param hostname upper/lower case ok * @param options If non-null and contains the key "list", lookup in * that list only, otherwise all lists */ @Override public Destination lookup(String hostname, Properties lookupOptions, Properties storedOptions) { + Destination rv = lookup2(hostname, lookupOptions, storedOptions); + if (rv == null) { + // if hostname starts with "www.", strip and try again + // but not for www.i2p + hostname = hostname.toLowerCase(Locale.US); + if (hostname.startsWith("www.") && hostname.length() > 7) { + hostname = hostname.substring(4); + rv = lookup2(hostname, lookupOptions, storedOptions); + } + } + return rv; + } + + /* + * @param options If non-null and contains the key "list", lookup in + * that list only, otherwise all lists + */ + private Destination lookup2(String hostname, Properties lookupOptions, Properties storedOptions) { String listname = null; if (lookupOptions != null) listname = lookupOptions.getProperty("list"); diff --git a/core/java/src/net/i2p/client/naming/SingleFileNamingService.java b/core/java/src/net/i2p/client/naming/SingleFileNamingService.java index c331fae01..219c61bbc 100644 --- a/core/java/src/net/i2p/client/naming/SingleFileNamingService.java +++ b/core/java/src/net/i2p/client/naming/SingleFileNamingService.java @@ -77,6 +77,8 @@ public class SingleFileNamingService extends NamingService { } /** + * Will strip a "www." prefix and retry if lookup fails + * * @param hostname case-sensitive; caller should convert to lower case * @param lookupOptions ignored * @param storedOptions ignored @@ -85,6 +87,8 @@ public class SingleFileNamingService extends NamingService { public Destination lookup(String hostname, Properties lookupOptions, Properties storedOptions) { try { String key = getKey(hostname); + if (key == null && hostname.startsWith("www.") && hostname.length() > 7) + key = getKey(hostname.substring(4)); if (key != null) return lookupBase64(key); } catch (Exception ioe) { From 7063609f05d5959f3f8922d4a07285af64469b37 Mon Sep 17 00:00:00 2001 From: zzz Date: Sat, 10 Oct 2015 13:33:46 +0000 Subject: [PATCH 075/111] JobQueue: Only adjust timing for negative clock shifts --- router/java/src/net/i2p/router/JobQueue.java | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/router/java/src/net/i2p/router/JobQueue.java b/router/java/src/net/i2p/router/JobQueue.java index b08bf9058..2641707be 100644 --- a/router/java/src/net/i2p/router/JobQueue.java +++ b/router/java/src/net/i2p/router/JobQueue.java @@ -522,6 +522,7 @@ public class JobQueue { _context.clock().addUpdateListener(this); ((RouterClock) _context.clock()).addShiftListener(this); } + public void run() { try { while (_alive) { @@ -591,10 +592,11 @@ public class JobQueue { } catch (InterruptedException ie) {} } // while (_alive) } catch (Throwable t) { - _context.clock().removeUpdateListener(this); - ((RouterClock) _context.clock()).removeShiftListener(this); if (_log.shouldLog(Log.ERROR)) _log.error("pumper killed?!", t); + } finally { + _context.clock().removeUpdateListener(this); + ((RouterClock) _context.clock()).removeShiftListener(this); } } @@ -605,8 +607,20 @@ public class JobQueue { } } + /** + * Clock shift listener. + * Only adjust timings for negative shifts. + * For positive shifts, just wake up the pumper. + * @since 0.9.23 + */ public void clockShift(long delta) { - offsetChanged(delta); + if (delta < 0) { + offsetChanged(delta); + } else { + synchronized (_jobLock) { + _jobLock.notifyAll(); + } + } } } From dd4d12f287cc4612473a38d67837639ff924c44a Mon Sep 17 00:00:00 2001 From: zzz Date: Sat, 10 Oct 2015 14:02:48 +0000 Subject: [PATCH 076/111] i2psnark: Increase max piece size to 16 MB, max files to 999, close files faster based on file count (tickets #1626, #1671) Remove dup synchs --- .../src/org/klomp/snark/PeerCheckerTask.java | 18 ++++++++++++- .../src/org/klomp/snark/SnarkManager.java | 2 +- .../java/src/org/klomp/snark/Storage.java | 26 ++++++++++--------- history.txt | 9 +++++++ .../src/net/i2p/router/RouterVersion.java | 2 +- 5 files changed, 42 insertions(+), 15 deletions(-) diff --git a/apps/i2psnark/java/src/org/klomp/snark/PeerCheckerTask.java b/apps/i2psnark/java/src/org/klomp/snark/PeerCheckerTask.java index 430f6c7ae..c2abf6660 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/PeerCheckerTask.java +++ b/apps/i2psnark/java/src/org/klomp/snark/PeerCheckerTask.java @@ -267,7 +267,23 @@ class PeerCheckerTask implements Runnable // close out unused files, but we don't need to do it every time Storage storage = coordinator.getStorage(); - if (storage != null && (_runCount % 4) == 0) { + if (storage != null) { + // The more files a torrent has, the more often we call the cleaner, + // to keep from running out of FDs + int files = storage.getFileCount(); + int skip; + if (files == 1) + skip = 6; + else if (files <= 4) + skip = 4; + else if (files <= 20) + skip = 3; + else if (files <= 50) + skip = 2; + else + skip = 1; + + if ((_runCount % skip) == 0) storage.cleanRAFs(); } diff --git a/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java b/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java index bcb4fa34c..98d0ee2c0 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java +++ b/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java @@ -1092,7 +1092,7 @@ public class SnarkManager implements CompleteListener { } /** hardcoded for sanity. perhaps this should be customizable, for people who increase their ulimit, etc. */ - public static final int MAX_FILES_PER_TORRENT = 512; + public static final int MAX_FILES_PER_TORRENT = 999; /** * Set of canonical .torrent filenames that we are dealing with. diff --git a/apps/i2psnark/java/src/org/klomp/snark/Storage.java b/apps/i2psnark/java/src/org/klomp/snark/Storage.java index 62cb1aa45..3f1682318 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/Storage.java +++ b/apps/i2psnark/java/src/org/klomp/snark/Storage.java @@ -78,7 +78,7 @@ public class Storage implements Closeable /** The default piece size. */ private static final int DEFAULT_PIECE_SIZE = 256*1024; /** bigger than this will be rejected */ - public static final int MAX_PIECE_SIZE = 8*1024*1024; + public static final int MAX_PIECE_SIZE = 16*1024*1024; /** The maximum number of pieces in a torrent. */ public static final int MAX_PIECES = 10*1024; public static final long MAX_TOTAL_SIZE = MAX_PIECE_SIZE * (long) MAX_PIECES; @@ -819,6 +819,14 @@ public class Storage implements Closeable return rv; } + /** + * Does not include directories. + * @since 0.9.23 + */ + public int getFileCount() { + return _torrentFiles.size(); + } + /** * Includes the base for a multi-file torrent. * Sorted bottom-up for easy deletion. @@ -958,11 +966,9 @@ public class Storage implements Closeable pieceEnd += length; while (fileEnd <= pieceEnd) { TorrentFile tf = _torrentFiles.get(file); - synchronized(tf) { - try { - tf.closeRAF(); - } catch (IOException ioe) {} - } + try { + tf.closeRAF(); + } catch (IOException ioe) {} if (++file >= _torrentFiles.size()) break; fileEnd += _torrentFiles.get(file).length; @@ -1035,9 +1041,7 @@ public class Storage implements Closeable for (TorrentFile tf : _torrentFiles) { try { - synchronized(tf) { tf.closeRAF(); - } } catch (IOException ioe) { _log.error("Error closing " + tf, ioe); // gobble gobble @@ -1262,17 +1266,15 @@ public class Storage implements Closeable return length; } - private static final long RAFCloseDelay = 4*60*1000; + private static final long RAF_CLOSE_DELAY = 4*60*1000; /** * Close unused RAFs - call periodically */ public void cleanRAFs() { - long cutoff = System.currentTimeMillis() - RAFCloseDelay; + long cutoff = System.currentTimeMillis() - RAF_CLOSE_DELAY; for (TorrentFile tf : _torrentFiles) { - synchronized(tf) { tf.closeRAF(cutoff); - } } } diff --git a/history.txt b/history.txt index bd4cde9e3..0dccbc130 100644 --- a/history.txt +++ b/history.txt @@ -1,3 +1,9 @@ +2015-10-10 zzz + * i2psnark: Increase max piece size to 16 MB, max files to 999, + close files faster based on file count (tickets #1626, #1671) + * JobQueue: Only adjust timing for negative clock shifts + * NamingServices: Add support for lookups prefixed with "www." + 2015-10-08 zzz * SimpleTimer2: Additional fix for uncaught IllegalStateException affecting streaming timers (ticket #1672) @@ -30,6 +36,9 @@ 2015-09-25 dg * Rename _() for translation to _t() for Java 9 compatibility (ticket #1456) +2015-09-24 zzz + - Rename bad .torrent files instead of deleting them + 2015-09-20 dg * /configreseed: Add 'Reset URL list' button for revert to default hosts (ticket #1554, thanks dzirtt@gmail.com) diff --git a/router/java/src/net/i2p/router/RouterVersion.java b/router/java/src/net/i2p/router/RouterVersion.java index ea17ad55f..e1f87e077 100644 --- a/router/java/src/net/i2p/router/RouterVersion.java +++ b/router/java/src/net/i2p/router/RouterVersion.java @@ -18,7 +18,7 @@ public class RouterVersion { /** deprecated */ public final static String ID = "Monotone"; public final static String VERSION = CoreVersion.VERSION; - public final static long BUILD = 15; + public final static long BUILD = 16; /** for example "-test" */ public final static String EXTRA = ""; From 68aa8800b6b3fe55da255a6707e11082f6f9c2b2 Mon Sep 17 00:00:00 2001 From: zzz Date: Sat, 10 Oct 2015 15:45:54 +0000 Subject: [PATCH 077/111] increase rekey probability --- .../java/src/net/i2p/router/startup/LoadRouterInfoJob.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/router/java/src/net/i2p/router/startup/LoadRouterInfoJob.java b/router/java/src/net/i2p/router/startup/LoadRouterInfoJob.java index 75977e0ab..f58a1002c 100644 --- a/router/java/src/net/i2p/router/startup/LoadRouterInfoJob.java +++ b/router/java/src/net/i2p/router/startup/LoadRouterInfoJob.java @@ -112,9 +112,9 @@ class LoadRouterInfoJob extends JobImpl { boolean sigTypeChanged = stype != cstype; if (sigTypeChanged && getContext().getProperty(CreateRouterInfoJob.PROP_ROUTER_SIGTYPE) == null) { // Not explicitly configured, and default has changed - // Give a 10% chance of rekeying for each restart - // TODO reduce from 20 to ~3 (i.e. increase probability) in future release - if (getContext().random().nextInt(20) > 0) { + // Give a 15% chance of rekeying for each restart + // TODO reduce to ~3 (i.e. increase probability) in future release + if (getContext().random().nextInt(7) > 0) { sigTypeChanged = false; if (_log.shouldWarn()) _log.warn("Deferring RI rekey from " + stype + " to " + cstype); From 971a2652e34dce2e290d869ea50f5da01caf1cba Mon Sep 17 00:00:00 2001 From: zzz Date: Sat, 10 Oct 2015 19:53:34 +0000 Subject: [PATCH 078/111] adjust date in warning --- .../java/src/net/i2p/router/web/RouterConsoleRunner.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/routerconsole/java/src/net/i2p/router/web/RouterConsoleRunner.java b/apps/routerconsole/java/src/net/i2p/router/web/RouterConsoleRunner.java index 91483b97f..f16cee608 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/RouterConsoleRunner.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/RouterConsoleRunner.java @@ -299,12 +299,12 @@ public class RouterConsoleRunner implements RouterApp { log.logAlways(net.i2p.util.Log.WARN, s); System.out.println("Warning: " + s); if (noJava7) { - s = "Java 7 will be required by mid-2015, please upgrade soon"; + s = "Java 7 will be required by late 2015, please upgrade soon"; log.logAlways(net.i2p.util.Log.WARN, s); System.out.println("Warning: " + s); } if (noPack200) { - s = "Pack200 will be required by mid-2015, please upgrade Java soon"; + s = "Pack200 will be required by late 2015, please upgrade Java soon"; log.logAlways(net.i2p.util.Log.WARN, s); System.out.println("Warning: " + s); } From 55a6f446515651a107f179ef71966814a4672614 Mon Sep 17 00:00:00 2001 From: zzz Date: Sun, 11 Oct 2015 15:39:28 +0000 Subject: [PATCH 079/111] Crypto: Test for broken Gentoo ECDSA support Add SystemVersion.isJava9() --- core/java/src/net/i2p/crypto/SigType.java | 22 +++++++++++++++++-- core/java/src/net/i2p/util/SystemVersion.java | 21 ++++++++++++++++++ history.txt | 4 ++++ .../src/net/i2p/router/RouterVersion.java | 2 +- 4 files changed, 46 insertions(+), 3 deletions(-) diff --git a/core/java/src/net/i2p/crypto/SigType.java b/core/java/src/net/i2p/crypto/SigType.java index ca05f8eed..48ad93e0a 100644 --- a/core/java/src/net/i2p/crypto/SigType.java +++ b/core/java/src/net/i2p/crypto/SigType.java @@ -11,7 +11,9 @@ import java.util.Map; import net.i2p.crypto.eddsa.spec.EdDSANamedCurveTable; import net.i2p.data.Hash; +import net.i2p.data.SigningPrivateKey; import net.i2p.data.SimpleDataStructure; +import net.i2p.util.SystemVersion; /** * Defines the properties for various signature types @@ -193,8 +195,24 @@ public enum SigType { return true; try { getParams(); - if (getBaseAlgorithm() != SigAlgo.EdDSA) - Signature.getInstance(getAlgorithmName()); + if (getBaseAlgorithm() != SigAlgo.EdDSA) { + Signature jsig = Signature.getInstance(getAlgorithmName()); + if (getBaseAlgorithm() == SigAlgo.EC && SystemVersion.isGentoo() ) { + // Do a full keygen/sign test on Gentoo, because it lies. Keygen works but sigs fail. + // https://bugs.gentoo.org/show_bug.cgi?id=528338 + // http://icedtea.classpath.org/bugzilla/show_bug.cgi?id=2497 + // http://zzz.i2p/topics/1931 + // Be sure nothing in the code paths below calls isAvailable() + // get an I2P keypair + SimpleDataStructure[] keys = KeyGenerator.getInstance().generateSigningKeys(this); + SigningPrivateKey privKey = (SigningPrivateKey) keys[1]; + // convert privkey back to Java key and sign + jsig.initSign(SigUtil.toJavaECKey(privKey)); + // use the pubkey as random data + jsig.update(keys[0].getData()); + jsig.sign(); + } + } getDigestInstance(); getHashInstance(); } catch (Exception e) { diff --git a/core/java/src/net/i2p/util/SystemVersion.java b/core/java/src/net/i2p/util/SystemVersion.java index 6650cf479..3e5e56e7c 100644 --- a/core/java/src/net/i2p/util/SystemVersion.java +++ b/core/java/src/net/i2p/util/SystemVersion.java @@ -18,6 +18,8 @@ public abstract class SystemVersion { private static final boolean _isArm = System.getProperty("os.arch").startsWith("arm"); private static final boolean _isX86 = System.getProperty("os.arch").contains("86") || System.getProperty("os.arch").equals("amd64"); + private static final boolean _isGentoo = System.getProperty("os.version").contains("gentoo") || + System.getProperty("os.version").contains("hardened"); // Funtoo private static final boolean _isAndroid; private static final boolean _isApache; private static final boolean _isGNU; @@ -27,6 +29,7 @@ public abstract class SystemVersion { private static final boolean _oneDotSix; private static final boolean _oneDotSeven; private static final boolean _oneDotEight; + private static final boolean _oneDotNine; private static final int _androidSDK; static { @@ -62,10 +65,12 @@ public abstract class SystemVersion { _oneDotSix = _androidSDK >= 9; _oneDotSeven = _androidSDK >= 19; _oneDotEight = false; + _oneDotNine = false; } else { _oneDotSix = VersionComparator.comp(System.getProperty("java.version"), "1.6") >= 0; _oneDotSeven = _oneDotSix && VersionComparator.comp(System.getProperty("java.version"), "1.7") >= 0; _oneDotEight = _oneDotSeven && VersionComparator.comp(System.getProperty("java.version"), "1.8") >= 0; + _oneDotNine = _oneDotEight && VersionComparator.comp(System.getProperty("java.version"), "1.9") >= 0; } } @@ -95,6 +100,13 @@ public abstract class SystemVersion { return _isGNU; } + /** + * @since 0.9.23 + */ + public static boolean isGentoo() { + return _isGentoo; + } + /** * @since 0.9.8 */ @@ -139,6 +151,15 @@ public abstract class SystemVersion { return _oneDotEight; } + /** + * + * @return true if Java 1.9 or higher, false for Android. + * @since 0.9.23 + */ + public static boolean isJava9() { + return _oneDotNine; + } + /** * This isn't always correct. * http://stackoverflow.com/questions/807263/how-do-i-detect-which-kind-of-jre-is-installed-32bit-vs-64bit diff --git a/history.txt b/history.txt index 0dccbc130..80b38233e 100644 --- a/history.txt +++ b/history.txt @@ -1,8 +1,12 @@ +2015-10-11 zzz + * Crypto: Test for broken Gentoo ECDSA support + 2015-10-10 zzz * i2psnark: Increase max piece size to 16 MB, max files to 999, close files faster based on file count (tickets #1626, #1671) * JobQueue: Only adjust timing for negative clock shifts * NamingServices: Add support for lookups prefixed with "www." + * Startup: Increase rekey probability 2015-10-08 zzz * SimpleTimer2: Additional fix for uncaught IllegalStateException diff --git a/router/java/src/net/i2p/router/RouterVersion.java b/router/java/src/net/i2p/router/RouterVersion.java index e1f87e077..8ab24107c 100644 --- a/router/java/src/net/i2p/router/RouterVersion.java +++ b/router/java/src/net/i2p/router/RouterVersion.java @@ -18,7 +18,7 @@ public class RouterVersion { /** deprecated */ public final static String ID = "Monotone"; public final static String VERSION = CoreVersion.VERSION; - public final static long BUILD = 16; + public final static long BUILD = 17; /** for example "-test" */ public final static String EXTRA = ""; From 2c03b434e128d94226e424fe032cd97ed51a67b0 Mon Sep 17 00:00:00 2001 From: zzz Date: Tue, 13 Oct 2015 19:24:30 +0000 Subject: [PATCH 080/111] Startup: Delete our old RI from netDB when rekeying --- .../kademlia/PersistentDataStore.java | 21 +++++++++++++++++-- .../i2p/router/startup/LoadRouterInfoJob.java | 13 +++++++++++- 2 files changed, 31 insertions(+), 3 deletions(-) diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/PersistentDataStore.java b/router/java/src/net/i2p/router/networkdb/kademlia/PersistentDataStore.java index c3c413930..90a51740c 100644 --- a/router/java/src/net/i2p/router/networkdb/kademlia/PersistentDataStore.java +++ b/router/java/src/net/i2p/router/networkdb/kademlia/PersistentDataStore.java @@ -44,8 +44,10 @@ import net.i2p.util.SecureFileOutputStream; * Write out keys to disk when we get them and periodically read ones we don't know * about into memory, with newly read routers are also added to the routing table. * + * Public only for access to static methods by startup classes + * */ -class PersistentDataStore extends TransientDataStore { +public class PersistentDataStore extends TransientDataStore { private final File _dbDir; private final KademliaNetworkDatabaseFacade _facade; private final Writer _writer; @@ -630,8 +632,23 @@ class PersistentDataStore extends TransientDataStore { return ROUTERINFO_PREFIX + b64 + ROUTERINFO_SUFFIX; return DIR_PREFIX + b64.charAt(0) + File.separatorChar + ROUTERINFO_PREFIX + b64 + ROUTERINFO_SUFFIX; } + + /** + * The persistent RI file for a hash. + * This is available before the netdb subsystem is running, so we can delete our old RI. + * + * @return non-null, should be absolute, does not necessarily exist + * @since 0.9.23 + */ + public static File getRouterInfoFile(RouterContext ctx, Hash hash) { + String b64 = hash.toBase64(); + File dir = new File(ctx.getRouterDir(), ctx.getProperty(KademliaNetworkDatabaseFacade.PROP_DB_DIR, KademliaNetworkDatabaseFacade.DEFAULT_DB_DIR)); + if (ctx.getBooleanProperty(PROP_FLAT)) + return new File(dir, ROUTERINFO_PREFIX + b64 + ROUTERINFO_SUFFIX); + return new File(dir, DIR_PREFIX + b64.charAt(0) + File.separatorChar + ROUTERINFO_PREFIX + b64 + ROUTERINFO_SUFFIX); + } - static Hash getRouterInfoHash(String filename) { + private static Hash getRouterInfoHash(String filename) { return getHash(filename, ROUTERINFO_PREFIX, ROUTERINFO_SUFFIX); } diff --git a/router/java/src/net/i2p/router/startup/LoadRouterInfoJob.java b/router/java/src/net/i2p/router/startup/LoadRouterInfoJob.java index f58a1002c..1ddce12b9 100644 --- a/router/java/src/net/i2p/router/startup/LoadRouterInfoJob.java +++ b/router/java/src/net/i2p/router/startup/LoadRouterInfoJob.java @@ -20,6 +20,7 @@ import net.i2p.crypto.SigType; import net.i2p.data.Certificate; import net.i2p.data.DataFormatException; import net.i2p.data.DataHelper; +import net.i2p.data.Hash; import net.i2p.data.PrivateKey; import net.i2p.data.PublicKey; import net.i2p.data.SigningPrivateKey; @@ -30,6 +31,7 @@ import net.i2p.data.router.RouterPrivateKeyFile; import net.i2p.router.JobImpl; import net.i2p.router.Router; import net.i2p.router.RouterContext; +import net.i2p.router.networkdb.kademlia.PersistentDataStore; import net.i2p.util.Log; /** @@ -122,9 +124,18 @@ class LoadRouterInfoJob extends JobImpl { } if (sigTypeChanged || shouldRebuild(privkey)) { + if (_us != null) { + Hash h = _us.getIdentity().getHash(); + _log.logAlways(Log.WARN, "Deleting old router identity " + h.toBase64()); + // the netdb hasn't started yet, but we want to delete the RI + File f = PersistentDataStore.getRouterInfoFile(getContext(), h); + f.delete(); + // the banlist can be called at any time + getContext().banlist().banlistRouterForever(h, "Our previous identity"); + _us = null; + } if (sigTypeChanged) _log.logAlways(Log.WARN, "Rebuilding RouterInfo with new signature type " + cstype); - _us = null; // windows... close before deleting if (fis1 != null) { try { fis1.close(); } catch (IOException ioe) {} From 5e879b85a8dbe569809bb96cf764f7fc281eb05c Mon Sep 17 00:00:00 2001 From: zzz Date: Tue, 13 Oct 2015 19:49:18 +0000 Subject: [PATCH 081/111] fix installer build --- .../i2p/router/networkdb/kademlia/PersistentDataStore.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/PersistentDataStore.java b/router/java/src/net/i2p/router/networkdb/kademlia/PersistentDataStore.java index 90a51740c..a04a339cc 100644 --- a/router/java/src/net/i2p/router/networkdb/kademlia/PersistentDataStore.java +++ b/router/java/src/net/i2p/router/networkdb/kademlia/PersistentDataStore.java @@ -648,7 +648,10 @@ public class PersistentDataStore extends TransientDataStore { return new File(dir, DIR_PREFIX + b64.charAt(0) + File.separatorChar + ROUTERINFO_PREFIX + b64 + ROUTERINFO_SUFFIX); } - private static Hash getRouterInfoHash(String filename) { + /** + * Package private for installer BundleRouterInfos + */ + static Hash getRouterInfoHash(String filename) { return getHash(filename, ROUTERINFO_PREFIX, ROUTERINFO_SUFFIX); } From 9224afb78d7bf301d4efbd02cf1e7a4520538b19 Mon Sep 17 00:00:00 2001 From: zzz Date: Tue, 13 Oct 2015 21:38:19 +0000 Subject: [PATCH 082/111] i2psnark: Don't show empty fields on details page --- .../java/src/org/klomp/snark/web/I2PSnarkServlet.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) 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 fdd70c0d9..913fd6d77 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java +++ b/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java @@ -2751,7 +2751,7 @@ public class I2PSnarkServlet extends BasicServlet { buf.append("
                                    "); toThemeImg(buf, "details"); buf.append(" ") @@ -2768,13 +2768,13 @@ public class I2PSnarkServlet extends BasicServlet { } buf.append("] "); } - buf.append("
                                    "); @@ -2799,7 +2799,7 @@ public class I2PSnarkServlet extends BasicServlet { .append("
                                    "); From 6aa8ed12805a36d3eb899c09f467286ea2221afe Mon Sep 17 00:00:00 2001 From: zzz Date: Wed, 14 Oct 2015 18:22:35 +0000 Subject: [PATCH 083/111] Update: Require Java 7 to download dev builds --- .../router/update/DevSU3UpdateChecker.java | 11 +++++++- .../router/update/UnsignedUpdateChecker.java | 16 +++++++++--- .../src/net/i2p/router/web/NewsHelper.java | 22 ++++++++++++++++ .../src/net/i2p/router/web/SummaryHelper.java | 26 +++++++++++++++++++ 4 files changed, 71 insertions(+), 4 deletions(-) diff --git a/apps/routerconsole/java/src/net/i2p/router/update/DevSU3UpdateChecker.java b/apps/routerconsole/java/src/net/i2p/router/update/DevSU3UpdateChecker.java index 8c5eeed54..4c5cd902b 100644 --- a/apps/routerconsole/java/src/net/i2p/router/update/DevSU3UpdateChecker.java +++ b/apps/routerconsole/java/src/net/i2p/router/update/DevSU3UpdateChecker.java @@ -10,8 +10,10 @@ import net.i2p.router.RouterContext; import net.i2p.router.RouterVersion; import net.i2p.router.web.ConfigUpdateHandler; import net.i2p.update.*; +import net.i2p.util.Log; import net.i2p.util.PartialEepGet; import net.i2p.util.PortMapper; +import net.i2p.util.SystemVersion; import net.i2p.util.VersionComparator; /** @@ -73,8 +75,15 @@ class DevSU3UpdateChecker extends UpdateRunner { String newVersion = TrustedUpdate.getVersionString(new ByteArrayInputStream(_baos.toByteArray())); boolean newer = VersionComparator.comp(newVersion, RouterVersion.FULL_VERSION) > 0; if (newer) { - _mgr.notifyVersionAvailable(this, _currentURI, UpdateType.ROUTER_DEV_SU3, "", UpdateMethod.HTTP, + if (SystemVersion.isJava7()) { + _mgr.notifyVersionAvailable(this, _currentURI, UpdateType.ROUTER_DEV_SU3, "", UpdateMethod.HTTP, _urls, newVersion, RouterVersion.FULL_VERSION); + } else { + String ourJava = System.getProperty("java.version"); + String msg = _mgr._t("Requires Java version {0} but installed Java version is {1}", "1.7", ourJava); + _log.logAlways(Log.WARN, "Cannot update to version " + newVersion + ": " + msg); + _mgr.notifyVersionConstraint(this, _currentURI, UpdateType.ROUTER_DEV_SU3, "", newVersion, msg); + } } else { //updateStatus("" + _t("No new version found at {0}", linkify(url)) + ""); if (_log.shouldWarn()) diff --git a/apps/routerconsole/java/src/net/i2p/router/update/UnsignedUpdateChecker.java b/apps/routerconsole/java/src/net/i2p/router/update/UnsignedUpdateChecker.java index 5d3a45695..02406e418 100644 --- a/apps/routerconsole/java/src/net/i2p/router/update/UnsignedUpdateChecker.java +++ b/apps/routerconsole/java/src/net/i2p/router/update/UnsignedUpdateChecker.java @@ -8,7 +8,9 @@ import net.i2p.router.util.RFC822Date; import net.i2p.router.web.ConfigUpdateHandler; import net.i2p.update.*; import net.i2p.util.EepHead; +import net.i2p.util.Log; import net.i2p.util.PortMapper; +import net.i2p.util.SystemVersion; /** * Does a simple EepHead to get the last-modified header. @@ -76,9 +78,17 @@ class UnsignedUpdateChecker extends UpdateRunner { if (modtime <= 0) return false; if (_ms <= 0) return false; if (modtime > _ms) { - _unsignedUpdateAvailable = true; - _mgr.notifyVersionAvailable(this, _urls.get(0), getType(), "", getMethod(), _urls, - Long.toString(modtime), ""); + String newVersion = Long.toString(modtime); + if (SystemVersion.isJava7()) { + _unsignedUpdateAvailable = true; + _mgr.notifyVersionAvailable(this, _urls.get(0), getType(), "", getMethod(), _urls, + newVersion, ""); + } else { + String ourJava = System.getProperty("java.version"); + String msg = _mgr._t("Requires Java version {0} but installed Java version is {1}", "1.7", ourJava); + _log.logAlways(Log.WARN, "Cannot update to version " + newVersion + ": " + msg); + _mgr.notifyVersionConstraint(this, _urls.get(0), getType(), "", newVersion, msg); + } } } return true; diff --git a/apps/routerconsole/java/src/net/i2p/router/web/NewsHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/NewsHelper.java index 5b068f4b1..ee353925a 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/NewsHelper.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/NewsHelper.java @@ -99,6 +99,28 @@ public class NewsHelper extends ContentHelper { return mgr.getUpdateConstraint(ROUTER_SIGNED, ""); } + /** + * Translated message about new version available but constrained + * @return null if none + * @since 0.9.23 + */ + public static String unsignedUpdateConstraint() { + ConsoleUpdateManager mgr = ConsoleUpdateManager.getInstance(); + if (mgr == null) return null; + return mgr.getUpdateConstraint(ROUTER_UNSIGNED, ""); + } + + /** + * Translated message about new version available but constrained + * @return null if none + * @since 0.9.23 + */ + public static String devSU3UpdateConstraint() { + ConsoleUpdateManager mgr = ConsoleUpdateManager.getInstance(); + if (mgr == null) return null; + return mgr.getUpdateConstraint(ROUTER_DEV_SU3, ""); + } + /** * Release update only. * Already downloaded but not installed version. diff --git a/apps/routerconsole/java/src/net/i2p/router/web/SummaryHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/SummaryHelper.java index 88a0e43d9..7e97d9573 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/SummaryHelper.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/SummaryHelper.java @@ -724,6 +724,8 @@ public class SummaryHelper extends HelperBase { boolean unsignedAvail = unsignedUpdateAvailable(); boolean devSU3Avail = devSU3UpdateAvailable(); String constraint = avail ? NewsHelper.updateConstraint() : null; + String unsignedConstraint = unsignedAvail ? NewsHelper.unsignedUpdateConstraint() : null; + String devSU3Constraint = devSU3Avail ? NewsHelper.devSU3UpdateConstraint() : null; if (avail && constraint != null && !NewsHelper.isUpdateInProgress() && !_context.router().gracefulShutdownInProgress()) { @@ -736,6 +738,30 @@ public class SummaryHelper extends HelperBase { buf.append(constraint).append(""); avail = false; } + if (unsignedAvail && unsignedConstraint != null && + !NewsHelper.isUpdateInProgress() && + !_context.router().gracefulShutdownInProgress()) { + if (needSpace) + buf.append("
                                    "); + else + needSpace = true; + buf.append("

                                    ").append(_t("Update available")).append(":
                                    "); + buf.append(_t("Version {0}", getUnsignedUpdateVersion())).append("
                                    "); + buf.append(unsignedConstraint).append("

                                    "); + unsignedAvail = false; + } + if (devSU3Avail && devSU3Constraint != null && + !NewsHelper.isUpdateInProgress() && + !_context.router().gracefulShutdownInProgress()) { + if (needSpace) + buf.append("
                                    "); + else + needSpace = true; + buf.append("

                                    ").append(_t("Update available")).append(":
                                    "); + buf.append(_t("Version {0}", getDevSU3UpdateVersion())).append("
                                    "); + buf.append(devSU3Constraint).append("

                                    "); + devSU3Avail = false; + } if ((avail || unsignedAvail || devSU3Avail) && !NewsHelper.isUpdateInProgress() && !_context.router().gracefulShutdownInProgress() && From 649a63db6f2fd3b698ee9c167b3c16ebf3230a4f Mon Sep 17 00:00:00 2001 From: zzz Date: Wed, 14 Oct 2015 19:18:10 +0000 Subject: [PATCH 084/111] Update: Fix persistence of the available dev version Java 7 check at startup with persisted versions --- .../router/update/ConsoleUpdateManager.java | 27 +++++++++++++------ 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/apps/routerconsole/java/src/net/i2p/router/update/ConsoleUpdateManager.java b/apps/routerconsole/java/src/net/i2p/router/update/ConsoleUpdateManager.java index 7999b2b47..d34492294 100644 --- a/apps/routerconsole/java/src/net/i2p/router/update/ConsoleUpdateManager.java +++ b/apps/routerconsole/java/src/net/i2p/router/update/ConsoleUpdateManager.java @@ -39,6 +39,7 @@ import net.i2p.util.ConcurrentHashSet; import net.i2p.util.FileUtil; import net.i2p.util.Log; import net.i2p.util.SimpleTimer; +import net.i2p.util.SystemVersion; import net.i2p.util.VersionComparator; /** @@ -184,7 +185,11 @@ public class ConsoleUpdateManager implements UpdateManager, RouterApp { if (newVersion != null) { List updateSources = uuh.getUpdateSources(); if (updateSources != null) { - VersionAvailable newVA = new VersionAvailable(newVersion, "", HTTP, updateSources); + VersionAvailable newVA; + if (SystemVersion.isJava7()) + newVA = new VersionAvailable(newVersion, "", HTTP, updateSources); + else + newVA = new VersionAvailable(newVersion, "Requires Java 7"); _available.put(new UpdateItem(ROUTER_UNSIGNED, ""), newVA); } } @@ -197,7 +202,11 @@ public class ConsoleUpdateManager implements UpdateManager, RouterApp { if (VersionComparator.comp(newVersion, RouterVersion.FULL_VERSION) > 0) { List updateSources = dsuh.getUpdateSources(); if (updateSources != null) { - VersionAvailable newVA = new VersionAvailable(newVersion, "", HTTP, updateSources); + VersionAvailable newVA; + if (SystemVersion.isJava7()) + newVA = new VersionAvailable(newVersion, "", HTTP, updateSources); + else + newVA = new VersionAvailable(newVersion, "Requires Java 7"); _available.put(new UpdateItem(ROUTER_DEV_SU3, ""), newVA); } } else { @@ -846,6 +855,14 @@ public class ConsoleUpdateManager implements UpdateManager, RouterApp { _available.put(ui, newVA); shouldUpdate = true; } + + // save across restarts + if (type == ROUTER_UNSIGNED) { + _context.router().saveConfig(PROP_UNSIGNED_AVAILABLE, newVersion); + } else if (type == ROUTER_DEV_SU3) { + _context.router().saveConfig(PROP_DEV_SU3_AVAILABLE, newVersion); + } + if (!shouldUpdate) return false; @@ -857,12 +874,6 @@ public class ConsoleUpdateManager implements UpdateManager, RouterApp { case ROUTER_UNSIGNED: case ROUTER_DEV_SU3: - // save across restarts - String prop = type == ROUTER_UNSIGNED ? PROP_UNSIGNED_AVAILABLE - : PROP_DEV_SU3_AVAILABLE; - _context.router().saveConfig(prop, newVersion); - // fall through - case ROUTER_SIGNED: case ROUTER_SIGNED_SU3: if (shouldInstall() && From b43417bf77467b3ce624a2b956377a53a8bd35d6 Mon Sep 17 00:00:00 2001 From: zzz Date: Thu, 15 Oct 2015 18:59:37 +0000 Subject: [PATCH 085/111] update jetty javadoc link --- build.properties | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/build.properties b/build.properties index 195a13c6b..9e219c333 100644 --- a/build.properties +++ b/build.properties @@ -11,7 +11,10 @@ # Note: Include the trailing slash! Don't surround the URL in quotes! javasedocs.url=http://docs.oracle.com/javase/6/docs/api/ javaeedocs.url=http://docs.oracle.com/javaee/6/api/ -jettydocs.url=http://download.eclipse.org/jetty/stable-8/apidocs/ +# The following link is dead, perhaps temporarily, +# perhaps not, as they move 7 and 8 to unsupported status. +#jettydocs.url=http://download.eclipse.org/jetty/stable-8/apidocs/ +jettydocs.url=http://download.eclipse.org/jetty/8.1.17.v20150415/apidocs/ jrobindocs.url=http://docs.i2p-projekt.de/jrobin/javadoc/ wrapperdocs.url=http://wrapper.tanukisoftware.com/jdoc/ # these are only for unit test javadocs From 39b218b216a7ba5088db2b8e89a8d5fe5ef1e7b1 Mon Sep 17 00:00:00 2001 From: zzz Date: Fri, 16 Oct 2015 14:25:55 +0000 Subject: [PATCH 086/111] i2psnark: Fix deadlock (ticket #1432) --- .../src/org/klomp/snark/PeerCoordinator.java | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/apps/i2psnark/java/src/org/klomp/snark/PeerCoordinator.java b/apps/i2psnark/java/src/org/klomp/snark/PeerCoordinator.java index b347b5448..8daf8b030 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/PeerCoordinator.java +++ b/apps/i2psnark/java/src/org/klomp/snark/PeerCoordinator.java @@ -984,8 +984,9 @@ class PeerCoordinator implements PeerListener } int piece = pp.getPiece(); - synchronized(wantedPieces) - { + // try/catch outside the synch to avoid deadlock in the catch + try { + synchronized(wantedPieces) { Piece p = new Piece(piece); if (!wantedPieces.contains(p)) { @@ -1001,8 +1002,7 @@ class PeerCoordinator implements PeerListener } } - try - { + // try/catch moved outside of synch // this takes forever if complete, as it rechecks if (storage.putPiece(pp)) { @@ -1028,21 +1028,21 @@ class PeerCoordinator implements PeerListener _log.warn("Got BAD piece " + piece + "/" + metainfo.getPieces() + " from " + peer + " for " + metainfo.getName()); return false; // No need to announce BAD piece to peers. } - } - catch (IOException ioe) - { + + wantedPieces.remove(p); + wantedBytes -= metainfo.getPieceLength(p.getId()); + } // synch + } catch (IOException ioe) { String msg = "Error writing storage (piece " + piece + ") for " + metainfo.getName() + ": " + ioe; _log.error(msg, ioe); if (listener != null) { listener.addMessage(msg); listener.addMessage("Fatal storage error: Stopping torrent " + metainfo.getName()); } + // deadlock was here snark.stopTorrent(); throw new RuntimeException(msg, ioe); - } - wantedPieces.remove(p); - wantedBytes -= metainfo.getPieceLength(p.getId()); - } + } // just in case removePartialPiece(piece); From ba1488bccea566eef49a001b0f204029789c20a0 Mon Sep 17 00:00:00 2001 From: zzz Date: Fri, 16 Oct 2015 19:45:23 +0000 Subject: [PATCH 087/111] i2psnark: Add "smart sort" option, set sort based on language (tickets #637, #1303) --- .../src/org/klomp/snark/SnarkManager.java | 28 +++- .../org/klomp/snark/web/I2PSnarkServlet.java | 17 ++- .../java/src/org/klomp/snark/web/Sorters.java | 128 ++++++++++++++++-- history.txt | 13 ++ .../src/net/i2p/router/RouterVersion.java | 2 +- 5 files changed, 175 insertions(+), 13 deletions(-) diff --git a/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java b/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java index 98d0ee2c0..bb1684e5f 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java +++ b/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java @@ -126,6 +126,7 @@ public class SnarkManager implements CompleteListener { public static final String PROP_OPENTRACKERS = "i2psnark.opentrackers"; public static final String PROP_PRIVATETRACKERS = "i2psnark.privatetrackers"; private static final String PROP_USE_DHT = "i2psnark.enableDHT"; + private static final String PROP_SMART_SORT = "i2psnark.smartSort"; public static final int MIN_UP_BW = 10; public static final int DEFAULT_MAX_UP_BW = 25; @@ -340,6 +341,17 @@ public class SnarkManager implements CompleteListener { public boolean shouldAutoStart() { return Boolean.parseBoolean(_config.getProperty(PROP_AUTO_START, DEFAULT_AUTO_START)); } + + /** + * @return default true + * @since 0.9.23 + */ + public boolean isSmartSortEnabled() { + String val = _config.getProperty(PROP_SMART_SORT); + if (val == null) + return true; + return Boolean.parseBoolean(val); + } /**** public String linkPrefix() { @@ -736,19 +748,19 @@ public class SnarkManager implements CompleteListener { /** * all params may be null or need trimming */ - public void updateConfig(String dataDir, boolean filesPublic, boolean autoStart, String refreshDelay, + public void updateConfig(String dataDir, boolean filesPublic, boolean autoStart, boolean smartSort, String refreshDelay, String startDelay, String pageSize, String seedPct, String eepHost, String eepPort, String i2cpHost, String i2cpPort, String i2cpOpts, String upLimit, String upBW, boolean useOpenTrackers, boolean useDHT, String theme) { synchronized(_configLock) { - locked_updateConfig(dataDir, filesPublic, autoStart, refreshDelay, + locked_updateConfig(dataDir, filesPublic, autoStart, smartSort,refreshDelay, startDelay, pageSize, seedPct, eepHost, eepPort, i2cpHost, i2cpPort, i2cpOpts, upLimit, upBW, useOpenTrackers, useDHT, theme); } } - private void locked_updateConfig(String dataDir, boolean filesPublic, boolean autoStart, String refreshDelay, + private void locked_updateConfig(String dataDir, boolean filesPublic, boolean autoStart, boolean smartSort, String refreshDelay, String startDelay, String pageSize, String seedPct, String eepHost, String eepPort, String i2cpHost, String i2cpPort, String i2cpOpts, String upLimit, String upBW, boolean useOpenTrackers, boolean useDHT, String theme) { @@ -966,6 +978,16 @@ public class SnarkManager implements CompleteListener { addMessage(_t("Disabled autostart")); changed = true; } + + if (isSmartSortEnabled() != smartSort) { + _config.setProperty(PROP_SMART_SORT, Boolean.toString(smartSort)); + if (smartSort) + addMessage(_t("Enabled smart sort")); + else + addMessage(_t("Disabled smart sort")); + changed = true; + } + if (_util.shouldUseOpenTrackers() != useOpenTrackers) { _config.setProperty(PROP_USE_OPENTRACKERS, useOpenTrackers + ""); if (useOpenTrackers) 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 913fd6d77..b0335f6a8 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java +++ b/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java @@ -32,6 +32,7 @@ import net.i2p.data.DataHelper; import net.i2p.data.Hash; import net.i2p.util.Log; import net.i2p.util.SecureFile; +import net.i2p.util.Translate; import org.klomp.snark.I2PSnarkUtil; import org.klomp.snark.MagnetURI; @@ -1118,6 +1119,7 @@ public class I2PSnarkServlet extends BasicServlet { String dataDir = req.getParameter("nofilter_dataDir"); boolean filesPublic = req.getParameter("filesPublic") != null; boolean autoStart = req.getParameter("autoStart") != null; + boolean smartSort = req.getParameter("smartSort") != null; String seedPct = req.getParameter("seedPct"); String eepHost = req.getParameter("eepHost"); String eepPort = req.getParameter("eepPort"); @@ -1133,7 +1135,7 @@ public class I2PSnarkServlet extends BasicServlet { boolean useDHT = req.getParameter("useDHT") != null; //String openTrackers = req.getParameter("openTrackers"); String theme = req.getParameter("theme"); - _manager.updateConfig(dataDir, filesPublic, autoStart, refreshDel, startupDel, pageSize, + _manager.updateConfig(dataDir, filesPublic, autoStart, smartSort, refreshDel, startupDel, pageSize, seedPct, eepHost, eepPort, i2cpHost, i2cpPort, i2cpOpts, upLimit, upBW, useOpenTrackers, useDHT, theme); // update servlet @@ -1401,6 +1403,10 @@ public class I2PSnarkServlet extends BasicServlet { sort = Integer.parseInt(ssort); } catch (NumberFormatException nfe) {} } + if (_manager.isSmartSortEnabled()) + Sorters.setPattern(Translate.getLanguage(_manager.util().getContext())); + else + Sorters.setPattern(null); try { Collections.sort(rv, Sorters.getComparator(sort, this)); } catch (IllegalArgumentException iae) { @@ -2144,6 +2150,7 @@ public class I2PSnarkServlet extends BasicServlet { String dataDir = _manager.getDataDir().getAbsolutePath(); boolean filesPublic = _manager.areFilesPublic(); boolean autoStart = _manager.shouldAutoStart(); + boolean smartSort = _manager.isSmartSortEnabled(); boolean useOpenTrackers = _manager.util().shouldUseOpenTrackers(); //String openTrackers = _manager.util().getOpenTrackerString(); boolean useDHT = _manager.util().shouldUseDHT(); @@ -2177,6 +2184,14 @@ public class I2PSnarkServlet extends BasicServlet { + (autoStart ? "checked " : "") + "title=\""); out.write(_t("If checked, automatically start torrents that are added")); + out.write("\" >" + + + "
                                    "); + out.write(_t("Smart torrent sorting")); + out.write(": " + "
                                    "); diff --git a/apps/i2psnark/java/src/org/klomp/snark/web/Sorters.java b/apps/i2psnark/java/src/org/klomp/snark/web/Sorters.java index 39120d6cc..964e6d80d 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/web/Sorters.java +++ b/apps/i2psnark/java/src/org/klomp/snark/web/Sorters.java @@ -6,6 +6,8 @@ import java.text.Collator; import java.util.Collections; import java.util.Comparator; import java.util.Locale; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import org.klomp.snark.MetaInfo; import org.klomp.snark.Snark; @@ -18,6 +20,13 @@ import org.klomp.snark.Storage; */ class Sorters { + /** + * See below + */ + private static final Pattern PATTERN_DE, PATTERN_EN, PATTERN_ES, PATTERN_FR, + PATTERN_IT, PATTERN_NL, PATTERN_PT; + private static Pattern _pattern; + /** * Negative is reverse * @@ -113,8 +122,8 @@ class Sorters { /** - * Sort alphabetically in current locale, ignore case, ignore leading "the " - * (I guess this is worth it, a lot of torrents start with "The " + * Sort alphabetically in current locale, ignore case, ignore leading + * articles such as "the" if the pattern is set by setPattern() * @since 0.7.14 */ private static class TorrentNameComparator implements Comparator, Serializable { @@ -130,13 +139,16 @@ class Sorters { if (l.getStorage() != null && r.getStorage() == null) return 1; String ls = l.getBaseName(); - String llc = ls.toLowerCase(Locale.US); - if (llc.startsWith("the ") || llc.startsWith("the.") || llc.startsWith("the_")) - ls = ls.substring(4); String rs = r.getBaseName(); - String rlc = rs.toLowerCase(Locale.US); - if (rlc.startsWith("the ") || rlc.startsWith("the.") || rlc.startsWith("the_")) - rs = rs.substring(4); + Pattern p = _pattern; + if (p != null) { + Matcher m = p.matcher(ls); + if (m.matches()) + ls = ls.substring(m.group(1).length()); + m = p.matcher(rs); + if (m.matches()) + rs = rs.substring(m.group(1).length()); + } return Collator.getInstance().compare(ls, rs); } } @@ -528,4 +540,104 @@ class Sorters { return r.priority - l.priority; } } + + /* + * Match an indefinite or definite article in the language, + * followed by one or more whitespace, '.', or '_'. + * Does not match "partitive" articles. + * + * https://en.wikipedia.org/wiki/Article_%28grammar%29 + * http://www.loc.gov/marc/bibliographic/bdapndxf.html + */ + static { + PATTERN_DE = Pattern.compile( + // can't make the non-capturing innner group work + //"^((?:" + + "^((" + + "der|die|das|des|dem|den|ein|eine|einer|eines|einem|einen" + + ")[\\s\\._]+).*", + Pattern.CASE_INSENSITIVE); + PATTERN_EN = Pattern.compile( + "^((" + + "a|an|the" + + ")[\\s\\._]+).*", + Pattern.CASE_INSENSITIVE); + PATTERN_ES = Pattern.compile( + "^((" + + "el|la|lo|los|las|un|una|unos|unas" + + ")[\\s\\._]+).*", + Pattern.CASE_INSENSITIVE); + PATTERN_FR = Pattern.compile( + // note l' doesn't require whitespace after + "^(l'|((" + + "le|la|les|un|une|des" + + ")[\\s\\._]+)).*", + Pattern.CASE_INSENSITIVE); + PATTERN_IT = Pattern.compile( + // note l' and un' don't require whitespace after + "^(l'|un'|((" + + "il|lo|la|i|gli|le|uno|una|un" + + ")[\\s\\._]+)).*", + Pattern.CASE_INSENSITIVE); + PATTERN_NL = Pattern.compile( + "^((" + + "de|het|het'n|een|een'n" + + ")[\\s\\._]+).*", + Pattern.CASE_INSENSITIVE); + PATTERN_PT = Pattern.compile( + "^((" + + "o|a|os|as|um|uma|uns|umas" + + ")[\\s\\._]+).*", + Pattern.CASE_INSENSITIVE); + } + + /** + * Sets static field, oh well + * @param lang null for none + * @since 0.9.23 + */ + public static void setPattern(String lang) { + Pattern p; + if (lang == null) + p = null; + else if (lang.equals("de")) + p = PATTERN_DE; + else if (lang.equals("en")) + p = PATTERN_EN; + else if (lang.equals("es")) + p = PATTERN_ES; + else if (lang.equals("fr")) + p = PATTERN_FR; + else if (lang.equals("it")) + p = PATTERN_IT; + else if (lang.equals("nl")) + p = PATTERN_NL; + else if (lang.equals("pt")) + p = PATTERN_PT; + else + p = null; + _pattern = p; + } + +/**** + public static final void main(String[] args) { + if (args.length != 2) { + System.out.println("Usage: Sorters lang 'string'"); + System.exit(1); + } + String lang = args[0]; + setPattern(lang); + if (_pattern == null) { + System.out.println("Unsupported " + lang); + System.exit(1); + } + String s = args[1]; + Matcher m = _pattern.matcher(s); + if (m.matches()) { + System.out.println("Match is \"" + m.group(1) + '"'); + } else { + System.out.println("No match for \"" + s + '"'); + } + } +****/ } diff --git a/history.txt b/history.txt index 80b38233e..f04c70cac 100644 --- a/history.txt +++ b/history.txt @@ -1,3 +1,16 @@ +2015-10-16 zzz + * i2psnark: + - Fix deadlock (ticket #1432) + - Add "smart sort" option, set sort based on language (tickets #637, #1303) + +2015-10-14 zzz + * Update: + - Require Java 7 to download dev builds (ticket #1669) + - Fix persistence of the available dev version + +2015-10-13 zzz + * Startup: Delete our old RI from netDB when rekeying + 2015-10-11 zzz * Crypto: Test for broken Gentoo ECDSA support diff --git a/router/java/src/net/i2p/router/RouterVersion.java b/router/java/src/net/i2p/router/RouterVersion.java index 8ab24107c..80cfb9c84 100644 --- a/router/java/src/net/i2p/router/RouterVersion.java +++ b/router/java/src/net/i2p/router/RouterVersion.java @@ -18,7 +18,7 @@ public class RouterVersion { /** deprecated */ public final static String ID = "Monotone"; public final static String VERSION = CoreVersion.VERSION; - public final static long BUILD = 17; + public final static long BUILD = 18; /** for example "-test" */ public final static String EXTRA = ""; From fe260521895df30891abccf2feb83b73c40f80e8 Mon Sep 17 00:00:00 2001 From: zzz Date: Fri, 16 Oct 2015 20:54:12 +0000 Subject: [PATCH 088/111] add mime type for .mka --- apps/i2psnark/mime.properties | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/i2psnark/mime.properties b/apps/i2psnark/mime.properties index 7f21bea1c..5a1157e0a 100644 --- a/apps/i2psnark/mime.properties +++ b/apps/i2psnark/mime.properties @@ -11,6 +11,7 @@ iso = application/x-iso9660-image m4a = audio/mp4a-latm m4b = audio/mp4a-latm m4v = video/x-m4v +mka = audio/x-matroska mkv = video/x-matroska mobi = application/x-mobipocket-ebook mp4 = video/mp4 From dd36176997bfddae92762ce7b3b8b2f78a5a24d2 Mon Sep 17 00:00:00 2001 From: zzz Date: Fri, 16 Oct 2015 21:38:12 +0000 Subject: [PATCH 089/111] big fat Java 6 warning --- .../src/net/i2p/router/web/SummaryBarRenderer.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/apps/routerconsole/java/src/net/i2p/router/web/SummaryBarRenderer.java b/apps/routerconsole/java/src/net/i2p/router/web/SummaryBarRenderer.java index 29223c7bf..002f7983b 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/SummaryBarRenderer.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/SummaryBarRenderer.java @@ -18,6 +18,7 @@ import net.i2p.router.RouterContext; import net.i2p.router.news.NewsEntry; import net.i2p.router.news.NewsManager; import net.i2p.util.PortMapper; +import net.i2p.util.SystemVersion; /** * Refactored from summarynoframe.jsp to save ~100KB @@ -345,6 +346,13 @@ public class SummaryBarRenderer { .append(_t("Warning: ECDSA is not available. Update your Java or OS")) .append("\n"); } + if (!SystemVersion.isJava7()) { + buf.append("

                                    ") + .append(_t("Warning: Java version {0} is no longer supported by I2P.", System.getProperty("java.version"))) + .append(' ') + .append(_t("Update Java to version {0} or higher to receive I2P updates.", "7")) + .append("

                                    \n"); + } return buf.toString(); } @@ -665,6 +673,11 @@ public class SummaryBarRenderer { return Messages.getString(s, _context); } + /** @since 0.9.23 */ + private String _t(String s, Object o) { + return Messages.getString(s, o, _context); + } + /** * Where the translation is to two words or more, * prevent splitting across lines From 70921a2b09369e00000d83605010c1b07d4fc555 Mon Sep 17 00:00:00 2001 From: zzz Date: Fri, 16 Oct 2015 22:17:09 +0000 Subject: [PATCH 090/111] i2psnark: Don't balloon files on ARM (ticket #1684) --- apps/i2psnark/java/src/org/klomp/snark/Storage.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/apps/i2psnark/java/src/org/klomp/snark/Storage.java b/apps/i2psnark/java/src/org/klomp/snark/Storage.java index 3f1682318..1edf12b5b 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/Storage.java +++ b/apps/i2psnark/java/src/org/klomp/snark/Storage.java @@ -86,6 +86,7 @@ public class Storage implements Closeable private static final Map _filterNameCache = new ConcurrentHashMap(); private static final boolean _isWindows = SystemVersion.isWindows(); + private static final boolean _isARM = SystemVersion.isARM(); private static final int BUFSIZE = PeerState.PARTSIZE; private static final ByteCache _cache = ByteCache.getInstance(16, BUFSIZE); @@ -1400,7 +1401,9 @@ public class Storage implements Closeable // Windows will zero-fill up to the point of the write, which // will make the file fairly unfragmented, on average, at least until // near the end where it will get exponentially more fragmented. - if (!_isWindows) + // Also don't ballon on ARM, as a proxy for solid state disk, where fragmentation doesn't matter too much. + // Actual detection of SSD is almost impossible. + if (!_isWindows && !_isARM) isSparse = true; } From 3411a7c884e281ef0fa359f08cab2e33d121ac30 Mon Sep 17 00:00:00 2001 From: zzz Date: Sat, 17 Oct 2015 12:55:39 +0000 Subject: [PATCH 091/111] Crypto: Consolidate duplicate unlimited strength crypto check code --- .../src/net/i2p/crypto/CryptixAESEngine.java | 23 +-------- core/java/src/net/i2p/crypto/CryptoCheck.java | 47 +++++++++++++++++++ .../net/i2p/router/tasks/CryptoChecker.java | 25 +--------- 3 files changed, 50 insertions(+), 45 deletions(-) create mode 100644 core/java/src/net/i2p/crypto/CryptoCheck.java diff --git a/core/java/src/net/i2p/crypto/CryptixAESEngine.java b/core/java/src/net/i2p/crypto/CryptixAESEngine.java index f7429c6d5..60eb63048 100644 --- a/core/java/src/net/i2p/crypto/CryptixAESEngine.java +++ b/core/java/src/net/i2p/crypto/CryptixAESEngine.java @@ -44,28 +44,7 @@ public class CryptixAESEngine extends AESEngine { /** see test results below */ private static final int MIN_SYSTEM_AES_LENGTH = 704; - private static final boolean USE_SYSTEM_AES; - static { - boolean systemOK = false; - if (hasAESNI()) { - try { - systemOK = Cipher.getMaxAllowedKeyLength("AES") >= 256; - } catch (GeneralSecurityException gse) { - // a NoSuchAlgorithmException - } catch (NoSuchMethodError nsme) { - // JamVM, gij - try { - Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding"); - SecretKeySpec key = new SecretKeySpec(new byte[32], "AES"); - cipher.init(Cipher.ENCRYPT_MODE, key); - systemOK = true; - } catch (GeneralSecurityException gse) { - } - } - } - USE_SYSTEM_AES = systemOK; - //System.out.println("Using system AES? " + systemOK); - } + private static final boolean USE_SYSTEM_AES = hasAESNI() && CryptoCheck.isUnlimited(); /** * Do we have AES-NI support in the processor and JVM? diff --git a/core/java/src/net/i2p/crypto/CryptoCheck.java b/core/java/src/net/i2p/crypto/CryptoCheck.java new file mode 100644 index 000000000..31eac62dc --- /dev/null +++ b/core/java/src/net/i2p/crypto/CryptoCheck.java @@ -0,0 +1,47 @@ +package net.i2p.crypto; + +import java.security.GeneralSecurityException; +import javax.crypto.Cipher; +import javax.crypto.spec.SecretKeySpec; + +/** + * Moved from CryptixAESEngine and net.i2p.router.tasks.CryptoChecker + * + * @since 0.9.23 + */ +public class CryptoCheck { + + private static final boolean _isUnlimited; + + static { + boolean unlimited = false; + try { + unlimited = Cipher.getMaxAllowedKeyLength("AES") >= 256; + } catch (GeneralSecurityException gse) { + // a NoSuchAlgorithmException + } catch (NoSuchMethodError nsme) { + // JamVM, gij + try { + Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding"); + SecretKeySpec key = new SecretKeySpec(new byte[32], "AES"); + cipher.init(Cipher.ENCRYPT_MODE, key); + unlimited = true; + } catch (GeneralSecurityException gse) { + } + } + _isUnlimited = unlimited; + } + + private CryptoCheck() {} + + /** + * Do we have unlimited crypto? + */ + public static boolean isUnlimited() { + return _isUnlimited; + } + + public static void main(String args[]) { + System.out.println("Unlimited? " + isUnlimited()); + } +} diff --git a/router/java/src/net/i2p/router/tasks/CryptoChecker.java b/router/java/src/net/i2p/router/tasks/CryptoChecker.java index e022931ff..49bd84da5 100644 --- a/router/java/src/net/i2p/router/tasks/CryptoChecker.java +++ b/router/java/src/net/i2p/router/tasks/CryptoChecker.java @@ -5,6 +5,7 @@ import java.security.NoSuchAlgorithmException; import javax.crypto.Cipher; import javax.crypto.spec.SecretKeySpec; +import net.i2p.crypto.CryptoCheck; import net.i2p.crypto.SigType; import net.i2p.router.RouterContext; import net.i2p.util.Log; @@ -57,7 +58,7 @@ public class CryptoChecker { log.logAlways(Log.WARN, s); System.out.println(s); } - if (!isUnlimited()) { + if (!CryptoCheck.isUnlimited()) { s = "Please consider installing the Java Cryptography Unlimited Strength Jurisdiction Policy Files from "; //if (SystemVersion.isJava8()) // s += JRE8; @@ -79,28 +80,6 @@ public class CryptoChecker { } } - /** - * Copied from CryptixAESEngine - */ - private static boolean isUnlimited() { - try { - if (Cipher.getMaxAllowedKeyLength("AES") < 256) - return false; - } catch (NoSuchAlgorithmException e) { - return false; - } catch (NoSuchMethodError e) { - // JamVM, gij - try { - Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding"); - SecretKeySpec key = new SecretKeySpec(new byte[32], "AES"); - cipher.init(Cipher.ENCRYPT_MODE, key); - } catch (GeneralSecurityException gse) { - return false; - } - } - return true; - } - public static void main(String[] args) { warnUnavailableCrypto(null); } From 4e6ddfcea3f3130701baafa5f812157ba8671f3e Mon Sep 17 00:00:00 2001 From: zzz Date: Sat, 17 Oct 2015 14:01:08 +0000 Subject: [PATCH 092/111] lint core --- core/java/src/net/i2p/I2PAppContext.java | 4 +++- core/java/src/net/i2p/client/I2PSession.java | 13 +++++++------ .../net/i2p/client/impl/I2CPMessageProducer.java | 2 +- .../src/net/i2p/client/impl/I2PSessionImpl2.java | 15 ++++++++------- .../net/i2p/client/impl/I2PSessionMuxedImpl.java | 9 +++++---- .../src/net/i2p/client/naming/NamingService.java | 2 +- core/java/src/net/i2p/data/SDSCache.java | 3 +-- core/java/src/net/i2p/util/PortMapper.java | 2 +- core/java/src/net/i2p/util/SimpleTimer2.java | 4 ++-- 9 files changed, 29 insertions(+), 25 deletions(-) diff --git a/core/java/src/net/i2p/I2PAppContext.java b/core/java/src/net/i2p/I2PAppContext.java index b59a40586..bae357260 100644 --- a/core/java/src/net/i2p/I2PAppContext.java +++ b/core/java/src/net/i2p/I2PAppContext.java @@ -84,6 +84,7 @@ public class I2PAppContext { private RandomSource _random; private KeyGenerator _keyGenerator; protected KeyRing _keyRing; // overridden in RouterContext + @SuppressWarnings("deprecation") private SimpleScheduler _simpleScheduler; private SimpleTimer _simpleTimer; private SimpleTimer2 _simpleTimer2; @@ -532,7 +533,7 @@ public class I2PAppContext { * @return set of Strings containing the names of defined system properties */ @SuppressWarnings({ "unchecked", "rawtypes" }) - public Set getPropertyNames() { + public Set getPropertyNames() { // clone to avoid ConcurrentModificationException Set names = new HashSet((Set) (Set) ((Properties) System.getProperties().clone()).keySet()); // TODO-Java6: s/keySet()/stringPropertyNames()/ if (_overrideProps != null) @@ -940,6 +941,7 @@ public class I2PAppContext { * @since 0.9 to replace static instance in the class * @deprecated in 0.9.20, use simpleTimer2() */ + @SuppressWarnings("deprecation") public SimpleScheduler simpleScheduler() { if (!_simpleSchedulerInitialized) initializeSimpleScheduler(); diff --git a/core/java/src/net/i2p/client/I2PSession.java b/core/java/src/net/i2p/client/I2PSession.java index 458b9a892..818cb5983 100644 --- a/core/java/src/net/i2p/client/I2PSession.java +++ b/core/java/src/net/i2p/client/I2PSession.java @@ -18,6 +18,7 @@ import net.i2p.data.Destination; import net.i2p.data.Hash; import net.i2p.data.PrivateKey; import net.i2p.data.SessionKey; +import net.i2p.data.SessionTag; import net.i2p.data.SigningPrivateKey; /** @@ -98,7 +99,7 @@ public interface I2PSession { * objects that were sent along side the given keyUsed. * @return success */ - public boolean sendMessage(Destination dest, byte[] payload, SessionKey keyUsed, Set tagsSent) throws I2PSessionException; + public boolean sendMessage(Destination dest, byte[] payload, SessionKey keyUsed, Set tagsSent) throws I2PSessionException; /** * End-to-End Crypto is disabled, tags and keys are ignored. @@ -106,7 +107,7 @@ public interface I2PSession { * @param tagsSent UNUSED, IGNORED. * @return success */ - public boolean sendMessage(Destination dest, byte[] payload, int offset, int size, SessionKey keyUsed, Set tagsSent) throws I2PSessionException; + public boolean sendMessage(Destination dest, byte[] payload, int offset, int size, SessionKey keyUsed, Set tagsSent) throws I2PSessionException; /** * End-to-End Crypto is disabled, tags and keys are ignored. @@ -116,7 +117,7 @@ public interface I2PSession { * @return success * @since 0.7.1 */ - public boolean sendMessage(Destination dest, byte[] payload, int offset, int size, SessionKey keyUsed, Set tagsSent, long expire) throws I2PSessionException; + public boolean sendMessage(Destination dest, byte[] payload, int offset, int size, SessionKey keyUsed, Set tagsSent, long expire) throws I2PSessionException; /** * See I2PSessionMuxedImpl for proto/port details. @@ -133,7 +134,7 @@ public interface I2PSession { * @return success * @since 0.7.1 */ - public boolean sendMessage(Destination dest, byte[] payload, int offset, int size, SessionKey keyUsed, Set tagsSent, + public boolean sendMessage(Destination dest, byte[] payload, int offset, int size, SessionKey keyUsed, Set tagsSent, int proto, int fromPort, int toPort) throws I2PSessionException; /** @@ -152,7 +153,7 @@ public interface I2PSession { * @return success * @since 0.7.1 */ - public boolean sendMessage(Destination dest, byte[] payload, int offset, int size, SessionKey keyUsed, Set tagsSent, long expire, + public boolean sendMessage(Destination dest, byte[] payload, int offset, int size, SessionKey keyUsed, Set tagsSent, long expire, int proto, int fromPort, int toPort) throws I2PSessionException; /** @@ -171,7 +172,7 @@ public interface I2PSession { * @return success * @since 0.8.4 */ - public boolean sendMessage(Destination dest, byte[] payload, int offset, int size, SessionKey keyUsed, Set tagsSent, long expire, + public boolean sendMessage(Destination dest, byte[] payload, int offset, int size, SessionKey keyUsed, Set tagsSent, long expire, int proto, int fromPort, int toPort, int flags) throws I2PSessionException; /** diff --git a/core/java/src/net/i2p/client/impl/I2CPMessageProducer.java b/core/java/src/net/i2p/client/impl/I2CPMessageProducer.java index f44b897a3..bcdd0b4ea 100644 --- a/core/java/src/net/i2p/client/impl/I2CPMessageProducer.java +++ b/core/java/src/net/i2p/client/impl/I2CPMessageProducer.java @@ -132,7 +132,7 @@ class I2CPMessageProducer { * @param newKey unused - no end-to-end crypto */ public void sendMessage(I2PSessionImpl session, Destination dest, long nonce, byte[] payload, SessionTag tag, - SessionKey key, Set tags, SessionKey newKey, long expires) throws I2PSessionException { + SessionKey key, Set tags, SessionKey newKey, long expires) throws I2PSessionException { sendMessage(session, dest, nonce, payload, expires, 0); } diff --git a/core/java/src/net/i2p/client/impl/I2PSessionImpl2.java b/core/java/src/net/i2p/client/impl/I2PSessionImpl2.java index 4eddcc30e..e110889be 100644 --- a/core/java/src/net/i2p/client/impl/I2PSessionImpl2.java +++ b/core/java/src/net/i2p/client/impl/I2PSessionImpl2.java @@ -29,6 +29,7 @@ import net.i2p.client.SendMessageStatusListener; import net.i2p.data.DataHelper; import net.i2p.data.Destination; import net.i2p.data.SessionKey; +import net.i2p.data.SessionTag; import net.i2p.data.i2cp.MessageId; import net.i2p.data.i2cp.MessageStatusMessage; import net.i2p.util.Log; @@ -210,17 +211,17 @@ class I2PSessionImpl2 extends I2PSessionImpl { throw new UnsupportedOperationException("Use MuxedImpl"); } /** @throws UnsupportedOperationException always, use MuxedImpl */ - public boolean sendMessage(Destination dest, byte[] payload, int offset, int size, SessionKey keyUsed, Set tagsSent, + public boolean sendMessage(Destination dest, byte[] payload, int offset, int size, SessionKey keyUsed, Set tagsSent, int proto, int fromport, int toport) throws I2PSessionException { throw new UnsupportedOperationException("Use MuxedImpl"); } /** @throws UnsupportedOperationException always, use MuxedImpl */ - public boolean sendMessage(Destination dest, byte[] payload, int offset, int size, SessionKey keyUsed, Set tagsSent, long expire, + public boolean sendMessage(Destination dest, byte[] payload, int offset, int size, SessionKey keyUsed, Set tagsSent, long expire, int proto, int fromport, int toport) throws I2PSessionException { throw new UnsupportedOperationException("Use MuxedImpl"); } /** @throws UnsupportedOperationException always, use MuxedImpl */ - public boolean sendMessage(Destination dest, byte[] payload, int offset, int size, SessionKey keyUsed, Set tagsSent, long expire, + public boolean sendMessage(Destination dest, byte[] payload, int offset, int size, SessionKey keyUsed, Set tagsSent, long expire, int proto, int fromport, int toport, int flags) throws I2PSessionException { throw new UnsupportedOperationException("Use MuxedImpl"); } @@ -253,7 +254,7 @@ class I2PSessionImpl2 extends I2PSessionImpl { * @param tagsSent unused - no end-to-end crypto */ @Override - public boolean sendMessage(Destination dest, byte[] payload, SessionKey keyUsed, Set tagsSent) throws I2PSessionException { + public boolean sendMessage(Destination dest, byte[] payload, SessionKey keyUsed, Set tagsSent) throws I2PSessionException { return sendMessage(dest, payload, 0, payload.length, keyUsed, tagsSent, 0); } @@ -261,7 +262,7 @@ class I2PSessionImpl2 extends I2PSessionImpl { * @param keyUsed unused - no end-to-end crypto * @param tagsSent unused - no end-to-end crypto */ - public boolean sendMessage(Destination dest, byte[] payload, int offset, int size, SessionKey keyUsed, Set tagsSent) + public boolean sendMessage(Destination dest, byte[] payload, int offset, int size, SessionKey keyUsed, Set tagsSent) throws I2PSessionException { return sendMessage(dest, payload, offset, size, keyUsed, tagsSent, 0); } @@ -272,7 +273,7 @@ class I2PSessionImpl2 extends I2PSessionImpl { * @param keyUsed unused - no end-to-end crypto * @param tagsSent unused - no end-to-end crypto */ - public boolean sendMessage(Destination dest, byte[] payload, int offset, int size, SessionKey keyUsed, Set tagsSent, long expires) + public boolean sendMessage(Destination dest, byte[] payload, int offset, int size, SessionKey keyUsed, Set tagsSent, long expires) throws I2PSessionException { if (_log.shouldLog(Log.DEBUG)) _log.debug("sending message"); synchronized (_stateLock) { @@ -339,7 +340,7 @@ class I2PSessionImpl2 extends I2PSessionImpl { * @param keyUsed unused - no end-to-end crypto * @param tagsSent unused - no end-to-end crypto */ - protected boolean sendBestEffort(Destination dest, byte payload[], SessionKey keyUsed, Set tagsSent, long expires) + protected boolean sendBestEffort(Destination dest, byte payload[], SessionKey keyUsed, Set tagsSent, long expires) throws I2PSessionException { return sendBestEffort(dest, payload, expires, 0); } diff --git a/core/java/src/net/i2p/client/impl/I2PSessionMuxedImpl.java b/core/java/src/net/i2p/client/impl/I2PSessionMuxedImpl.java index 46e551e49..6ee2b1e11 100644 --- a/core/java/src/net/i2p/client/impl/I2PSessionMuxedImpl.java +++ b/core/java/src/net/i2p/client/impl/I2PSessionMuxedImpl.java @@ -19,6 +19,7 @@ import net.i2p.client.SendMessageStatusListener; import net.i2p.data.DataHelper; import net.i2p.data.Destination; import net.i2p.data.SessionKey; +import net.i2p.data.SessionTag; import net.i2p.data.i2cp.MessagePayloadMessage; import net.i2p.util.Log; @@ -163,7 +164,7 @@ class I2PSessionMuxedImpl extends I2PSessionImpl2 { */ @Override public boolean sendMessage(Destination dest, byte[] payload, int offset, int size, - SessionKey keyUsed, Set tagsSent, long expires) + SessionKey keyUsed, Set tagsSent, long expires) throws I2PSessionException { return sendMessage(dest, payload, offset, size, keyUsed, tagsSent, 0, PROTO_UNSPECIFIED, PORT_UNSPECIFIED, PORT_UNSPECIFIED); } @@ -173,7 +174,7 @@ class I2PSessionMuxedImpl extends I2PSessionImpl2 { * @param tagsSent unused - no end-to-end crypto */ @Override - public boolean sendMessage(Destination dest, byte[] payload, int offset, int size, SessionKey keyUsed, Set tagsSent, + public boolean sendMessage(Destination dest, byte[] payload, int offset, int size, SessionKey keyUsed, Set tagsSent, int proto, int fromport, int toport) throws I2PSessionException { return sendMessage(dest, payload, offset, size, keyUsed, tagsSent, 0, proto, fromport, toport); } @@ -192,7 +193,7 @@ class I2PSessionMuxedImpl extends I2PSessionImpl2 { */ @Override public boolean sendMessage(Destination dest, byte[] payload, int offset, int size, - SessionKey keyUsed, Set tagsSent, long expires, + SessionKey keyUsed, Set tagsSent, long expires, int proto, int fromPort, int toPort) throws I2PSessionException { return sendMessage(dest, payload, offset, size, keyUsed, tagsSent, 0, proto, fromPort, toPort, 0); @@ -213,7 +214,7 @@ class I2PSessionMuxedImpl extends I2PSessionImpl2 { */ @Override public boolean sendMessage(Destination dest, byte[] payload, int offset, int size, - SessionKey keyUsed, Set tagsSent, long expires, + SessionKey keyUsed, Set tagsSent, long expires, int proto, int fromPort, int toPort, int flags) throws I2PSessionException { payload = prepPayload(payload, offset, size, proto, fromPort, toPort); diff --git a/core/java/src/net/i2p/client/naming/NamingService.java b/core/java/src/net/i2p/client/naming/NamingService.java index 5a38c9e7f..be9e598c2 100644 --- a/core/java/src/net/i2p/client/naming/NamingService.java +++ b/core/java/src/net/i2p/client/naming/NamingService.java @@ -536,7 +536,7 @@ public abstract class NamingService { String impl = context.getProperty(PROP_IMPL, DEFAULT_IMPL); try { Class cls = Class.forName(impl); - Constructor con = cls.getConstructor(new Class[] { I2PAppContext.class }); + Constructor con = cls.getConstructor(I2PAppContext.class); instance = (NamingService)con.newInstance(new Object[] { context }); } catch (Exception ex) { Log log = context.logManager().getLog(NamingService.class); diff --git a/core/java/src/net/i2p/data/SDSCache.java b/core/java/src/net/i2p/data/SDSCache.java index ab7768014..f38fe6bbf 100644 --- a/core/java/src/net/i2p/data/SDSCache.java +++ b/core/java/src/net/i2p/data/SDSCache.java @@ -46,7 +46,6 @@ import net.i2p.util.SystemVersion; public class SDSCache { //private static final Log _log = I2PAppContext.getGlobalContext().logManager().getLog(SDSCache.class); - private static final Class[] conArg = new Class[] { byte[].class }; private static final double MIN_FACTOR = 0.20; private static final double MAX_FACTOR = 5.0; private static final double FACTOR; @@ -74,7 +73,7 @@ public class SDSCache { _cache = new LHMCache>(size); _datalen = len; try { - _rvCon = rvClass.getConstructor(conArg); + _rvCon = rvClass.getConstructor(byte[].class); } catch (NoSuchMethodException e) { throw new RuntimeException("SDSCache init error", e); } diff --git a/core/java/src/net/i2p/util/PortMapper.java b/core/java/src/net/i2p/util/PortMapper.java index d32a4f5a5..e73399b19 100644 --- a/core/java/src/net/i2p/util/PortMapper.java +++ b/core/java/src/net/i2p/util/PortMapper.java @@ -111,7 +111,7 @@ public class PortMapper { * @since 0.9.20 */ public void renderStatusHTML(Writer out) throws IOException { - List services = new ArrayList(_dir.keySet()); + List services = new ArrayList(_dir.keySet()); out.write("

                                    Port Mapper

                                    ServiceHostPort\n"); Collections.sort(services); for (String s : services) { diff --git a/core/java/src/net/i2p/util/SimpleTimer2.java b/core/java/src/net/i2p/util/SimpleTimer2.java index aff0b61f6..f2be24405 100644 --- a/core/java/src/net/i2p/util/SimpleTimer2.java +++ b/core/java/src/net/i2p/util/SimpleTimer2.java @@ -122,7 +122,7 @@ public class SimpleTimer2 { } } - private ScheduledFuture schedule(TimedEvent t, long timeoutMs) { + private ScheduledFuture schedule(TimedEvent t, long timeoutMs) { return _executor.schedule(t, timeoutMs, TimeUnit.MILLISECONDS); } @@ -248,7 +248,7 @@ public class SimpleTimer2 { private final SimpleTimer2 _pool; private int _fuzz; protected static final int DEFAULT_FUZZ = 3; - private ScheduledFuture _future; // _executor.remove() doesn't work so we have to use this + private ScheduledFuture _future; // _executor.remove() doesn't work so we have to use this // ... and I expect cancelling this way is more efficient /** state of the current event. All access should be under lock. */ From 9bddba56a0aec111b41d00f9380ee0b25e4ba8b9 Mon Sep 17 00:00:00 2001 From: zzz Date: Sat, 17 Oct 2015 14:38:02 +0000 Subject: [PATCH 093/111] lint router --- router/java/src/net/i2p/data/router/RouterInfo.java | 2 +- router/java/src/net/i2p/data/router/SortHelper.java | 5 ++--- router/java/src/net/i2p/router/CommSystemFacade.java | 2 +- router/java/src/net/i2p/router/Router.java | 2 ++ .../java/src/net/i2p/router/startup/LoadClientAppsJob.java | 4 ++-- .../net/i2p/router/transport/OutboundMessageRegistry.java | 4 ++++ .../transport/udp/TimedWeightedPriorityMessageQueue.java | 1 + .../java/src/net/i2p/router/tunnel/PumpedTunnelGateway.java | 1 + 8 files changed, 14 insertions(+), 7 deletions(-) diff --git a/router/java/src/net/i2p/data/router/RouterInfo.java b/router/java/src/net/i2p/data/router/RouterInfo.java index 24667108e..0d60c6dc0 100644 --- a/router/java/src/net/i2p/data/router/RouterInfo.java +++ b/router/java/src/net/i2p/data/router/RouterInfo.java @@ -339,7 +339,7 @@ public class RouterInfo extends DatabaseEntry { // WARNING this sort algorithm cannot be changed, as it must be consistent // network-wide. The signature is not checked at readin time, but only // later, and the hashes are stored in a Set, not a List. - peers = (Collection) SortHelper.sortStructures(peers); + peers = SortHelper.sortStructures(peers); for (Hash peerHash : peers) { peerHash.writeBytes(out); } diff --git a/router/java/src/net/i2p/data/router/SortHelper.java b/router/java/src/net/i2p/data/router/SortHelper.java index 0c40fa3ed..c7cea3c6f 100644 --- a/router/java/src/net/i2p/data/router/SortHelper.java +++ b/router/java/src/net/i2p/data/router/SortHelper.java @@ -31,12 +31,11 @@ class SortHelper { * WARNING - this sort order must be consistent network-wide, so while the order is arbitrary, * it cannot be changed. * Why? Just because it has to be consistent so signing will work. - * How to spec as returning the same type as the param? * DEPRECATED - Only used by RouterInfo. * * @return a new list */ - public static List sortStructures(Collection dataStructures) { + public static List sortStructures(Collection dataStructures) { if (dataStructures == null) return Collections.emptyList(); // This used to use Hash.toString(), which is insane, since a change to toString() @@ -52,7 +51,7 @@ class SortHelper { //for (DataStructure struct : tm.values()) { // rv.add(struct); //} - ArrayList rv = new ArrayList(dataStructures); + ArrayList rv = new ArrayList(dataStructures); sortStructureList(rv); return rv; } diff --git a/router/java/src/net/i2p/router/CommSystemFacade.java b/router/java/src/net/i2p/router/CommSystemFacade.java index e9c050762..2b96255b9 100644 --- a/router/java/src/net/i2p/router/CommSystemFacade.java +++ b/router/java/src/net/i2p/router/CommSystemFacade.java @@ -48,7 +48,7 @@ public abstract class CommSystemFacade implements Service { public boolean haveInboundCapacity(int pct) { return true; } public boolean haveOutboundCapacity(int pct) { return true; } public boolean haveHighOutboundCapacity() { return true; } - public List getMostRecentErrorMessages() { return Collections.emptyList(); } + public List getMostRecentErrorMessages() { return Collections.emptyList(); } /** * Median clock skew of connected peers in seconds, or null if we cannot answer. diff --git a/router/java/src/net/i2p/router/Router.java b/router/java/src/net/i2p/router/Router.java index 0bad3eced..260115d45 100644 --- a/router/java/src/net/i2p/router/Router.java +++ b/router/java/src/net/i2p/router/Router.java @@ -611,6 +611,7 @@ public class Router implements RouterClock.ClockShiftListener { * This is synchronized with saveConfig(). * Not for external use. */ + @SuppressWarnings({ "unchecked", "rawtypes" }) public void readConfig() { synchronized(_configFileLock) { String f = getConfigFilename(); @@ -1391,6 +1392,7 @@ public class Router implements RouterClock.ClockShiftListener { * @return success * @since 0.8.13 */ + @SuppressWarnings({ "unchecked", "rawtypes" }) public boolean saveConfig(Map toAdd, Collection toRemove) { synchronized(_configFileLock) { if (toAdd != null) diff --git a/router/java/src/net/i2p/router/startup/LoadClientAppsJob.java b/router/java/src/net/i2p/router/startup/LoadClientAppsJob.java index 3fbfc381f..05969ec03 100644 --- a/router/java/src/net/i2p/router/startup/LoadClientAppsJob.java +++ b/router/java/src/net/i2p/router/startup/LoadClientAppsJob.java @@ -207,7 +207,7 @@ public class LoadClientAppsJob extends JobImpl { if (args == null) args = new String[0]; Class cls = Class.forName(className, true, cl); - Method method = cls.getMethod("main", new Class[] { String[].class }); + Method method = cls.getMethod("main", String[].class); method.invoke(cls, new Object[] { args }); } @@ -287,7 +287,7 @@ public class LoadClientAppsJob extends JobImpl { ClientApp app = (ClientApp) con.newInstance(conArgs); mgr.addAndStart(app, _args); } else { - Method method = cls.getMethod("main", new Class[] { String[].class }); + Method method = cls.getMethod("main", String[].class); method.invoke(cls, new Object[] { _args }); } } catch (Throwable t) { diff --git a/router/java/src/net/i2p/router/transport/OutboundMessageRegistry.java b/router/java/src/net/i2p/router/transport/OutboundMessageRegistry.java index 012107e6c..7c8e1b37d 100644 --- a/router/java/src/net/i2p/router/transport/OutboundMessageRegistry.java +++ b/router/java/src/net/i2p/router/transport/OutboundMessageRegistry.java @@ -96,6 +96,7 @@ public class OutboundMessageRegistry { * @return non-null List of OutNetMessage describing messages that were waiting for * the payload */ + @SuppressWarnings("unchecked") public List getOriginalMessages(I2NPMessage message) { List matchedSelectors = null; List removedSelectors = null; @@ -193,6 +194,7 @@ public class OutboundMessageRegistry { /** * @param allowEmpty is msg.getMessage() allowed to be null? */ + @SuppressWarnings("unchecked") private void registerPending(OutNetMessage msg, boolean allowEmpty) { if ( (!allowEmpty) && (msg.getMessage() == null) ) throw new IllegalArgumentException("OutNetMessage doesn't contain an I2NPMessage? Impossible?"); @@ -229,6 +231,7 @@ public class OutboundMessageRegistry { /** * @param msg may be be null */ + @SuppressWarnings("unchecked") public void unregisterPending(OutNetMessage msg) { if (msg == null) return; MessageSelector sel = msg.getReplySelector(); @@ -262,6 +265,7 @@ public class OutboundMessageRegistry { _nextExpire = -1; } + @SuppressWarnings("unchecked") public void timeReached() { long now = _context.clock().now(); List removing = new ArrayList(8); diff --git a/router/java/src/net/i2p/router/transport/udp/TimedWeightedPriorityMessageQueue.java b/router/java/src/net/i2p/router/transport/udp/TimedWeightedPriorityMessageQueue.java index 193c1751f..c6dbdb8e2 100644 --- a/router/java/src/net/i2p/router/transport/udp/TimedWeightedPriorityMessageQueue.java +++ b/router/java/src/net/i2p/router/transport/udp/TimedWeightedPriorityMessageQueue.java @@ -57,6 +57,7 @@ class TimedWeightedPriorityMessageQueue implements MessageQueue, OutboundMessage * specifically, this means how many messages in this queue * should be pulled off in a row before moving on to the next. */ + @SuppressWarnings({ "unchecked", "rawtypes" }) public TimedWeightedPriorityMessageQueue(RouterContext ctx, int[] priorityLimits, int[] weighting, FailedListener lsnr) { _context = ctx; _log = ctx.logManager().getLog(TimedWeightedPriorityMessageQueue.class); diff --git a/router/java/src/net/i2p/router/tunnel/PumpedTunnelGateway.java b/router/java/src/net/i2p/router/tunnel/PumpedTunnelGateway.java index 614c7faab..4f1f82d87 100644 --- a/router/java/src/net/i2p/router/tunnel/PumpedTunnelGateway.java +++ b/router/java/src/net/i2p/router/tunnel/PumpedTunnelGateway.java @@ -58,6 +58,7 @@ class PumpedTunnelGateway extends TunnelGateway { * @param receiver this receives the encrypted message and forwards it off * to the first hop */ + @SuppressWarnings({ "unchecked", "rawtypes" }) public PumpedTunnelGateway(RouterContext context, QueuePreprocessor preprocessor, Sender sender, Receiver receiver, TunnelGatewayPumper pumper) { super(context, preprocessor, sender, receiver); From 5f175455c7dd839b6bb110ac6b4424cedbfb4fd4 Mon Sep 17 00:00:00 2001 From: zzz Date: Sat, 17 Oct 2015 15:47:49 +0000 Subject: [PATCH 094/111] lint console,streaming --- .../i2p/client/streaming/I2PSocketManagerFactory.java | 6 +++--- .../java/src/net/i2p/router/news/NewsManager.java | 2 +- .../src/net/i2p/router/web/ConfigLoggingHandler.java | 4 +++- .../java/src/net/i2p/router/web/FormHandler.java | 2 ++ .../java/src/net/i2p/router/web/LocaleWebAppHandler.java | 5 +++-- .../java/src/net/i2p/router/web/PluginStarter.java | 9 ++++++--- .../java/src/net/i2p/router/web/TunnelRenderer.java | 6 ++++-- 7 files changed, 22 insertions(+), 12 deletions(-) diff --git a/apps/ministreaming/java/src/net/i2p/client/streaming/I2PSocketManagerFactory.java b/apps/ministreaming/java/src/net/i2p/client/streaming/I2PSocketManagerFactory.java index 863c5d31a..91c18cfe4 100644 --- a/apps/ministreaming/java/src/net/i2p/client/streaming/I2PSocketManagerFactory.java +++ b/apps/ministreaming/java/src/net/i2p/client/streaming/I2PSocketManagerFactory.java @@ -256,9 +256,9 @@ public class I2PSocketManagerFactory { Class cls = Class.forName(classname); if (!I2PSocketManager.class.isAssignableFrom(cls)) throw new IllegalArgumentException(classname + " is not an I2PSocketManager"); - Constructor con = (Constructor) - cls.getConstructor(new Class[] {I2PAppContext.class, I2PSession.class, Properties.class, String.class}); - I2PSocketManager mgr = con.newInstance(new Object[] {context, session, opts, name}); + Constructor con = + cls.getConstructor(I2PAppContext.class, I2PSession.class, Properties.class, String.class); + I2PSocketManager mgr = (I2PSocketManager) con.newInstance(new Object[] {context, session, opts, name}); return mgr; } catch (Throwable t) { getLog().log(Log.CRIT, "Error loading " + classname, t); diff --git a/apps/routerconsole/java/src/net/i2p/router/news/NewsManager.java b/apps/routerconsole/java/src/net/i2p/router/news/NewsManager.java index 9f21bf93c..d85baadf5 100644 --- a/apps/routerconsole/java/src/net/i2p/router/news/NewsManager.java +++ b/apps/routerconsole/java/src/net/i2p/router/news/NewsManager.java @@ -64,7 +64,7 @@ public class NewsManager implements RouterApp { */ public synchronized List getEntries() { if (!_currentNews.isEmpty()) - return new ArrayList(_currentNews); + return new ArrayList(_currentNews); // load old news.xml if (_log.shouldWarn()) _log.warn("no real XML, falling back to news.xml"); diff --git a/apps/routerconsole/java/src/net/i2p/router/web/ConfigLoggingHandler.java b/apps/routerconsole/java/src/net/i2p/router/web/ConfigLoggingHandler.java index e902e9c72..5c65011a0 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/ConfigLoggingHandler.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/ConfigLoggingHandler.java @@ -4,6 +4,8 @@ import java.io.ByteArrayInputStream; import java.io.IOException; import java.util.Properties; +import net.i2p.util.LogManager; + /** * Handler to deal with form submissions from the logging config form and act * upon the values. @@ -113,7 +115,7 @@ public class ConfigLoggingHandler extends FormHandler { } if (_fileSize != null) { - int newBytes = _context.logManager().getFileSize(_fileSize); + int newBytes = LogManager.getFileSize(_fileSize); int oldBytes = _context.logManager().getFileSize(); if (newBytes > 0) { if (oldBytes != newBytes) { diff --git a/apps/routerconsole/java/src/net/i2p/router/web/FormHandler.java b/apps/routerconsole/java/src/net/i2p/router/web/FormHandler.java index 1b2dabb3a..d4bd1d2ff 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/FormHandler.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/FormHandler.java @@ -23,6 +23,7 @@ public abstract class FormHandler { protected RouterContext _context; protected Log _log; /** Not for multipart/form-data, will be null */ + @SuppressWarnings("rawtypes") protected Map _settings; /** Only for multipart/form-data. Warning, parameters are NOT XSS filtered */ protected RequestWrapper _requestWrapper; @@ -63,6 +64,7 @@ public abstract class FormHandler { * * @since 0.9.4 consolidated from numerous FormHandlers */ + @SuppressWarnings({"rawtypes", "unchecked"}) public void setSettings(Map settings) { _settings = new HashMap(settings); } /** diff --git a/apps/routerconsole/java/src/net/i2p/router/web/LocaleWebAppHandler.java b/apps/routerconsole/java/src/net/i2p/router/web/LocaleWebAppHandler.java index 74ce11a19..1343a88cd 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/LocaleWebAppHandler.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/LocaleWebAppHandler.java @@ -83,6 +83,7 @@ public class LocaleWebAppHandler extends HandlerWrapper if (lang != null && lang.length() > 0 && !lang.equals("en")) { String testPath = pathInContext.substring(0, len - 4) + '_' + lang + ".jsp"; // Do we have a servlet for the new path that isn't the catchall *.jsp? + @SuppressWarnings("rawtypes") Map.Entry servlet = _wac.getServletHandler().getHolderEntry(testPath); if (servlet != null) { String servletPath = (String) servlet.getKey(); @@ -130,7 +131,7 @@ public class LocaleWebAppHandler extends HandlerWrapper /** * Mysteriously removed from Jetty 7 */ - private void setInitParams(Map params) { + private void setInitParams(Map params) { setInitParams(_wac, params); } @@ -138,7 +139,7 @@ public class LocaleWebAppHandler extends HandlerWrapper * @since Jetty 7 */ public static void setInitParams(WebAppContext context, Map params) { - for (Map.Entry e : params.entrySet()) { + for (Map.Entry e : params.entrySet()) { context.setInitParameter((String)e.getKey(), (String)e.getValue()); } } diff --git a/apps/routerconsole/java/src/net/i2p/router/web/PluginStarter.java b/apps/routerconsole/java/src/net/i2p/router/web/PluginStarter.java index 608de2aea..386eb664e 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/PluginStarter.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/PluginStarter.java @@ -264,6 +264,7 @@ public class PluginStarter implements Runnable { * @return true on success * @throws just about anything, caller would be wise to catch Throwable */ + @SuppressWarnings("deprecation") public static boolean startPlugin(RouterContext ctx, String appName) throws Exception { Log log = ctx.logManager().getLog(PluginStarter.class); File pluginDir = new File(ctx.getConfigDir(), PLUGIN_DIR + '/' + appName); @@ -344,9 +345,11 @@ public class PluginStarter implements Runnable { if (tfiles != null) { for (int i = 0; i < tfiles.length; i++) { String name = tfiles[i].getName(); - if (tfiles[i].isDirectory() && (!Arrays.asList(STANDARD_THEMES).contains(tfiles[i]))) + if (tfiles[i].isDirectory() && (!Arrays.asList(STANDARD_THEMES).contains(tfiles[i]))) { + // deprecated ctx.router().setConfigSetting(ConfigUIHelper.PROP_THEME_PFX + name, tfiles[i].getAbsolutePath()); // we don't need to save + } } } @@ -543,7 +546,7 @@ public class PluginStarter implements Runnable { boolean deleted = FileUtil.rmdir(pluginDir, false); Properties props = pluginProperties(); - for (Iterator iter = props.keySet().iterator(); iter.hasNext(); ) { + for (Iterator iter = props.keySet().iterator(); iter.hasNext(); ) { String name = (String)iter.next(); if (name.startsWith(PREFIX + appName + '.')) iter.remove(); @@ -973,7 +976,7 @@ public class PluginStarter implements Runnable { private static void addPath(URL u) throws Exception { URLClassLoader urlClassLoader = (URLClassLoader) ClassLoader.getSystemClassLoader(); Class urlClass = URLClassLoader.class; - Method method = urlClass.getDeclaredMethod("addURL", new Class[]{URL.class}); + Method method = urlClass.getDeclaredMethod("addURL", URL.class); method.setAccessible(true); method.invoke(urlClassLoader, new Object[]{u}); } diff --git a/apps/routerconsole/java/src/net/i2p/router/web/TunnelRenderer.java b/apps/routerconsole/java/src/net/i2p/router/web/TunnelRenderer.java index aab84c630..a761a5ac2 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/TunnelRenderer.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/TunnelRenderer.java @@ -212,14 +212,16 @@ public class TunnelRenderer { } out.write("
                                    \n"); if (in != null) { - List pending = in.listPending(); + // PooledTunnelCreatorConfig + List pending = in.listPending(); if (!pending.isEmpty()) { out.write("
                                    " + _t("Build in progress") + ": " + pending.size() + " " + _t("inbound") + "
                                    \n"); live += pending.size(); } } if (outPool != null) { - List pending = outPool.listPending(); + // PooledTunnelCreatorConfig + List pending = outPool.listPending(); if (!pending.isEmpty()) { out.write("
                                    " + _t("Build in progress") + ": " + pending.size() + " " + _t("outbound") + "
                                    \n"); live += pending.size(); From 71bc55b470bf66102788c6cb70b29c58da44a1a3 Mon Sep 17 00:00:00 2001 From: zzz Date: Sat, 17 Oct 2015 16:49:37 +0000 Subject: [PATCH 095/111] lint core, i2psnark, jetty, susimail --- .../java/src/org/klomp/snark/I2PSnarkUtil.java | 1 + .../java/src/org/klomp/snark/SnarkManager.java | 2 +- .../java/src/org/klomp/snark/dht/DHTTracker.java | 1 + .../i2psnark/java/src/org/klomp/snark/dht/KRPC.java | 4 ++++ apps/jetty/java/src/net/i2p/jetty/JettyStart.java | 1 + .../net/i2p/servlet/filters/XSSRequestWrapper.java | 1 + .../src/org/mortbay/servlet/MultiPartRequest.java | 1 + .../java/src/org/mortbay/util/ByteArrayPool.java | 13 +++++++------ .../src/src/i2p/susi/webmail/MailCache.java | 2 ++ apps/susimail/src/src/i2p/susi/webmail/WebMail.java | 6 +++--- .../net/i2p/client/naming/MetaNamingService.java | 4 ++-- .../src/net/i2p/client/naming/NamingService.java | 2 +- core/java/src/net/i2p/crypto/CryptoConstants.java | 4 ++-- core/java/src/net/i2p/crypto/ECConstants.java | 4 ++-- core/java/src/net/i2p/data/ByteArray.java | 7 +++---- core/java/src/net/i2p/util/FileUtil.java | 10 +++++----- 16 files changed, 37 insertions(+), 26 deletions(-) diff --git a/apps/i2psnark/java/src/org/klomp/snark/I2PSnarkUtil.java b/apps/i2psnark/java/src/org/klomp/snark/I2PSnarkUtil.java index e75ef301e..96f380435 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/I2PSnarkUtil.java +++ b/apps/i2psnark/java/src/org/klomp/snark/I2PSnarkUtil.java @@ -136,6 +136,7 @@ public class I2PSnarkUtil { public boolean configured() { return _configured; } + @SuppressWarnings({"unchecked", "rawtypes"}) public void setI2CPConfig(String i2cpHost, int i2cpPort, Map opts) { if (i2cpHost != null) _i2cpHost = i2cpHost; diff --git a/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java b/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java index bb1684e5f..03d4b8dc0 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java +++ b/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java @@ -2191,7 +2191,7 @@ public class SnarkManager implements CompleteListener { */ private void addMagnets() { boolean changed = false; - for (Iterator iter = _config.keySet().iterator(); iter.hasNext(); ) { + for (Iterator iter = _config.keySet().iterator(); iter.hasNext(); ) { String k = (String) iter.next(); if (k.startsWith(PROP_META_MAGNET_PREFIX)) { String b64 = k.substring(PROP_META_MAGNET_PREFIX.length()); 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 3b7b1d99c..784d8e6bf 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/dht/DHTTracker.java +++ b/apps/i2psnark/java/src/org/klomp/snark/dht/DHTTracker.java @@ -106,6 +106,7 @@ class DHTTracker { * @param noSeeds true if we do not want seeds in the result * @return list or empty list (never null) */ + @SuppressWarnings({"unchecked", "rawtypes"}) List getPeers(InfoHash ih, int max, boolean noSeeds) { Peers peers = _torrents.get(ih); if (peers == null || max <= 0) 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 58e0f39fc..0e6da1c22 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/dht/KRPC.java +++ b/apps/i2psnark/java/src/org/klomp/snark/dht/KRPC.java @@ -243,6 +243,7 @@ public class KRPC implements I2PSessionMuxedListener, DHT { * @param maxWait how long to wait for each to reply (not total) must be > 0 * @param parallel how many outstanding at once (unimplemented, always 1) */ + @SuppressWarnings("unchecked") private void explore(NID target, int maxNodes, long maxWait, int parallel) { List nodes = _knownNodes.findClosest(target, maxNodes); if (nodes.isEmpty()) { @@ -327,6 +328,7 @@ public class KRPC implements I2PSessionMuxedListener, DHT { * @param noSeeds true if we do not want seeds in the result * @return possibly empty (never null) */ + @SuppressWarnings("unchecked") public Collection getPeersAndAnnounce(byte[] ih, int max, long maxWait, int annMax, long annMaxWait, boolean isSeed, boolean noSeeds) { @@ -858,6 +860,7 @@ public class KRPC implements I2PSessionMuxedListener, DHT { * @param repliable true for all but announce * @return null on error */ + @SuppressWarnings("unchecked") private ReplyWaiter sendQuery(NodeInfo nInfo, Map map, boolean repliable) { if (nInfo.equals(_myNodeInfo)) throw new IllegalArgumentException("wtf don't send to ourselves"); @@ -907,6 +910,7 @@ public class KRPC implements I2PSessionMuxedListener, DHT { * @param toPort the query port, we will increment here * @return success */ + @SuppressWarnings("unchecked") private boolean sendResponse(NodeInfo nInfo, MsgID msgID, Map map) { if (nInfo.equals(_myNodeInfo)) throw new IllegalArgumentException("wtf don't send to ourselves"); diff --git a/apps/jetty/java/src/net/i2p/jetty/JettyStart.java b/apps/jetty/java/src/net/i2p/jetty/JettyStart.java index 6cac1cbae..c5f9e2aaf 100644 --- a/apps/jetty/java/src/net/i2p/jetty/JettyStart.java +++ b/apps/jetty/java/src/net/i2p/jetty/JettyStart.java @@ -72,6 +72,7 @@ public class JettyStart implements ClientApp { /** * Modified from XmlConfiguration.main() */ + @SuppressWarnings({"unchecked", "rawtypes"}) public void parseArgs(String[] args) throws Exception { Properties properties=new Properties(); XmlConfiguration last=null; diff --git a/apps/jetty/java/src/net/i2p/servlet/filters/XSSRequestWrapper.java b/apps/jetty/java/src/net/i2p/servlet/filters/XSSRequestWrapper.java index b8b8d3991..54975964b 100644 --- a/apps/jetty/java/src/net/i2p/servlet/filters/XSSRequestWrapper.java +++ b/apps/jetty/java/src/net/i2p/servlet/filters/XSSRequestWrapper.java @@ -84,6 +84,7 @@ public class XSSRequestWrapper extends HttpServletRequestWrapper { * Parameter names starting with "nofilter_" will not be filtered. */ @Override + @SuppressWarnings({"unchecked", "rawtypes"}) public Map getParameterMap() { Map rv = new HashMap(); for (Enumeration keys = getParameterNames(); keys.hasMoreElements(); ) { diff --git a/apps/jetty/java/src/org/mortbay/servlet/MultiPartRequest.java b/apps/jetty/java/src/org/mortbay/servlet/MultiPartRequest.java index 1c964b8f1..1cc3973fd 100644 --- a/apps/jetty/java/src/org/mortbay/servlet/MultiPartRequest.java +++ b/apps/jetty/java/src/org/mortbay/servlet/MultiPartRequest.java @@ -219,6 +219,7 @@ public class MultiPartRequest } /* ------------------------------------------------------------ */ + @SuppressWarnings("rawtypes") public Hashtable[] getMultipleParams(String name) { List parts = _partMap.getValues(name); diff --git a/apps/jetty/java/src/org/mortbay/util/ByteArrayPool.java b/apps/jetty/java/src/org/mortbay/util/ByteArrayPool.java index 9a3f088fb..0c98dded1 100644 --- a/apps/jetty/java/src/org/mortbay/util/ByteArrayPool.java +++ b/apps/jetty/java/src/org/mortbay/util/ByteArrayPool.java @@ -29,7 +29,7 @@ public class ByteArrayPool public static final int __POOL_SIZE= Integer.getInteger("org.mortbay.util.ByteArrayPool.pool_size",8).intValue(); - public static final ThreadLocal __pools=new BAThreadLocal(); + public static final ThreadLocal __pools = new BAThreadLocal(); public static final AtomicInteger __slot = new AtomicInteger(); /* ------------------------------------------------------------ */ @@ -39,7 +39,7 @@ public class ByteArrayPool */ public static byte[] getByteArray(int size) { - byte[][] pool = (byte[][])__pools.get(); + byte[][] pool = __pools.get(); boolean full=true; for (int i=pool.length;i-->0;) { @@ -63,7 +63,7 @@ public class ByteArrayPool /* ------------------------------------------------------------ */ public static byte[] getByteArrayAtLeast(int minSize) { - byte[][] pool = (byte[][])__pools.get(); + byte[][] pool = __pools.get(); for (int i=pool.length;i-->0;) { if (pool[i]!=null && pool[i].length>=minSize) @@ -84,7 +84,7 @@ public class ByteArrayPool if (b==null) return; - byte[][] pool = (byte[][])__pools.get(); + byte[][] pool = __pools.get(); for (int i=pool.length;i-->0;) { if (pool[i]==null) @@ -103,9 +103,10 @@ public class ByteArrayPool /* ------------------------------------------------------------ */ /* ------------------------------------------------------------ */ - private static final class BAThreadLocal extends ThreadLocal + private static final class BAThreadLocal extends ThreadLocal { - protected Object initialValue() + @Override + protected byte[][] initialValue() { return new byte[__POOL_SIZE][]; } diff --git a/apps/susimail/src/src/i2p/susi/webmail/MailCache.java b/apps/susimail/src/src/i2p/susi/webmail/MailCache.java index 45aa601b8..278a4e120 100644 --- a/apps/susimail/src/src/i2p/susi/webmail/MailCache.java +++ b/apps/susimail/src/src/i2p/susi/webmail/MailCache.java @@ -109,6 +109,7 @@ class MailCache { * @param mode CACHE_ONLY to not pull from pop server * @return An e-mail or null */ + @SuppressWarnings({"unchecked", "rawtypes"}) public Mail getMail(String uidl, FetchMode mode) { Mail mail = null, newMail = null; @@ -163,6 +164,7 @@ class MailCache { * @return true if any were fetched * @since 0.9.13 */ + @SuppressWarnings({"unchecked", "rawtypes"}) public boolean getMail(FetchMode mode) { if (mode == FetchMode.CACHE_ONLY) throw new IllegalArgumentException(); diff --git a/apps/susimail/src/src/i2p/susi/webmail/WebMail.java b/apps/susimail/src/src/i2p/susi/webmail/WebMail.java index 5f6975bc5..9ff4b933b 100644 --- a/apps/susimail/src/src/i2p/susi/webmail/WebMail.java +++ b/apps/susimail/src/src/i2p/susi/webmail/WebMail.java @@ -288,7 +288,7 @@ public class WebMail extends HttpServlet */ private static class SenderSorter extends SorterBase { - private final Comparator collator = Collator.getInstance(); + private final Comparator collator = Collator.getInstance(); public SenderSorter( MailCache mailCache ) { @@ -307,7 +307,7 @@ public class WebMail extends HttpServlet * @author susi */ private static class SubjectSorter extends SorterBase { - private final Comparator collator = Collator.getInstance(); + private final Comparator collator = Collator.getInstance(); public SubjectSorter( MailCache mailCache ) { @@ -2299,7 +2299,7 @@ public class WebMail extends HttpServlet /** * first prev next last */ - private static void showPageButtons(PrintWriter out, Folder folder) { + private static void showPageButtons(PrintWriter out, Folder folder) { out.println( "
                                    " + ( folder.isFirstPage() ? diff --git a/core/java/src/net/i2p/client/naming/MetaNamingService.java b/core/java/src/net/i2p/client/naming/MetaNamingService.java index ffae355a5..5a4ebd275 100644 --- a/core/java/src/net/i2p/client/naming/MetaNamingService.java +++ b/core/java/src/net/i2p/client/naming/MetaNamingService.java @@ -41,8 +41,8 @@ public class MetaNamingService extends DummyNamingService { while (tok.hasMoreTokens()) { try { Class cls = Class.forName(tok.nextToken()); - Constructor con = cls.getConstructor(new Class[] { I2PAppContext.class }); - addNamingService((NamingService)con.newInstance(new Object[] { context }), false); + Constructor con = cls.getConstructor(I2PAppContext.class); + addNamingService((NamingService)con.newInstance(), false); } catch (Exception ex) { } } diff --git a/core/java/src/net/i2p/client/naming/NamingService.java b/core/java/src/net/i2p/client/naming/NamingService.java index be9e598c2..78e04232d 100644 --- a/core/java/src/net/i2p/client/naming/NamingService.java +++ b/core/java/src/net/i2p/client/naming/NamingService.java @@ -537,7 +537,7 @@ public abstract class NamingService { try { Class cls = Class.forName(impl); Constructor con = cls.getConstructor(I2PAppContext.class); - instance = (NamingService)con.newInstance(new Object[] { context }); + instance = (NamingService)con.newInstance(context); } catch (Exception ex) { Log log = context.logManager().getLog(NamingService.class); // Blockfile may throw RuntimeException but HostsTxt won't diff --git a/core/java/src/net/i2p/crypto/CryptoConstants.java b/core/java/src/net/i2p/crypto/CryptoConstants.java index 94facd366..b9e0327dd 100644 --- a/core/java/src/net/i2p/crypto/CryptoConstants.java +++ b/core/java/src/net/i2p/crypto/CryptoConstants.java @@ -92,8 +92,8 @@ public class CryptoConstants { if (ECConstants.isBCAvailable()) { try { Class cls = Class.forName("org.bouncycastle.jce.spec.ElGamalParameterSpec"); - Constructor con = cls.getConstructor(new Class[] {BigInteger.class, BigInteger.class}); - spec = (AlgorithmParameterSpec)con.newInstance(new Object[] {elgp, elgg}); + Constructor con = cls.getConstructor(BigInteger.class, BigInteger.class); + spec = (AlgorithmParameterSpec)con.newInstance(elgp, elgg); //System.out.println("BC ElG spec loaded"); } catch (Exception e) { //System.out.println("BC ElG spec failed"); diff --git a/core/java/src/net/i2p/crypto/ECConstants.java b/core/java/src/net/i2p/crypto/ECConstants.java index affe6e4e8..d9b111e23 100644 --- a/core/java/src/net/i2p/crypto/ECConstants.java +++ b/core/java/src/net/i2p/crypto/ECConstants.java @@ -42,8 +42,8 @@ class ECConstants { if (Security.getProvider("BC") == null) { try { Class cls = Class.forName("org.bouncycastle.jce.provider.BouncyCastleProvider"); - Constructor con = cls.getConstructor(new Class[0]); - Provider bc = (Provider)con.newInstance(new Object[0]); + Constructor con = cls.getConstructor(); + Provider bc = (Provider)con.newInstance(); Security.addProvider(bc); log("Added BC provider"); loaded = true; diff --git a/core/java/src/net/i2p/data/ByteArray.java b/core/java/src/net/i2p/data/ByteArray.java index 1801b122e..50670c760 100644 --- a/core/java/src/net/i2p/data/ByteArray.java +++ b/core/java/src/net/i2p/data/ByteArray.java @@ -16,7 +16,7 @@ import java.io.Serializable; * maps, and the like. * */ -public class ByteArray implements Serializable, Comparable { +public class ByteArray implements Serializable, Comparable { private byte[] _data; private int _valid; private int _offset; @@ -85,9 +85,8 @@ public class ByteArray implements Serializable, Comparable { return (llen == rlen) && DataHelper.eq(lhs, loff, rhs, roff, llen); } - public final int compareTo(Object obj) { - if (obj.getClass() != getClass()) throw new ClassCastException("invalid object: " + obj); - return DataHelper.compareTo(_data, ((ByteArray)obj).getData()); + public final int compareTo(ByteArray ba) { + return DataHelper.compareTo(_data, ba.getData()); } @Override diff --git a/core/java/src/net/i2p/util/FileUtil.java b/core/java/src/net/i2p/util/FileUtil.java index eeca4416f..296030818 100644 --- a/core/java/src/net/i2p/util/FileUtil.java +++ b/core/java/src/net/i2p/util/FileUtil.java @@ -300,9 +300,9 @@ public class FileUtil { if (!_failedOracle) { try { Class p200 = Class.forName("java.util.jar.Pack200", true, ClassLoader.getSystemClassLoader()); - Method newUnpacker = p200.getMethod("newUnpacker", (Class[]) null); + Method newUnpacker = p200.getMethod("newUnpacker"); Object unpacker = newUnpacker.invoke(null,(Object[]) null); - Method unpack = unpacker.getClass().getMethod("unpack", new Class[] {InputStream.class, JarOutputStream.class}); + Method unpack = unpacker.getClass().getMethod("unpack", InputStream.class, JarOutputStream.class); // throws IOException unpack.invoke(unpacker, new Object[] {in, out}); return; @@ -321,9 +321,9 @@ public class FileUtil { if (!_failedApache) { try { Class p200 = Class.forName("org.apache.harmony.unpack200.Archive", true, ClassLoader.getSystemClassLoader()); - Constructor newUnpacker = p200.getConstructor(new Class[] {InputStream.class, JarOutputStream.class}); - Object unpacker = newUnpacker.newInstance(new Object[] {in, out}); - Method unpack = unpacker.getClass().getMethod("unpack", (Class[]) null); + Constructor newUnpacker = p200.getConstructor(InputStream.class, JarOutputStream.class); + Object unpacker = newUnpacker.newInstance(in, out); + Method unpack = unpacker.getClass().getMethod("unpack"); // throws IOException or Pack200Exception unpack.invoke(unpacker, (Object[]) null); return; From abc0f4c720278294b3d95998c726d6b61db1a713 Mon Sep 17 00:00:00 2001 From: zzz Date: Sat, 17 Oct 2015 17:38:57 +0000 Subject: [PATCH 096/111] lint core, console, i2ptunnel, jetty --- apps/i2ptunnel/jsp/editClient.jsp | 2 +- apps/i2ptunnel/jsp/editServer.jsp | 2 +- apps/i2ptunnel/jsp/index.jsp | 23 ++++++++++--------- apps/i2ptunnel/jsp/wizard.jsp | 2 +- .../servlet/filters/XSSRequestWrapper.java | 9 ++++---- apps/routerconsole/jsp/configui.jsp | 2 +- apps/routerconsole/jsp/console.jsp | 2 +- apps/routerconsole/jsp/css.jsi | 2 +- apps/routerconsole/jsp/home.jsp | 2 +- apps/routerconsole/jsp/summaryframe.jsp | 2 +- .../java/src/net/i2p/kademlia/KBucketSet.java | 1 + 11 files changed, 25 insertions(+), 24 deletions(-) diff --git a/apps/i2ptunnel/jsp/editClient.jsp b/apps/i2ptunnel/jsp/editClient.jsp index 5fbc62dd4..3ac7d5454 100644 --- a/apps/i2ptunnel/jsp/editClient.jsp +++ b/apps/i2ptunnel/jsp/editClient.jsp @@ -56,7 +56,7 @@ input.default { width: 1px; height: 1px; visibility: hidden; } %>

                                    <%=intl._t("New proxy settings")%>

                                    <% } %> - + <% // these are four keys that are generated automatically on first save, diff --git a/apps/i2ptunnel/jsp/editServer.jsp b/apps/i2ptunnel/jsp/editServer.jsp index 4a0a7eabf..ac3eb48e3 100644 --- a/apps/i2ptunnel/jsp/editServer.jsp +++ b/apps/i2ptunnel/jsp/editServer.jsp @@ -56,7 +56,7 @@ input.default { width: 1px; height: 1px; visibility: hidden; } %>

                                    <%=intl._t("New server settings")%>

                                    <% } %> - + <% // these are four keys that are generated automatically on first save, diff --git a/apps/i2ptunnel/jsp/index.jsp b/apps/i2ptunnel/jsp/index.jsp index da05b233a..9e2c06492 100644 --- a/apps/i2ptunnel/jsp/index.jsp +++ b/apps/i2ptunnel/jsp/index.jsp @@ -60,6 +60,7 @@ <% if (indexBean.isInitialized()) { + String nextNonce = net.i2p.i2ptunnel.web.IndexBean.getNextNonce(); %>
                                    @@ -67,12 +68,12 @@ @@ -152,17 +153,17 @@ switch (indexBean.getTunnelStatus(curServer)) { case IndexBean.STARTING: %>
                                    <%=intl._t("Starting...")%>
                                    - <%=intl._t("Stop")%> + <%=intl._t("Stop")%> <% break; case IndexBean.RUNNING: %>
                                    <%=intl._t("Running")%>
                                    - <%=intl._t("Stop")%> + <%=intl._t("Stop")%> <% break; case IndexBean.NOT_RUNNING: %>
                                    <%=intl._t("Stopped")%>
                                    - <%=intl._t("Start")%> + <%=intl._t("Start")%> <% break; } @@ -275,22 +276,22 @@ switch (indexBean.getTunnelStatus(curClient)) { case IndexBean.STARTING: %>
                                    <%=intl._t("Starting...")%>
                                    - <%=intl._t("Stop")%> + <%=intl._t("Stop")%> <% break; case IndexBean.STANDBY: %>
                                    <%=intl._t("Standby")%>
                                    - <%=intl._t("Stop")%> + <%=intl._t("Stop")%> <% break; case IndexBean.RUNNING: %>
                                    <%=intl._t("Running")%>
                                    - <%=intl._t("Stop")%> + <%=intl._t("Stop")%> <% break; case IndexBean.NOT_RUNNING: %>
                                    <%=intl._t("Stopped")%>
                                    - <%=intl._t("Start")%> + <%=intl._t("Start")%> <% break; } diff --git a/apps/i2ptunnel/jsp/wizard.jsp b/apps/i2ptunnel/jsp/wizard.jsp index 6541ffc17..fefd8a877 100644 --- a/apps/i2ptunnel/jsp/wizard.jsp +++ b/apps/i2ptunnel/jsp/wizard.jsp @@ -92,7 +92,7 @@ } %> - +
                                    diff --git a/apps/jetty/java/src/net/i2p/servlet/filters/XSSRequestWrapper.java b/apps/jetty/java/src/net/i2p/servlet/filters/XSSRequestWrapper.java index 54975964b..8d16e5953 100644 --- a/apps/jetty/java/src/net/i2p/servlet/filters/XSSRequestWrapper.java +++ b/apps/jetty/java/src/net/i2p/servlet/filters/XSSRequestWrapper.java @@ -84,11 +84,10 @@ public class XSSRequestWrapper extends HttpServletRequestWrapper { * Parameter names starting with "nofilter_" will not be filtered. */ @Override - @SuppressWarnings({"unchecked", "rawtypes"}) - public Map getParameterMap() { - Map rv = new HashMap(); - for (Enumeration keys = getParameterNames(); keys.hasMoreElements(); ) { - String k = (String) keys.nextElement(); + public Map getParameterMap() { + Map rv = new HashMap(); + for (Enumeration keys = getParameterNames(); keys.hasMoreElements(); ) { + String k = keys.nextElement(); String[] v = getParameterValues(k); if (v != null) rv.put(k, v); diff --git a/apps/routerconsole/jsp/configui.jsp b/apps/routerconsole/jsp/configui.jsp index 73d0ec565..96f7bf84c 100644 --- a/apps/routerconsole/jsp/configui.jsp +++ b/apps/routerconsole/jsp/configui.jsp @@ -31,7 +31,7 @@ input.default { <%@include file="formhandler.jsi" %>

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

                                    - + <% diff --git a/apps/routerconsole/jsp/console.jsp b/apps/routerconsole/jsp/console.jsp index 1cff1e369..c61025795 100644 --- a/apps/routerconsole/jsp/console.jsp +++ b/apps/routerconsole/jsp/console.jsp @@ -10,7 +10,7 @@ <%@include file="summaryajax.jsi" %> <% - String consoleNonce = intl.getNonce(); + String consoleNonce = net.i2p.router.web.CSSHelper.getNonce(); %> <%@include file="summary.jsi" %> diff --git a/apps/routerconsole/jsp/css.jsi b/apps/routerconsole/jsp/css.jsi index 50c70d875..edae86240 100644 --- a/apps/routerconsole/jsp/css.jsi +++ b/apps/routerconsole/jsp/css.jsi @@ -37,7 +37,7 @@ } String conNonceParam = request.getParameter("consoleNonce"); - if (intl.getNonce().equals(conNonceParam)) { + if (net.i2p.router.web.CSSHelper.getNonce().equals(conNonceParam)) { intl.setLang(request.getParameter("lang")); intl.setNews(request.getParameter("news")); } diff --git a/apps/routerconsole/jsp/home.jsp b/apps/routerconsole/jsp/home.jsp index ec00c6b08..eb9887e97 100644 --- a/apps/routerconsole/jsp/home.jsp +++ b/apps/routerconsole/jsp/home.jsp @@ -8,7 +8,7 @@ <%@include file="summaryajax.jsi" %> <% - String consoleNonce = intl.getNonce(); + String consoleNonce = net.i2p.router.web.CSSHelper.getNonce(); %> " /> diff --git a/apps/routerconsole/jsp/summaryframe.jsp b/apps/routerconsole/jsp/summaryframe.jsp index 3107bb96a..290e37043 100644 --- a/apps/routerconsole/jsp/summaryframe.jsp +++ b/apps/routerconsole/jsp/summaryframe.jsp @@ -23,7 +23,7 @@ if (!shutdownSoon) { if (d == null || "".equals(d)) { // set below - } else if (intl.getNonce().equals(conNonceParam)) { + } else if (net.i2p.router.web.CSSHelper.getNonce().equals(conNonceParam)) { d = net.i2p.data.DataHelper.stripHTML(d); // XSS intl.setRefresh(d); intl.setDisableRefresh(d); diff --git a/core/java/src/net/i2p/kademlia/KBucketSet.java b/core/java/src/net/i2p/kademlia/KBucketSet.java index a2d0610a6..0d5daa223 100644 --- a/core/java/src/net/i2p/kademlia/KBucketSet.java +++ b/core/java/src/net/i2p/kademlia/KBucketSet.java @@ -628,6 +628,7 @@ public class KBucketSet { * @param data size <= SDS length, else throws IAE * Can be 1 bigger if top byte is zero */ + @SuppressWarnings("unchecked") private T makeKey(byte[] data) { int len = _us.length(); int dlen = data.length; From f713a1978547b57110b758474406ed93030b7da8 Mon Sep 17 00:00:00 2001 From: zzz Date: Sat, 17 Oct 2015 20:13:03 +0000 Subject: [PATCH 097/111] Disable TLS_DHE_DSS_WITH_AES_128_CBC_SHA --- core/java/src/net/i2p/util/I2PSSLSocketFactory.java | 10 +++++++++- installer/resources/eepsite/jetty-ssl.xml | 2 ++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/core/java/src/net/i2p/util/I2PSSLSocketFactory.java b/core/java/src/net/i2p/util/I2PSSLSocketFactory.java index 4761ac710..774415f4d 100644 --- a/core/java/src/net/i2p/util/I2PSSLSocketFactory.java +++ b/core/java/src/net/i2p/util/I2PSSLSocketFactory.java @@ -204,7 +204,15 @@ public class I2PSSLSocketFactory { "TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA", "TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA", "TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA", - "TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA" + "TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA", + // following is disabled because it is weak + // see e.g. https://bugzilla.mozilla.org/show_bug.cgi?id=1107787 + "TLS_DHE_DSS_WITH_AES_128_CBC_SHA" + // ??? "TLS_DHE_DSS_WITH_AES_256_CBC_SHA" + // + // NOTE: + // If you add anything here, please also add to installer/resources/eepsite/jetty-ssl.xml + // })); /** diff --git a/installer/resources/eepsite/jetty-ssl.xml b/installer/resources/eepsite/jetty-ssl.xml index 7562828cc..b14ca0976 100644 --- a/installer/resources/eepsite/jetty-ssl.xml +++ b/installer/resources/eepsite/jetty-ssl.xml @@ -248,6 +248,8 @@ TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA + TLS_DHE_DSS_WITH_AES_128_CBC_SHA + From 6efce31eed46774d247b17786ab110bd25daa48b Mon Sep 17 00:00:00 2001 From: zzz Date: Wed, 21 Oct 2015 13:11:35 +0000 Subject: [PATCH 098/111] Increase timer thread priority --- core/java/src/net/i2p/util/SimpleTimer2.java | 1 + router/java/src/net/i2p/router/JobQueue.java | 2 +- router/java/src/net/i2p/router/JobQueueRunner.java | 1 + 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/core/java/src/net/i2p/util/SimpleTimer2.java b/core/java/src/net/i2p/util/SimpleTimer2.java index f2be24405..4cfab3a0a 100644 --- a/core/java/src/net/i2p/util/SimpleTimer2.java +++ b/core/java/src/net/i2p/util/SimpleTimer2.java @@ -118,6 +118,7 @@ public class SimpleTimer2 { // (new Exception("OWCH! DAMN! Wrong ThreadGroup `" + name +"', `" + rv.getName() + "'")).printStackTrace(); // } rv.setDaemon(true); + rv.setPriority(Thread.NORM_PRIORITY + 1); return rv; } } diff --git a/router/java/src/net/i2p/router/JobQueue.java b/router/java/src/net/i2p/router/JobQueue.java index 2641707be..141f348bf 100644 --- a/router/java/src/net/i2p/router/JobQueue.java +++ b/router/java/src/net/i2p/router/JobQueue.java @@ -341,7 +341,7 @@ public class JobQueue { public void startup() { _alive = true; I2PThread pumperThread = new I2PThread(_pumper, "Job Queue Pumper", true); - //pumperThread.setPriority(I2PThread.NORM_PRIORITY+1); + pumperThread.setPriority(Thread.NORM_PRIORITY + 1); pumperThread.start(); } diff --git a/router/java/src/net/i2p/router/JobQueueRunner.java b/router/java/src/net/i2p/router/JobQueueRunner.java index 9cf23f998..ecc4cd954 100644 --- a/router/java/src/net/i2p/router/JobQueueRunner.java +++ b/router/java/src/net/i2p/router/JobQueueRunner.java @@ -21,6 +21,7 @@ class JobQueueRunner extends I2PThread { _id = id; _keepRunning = true; _log = _context.logManager().getLog(JobQueueRunner.class); + setPriority(NORM_PRIORITY + 1); // all createRateStat in JobQueue //_state = 1; } From c595895877c18e88abd8354f967a0117a520fcf1 Mon Sep 17 00:00:00 2001 From: zzz Date: Wed, 21 Oct 2015 13:22:32 +0000 Subject: [PATCH 099/111] i2psnark: More consistency and torrent links in messages --- .../src/org/klomp/snark/SnarkManager.java | 47 +++++++++++++------ history.txt | 11 +++++ .../src/net/i2p/router/RouterVersion.java | 2 +- 3 files changed, 44 insertions(+), 16 deletions(-) diff --git a/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java b/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java index 03d4b8dc0..688cf7e95 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java +++ b/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java @@ -1315,11 +1315,12 @@ public class SnarkManager implements CompleteListener { running = false; } // Were we running last time? + String link = linkify(torrent); if (!dontAutoStart && shouldAutoStart() && running) { torrent.startTorrent(); - addMessage(_t("Torrent added and started: \"{0}\"", torrent.getBaseName())); + addMessageNoEscape(_t("Torrent added and started: {0}", link)); } else { - addMessage(_t("Torrent added: \"{0}\"", torrent.getBaseName())); + addMessageNoEscape(_t("Torrent added: {0}", link)); } } @@ -1982,7 +1983,7 @@ public class SnarkManager implements CompleteListener { if (shouldRemove) removeTorrentStatus(torrent); if (!wasStopped) - addMessage(_t("Torrent stopped: \"{0}\"", torrent.getBaseName())); + addMessageNoEscape(_t("Torrent stopped: {0}", linkify(torrent))); } return torrent; } @@ -2001,7 +2002,7 @@ public class SnarkManager implements CompleteListener { boolean wasStopped = torrent.isStopped(); torrent.stopTorrent(); if (!wasStopped) - addMessage(_t("Torrent stopped: \"{0}\"", torrent.getBaseName())); + addMessageNoEscape(_t("Torrent stopped: {0}", linkify(torrent))); if (shouldRemove) removeTorrentStatus(torrent); } @@ -2087,14 +2088,8 @@ public class SnarkManager implements CompleteListener { Storage storage = snark.getStorage(); if (meta == null || storage == null) return; - StringBuilder buf = new StringBuilder(256); - String base = DataHelper.escapeHTML(storage.getBaseName()); - buf.append("").append(base).append(""); if (snark.getDownloaded() > 0) - addMessageNoEscape(_t("Download finished: {0}", buf.toString())); // + " (" + _t("size: {0}B", DataHelper.formatSize2(len)) + ')'); + addMessageNoEscape(_t("Download finished: {0}", linkify(snark))); updateStatus(snark); } @@ -2150,7 +2145,7 @@ public class SnarkManager implements CompleteListener { _magnets.remove(snark.getName()); removeMagnetStatus(snark.getInfoHash()); addMessage(_t("Metainfo received for {0}", snark.getName())); - addMessage(_t("Starting up torrent {0}", storage.getBaseName())); + addMessageNoEscape(_t("Starting up torrent {0}", linkify(snark))); return name; } catch (IOException ioe) { addMessage(_t("Failed to copy torrent file to {0}", name)); @@ -2184,6 +2179,27 @@ public class SnarkManager implements CompleteListener { // End Snark.CompleteListeners + /** + * An HTML link to the file if complete and a single file, + * to the directory if not complete or not a single file, + * or simply the unlinkified name of the snark if a magnet + * + * @since 0.9.23 + */ + private String linkify(Snark snark) { + MetaInfo meta = snark.getMetaInfo(); + Storage storage = snark.getStorage(); + if (meta == null || storage == null) + return DataHelper.escapeHTML(snark.getBaseName()); + StringBuilder buf = new StringBuilder(256); + String base = DataHelper.escapeHTML(storage.getBaseName()); + buf.append("").append(base).append(""); + return buf.toString(); + } + /** * Add all magnets from the config file * @@ -2412,7 +2428,7 @@ public class SnarkManager implements CompleteListener { boolean connected = _util.connected(); if ((!connected) && !_util.isConnecting()) addMessage(_t("Opening the I2P tunnel")); - addMessage(_t("Starting up torrent {0}", snark.getBaseName())); + addMessageNoEscape(_t("Starting up torrent {0}", linkify(snark))); if (connected) { snark.startTorrent(); } else { @@ -2570,13 +2586,14 @@ public class SnarkManager implements CompleteListener { updateStatus(snark); if (_log.shouldWarn()) _log.warn("Finished recheck of " + snark.getBaseName() + " changed? " + changed); + String link = linkify(snark); if (changed) { int pieces = snark.getPieces(); double completion = (pieces - snark.getNeeded()) / (double) pieces; String complete = (new DecimalFormat("0.00%")).format(completion); - addMessage(_t("Finished recheck of torrent {0}, now {1} complete", snark.getBaseName(), complete)); + addMessageNoEscape(_t("Finished recheck of torrent {0}, now {1} complete", link, complete)); } else { - addMessage(_t("Finished recheck of torrent {0}, unchanged", snark.getBaseName())); + addMessageNoEscape(_t("Finished recheck of torrent {0}, unchanged", link)); } } catch (Exception e) { _log.error("Error rechecking " + snark.getBaseName(), e); diff --git a/history.txt b/history.txt index f04c70cac..08fdabe18 100644 --- a/history.txt +++ b/history.txt @@ -1,7 +1,18 @@ +2015-10-21 zzz + * i2psnark: More consistency and torrent links in messages + * Router: Increase timer thread priority + +2015-10-17 zzz + * Crypto: + - Consolidate duplicate unlimited strength crypto check code + - Disable TLS_DHE_DSS_WITH_AES_128_CBC_SHA + 2015-10-16 zzz + * Console: Add Java 6 warning to summary bar * i2psnark: - Fix deadlock (ticket #1432) - Add "smart sort" option, set sort based on language (tickets #637, #1303) + - Don't balloon files on ARM (ticket #1684) 2015-10-14 zzz * Update: diff --git a/router/java/src/net/i2p/router/RouterVersion.java b/router/java/src/net/i2p/router/RouterVersion.java index 80cfb9c84..5b1ba79e3 100644 --- a/router/java/src/net/i2p/router/RouterVersion.java +++ b/router/java/src/net/i2p/router/RouterVersion.java @@ -18,7 +18,7 @@ public class RouterVersion { /** deprecated */ public final static String ID = "Monotone"; public final static String VERSION = CoreVersion.VERSION; - public final static long BUILD = 18; + public final static long BUILD = 19; /** for example "-test" */ public final static String EXTRA = ""; From 627d0d29dbdf02aa44266b803b9d1e840814d804 Mon Sep 17 00:00:00 2001 From: zzz Date: Fri, 30 Oct 2015 16:53:45 +0000 Subject: [PATCH 100/111] Router: Fix cascading I2CP error (ticket #1692) caused by not setting message ID. only happens when serialized (external I2CP) --- history.txt | 3 +++ router/java/src/net/i2p/router/RouterVersion.java | 2 +- .../src/net/i2p/router/client/ClientMessageEventListener.java | 4 ++-- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/history.txt b/history.txt index 08fdabe18..229e72fdc 100644 --- a/history.txt +++ b/history.txt @@ -1,3 +1,6 @@ +2015-10-30 zzz + * Router: Fix cascading I2CP error (ticket #1692) + 2015-10-21 zzz * i2psnark: More consistency and torrent links in messages * Router: Increase timer thread priority diff --git a/router/java/src/net/i2p/router/RouterVersion.java b/router/java/src/net/i2p/router/RouterVersion.java index 5b1ba79e3..f5c926454 100644 --- a/router/java/src/net/i2p/router/RouterVersion.java +++ b/router/java/src/net/i2p/router/RouterVersion.java @@ -18,7 +18,7 @@ public class RouterVersion { /** deprecated */ public final static String ID = "Monotone"; public final static String VERSION = CoreVersion.VERSION; - public final static long BUILD = 19; + public final static long BUILD = 20; /** for example "-test" */ public final static String EXTRA = ""; diff --git a/router/java/src/net/i2p/router/client/ClientMessageEventListener.java b/router/java/src/net/i2p/router/client/ClientMessageEventListener.java index 8db9da336..d5697571e 100644 --- a/router/java/src/net/i2p/router/client/ClientMessageEventListener.java +++ b/router/java/src/net/i2p/router/client/ClientMessageEventListener.java @@ -196,7 +196,6 @@ class ClientMessageEventListener implements I2CPMessageReader.I2CPMessageEventLi private void handleSetDate(SetDateMessage message) { //_context.clock().setNow(message.getDate().getTime()); } - /** * Handle a CreateSessionMessage. @@ -378,6 +377,7 @@ class ClientMessageEventListener implements I2CPMessageReader.I2CPMessageEventLi // do this instead: if (sid != null && message.getNonce() > 0) { MessageStatusMessage status = new MessageStatusMessage(); + status.setMessageId(_runner.getNextMessageId()); status.setSessionId(sid.getSessionId()); status.setSize(0); status.setNonce(message.getNonce()); @@ -461,7 +461,7 @@ class ClientMessageEventListener implements I2CPMessageReader.I2CPMessageEventLi } /** override for testing */ - protected void handleCreateLeaseSet(CreateLeaseSetMessage message) { + protected void handleCreateLeaseSet(CreateLeaseSetMessage message) { if ( (message.getLeaseSet() == null) || (message.getPrivateKey() == null) || (message.getSigningPrivateKey() == null) ) { if (_log.shouldLog(Log.ERROR)) _log.error("Null lease set granted: " + message); From 02c1417cc52f3f9aca799a1916d3cb0937c110d1 Mon Sep 17 00:00:00 2001 From: zzz Date: Sat, 31 Oct 2015 14:20:10 +0000 Subject: [PATCH 101/111] update ancient snark docs --- apps/i2psnark/COPYING | 341 +----------------- apps/i2psnark/TODO | 24 -- .../{authors.snark => authors-snark.txt} | 0 .../{changelog.snark => changelog-snark.txt} | 0 .../{readme.txt.snark => readme-snark.txt} | 0 apps/i2psnark/readme-standalone.txt | 10 +- apps/i2psnark/readme.txt | 16 +- 7 files changed, 12 insertions(+), 379 deletions(-) delete mode 100644 apps/i2psnark/TODO rename apps/i2psnark/{authors.snark => authors-snark.txt} (100%) rename apps/i2psnark/{changelog.snark => changelog-snark.txt} (100%) rename apps/i2psnark/{readme.txt.snark => readme-snark.txt} (100%) diff --git a/apps/i2psnark/COPYING b/apps/i2psnark/COPYING index d60c31a97..a0d98f2a6 100644 --- a/apps/i2psnark/COPYING +++ b/apps/i2psnark/COPYING @@ -1,340 +1 @@ - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc. - 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Library General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) year name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. - - , 1 April 1989 - Ty Coon, President of Vice - -This General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Library General -Public License instead of this License. +See ../../licenses/LICENSE-GPLv2.txt diff --git a/apps/i2psnark/TODO b/apps/i2psnark/TODO deleted file mode 100644 index 6f89c0f50..000000000 --- a/apps/i2psnark/TODO +++ /dev/null @@ -1,24 +0,0 @@ -- I2PSnark: - - add multitorrent support by checking the metainfo hash in the - PeerAcceptor and feeding it off to the appropriate coordinator - - add a web interface - -- BEncode - - Byte array length indicator can overflow. - - Support really big BigNums (only 256 chars allowed now) - - Better BEValue toString(). Uses stupid heuristic now for debugging. - - Implemented bencoding. - - Remove application level hack to calculate sha1 hash for metainfo - (But can it be done as efficiently?) - -- Storage - - Check file name filter. - -- TrackerClient - - Support undocumented &numwant= request. - -- PeerCoordinator - - Disconnect from other seeds as soon as you are a seed yourself. - -- Text UI - - Make it completely silent. diff --git a/apps/i2psnark/authors.snark b/apps/i2psnark/authors-snark.txt similarity index 100% rename from apps/i2psnark/authors.snark rename to apps/i2psnark/authors-snark.txt diff --git a/apps/i2psnark/changelog.snark b/apps/i2psnark/changelog-snark.txt similarity index 100% rename from apps/i2psnark/changelog.snark rename to apps/i2psnark/changelog-snark.txt diff --git a/apps/i2psnark/readme.txt.snark b/apps/i2psnark/readme-snark.txt similarity index 100% rename from apps/i2psnark/readme.txt.snark rename to apps/i2psnark/readme-snark.txt diff --git a/apps/i2psnark/readme-standalone.txt b/apps/i2psnark/readme-standalone.txt index 9bc1ddf66..ced04e941 100644 --- a/apps/i2psnark/readme-standalone.txt +++ b/apps/i2psnark/readme-standalone.txt @@ -1,6 +1,4 @@ -To run I2PSnark from the command line, run "java -jar lib/i2psnark.jar", but -to run it with the web UI, run "launch-i2psnark". I2PSnark is -GPL'ed software, based on Snark (http://www.klomp.org/) to run on top of I2P -(http://www.i2p2.de/) within a webserver (such as the bundled Jetty from -http://jetty.mortbay.org/). For more information about I2PSnark, get in touch -with the folks at http://forum.i2p2.de/ +i2psnark is packaged as a webapp running in the router console. +Command line and standalone operation of i2psnark are not currently supported. +See http://trac.i2p2.i2p/ticket/1191 or http://trac.i2p2.de/ticket/1191 +for the status of restoring standalone support. diff --git a/apps/i2psnark/readme.txt b/apps/i2psnark/readme.txt index 3970e3cba..2680442fa 100644 --- a/apps/i2psnark/readme.txt +++ b/apps/i2psnark/readme.txt @@ -1,11 +1,9 @@ -This is an I2P port of snark [http://klomp.org/snark], a GPL'ed bittorrent client +This is i2psnark, an I2P port of snark http://klomp.org/snark/ , a GPLv2 bittorrent client. +It contains significant enhancements including a web UI and support for +multitorrent, magnet, PEX and DHT. -The build in tracker has been removed for simplicity. +i2psnark is packaged as a webapp running in the router console. -Example usage: - java -jar lib/i2psnark.jar myFile.torrent - -or, a more verbose setting: - java -jar lib/i2psnark.jar --eepproxy 127.0.0.1 4444 \ - --i2cp 127.0.0.1 7654 "inbound.length=2 outbound.length=2" \ - --debug 6 myFile.torrent +See http://i2p-projekt.i2p/en/docs/applications/bittorrent +or https://geti2p.net/en/docs/applications/bittorrent +for the specification of the protocols for bittorrent over I2P. From c37cc7ad52c3da330249013e8687ea7bd6702a00 Mon Sep 17 00:00:00 2001 From: zzz Date: Sat, 31 Oct 2015 19:13:57 +0000 Subject: [PATCH 102/111] Convert remaining Threads to I2PThread or I2PAppThread --- apps/BOB/src/net/i2p/BOB/BOB.java | 2 +- apps/BOB/src/net/i2p/BOB/DoCMDS.java | 7 ++++--- apps/BOB/src/net/i2p/BOB/I2Plistener.java | 4 +++- apps/BOB/src/net/i2p/BOB/I2PtoTCP.java | 6 ++++-- apps/BOB/src/net/i2p/BOB/MUXlisten.java | 6 ++++-- apps/BOB/src/net/i2p/BOB/TCPlistener.java | 4 +++- apps/BOB/src/net/i2p/BOB/TCPtoI2P.java | 9 +++++---- apps/sam/java/src/net/i2p/sam/SAMv3StreamSession.java | 10 +++++----- core/java/src/net/i2p/util/I2PAppThread.java | 8 ++++++++ core/java/src/net/i2p/util/I2PThread.java | 8 ++++++++ router/java/src/net/i2p/router/Router.java | 4 ++-- .../src/net/i2p/router/peermanager/PeerManager.java | 2 +- router/java/src/net/i2p/router/transport/UPnP.java | 5 +++-- 13 files changed, 51 insertions(+), 24 deletions(-) diff --git a/apps/BOB/src/net/i2p/BOB/BOB.java b/apps/BOB/src/net/i2p/BOB/BOB.java index c4ef3b23a..e1106c9bb 100644 --- a/apps/BOB/src/net/i2p/BOB/BOB.java +++ b/apps/BOB/src/net/i2p/BOB/BOB.java @@ -338,7 +338,7 @@ public class BOB implements Runnable, ClientApp { if (g) { DoCMDS conn_c = new DoCMDS(spin, lock, server, props, database, _log); - Thread t = new Thread(conn_c); + Thread t = new I2PAppThread(conn_c); t.setName("BOB.DoCMDS " + i); t.start(); i++; diff --git a/apps/BOB/src/net/i2p/BOB/DoCMDS.java b/apps/BOB/src/net/i2p/BOB/DoCMDS.java index 957f0ea3f..7e5bd1014 100644 --- a/apps/BOB/src/net/i2p/BOB/DoCMDS.java +++ b/apps/BOB/src/net/i2p/BOB/DoCMDS.java @@ -25,12 +25,13 @@ import java.util.Locale; import java.util.Properties; import java.util.StringTokenizer; import java.util.concurrent.atomic.AtomicBoolean; + import net.i2p.I2PAppContext; import net.i2p.I2PException; import net.i2p.client.I2PClientFactory; -//import net.i2p.data.DataFormatException; import net.i2p.data.Destination; -//import net.i2p.i2ptunnel.I2PTunnel; +import net.i2p.util.I2PAppThread; + // needed only for debugging. // import java.util.logging.Level; // import java.util.logging.Logger; @@ -1307,7 +1308,7 @@ public class DoCMDS implements Runnable { // wait } tunnel = new MUXlisten(lock, database, nickinfo, _log); - Thread t = new Thread(tunnel); + Thread t = new I2PAppThread(tunnel); t.start(); // try { // Thread.sleep(1000 * 10); // Slow down the startup. diff --git a/apps/BOB/src/net/i2p/BOB/I2Plistener.java b/apps/BOB/src/net/i2p/BOB/I2Plistener.java index f862c7cae..ebe488860 100644 --- a/apps/BOB/src/net/i2p/BOB/I2Plistener.java +++ b/apps/BOB/src/net/i2p/BOB/I2Plistener.java @@ -18,10 +18,12 @@ package net.i2p.BOB; import java.net.ConnectException; import java.net.SocketTimeoutException; import java.util.concurrent.atomic.AtomicBoolean; + import net.i2p.I2PException; import net.i2p.client.streaming.I2PServerSocket; import net.i2p.client.streaming.I2PSocket; import net.i2p.client.streaming.I2PSocketManager; +import net.i2p.util.I2PAppThread; /** * Listen on I2P and connect to TCP @@ -77,7 +79,7 @@ public class I2Plistener implements Runnable { conn++; // toss the connection to a new thread. I2PtoTCP conn_c = new I2PtoTCP(sessSocket, info, database, lives); - Thread t = new Thread(conn_c, Thread.currentThread().getName() + " I2PtoTCP " + conn); + Thread t = new I2PAppThread(conn_c, Thread.currentThread().getName() + " I2PtoTCP " + conn); t.start(); } diff --git a/apps/BOB/src/net/i2p/BOB/I2PtoTCP.java b/apps/BOB/src/net/i2p/BOB/I2PtoTCP.java index bf699db60..8e1cebb73 100644 --- a/apps/BOB/src/net/i2p/BOB/I2PtoTCP.java +++ b/apps/BOB/src/net/i2p/BOB/I2PtoTCP.java @@ -19,7 +19,9 @@ import java.io.InputStream; import java.io.OutputStream; import java.net.Socket; import java.util.concurrent.atomic.AtomicBoolean; + import net.i2p.client.streaming.I2PSocket; +import net.i2p.util.I2PAppThread; /** * Process I2P->TCP @@ -111,8 +113,8 @@ public class I2PtoTCP implements Runnable { // setup to cross the streams TCPio conn_c = new TCPio(in, Iout, lives); // app -> I2P TCPio conn_a = new TCPio(Iin, out, lives); // I2P -> app - t = new Thread(conn_c, Thread.currentThread().getName() + " TCPioA"); - q = new Thread(conn_a, Thread.currentThread().getName() + " TCPioB"); + t = new I2PAppThread(conn_c, Thread.currentThread().getName() + " TCPioA"); + q = new I2PAppThread(conn_a, Thread.currentThread().getName() + " TCPioB"); // Fire! t.start(); q.start(); diff --git a/apps/BOB/src/net/i2p/BOB/MUXlisten.java b/apps/BOB/src/net/i2p/BOB/MUXlisten.java index f330be971..81dbe0845 100644 --- a/apps/BOB/src/net/i2p/BOB/MUXlisten.java +++ b/apps/BOB/src/net/i2p/BOB/MUXlisten.java @@ -21,11 +21,13 @@ import java.net.InetAddress; import java.net.ServerSocket; import java.util.Properties; import java.util.concurrent.atomic.AtomicBoolean; + import net.i2p.I2PException; import net.i2p.client.I2PClient; import net.i2p.client.streaming.I2PServerSocket; import net.i2p.client.streaming.I2PSocketManager; import net.i2p.client.streaming.I2PSocketManagerFactory; +import net.i2p.util.I2PAppThread; import net.i2p.util.Log; /** @@ -201,14 +203,14 @@ public class MUXlisten implements Runnable { // I2P -> TCP SS = socketManager.getServerSocket(); I2Plistener conn = new I2Plistener(SS, socketManager, info, database, _log, lives); - t = new Thread(tg, conn, "BOBI2Plistener " + N); + t = new I2PAppThread(tg, conn, "BOBI2Plistener " + N); t.start(); } if (come_in) { // TCP -> I2P TCPlistener conn = new TCPlistener(listener, socketManager, info, database, _log, lives); - q = new Thread(tg, conn, "BOBTCPlistener " + N); + q = new I2PAppThread(tg, conn, "BOBTCPlistener " + N); q.start(); } diff --git a/apps/BOB/src/net/i2p/BOB/TCPlistener.java b/apps/BOB/src/net/i2p/BOB/TCPlistener.java index 70ff52b14..2ad1b5af6 100644 --- a/apps/BOB/src/net/i2p/BOB/TCPlistener.java +++ b/apps/BOB/src/net/i2p/BOB/TCPlistener.java @@ -20,8 +20,10 @@ import java.net.ServerSocket; import java.net.Socket; import java.net.SocketTimeoutException; import java.util.concurrent.atomic.AtomicBoolean; + import net.i2p.client.streaming.I2PServerSocket; import net.i2p.client.streaming.I2PSocketManager; +import net.i2p.util.I2PAppThread; /** * Listen on TCP port and connect to I2P @@ -75,7 +77,7 @@ public class TCPlistener implements Runnable { conn++; // toss the connection to a new thread. TCPtoI2P conn_c = new TCPtoI2P(socketManager, server, info, database, lives); - Thread t = new Thread(conn_c, Thread.currentThread().getName() + " TCPtoI2P " + conn); + Thread t = new I2PAppThread(conn_c, Thread.currentThread().getName() + " TCPtoI2P " + conn); t.start(); g = false; } diff --git a/apps/BOB/src/net/i2p/BOB/TCPtoI2P.java b/apps/BOB/src/net/i2p/BOB/TCPtoI2P.java index 0ce587257..3f196af28 100644 --- a/apps/BOB/src/net/i2p/BOB/TCPtoI2P.java +++ b/apps/BOB/src/net/i2p/BOB/TCPtoI2P.java @@ -24,13 +24,14 @@ import java.net.NoRouteToHostException; import java.net.Socket; import java.util.Locale; import java.util.concurrent.atomic.AtomicBoolean; + +import net.i2p.I2PAppContext; import net.i2p.I2PException; import net.i2p.client.streaming.I2PSocket; import net.i2p.client.streaming.I2PSocketManager; import net.i2p.data.DataFormatException; import net.i2p.data.Destination; -//import net.i2p.i2ptunnel.I2PTunnel; -import net.i2p.I2PAppContext; +import net.i2p.util.I2PAppThread; /** * @@ -158,8 +159,8 @@ public class TCPtoI2P implements Runnable { // setup to cross the streams TCPio conn_c = new TCPio(in, Iout, lives); // app -> I2P TCPio conn_a = new TCPio(Iin, out, lives); // I2P -> app - t = new Thread(conn_c, Thread.currentThread().getName() + " TCPioA"); - q = new Thread(conn_a, Thread.currentThread().getName() + " TCPioB"); + t = new I2PAppThread(conn_c, Thread.currentThread().getName() + " TCPioA"); + q = new I2PAppThread(conn_a, Thread.currentThread().getName() + " TCPioB"); // Fire! t.start(); q.start(); diff --git a/apps/sam/java/src/net/i2p/sam/SAMv3StreamSession.java b/apps/sam/java/src/net/i2p/sam/SAMv3StreamSession.java index fe9561ced..7770d4075 100644 --- a/apps/sam/java/src/net/i2p/sam/SAMv3StreamSession.java +++ b/apps/sam/java/src/net/i2p/sam/SAMv3StreamSession.java @@ -119,10 +119,10 @@ class SAMv3StreamSession extends SAMStreamSession implements SAMv3Handler.Sessi WritableByteChannel toI2P = Channels.newChannel(i2ps.getOutputStream()); SAMBridge bridge = handler.getBridge(); - (new Thread(rec.getThreadGroup(), + (new I2PAppThread(rec.getThreadGroup(), new Pipe(fromClient, toI2P, bridge), "ConnectV3 SAMPipeClientToI2P")).start(); - (new Thread(rec.getThreadGroup(), + (new I2PAppThread(rec.getThreadGroup(), new Pipe(fromI2P, toClient, bridge), "ConnectV3 SAMPipeI2PToClient")).start(); } @@ -176,10 +176,10 @@ class SAMv3StreamSession extends SAMStreamSession implements SAMv3Handler.Sessi WritableByteChannel toI2P = Channels.newChannel(i2ps.getOutputStream()); SAMBridge bridge = handler.getBridge(); - (new Thread(rec.getThreadGroup(), + (new I2PAppThread(rec.getThreadGroup(), new Pipe(fromClient, toI2P, bridge), "AcceptV3 SAMPipeClientToI2P")).start(); - (new Thread(rec.getThreadGroup(), + (new I2PAppThread(rec.getThreadGroup(), new Pipe(fromI2P, toClient, bridge), "AcceptV3 SAMPipeI2PToClient")).start(); } @@ -219,7 +219,7 @@ class SAMv3StreamSession extends SAMStreamSession implements SAMv3Handler.Sessi } SocketForwarder forwarder = new SocketForwarder(host, port, this, verbose); - (new Thread(rec.getThreadGroup(), forwarder, "SAMV3StreamForwarder")).start(); + (new I2PAppThread(rec.getThreadGroup(), forwarder, "SAMV3StreamForwarder")).start(); } private static class SocketForwarder implements Runnable diff --git a/core/java/src/net/i2p/util/I2PAppThread.java b/core/java/src/net/i2p/util/I2PAppThread.java index da291d210..c3de5c87a 100644 --- a/core/java/src/net/i2p/util/I2PAppThread.java +++ b/core/java/src/net/i2p/util/I2PAppThread.java @@ -38,9 +38,17 @@ public class I2PAppThread extends I2PThread { public I2PAppThread(Runnable r, String name) { super(r, name); } + public I2PAppThread(Runnable r, String name, boolean isDaemon) { super(r, name, isDaemon); } + + /** + * @since 0.9.23 + */ + public I2PAppThread(ThreadGroup group, Runnable r, String name) { + super(group, r, name); + } @Override protected void fireOOM(OutOfMemoryError oom) { diff --git a/core/java/src/net/i2p/util/I2PThread.java b/core/java/src/net/i2p/util/I2PThread.java index 22611ee3f..97041f4ee 100644 --- a/core/java/src/net/i2p/util/I2PThread.java +++ b/core/java/src/net/i2p/util/I2PThread.java @@ -73,6 +73,14 @@ public class I2PThread extends Thread { // _createdBy = new Exception("Created by"); } + /** + * @since 0.9.23 + */ + public I2PThread(ThreadGroup group, Runnable r, String name) { + super(group, r, name); + setPriority(NORM_PRIORITY); + } + /**** private void log(int level, String msg) { log(level, msg, null); } diff --git a/router/java/src/net/i2p/router/Router.java b/router/java/src/net/i2p/router/Router.java index 260115d45..426da4a75 100644 --- a/router/java/src/net/i2p/router/Router.java +++ b/router/java/src/net/i2p/router/Router.java @@ -1141,7 +1141,7 @@ public class Router implements RouterClock.ClockShiftListener { _log.warn("Running shutdown task " + task.getClass()); try { //task.run(); - Thread t = new Thread(task, "Shutdown task " + task.getClass().getName()); + Thread t = new I2PAppThread(task, "Shutdown task " + task.getClass().getName()); t.setDaemon(true); t.start(); try { @@ -1454,7 +1454,7 @@ public class Router implements RouterClock.ClockShiftListener { ((RouterClock) _context.clock()).removeShiftListener(this); // Let's not stop accepting tunnels, etc //_started = _context.clock().now(); - Thread t = new Thread(new Restarter(_context), "Router Restart"); + Thread t = new I2PThread(new Restarter(_context), "Router Restart"); t.setPriority(Thread.NORM_PRIORITY + 1); t.start(); } diff --git a/router/java/src/net/i2p/router/peermanager/PeerManager.java b/router/java/src/net/i2p/router/peermanager/PeerManager.java index 8061a2517..b3cc3643b 100644 --- a/router/java/src/net/i2p/router/peermanager/PeerManager.java +++ b/router/java/src/net/i2p/router/peermanager/PeerManager.java @@ -165,7 +165,7 @@ class PeerManager { * @since 0.8.8 */ private void loadProfilesInBackground() { - (new Thread(new ProfileLoader())).start(); + (new I2PThread(new ProfileLoader())).start(); } /** diff --git a/router/java/src/net/i2p/router/transport/UPnP.java b/router/java/src/net/i2p/router/transport/UPnP.java index baec7ab62..26c7610b5 100644 --- a/router/java/src/net/i2p/router/transport/UPnP.java +++ b/router/java/src/net/i2p/router/transport/UPnP.java @@ -19,6 +19,7 @@ import java.util.concurrent.atomic.AtomicInteger; import net.i2p.I2PAppContext; import net.i2p.data.DataHelper; import net.i2p.util.Addresses; +import net.i2p.util.I2PThread; import net.i2p.util.Log; import net.i2p.util.Translate; @@ -994,7 +995,7 @@ class UPnP extends ControlPoint implements DeviceChangeListener, EventListener { } if (_log.shouldLog(Log.INFO)) _log.info("Starting thread to forward " + portsToForwardNow.size() + " ports"); - Thread t = new Thread(new RegisterPortsThread(portsToForwardNow)); + Thread t = new I2PThread(new RegisterPortsThread(portsToForwardNow)); t.setName("UPnP Port Opener " + __id.incrementAndGet()); t.setDaemon(true); t.start(); @@ -1034,7 +1035,7 @@ class UPnP extends ControlPoint implements DeviceChangeListener, EventListener { private void unregisterPorts(Set portsToForwardNow) { if (_log.shouldLog(Log.INFO)) _log.info("Starting thread to un-forward " + portsToForwardNow.size() + " ports"); - Thread t = new Thread(new UnregisterPortsThread(portsToForwardNow)); + Thread t = new I2PThread(new UnregisterPortsThread(portsToForwardNow)); t.setName("UPnP Port Closer " + __id.incrementAndGet()); t.setDaemon(true); t.start(); From 805979b987f3e530320e02e09ede14c80b19c61e Mon Sep 17 00:00:00 2001 From: zzz Date: Sat, 31 Oct 2015 22:58:51 +0000 Subject: [PATCH 103/111] UPnP: Fix deadlock in callbacks (ticket #1699) possibly more to do --- history.txt | 4 ++++ router/java/src/net/i2p/router/RouterVersion.java | 2 +- .../src/net/i2p/router/transport/UPnPManager.java | 12 ++++++++++++ .../net/i2p/router/transport/udp/UDPTransport.java | 2 ++ 4 files changed, 19 insertions(+), 1 deletion(-) diff --git a/history.txt b/history.txt index 229e72fdc..7ec5b7bcc 100644 --- a/history.txt +++ b/history.txt @@ -1,3 +1,7 @@ +2015-10-31 zzz + * Convert remaining Threads to I2PThread or I2PAppThread + * UPnP: Fix deadlock in callbacks (ticket #1699) + 2015-10-30 zzz * Router: Fix cascading I2CP error (ticket #1692) diff --git a/router/java/src/net/i2p/router/RouterVersion.java b/router/java/src/net/i2p/router/RouterVersion.java index f5c926454..43dca9240 100644 --- a/router/java/src/net/i2p/router/RouterVersion.java +++ b/router/java/src/net/i2p/router/RouterVersion.java @@ -18,7 +18,7 @@ public class RouterVersion { /** deprecated */ public final static String ID = "Monotone"; public final static String VERSION = CoreVersion.VERSION; - public final static long BUILD = 20; + public final static long BUILD = 21; /** for example "-test" */ public final static String EXTRA = ""; diff --git a/router/java/src/net/i2p/router/transport/UPnPManager.java b/router/java/src/net/i2p/router/transport/UPnPManager.java index 370ba813e..9d7a6918a 100644 --- a/router/java/src/net/i2p/router/transport/UPnPManager.java +++ b/router/java/src/net/i2p/router/transport/UPnPManager.java @@ -233,7 +233,17 @@ class UPnPManager { public void portForwardStatus(Map statuses) { if (_log.shouldLog(Log.DEBUG)) _log.debug("UPnP Callback:"); + // Let's not have two of these running at once. + // Deadlock reported in ticket #1699 + // and the locking isn't foolproof in UDPTransport. + // UPnP runs the callbacks in a thread, so we can block. + // There is only one UPnPCallback, so lock on this + synchronized(this) { + locked_PFS(statuses); + } + } + private void locked_PFS(Map statuses) { byte[] ipaddr = null; DetectedIP[] ips = _upnp.getAddress(); if (ips != null) { @@ -244,6 +254,7 @@ class UPnPManager { _log.debug("External address: " + ip.publicAddress + " type: " + ip.natType); if (!ip.publicAddress.equals(_detectedAddress)) { _detectedAddress = ip.publicAddress; + // deadlock path 1 _manager.externalAddressReceived(SOURCE_UPNP, _detectedAddress.getAddress(), 0); } ipaddr = ip.publicAddress.getAddress(); @@ -269,6 +280,7 @@ class UPnPManager { else continue; boolean success = fps.status >= ForwardPortStatus.MAYBE_SUCCESS; + // deadlock path 2 _manager.forwardPortStatus(style, ipaddr, fp.portNumber, fps.externalPort, success, fps.reasonString); } } diff --git a/router/java/src/net/i2p/router/transport/udp/UDPTransport.java b/router/java/src/net/i2p/router/transport/udp/UDPTransport.java index 223f655f5..edcfef26b 100644 --- a/router/java/src/net/i2p/router/transport/udp/UDPTransport.java +++ b/router/java/src/net/i2p/router/transport/udp/UDPTransport.java @@ -993,6 +993,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority // save PROP_EXTERNAL_PORT _context.router().saveConfig(changes, null); } + // deadlock thru here ticket #1699 _context.router().rebuildRouterInfo(); } _testEvent.forceRunImmediately(); @@ -2115,6 +2116,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority * @since 0.9.18 */ private RouterAddress getCurrentExternalAddress(boolean isIPv6) { + // deadlock thru here ticket #1699 synchronized (_rebuildLock) { return isIPv6 ? _currentOurV6Address : _currentOurV4Address; } From b7dc55e326af0771405ed93fd566151f8c515b04 Mon Sep 17 00:00:00 2001 From: zzz Date: Sun, 1 Nov 2015 00:45:30 +0000 Subject: [PATCH 104/111] checklist update --- installer/resources/checklist.txt | 49 +++++++++++++++++++++---------- 1 file changed, 34 insertions(+), 15 deletions(-) diff --git a/installer/resources/checklist.txt b/installer/resources/checklist.txt index 4533e363b..b12e50e97 100644 --- a/installer/resources/checklist.txt +++ b/installer/resources/checklist.txt @@ -17,9 +17,20 @@ Write the release announcement and push to Transifex: Ensure all translation updates are imported from Transifex Sync with mtn.i2p2.i2p -Start with a clean checkout mtn -d i2p.mtn co --branch=i2p.i2p -Copy over override.properties to set build.built-by -Double-check trust list +Start with a clean checkout mtn -d i2p.mtn co --branch=i2p.i2p /path/to/releasedir +You may build with Java 7 or higher, but ensure you have the Java 6 JRE installed for the bootclasspath + +Create override.properties with (adjust as necessary): +----------- +release.privkey=/path/to/private-signing.key +release.privkey.su3=/path/to/su3keystore.ks +release.gpg.keyid=0xnnnnnnnn +release.signer.su3=xxx@mail.i2p +build.built-by=xxx +javac.compilerargs=-bootclasspath /usr/lib/jvm/java-6-openjdk-amd64/jre/lib/rt.jar:/usr/lib/jvm/java-6-openjdk-amd64/jre/lib/jce.jar +----------- + +Copy latest trust list _MTN/monotonerc from website or some other workspace Change revision in: history.txt @@ -28,6 +39,8 @@ Change revision in: router/java/src/net/i2p/router/RouterVersion.java (change to BUILD = 0 and EXTRA = "") +mtn ci + Review the complete diff from the last release: mtn diff -r t:i2p-0.9.(xx-1) > out.diff vi out.diff @@ -41,10 +54,6 @@ NOTE: These tasks are now automated by 'ant release' Build and tag: ant pkg - mtn ci - mtn tag h: i2p-0.x.xx - mtn cert t:i2p-0.x.xx branch i2p.i2p.release - Sync with mtn.i2p2.i2p Create signed update files with: export I2P=~/i2p @@ -80,17 +89,30 @@ Generate PGP signatures: (end of tasks automated by 'ant release') ========================================= +Now test. +If all goes well: + mtn tag h: i2p-0.x.xx + mtn cert t:i2p-0.x.xx branch i2p.i2p.release + mtn sync (with e.g. mtn.killyourtv.i2p) + Add magnet links, change release dates and release number in to old-format news.xml, and distribute to news hosts In the i2p.newsxml branch, edit magnet links, release dates and release number in data/releases.json, and check in -Seed update torrents (su2 and su3) +Add update torrents to tracker2.postman.i2p and start seeding (su2 and su3) Notify the following people: All in-network update hosts PPA maintainer news.xml maintainer backup news.xml maintainer + website files maintainer + +Update Trac: + Add milestone and version dates + Increment milestone and version defaults + +Wait for website files to be updated Website files to change: Sync with mtn.i2p-projekt.i2p @@ -101,14 +123,11 @@ Website files to change: New release announcement - see i2p2www/blog/README for instructions Sync with mtn.i2p-projekt.i2p +Wait for a few update hosts to be ready +Tell news hosts to flip the switch +Wait for debian packages to be ready + Announce on: #i2p, #i2p-dev (also on freenode side) forum.i2p twitter - freshmeat.net - launchpad.net - alt.privacy.anon-server - -Update Trac: - Add milestone and version dates - Increment milestone and version defaults From bbb6da2ac66f9d68538d6975cd5d5f2af50527d6 Mon Sep 17 00:00:00 2001 From: zzz Date: Sun, 1 Nov 2015 16:47:59 +0000 Subject: [PATCH 105/111] cleanups, javadoc --- core/java/src/net/i2p/util/I2PAppThread.java | 5 +- core/java/src/net/i2p/util/I2PThread.java | 71 +++++--------------- 2 files changed, 19 insertions(+), 57 deletions(-) diff --git a/core/java/src/net/i2p/util/I2PAppThread.java b/core/java/src/net/i2p/util/I2PAppThread.java index c3de5c87a..ebbe6c06e 100644 --- a/core/java/src/net/i2p/util/I2PAppThread.java +++ b/core/java/src/net/i2p/util/I2PAppThread.java @@ -14,10 +14,13 @@ import java.util.Set; import java.util.concurrent.CopyOnWriteArraySet; /** - * Like I2PThread but with per-thread OOM listeners, + * Like {@link I2PThread} but with per-thread OOM listeners, * rather than a static router-wide listener list, * so that an OOM in an app won't call the router listener * to shutdown the whole router. + * + * This is preferred for application use. + * See {@link I2PThread} for features. */ public class I2PAppThread extends I2PThread { diff --git a/core/java/src/net/i2p/util/I2PThread.java b/core/java/src/net/i2p/util/I2PThread.java index 97041f4ee..2b4c2a81e 100644 --- a/core/java/src/net/i2p/util/I2PThread.java +++ b/core/java/src/net/i2p/util/I2PThread.java @@ -14,63 +14,53 @@ import java.util.Set; import java.util.concurrent.CopyOnWriteArraySet; /** - * In case its useful later... - * (e.g. w/ native programatic thread dumping, etc) - * - * As of 0.9.21, I2PThreads are initialized to NORM_PRIORITY - * (not the priority of the creating thread). + * Preferred over {@link Thread} for all router uses. + * For applications, {@link I2PAppThread} is preferred. + *

                                    + * Provides the following features: + *

                                      + *
                                    • Logging to wrapper log on unexpected termination in {@link #run()}. + *
                                    • Notification of OOM to registered listener (the router), + * which will cause logging to the wrapper log and a router restart + *
                                    • Catching and logging "OOM" caused by thread limit in {@link #start()} + * with distint message, and does not call the OOM listener. + *
                                    • As of 0.9.21, initialization to NORM_PRIORITY + * (not the priority of the creating thread). + *
                                    */ public class I2PThread extends Thread { - /** - * Non-static to avoid refs to old context in Android. - * Probably should just remove all the logging though. - * Logging removed, too much trouble with extra contexts - */ - //private volatile Log _log; + private static final Set _listeners = new CopyOnWriteArraySet(); - //private String _name; - //private Exception _createdBy; public I2PThread() { super(); setPriority(NORM_PRIORITY); - //if ( (_log == null) || (_log.shouldLog(Log.DEBUG)) ) - // _createdBy = new Exception("Created by"); } public I2PThread(String name) { super(name); setPriority(NORM_PRIORITY); - //if ( (_log == null) || (_log.shouldLog(Log.DEBUG)) ) - // _createdBy = new Exception("Created by"); } public I2PThread(Runnable r) { super(r); setPriority(NORM_PRIORITY); - //if ( (_log == null) || (_log.shouldLog(Log.DEBUG)) ) - // _createdBy = new Exception("Created by"); } public I2PThread(Runnable r, String name) { super(r, name); setPriority(NORM_PRIORITY); - //if ( (_log == null) || (_log.shouldLog(Log.DEBUG)) ) - // _createdBy = new Exception("Created by"); } + public I2PThread(Runnable r, String name, boolean isDaemon) { super(r, name); setDaemon(isDaemon); setPriority(NORM_PRIORITY); - //if ( (_log == null) || (_log.shouldLog(Log.DEBUG)) ) - // _createdBy = new Exception("Created by"); } public I2PThread(ThreadGroup g, Runnable r) { super(g, r); setPriority(NORM_PRIORITY); - //if ( (_log == null) || (_log.shouldLog(Log.DEBUG)) ) - // _createdBy = new Exception("Created by"); } /** @@ -81,17 +71,6 @@ public class I2PThread extends Thread { setPriority(NORM_PRIORITY); } -/**** - private void log(int level, String msg) { log(level, msg, null); } - - private void log(int level, String msg, Throwable t) { - // we cant assume log is created - if (_log == null) _log = new Log(I2PThread.class); - if (_log.shouldLog(level)) - _log.log(level, msg, t); - } -****/ - /** * Overridden to provide useful info to users on OOM, and to prevent * shutting down the whole JVM for what is most likely not a heap issue. @@ -117,19 +96,9 @@ public class I2PThread extends Thread { @Override public void run() { - //_name = Thread.currentThread().getName(); - //log(Log.INFO, "New thread started" + (isDaemon() ? " (daemon): " : ": ") + _name, _createdBy); try { super.run(); } catch (Throwable t) { - /**** - try { - log(Log.CRIT, "Thread terminated unexpectedly: " + getName(), t); - } catch (Throwable woof) { - System.err.println("Died within the OOM itself"); - t.printStackTrace(); - } - ****/ if (t instanceof OutOfMemoryError) { fireOOM((OutOfMemoryError)t); } else { @@ -137,18 +106,8 @@ public class I2PThread extends Thread { t.printStackTrace(); } } - // This creates a new I2PAppContext after it was deleted - // in Router.finalShutdown() via RouterContext.killGlobalContext() - //log(Log.INFO, "Thread finished normally: " + _name); } -/**** - protected void finalize() throws Throwable { - //log(Log.DEBUG, "Thread finalized: " + _name); - super.finalize(); - } -****/ - protected void fireOOM(OutOfMemoryError oom) { for (OOMEventListener listener : _listeners) listener.outOfMemory(oom); From 787921aa897fb79f69939f21c164947c247811f5 Mon Sep 17 00:00:00 2001 From: zzz Date: Sun, 1 Nov 2015 17:29:20 +0000 Subject: [PATCH 106/111] spelling --- core/java/src/net/i2p/util/I2PThread.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/java/src/net/i2p/util/I2PThread.java b/core/java/src/net/i2p/util/I2PThread.java index 2b4c2a81e..3c08e3639 100644 --- a/core/java/src/net/i2p/util/I2PThread.java +++ b/core/java/src/net/i2p/util/I2PThread.java @@ -23,7 +23,7 @@ import java.util.concurrent.CopyOnWriteArraySet; *
                                  • Notification of OOM to registered listener (the router), * which will cause logging to the wrapper log and a router restart *
                                  • Catching and logging "OOM" caused by thread limit in {@link #start()} - * with distint message, and does not call the OOM listener. + * with distinct message, and does not call the OOM listener. *
                                  • As of 0.9.21, initialization to NORM_PRIORITY * (not the priority of the creating thread). * From a3a092a4543359fe4c35f2cdd4c266afa3d2ad84 Mon Sep 17 00:00:00 2001 From: zzz Date: Sun, 1 Nov 2015 19:31:22 +0000 Subject: [PATCH 107/111] Utils: Double IP lookup cache size (ticket #1700) --- core/java/src/net/i2p/util/Addresses.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core/java/src/net/i2p/util/Addresses.java b/core/java/src/net/i2p/util/Addresses.java index b33839b48..e4a78cc37 100644 --- a/core/java/src/net/i2p/util/Addresses.java +++ b/core/java/src/net/i2p/util/Addresses.java @@ -231,10 +231,10 @@ public abstract class Addresses { I2PAppContext ctx = I2PAppContext.getCurrentContext(); if (ctx != null && ctx.isRouterContext()) { long maxMemory = SystemVersion.getMaxMemory(); - long min = 128; + long min = 256; long max = 4096; - // 512 nominal for 128 MB - size = (int) Math.max(min, Math.min(max, 1 + (maxMemory / (256*1024)))); + // 1024 nominal for 128 MB + size = (int) Math.max(min, Math.min(max, 1 + (maxMemory / (128*1024)))); } else { size = 32; } From 39d749ba16109a1f4435877c894f6d8c123e1636 Mon Sep 17 00:00:00 2001 From: z3r0fox Date: Mon, 2 Nov 2015 17:27:04 +0000 Subject: [PATCH 108/111] Fixed generation of eepget target filenames for basic page URLs, URLs with query parameters, certain edge cases. --- core/java/src/net/i2p/util/EepGet.java | 60 ++++++++++++++++++++------ 1 file changed, 46 insertions(+), 14 deletions(-) diff --git a/core/java/src/net/i2p/util/EepGet.java b/core/java/src/net/i2p/util/EepGet.java index c31184dbd..8c7561a12 100644 --- a/core/java/src/net/i2p/util/EepGet.java +++ b/core/java/src/net/i2p/util/EepGet.java @@ -24,6 +24,8 @@ import java.util.HashMap; import java.util.List; import java.util.Locale; import java.util.Map; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import gnu.getopt.Getopt; @@ -312,22 +314,52 @@ public class EepGet { System.exit(1); } + /** + * Parse URL for a viable filename. + * + * @param url a URL giving the location of an online resource + * @return a filename to save the resource as on local filesystem + */ public static String suggestName(String url) { - int last = url.lastIndexOf('/'); - if ((last < 0) || (url.lastIndexOf('#') > last)) - last = url.lastIndexOf('#'); - if ((last < 0) || (url.lastIndexOf('?') > last)) - last = url.lastIndexOf('?'); - if ((last < 0) || (url.lastIndexOf('=') > last)) - last = url.lastIndexOf('='); + URL nameURL = null; // URL object + String name; // suggested name - String name = null; - if (last >= 0) - name = sanitize(url.substring(last+1)); - if ( (name != null) && (name.length() > 0) ) - return name; - else - return sanitize(url); + try { + nameURL = new URL(url); + } catch (MalformedURLException e) { + System.err.println("Please enter a properly formed URL."); + System.exit(1); + } + + String path = nameURL.getPath(); // discard any URI queries + + // if no file specified, eepget scrapes webpage - use domain as name + Pattern slashes = Pattern.compile("/+"); + Matcher matcher = slashes.matcher(path); + // if empty path or just /'s - nameURL lets multiple /'s through + if (path.equals("") || matcher.matches()) { + name = sanitize(nameURL.getAuthority()); + // if path specified + } else { + int last = path.lastIndexOf('/'); + // if last / not at end of string, use following string as filename + if (last != path.length() - 1) { + name = sanitize(path.substring(last + 1)); + // if there's a trailing / group look for previous / as trim point + } else { + int i = 1; + int slash; + while (true) { + slash = path.lastIndexOf('/', last - i); + if (slash != last - i) { + break; + } + i += 1; + } + name = sanitize(path.substring(slash + 1, path.length() - i)); + } + } + return name; } From b15ea8ba2facabc27606c78a3c6df43fc7990e49 Mon Sep 17 00:00:00 2001 From: zzz Date: Wed, 4 Nov 2015 14:57:07 +0000 Subject: [PATCH 109/111] Timers: Improve OutboundMessageRegistry locking SimpleTimer2 cleanups possible fix for ticket #1694 --- core/java/src/net/i2p/util/SimpleTimer2.java | 18 +++++++++++------- .../transport/OutboundMessageRegistry.java | 10 ++++++---- 2 files changed, 17 insertions(+), 11 deletions(-) diff --git a/core/java/src/net/i2p/util/SimpleTimer2.java b/core/java/src/net/i2p/util/SimpleTimer2.java index 4cfab3a0a..e8dcc2fcb 100644 --- a/core/java/src/net/i2p/util/SimpleTimer2.java +++ b/core/java/src/net/i2p/util/SimpleTimer2.java @@ -416,13 +416,15 @@ public class SimpleTimer2 { case IDLE: // fall through case RUNNING: throw new IllegalStateException(this + " not possible to be in " + _state); - case SCHEDULED: // proceed, switch to IDLE in case I need to reschedule - _state = TimedEventState.IDLE; + case SCHEDULED: + // proceed, will switch to IDLE to reschedule } // if I was rescheduled by the user, re-submit myself to the executor. - int difference = (int)(_nextRun - before); // careful with long uptimes + long difference = _nextRun - before; // careful with long uptimes if (difference > _fuzz) { + // proceed, switch to IDLE to reschedule + _state = TimedEventState.IDLE; schedule(difference); return; } @@ -437,10 +439,12 @@ public class SimpleTimer2 { else if (_log.shouldLog(Log.WARN)) _log.warn(_pool + " no _future " + this); // This can be an incorrect warning especially after a schedule(0) - if (_log.shouldLog(Log.WARN) && delay > 100) - _log.warn(_pool + " early execution " + delay + ": " + this); - else if (_log.shouldLog(Log.WARN) && delay < -1000) - _log.warn(" late execution " + (0 - delay) + ": " + this + _pool.debug()); + if (_log.shouldWarn()) { + if (delay > 100) + _log.warn(_pool + " early execution " + delay + ": " + this); + else if (delay < -1000) + _log.warn(" late execution " + (0 - delay) + ": " + this + _pool.debug()); + } try { timeReached(); } catch (Throwable t) { diff --git a/router/java/src/net/i2p/router/transport/OutboundMessageRegistry.java b/router/java/src/net/i2p/router/transport/OutboundMessageRegistry.java index 7c8e1b37d..9c04f52b6 100644 --- a/router/java/src/net/i2p/router/transport/OutboundMessageRegistry.java +++ b/router/java/src/net/i2p/router/transport/OutboundMessageRegistry.java @@ -330,12 +330,14 @@ public class OutboundMessageRegistry { if (r > 0 || e > 0 || a > 0) _log.debug("Expired: " + e + " remaining: " + r + " active: " + a); } - if (_nextExpire <= now) - _nextExpire = now + 10*1000; - schedule(_nextExpire - now); + synchronized(this) { + if (_nextExpire <= now) + _nextExpire = now + 10*1000; + schedule(_nextExpire - now); + } } - public void scheduleExpiration(MessageSelector sel) { + public synchronized void scheduleExpiration(MessageSelector sel) { long now = _context.clock().now(); if ( (_nextExpire <= now) || (sel.getExpiration() < _nextExpire) ) { _nextExpire = sel.getExpiration(); From f8830a759effec16a6cfe12513e405da3b2ad3da Mon Sep 17 00:00:00 2001 From: zzz Date: Wed, 4 Nov 2015 15:01:56 +0000 Subject: [PATCH 110/111] Threads: More conversions to I2PAppThread --- .../java/src/net/i2p/addressbook/DaemonThread.java | 3 ++- apps/jetty/java/src/net/i2p/jetty/JettyStart.java | 5 +++-- core/java/src/net/i2p/util/LogManager.java | 2 +- core/java/src/net/i2p/util/ShellCommand.java | 8 ++++---- 4 files changed, 10 insertions(+), 8 deletions(-) diff --git a/apps/addressbook/java/src/net/i2p/addressbook/DaemonThread.java b/apps/addressbook/java/src/net/i2p/addressbook/DaemonThread.java index fe74c7a83..b0689a208 100644 --- a/apps/addressbook/java/src/net/i2p/addressbook/DaemonThread.java +++ b/apps/addressbook/java/src/net/i2p/addressbook/DaemonThread.java @@ -25,6 +25,7 @@ import java.util.Properties; import net.i2p.I2PAppContext; import net.i2p.client.naming.NamingServiceUpdater; +import net.i2p.util.I2PAppThread; /** * A thread that waits five minutes, then runs the addressbook daemon. @@ -32,7 +33,7 @@ import net.i2p.client.naming.NamingServiceUpdater; * @author Ragnarok * */ -public class DaemonThread extends Thread implements NamingServiceUpdater { +public class DaemonThread extends I2PAppThread implements NamingServiceUpdater { private String[] args; diff --git a/apps/jetty/java/src/net/i2p/jetty/JettyStart.java b/apps/jetty/java/src/net/i2p/jetty/JettyStart.java index c5f9e2aaf..79fec449c 100644 --- a/apps/jetty/java/src/net/i2p/jetty/JettyStart.java +++ b/apps/jetty/java/src/net/i2p/jetty/JettyStart.java @@ -26,6 +26,7 @@ import java.util.Properties; import net.i2p.I2PAppContext; import net.i2p.app.*; import static net.i2p.app.ClientAppState.*; +import net.i2p.util.I2PAppThread; import net.i2p.util.PortMapper; import org.eclipse.jetty.server.Connector; @@ -109,7 +110,7 @@ public class JettyStart implements ClientApp { } } - private class Starter extends Thread { + private class Starter extends I2PAppThread { public Starter() { super("JettyStarter"); changeState(STARTING); @@ -161,7 +162,7 @@ public class JettyStart implements ClientApp { } } - private class Stopper extends Thread { + private class Stopper extends I2PAppThread { public Stopper() { super("JettyStopper"); changeState(STOPPING); diff --git a/core/java/src/net/i2p/util/LogManager.java b/core/java/src/net/i2p/util/LogManager.java index f2df0a881..ca2476de8 100644 --- a/core/java/src/net/i2p/util/LogManager.java +++ b/core/java/src/net/i2p/util/LogManager.java @@ -763,7 +763,7 @@ public class LogManager implements Flushable { private static final AtomicInteger __id = new AtomicInteger(); - private class ShutdownHook extends Thread { + private class ShutdownHook extends I2PAppThread { private final int _id; public ShutdownHook() { _id = __id.incrementAndGet(); diff --git a/core/java/src/net/i2p/util/ShellCommand.java b/core/java/src/net/i2p/util/ShellCommand.java index 70de62ea8..955830fe1 100644 --- a/core/java/src/net/i2p/util/ShellCommand.java +++ b/core/java/src/net/i2p/util/ShellCommand.java @@ -51,7 +51,7 @@ public class ShellCommand { * * @author hypercubus */ - private class CommandThread extends Thread { + private class CommandThread extends I2PAppThread { private final boolean consumeOutput; private final Object shellCommand; private final Result result; @@ -84,7 +84,7 @@ public class ShellCommand { * * @author hypercubus */ - private static class StreamConsumer extends Thread { + private static class StreamConsumer extends I2PAppThread { private final BufferedReader bufferedReader; public StreamConsumer(InputStream inputStream) { @@ -115,7 +115,7 @@ public class ShellCommand { * * @author hypercubus */ - private static class StreamReader extends Thread { + private static class StreamReader extends I2PAppThread { private final BufferedReader bufferedReader; public StreamReader(InputStream inputStream) { @@ -149,7 +149,7 @@ public class ShellCommand { * * @author hypercubus */ - private static class StreamWriter extends Thread { + private static class StreamWriter extends I2PAppThread { private final BufferedWriter bufferedWriter; public StreamWriter(OutputStream outputStream) { From 3e25ff251bde77fad346f17054a722ae98802551 Mon Sep 17 00:00:00 2001 From: zzz Date: Wed, 4 Nov 2015 15:08:44 +0000 Subject: [PATCH 111/111] Console: Add new home page links as approved at meeting exchanged.i2p icon license: WTFPL i2pwiki.i2p and lenta.i2p: Awaiting icons that meet our requirements --- .../java/src/net/i2p/router/web/HomeHelper.java | 9 ++++++++- history.txt | 10 ++++++++++ installer/resources/hosts.txt | 3 +++ .../themes/console/images/exchanged.png | Bin 0 -> 4761 bytes .../java/src/net/i2p/router/RouterVersion.java | 2 +- 5 files changed, 22 insertions(+), 2 deletions(-) create mode 100644 installer/resources/themes/console/images/exchanged.png diff --git a/apps/routerconsole/java/src/net/i2p/router/web/HomeHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/HomeHelper.java index d9a8de301..104c84be5 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/HomeHelper.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/HomeHelper.java @@ -25,6 +25,7 @@ public class HomeHelper extends HelperBase { static final String PROP_OLDHOME = "routerconsole.oldHomePage"; private static final String PROP_SEARCH = "routerconsole.showSearch"; + // No commas allowed in text strings! static final String DEFAULT_SERVICES = _x("Addressbook") + S + _x("Manage your I2P hosts file here (I2P domain name resolution)") + S + "/dns" + S + I + "book_addresses.png" + S + _x("Configure Bandwidth") + S + _x("I2P Bandwidth Configuration") + S + "/config" + S + I + "action_log.png" + S + @@ -37,6 +38,7 @@ public class HomeHelper extends HelperBase { _x("Website") + S + _x("Local web server") + S + "http://127.0.0.1:7658/" + S + I + "server_32x32.png" + S + ""; + // No commas allowed in text strings! static final String DEFAULT_FAVORITES = "anoncoin.i2p" + S + _x("The Anoncoin project") + S + "http://anoncoin.i2p/" + S + I + "anoncoin_32.png" + S + _x("Bug Reports") + S + _x("Bug tracker") + S + "http://trac.i2p2.i2p/report/1" + S + I + "bug.png" + S + @@ -44,10 +46,13 @@ public class HomeHelper extends HelperBase { _x("Dev Forum") + S + _x("Development forum") + S + "http://zzz.i2p/" + S + I + "group_gear.png" + S + _x("diftracker") + S + _x("Bittorrent tracker") + S + "http://diftracker.i2p/" + S + I + "magnet.png" + S + "echelon.i2p" + S + _x("I2P Applications") + S + "http://echelon.i2p/" + S + I + "box_open.png" + S + + "exchanged.i2p" + S + _x("Anonymous cryptocurrency exchange") + S + "http://exchanged.i2p/" + S + I + "exchanged.png" + S + _x("FAQ") + S + _x("Frequently Asked Questions") + S + "http://i2p-projekt.i2p/faq" + S + I + "question.png" + S + _x("Forum") + S + _x("Community forum") + S + "http://forum.i2p/" + S + I + "group.png" + S + _x("Anonymous Git Hosting") + S + _x("A public anonymous Git hosting site - supports pulling via Git and HTTP and pushing via SSH") + S + "http://git.repo.i2p/" + S + I + "git-logo.png" + S + "hiddengate.i2p" + S + _x("HiddenGate") + S + "http://hiddengate.i2p/" + S + I + "hglogo32.png" + S + + // FIXME ********** + _x("I2P Wiki") + S + _x("Anonymous wiki - share the knowledge") + S + "http://i2pwiki.i2p/" + S + I + "errortriangle.png" + S + "Ident " + _x("Microblog") + S + _x("Your premier microblogging service on I2P") + S + "http://id3nt.i2p/" + S + I + "ident_icon_blue.png" + S + _x("Javadocs") + S + _x("Technical documentation") + S + "http://i2p-javadocs.i2p/" + S + I + "education.png" + S + //"jisko.i2p" + S + _x("Simple and fast microblogging website") + S + "http://jisko.i2p/" + S + I + "jisko_console_icon.png" + S + @@ -55,10 +60,12 @@ public class HomeHelper extends HelperBase { "killyourtv.i2p" + S + _x("Debian and Tahoe-LAFS repositories") + S + "http://killyourtv.i2p/" + S + I + "television_delete.png" + S + _x("Free Web Hosting") + S + _x("Free eepsite hosting with PHP and MySQL") + S + "http://open4you.i2p/" + S + I + "open4you-logo.png" + S + _x("Pastebin") + S + _x("I2P Pastebin") + S + "http://pastethis.i2p/" + S + I + "paste_plain.png" + S + - "Planet I2P" + S + _x("I2P News") + S + "http://planet.i2p/" + S + I + "world.png" + S + + _x("Planet I2P") + S + _x("I2P News") + S + "http://planet.i2p/" + S + I + "world.png" + S + _x("Plugins") + S + _x("Add-on directory") + S + "http://plugins.i2p/" + S + I + "plugin.png" + S + _x("Postman's Tracker") + S + _x("Bittorrent tracker") + S + "http://tracker2.postman.i2p/" + S + I + "magnet.png" + S + _x("Project Website") + S + _x("I2P home page") + S + "http://i2p-projekt.i2p/" + S + I + "info_rhombus.png" + S + + // FIXME ********** + _x("Russian News Feed") + S + "lenta.i2p" + S + "http://lenta.i2p/" + S + I + "errortriangle.png" + S + //"Salt" + S + "salt.i2p" + S + "http://salt.i2p/" + S + I + "salt_console.png" + S + "stats.i2p" + S + _x("I2P Network Statistics") + S + "http://stats.i2p/cgi-bin/dashboard.cgi" + S + I + "chart_line.png" + S + _x("Technical Docs") + S + _x("Technical documentation") + S + "http://i2p-projekt.i2p/how" + S + I + "education.png" + S + diff --git a/history.txt b/history.txt index 7ec5b7bcc..9d421fc45 100644 --- a/history.txt +++ b/history.txt @@ -1,3 +1,13 @@ +2015-11-04 zzz + * Threads: More conversions to I2PAppThread + * Timers: Improve OutboundMessageRegistry locking (ticket #1694) + +2015-11-02 z3r0fox + * EepGet: Fix command line filename selection (ticket #1616) + +2015-11-01 zzz + * Utils: Double IP lookup cache size (ticket #1700) + 2015-10-31 zzz * Convert remaining Threads to I2PThread or I2PAppThread * UPnP: Fix deadlock in callbacks (ticket #1699) diff --git a/installer/resources/hosts.txt b/installer/resources/hosts.txt index bc698afe9..34987b08f 100644 --- a/installer/resources/hosts.txt +++ b/installer/resources/hosts.txt @@ -361,3 +361,6 @@ mtn.i2p-projekt.i2p=I6Ha4I7rgR0JyExQnN~4sZz5CfRqdN7o-2t1i2YOExd2CxC4MHHz3nJ5KgBI tracker.thebland.i2p=gzBtMSRcMD6b36PmPCQWZhh30fYm2Ww2r4tRSref4N2T4~cnXK3DjJOuJwao2jRK4bZwX2Rkyjw849xrFMqaR3SdPe3-K61B~Kr9Uo1KLdm3~oahOWFmCaIlipPs-i3jdTT~721YUcYB09n4PGrDq5KZSOOBlLZKulJficO58QRUlDpva4OCCRrX9EUCoAavOciKpvKtnGwl6AiPFu8WnmEeGQ861vjdirjfkHWNp3gj9IjGuxJNcgyHi51BWYZM6il~LJTcbA4zuZn~qudHIx9uzUtO-t08yzSRrmfVwVVVru6-~BBX0ipADi9UGZjyB-PJEKKjizUPxSp2OCmiOlQ2iXpKs2j8yfjHJbn-eWKpIh4jfpNigy6AbDfzFivkvm8lt8CleYf-p3~SHdqIL0iEaacxi5BAU4Baj5yS818kPQP4hEEMMtq4WnKjl4IW64swXSg1wlVBTiKDJzzQGK20jySBuPxhEbd6sfAeirzn585g5EqeV8DLqsMfe5pZBQAEAAEAAA== opentracker.dg2.i2p=WSUjGXhqHr7TsBizCO0qV~Kk7G1-suPPSSyMs4AnLQ8wRlWWZ~9rl7AzS0tFG4Dbbl8Te0wtZmQeMhcartbJ3TY-TBnviFqA8zP-sEQf5UK0BA5zzrtpB7NnUo-65B61cVbqG51-p9cJZ~Crre0LEZm5bJs8P3J~oH3b3BJ0YXtuv0ccBgj~OAf1g8ZrHr431XLq8WPRkzAVEIDhFdiSCYAz8XTArNN7OnPUUCjZcw92Oqf9wajg0eXqnThDFbrCx54h0UKM7sVDqRnoXbuGVLTPVvmIOnwuwZrn4X60GMLW38Dg-38qSfJL61FIbn5HfK-VTjCOuC16PtvJAPS1qUBWa-Y3j3aGK3BpHQnlOl-XNB~tJU0GBzRvEnOPFbtqXw38LyTCsvXcY31C~sNC~jedATUfPSZK-UBeN6RkR5BQiXBV-YkzUvTM4s~oXXgw9WFe9DdEWP-XR9~2G1Qe-GkcRAKUXmTAzVnRjlHEDR0lLMfxDwe3OfZuBzM9Gda9AAAA i2pnews.i2p=XHS99uhrvijk3KxU438LjNf-SMXXiNXsbV8uwHFXdqsDsHPZRdc6LH-hEMGWDR5g2b65KLlSm8plFrTusR-yxBfGHtZLa9vhXCwWXXbUlBe7Ty6NlwY7GmJItBKPO09BbUa0oJ5jITjLM1mVxeHShAZs8IMlLJjYaeYycDdaUInuPrng51~ySeiiKKxHa3qJkFOuPgQQiCXqy-9Qhi7t9j16iXzWWZ5yN7XcE9i1J7UQix66ntwILTnTAYBelNbONPiSJzKq-BiXj13bI3~liBgckJGf1a1dU8lOuAemtB-XM36cUcg~LQ6iHMuxK-AE8UDQHTNma6E0TxlK5DizV34UgiJ2CxRB5n8BBrZQEvIjYOExXyt6gbopL-aer1qrL1zoIKoMbGon5P4GV~f8NyClJKHXSS2NW7FV-kZbmA0WSLAxecyBfSLStIlw01gtnb2OAQt6OkMQ693N2-L~IJMg4f1lWK4Pv0bIqJUrHZS8YyeWbb4Y~pto6hkd0kgRBQAEAAEAAA== +exchanged.i2p=rLFzsOqsfSmJZvg6xvl~ctUulYWwGaM8K~rGs-e4WXkKePTCMOpU8l6LIU-wwDOiUZ7Ve8Y-zWPBVYQjH8~~lgT-BJ81zjP5I6H051KOVaXDChdx5F99mZu0sEjnYoFX484QHsUkFc5GUypqhpv1iwWwdPL7bVNzr1fS6sIZvq7tYWEOymbnifxk2jC0BnjultNPCq1wiI2Y-G66iOHDvuLu5f7RvNGJYlpw0UYNv6g8jUu3gXYjDRMBD5OIxFUJaksfmml2CiaGjrPfXKEXBR4q1CogVruq3r~447VHb32f52aeYszcslNzQjYyFCdipnAi5JiNTFpzTZPMEglt2J3KZYB3SMCmxSLktFI7376c7mT7EbMIFFv1GrmcUy9oIyYasbb82Sec9y0nJ9ahZt0x3iGokAYekXKXq-rGPzgFeBwfuCHzQnLzm1akVyJHoGDdaG0QHJfqfW1sY3F2n1xaWrnKcqIz2ypemxVnTMFKQqm2pdG-dMsXNYiGmZtaBQAEAAcAAA== +i2pwiki.i2p=Zr1YUKIKooxymZRqLvtfSYuZggqv5txkLE8Ks~FTh3A8JDmhOV8C82dUBKJhzst~Pcbqz7rXc~TPyrqasaQ~LioAji~WLSs8PpmCLVF83edhYpx75Fp23ELboEszHduhKWuibVchPLNa-6nP4F0Ttcr4krTlphe3KveNfZDAbm511zFFlNzPcY4PqOdCRBrp7INiWkVwQxwGWO7jiNYTYa5x4QXJmxIN1YOiNRYQST7THz1aV6219ThsfT9FE5JtiX-epli6PF5ZX9TcVSjHUKZnr8uJLXfh5T4RMVNe1n~KXutMUZwxpFE0scOIez9vhDFd7t0HPIsQUsv7MUBzrz4FM9qol7UUPueSGDRgTOOfXMfj4BDsouiWQC4GcSmH3SflR0Ith9QWKC4u3XYvB7Tw-70QWBEV53hUo6I8YKidV13WgeN9JI3KWTYkMyX-TYjmY9y2q6Xd-Maszv4Tb~NzxQs9CNdu0W-JRSUFOqzgt3l4cx0K1pmx4p0tM5dLBQAEAAEAAA== +lenta.i2p=DnW8NqbKilYLcIx5g5CG4mWVHkzrCkl0MbV4a5rGJku4BSs7HjvzjZpCoXWFky9JCUlHzjFotMETxQBhaKl0Q46vu-plKQ4BLnYyo45p7j2lTiejWvV4SDuXU4IAdmug27i~Jl4N44zwe9KYy~gMfY1Vsgv4bH9ov7X7l2iS-bycfcd9nE7JfycwFc4e0XU-dx7xf~tHw7I5--25dp-SsRX3-UYz4ygb58aD8UsKfQaFZtMy4x~Z1ufNEftuekb1HH9g2Rhhq8Bl62ad8PWSDa9Ne-SkCQsqTYjrCsvMY2DMvWgmZxI1hJYqzjRdFV6JEprrr~CJgHGJXr~KdnZhX12Vm4bKisZK847wBm42CoBQBT5HRzDkeflkbsliirRuKSUxVYMoZ1vic~avPZZl~pvIKZsz-YtiKha4vjCNE1zD-tHIS~2qq4uEO546Ol9pNokPaNttV6r7D2-zurEDx~9grJ8LhBozTxtdTdfZv2OqN4bVhrE7xUrxe0flIFKEAAAA diff --git a/installer/resources/themes/console/images/exchanged.png b/installer/resources/themes/console/images/exchanged.png new file mode 100644 index 0000000000000000000000000000000000000000..0e72a2c8eb4c029882416035b86e87b0b3cc17eb GIT binary patch literal 4761 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