Compare commits

...

388 Commits

Author SHA1 Message Date
zzz
ef1447a816 0.8.13 2012-02-27 15:25:23 +00:00
zzz
7e8de0602b dont include i2prouter.mo files in updater or installer for now 2012-02-23 15:04:44 +00:00
str4d
45b0df7a1b propagate from branch 'i2p.i2p.str4d.i2ptunnel' (head eb8d45bf3d7e0adb2cb08558756a524b6be3c684)
to branch 'i2p.i2p' (head db81006fcc97016540591cb5cb555f7092e5de4b)
2012-02-23 06:44:16 +00:00
kytv
8a4bbe157e Translation updates for de, es, it, sv, and uk from Transifex 2012-02-22 20:41:57 +00:00
kytv
5d8a718018 fix html tags 2012-02-22 20:35:01 +00:00
zzz
b29a9f43ce * ExploratoryPeerSelector: Use fast peers if hidden for
inbound tunnels to improve success
  * NetDB:
    - Don't publish our RI if it has no addresses
    - Publish our RI sooner after startup
      to facilitate our IB tunnel builds
2012-02-22 14:14:17 +00:00
zzz
51c73fa853 build.xml: Rename build.number property so it doesn't conflict
with ant buildnumber target in other projects
2012-02-21 15:47:14 +00:00
zzz
b8a1ab0138 - Don't delete privkey file for a non-persistent client tunnel
(ticket #599)
2012-02-20 23:19:53 +00:00
zzz
939329a96c i2ptunnel: Fix streamr session registration 2012-02-20 22:10:30 +00:00
zzz
409bc7fd94 even up flag rows 2012-02-20 22:09:13 +00:00
zzz
ad8ce95545 Streaming: Fix race NPE (thx echelon) 2012-02-20 19:34:13 +00:00
str4d
a314b2acc7 Added a missing quotation mark in a <div> 2012-02-20 08:36:03 +00:00
kytv
a15e4c6c28 Revert the last check-in and correct my earlier addition of Czech.
The Czech language is CZ but the Czech country is CZ.
2012-02-19 22:07:12 +00:00
kytv
e407c046d9 Add the correct flag for the Czech Republic
Public domain from the Wikimedia Foundation
2012-02-19 21:52:29 +00:00
zzz
ab1ee37077 * netdb.jsp: Fix debug median calculation 2012-02-17 23:08:03 +00:00
zzz
85a61e6166 escape fixes 2012-02-17 23:05:51 +00:00
kytv
8e275e926f New Czech translation for Debconf from Transifex
Updated headers of German and Russian debconf translations.
2012-02-17 13:21:37 +00:00
kytv
051bc9c468 Add Czech language from Transifex 2012-02-17 12:24:43 +00:00
kytv
aaf425be9b Enable Czech language 2012-02-17 11:31:41 +00:00
kytv
01c5a05c86 Final English source PO update for 0.8.13 2012-02-17 11:26:51 +00:00
kytv
6a034b9613 merge of '8a72dbc075a7d66522d8947ad10d675f76540e4d'
and 'f12cc6a9028cdd515cfc68c809da1feb914a2d5e'
2012-02-17 11:24:08 +00:00
str4d
3e8b7a7f24 Added a table summarising the chosen options on last wizard page 2012-02-17 06:32:49 +00:00
kytv
af02a2f7f6 updated English source po files (and pushed to tx) 2012-02-17 02:47:52 +00:00
str4d
8df576b39d A few fixes to k0e's patch 2012-02-16 18:40:58 +00:00
str4d
0cdc69bcb3 propagate from branch 'i2p.i2p' (head 65be70e72b08757d3aa0bb0cdfc525f49c3b5443)
to branch 'i2p.i2p.str4d.i2ptunnel' (head e4d5122533595faf0e371cd917d4bae1244c3ada)
2012-02-16 11:34:59 +00:00
str4d
4e1239ab5e Patch from k0e to improve the description strings 2012-02-16 11:34:36 +00:00
str4d
a3597e45fa Bumped build number to -13 so tunnel wizard gets tested 2012-02-13 00:00:00 +00:00
str4d
7d0d7e0278 propagate from branch 'i2p.i2p' (head 5d3776cd03c44f2a7eeb6d844eda8799e35aee99)
to branch 'i2p.i2p.str4d.i2ptunnel' (head 4c2122ea2c66216b219c66b829ff5c05f8af0157)
2012-02-12 23:53:58 +00:00
str4d
8846691c47 Set the default wizard value for targetHost to 127.0.0.1 2012-02-12 05:10:58 +00:00
str4d
0f72dfea0f Added some descriptive text for page 7 2012-02-12 04:26:22 +00:00
str4d
77bb9f144f Added some descriptive text for page 6 2012-02-12 00:18:09 +00:00
str4d
ef9fe8d197 Added some descriptive text for page 4 2012-02-12 00:08:14 +00:00
str4d
56e00199aa Fix descriptive text on page 1 2012-02-11 23:55:53 +00:00
str4d
3a4447cd08 Added some descriptive text for page 2 2012-02-11 23:54:38 +00:00
str4d
c7b7f4744c Added some descriptive text for page 1 2012-02-11 22:25:16 +00:00
zzz
29c85254e7 WorkingDir: Fix detection of migrated directory 2012-02-10 21:54:43 +00:00
zzz
4cea4514a0 merge of 'bbec2c1856866ea026d683727faa703fcb1275fe'
and 'd1e9a819d9ee4ac855f6ced8fc36033c629f0ff8'
2012-02-10 21:52:38 +00:00
kytv
2f685d53a7 Redirect "which" output to /dev/null 2012-02-10 19:44:12 +00:00
zzz
b23f0ee5a9 escape semicolons 2012-02-09 14:44:35 +00:00
kytv
0932f77fac pidfile is now set via i2prouter, not wrapper.config 2012-02-08 15:21:43 +00:00
str4d
05860a5b5c Fiddled with wizard's button logic to make the workflow clearer 2012-02-07 01:47:52 +00:00
kytv
317aade5e0 patch refresh needed because of changes to wrapper.config 2012-02-04 20:45:43 +00:00
str4d
4ccb06f289 propagate from branch 'i2p.i2p' (head 0f4af64e64536c467b623286bce659dd2dfe9342)
to branch 'i2p.i2p.str4d.i2ptunnel' (head 04d0fee1e4638d20909ab34c3100f21933b9c15c)
2012-02-04 20:41:36 +00:00
zzz
d93805eb96 * ProfileOrganizer: Add profileOrganizer.sameCountryBonus config 2012-02-04 14:46:24 +00:00
zzz
4bd869f5fa * WorkingDir: Reset dates of eepsite files while migrating
to avoid exposing install time (thx Z6)
2012-02-04 13:34:57 +00:00
zzz
2c8f426e30 non-x86 update of build instructions 2012-02-04 13:33:03 +00:00
zzz
37bb7ac8ca * Wrapper files:
- Move PID and status files to config dir in i2prouter
    - Don't set PID files in wrapper.config as Windows doesn't need them
      and the wrapper won't start if the dir doesn't exist
    - Move wrapper.log to config dir using override in i2prouter,
      Windows stays in system temp dir
    - Move wrapper.log to config dir for no wrapper
    - Move wrapper.log setup for no wrapper from RouterLaunch
      to WorkingDir
    - Redirect stderr too when no wrapper
    - Create config dir in i2prouter for Linux/Mac
2012-02-04 13:11:54 +00:00
zzz
c0e0994bb3 deprecate util classes used only by installer 2012-02-04 13:02:15 +00:00
str4d
8a33ee2078 Added link to tunnel wizard on main i2ptunnel page 2012-02-04 10:49:07 +00:00
str4d
81d9ed1766 propagate from branch 'i2p.i2p' (head 98f389d40c983a02e3b0803401896e2b1104b44d)
to branch 'i2p.i2p.str4d.i2ptunnel' (head 9f44bb9e4efa0f9ed76f4988bdd3ebef7ac6b3a7)
2012-02-03 17:12:31 +00:00
str4d
7461d8c1f1 Added "@since 0.8.13" tags to the only two methods in WizardBean 2012-02-03 17:10:44 +00:00
str4d
8cbf94f9eb Added placeholder blurbs for explaining the various wizard options 2012-02-03 17:07:10 +00:00
kytv
9141aa1d25 updated en source POs (from push to tx) 2012-02-02 22:49:25 +00:00
kytv
8ef9009e48 Ukrainian and Polish translation updates 2012-02-02 22:44:02 +00:00
str4d
973dbe6fb2 Don't display page 4 for server tunnels (tunnel destination) 2012-02-02 03:43:13 +00:00
str4d
7c70378396 Remember startOnLoad checked-ness 2012-02-02 03:19:23 +00:00
str4d
27e14e7f36 Remember reachableBy selection 2012-02-02 03:06:34 +00:00
str4d
30bdf871aa Fill in wizard fields with POSTed values if present
This means that you can go back and edit typed-in values during the wizard
2012-02-02 00:24:29 +00:00
str4d
5a0190ddcc CORRECTLY create client tunnels by default in the wizard 2012-02-01 23:34:15 +00:00
str4d
98e7a6d2b3 Change pagination to use POSTed variable instead of query parameter
All wizard pages now have the URL /i2ptunnel/wizard
2012-02-01 23:03:00 +00:00
str4d
3af2f29739 Create client tunnels by default in the wizard 2012-02-01 22:32:10 +00:00
str4d
f7207689d5 Added missing close brackets 2012-02-01 10:47:09 +00:00
str4d
1a01f59d53 Make Cancel button a link instead so it works correctly 2012-02-01 10:43:27 +00:00
str4d
7dd03fda8d Added a Previous page button
At present the ?page= in the URL isn't affected, which could possibly
confuse users - maybe move to having the page variable as a POST variable
so the url is just always /i2ptunnel/wizard
2012-02-01 03:48:39 +00:00
str4d
c62254da1e propagate from branch 'i2p.i2p' (head 4ff82dc25fcfc71f44d093b2c164b89fc34d07f3)
to branch 'i2p.i2p.str4d.i2ptunnel' (head 9922f642f87c3e2b8fca2703011fcfa7af3a447e)
2012-02-01 03:04:33 +00:00
str4d
621f132069 Change Finish action on wizard to "Save changes"
This means that the form is handled by the same handler as the edit
forms, hopefully reducing maintenance ^_^
2012-02-01 03:03:57 +00:00
str4d
467d21257a Added default values for other required variables on page 7 of wizard 2012-02-01 02:51:05 +00:00
zzz
482a63c996 unit test javadocs 2012-01-31 14:03:20 +00:00
zzz
252f9ccee2 * SusiDNS: Reduce listings to 50/page 2012-01-30 22:04:30 +00:00
zzz
0f356892ba * LogWriter: Don't rotate and open file until first message 2012-01-30 22:03:19 +00:00
zzz
fae3492dd2 * i2psnark: More illegal chars 2012-01-30 22:02:46 +00:00
kytv
f6babeecd2 Add quotes around path variables 2012-01-28 22:10:33 +00:00
kytv
d9f3e9e2e7 try to parse the pidfile location from wrapper.config 2012-01-28 22:08:39 +00:00
kytv
ed357b1a3e fix broken links 2012-01-28 22:07:32 +00:00
kytv
ee8901cf02 merge of '8ae45b0b8c2c4098bf33654401163d37f73a1bd4'
and 'e6dc64fe412c386b3f3ae59bcbc6b5a53cf1d554'
2012-01-28 14:24:03 +00:00
kytv
d10825d4a9 Remove I2PFox recommendation from the router console
It's outdated and the text was misleading. It is NOT a "custom-build" that is
"security hardened"--it's a Firefox profile. Having echelon's site
linked on the router console should be enough.
2012-01-27 19:26:55 +00:00
zzz
b54c9fd2c1 * confignet: Add UDP disable option 2012-01-27 18:55:41 +00:00
zzz
65504e8660 * Build: Repack release jars with pack200 -r, saves about 1% and
might save a little memory at runtime too
2012-01-27 18:53:52 +00:00
zzz
c902d4c219 remove SAM client classes from sam.jar 2012-01-27 13:33:41 +00:00
str4d
39953b6925 Fix condition for including targetHost 2012-01-27 04:10:01 +00:00
str4d
c81c4cb873 Fix autostart hidden input to not appear if checkbox not ticked 2012-01-27 04:06:04 +00:00
str4d
4be3f16805 Added missing label for targetPort 2012-01-27 03:12:57 +00:00
str4d
c9f1f69c16 Fix isClient to get passed through properly 2012-01-27 02:52:39 +00:00
zzz
b3f3a60ca6 comment out unescapeHTML() until we need it 2012-01-26 15:03:54 +00:00
zzz
fc18b44a56 * SusiDNS: Make UI 1-based 2012-01-26 13:24:01 +00:00
zzz
d3cb42d441 * Plugins: Fix updated count 2012-01-26 13:23:28 +00:00
zzz
4120fc6f0b * NetDB: Increase min ff to 200 2012-01-26 13:22:49 +00:00
zzz
adba42d114 * configclients: Fix form action default 2012-01-26 13:22:27 +00:00
str4d
9a5ea68682 Subclass WizardBean from EditBean to get access to the interfaceSet() method 2012-01-26 03:53:43 +00:00
str4d
6d0514b451 Get wizard to step through pages correctly 2012-01-26 03:53:05 +00:00
str4d
ac493d7bcb Show Next and Finish buttons the right way round 2012-01-26 03:35:25 +00:00
str4d
9e446f9ae8 Use request.getParameter() to fetch POSTed parameters 2012-01-26 03:18:50 +00:00
str4d
e1b53a63f4 Undo revision 126c1c30c0c02fd95719ffeae6d4709abb7bf18d 2012-01-25 23:05:23 +00:00
str4d
776a8c5a63 Undo revision 30dba6c75dcd43c7c67112558dad7b36504ba5a7 2012-01-25 22:53:14 +00:00
zzz
abe83bc5bd * Addresses: Fix NPE if no interfaces found http://forum.i2p/viewtopic.php?t=6365 2012-01-25 02:31:26 +00:00
zzz
fb8deb327d * Addresses: Fix NPE if no interfaces found http://forum.i2p/viewtopic.php?t=6365 2012-01-25 02:28:20 +00:00
str4d
e43182b842 Added inputs for page 6 of wizard 2012-01-25 01:12:17 +00:00
str4d
12ee1a70b2 Added comments to clarify page boundaries, and removed extra </div> 2012-01-25 00:06:18 +00:00
str4d
c9a453309f propagate from branch 'i2p.i2p' (head ce3040d00c42e384f3fc62d018c9bdade01df033)
to branch 'i2p.i2p.str4d.i2ptunnel' (head 6259f71c23cbb08c8b1de472632d8efb1b016d29)
2012-01-24 04:36:21 +00:00
zzz
0a4d6c0bd8 * susimail: add icons to buttons
arrow_left, arrow_up, email.png from Silk icons: See licenses/LICENSE-SilkIcons.txt
2012-01-24 00:29:20 +00:00
zzz
a617dc3e2b two more buttons 2012-01-23 23:14:15 +00:00
zzz
63d2e19769 * susidns: add icons to buttons
magnifier.png from Silk icons: See licenses/LICENSE-SilkIcons.txt
2012-01-23 23:07:24 +00:00
zzz
97e5bc87ef i2ptunnel: fix white-on-white buttons on hover 2012-01-23 18:33:13 +00:00
zzz
0aa9e39ee3 * Plugins: Add completion message after all-update check 2012-01-23 17:53:59 +00:00
str4d
d4804c2b70 propagate from branch 'i2p.i2p' (head 156f8e6137be3c25aa70176fe0a78218b898a684)
to branch 'i2p.i2p.str4d.i2ptunnel' (head 126c1c30c0c02fd95719ffeae6d4709abb7bf18d)
2012-01-23 01:36:26 +00:00
str4d
745e2952ff Added getters for the hidden variables needed by wizard.jsp 2012-01-23 01:21:19 +00:00
str4d
9a5430beeb Added inputs for page 5 of wizard 2012-01-23 01:09:17 +00:00
str4d
1486d83ec5 Swap around nesting of page 3 to make it clearer 2012-01-22 22:03:26 +00:00
zzz
c3bf470a80 -7 2012-01-22 18:30:25 +00:00
zzz
04544ac9e0 * Transports: Bind only to a single interface if specified
as the host address and it's available (ticket #591)
2012-01-22 16:43:45 +00:00
zzz
669bcbd191 move VMCommSystem to dummy directory 2012-01-22 16:16:24 +00:00
zzz
9252d6f9ca tweak 2012-01-22 16:15:18 +00:00
str4d
3793e2c4ec Added inputs for page 4 of wizard 2012-01-22 04:23:45 +00:00
str4d
a092054417 Formatting and comments in JSP code 2012-01-22 02:44:51 +00:00
str4d
e0b70375a6 Added inputs for page 3 of wizard 2012-01-22 02:37:39 +00:00
str4d
77c2173421 Added in a hidden input for "tunnel" set to "null"
The idea is to utilise the existing saveChanges function in IndexBean.java
that the edit page posts to. Consequently, the wizard will need to have all
the same inputs that need to be POSTed as the edit page does.
2012-01-22 00:21:13 +00:00
str4d
17e8cf777f Flesh out some more of wizard.jsp 2012-01-22 00:11:29 +00:00
str4d
eda2ac510a Make getType() a public method so can be accessed from wizard.jsp 2012-01-22 00:07:06 +00:00
zzz
256b05531e * Build: Fix Windows build, version checking for release 2012-01-21 15:28:24 +00:00
zzz
b003ee8748 move some summary bar code around 2012-01-21 15:27:58 +00:00
str4d
5d46e922ed propagate from branch 'i2p.i2p' (head 5d0ae36d90db71fcbaa3e7ffda7720ca2659e2ed)
to branch 'i2p.i2p.str4d.i2ptunnel' (head 790aee747df3e6eff3ef9742965a88fd3b03a75b)
2012-01-21 05:33:03 +00:00
str4d
c31cb0c057 Initial beginnings of a tunnel creation wizard as per ticket #502 2012-01-21 05:30:23 +00:00
sponge
b234ce3f51 Fix too short of delay for http. It is up to the browser to time out , not the proxy. 2012-01-20 02:43:38 +00:00
str4d
0e5fc8eb11 Revert the use of the unescape function in ConfigClientsHandler - unnecessary 2012-01-20 01:18:46 +00:00
str4d
7ee40e58c4 merge of '7e9829897ed454bcb4a8e64b029060f7e90cbbfa'
and 'b1a1e2e4c3f77f38c7c7f6ebe23d5225c4e42873'
2012-01-19 05:21:00 +00:00
zzz
5b285db165 -5 2012-01-18 18:38:20 +00:00
zzz
0da70caf7f * I2PTunnel: Register ports with the PortMapper
* Update: Find the proxy port in the PortMapper
2012-01-18 16:57:27 +00:00
zzz
a4a1ed4357 - When a peer is shitlisted, fail all our tunnels where
that peer is the adjacent hop. In particular this
      will remove outbound tunnels when we can't contact
      the first hop, and enable quicker recovery.
2012-01-18 02:01:59 +00:00
zzz
6e5d53dbde one more saveConfig change 2012-01-18 01:55:53 +00:00
zzz
95329803a9 - Use new synchronized change-and-save-config methods
to eliminate races with ReadConfigJob
2012-01-18 01:54:34 +00:00
str4d
e183966482 Simplify the HTML escape/unescape functions to use static arrays 2012-01-18 01:46:05 +00:00
str4d
9755338f73 Fix for #588 part 6: Don't convert nulls to empty strings 2012-01-17 22:45:06 +00:00
str4d
dafd722f20 Fix for #588 part 5: Undo escaping of description when just displaying it
This was interfering with the plugins section, where HTML is intentionally
passed into the description field. Now, only when the description field is
being plugged into the value property of an input tag will it be escaped.
2012-01-17 22:26:00 +00:00
str4d
38dba5d19a merge of 'a5d2fae48cf001c84ff5cea42466e1f3ed7d5f0a'
and 'c52409bf5d7b422c23a62eecfa50b98d7c74f8df'
2012-01-17 03:04:52 +00:00
str4d
bafdaebc42 merge of 'a3d362477b328c80ac2cd052f635d3ddd3b39c81'
and 'c21005b174cec3b4ae419318758f1a9c2071cf64'
2012-01-17 03:03:07 +00:00
str4d
fc292cd29d Fix for #588 part 4: Pull out escaping of & separately first 2012-01-17 02:59:21 +00:00
str4d
553201db21 Fix for #588 part 3: Escape & character FIRST so other escapes aren't broken 2012-01-17 02:17:05 +00:00
str4d
452096b976 Fix for #588 part 2: moved escape/unescape functions to net.i2p.data.DataHelper 2012-01-17 02:11:56 +00:00
str4d
1e8c968bd6 Fix for #588 - HTML escape and unescape descriptions on configclients page 2012-01-17 00:56:49 +00:00
dev
b1878d6026 Don't throttle tunnel creation if using a higher than default router.maxParticipatingTunnels setting. 2012-01-16 20:09:34 +00:00
zzz
47876d6131 prevent stale build version on logs.jsp 2012-01-16 14:36:34 +00:00
zzz
23de1e6db8 -4 2012-01-16 14:10:06 +00:00
zzz
1591ddca2f merge of '282f1c5000f3f53bbfb346b4ae93c13b5bb3db8b'
and 'e4e2cade8df8374791936c5ea060df6d4cd9a65e'
2012-01-16 14:07:17 +00:00
str4d
0a5e08382f Fix up use of <p> tags in a few routerconsole config pages, remove extra </div> 2012-01-16 02:39:14 +00:00
zzz
83480e456a * NetDB: Hopefully fix rare NPE (ticket #589) 2012-01-16 02:20:20 +00:00
zzz
da2cd92884 shorten the other timeout 2012-01-15 21:39:52 +00:00
zzz
0cee758dc3 - Only stop a plugin at shutdown if it was running 2012-01-15 21:30:15 +00:00
zzz
fc6f4ecc74 * Plugins:
- Auto-update plugins after a router update
    - Add update-all button
2012-01-15 21:15:08 +00:00
kytv
2253ad13cc Use bzip2 to compress debian packages
This mainly has an effect on the size of the javadocs package (i2p-doc shrinks
to half of its present size when using bzip2).  xz would give better
compression, of course, but xz support isn't isn't available in the version of
dpkg that ships with Lucid. All supported versions of Debian and Ubuntu support
bzip2 in .debs, so this will only have the impact of giving us smaller javadoc
packages.
2012-01-15 19:28:07 +00:00
zzz
9acabfb20f - Add synchronized change-and-save-config methods to avoid races 2012-01-15 17:30:31 +00:00
zzz
3d2d60469e * Plugins:
- Only stop a plugin before update if it was running
    - Don't start a plugin after update if it was disabled
    - Disable plugin if it fails version checks at startup
2012-01-15 16:59:33 +00:00
zzz
b5d77685b9 * Router: Save previous version in config so we know when we updated 2012-01-15 16:46:34 +00:00
zzz
557cb30feb echo tweak 2012-01-15 16:46:11 +00:00
zzz
59ba19b965 * Transport: Revert change from -2, put addresses back in RouterInfo
when hidden, broke inbound tunnel building
2012-01-15 16:38:39 +00:00
zzz
7213ff0c76 * Build: Put Implementation-Version in manifests 2012-01-15 16:36:17 +00:00
kytv
9e068b3926 refresh patch due to wrapper.config changes 2012-01-14 21:29:00 +00:00
zzz
7df881442a remove comment since we can now find the wrapper log 2012-01-14 18:01:10 +00:00
zzz
eb2830b8f3 * jars.jsp: New debug page 2012-01-14 17:49:47 +00:00
zzz
c54b3a08b8 save a few bytes 2012-01-14 17:47:39 +00:00
zzz
7874488a61 * logs.jsp: Use wrapper method to find wrapper log if available 2012-01-14 17:46:34 +00:00
zzz
07957409cb * Stats:
- Cleanups
    - Remove some locking
    - Change some longs to ints to save space
    - Remove static logs
2012-01-14 17:44:50 +00:00
zzz
fc07065413 * i2ptunnel: Partial fix for dest formatting (ticket #581) 2012-01-14 17:41:17 +00:00
kytv
50f270fd76 i2prouter: look for external gettext in the path 2012-01-14 02:28:10 +00:00
zzz
ba5be7449b translation infrastructure for i2prouter script 2012-01-13 22:26:35 +00:00
zzz
4ad6d699e7 * Router:
- Auto-hidden mode for bad countries
    - Don't put addresses in our RouterInfo when hidden
2012-01-10 00:05:17 +00:00
zzz
c6e6a9d36e - Add indication on summary bar when in VM comm system 2012-01-10 00:02:20 +00:00
zzz
ad4d73ea0d - Fix class error on wrapper 3.1.1 2012-01-09 23:59:58 +00:00
zzz
352c6ba4ba * i2prouter: Don't attempt to translate strings from script 2012-01-09 23:58:24 +00:00
zzz
ce27d69e39 - Add info to error 500 page 2012-01-09 23:57:17 +00:00
kytv
5fd6698d05 Refresh patch due to wrapper.config additions 2012-01-08 23:26:39 +00:00
kytv
0f62383aec Reference /etc/i2p/wrapper.config when OOM when using Debian packages
When I2P terminates with an OOM error, users are advised to update
$I2P/wrapper.config. That path isn't accurate for the Debian packages.
2012-01-08 23:25:36 +00:00
kytv
b09071f20f update of jbigi scripts
- merge mbuild_jbigi.sh into build_jbigi.sh and drop mbuild_jbigi.sh
- make build.sh's tests optional
- try to determine the locations of JAVA_HOME and I2P
2012-01-08 23:23:00 +00:00
dev
f5b6d56489 Added support for AMD Bulldozer CPUs. Fixed issue with last commit. 2012-01-08 19:54:22 +00:00
dev
527c4b58c1 Added support for i7 Extreme Edition processors. 2012-01-08 19:45:01 +00:00
kytv
430ac8323f Really send HUP signal when called with the graceful parameter 2012-01-08 19:08:04 +00:00
kytv
8c70af56ad refreshed patch 2012-01-08 16:35:53 +00:00
zzz
59bd51a419 move ReadConfigJob 2012-01-08 14:08:14 +00:00
zzz
b34ae8f051 more fixups from RouterAddress changes 2012-01-08 14:04:19 +00:00
zzz
5a4f2069f0 propagate from branch 'i2p.i2p.zzz.test' (head 1959049922a17635226170bf3309e281d8e02e43)
to branch 'i2p.i2p' (head a06bf8c92a0e1195b6f98dbad3e8898339bc6053)
2012-01-08 13:16:07 +00:00
zzz
f6ca6a5e0d * Router shutdown:
- Fix failsafe shutdown hook broken in 0.8.8;
      HUP, INT, and TERM signals should now shut down cleanly.
    - Shutdown hook no longer prevents other hooks from running
    - Trap HUP, if router.gracefulHUP=true, and do graceful shutdown.
      Only under wrapper, non-Windows.
    - i2prouter stop now uses SIGTERM
    - Implement i2prouter graceful using SIGHUP (ticket #580)
    - Configure wrapper to ignore SIGUSR1 and SIGUSR2 as they will shut down
      or crash the JVM
2012-01-08 13:15:47 +00:00
kytv
56a67729e3 Fix compilation with gmp 5.0.1 2012-01-08 01:14:48 +00:00
kytv
0c81d519b7 Debian: Fix postinst script
On systems without an i2psvc group, the postinstall would fail. This change
will add the group if it doesn't exist. Also adding "||true" to the usermod
command in case the command returns a non-zero status.
2012-01-07 00:20:43 +00:00
kytv
5067499fa1 fix typo (s/exit/exist/) 2012-01-06 04:07:35 +00:00
kytv
c155c4b601 Return 1 if eepget transfer fails (fixes #576) 2012-01-06 03:07:25 +00:00
zzz
cc16834455 0.8.12 2012-01-06 00:40:20 +00:00
zzz
708e943c44 updates after review 2012-01-06 00:38:33 +00:00
zzz
a2d6dd2c5b disable i2psnark retry link until it can be fixed (ticket #575) 2012-01-04 02:22:34 +00:00
kytv
7d6ab5ca41 Updated geoip.txt from 2011-12-08 Maxmind database 2012-01-04 01:07:06 +00:00
kytv
a9e03504de Updated debian changelog 2012-01-04 01:01:49 +00:00
kytv
3b59af11f6 Suggest itoopie 2012-01-04 01:01:27 +00:00
kytv
3a2286f874 Debian: EXTRA is now assigned dymanically
Before there was a patch to add the -deb1 to the RouterVersion.java file, but
it needed me to update the deb#. With my newly budding regex skills, I'm now manipulating
it using sed and determining the number according to the debian version number.
2012-01-04 00:57:54 +00:00
kytv
ab0e8d94a2 Update geoip country list
PN,Pitcairn Islands added; we already had the flag.
2012-01-03 00:07:42 +00:00
kytv
be7770e679 Add EXTRAVERSION to the build number, custom installers, javadocs
With this check-in I'm adding the EXTRAVERSION to our javadocs and the custom
installer targets (if EXTRAVERSION is set in RouterVersion.java). Also,
i2pinstall*jar and i2pinstall.bz2 will be removed when ant clean is run.
2012-01-02 19:07:09 +00:00
kytv
60c5f06689 Add Isle of Man flag
Flag courtesy of the Open Clip Art Library, released into the public domain
2012-01-02 16:30:13 +00:00
kytv
b391ed15ed Update wrapper to 3.5.13 2012-01-02 16:12:50 +00:00
zzz
88cf742895 fixup after prop 2012-01-02 14:42:19 +00:00
zzz
f0eb5663f7 propagate from branch 'i2p.i2p' (head d289b6cafae6b23ce699dca11dbb3e993c8f827f)
to branch 'i2p.i2p.zzz.test' (head e2c6210696c78c54650ff345f18ad62b4543a18b)
2012-01-02 14:39:17 +00:00
zzz
d8e297dde7 * Fix webapp PortMapper lookup for SSL-only console 2012-01-02 12:31:23 +00:00
zzz
f956539b4b Wrapper files for armv7.
Compiled on trimslice:
    gcc version 4.5.2 (Ubuntu/Linaro 4.5.2-8ubuntu4) 
    java version "1.6.0_18"
    OpenJDK Runtime Environment (IcedTea6 1.8.10) (6b18-1.8.10-0ubuntu1~11.04.1)
    OpenJDK Zero VM (build 14.0-b16, mixed mode)
    Wrapper 3.5.13 GPLv2
    All binaries stripped.
2012-01-02 12:22:03 +00:00
kytv
2dcc75ad2a set /var/log/i2p to group i2psvc instead of adm 2012-01-01 18:26:38 +00:00
kytv
6409f07c9b debian initscript: move I2PTEMP to /tmp/i2p-daemon 2012-01-01 18:14:08 +00:00
kytv
b38f6606c1 0.8.12 will be released with v3.5.13 of the wrapper 2012-01-01 16:55:28 +00:00
kytv
0a239e1d4a Remove the mention of GMP 4.1
All of the present jbigi libs are linked against 4.3.x and 5.0.2.
2012-01-01 16:53:29 +00:00
kytv
30e298d98b Convert extraneous tabs to spaces 2012-01-01 16:52:21 +00:00
kytv
3729aa31fd Add Estonian to Transifex (and upload the router console translation to tx) 2012-01-01 02:18:00 +00:00
kytv
3f4d154414 Brief instructions on lipo. 2012-01-01 00:20:06 +00:00
kytv
4c76a93adb Add CPU type check for OSX
I removed Tanuki's broken CPU "bitness" check for OSX in
3db46be1ede7d858b6c319905cf310d99227eb29. With this commit I add one that
works. Note that at this point we don't use the "bitness" checking because we
ship a quad-fat wrapper for OSX. Unfortunately, one can only manipulate the osx
binaries with "lipo" which is only available in OSX. In the future we may want
to use the "bitness" logic.

In any case, the old check set the bits to 64 for Leopard and above, but just
because a Mac is running Leopard or Snow Leopard doesn't mean it's 64bit
capable. This addition of mine will actually check the flags using sysctl. I'm
not using uname because OSX < Lion starts in 32bit mode by default (but can
still run 64bit binaries).
2011-12-31 22:46:49 +00:00
kytv
ce0e0b2004 Fix typo (s/stip/strip/), thanks k0e 2011-12-31 20:38:29 +00:00
zzz
fa0b7d9acc merge of '3e30b7ad2af5190cd2d124656e272700c53b8219'
and '554846d3fd4ebcdbfaccb3a001098626e0b26ca0'
2011-12-31 16:27:38 +00:00
zzz
c82dbd82b1 * Fix log NPE when saveConfig() fails at startup, thx kytv (backport from jetty6 branch) 2011-12-31 14:49:47 +00:00
kytv
b3e162e706 s/libwrapper.dll/wrapper.dll/ 2011-12-31 14:16:24 +00:00
kytv
f6d821c932 linux-ppc specific wrapper notes 2011-12-31 14:14:35 +00:00
kytv
45fb0ad9f3 Small wrapper-building HOWTO for BSD 2011-12-31 14:14:08 +00:00
zzz
87008f3fe3 make jetty version comparable 2011-12-30 22:12:30 +00:00
zzz
5346dc1a98 * Estonian router console translation
thx "ajutine" - public domain
2011-12-30 17:06:32 +00:00
zzz
f92edb44ba how to update the wrapper 2011-12-29 16:51:47 +00:00
kytv
2250ce642a Remove mention of mtn repository that hasn't been active for nearly a year 2011-12-27 23:04:12 +00:00
kytv
f4b52b7ccd Remove tino's freenet proxy as it has been shut down 2011-12-27 23:00:31 +00:00
kytv
59f80086db Translation updates (es & sv) from Transifex 2011-12-27 22:41:00 +00:00
kytv
8e7bd9280d Spanish and Swedish debconf translation updates from Transifex 2011-12-27 22:32:39 +00:00
kytv
daca27ea45 loosen exit statuses 2011-12-27 16:02:59 +00:00
kytv
7b49493924 Redo existing account handling 2011-12-26 18:43:28 +00:00
kytv
848f30955d initscript improvements
- move router.ping to /var/run/i2p
   - move temp files to /var/tmp/i2p
   - Since gaps are allowed in the numbering with newer wrapper versions, start
     *.adddional.# numbering at 10
   - redirect errors to stderr
2011-12-26 18:42:13 +00:00
kytv
d9e4c4d7f4 refresh patch 2011-12-25 00:42:59 +00:00
zzz
bb7a88ffc9 * Plugins:
- Enforce min and max Jetty versions at plugin installation
    - Enforce I2P, Java, and Jetty versions at plugin startup too
2011-12-24 00:48:30 +00:00
zzz
8fa720539a RouterInfo, RouterAddress: Optimizations and integrity checks
- Remove synchronization
    - Do not allow contents to change after being set, throw IllegalStateException
    - Do not copy contents out in getters
    - Make options final
    - Add getOption() and getOptionsMap() methods
2011-12-23 21:41:58 +00:00
zzz
36cb07b0cc Router: No longer check for updates or start any threads in the Router constructor,
for ease in building multiple routers in the JVM,
        and also because starting threads in a constructor is bad practice.
        All threads now start in runRouter().
        Installation of updates now only happens via Router.main().
2011-12-23 17:01:52 +00:00
zzz
ebad5ad61c tweaks 2011-12-23 16:52:04 +00:00
zzz
bbcd6243e7 * Logging: Eliminate LogWriter/LogManager deadlock (thx kytv) 2011-12-23 01:23:12 +00:00
zzz
95eabfaaf8 javadoc fix 2011-12-23 01:11:08 +00:00
kytv
0874b3e461 Add updater200WithJavadoc build target 2011-12-21 15:32:14 +00:00
kytv
ac8d65ad78 Debconf: clarify account existence warning
In the forums, someone thought the i2psvc account needed to be pre-existing;
therefore, I'll try to make it clearer.
2011-12-20 23:12:33 +00:00
kytv
bd14dc3112 i2prouter: set locale environment variables if LANG not set
Check for /etc/environment and /etc/default/locale and retrieve/set locale
variables from them--but only if LANG is unset. This should help in those
cases in which someone is starting I2P as a daemon using an initscript and I2P is
starting /before/ the environment is configured, leading to the wrong file
encoding being detected.
2011-12-19 18:14:21 +00:00
dev
cefe20f11d Switched itoopie to a brighter version. 2011-12-19 16:46:48 +00:00
zzz
78229227d2 * Router: Cleanup startup jobs and router.config reading; javadocs 2011-12-18 15:17:09 +00:00
zzz
61810b7215 tweaks 2011-12-18 13:28:57 +00:00
zzz
fb4d85ff8b * Blocklist: Buffer input to speed lookup
* PersistentDataStore: Buffer file writes and reads
2011-12-18 13:28:26 +00:00
zzz
937d2c54c8 * Addresses: Add utility toString() methods
* Transport: Log tweaks
2011-12-18 13:25:51 +00:00
kytv
5b37df5bc9 ...and now that my key is added, let's set it to trusted status 2011-12-18 01:14:10 +00:00
kytv
add3bcedf6 -23-rc
Mainly bumping the version because of the theme regression (that I introduced and fixed).
2011-12-18 00:58:25 +00:00
kytv
7284af9329 Add my signing key 2011-12-18 00:43:50 +00:00
kytv
959932b827 reference UK updates 2011-12-18 00:10:43 +00:00
kytv
f9b2100d75 Updated Ukrainian translation from Transifex 2011-12-18 00:09:52 +00:00
kytv
a2454e8e7d tiny regression fix
The css file originally had align:center, which is invalid. I assumed
text-align was meant but I was obviously wrong.
2011-12-17 23:07:44 +00:00
zzz
4322cb3ee5 merge of '0035c4f64c2b0f23c9e007363b634f360e2f10cb'
and '0c2d5fea1f036773ef51ce22d9d8c4e9203ee5f3'
2011-12-17 18:52:23 +00:00
kytv
a7311a5752 Minor css fixes (fixing validity not style) 2011-12-17 18:27:17 +00:00
zzz
b18e7c7839 add some line feeds 2011-12-17 14:30:14 +00:00
zzz
18b8ddc419 misc. log tweaks 2011-12-17 14:04:57 +00:00
zzz
48841481f0 * ProfileManager: Make some profile update methods non-blocking to reduce
stalls in the transports during profile reorg
    - Make isFailing() non-blocking since it's always false
2011-12-17 14:02:01 +00:00
zzz
bf45e31c62 * GeoIP: Reduce thread priority during lookup 2011-12-17 13:55:45 +00:00
zzz
1488cd0f48 * i2psnark:
- Replace file name characters not supported in default charset
    - Add torrent file name to local details page
2011-12-17 13:52:32 +00:00
dream
5b05d86ec6 merge of '577418047ed3ead63f9f7dc4211cf4ac7e19d251'
and 'c5d321a2c838422c5e813359c2e86f9b98561cf9'
2011-12-16 12:24:37 +00:00
dream
212981dfee Add hooks so the new PortMapper lets i2p plugins not fail when the router console is not on port 7657. Also raise an exception when requesting unregistered ports so as to encourage swift adding of the registration hooks when those ports are taken. 2011-12-15 23:36:32 +00:00
kytv
7864404a8c Swedish language translation updates from Transifex 2011-12-15 20:20:33 +00:00
zzz
51e4003089 merge of 'db5a04b2f4ebd4869d162a3bfa48221dec583b7e'
and 'e82c7db57396b2f2057f46c000a688200c4d12ea'
2011-12-14 03:59:19 +00:00
zzz
6da32a1ccb -21 2011-12-14 00:24:33 +00:00
zzz
eb32e2e23e merge of '581e8c75800b84404730c41f6eb904fbc4e43804'
and 'fda7a0fe63b4cda793b7c15d5d263c211b2a0903'
2011-12-14 00:20:17 +00:00
kytv
5673a6554b Update Oracle's javadoc URL 2011-12-14 00:09:15 +00:00
kytv
fe5c34ebae Minor Javadoc fixes
The author field showed the "may eat your children" line..
2011-12-13 23:57:14 +00:00
kytv
6ce5e8bd03 Don't require that full stats need to enabled in order to graph high capacity
peers. (closes #450)
2011-12-13 23:08:41 +00:00
zzz
27f05879b1 note that these will be moved to router.jar at some point 2011-12-13 21:38:24 +00:00
zzz
60297f56d7 * GeoIP: Buffer input to speed lookup by 10x 2011-12-13 21:19:32 +00:00
zzz
c92c664d3d used cached cert; generics 2011-12-13 20:38:02 +00:00
zzz
24c1473b1d disable debug double-check 2011-12-13 19:12:26 +00:00
zzz
9e88fdeec9 public 2011-12-13 18:59:24 +00:00
zzz
69e5760b37 javadoc clarifications 2011-12-13 18:56:44 +00:00
zzz
5a715f385a * ResettableGZIPInputStream: Better footer log errors 2011-12-13 15:57:51 +00:00
zzz
f9818a2b1d * DataHelper:
- Speed up heavily used long/byte[] converters
    - Add little endian versions of the converters
    - Cache common properties keys
  * RouterAddress: Cache transport names
2011-12-13 15:55:03 +00:00
zzz
900defcd42 * MessageHistory:
- Flush at shutdown
    - Fix file location, only delete if enabled
    - Cleanups, concurrent
2011-12-13 15:25:56 +00:00
zzz
15cbb6bb71 add charset, which is not necessarily the same as file.encoding 2011-12-13 15:24:20 +00:00
zzz
a0c6287d2c log tweak 2011-12-13 15:17:04 +00:00
zzz
14f61bbbb3 * TransportBid: Remove unused stuff 2011-12-13 15:16:07 +00:00
zzz
cd30545c08 * BuildHandler: Increase next hop timeout again 2011-12-13 15:14:54 +00:00
kytv
00c0171d31 English po updates (pushed to Transifex) 2011-12-12 11:23:02 +00:00
kytv
1e5afa8568 German and Spanish translation updates from Transifex 2011-12-12 11:17:17 +00:00
zzz
e117e3310c * ReusableGZIPInputStream: Fix 3 major bugs, all present since 2005:
- Payloads an exact multiple of 512 bytes failed to decompress
    - Data at the end of the stream could be lost
    - read() returned -1 when the data was 0xff
2011-12-11 22:59:37 +00:00
zzz
8448001a17 * I2NP:
- Deprecate unused stream methods and I2NPMessageReader since
      all transports provide encapsulation.
    - Don't throw IOE from byte array methods
    - Use cached null cert in GarlicClove
    - Add method to limit size of buffer to read
    - Don't check checksum at input, in most cases
    - Reuse checksum at output, for unomodified pass-through messages
      (but recalculating it now and logging on a mismatch for testing)
    - Fix DatabaseLookupMessage to internally store the don't include peers as
      a List, not a Set, so it doesn't get reordered and break the checksum
    - Log cleanup
  * NTCP:
    - Zero-copy and limit size when handing buffer to I2NP
    - Log hex dump message on I2NPMessageException, like in SSU
    - Don't close connection on I2NPMessageException
2011-12-11 21:04:43 +00:00
zzz
032b7d8230 merge of '0fc24e38cf763d87b57238415416a162be39e1ad'
and 'eb56602a5a6fb7a1d5b54be0a0618c0e861da10f'
2011-12-11 20:59:26 +00:00
sponge
6caa1c3e81 HTTP server tunnel, use log.WARN for 3 first minutes. (closes #460) 2011-12-11 17:22:28 +00:00
zzz
b47deadc97 log tweak 2011-12-11 13:54:03 +00:00
zzz
60e25b98b7 dont use stream method to avoid data copy 2011-12-11 13:40:06 +00:00
zzz
474909ae66 - Don't set the DatabaseLookupMessage dont-include collection until
it's complete, as DLM now makes a copy
- SearchState generics and cleanups
2011-12-11 13:37:42 +00:00
zzz
caada2bfa0 better logging of corrupted I2NP msgs 2011-12-11 13:36:50 +00:00
zzz
ec460794eb * PortMapper: New service for registering application ports in the context 2011-12-11 13:27:52 +00:00
kytv
929d471aa8 uname -s is sufficient
The OS' release version is discarded anyway....so we won't ask for it.
2011-12-11 12:52:32 +00:00
kytv
6c4dbc545d Redo functions to remove the dependency on bash 2011-12-11 12:50:24 +00:00
kytv
f8a3afd672 Enclose the tr parameters in quotes.
Without quotes will work in most shells but in some configurations it will fail.
2011-12-11 12:19:39 +00:00
kytv
5f81e923ca Change my earlier tests to something POSIX compliant
[ test $condition -a test $condition ] is only used in bash

(and I want to make this script work in any bourne compatible shell)
2011-12-11 11:56:59 +00:00
kytv
d9f5a8621d Enclose "tr" parameters in quotes 2011-12-11 11:50:41 +00:00
kytv
27d9616126 Remove the GNU-only -r parameter to sed
Revisiting this script now that I know a bit about regex.
2011-12-11 11:47:48 +00:00
kytv
50e3cdba05 Replace eepget's whitelist of allowed characters with the blacklist from i2psnark. (closes #562)
Thanks to zzz for pointing me in the right direction so I could fix my own bug. :)
2011-12-11 00:10:38 +00:00
kytv
6fa01a3b2d Better command to determine JAVABINARY
Switch to one awk command instead of using grep and cut.
2011-12-10 20:11:21 +00:00
kytv
fc7d8f72b0 merge of '20dbef275b439ce677bcad2e5044fbe2c3f2699b'
and '63fb5d00844b9465a8c7bfdece6a16946dd0085e'
2011-12-10 10:48:08 +00:00
kytv
03ff4dc0fd Add wrapper.java.maxmemory to debconf
The amount of RAM that I2P is limited to can be adjusted using debconf. The
value in /etc/i2p/wrapper.config is stored in the debconf db and is written to
/etc/default/i2p.
2011-12-10 02:17:37 +00:00
kytv
1d842f024a If dpkg -P i2p is run, remove /etc/default/i2p 2011-12-10 02:12:16 +00:00
zzz
1c4b0335a5 move error check to a better place 2011-12-09 23:01:19 +00:00
zzz
50606a6828 javadoc fix 2011-12-09 20:19:00 +00:00
zzz
25b0603fde * I2NP:
- Earlier detection and better logging of
      truncated TunnelGatewayMessage and DatabaseStoreMessage
    - Fix and enhance UnknownI2NPMessage implementation
    - Don't deserialize or verify the checksum of the
      embeddedI2NP message in the TunnelGatewayMessage
      at the IBGW, just use UnknownI2NPMessage and pass it along,
      except if zero hop; Still to do: similar thing at OBEP
    - Round expiration times when converting to/from seconds for SSU
    - Cleanups and javadoc
2011-12-09 17:36:49 +00:00
zzz
937ae8ad60 * UDP:
- Round expiration times when converting to seconds
    - Zero-copy of single-fragment messages in MessageReceiver
    - Optimizations, log tweaks, comments
2011-12-09 16:43:54 +00:00
zzz
6d4a9abd35 - Fix major bug from 2005 that corrupted outbound messages
that were an exact multiple of the fragment size.
2011-12-09 16:41:41 +00:00
zzz
533f7620ad bounds check 2011-12-09 13:19:18 +00:00
zzz
49d88f0060 * Console, i2psnark: More button CSS tweaks 2011-12-09 13:18:20 +00:00
zzz
1c4d1e9a62 * LeaseSet: Fix size calculations 2011-12-09 13:16:29 +00:00
zzz
51f20c2c33 * Base64: Add decodestring command in main() 2011-12-09 13:15:19 +00:00
zzz
258effcc84 * UDP PacketBuilder:
- Again allow transmitting all new acks if there is room;
      only limit resend acks
    - Sanity checks to limit to 255 acks
2011-12-07 00:51:31 +00:00
zzz
3bd641abd0 * UDP: Fix major MTU bug introduced in 0.8.9.
- Change large MTU from 1492 to 1484 and small from 608 to 620
      for encryption padding efficiency
    - Enforce sent MTU limit
    - Increase receive buffer size from 1536 to 1572 so that excessive-sized
      packets sent by 0.8.9-0.8.11 routers aren't dropped
    - Limit the max acks in a data packet
    - Limit the duplicate acks in successive data packets
    - Only include acks that will fit in the mtu in a data packet
    - Correctly remove acks from the pending set after they are sent,
      so they aren't sent repeatedly
    - Don't pad data packets unless necessary
    - Debug logging and javadocs
2011-12-06 21:50:33 +00:00
zzz
be1d95e991 form size increase to match future hq.postman.i2p limits 2011-12-06 21:49:55 +00:00
zzz
bd82a0c435 increase next hop send timeout; log tweaks 2011-12-06 21:49:23 +00:00
zzz
0f384c86fe * Router:
- More refactoring tasks to their own files
    - Adjust some thread priorities
2011-12-05 16:18:35 +00:00
zzz
5362e7cf15 comment out some stats 2011-12-05 16:17:29 +00:00
zzz
4c2c198c0a cleanup 2011-12-05 16:17:09 +00:00
zzz
51899e9ea0 CSS 2011-12-05 01:01:14 +00:00
zzz
3fc312a66b locking tweaks 2011-12-05 00:59:58 +00:00
zzz
e9d0d79809 * Tunnel RED:
- Complete rework of participating traffic RED.
      Implement an accurate bandwidth tracker in FIFOBandwidthRefiller.
    - Fix drop priority of VTBM at OBEP
    - Lower drop priority of VTBRM at IBGW
    - Raise threshold from 95% to 120%
    - Remove unused things in HopConfig
...needs more testing...
2011-12-04 19:01:52 +00:00
zzz
69cae1a052 cleanup 2011-12-04 18:53:24 +00:00
zzz
cc71e3a5ca useless null check removal 2011-12-04 18:52:31 +00:00
zzz
c5f98a04fa * Console:
- Less icons on configclients.jsp
    - Fix some browsers breaking line on negative numbers
    - Tab CSS tweaks
2011-12-04 18:52:17 +00:00
zzz
489a0ead14 * UDP: Fix i2np.udp.allowLocal operation (thx Quizzers) 2011-12-04 18:50:40 +00:00
zzz
88e7d60e3e * IRC Client: Lower log level for connect error to warn (thx echelon/sponge) 2011-12-04 18:49:50 +00:00
zzz
0d145fc77f * i2psnark: Fix directories not always deleted when torrent is deleted 2011-12-04 18:49:07 +00:00
zzz
b2e4ab4a30 merge of '400a5244d9222e3fa5b59c06d1d1e2aff96bc0ad'
and 'cd21f20ad4b02cde232d083cca6b68b8c3097edc'
2011-12-02 18:02:10 +00:00
zzz
c9cccd7581 * Console:
- Summary bar tweaks
    - Config nav CSS tabs
    - CSS cleanups from last checkin
2011-12-02 17:21:04 +00:00
echelon
58f562d1bd added irc.echelon.i2p to list of IRC servers 2011-12-02 17:15:07 +00:00
zzz
0a76a0db22 * Susimail:
- Login screen tweaks
    - Cleanups, generics, static
2011-12-02 17:05:08 +00:00
zzz
080cc962fb * Console:
- Split up config network page
    - CSS tweaks and cleanups
    - Change some form notices to errors
    - Spiff up the buttons

    new silk icons: See licenses/LICENSE-SilkIcons.txt
    new toopie icon: Shrunk from existing one
2011-11-30 23:23:41 +00:00
zzz
b3fcdb8e46 * Throttle: Update throttle status immediately on shutdown request;
clear starting-up message after 20 minutes
2011-11-30 23:17:40 +00:00
zzz
f6cff78528 * IRC Server: Fix IOOBE (ticket #559) 2011-11-30 23:16:29 +00:00
zzz
5fd20fc77c * i2psnark:
- Retry link on torrent download fail
    - Clear URL after clicking 'add torrent'
    - Message tweaks
    - CSS tweaks
2011-11-30 23:15:22 +00:00
zzz
9ae07688a5 move dummy implementations to their own directory 2011-11-29 19:32:20 +00:00
zzz
9a2a51518a -12 2011-11-29 15:33:37 +00:00
zzz
c0b9fe0340 * Router: Refactor periodic tasks to their own files 2011-11-29 15:25:40 +00:00
zzz
d3564dfcb5 * Random: Use new nextBytes(buf, off, len) for efficiency 2011-11-29 13:54:19 +00:00
zzz
8480788856 -11 2011-11-28 23:04:48 +00:00
zzz
6bcf40b41a merge of '31dc69e6816f5a08d4183272f46d23e9c397f9c6'
and 'da86088817442e065e854274adbd896a92ee148f'
2011-11-28 22:58:08 +00:00
zzz
6b811b36b9 replace more equalsIgnoreCase() calls 2011-11-28 22:55:10 +00:00
zzz
8619fd2c05 dont use equalsIgnoreCase() for booleans 2011-11-28 21:52:49 +00:00
zzz
d9dcb1e583 * Specify locale in all toLowerCase() and toUpperCase() calls to
avoid "Turkish four i problem"
2011-11-28 20:32:23 +00:00
zzz
bf461ee77e * Update: Files listed in deletelist.txt will be deleted 2011-11-28 18:00:36 +00:00
kytv
2537f48d08 Add (more) IRCop (and other safe) commands to the IRCfilter whitelist 2011-11-28 17:42:28 +00:00
zzz
1339209fa9 * Reseed:
- Restore i2pbote (ticket #516)
    - Remove r31453 (cert expiring, host soon to be shut down permanently)
2011-11-27 19:06:40 +00:00
zzz
8744c83ff6 optimize outbound whitelist 2011-11-27 19:05:38 +00:00
zzz
09731ffd3a NPE fix tweak 2011-11-26 23:22:01 +00:00
zzz
6d5678c14e pumper NPE fix 2011-11-26 22:57:23 +00:00
zzz
e4004e6f83 socket error log fix 2011-11-26 22:20:31 +00:00
zzz
17773a2de9 merge of '0df36c67913504a966d734f799d1bb39bf358396'
and '220f8941ffde39c665c1213cbc27037defb3527f'
2011-11-26 22:13:07 +00:00
kytv
97ead4cdd6 -7 (b/c of irc filtering changes) 2011-11-24 18:28:40 +00:00
kytv
18c850c085 commands that are commonly used by IRCops. Should be harmless. 2011-11-24 18:27:55 +00:00
kytv
6b49c03eb8 Add MOTD and ADMIN to the "do not filter" list 2011-11-24 10:42:18 +00:00
kytv
95dd34f009 Since they're harmless, add default unrealircd aliases to the "don't filter"
list.
2011-11-24 10:40:15 +00:00
zzz
f630d2dd27 * NTCP:
- More optimizations in recvEncrypted()
    - More efficient XOR
    - Reduce bandwidth stat update frequency
    - Check for repeated zero-length reads
2011-11-23 23:36:37 +00:00
zzz
f69f06b038 * Tunnel encryption: More efficient XOR 2011-11-23 22:25:36 +00:00
zzz
5a934050d4 * CryptixAESEngine: Fix bogus bounds checks 2011-11-23 22:12:47 +00:00
zzz
df8cd90b85 * RandomSource: Add new method getBytes(buf, offset, length) 2011-11-23 22:10:34 +00:00
kytv
85d7cfb9e0 Remove broken if statement
Tanuki's script has a broken check for 
OSX versions older than Leopard that sets
the CPU bitness to 32 for < 10.5. Since the
doesn't even work on Tiger (or older) (and
our binary is quad-FAT), this check is not 
neeeded.
2011-11-21 22:02:41 +00:00
kytv
f97779bed7 fix stupid typo by adding a missing ! (*facepalm*) 2011-11-21 21:36:49 +00:00
kytv
f4f5873692 minor HTML fixes, trailing space removal 2011-11-21 20:18:26 +00:00
zzz
f3e2dfacdf stat cleanups 2011-11-21 19:06:17 +00:00
zzz
9d0bafb8fa comment out debug code in initialization 2011-11-21 18:40:36 +00:00
zzz
1119612684 * NTCP Pumper:
- Ensure failsafe pumper code gets run on schedule
    - Don't copy the read buffers
    - Adjust minimum read buffers based on memory
    - New i2np.ntcp.useDirectBuffer option (default false)
    - Mark peer unreachable when read failure is during establishment
    - Change some Reader Lists to Sets to avoid linear search
    - Log tweaks, debugging, new loop stats
2011-11-21 18:22:13 +00:00
zzz
dc6c568e9f equals optimization 2011-11-21 15:29:11 +00:00
zzz
bef8fe0c8c spacing 2011-11-21 15:28:19 +00:00
zzz
3e97958100 * NTCP:
- First cut at improving EventPumper performance (ticket #551)
    - Establishment timeout cleanup/concurrent
    - Remove some logging and stats
    - Switch some Queues from LBQ to CLQ
    - Static ByteBuffer cache
2011-11-18 16:21:18 +00:00
zzz
cac1ad35bf reorder susidns xml changes 2011-11-18 16:20:39 +00:00
zzz
579af7e3ad build fix 2011-11-16 13:29:26 +00:00
zzz
e4ee5e3016 * NTCP: Reduce log level for race (ticket #392)
* NTCPConnection: Concurrent PrepBufs
  * OutNetMessage: Remove some fields and methods used only in NTCP debugging
2011-11-16 01:00:08 +00:00
zzz
caaa8dacad cleanup 2011-11-16 00:57:40 +00:00
zzz
ff499844a2 * Router: Move router.ping file from temp directory to config directory 2011-11-16 00:56:45 +00:00
zzz
97fe1baf6a * Console: Add Jetty version to logs page 2011-11-16 00:48:17 +00:00
zzz
7aff01ea84 * SusiDNS: Remove .jsp suffixes 2011-11-14 15:06:23 +00:00
zzz
7f467dbdc8 cleanups 2011-11-14 15:05:26 +00:00
zzz
0675c4caeb * Profiles: Only use same-country metric for countries with
lots of I2P users
2011-11-14 15:04:27 +00:00
zzz
66f25e845a * Console: Remove % chart at bottom of tunnels.jsp 2011-11-14 15:02:57 +00:00
zzz
fcbee9d9c5 * Installer: Fix Ukrainian translation (ticket #550) thx rndnick 2011-11-12 13:55:46 +00:00
zzz
624badfb5f * Console:
- Less magic and fix img sizes, for speed and less artifacts while rendering
    - CSS tweaks
2011-11-11 02:50:55 +00:00
kytv
4677b27e49 Minor and maybe pointless change: We use monotone to manage the i2p source. Any
other DVCSes that I2P may be managed in aren't official.
2011-11-10 12:25:30 +00:00
zzz
f9c3d58b47 -1 2011-11-09 23:31:25 +00:00
zzz
5b5c39bf45 merge of '95d0c51104a5fdcaa83228fbf9016b66b6227600'
and 'fb96ae6d12deead2b45984e33fcfeedb4641b3ac'
2011-11-09 23:27:45 +00:00
zzz
37e3e9e2cf * Console: Add ability to hide news 2011-11-09 18:38:39 +00:00
zzz
af42b9e9a8 * Router: Clean up config map methods and uses 2011-11-09 18:36:32 +00:00
zzz
3fbe8e70e6 * wrapper.config: Increase shutdown timeout 2011-11-09 18:33:06 +00:00
zzz
6a234759d5 * I2PTunnel IRC Client: Don't filter PASS (ticket #549) 2011-11-09 18:32:01 +00:00
zzz
85a8b587cd License corrections that should make things more compatible:
Jetty and commons logging are now Apache 2.0 (not 1.1)
    systray4j.jar is LGPL (not GPL)
    Note where a later GPL version is allowed
2011-11-09 18:30:48 +00:00
kytv
6849427b4f *Sigh* The WRAPPER_CONF variable exists and I don't know why I didn't use it
before with my 'gentoo hack'.
2011-11-09 18:30:21 +00:00
kytv
bb1b9d63df <br/> is XHTML not HTML 2011-11-09 16:47:04 +00:00
kytv
5efd19e4e0 Add doctype, <title>, <p> tags. 2011-11-08 21:26:39 +00:00
kytv
c0a63bcd76 fix stupid packaging error brought about by my tweaks for Gentoo. 2011-11-08 21:00:41 +00:00
kytv
6fc0e0fe22 ticket #490 2011-11-08 14:40:24 +00:00
kytv
ef3f184233 Minor cleanups to the css files (no actual theme changes)
* Remove spaces before :
  * Remove traling spaces
  * Remove lines consisting of spaces
  * Ensure spaces before {
  * Fix indentation in a couple of spots
2011-11-08 11:44:45 +00:00
520 changed files with 49815 additions and 23597 deletions

View File

@@ -2,6 +2,7 @@
source_file = apps/i2ptunnel/locale/messages_en.po
source_lang = en
trans.ar = apps/i2ptunnel/locale/messages_ar.po
trans.cs = apps/i2ptunnel/locale/messages_cs.po
trans.da = apps/i2ptunnel/locale/messages_da.po
trans.de = apps/i2ptunnel/locale/messages_de.po
trans.es = apps/i2ptunnel/locale/messages_es.po
@@ -18,8 +19,10 @@ trans.zh_CN = apps/i2ptunnel/locale/messages_zh.po
source_file = apps/routerconsole/locale/messages_en.po
source_lang = en
trans.ar = apps/routerconsole/locale/messages_ar.po
trans.cs = apps/routerconsole/locale/messages_cs.po
trans.da = apps/routerconsole/locale/messages_da.po
trans.de = apps/routerconsole/locale/messages_de.po
trans.et_EE = apps/routerconsole/locale/messages_ee.po
trans.es = apps/routerconsole/locale/messages_es.po
trans.fi = apps/routerconsole/locale/messages_fi.po
trans.fr = apps/routerconsole/locale/messages_fr.po
@@ -36,6 +39,7 @@ trans.zh_CN = apps/routerconsole/locale/messages_zh.po
source_file = apps/i2psnark/locale/messages_en.po
source_lang = en
trans.ar = apps/i2psnark/locale/messages_ar.po
trans.cs = apps/i2psnark/locale/messages_cs.po
trans.de = apps/i2psnark/locale/messages_de.po
trans.es = apps/i2psnark/locale/messages_es.po
trans.fr = apps/i2psnark/locale/messages_fr.po
@@ -52,6 +56,7 @@ trans.zh_CN = apps/i2psnark/locale/messages_zh.po
source_file = apps/susidns/locale/messages_en.po
source_lang = en
trans.ar = apps/susidns/locale/messages_ar.po
trans.cs = apps/susidns/locale/messages_cs.po
trans.da = apps/susidns/locale/messages_da.po
trans.de = apps/susidns/locale/messages_de.po
trans.es = apps/susidns/locale/messages_es.po
@@ -69,6 +74,7 @@ trans.zh_CN = apps/susidns/locale/messages_zh.po
source_file = apps/desktopgui/locale/messages_en.po
source_lang = en
trans.ar = apps/desktopgui/locale/messages_ar.po
trans.cs = apps/desktopgui/locale/messages_cs.po
trans.da = apps/desktopgui/locale/messages_da.po
trans.de = apps/desktopgui/locale/messages_de.po
trans.es = apps/desktopgui/locale/messages_es.po
@@ -85,6 +91,7 @@ trans.zh_CN = apps/desktopgui/locale/messages_zh.po
[I2P.susimail]
source_file = apps/susimail/locale/messages_en.po
source_lang = en
trans.cs = apps/susimail/locale/messages_cs.po
trans.de = apps/susimail/locale/messages_de.po
trans.es = apps/susimail/locale/messages_es.po
trans.fr = apps/susimail/locale/messages_fr.po
@@ -100,6 +107,7 @@ trans.zh_CN = apps/susimail/locale/messages_zh.po
[I2P.debconf]
source_file = debian/po/templates.pot
source_lang = en
trans.cs = debian/po/cs.po
trans.de = debian/po/de.po
trans.es = debian/po/es.po
trans.pl = debian/po/pl.po

View File

@@ -4,25 +4,38 @@ Prerequisites to build from source:
Java SDK (preferably Oracle/Sun or OpenJDK) 1.6.0 or higher
Non-linux operating systems and JVMs: See http://trac.i2p2.de/wiki/java
Apache Ant 1.7.0 or higher
Optional, For multilanguage support: The xgettext, msgfmt, and msgmerge tools installed
The xgettext, msgfmt, and msgmerge tools installed
from the GNU gettext package http://www.gnu.org/software/gettext/
To build and install I2P from source, you must first build
and package up the appropriate installer by running:
ant pkg
ant pkg
On non-x86, use one of the following instead:
ant installer-linux
ant installer-freebsd
ant installer-osx
This will produce a few key files:
* install.jar: the GUI and console installer
* i2pinstall.exe: the GUI and console installer wrapped for cross-platform execution
(only created with ant pkg)
* i2pupdate.zip: the update package
(only created with ant pkg)
From there, you can run the headless (console mode) installer:
java -jar i2pinstall.exe -console
or
java -jar i2pinstall.jar -console
Or run the GUI installer:
java -jar i2pinstall.exe
or
java -jar i2pinstall.jar
or on Windows, just double-click on i2pinstall.exe.
Or move the i2pupdate.zip file into an existing installation directory and restart.

View File

@@ -2,7 +2,7 @@ This product includes both public domain code and licensed code as described bel
For all code, unless otherwise stated in the appropriate license, the following applies:
NO WARRANTY
NO WARRANTY
BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
@@ -92,34 +92,34 @@ Installer:
See licenses/LICENSE-Launch4j.txt (in binary packages)
See installer/lib/launch4j/LICENSE.txt (in source packages)
The following projects are used by Launch4j...
MinGW binutils (http://www.mingw.org/)
MinGW binutils (http://www.mingw.org/)
Commons BeanUtils (http://jakarta.apache.org/commons/beanutils/)
Commons BeanUtils (http://jakarta.apache.org/commons/beanutils/)
Commons Logging (http://jakarta.apache.org/commons/logging/)
See licenses/LICENSE-Apache1.1.txt
Commons Logging (http://jakarta.apache.org/commons/logging/)
See licenses/LICENSE-Apache2.0.txt
See licenses/NOTICE-Commons-Logging.txt
XStream (http://xstream.codehaus.org/)
XStream (http://xstream.codehaus.org/)
Copyright (c) 2003-2004, Joe Walnes
See licenses/LICENSE-XStream.txt
JGoodies Forms (http://www.jgoodies.com/freeware/forms/)
JGoodies Forms (http://www.jgoodies.com/freeware/forms/)
Copyright (c) 2002-2004 JGoodies Karsten Lentzsch. All rights reserved.
See licenses/LICENSE-JGoodies-Forms.txt
JGoodies Looks (http://www.jgoodies.com/freeware/looks/)
JGoodies Looks (http://www.jgoodies.com/freeware/looks/)
Copyright (c) 2003 JGoodies Karsten Lentzsch. All rights reserved.
See licenses/LICENSE-JGoodies-Looks.txt
Foxtrot (http://foxtrot.sourceforge.net/)
Foxtrot (http://foxtrot.sourceforge.net/)
Copyright (c) 2002, Simone Bordet & Marco Cravero. All rights reserved.
See licenses/LICENSE-Foxtrot.txt
Nuvola Icon Theme (http://www.icon-king.com)
Nuvola Icon Theme (http://www.icon-king.com)
See licenses/LICENSE-LGPLv2.1.txt
Forms were created using Abeille Forms Designer (https://abeille.dev.java.net/)
Forms were created using Abeille Forms Designer (https://abeille.dev.java.net/)
Izpack 4.3.0:
Copyright (c) 2001-2008 Julien Ponge
@@ -127,7 +127,7 @@ Installer:
Java Service Wrapper Community Edition 32-bit 3.5.9:
Java Service Wrapper Community Edition 32-bit 3.5.13:
Copyright (C) 1999-2011 Tanuki Software, Ltd. All Rights Reserved.
See licenses/LICENSE-Wrapper.txt
@@ -135,10 +135,6 @@ Java Service Wrapper Community Edition 32-bit 3.5.9:
Jbigi Libraries (jbigi.jar):
JNI code public domain.
GMP 4.1.3 / 4.1.4:
Copyright 1991, 1996, 1999, 2000 Free Software Foundation, Inc.
See licenses/LICENSE-LGPLv2.1.txt
GMP 4.3.2 / 5.0.2:
Copyright 1991, 1996, 1999, 2000, 2007 Free Software Foundation, Inc.
See licenses/LICENSE-LGPLv3.txt
@@ -156,18 +152,19 @@ Applications:
I2PSnark:
Copyright (C) 2003 Mark J. Wielaard
GPLv2 (or any later version)
See licenses/LICENSE-GPLv2.txt
Silk icons: See licenses/LICENSE-SilkIcons.txt
I2PTunnel:
(c) 2003 - 2004 mihi
GPLv2 with exception.
GPLv2 (or any later version) with exception.
See licenses/LICENSE-I2PTunnel.txt
See licenses/LICENSE-GPLv2.txt
I2PTunnel SOCKS Proxy:
Copyright (c) 2004 by human
GPLv2 with exception.
GPLv2 (or any later version) with exception.
See licenses/LICENSE-I2PTunnel.txt
See licenses/LICENSE-GPLv2.txt
@@ -177,7 +174,6 @@ Applications:
Jetty 5.1.15:
Copyright 2000-2004 Mort Bay Consulting Pty. Ltd.
See licenses/LICENSE-Apache1.1.txt
See licenses/LICENSE-Apache2.0.txt
See licenses/NOTICE-Commons-Logging.txt
@@ -197,7 +193,7 @@ Applications:
Flag icons:
- Jersey and EU flag icons: public domain, courtesy Xrmap flag
collection http://www.arvernes.com/wiki/index.php/Xrmap
- Guernsey flag from the Open Clip Art Library, released into the public domain
- Guernsey and Isle of Man flags from the Open Clip Art Library, released into the public domain
- All other flag icons: public domain, courtesy mjames@gmail.com http://www.famfamfam.com/
Silk icons: See licenses/LICENSE-SilkIcons.txt
@@ -217,18 +213,20 @@ Applications:
SusiDNS:
Copyright (C) 2005 <susi23@mail.i2p>
GPLv2 (or any later version)
See licenses/LICENSE-GPLv2.txt
Uses Apache Jakarta Standard Tag Library 1.1.2:
See licenses/LICENSE-Apache2.0.txt
SusiMail:
Copyright (C) 2004-2005 <susi23@mail.i2p>
GPLv2 (or any later version)
See licenses/LICENSE-GPLv2.txt
Systray:
Public domain.
Bundles systray4j code:
See licenses/LICENSE-GPLv2.txt
Bundles systray4j-2.4.1:
See licenses/LICENSE-LGPLv2.1.txt

View File

@@ -2,11 +2,18 @@ Prerequisites to build from source:
Java SDK (preferably Oracle/Sun or OpenJDK) 1.6.0 or higher
Non-linux operating systems and JVMs: See http://trac.i2p2.de/wiki/java
Apache Ant 1.7.0 or higher
Optional, For multilanguage support: The xgettext, msgfmt, and msgmerge tools installed
The xgettext, msgfmt, and msgmerge tools installed
from the GNU gettext package http://www.gnu.org/software/gettext/
To build:
ant pkg
On x86 systems do:
ant pkg
On non-x86, use one of the following instead:
ant installer-linux
ant installer-freebsd
ant installer-osx
Run 'ant' with no arguments to see other build options.
See INSTALL.txt or http://www.i2p2.de/download.html for installation instructions.

View File

@@ -29,6 +29,7 @@ import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;
import java.util.Locale;
import java.util.Properties;
import java.util.StringTokenizer;
import java.util.concurrent.atomic.AtomicBoolean;
@@ -434,7 +435,7 @@ public class DoCMDS implements Runnable {
if (token.countTokens() != 0) {
Command = token.nextToken();
Command =
Command.toLowerCase();
Command.toLowerCase(Locale.US);
if (token.countTokens() != 0) {
Arg = token.nextToken();
} else {

View File

@@ -30,6 +30,7 @@ import java.io.OutputStream;
import java.net.ConnectException;
import java.net.NoRouteToHostException;
import java.net.Socket;
import java.util.Locale;
import java.util.concurrent.atomic.AtomicBoolean;
import net.i2p.I2PException;
import net.i2p.client.streaming.I2PSocket;
@@ -144,7 +145,7 @@ public class TCPtoI2P implements Runnable {
in = sock.getInputStream();
out = sock.getOutputStream();
line = lnRead(in);
input = line.toLowerCase();
input = line.toLowerCase(Locale.US);
Destination dest = null;
if (input.endsWith(".i2p")) {
//dest = I2PTunnel.destFromName(input);

View File

@@ -55,6 +55,7 @@
<property name="workspace.changes" value="" />
<manifest>
<attribute name="Main-Class" value="addressbook.Daemon"/>
<attribute name="Implementation-Version" value="${full.version}" />
<attribute name="Build-Date" value="${build.timestamp}" />
<attribute name="Base-Revision" value="${workspace.version}" />
<attribute name="Workspace-Changes" value="${workspace.changes}" />
@@ -73,6 +74,7 @@
<property name="workspace.changes.tr" value="" />
<war basedir="${dist}/tmp" webxml="web.xml" destfile="${dist}/${war}">
<manifest>
<attribute name="Implementation-Version" value="${full.version}" />
<attribute name="Build-Date" value="${build.timestamp}" />
<attribute name="Base-Revision" value="${workspace.version}" />
<attribute name="Workspace-Changes" value="${workspace.changes.tr}" />

View File

@@ -27,6 +27,7 @@ import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Iterator;
import java.util.Locale;
import java.util.Map;
import java.util.NoSuchElementException;
@@ -71,7 +72,7 @@ class ConfigIterator implements Iterator<Map.Entry<String, String>> {
inputLine = ConfigParser.stripComments(inputLine);
String[] splitLine = inputLine.split("=");
if (splitLine.length == 2) {
next = new ConfigEntry(splitLine[0].trim().toLowerCase(), splitLine[1].trim());
next = new ConfigEntry(splitLine[0].trim().toLowerCase(Locale.US), splitLine[1].trim());
return true;
}
inputLine = input.readLine();

View File

@@ -32,6 +32,7 @@ import java.io.StringReader;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import net.i2p.util.SecureFile;
@@ -92,7 +93,7 @@ class ConfigParser {
inputLine = ConfigParser.stripComments(inputLine);
String[] splitLine = inputLine.split("=");
if (splitLine.length == 2) {
result.put(splitLine[0].trim().toLowerCase(), splitLine[1].trim());
result.put(splitLine[0].trim().toLowerCase(Locale.US), splitLine[1].trim());
}
inputLine = input.readLine();
}

View File

@@ -0,0 +1,55 @@
# I2P
# Copyright (C) 2009 The I2P Project
# This file is distributed under the same license as the desktopgui package.
# To contribute translations, see http://www.i2p2.de/newdevelopers
#
# Translators:
msgid ""
msgstr ""
"Project-Id-Version: I2P\n"
"Report-Msgid-Bugs-To: https://trac.i2p2.de/\n"
"POT-Creation-Date: 2011-03-03 18:29+0000\n"
"PO-Revision-Date: 2012-02-12 19:44+0000\n"
"Last-Translator: Waseihou Watashi <waseihou@gmail.com>\n"
"Language-Team: Czech (http://www.transifex.net/projects/p/I2P/language/cs/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: cs\n"
"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2\n"
#: src/net/i2p/desktopgui/ExternalTrayManager.java:23
msgid "Start I2P"
msgstr "Spustit I2P"
#: src/net/i2p/desktopgui/ExternalTrayManager.java:38
msgid "I2P is starting!"
msgstr "I2P startuje!"
#: src/net/i2p/desktopgui/ExternalTrayManager.java:38
msgid "Starting"
msgstr "Startuji"
#: src/net/i2p/desktopgui/InternalTrayManager.java:26
msgid "Launch I2P Browser"
msgstr "Spouštím I2P Browser"
#: src/net/i2p/desktopgui/InternalTrayManager.java:50
msgid "Configure desktopgui"
msgstr "Nastavuji desktopgui"
#: src/net/i2p/desktopgui/InternalTrayManager.java:67
msgid "Restart I2P"
msgstr "Restart I2P"
#: src/net/i2p/desktopgui/InternalTrayManager.java:85
msgid "Stop I2P"
msgstr "Zastavit I2P"
#: src/net/i2p/desktopgui/gui/DesktopguiConfigurationFrame.java:44
msgid "Tray icon configuration"
msgstr "Nastavení ikony na liště (tray icon)"
#: src/net/i2p/desktopgui/gui/DesktopguiConfigurationFrame.java:47
msgid "Should tray icon be enabled?"
msgstr "Zapnout ikonu na liště?"

View File

@@ -60,6 +60,7 @@
<manifest>
<attribute name="Main-Class" value="org.klomp.snark.Snark" />
<attribute name="Class-Path" value="i2p.jar mstreaming.jar streaming.jar" />
<attribute name="Implementation-Version" value="${full.version}" />
<attribute name="Build-Date" value="${build.timestamp}" />
<attribute name="Base-Revision" value="${workspace.version}" />
<attribute name="Workspace-Changes" value="${workspace.changes.tr}" />
@@ -98,6 +99,7 @@
<!-- include only the web stuff, as of 0.7.12 the router will add i2psnark.jar to the classpath for the war -->
<classes dir="./build/obj" includes="**/web/*.class" />
<manifest>
<attribute name="Implementation-Version" value="${full.version}" />
<attribute name="Build-Date" value="${build.timestamp}" />
<attribute name="Base-Revision" value="${workspace.version}" />
<attribute name="Workspace-Changes" value="${workspace.changes.tr}" />

View File

@@ -23,11 +23,15 @@ package org.klomp.snark;
import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.charset.Charset;
import java.nio.charset.CharsetEncoder;
import java.security.MessageDigest;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.StringTokenizer;
import java.util.concurrent.ConcurrentHashMap;
import net.i2p.crypto.SHA1;
import net.i2p.util.SecureFile;
@@ -67,6 +71,8 @@ public class Storage
public static final int MAX_PIECES = 10*1024;
public static final long MAX_TOTAL_SIZE = MAX_PIECE_SIZE * (long) MAX_PIECES;
private static final Map<String, String> _filterNameCache = new ConcurrentHashMap();
/**
* Creates a new storage based on the supplied MetaInfo. This will
* try to create and/or check all needed files in the MetaInfo.
@@ -563,25 +569,61 @@ public class Storage
'<', '>', ':', '"', '/', '\\', '|', '?', '*',
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
0x7f };
0x7f,
0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f,
// unicode newlines
0x2028, 0x2029
};
/**
* Removes 'suspicious' characters from the given file name.
* http://msdn.microsoft.com/en-us/library/aa365247%28VS.85%29.aspx
* Then replace chars not supported in the charset.
*
* This is called frequently and it can be pretty slow so cache the result.
*
* TODO: If multiple files in the same torrent map to the same filter name,
* the whole torrent will blow up. Check at torrent creation?
*/
public static String filterName(String name)
{
if (name.equals(".") || name.equals(" "))
return "_";
String rv = name;
if (rv.startsWith("."))
rv = '_' + rv.substring(1);
if (rv.endsWith(".") || rv.endsWith(" "))
rv = rv.substring(0, rv.length() - 1) + '_';
for (int i = 0; i < ILLEGAL.length; i++) {
if (rv.indexOf(ILLEGAL[i]) >= 0)
rv = rv.replace(ILLEGAL[i], '_');
String rv = _filterNameCache.get(name);
if (rv != null)
return rv;
if (name.equals(".") || name.equals(" ")) {
rv = "_";
} else {
rv = name;
if (rv.startsWith("."))
rv = '_' + rv.substring(1);
if (rv.endsWith(".") || rv.endsWith(" "))
rv = rv.substring(0, rv.length() - 1) + '_';
for (int i = 0; i < ILLEGAL.length; i++) {
if (rv.indexOf(ILLEGAL[i]) >= 0)
rv = rv.replace(ILLEGAL[i], '_');
}
// Replace characters not supported in the charset
if (!Charset.defaultCharset().name().equals("UTF-8")) {
try {
CharsetEncoder enc = Charset.defaultCharset().newEncoder();
if (!enc.canEncode(rv)) {
String repl = rv;
for (int i = 0; i < rv.length(); i++) {
char c = rv.charAt(i);
if (!enc.canEncode(c))
repl = repl.replace(c, '_');
}
rv = repl;
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
_filterNameCache.put(name, rv);
return rv;
}

View File

@@ -30,6 +30,7 @@ import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import java.util.Random;
import java.util.Set;
@@ -325,7 +326,7 @@ public class TrackerClient extends I2PAppThread
// don't show secondary tracker problems to the user
if (tr.isPrimary)
snark.setTrackerProblems(tr.trackerProblems);
if (tr.trackerProblems.toLowerCase().startsWith(NOT_REGISTERED)) {
if (tr.trackerProblems.toLowerCase(Locale.US).startsWith(NOT_REGISTERED)) {
// Give a guy some time to register it if using opentrackers too
if (trackers.size() == 1) {
stop = true;

View File

@@ -14,6 +14,7 @@ import java.util.Comparator;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
@@ -245,6 +246,9 @@ public class I2PSnarkServlet extends Default {
}
}
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"));
out.write("<div class=\"page\"><div class=\"mainsection\"><div class=\"snarkMessages\"><table><tr><td align=\"left\"><pre>");
List msgs = _manager.getMessages();
for (int i = msgs.size()-1; i >= 0; i--) {
@@ -490,6 +494,8 @@ public class I2PSnarkServlet extends Default {
*****/
if (newURL != null) {
if (newURL.startsWith("http://")) {
if (!_manager.util().connected())
_manager.addMessage(_("Opening the I2P tunnel"));
_manager.addMessage(_("Fetching {0}", urlify(newURL)));
I2PAppThread fetch = new I2PAppThread(new FetchAndAdd(_manager, newURL), "Fetch and add", true);
fetch.start();
@@ -578,7 +584,7 @@ public class I2PSnarkServlet extends Default {
File f = new File(name);
f.delete();
_manager.addMessage(_("Torrent file deleted: {0}", f.getAbsolutePath()));
List files = meta.getFiles();
List<List<String>> files = meta.getFiles();
String dataFile = snark.getBaseName();
f = new File(_manager.getDataDir(), dataFile);
if (files == null) { // single file torrent
@@ -588,23 +594,36 @@ public class I2PSnarkServlet extends Default {
_manager.addMessage(_("Data file could not be deleted: {0}", f.getAbsolutePath()));
break;
}
for (int i = 0; i < files.size(); i++) { // pass 1 delete files
// step 1 delete files
for (int i = 0; i < files.size(); i++) {
// multifile torrents have the getFiles() return lists of lists of filenames, but
// each of those lists just contain a single file afaict...
File df = Storage.getFileFromNames(f, (List) files.get(i));
File df = Storage.getFileFromNames(f, files.get(i));
if (df.delete())
_manager.addMessage(_("Data file deleted: {0}", df.getAbsolutePath()));
else
_manager.addMessage(_("Data file could not be deleted: {0}", df.getAbsolutePath()));
}
for (int i = files.size() - 1; i >= 0; i--) { // pass 2 delete dirs - not foolproof,
// we could sort and do a strict bottom-up
File df = Storage.getFileFromNames(f, (List) files.get(i));
df = df.getParentFile();
if (df == null || !df.exists())
continue;
if(df.delete())
// step 2 make Set of dirs with reverse sort
Set<File> dirs = new TreeSet(Collections.reverseOrder());
for (List<String> list : files) {
for (int i = 1; i < list.size(); i++) {
dirs.add(Storage.getFileFromNames(f, list.subList(0, i)));
}
}
// step 3 delete dirs bottom-up
for (File df : dirs) {
if (df.delete()) {
_manager.addMessage(_("Data dir deleted: {0}", df.getAbsolutePath()));
} else if (_log.shouldLog(Log.WARN)) {
_log.warn("Could not delete dir " + df);
}
}
// step 4 delete base
if (f.delete()) {
_manager.addMessage(_("Data dir deleted: {0}", f.getAbsolutePath()));
} else if (_log.shouldLog(Log.WARN)) {
_log.warn("Could not delete dir " + f);
}
break;
}
@@ -727,10 +746,10 @@ public class I2PSnarkServlet extends Default {
l = l.substring(skip.length());
if (r.startsWith(skip))
r = r.substring(skip.length());
String llc = l.toLowerCase();
String llc = l.toLowerCase(Locale.US);
if (llc.startsWith("the ") || llc.startsWith("the.") || llc.startsWith("the_"))
l = l.substring(4);
String rlc = r.toLowerCase();
String rlc = r.toLowerCase(Locale.US);
if (rlc.startsWith("the ") || rlc.startsWith("the.") || rlc.startsWith("the_"))
r = r.substring(4);
return collator.compare(l, r);
@@ -881,13 +900,14 @@ public class I2PSnarkServlet extends Default {
out.write(trackerLink);
}
String encodedBaseName = urlEncode(snark.getBaseName());
// File type icon column
out.write("</td>\n<td class=\"" + rowClass + "\">");
if (isValid) {
// Link to local details page - note that trailing slash on a single-file torrent
// gets us to the details page instead of the file.
StringBuilder buf = new StringBuilder(128);
buf.append("<a href=\"").append(snark.getBaseName())
buf.append("<a href=\"").append(encodedBaseName)
.append("/\" title=\"").append(_("Torrent details"))
.append("\">");
out.write(buf.toString());
@@ -910,7 +930,7 @@ public class I2PSnarkServlet extends Default {
out.write("</td><td class=\"snarkTorrentName " + rowClass + "\">");
if (remaining == 0 || isMultiFile) {
StringBuilder buf = new StringBuilder(128);
buf.append("<a href=\"").append(snark.getBaseName());
buf.append("<a href=\"").append(encodedBaseName);
if (isMultiFile)
buf.append('/');
buf.append("\" title=\"");
@@ -1173,8 +1193,9 @@ public class I2PSnarkServlet extends Default {
}
private void writeAddForm(PrintWriter out, HttpServletRequest req) throws IOException {
// display incoming parameter if a GET so links will work
String newURL = req.getParameter("newURL");
if ( (newURL == null) || (newURL.trim().length() <= 0) )
if (newURL == null || newURL.trim().length() <= 0 || req.getMethod().equals("POST"))
newURL = "";
else
newURL = DataHelper.stripHTML(newURL); // XSS
@@ -1219,7 +1240,7 @@ public class I2PSnarkServlet extends Default {
else
baseFile = DataHelper.stripHTML(baseFile); // XSS
out.write("<div class=\"newtorrentsection\"><div class=\"snarkNewTorrent\">\n");
out.write("<a name=\"add\"></a><div class=\"newtorrentsection\"><div class=\"snarkNewTorrent\">\n");
// *not* enctype="multipart/form-data", so that the input type=file sends the filename, not the file
out.write("<form action=\"_post\" method=\"POST\">\n");
out.write("<input type=\"hidden\" name=\"nonce\" value=\"" + _nonce + "\" >\n");
@@ -1446,7 +1467,7 @@ public class I2PSnarkServlet extends Default {
out.write(": <td><textarea name=\"i2cpOpts\" cols=\"60\" rows=\"1\" wrap=\"off\" spellcheck=\"false\" >"
+ opts.toString() + "</textarea><br>\n" +
"<tr><td>&nbsp;<td><input type=\"submit\" value=\"");
"<tr><td>&nbsp;<td><input type=\"submit\" class=\"accept\" value=\"");
out.write(_("Save configuration"));
out.write("\" name=\"foo\" >\n" +
"</table></div></div></form>");
@@ -1603,10 +1624,15 @@ public class I2PSnarkServlet extends Default {
private static String urlify(String s) {
StringBuilder buf = new StringBuilder(256);
// browsers seem to work without doing this but let's be strict
String link = s.replace("&", "&amp;").replace(" ", "%20");
String link = urlEncode(s);
buf.append("<a href=\"").append(link).append("\">").append(link).append("</a>");
return buf.toString();
}
/** @since 0.8.13 */
private static String urlEncode(String s) {
return s.replace(";", "%3B").replace("&", "&amp;").replace(" ", "%20");
}
private static final String DOCTYPE = "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\n";
private static final String HEADER_A = "<link href=\"";
@@ -1739,7 +1765,14 @@ public class I2PSnarkServlet extends Default {
// We don't have the hash of the torrent file
//buf.append("<br>").append(_("Maggot link")).append(": <a href=\"").append(MAGGOT).append(hex).append(':').append(hex).append("\">")
// .append(MAGGOT).append(hex).append(':').append(hex).append("</a>");
buf.append("<br>").append(_("Torrent file")).append(": ").append(snark.getName());
buf.append("</div></th></tr>");
} else {
// shouldn't happen
buf.append("<tr><th>Not found<br>resource=\"").append(r.toString())
.append("\"<br>base=\"").append(base)
.append("\"<br>torrent=\"").append(torrentName)
.append("\"</th></tr>");
}
if (ls == null) {
// We are only showing the torrent info section
@@ -1836,7 +1869,7 @@ public class I2PSnarkServlet extends Default {
if (complete) {
buf.append("<a href=\"").append(path).append("\">");
// thumbnail ?
String plc = item.toString().toLowerCase();
String plc = item.toString().toLowerCase(Locale.US);
if (plc.endsWith(".jpg") || plc.endsWith(".jpeg") || plc.endsWith(".png") ||
plc.endsWith(".gif") || plc.endsWith(".ico")) {
buf.append("<img alt=\"\" border=\"0\" class=\"thumb\" src=\"")
@@ -1916,7 +1949,7 @@ public class I2PSnarkServlet extends Default {
// instead of this mishmash. We can't get to HttpContext.setMimeMapping()
// from here? We could do it from a web.xml perhaps.
// Or could we put our own org/mortbay/http/mime.properties file in the war?
String plc = path.toLowerCase();
String plc = path.toLowerCase(Locale.US);
String mime = getServletContext().getMimeType(path);
if (mime == null)
mime = "";
@@ -2039,13 +2072,31 @@ private static class FetchAndAdd implements Runnable {
try { if (in != null) in.close(); } catch (IOException ioe) {}
}
} else {
_manager.addMessage(_("Torrent was not retrieved from {0}", urlify(_url)));
// Generate a retry link, but sadly can't have a form inside a table
// So make this an ugly GET
StringBuilder buf = new StringBuilder(1024);
// FIXME don't lose peer setting
//String peerParam = req.getParameter("p");
//if (peerParam != null)
// buf.append("<input type=\"hidden\" name=\"p\" value=\"").append(peerParam).append("\" >\n");
buf.append(_("Torrent was not retrieved from {0}", urlify(_url)));
/**** FIXME ticket #575
String link = urlEncode(_url).replace(":", "%3A").replace("/", "%2F");
buf.append(" - [<a href=\"/i2psnark/?newURL=").append(link).append("#add\" >");
buf.append(_("Retry"));
buf.append("</a>]");
****/
_manager.addMessage(buf.toString());
}
} finally {
if (file != null) file.delete();
}
}
private String _(String s) {
return _manager.util().getString(s);
}
private String _(String s, String o) {
return _manager.util().getString(s, o);
}

View File

@@ -0,0 +1,988 @@
# I2P
# Copyright (C) 2009 The I2P Project
# This file is distributed under the same license as the i2psnark package.
# To contribute translations, see http://www.i2p2.de/newdevelopers
#
# Translators:
msgid ""
msgstr ""
"Project-Id-Version: I2P\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2012-02-17 11:41+0000\n"
"PO-Revision-Date: 2012-02-12 20:06+0000\n"
"Last-Translator: Waseihou Watashi <waseihou@gmail.com>\n"
"Language-Team: Czech (http://www.transifex.net/projects/p/I2P/language/cs/)\n"
"Language: cs\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2\n"
#: ../java/src/org/klomp/snark/SnarkManager.java:355
#, java-format
msgid "Total uploaders limit changed to {0}"
msgstr "Celkový limit sdílečů změněn na {0}"
#: ../java/src/org/klomp/snark/SnarkManager.java:357
#, java-format
msgid "Minimum total uploaders limit is {0}"
msgstr "Nejmenší celkový limit sdílečů je {0}"
#: ../java/src/org/klomp/snark/SnarkManager.java:369
#, java-format
msgid "Up BW limit changed to {0}KBps"
msgstr "Horní BW limit změněn na {0}KBps"
#: ../java/src/org/klomp/snark/SnarkManager.java:371
#, java-format
msgid "Minimum up bandwidth limit is {0}KBps"
msgstr "Nejmenší horní limit přenosové rychlist je {0}KBps"
#: ../java/src/org/klomp/snark/SnarkManager.java:383
#, java-format
msgid "Startup delay changed to {0}"
msgstr "Prodleva při startu změněna na {0}"
#: ../java/src/org/klomp/snark/SnarkManager.java:394
#, java-format
msgid "Refresh time changed to {0}"
msgstr "Doba aktualizace stavu (refresh time) změněna na {0}"
#: ../java/src/org/klomp/snark/SnarkManager.java:396
msgid "Refresh disabled"
msgstr "Aktualizace stavu vypnuta"
#: ../java/src/org/klomp/snark/SnarkManager.java:451
msgid "I2CP and tunnel changes will take effect after stopping all torrents"
msgstr "Změny I2CP a tunelu se projeví až po zastavení všech torrentů"
#: ../java/src/org/klomp/snark/SnarkManager.java:455
#, java-format
msgid "I2CP options changed to {0}"
msgstr "Nastavení (options) I2CP změněno na {0}"
#: ../java/src/org/klomp/snark/SnarkManager.java:460
msgid "Disconnecting old I2CP destination"
msgstr "Odpojuji se od starého I2CP cíle"
#: ../java/src/org/klomp/snark/SnarkManager.java:462
#, java-format
msgid "I2CP settings changed to {0}"
msgstr "Nastavení (settings) I2CP změněno na {0}"
#: ../java/src/org/klomp/snark/SnarkManager.java:467
msgid ""
"Unable to connect with the new settings, reverting to the old I2CP settings"
msgstr "Nemůžu se připojit s novým nastavením I2CP, vracím se k předhozímu."
#: ../java/src/org/klomp/snark/SnarkManager.java:471
msgid "Unable to reconnect with the old settings!"
msgstr "Nemohu se opětovně připojit ani s předchozím nastavením!"
#: ../java/src/org/klomp/snark/SnarkManager.java:473
msgid "Reconnected on the new I2CP destination"
msgstr "Opětovně připojeno k novému I2CP cíli"
#: ../java/src/org/klomp/snark/SnarkManager.java:480
#, java-format
msgid "I2CP listener restarted for \"{0}\""
msgstr "I2CP listener restartován pro \"{0}\""
#: ../java/src/org/klomp/snark/SnarkManager.java:492
msgid "New files will be publicly readable"
msgstr "Nové soubory budou veřejně přístupné"
#: ../java/src/org/klomp/snark/SnarkManager.java:494
msgid "New files will not be publicly readable"
msgstr "Nové soubory nebudou veřejně přístupné"
#: ../java/src/org/klomp/snark/SnarkManager.java:501
msgid "Enabled autostart"
msgstr "Automatické spuštění zapnuto"
#: ../java/src/org/klomp/snark/SnarkManager.java:503
msgid "Disabled autostart"
msgstr "Automatické spuštění vypnuto"
#: ../java/src/org/klomp/snark/SnarkManager.java:509
msgid "Enabled open trackers - torrent restart required to take effect."
msgstr "Zapnuto automatické spuštění"
#: ../java/src/org/klomp/snark/SnarkManager.java:511
msgid "Disabled open trackers - torrent restart required to take effect."
msgstr ""
"Otevřené trackery vypnuty - aby se změna projevila je nutné restartovat "
"všechny torrenty"
#: ../java/src/org/klomp/snark/SnarkManager.java:519
msgid "Open Tracker list changed - torrent restart required to take effect."
msgstr ""
"Seznam otevřených trackerů změněn - aby se změna projevila je nutné "
"restartovat všechny torrenty"
#: ../java/src/org/klomp/snark/SnarkManager.java:526
#, java-format
msgid "{0} theme loaded, return to main i2psnark page to view."
msgstr "Téma {0} bylo nahráno, přejděte prosím na hlavní stránku i2snark"
#: ../java/src/org/klomp/snark/SnarkManager.java:533
msgid "Configuration unchanged."
msgstr "Nastavení nebylo změněno."
#: ../java/src/org/klomp/snark/SnarkManager.java:543
#, java-format
msgid "Unable to save the config to {0}"
msgstr "Nemůžu uložit soubor s nastavením do souboru {0}"
#: ../java/src/org/klomp/snark/SnarkManager.java:608
msgid "Connecting to I2P"
msgstr "Připojuji se k I2P"
#: ../java/src/org/klomp/snark/SnarkManager.java:611
msgid "Error connecting to I2P - check your I2CP settings!"
msgstr ""
"Při připojování k I2P nastala chyba, zkontrolujte prosím nastavení I2CP!"
#: ../java/src/org/klomp/snark/SnarkManager.java:620
#, java-format
msgid "Error: Could not add the torrent {0}"
msgstr "Chyba: nepodařilo se přidat torrent {0}"
#. catch this here so we don't try do delete it below
#: ../java/src/org/klomp/snark/SnarkManager.java:642
#, java-format
msgid "Cannot open \"{0}\""
msgstr "Nejde otevřít \"{0}\""
#. TODO - if the existing one is a magnet, delete it and add the metainfo instead?
#: ../java/src/org/klomp/snark/SnarkManager.java:661
#: ../java/src/org/klomp/snark/SnarkManager.java:737
#: ../java/src/org/klomp/snark/SnarkManager.java:792
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2048
#, java-format
msgid "Torrent with this info hash is already running: {0}"
msgstr "Torrent s tímto infohašišem již běží: {0}"
#. addMessage(_("Warning - No I2P trackers in \"{0}\", will announce to I2P open trackers and DHT only.", info.getName()));
#: ../java/src/org/klomp/snark/SnarkManager.java:668
#, java-format
msgid ""
"Warning - No I2P trackers in \"{0}\", will announce to I2P open trackers "
"only."
msgstr ""
"Varování - v \"{0}\" nebyly nalezeny žádné I2P trackery, budou použity pouze "
"otevrené I2P trackery."
#. addMessage(_("Warning - No I2P trackers in \"{0}\", and DHT and open trackers are disabled, you should enable open trackers or DHT before starting the torrent.", info.getName()));
#: ../java/src/org/klomp/snark/SnarkManager.java:673
#, java-format
msgid ""
"Warning - No I2P Trackers found in \"{0}\". Make sure Open Tracker is "
"enabled before starting this torrent."
msgstr ""
"Varování - v \"{0}\" nebyly nalezeny žádné I2P trackery, před spuštěním "
"tohoto torrentu se ujistěte že otevřené trackery jsou povoleny."
#: ../java/src/org/klomp/snark/SnarkManager.java:694
#, java-format
msgid "Torrent in \"{0}\" is invalid"
msgstr "Torrent v \"{0}\" je chybný"
#: ../java/src/org/klomp/snark/SnarkManager.java:699
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2070
#, java-format
msgid "ERROR - Out of memory, cannot create torrent from {0}"
msgstr "CHYBA - nedostatek paměti, nemohu vytvořit torrent z {0}"
#: ../java/src/org/klomp/snark/SnarkManager.java:711
#, java-format
msgid "Torrent added and started: \"{0}\""
msgstr "Torrent přidán a spuštěn: \"{0}\""
#: ../java/src/org/klomp/snark/SnarkManager.java:713
#, java-format
msgid "Torrent added: \"{0}\""
msgstr "Torrent přidán: \"{0}\""
#: ../java/src/org/klomp/snark/SnarkManager.java:748
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:499
#, java-format
msgid "Fetching {0}"
msgstr "Získávám {0}"
#: ../java/src/org/klomp/snark/SnarkManager.java:751
#, java-format
msgid ""
"We have no saved peers and no other torrents are running. Fetch of {0} will "
"not succeed until you start another torrent."
msgstr ""
"Nejsou uloženi žádní sdíleči a žádné další torrenty neběží. Získání {0} "
"neuspěje dokud nespustíte nějaký další torrent."
#: ../java/src/org/klomp/snark/SnarkManager.java:755
#, java-format
msgid "Adding {0}"
msgstr "Přídávám {0}"
#: ../java/src/org/klomp/snark/SnarkManager.java:802
#: ../java/src/org/klomp/snark/SnarkManager.java:825
#: ../java/src/org/klomp/snark/SnarkManager.java:1260
#, java-format
msgid "Failed to copy torrent file to {0}"
msgstr "Chyba: nepodařilo se zkopírovat soubor torrentu do {0}"
#: ../java/src/org/klomp/snark/SnarkManager.java:1052
#, java-format
msgid "Too many files in \"{0}\" ({1}), deleting it!"
msgstr "V \"{0}\" ({1}) je příliš mnoho souborů, mažu je!"
#: ../java/src/org/klomp/snark/SnarkManager.java:1054
#, java-format
msgid "Torrent file \"{0}\" cannot end in \".torrent\", deleting it!"
msgstr "Jméno souboru torrentu \"{0}\" nemůže končit na \".torrent\", mažu ho!"
#: ../java/src/org/klomp/snark/SnarkManager.java:1056
#, java-format
msgid "No pieces in \"{0}\", deleting it!"
msgstr "\"{0}\" neobsahuje žádné části, mažu to!"
#: ../java/src/org/klomp/snark/SnarkManager.java:1058
#, java-format
msgid "Too many pieces in \"{0}\", limit is {1}, deleting it!"
msgstr "Příliš mnoho částí v \"{0}\", maximum je {1}, mažu to!"
#: ../java/src/org/klomp/snark/SnarkManager.java:1060
#, java-format
msgid "Pieces are too large in \"{0}\" ({1}B), deleting it."
msgstr ""
#: ../java/src/org/klomp/snark/SnarkManager.java:1061
#, java-format
msgid "Limit is {0}B"
msgstr ""
#: ../java/src/org/klomp/snark/SnarkManager.java:1063
#, java-format
msgid "Torrent \"{0}\" has no data, deleting it!"
msgstr ""
#: ../java/src/org/klomp/snark/SnarkManager.java:1071
#, java-format
msgid "Torrents larger than {0}B are not supported yet, deleting \"{1}\""
msgstr ""
#: ../java/src/org/klomp/snark/SnarkManager.java:1087
#, java-format
msgid "Error: Could not remove the torrent {0}"
msgstr ""
#: ../java/src/org/klomp/snark/SnarkManager.java:1108
#: ../java/src/org/klomp/snark/SnarkManager.java:1126
#, java-format
msgid "Torrent stopped: \"{0}\""
msgstr ""
#: ../java/src/org/klomp/snark/SnarkManager.java:1147
#, java-format
msgid "Torrent removed: \"{0}\""
msgstr ""
#: ../java/src/org/klomp/snark/SnarkManager.java:1155
#, java-format
msgid "Adding torrents in {0}"
msgstr ""
#: ../java/src/org/klomp/snark/SnarkManager.java:1208
#, java-format
msgid "Download finished: {0}"
msgstr ""
#: ../java/src/org/klomp/snark/SnarkManager.java:1256
#, java-format
msgid "Metainfo received for {0}"
msgstr ""
#: ../java/src/org/klomp/snark/SnarkManager.java:1257
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:534
#, java-format
msgid "Starting up torrent {0}"
msgstr ""
#: ../java/src/org/klomp/snark/SnarkManager.java:1313
msgid "Unable to connect to I2P!"
msgstr ""
#: ../java/src/org/klomp/snark/SnarkManager.java:1319
#, java-format
msgid "Unable to add {0}"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:205
msgid "I2PSnark - Anonymous BitTorrent Client"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:221
msgid "Torrents"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:224
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:231
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1053
msgid "I2PSnark"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:228
msgid "Refresh page"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:233
msgid "Forum"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:251
msgid "Click \"Add torrent\" button to fetch torrent"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:290
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1791
msgid "Status"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:296
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:298
msgid "Hide Peers"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:303
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:305
msgid "Show Peers"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:312
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1708
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1724
msgid "Torrent"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:316
msgid "Estimated time remaining"
msgstr ""
#. Translators: Please keep short or translate as " "
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:319
msgid "ETA"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:323
msgid "Downloaded"
msgstr ""
#. Translators: Please keep short or translate as " "
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:326
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:340
msgid "RX"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:330
msgid "Uploaded"
msgstr ""
#. Translators: Please keep short or translate as " "
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:333
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:350
msgid "TX"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:338
msgid "Down Rate"
msgstr ""
#. Translators: Please keep short or translate as " "
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:343
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:352
msgid "Rate"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:348
msgid "Up Rate"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:372
msgid "Stop all torrents and the I2P tunnel"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:374
msgid "Stop All"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:383
msgid "Start all torrents and the I2P tunnel"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:385
msgid "Start All"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:404
msgid "No torrents loaded."
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:409
msgid "Totals"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:411
#, java-format
msgid "1 torrent"
msgid_plural "{0} torrents"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:414
#, java-format
msgid "1 connected peer"
msgid_plural "{0} connected peers"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:498
msgid "Opening the I2P tunnel"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:505
#, java-format
msgid "Invalid URL: Must start with \"http://\", \"{0}\", or \"{1}\""
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:553
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:580
#, java-format
msgid "Magnet deleted: {0}"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:561
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:586
#, java-format
msgid "Torrent file deleted: {0}"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:592
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:603
#, java-format
msgid "Data file deleted: {0}"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:594
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:605
#, java-format
msgid "Data file could not be deleted: {0}"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:617
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:624
#, java-format
msgid "Data dir deleted: {0}"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:663
msgid "Error creating torrent - you must select a tracker"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:678
#, java-format
msgid "Torrent created for \"{0}\""
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:680
#, java-format
msgid ""
"Many I2P trackers require you to register new torrents before seeding - "
"please do so before starting \"{0}\""
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:682
#, java-format
msgid "Error creating a torrent for \"{0}\""
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:685
#, java-format
msgid "Cannot create a torrent for the nonexistent data: {0}"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:688
msgid "Error creating torrent - you must enter a file or directory"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:691
msgid "Stopping all torrents and closing the I2P tunnel."
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:702
msgid "I2P tunnel closed."
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:705
msgid "Opening the I2P tunnel and starting all torrents."
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:827
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:832
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:838
msgid "Tracker Error"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:830
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:834
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:846
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:850
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:858
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:862
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:867
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:871
#, java-format
msgid "1 peer"
msgid_plural "{0} peers"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:843
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:848
msgid "Seeding"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:852
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1730
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1842
msgid "Complete"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:855
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:860
msgid "OK"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:864
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:869
msgid "Stalled"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:873
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:876
msgid "No Peers"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:878
msgid "Stopped"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:911
msgid "Torrent details"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:923
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1187
msgid "Info"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:938
msgid "View files"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:940
msgid "Open file"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:982
msgid "Stop the torrent"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:984
msgid "Stop"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:994
msgid "Start the torrent"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:996
msgid "Start"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1007
msgid "Remove the torrent from the active list, deleting the .torrent file"
msgstr ""
#. Can't figure out how to escape double quotes inside the onclick string.
#. Single quotes in translate strings with parameters must be doubled.
#. Then the remaining single quite must be escaped
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1012
#, java-format
msgid ""
"Are you sure you want to delete the file \\''{0}.torrent\\'' (downloaded "
"data will not be deleted) ?"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1015
msgid "Remove"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1026
msgid "Delete the .torrent file and the associated data file(s)"
msgstr ""
#. Can't figure out how to escape double quotes inside the onclick string.
#. Single quotes in translate strings with parameters must be doubled.
#. Then the remaining single quite must be escaped
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1031
#, java-format
msgid ""
"Are you sure you want to delete the torrent \\''{0}\\'' and all downloaded "
"data?"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1034
msgid "Delete"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1069
msgid "Unknown"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1081
msgid "Seed"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1104
msgid "Uninteresting (The peer has no pieces we need)"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1106
msgid "Choked (The peer is not allowing us to request pieces)"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1126
msgid "Uninterested (We have no pieces the peer needs)"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1128
msgid "Choking (We are not allowing the peer to request pieces)"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1186
#, java-format
msgid "Details at {0} tracker"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1216
msgid "Add Torrent"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1218
msgid "From URL"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1221
msgid ""
"Enter the torrent file download URL (I2P only), magnet link, or maggot link"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1226
msgid "Add torrent"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1229
#, java-format
msgid "You can also copy .torrent files to: {0}."
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1231
msgid "Removing a .torrent will cause it to stop."
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1254
msgid "Create Torrent"
msgstr ""
#. out.write("From file: <input type=\"file\" name=\"newFile\" size=\"50\" value=\"" + newFile + "\" /><br>\n");
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1257
msgid "Data to seed"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1261
msgid "File or directory to seed (must be within the specified path)"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1263
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1749
msgid "Tracker"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1265
msgid "Select a tracker"
msgstr ""
#. out.write(_("Open trackers and DHT only"));
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1270
msgid "Open trackers only"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1285
msgid "or"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1288
msgid "Specify custom tracker announce URL"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1291
msgid "Create torrent"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1312
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1480
msgid "Configuration"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1316
msgid "Data directory"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1318
msgid "Edit i2psnark.config and restart to change"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1322
msgid "Files readable by all"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1326
msgid "If checked, other users may access the downloaded files"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1330
msgid "Auto start"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1334
msgid "If checked, automatically start torrents that are added"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1338
msgid "Theme"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1351
msgid "Refresh time"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1364
msgid "Never"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1370
msgid "Startup delay"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1372
msgid "minutes"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1396
msgid "Total uploader limit"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1399
msgid "peers"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1403
msgid "Up bandwidth limit"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1406
msgid "Half available bandwidth recommended."
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1408
msgid "View or change router bandwidth"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1412
msgid "Use open trackers also"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1416
msgid ""
"If checked, announce torrents to open trackers as well as the tracker listed "
"in the torrent file"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1420
msgid "Open tracker announce URLs"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1432
msgid "Inbound Settings"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1438
msgid "Outbound Settings"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1446
msgid "I2CP host"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1451
msgid "I2CP port"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1466
msgid "I2CP options"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1471
msgid "Save configuration"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1496
#, java-format
msgid "Invalid magnet URL {0}"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1530
#, java-format
msgid "Invalid info hash in magnet URL {0}"
msgstr ""
#. * dummies for translation
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1560
#, java-format
msgid "1 hop"
msgid_plural "{0} hops"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1561
#, java-format
msgid "1 tunnel"
msgid_plural "{0} tunnels"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1728
msgid "Completion"
msgstr ""
#. else unknown
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1732
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1788
msgid "Size"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1737
msgid "Files"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1739
msgid "Pieces"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1740
msgid "Piece size"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1762
msgid "Magnet link"
msgstr ""
#. We don't have the hash of the torrent file
#. buf.append("<br>").append(_("Maggot link")).append(": <a href=\"").append(MAGGOT).append(hex).append(':').append(hex).append("\">")
#. .append(MAGGOT).append(hex).append(':').append(hex).append("</a>");
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1768
msgid "Torrent file"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1786
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1825
msgid "Directory"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1795
msgid "Priority"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1800
msgid "Up to higher level directory"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1830
msgid "Torrent not found?"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1839
msgid "File not found in torrent?"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1852
msgid "complete"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1853
msgid "bytes remaining"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1878
msgid "Open"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1904
msgid "High"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1909
msgid "Normal"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1914
msgid "Skip"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1923
msgid "Save priorities"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2039
#, java-format
msgid "Torrent fetched from {0}"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2060
#, java-format
msgid "Torrent already running: {0}"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2062
#, java-format
msgid "Torrent already in the queue: {0}"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2068
#, java-format
msgid "Torrent at {0} was not valid"
msgstr ""
#. FIXME don't lose peer setting
#. String peerParam = req.getParameter("p");
#. if (peerParam != null)
#. buf.append("<input type=\"hidden\" name=\"p\" value=\"").append(peerParam).append("\" >\n");
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2082
#, java-format
msgid "Torrent was not retrieved from {0}"
msgstr ""

File diff suppressed because it is too large Load Diff

View File

@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: I2P i2psnark\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-09-23 20:16+0000\n"
"POT-Creation-Date: 2012-02-17 02:42+0000\n"
"PO-Revision-Date: 2010-06-15 14:09+0100\n"
"Last-Translator: duck <duck@mail.i2p>\n"
"Language-Team: duck <duck@mail.i2p>\n"
@@ -153,7 +153,7 @@ msgstr ""
#: ../java/src/org/klomp/snark/SnarkManager.java:661
#: ../java/src/org/klomp/snark/SnarkManager.java:737
#: ../java/src/org/klomp/snark/SnarkManager.java:792
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2015
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2048
#, java-format
msgid "Torrent with this info hash is already running: {0}"
msgstr ""
@@ -180,7 +180,7 @@ msgid "Torrent in \"{0}\" is invalid"
msgstr ""
#: ../java/src/org/klomp/snark/SnarkManager.java:699
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2037
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2070
#, java-format
msgid "ERROR - Out of memory, cannot create torrent from {0}"
msgstr ""
@@ -196,7 +196,7 @@ msgid "Torrent added: \"{0}\""
msgstr ""
#: ../java/src/org/klomp/snark/SnarkManager.java:748
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:493
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:499
#, java-format
msgid "Fetching {0}"
msgstr ""
@@ -292,7 +292,7 @@ msgid "Metainfo received for {0}"
msgstr ""
#: ../java/src/org/klomp/snark/SnarkManager.java:1257
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:528
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:534
#, java-format
msgid "Starting up torrent {0}"
msgstr ""
@@ -306,647 +306,667 @@ msgstr ""
msgid "Unable to add {0}"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:204
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:205
msgid "I2PSnark - Anonymous BitTorrent Client"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:220
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:221
msgid "Torrents"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:223
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:230
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1033
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:224
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:231
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1053
msgid "I2PSnark"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:227
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:228
msgid "Refresh page"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:232
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:233
msgid "Forum"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:286
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1758
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:251
msgid "Click \"Add torrent\" button to fetch torrent"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:290
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1791
msgid "Status"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:292
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:294
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:296
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:298
msgid "Hide Peers"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:299
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:301
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:303
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:305
msgid "Show Peers"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:308
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1682
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1698
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:312
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1708
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1724
msgid "Torrent"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:312
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:316
msgid "Estimated time remaining"
msgstr ""
#. Translators: Please keep short or translate as " "
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:315
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:319
msgid "ETA"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:319
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:323
msgid "Downloaded"
msgstr ""
#. Translators: Please keep short or translate as " "
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:322
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:336
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:326
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:340
msgid "RX"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:326
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:330
msgid "Uploaded"
msgstr ""
#. Translators: Please keep short or translate as " "
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:329
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:346
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:333
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:350
msgid "TX"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:334
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:338
msgid "Down Rate"
msgstr ""
#. Translators: Please keep short or translate as " "
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:339
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:348
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:343
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:352
msgid "Rate"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:344
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:348
msgid "Up Rate"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:368
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:372
msgid "Stop all torrents and the I2P tunnel"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:370
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:374
msgid "Stop All"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:379
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:383
msgid "Start all torrents and the I2P tunnel"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:381
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:385
msgid "Start All"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:400
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:404
msgid "No torrents loaded."
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:405
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:409
msgid "Totals"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:407
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:411
#, java-format
msgid "1 torrent"
msgid_plural "{0} torrents"
msgstr[0] ""
msgstr[1] ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:410
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:414
#, java-format
msgid "1 connected peer"
msgid_plural "{0} connected peers"
msgstr[0] ""
msgstr[1] ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:499
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:498
msgid "Opening the I2P tunnel"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:505
#, java-format
msgid "Invalid URL: Must start with \"http://\", \"{0}\", or \"{1}\""
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:547
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:574
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:553
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:580
#, java-format
msgid "Magnet deleted: {0}"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:555
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:580
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:561
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:586
#, java-format
msgid "Torrent file deleted: {0}"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:586
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:596
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:592
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:603
#, java-format
msgid "Data file deleted: {0}"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:588
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:598
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:594
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:605
#, java-format
msgid "Data file could not be deleted: {0}"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:607
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:617
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:624
#, java-format
msgid "Data dir deleted: {0}"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:644
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:663
msgid "Error creating torrent - you must select a tracker"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:659
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:678
#, java-format
msgid "Torrent created for \"{0}\""
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:661
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:680
#, java-format
msgid ""
"Many I2P trackers require you to register new torrents before seeding - "
"please do so before starting \"{0}\""
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:663
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:682
#, java-format
msgid "Error creating a torrent for \"{0}\""
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:666
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:685
#, java-format
msgid "Cannot create a torrent for the nonexistent data: {0}"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:669
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:688
msgid "Error creating torrent - you must enter a file or directory"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:672
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:691
msgid "Stopping all torrents and closing the I2P tunnel."
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:683
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:702
msgid "I2P tunnel closed."
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:686
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:705
msgid "Opening the I2P tunnel and starting all torrents."
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:808
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:813
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:819
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:827
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:832
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:838
msgid "Tracker Error"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:811
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:815
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:827
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:831
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:839
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:843
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:848
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:852
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:830
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:834
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:846
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:850
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:858
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:862
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:867
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:871
#, java-format
msgid "1 peer"
msgid_plural "{0} peers"
msgstr[0] ""
msgstr[1] ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:824
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:829
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:843
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:848
msgid "Seeding"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:833
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1704
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1809
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:852
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1730
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1842
msgid "Complete"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:836
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:841
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:855
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:860
msgid "OK"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:845
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:850
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:864
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:869
msgid "Stalled"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:854
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:857
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:873
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:876
msgid "No Peers"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:859
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:878
msgid "Stopped"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:891
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:911
msgid "Torrent details"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:903
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1167
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:923
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1187
msgid "Info"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:918
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:938
msgid "View files"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:920
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:940
msgid "Open file"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:962
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:982
msgid "Stop the torrent"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:964
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:984
msgid "Stop"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:974
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:994
msgid "Start the torrent"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:976
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:996
msgid "Start"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:987
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1007
msgid "Remove the torrent from the active list, deleting the .torrent file"
msgstr ""
#. Can't figure out how to escape double quotes inside the onclick string.
#. Single quotes in translate strings with parameters must be doubled.
#. Then the remaining single quite must be escaped
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:992
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1012
#, java-format
msgid ""
"Are you sure you want to delete the file \\''{0}.torrent\\'' (downloaded "
"data will not be deleted) ?"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:995
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1015
msgid "Remove"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1006
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1026
msgid "Delete the .torrent file and the associated data file(s)"
msgstr ""
#. Can't figure out how to escape double quotes inside the onclick string.
#. Single quotes in translate strings with parameters must be doubled.
#. Then the remaining single quite must be escaped
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1011
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1031
#, java-format
msgid ""
"Are you sure you want to delete the torrent \\''{0}\\'' and all downloaded "
"data?"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1014
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1034
msgid "Delete"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1049
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1069
msgid "Unknown"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1061
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1081
msgid "Seed"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1084
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1104
msgid "Uninteresting (The peer has no pieces we need)"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1086
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1106
msgid "Choked (The peer is not allowing us to request pieces)"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1106
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1126
msgid "Uninterested (We have no pieces the peer needs)"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1108
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1128
msgid "Choking (We are not allowing the peer to request pieces)"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1166
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1186
#, java-format
msgid "Details at {0} tracker"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1195
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1216
msgid "Add Torrent"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1197
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1218
msgid "From URL"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1200
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1221
msgid ""
"Enter the torrent file download URL (I2P only), magnet link, or maggot link"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1205
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1226
msgid "Add torrent"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1208
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1229
#, java-format
msgid "You can also copy .torrent files to: {0}."
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1210
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1231
msgid "Removing a .torrent will cause it to stop."
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1233
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1254
msgid "Create Torrent"
msgstr ""
#. out.write("From file: <input type=\"file\" name=\"newFile\" size=\"50\" value=\"" + newFile + "\" /><br>\n");
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1236
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1257
msgid "Data to seed"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1240
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1261
msgid "File or directory to seed (must be within the specified path)"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1242
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1723
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1263
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1749
msgid "Tracker"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1244
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1265
msgid "Select a tracker"
msgstr ""
#. out.write(_("Open trackers and DHT only"));
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1249
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1270
msgid "Open trackers only"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1264
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1285
msgid "or"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1267
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1288
msgid "Specify custom tracker announce URL"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1270
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1291
msgid "Create torrent"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1291
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1459
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1312
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1480
msgid "Configuration"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1295
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1316
msgid "Data directory"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1297
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1318
msgid "Edit i2psnark.config and restart to change"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1301
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1322
msgid "Files readable by all"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1305
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1326
msgid "If checked, other users may access the downloaded files"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1309
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1330
msgid "Auto start"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1313
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1334
msgid "If checked, automatically start torrents that are added"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1317
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1338
msgid "Theme"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1330
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1351
msgid "Refresh time"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1343
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1364
msgid "Never"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1349
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1370
msgid "Startup delay"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1351
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1372
msgid "minutes"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1375
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1396
msgid "Total uploader limit"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1378
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1399
msgid "peers"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1382
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1403
msgid "Up bandwidth limit"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1385
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1406
msgid "Half available bandwidth recommended."
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1387
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1408
msgid "View or change router bandwidth"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1391
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1412
msgid "Use open trackers also"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1395
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1416
msgid ""
"If checked, announce torrents to open trackers as well as the tracker listed "
"in the torrent file"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1399
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1420
msgid "Open tracker announce URLs"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1411
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1432
msgid "Inbound Settings"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1417
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1438
msgid "Outbound Settings"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1425
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1446
msgid "I2CP host"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1430
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1451
msgid "I2CP port"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1445
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1466
msgid "I2CP options"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1450
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1471
msgid "Save configuration"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1475
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1496
#, java-format
msgid "Invalid magnet URL {0}"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1509
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1530
#, java-format
msgid "Invalid info hash in magnet URL {0}"
msgstr ""
#. * dummies for translation
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1539
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1560
#, java-format
msgid "1 hop"
msgid_plural "{0} hops"
msgstr[0] ""
msgstr[1] ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1540
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1561
#, java-format
msgid "1 tunnel"
msgid_plural "{0} tunnels"
msgstr[0] ""
msgstr[1] ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1702
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1728
msgid "Completion"
msgstr ""
#. else unknown
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1706
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1755
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1732
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1788
msgid "Size"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1711
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1737
msgid "Files"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1713
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1739
msgid "Pieces"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1714
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1740
msgid "Piece size"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1736
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1762
msgid "Magnet link"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1753
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1792
#. We don't have the hash of the torrent file
#. buf.append("<br>").append(_("Maggot link")).append(": <a href=\"").append(MAGGOT).append(hex).append(':').append(hex).append("\">")
#. .append(MAGGOT).append(hex).append(':').append(hex).append("</a>");
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1768
msgid "Torrent file"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1786
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1825
msgid "Directory"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1762
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1795
msgid "Priority"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1767
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1800
msgid "Up to higher level directory"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1797
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1830
msgid "Torrent not found?"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1806
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1839
msgid "File not found in torrent?"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1819
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1852
msgid "complete"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1820
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1853
msgid "bytes remaining"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1845
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1878
msgid "Open"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1871
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1904
msgid "High"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1876
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1909
msgid "Normal"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1881
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1914
msgid "Skip"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1890
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1923
msgid "Save priorities"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2006
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2039
#, java-format
msgid "Torrent fetched from {0}"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2027
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2060
#, java-format
msgid "Torrent already running: {0}"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2029
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2062
#, java-format
msgid "Torrent already in the queue: {0}"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2035
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2068
#, java-format
msgid "Torrent at {0} was not valid"
msgstr ""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2042
#. FIXME don't lose peer setting
#. String peerParam = req.getParameter("p");
#. if (peerParam != null)
#. buf.append("<input type=\"hidden\" name=\"p\" value=\"").append(peerParam).append("\" >\n");
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2082
#, java-format
msgid "Torrent was not retrieved from {0}"
msgstr ""

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -3,17 +3,19 @@
# This file is distributed under the same license as the i2psnark package.
# To contribute translations, see http://www.i2p2.de/newdevelopers
#
# <ducki2p@gmail.com>, 2011
# <i2p@robertfoss.se>, 2011
# hottuna <i2p@robertfoss.se>, 2011
# 123hund123 <M8R-ra4r1r@mailinator.com>, 2011
# Translators:
# 123hund123 <M8R-ra4r1r@mailinator.com>, 2011.
# <ducki2p@gmail.com>, 2011.
# hottuna <i2p@robertfoss.se>, 2011.
# <i2p@robertfoss.se>, 2011.
# Martin Svensson <digitalmannen@gmail.com>, 2011.
msgid ""
msgstr ""
"Project-Id-Version: I2P\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-10-13 00:30+0000\n"
"PO-Revision-Date: 2011-06-05 14:52+0000\n"
"Last-Translator: digitalmannen <digitalmannen@gmail.com>\n"
"POT-Creation-Date: 2011-12-15 20:14+0000\n"
"PO-Revision-Date: 2011-12-13 15:45+0000\n"
"Last-Translator: Martin Svensson <digitalmannen@gmail.com>\n"
"Language-Team: Swedish (Sweden) (http://www.transifex.net/projects/p/I2P/"
"team/sv_SE/)\n"
"Language: sv_SE\n"
@@ -48,14 +50,13 @@ msgid "Startup delay changed to {0}"
msgstr "Fördröjning vid uppstart bytt till {0}"
#: ../java/src/org/klomp/snark/SnarkManager.java:394
#, fuzzy, java-format
#, java-format
msgid "Refresh time changed to {0}"
msgstr "Gräns för totalt antal uppladdare är bytt till {0}"
msgstr "Uppdateringstiden ändrad till {0}"
#: ../java/src/org/klomp/snark/SnarkManager.java:396
#, fuzzy
msgid "Refresh disabled"
msgstr "Ladda om sida"
msgstr "Uppdatering inaktiverad"
#: ../java/src/org/klomp/snark/SnarkManager.java:451
msgid "I2CP and tunnel changes will take effect after stopping all torrents"
@@ -64,9 +65,9 @@ msgstr ""
"stoppats."
#: ../java/src/org/klomp/snark/SnarkManager.java:455
#, fuzzy, java-format
#, java-format
msgid "I2CP options changed to {0}"
msgstr "I2CP-inställningar ändrade till {0}"
msgstr "I2CP valet ändrad till {0}"
#: ../java/src/org/klomp/snark/SnarkManager.java:460
msgid "Disconnecting old I2CP destination"
@@ -99,11 +100,11 @@ msgstr "I2CP-lyssnar omstartad på grund av \"{0}\""
#: ../java/src/org/klomp/snark/SnarkManager.java:492
msgid "New files will be publicly readable"
msgstr ""
msgstr "Nya filer kommer vara publikt läsbara"
#: ../java/src/org/klomp/snark/SnarkManager.java:494
msgid "New files will not be publicly readable"
msgstr ""
msgstr "Nya filer kommer inte vara publikt läsbara"
#: ../java/src/org/klomp/snark/SnarkManager.java:501
msgid "Enabled autostart"
@@ -168,7 +169,7 @@ msgstr "Kan inte öppna \"{0}\""
#: ../java/src/org/klomp/snark/SnarkManager.java:661
#: ../java/src/org/klomp/snark/SnarkManager.java:737
#: ../java/src/org/klomp/snark/SnarkManager.java:792
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2015
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2035
#, java-format
msgid "Torrent with this info hash is already running: {0}"
msgstr "Torrent med denna infohash körs redan: {0}"
@@ -199,7 +200,7 @@ msgid "Torrent in \"{0}\" is invalid"
msgstr "Torrent i \"{0}\" är ogiltig"
#: ../java/src/org/klomp/snark/SnarkManager.java:699
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2037
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2057
#, java-format
msgid "ERROR - Out of memory, cannot create torrent from {0}"
msgstr "Problem: Minnet har tagit slut, kan inte skapa torrent från {0}"
@@ -215,7 +216,7 @@ msgid "Torrent added: \"{0}\""
msgstr "Torrent tillagd: \"{0}\""
#: ../java/src/org/klomp/snark/SnarkManager.java:748
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:493
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:499
#, java-format
msgid "Fetching {0}"
msgstr "Hämtar {0}"
@@ -313,7 +314,7 @@ msgid "Metainfo received for {0}"
msgstr "Metainfo mottagen till {0}"
#: ../java/src/org/klomp/snark/SnarkManager.java:1257
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:528
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:534
#, java-format
msgid "Starting up torrent {0}"
msgstr "Startar torrent {0}"
@@ -327,174 +328,183 @@ msgstr "Misslyckades med att ansluta till I2P"
msgid "Unable to add {0}"
msgstr "Misslyckades med att lägga till {0}"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:204
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:205
msgid "I2PSnark - Anonymous BitTorrent Client"
msgstr "I2PSnark - Anonym bittorrentklient"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:220
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:221
msgid "Torrents"
msgstr "Torrents"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:223
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:230
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1033
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:224
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:231
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1052
msgid "I2PSnark"
msgstr "I2PSnark"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:227
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:228
msgid "Refresh page"
msgstr "Ladda om sida"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:232
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:233
msgid "Forum"
msgstr "Forum"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:286
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1758
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:251
msgid "Click \"Add torrent\" button to fetch torrent"
msgstr "Klicka på \"Lägg till torrent\" för att hämta en trorrent"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:290
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1778
msgid "Status"
msgstr "Status"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:292
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:294
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:296
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:298
msgid "Hide Peers"
msgstr "Göm nerladdare"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:299
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:301
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:303
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:305
msgid "Show Peers"
msgstr "Visa nerladdare"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:308
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1682
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1698
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:312
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1702
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1718
msgid "Torrent"
msgstr "Torrent"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:312
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:316
msgid "Estimated time remaining"
msgstr "Uppskattad återstående tid"
#. Translators: Please keep short or translate as " "
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:315
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:319
msgid "ETA"
msgstr "UÅT"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:319
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:323
msgid "Downloaded"
msgstr "Nerladdat"
#. Translators: Please keep short or translate as " "
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:322
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:336
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:326
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:340
msgid "RX"
msgstr "RX"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:326
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:330
msgid "Uploaded"
msgstr "Uppladdat"
#. Translators: Please keep short or translate as " "
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:329
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:346
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:333
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:350
msgid "TX"
msgstr "TX"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:334
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:338
msgid "Down Rate"
msgstr "Nerhastighet"
#. Translators: Please keep short or translate as " "
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:339
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:348
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:343
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:352
msgid "Rate"
msgstr "Hastighet"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:344
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:348
msgid "Up Rate"
msgstr "Upphastighet"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:368
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:372
msgid "Stop all torrents and the I2P tunnel"
msgstr "Stoppa alla torrents och I2P-tunneln"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:370
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:374
msgid "Stop All"
msgstr "Stoppa alla"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:379
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:383
msgid "Start all torrents and the I2P tunnel"
msgstr "Starta alla torrents och I2P-tunneln"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:381
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:385
msgid "Start All"
msgstr "Starta alla"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:400
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:404
msgid "No torrents loaded."
msgstr "Inga torrents laddade."
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:405
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:409
msgid "Totals"
msgstr "Totalt"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:407
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:411
#, java-format
msgid "1 torrent"
msgid_plural "{0} torrents"
msgstr[0] "{0} torrent"
msgstr[1] "{0} torrents"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:410
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:414
#, java-format
msgid "1 connected peer"
msgid_plural "{0} connected peers"
msgstr[0] "{0} ansluten nerladdare"
msgstr[1] "{0} anslutna nerladdare"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:499
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:498
msgid "Opening the I2P tunnel"
msgstr "Öpnat I2P tunnel "
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:505
#, java-format
msgid "Invalid URL: Must start with \"http://\", \"{0}\", or \"{1}\""
msgstr "Ogiltig URL: Måste starta med \"http://\", \"{0}\" eller \"{1}\""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:547
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:574
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:553
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:580
#, java-format
msgid "Magnet deleted: {0}"
msgstr "Magnet borttagen: {0}"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:555
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:580
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:561
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:586
#, java-format
msgid "Torrent file deleted: {0}"
msgstr "Torrentfil borttagen: {0}"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:586
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:596
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:592
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:603
#, java-format
msgid "Data file deleted: {0}"
msgstr "Datafil borttagen: {0}"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:588
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:598
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:594
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:605
#, java-format
msgid "Data file could not be deleted: {0}"
msgstr "Datafil kunde inte tas bort: {0}"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:607
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:617
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:624
#, java-format
msgid "Data dir deleted: {0}"
msgstr "Datamapp borttagen: {0}"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:644
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:663
msgid "Error creating torrent - you must select a tracker"
msgstr "Misslyckades med att skapa torrent - en tracker måste väljas"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:659
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:678
#, java-format
msgid "Torrent created for \"{0}\""
msgstr "Torrent skapad för \"{0}\""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:661
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:680
#, java-format
msgid ""
"Many I2P trackers require you to register new torrents before seeding - "
@@ -503,123 +513,123 @@ msgstr ""
"Många I2P trackers kräver att användare registrerar sig för uppladdning av "
"torrent - gör det innan \"{0}\" startas"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:663
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:682
#, java-format
msgid "Error creating a torrent for \"{0}\""
msgstr "Misslyckades med att skapa torrent för \"{0}\""
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:666
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:685
#, java-format
msgid "Cannot create a torrent for the nonexistent data: {0}"
msgstr "Kan ej skapa torrent för data som ej finns: {0}"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:669
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:688
msgid "Error creating torrent - you must enter a file or directory"
msgstr "Misslyckades med att skapa torrent - en fil eller mapp måste anges"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:672
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:691
msgid "Stopping all torrents and closing the I2P tunnel."
msgstr "Stoppar alla torrents och stänger I2P-tunneln."
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:683
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:702
msgid "I2P tunnel closed."
msgstr "I2P-tunneln är stängd."
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:686
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:705
msgid "Opening the I2P tunnel and starting all torrents."
msgstr "Öppnar I2P-tunneln och startar torrents."
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:808
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:813
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:819
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:827
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:832
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:838
msgid "Tracker Error"
msgstr "Tracker-fel"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:811
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:815
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:827
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:831
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:839
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:843
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:848
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:852
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:830
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:834
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:846
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:850
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:858
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:862
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:867
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:871
#, java-format
msgid "1 peer"
msgid_plural "{0} peers"
msgstr[0] "{0} nerladdare"
msgstr[1] "{0} nerladdare"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:824
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:829
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:843
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:848
msgid "Seeding"
msgstr "Uppladdning"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:833
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1704
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1809
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:852
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1724
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1829
msgid "Complete"
msgstr "Färdig"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:836
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:841
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:855
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:860
msgid "OK"
msgstr "Ok"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:845
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:850
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:864
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:869
msgid "Stalled"
msgstr "Avstannad"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:854
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:857
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:873
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:876
msgid "No Peers"
msgstr "Inga källor"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:859
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:878
msgid "Stopped"
msgstr "Stoppad"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:891
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:910
msgid "Torrent details"
msgstr "Torrentdetaljer"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:903
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1167
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:922
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1186
msgid "Info"
msgstr "Info"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:918
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:937
msgid "View files"
msgstr "Se filer"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:920
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:939
msgid "Open file"
msgstr "Öppna fil"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:962
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:981
msgid "Stop the torrent"
msgstr "Stoppa torrent"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:964
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:983
msgid "Stop"
msgstr "Stoppa"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:974
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:993
msgid "Start the torrent"
msgstr "Starta torrent"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:976
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:995
msgid "Start"
msgstr "Starta"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:987
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1006
msgid "Remove the torrent from the active list, deleting the .torrent file"
msgstr "Ta bort torrent från den aktiva listan, tar bort .torrent fil"
#. Can't figure out how to escape double quotes inside the onclick string.
#. Single quotes in translate strings with parameters must be doubled.
#. Then the remaining single quite must be escaped
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:992
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1011
#, java-format
msgid ""
"Are you sure you want to delete the file \\''{0}.torrent\\'' (downloaded "
@@ -628,18 +638,18 @@ msgstr ""
"Är du säker på att du vill ta bort filen \"{0}.torrent\" (nerladdad data "
"kommer ej tas bort) ?"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:995
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1014
msgid "Remove"
msgstr "Ta bort"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1006
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1025
msgid "Delete the .torrent file and the associated data file(s)"
msgstr "Ta bort .torrent filen och tillhörande datafil(er)"
#. Can't figure out how to escape double quotes inside the onclick string.
#. Single quotes in translate strings with parameters must be doubled.
#. Then the remaining single quite must be escaped
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1011
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1030
#, java-format
msgid ""
"Are you sure you want to delete the torrent \\''{0}\\'' and all downloaded "
@@ -647,179 +657,178 @@ msgid ""
msgstr ""
"Är du säker på att du vill ta bort torrenten \"{0}\" och all nerladdad data?"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1014
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1033
msgid "Delete"
msgstr "Ta bort"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1049
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1068
msgid "Unknown"
msgstr "Okänd"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1061
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1080
msgid "Seed"
msgstr "Källa"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1084
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1103
msgid "Uninteresting (The peer has no pieces we need)"
msgstr "Ointressant (nerladdaren har inga delar vi behöver)"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1086
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1105
msgid "Choked (The peer is not allowing us to request pieces)"
msgstr "Spärra (nerladdaren låter oss inte be dom delar)"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1106
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1125
msgid "Uninterested (We have no pieces the peer needs)"
msgstr "Ointresserad (vi har inga delar nerladdaren behöver)"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1108
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1127
msgid "Choking (We are not allowing the peer to request pieces)"
msgstr "Spärrar (vi låter inte nerladdaren be dom delar)"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1166
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1185
#, java-format
msgid "Details at {0} tracker"
msgstr "Detaljer för {0} tracker"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1195
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1215
msgid "Add Torrent"
msgstr "Lägg till torrent"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1197
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1217
msgid "From URL"
msgstr "Från URL"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1200
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1220
msgid ""
"Enter the torrent file download URL (I2P only), magnet link, or maggot link"
msgstr "Ange URL (inom I2P) till torrent, magnet länl eller maggot länk"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1205
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1225
msgid "Add torrent"
msgstr "Lägg till torrent"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1208
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1228
#, java-format
msgid "You can also copy .torrent files to: {0}."
msgstr "Du kan även kopiera .torrent filer till: {0}"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1210
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1230
msgid "Removing a .torrent will cause it to stop."
msgstr "Borttagning av .torrent fil kommer stanna den."
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1233
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1253
msgid "Create Torrent"
msgstr "Skapa torrent"
#. out.write("From file: <input type=\"file\" name=\"newFile\" size=\"50\" value=\"" + newFile + "\" /><br>\n");
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1236
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1256
msgid "Data to seed"
msgstr "Data att ladda upp"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1240
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1260
msgid "File or directory to seed (must be within the specified path)"
msgstr "Fil eller mapp att ladda upp (måste finnas på angiven plats)"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1242
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1723
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1262
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1743
msgid "Tracker"
msgstr "Tracker"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1244
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1264
msgid "Select a tracker"
msgstr "Välj en tracker"
#. out.write(_("Open trackers and DHT only"));
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1249
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1269
msgid "Open trackers only"
msgstr "Enbart öppna trackers"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1264
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1284
msgid "or"
msgstr "eller"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1267
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1287
msgid "Specify custom tracker announce URL"
msgstr "Ange anpassad tracker URL"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1270
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1290
msgid "Create torrent"
msgstr "Skapa torrent"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1291
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1459
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1311
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1479
msgid "Configuration"
msgstr "Inställningar"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1295
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1315
msgid "Data directory"
msgstr "Datamapp"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1297
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1317
msgid "Edit i2psnark.config and restart to change"
msgstr "Förändra i2psnark.conig och starta om för att ändra"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1301
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1321
msgid "Files readable by all"
msgstr ""
msgstr "Filer läsbara för alla"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1305
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1325
msgid "If checked, other users may access the downloaded files"
msgstr ""
msgstr "Om vald, kommer andra användare att kunna komma åt nerladdade filer"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1309
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1329
msgid "Auto start"
msgstr "Automatisk start"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1313
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1333
msgid "If checked, automatically start torrents that are added"
msgstr "Om ikryssad, startas automatiskt tillagda torrents"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1317
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1337
msgid "Theme"
msgstr "Tema"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1330
#, fuzzy
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1350
msgid "Refresh time"
msgstr "Ladda om sida"
msgstr "Uppdateringsintervall"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1343
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1363
msgid "Never"
msgstr ""
msgstr "Aldrig"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1349
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1369
msgid "Startup delay"
msgstr "Fördröjning av uppstart"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1351
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1371
msgid "minutes"
msgstr "minuter"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1375
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1395
msgid "Total uploader limit"
msgstr "Gräns för totalt antal uppladdare"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1378
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1398
msgid "peers"
msgstr "nerladdare"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1382
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1402
msgid "Up bandwidth limit"
msgstr "Gräns för bandbredd uppåt"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1385
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1405
msgid "Half available bandwidth recommended."
msgstr "Hälften av tillgänglig bandbredd rekommenderas."
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1387
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1407
msgid "View or change router bandwidth"
msgstr "Se eller ändra routerns bandbredd"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1391
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1411
msgid "Use open trackers also"
msgstr "Använd öppna trackers med"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1395
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1415
msgid ""
"If checked, announce torrents to open trackers as well as the tracker listed "
"in the torrent file"
@@ -827,155 +836,163 @@ msgstr ""
"Om ikryssad, anmäl torrents till öppna trackers och tracker angiven i "
"torrentfilen"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1399
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1419
msgid "Open tracker announce URLs"
msgstr "Öppna tracker-anmälnings URL:er"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1411
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1431
msgid "Inbound Settings"
msgstr "Inkommande inställningar"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1417
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1437
msgid "Outbound Settings"
msgstr "Utgående inställningar"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1425
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1445
msgid "I2CP host"
msgstr "I2CP-värd"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1430
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1450
msgid "I2CP port"
msgstr "I2CP-port"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1445
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1465
msgid "I2CP options"
msgstr "I2CP-inställningar"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1450
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1470
msgid "Save configuration"
msgstr "Spara inställningar"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1475
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1495
#, java-format
msgid "Invalid magnet URL {0}"
msgstr "Ogiltig magnet URL {0}"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1509
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1529
#, java-format
msgid "Invalid info hash in magnet URL {0}"
msgstr "Ogiltig infohash i magnet URL {0}"
#. * dummies for translation
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1539
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1559
#, java-format
msgid "1 hop"
msgid_plural "{0} hops"
msgstr[0] "{0} hopp"
msgstr[1] "{0} hopp"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1540
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1560
#, java-format
msgid "1 tunnel"
msgid_plural "{0} tunnels"
msgstr[0] "{0} tunnel"
msgstr[1] "{0} tunnlar"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1702
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1722
msgid "Completion"
msgstr "Färdiställning"
#. else unknown
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1706
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1755
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1726
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1775
msgid "Size"
msgstr "Storlek"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1711
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1731
msgid "Files"
msgstr "Filer"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1713
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1733
msgid "Pieces"
msgstr "Delar"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1714
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1734
msgid "Piece size"
msgstr "Delstorlek"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1736
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1756
msgid "Magnet link"
msgstr "Magnet länk"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1753
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1792
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1773
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1812
msgid "Directory"
msgstr "Mapp"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1762
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1782
msgid "Priority"
msgstr "Prioritet"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1767
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1787
msgid "Up to higher level directory"
msgstr "Up till högre mappnivå"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1797
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1817
msgid "Torrent not found?"
msgstr "Torrent hittades ej?"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1806
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1826
msgid "File not found in torrent?"
msgstr "Fil hittades ej i torrent?"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1819
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1839
msgid "complete"
msgstr "färdig"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1820
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1840
msgid "bytes remaining"
msgstr "bytes kvar"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1845
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1865
msgid "Open"
msgstr "Öppna"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1871
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1891
msgid "High"
msgstr "Hög"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1876
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1896
msgid "Normal"
msgstr "Normal"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1881
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1901
msgid "Skip"
msgstr "Hoppa över"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1890
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1910
msgid "Save priorities"
msgstr "Spara prioriteter"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2006
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2026
#, java-format
msgid "Torrent fetched from {0}"
msgstr "Torrent hämtad från {0}"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2027
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2047
#, java-format
msgid "Torrent already running: {0}"
msgstr "Torrent kör redan: {0}"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2029
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2049
#, java-format
msgid "Torrent already in the queue: {0}"
msgstr "Torrent finns redan i kö: {0}"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2035
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2055
#, java-format
msgid "Torrent at {0} was not valid"
msgstr "Torrent vid {0} var inte giltig"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2042
#. FIXME don't lose peer setting
#. String peerParam = req.getParameter("p");
#. if (peerParam != null)
#. buf.append("<input type=\"hidden\" name=\"p\" value=\"").append(peerParam).append("\" >\n");
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2069
#, java-format
msgid "Torrent was not retrieved from {0}"
msgstr "Torrent kunde inte hämtas från {0}"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2072
msgid "Retry"
msgstr "Pröva igen"

View File

@@ -62,6 +62,7 @@
<manifest>
<attribute name="Main-Class" value="net.i2p.i2ptunnel.I2PTunnel" />
<attribute name="Class-Path" value="i2p.jar mstreaming.jar" />
<attribute name="Implementation-Version" value="${full.version}" />
<attribute name="Build-Date" value="${build.timestamp}" />
<attribute name="Base-Revision" value="${workspace.version}" />
<attribute name="Workspace-Changes" value="${workspace.changes.j.tr}" />
@@ -134,6 +135,7 @@
<war destfile="build/i2ptunnel.war" webxml="../jsp/web-out.xml"
basedir="../jsp/" excludes="web.xml, web-fragment.xml, web-out.xml, **/*.java, *.jsp">
<manifest>
<attribute name="Implementation-Version" value="${full.version}" />
<attribute name="Build-Date" value="${build.timestamp}" />
<attribute name="Base-Revision" value="${workspace.version}" />
<attribute name="Workspace-Changes" value="${workspace.changes.w.tr}" />

View File

@@ -16,6 +16,7 @@ import java.io.OutputStream;
import java.io.PipedInputStream;
import java.io.PipedOutputStream;
import java.util.zip.GZIPInputStream;
import java.util.Locale;
import java.util.concurrent.RejectedExecutionException;
import net.i2p.I2PAppContext;
@@ -177,23 +178,24 @@ class HTTPResponseOutputStream extends FilterOutputStream {
if (_log.shouldLog(Log.INFO))
_log.info("Response header [" + key + "] = [" + val + "]");
if ("Connection".equalsIgnoreCase(key)) {
String lcKey = key.toLowerCase(Locale.US);
if ("connection".equals(lcKey)) {
out.write("Connection: close\r\n".getBytes());
connectionSent = true;
} else if ("Proxy-Connection".equalsIgnoreCase(key)) {
} else if ("proxy-connection".equals(lcKey)) {
out.write("Proxy-Connection: close\r\n".getBytes());
proxyConnectionSent = true;
} else if ( ("Content-encoding".equalsIgnoreCase(key)) && ("x-i2p-gzip".equalsIgnoreCase(val)) ) {
} else if ("content-encoding".equals(lcKey) && "x-i2p-gzip".equals(val.toLowerCase(Locale.US))) {
_gzip = true;
} else if ("Proxy-Authenticate".equalsIgnoreCase(key)) {
} else if ("proxy-authenticate".equals(lcKey)) {
// filter this hop-by-hop header; outproxy authentication must be configured in I2PTunnelHTTPClient
} else {
if ("Content-Length".equalsIgnoreCase(key)) {
if ("content-length".equals(lcKey)) {
// save for compress decision on server side
try {
_dataExpected = Long.parseLong(val);
} catch (NumberFormatException nfe) {}
} else if ("Content-Type".equalsIgnoreCase(key)) {
} else if ("content-type".equals(lcKey)) {
// save for compress decision on server side
_contentType = val;
}

View File

@@ -46,6 +46,7 @@ import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Locale;
import java.util.Properties;
import java.util.Set;
import java.util.StringTokenizer;
@@ -233,7 +234,7 @@ public class I2PTunnel extends EventDispatcherImpl implements Logging {
public void runCommand(String cmd, Logging l) {
if (cmd.indexOf(" ") == -1) cmd += " ";
int iii = cmd.indexOf(" ");
String cmdname = cmd.substring(0, iii).toLowerCase();
String cmdname = cmd.substring(0, iii).toLowerCase(Locale.US);
String allargs = cmd.substring(iii + 1);
String[] args = split(allargs, " "); // .split(" "); // java 1.4
@@ -737,7 +738,7 @@ public class I2PTunnel extends EventDispatcherImpl implements Logging {
String proxy = "";
boolean isShared = true;
if (args.length > 1) {
if ("true".equalsIgnoreCase(args[1].trim())) {
if (Boolean.valueOf(args[1].trim()).booleanValue()) {
isShared = true;
if (args.length == 3)
proxy = args[2];
@@ -806,7 +807,7 @@ public class I2PTunnel extends EventDispatcherImpl implements Logging {
String proxy = "";
boolean isShared = true;
if (args.length > 1) {
if ("true".equalsIgnoreCase(args[1].trim())) {
if (Boolean.valueOf(args[1].trim()).booleanValue()) {
isShared = true;
if (args.length == 3)
proxy = args[2];
@@ -877,7 +878,7 @@ public class I2PTunnel extends EventDispatcherImpl implements Logging {
boolean isShared = true;
if (args.length > 2) {
if ("true".equalsIgnoreCase(args[2].trim())) {
if (Boolean.valueOf(args[2].trim()).booleanValue()) {
isShared = true;
} else if ("false".equalsIgnoreCase(args[2].trim())) {
_log.warn("args[2] == [" + args[2] + "] and rejected explicitly");
@@ -944,7 +945,7 @@ public class I2PTunnel extends EventDispatcherImpl implements Logging {
boolean isShared = false;
if (args.length > 1)
isShared = "true".equalsIgnoreCase(args[1].trim());
isShared = Boolean.valueOf(args[1].trim()).booleanValue();
ownDest = !isShared;
try {
@@ -988,7 +989,7 @@ public class I2PTunnel extends EventDispatcherImpl implements Logging {
boolean isShared = false;
if (args.length == 2)
isShared = "true".equalsIgnoreCase(args[1].trim());
isShared = Boolean.valueOf(args[1].trim()).booleanValue();
ownDest = !isShared;
String privateKeyFile = null;

View File

@@ -11,6 +11,7 @@ import java.net.Socket;
import java.net.SocketException;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import java.util.Properties;
import java.util.StringTokenizer;
@@ -24,6 +25,7 @@ import net.i2p.data.Destination;
import net.i2p.util.EventDispatcher;
import net.i2p.util.FileUtil;
import net.i2p.util.Log;
import net.i2p.util.PortMapper;
/**
* Supports the following:
@@ -151,6 +153,20 @@ public class I2PTunnelConnectClient extends I2PTunnelHTTPClientBase implements R
return opts;
}
@Override
public void startRunning() {
super.startRunning();
_context.portMapper().register(PortMapper.SVC_HTTPS_PROXY, getLocalPort());
}
@Override
public boolean close(boolean forced) {
int reg = _context.portMapper().getPort(PortMapper.SVC_HTTPS_PROXY);
if (reg == getLocalPort())
_context.portMapper().unregister(PortMapper.SVC_HTTPS_PROXY);
return super.close(forced);
}
protected void clientConnectionRun(Socket s) {
InputStream in = null;
OutputStream out = null;
@@ -193,7 +209,7 @@ public class I2PTunnelConnectClient extends I2PTunnelHTTPClientBase implements R
restofline = request.substring(pos); // ":80 HTTP/1.1" or " HTTP/1.1"
}
if (host.toLowerCase().endsWith(".i2p")) {
if (host.toLowerCase(Locale.US).endsWith(".i2p")) {
// Destination gets the host name
destination = host;
} else if (host.indexOf(".") != -1) {
@@ -209,7 +225,7 @@ public class I2PTunnelConnectClient extends I2PTunnelHTTPClientBase implements R
destination = currentProxy;
usingWWWProxy = true;
newRequest.append("CONNECT ").append(host).append(restofline).append("\r\n"); // HTTP spec
} else if (host.toLowerCase().equals("localhost")) {
} else if (host.toLowerCase(Locale.US).equals("localhost")) {
writeErrorMessage(ERR_LOCALHOST, out);
s.close();
return;
@@ -224,7 +240,7 @@ public class I2PTunnelConnectClient extends I2PTunnelHTTPClientBase implements R
_log.debug(getPrefix(requestId) + "REST :" + restofline + ":");
_log.debug(getPrefix(requestId) + "DEST :" + destination + ":");
}
} else if (line.toLowerCase().startsWith("proxy-authorization: basic ")) {
} else if (line.toLowerCase(Locale.US).startsWith("proxy-authorization: basic ")) {
// strip Proxy-Authenticate from the response in HTTPResponseOutputStream
// save for auth check below
authorization = line.substring(27); // "proxy-authorization: basic ".length()
@@ -261,7 +277,7 @@ public class I2PTunnelConnectClient extends I2PTunnelHTTPClientBase implements R
}
}
if (destination == null || !"CONNECT".equalsIgnoreCase(method)) {
if (destination == null || method == null || !"CONNECT".equals(method.toUpperCase(Locale.US))) {
writeErrorMessage(ERR_BAD_PROTOCOL, out);
s.close();
return;

View File

@@ -39,6 +39,7 @@ import net.i2p.data.Hash;
import net.i2p.util.EventDispatcher;
import net.i2p.util.FileUtil;
import net.i2p.util.Log;
import net.i2p.util.PortMapper;
import net.i2p.util.Translate;
/**
@@ -291,6 +292,7 @@ public class I2PTunnelHTTPClient extends I2PTunnelHTTPClientBase implements Runn
public void startRunning() {
super.startRunning();
this.isr = new InternalSocketRunner(this);
_context.portMapper().register(PortMapper.SVC_HTTP_PROXY, getLocalPort());
}
/**
@@ -298,6 +300,9 @@ public class I2PTunnelHTTPClient extends I2PTunnelHTTPClientBase implements Runn
*/
@Override
public boolean close(boolean forced) {
int reg = _context.portMapper().getPort(PortMapper.SVC_HTTP_PROXY);
if (reg == getLocalPort())
_context.portMapper().unregister(PortMapper.SVC_HTTP_PROXY);
boolean rv = super.close(forced);
if (this.isr != null)
this.isr.stopRunning();
@@ -336,7 +341,7 @@ public class I2PTunnelHTTPClient extends I2PTunnelHTTPClientBase implements Runn
if (_log.shouldLog(Log.DEBUG))
_log.debug(getPrefix(requestId) + "Line=[" + line + "]");
String lowercaseLine = line.toLowerCase();
String lowercaseLine = line.toLowerCase(Locale.US);
if (lowercaseLine.startsWith("connection: ") ||
lowercaseLine.startsWith("keep-alive: ") ||
lowercaseLine.startsWith("proxy-connection: "))
@@ -365,7 +370,7 @@ public class I2PTunnelHTTPClient extends I2PTunnelHTTPClientBase implements Runn
}
// "http://" + "foo.i2p/bar/baz.html" + " HTTP/1.0"
request = "http://" + uri + subRequest.substring(protopos);
} else if (request.toLowerCase().startsWith("http://i2p/")) {
} else if (request.toLowerCase(Locale.US).startsWith("http://i2p/")) {
// http://i2p/b64key/bar/baz.html HTTP/1.0
String subRequest = request.substring("http://i2p/".length());
int protopos = subRequest.indexOf(" ");
@@ -433,11 +438,11 @@ public class I2PTunnelHTTPClient extends I2PTunnelHTTPClientBase implements Runn
destination = host;
host = getHostName(destination);
line = method + ' ' + request.substring(pos);
} else if (host.toLowerCase().equals(LOCAL_SERVER)) {
} else if (host.toLowerCase(Locale.US).equals(LOCAL_SERVER)) {
// so we don't do any naming service lookups
destination = host;
usingInternalServer = true;
} else if (host.toLowerCase().endsWith(".i2p")) {
} else if (host.toLowerCase(Locale.US).endsWith(".i2p")) {
// Destination gets the host name
destination = host;
// Host becomes the destination's "{b32}.b32.i2p" string, or "i2p" on lookup failure
@@ -498,7 +503,7 @@ public class I2PTunnelHTTPClient extends I2PTunnelHTTPClientBase implements Runn
if (host == null || "i2p".equals(host)) {
// Host lookup failed - resolvable only with addresshelper
// Store in local HashMap unless there is conflict
String old = addressHelpers.putIfAbsent(destination.toLowerCase(), ahelperKey);
String old = addressHelpers.putIfAbsent(destination.toLowerCase(Locale.US), ahelperKey);
ahelperNew = old == null;
if ((!ahelperNew) && !old.equals(ahelperKey)) {
// Conflict: handle when URL reconstruction done
@@ -570,7 +575,7 @@ public class I2PTunnelHTTPClient extends I2PTunnelHTTPClientBase implements Runn
line = method + " " + request.substring(pos);
// end of (host endsWith(".i2p"))
} else if (host.toLowerCase().equals("localhost") || host.equals("127.0.0.1") ||
} else if (host.toLowerCase(Locale.US).equals("localhost") || host.equals("127.0.0.1") ||
host.startsWith("192.168.")) {
// if somebody is trying to get to 192.168.example.com, oh well
if (out != null) {
@@ -758,7 +763,7 @@ public class I2PTunnelHTTPClient extends I2PTunnelHTTPClientBase implements Runn
if (method == null || destination == null) {
//l.log("No HTTP method found in the request.");
if (out != null) {
if ("http://".equalsIgnoreCase(protocol))
if (protocol != null && "http://".equals(protocol.toLowerCase(Locale.US)))
out.write(getErrorPage("denied", ERR_REQUEST_DENIED));
else
out.write(getErrorPage("protocol", ERR_BAD_PROTOCOL));
@@ -804,15 +809,15 @@ public class I2PTunnelHTTPClient extends I2PTunnelHTTPClientBase implements Runn
// look it up again as the naming service does not do negative caching
// so it will be slow.
Destination clientDest = null;
String addressHelper = addressHelpers.get(destination.toLowerCase());
String addressHelper = addressHelpers.get(destination.toLowerCase(Locale.US));
if (addressHelper != null) {
clientDest = _context.namingService().lookup(addressHelper);
// remove bad entries
if (clientDest == null)
addressHelpers.remove(destination.toLowerCase());
addressHelpers.remove(destination.toLowerCase(Locale.US));
} else if ("i2p".equals(host)) {
clientDest = null;
} else if (destination.length() == 60 && destination.toLowerCase().endsWith(".b32.i2p")) {
} else if (destination.length() == 60 && destination.toLowerCase(Locale.US).endsWith(".b32.i2p")) {
// use existing session to look up for efficiency
verifySocketManager();
I2PSession sess = sockMgr.getSession();
@@ -841,7 +846,7 @@ public class I2PTunnelHTTPClient extends I2PTunnelHTTPClientBase implements Runn
header = getErrorPage("dnfp", ERR_DESTINATION_UNKNOWN);
else if (ahelperPresent)
header = getErrorPage("dnfb", ERR_DESTINATION_UNKNOWN);
else if (destination.length() == 60 && destination.toLowerCase().endsWith(".b32.i2p"))
else if (destination.length() == 60 && destination.toLowerCase(Locale.US).endsWith(".b32.i2p"))
header = getErrorPage("dnf", ERR_DESTINATION_UNKNOWN);
else {
header = getErrorPage("dnfh", ERR_DESTINATION_UNKNOWN);
@@ -935,15 +940,15 @@ public class I2PTunnelHTTPClient extends I2PTunnelHTTPClientBase implements Runn
ahelperKey + "</textarea></td></tr></table>\n" +
"<hr><div class=\"formaction\">"+
"<form method=\"GET\" action=\"" + targetRequest + "\">" +
"<button type=\"submit\">" + _("Continue to {0} without saving", destination) + "</button>" +
"<button type=\"submit\" class=\"go\">" + _("Continue to {0} without saving", destination) + "</button>" +
"</form>\n<form method=\"GET\" action=\"http://" + LOCAL_SERVER + "/add\">" +
"<input type=\"hidden\" name=\"host\" value=\"" + destination + "\">\n" +
"<input type=\"hidden\" name=\"dest\" value=\"" + ahelperKey + "\">\n" +
"<input type=\"hidden\" name=\"nonce\" value=\"" + _proxyNonce + "\">\n" +
"<button type=\"submit\" name=\"router\" value=\"router\">" + _("Save {0} to router address book and continue to eepsite", destination) + "</button><br>\n").getBytes("UTF-8"));
"<button type=\"submit\" class=\"accept\" name=\"router\" value=\"router\">" + _("Save {0} to router address book and continue to eepsite", destination) + "</button><br>\n").getBytes("UTF-8"));
if (_context.namingService().getName().equals("BlockfileNamingService")) {
// only blockfile supports multiple books
out.write(("<button type=\"submit\" name=\"master\" value=\"master\">" + _("Save {0} to master address book and continue to eepsite", destination) + "</button><br>\n").getBytes("UTF-8"));
out.write(("<br><button type=\"submit\" name=\"master\" value=\"master\">" + _("Save {0} to master address book and continue to eepsite", destination) + "</button><br>\n").getBytes("UTF-8"));
out.write(("<button type=\"submit\" name=\"private\" value=\"private\">" + _("Save {0} to private address book and continue to eepsite", destination) + "</button>\n").getBytes("UTF-8"));
}
out.write(("<input type=\"hidden\" name=\"url\" value=\"" + targetRequest + "\">\n" +
@@ -984,7 +989,7 @@ public class I2PTunnelHTTPClient extends I2PTunnelHTTPClientBase implements Runn
*/
private final String getHostName(String host) {
if (host == null) return null;
if (host.length() == 60 && host.toLowerCase().endsWith(".b32.i2p"))
if (host.length() == 60 && host.toLowerCase(Locale.US).endsWith(".b32.i2p"))
return host;
Destination dest = _context.namingService().lookup(host);
if (dest == null) return "i2p";
@@ -1188,7 +1193,7 @@ public class I2PTunnelHTTPClient extends I2PTunnelHTTPClientBase implements Runn
}
}
****/
return protocol.equalsIgnoreCase("http://");
return protocol.toLowerCase(Locale.US).equals("http://");
}
private final static byte[] ERR_404 =
@@ -1353,7 +1358,7 @@ public class I2PTunnelHTTPClient extends I2PTunnelHTTPClientBase implements Runn
"</head><body>\n" +
"<div class=logo>\n" +
"<a href=\"http://127.0.0.1:7657/\" title=\"" + _("Router Console") + "\"><img src=\"http://proxy.i2p/themes/console/images/i2plogo.png\" alt=\"I2P Router Console\" border=\"0\"></a><hr>\n" +
"<a href=\"http://127.0.0.1:7657/config\">" + _("Configuration") + "</a> <a href=\"http://127.0.0.1:7657/help.jsp\">" + _("Help") + "</a> <a href=\"http://127.0.0.1:7657/susidns/index.jsp\">" + _("Addressbook") + "</a>\n" +
"<a href=\"http://127.0.0.1:7657/config\">" + _("Configuration") + "</a> <a href=\"http://127.0.0.1:7657/help.jsp\">" + _("Help") + "</a> <a href=\"http://127.0.0.1:7657/susidns/index\">" + _("Addressbook") + "</a>\n" +
"</div>" +
"<div class=warning id=warning>\n" +
"<h3>" +

View File

@@ -10,6 +10,7 @@ import java.net.Socket;
import java.util.ArrayList;
import java.io.File;
import java.util.List;
import java.util.Locale;
import net.i2p.I2PAppContext;
import net.i2p.client.streaming.I2PSocketManager;
@@ -55,7 +56,7 @@ public abstract class I2PTunnelHTTPClientBase extends I2PTunnelClientBase implem
}
}
protected static final int DEFAULT_READ_TIMEOUT = 60*1000;
protected static final int DEFAULT_READ_TIMEOUT = 5*60*1000;
protected static long __requestId = 0;
@@ -101,7 +102,8 @@ public abstract class I2PTunnelHTTPClientBase extends I2PTunnelClientBase implem
// Ref: RFC 2617
// If the socket is an InternalSocket, no auth required.
String authRequired = getTunnel().getClientOptions().getProperty(PROP_AUTH);
if (authRequired != null && (authRequired.equalsIgnoreCase("true") || authRequired.equalsIgnoreCase("basic"))) {
if (Boolean.valueOf(authRequired).booleanValue() ||
(authRequired != null && "basic".equals(authRequired.toLowerCase(Locale.US)))) {
if (s instanceof InternalSocket) {
if (_log.shouldLog(Log.INFO))
_log.info(getPrefix(requestId) + "Internal access, no auth required");

View File

@@ -14,6 +14,7 @@ import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Properties;
import java.util.zip.GZIPOutputStream;
@@ -45,6 +46,8 @@ public class I2PTunnelHTTPServer extends I2PTunnelServer {
private static final String SERVER_HEADER = "Server";
private static final String[] SERVER_SKIPHEADERS = {SERVER_HEADER};
private static final long HEADER_TIMEOUT = 60*1000;
private static final long START_INTERVAL = (60 * 1000) * 3;
private long _startedOn = 0L;
private final static byte[] ERR_UNAVAILABLE =
("HTTP/1.1 503 Service Unavailable\r\n"+
@@ -80,6 +83,14 @@ public class I2PTunnelHTTPServer extends I2PTunnelServer {
getTunnel().getContext().statManager().createRateStat("i2ptunnel.httpNullWorkaround", "How often an http server works around a streaming lib or i2ptunnel bug", "I2PTunnel.HTTPServer", new long[] { 60*1000, 10*60*1000 });
}
@Override
public void startRunning() {
super.startRunning();
_startedOn = getTunnel().getContext().clock().now();
// Would be better if this was set when the inbound tunnel becomes alive.
}
/**
* Called by the thread pool of I2PSocket handlers
*
@@ -167,8 +178,10 @@ public class I2PTunnelHTTPServer extends I2PTunnelServer {
try {
socket.close();
} catch (IOException ioe) {}
if (_log.shouldLog(Log.ERROR))
_log.error("Error connecting to HTTP server " + remoteHost + ':' + remotePort, ex);
// Don't complain too early, Jetty may not be ready.
int level = getTunnel().getContext().clock().now() - _startedOn > START_INTERVAL ? Log.ERROR : Log.WARN;
if (_log.shouldLog(level))
_log.log(level, "Error connecting to HTTP server " + remoteHost + ':' + remotePort, ex);
} catch (IOException ex) {
try {
socket.close();
@@ -507,16 +520,17 @@ public class I2PTunnelHTTPServer extends I2PTunnelServer {
else
value = "";
if ("Accept-encoding".equalsIgnoreCase(name))
if ("accept-encoding".equals(name.toLowerCase(Locale.US)))
name = "Accept-encoding";
else if ("X-Accept-encoding".equalsIgnoreCase(name))
else if ("x-accept-encoding".equals(name.toLowerCase(Locale.US)))
name = "X-Accept-encoding";
// For incoming, we remove certain headers to prevent spoofing.
// For outgoing, we remove certain headers to improve anonymity.
boolean skip = false;
String lcName = name.toLowerCase(Locale.US);
for (String skipHeader: skipHeaders) {
if (skipHeader.equalsIgnoreCase(name)) {
if (skipHeader.toLowerCase(Locale.US).equals(lcName)) {
skip = true;
break;
}

View File

@@ -9,6 +9,7 @@ import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;
import net.i2p.I2PException;
import net.i2p.client.streaming.I2PSocket;
import net.i2p.data.Base32;
import net.i2p.data.Destination;
@@ -20,6 +21,7 @@ import net.i2p.i2ptunnel.irc.IrcOutboundFilter;
import net.i2p.util.EventDispatcher;
import net.i2p.util.I2PAppThread;
import net.i2p.util.Log;
import net.i2p.util.PortMapper;
/**
* Todo: Can we extend I2PTunnelClient instead and remove some duplicated code?
@@ -112,7 +114,7 @@ public class I2PTunnelIRCClient extends I2PTunnelClientBase {
in.start();
Thread out = new I2PAppThread(new IrcOutboundFilter(s,i2ps, expectedPong, _log, dcc), "IRC Client " + __clientId + " out", true);
out.start();
} catch (Exception ex) {
} catch (I2PException ex) {
if (_log.shouldLog(Log.ERROR))
_log.error("Error connecting", ex);
//l.log("Error connecting: " + ex.getMessage());
@@ -122,6 +124,17 @@ public class I2PTunnelIRCClient extends I2PTunnelClientBase {
mySockets.remove(sockLock);
}
}
} catch (Exception ex) {
// generally NoRouteToHostException
if (_log.shouldLog(Log.WARN))
_log.warn("Error connecting", ex);
//l.log("Error connecting: " + ex.getMessage());
closeSocket(s);
if (i2ps != null) {
synchronized (sockLock) {
mySockets.remove(sockLock);
}
}
}
}
@@ -139,8 +152,17 @@ public class I2PTunnelIRCClient extends I2PTunnelClientBase {
return dests.get(index);
}
@Override
public void startRunning() {
super.startRunning();
_context.portMapper().register(PortMapper.SVC_IRC, getLocalPort());
}
@Override
public boolean close(boolean forced) {
int reg = _context.portMapper().getPort(PortMapper.SVC_IRC);
if (reg == getLocalPort())
_context.portMapper().unregister(PortMapper.SVC_IRC);
synchronized(this) {
if (_DCCServer != null) {
_DCCServer.close(forced);

View File

@@ -6,6 +6,7 @@ import java.io.InputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.SocketException;
import java.util.Locale;
import java.util.Properties;
import net.i2p.client.streaming.I2PSocket;
@@ -197,18 +198,16 @@ public class I2PTunnelIRCServer extends I2PTunnelServer implements Runnable {
String field[]=s.split(" ",5);
String command;
int idx=0;
if(field[0].charAt(0)==':')
idx++;
try {
command = field[idx++];
if (field[0].charAt(0) == ':')
idx++;
command = field[idx++].toUpperCase(Locale.US);
} catch (IndexOutOfBoundsException ioobe) {
// wtf, server sent borked command?
throw new IOException("Dropping defective message: index out of bounds while extracting command.");
throw new IOException("Dropping defective message: [" + s + ']');
}
if ("USER".equalsIgnoreCase(command)) {
if ("USER".equals(command)) {
if (field.length < idx + 4)
throw new IOException("Too few parameters in USER message: " + s);
// USER zzz1 hostname localhost :zzz
@@ -221,7 +220,7 @@ public class I2PTunnelIRCServer extends I2PTunnelServer implements Runnable {
break;
}
buf.append(s).append("\r\n");
if ("SERVER".equalsIgnoreCase(command))
if ("SERVER".equals(command))
break;
}
//if (_log.shouldLog(Log.DEBUG))

View File

@@ -177,7 +177,7 @@ public class I2PTunnelServer extends I2PTunnelTask implements Runnable {
if (_usePool) {
String usePool = getTunnel().getClientOptions().getProperty(PROP_USE_POOL);
if (usePool != null)
_usePool = "true".equalsIgnoreCase(usePool);
_usePool = Boolean.valueOf(usePool).booleanValue();
else
_usePool = DEFAULT_USE_POOL;
}

View File

@@ -60,6 +60,14 @@ public abstract class I2PTunnelTask extends EventDispatcherImpl {
public abstract boolean close(boolean forced);
/**
* For tasks that don't call I2PTunnel.addSession() directly
* @since 0.8.13
*/
public void connected(I2PSession session) {
getTunnel().addSession(session);
}
public void disconnected(I2PSession session) {
routerDisconnected();
getTunnel().removeSession(session);

View File

@@ -482,7 +482,7 @@ public class TunnelController implements Logging {
/** default true */
public String getSharedClient() { return _config.getProperty("sharedClient", "true"); }
/** default true */
public boolean getStartOnLoad() { return "true".equalsIgnoreCase(_config.getProperty("startOnLoad", "true")); }
public boolean getStartOnLoad() { return Boolean.valueOf(_config.getProperty("startOnLoad", "true")).booleanValue(); }
public boolean getPersistentClientKey() { return Boolean.valueOf(_config.getProperty("option.persistentClientKey")).booleanValue(); }
public String getMyDestination() {
if (_tunnel != null) {

View File

@@ -1,6 +1,7 @@
package net.i2p.i2ptunnel.irc;
import java.util.Iterator;
import java.util.Locale;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
@@ -91,7 +92,7 @@ public class DCCClientManager extends EventReceiver {
* @param localPort bind to port or 0; if nonzero it will be the rv
*/
private int newIncoming(String b32, int port, String type, int localPort) {
b32 = b32.toLowerCase();
b32 = b32.toLowerCase(Locale.US);
// do some basic verification before starting the client
if (b32.length() != 60 || !b32.endsWith(".b32.i2p"))
return -1;

View File

@@ -111,18 +111,19 @@ public class I2PTunnelDCCServer extends I2PTunnelServer {
if (_log.shouldLog(Log.WARN))
_log.warn("Incoming DCC connection for I2P port " + myPort +
" sending to " + local.ia + ':' + local.port);
Socket s = new Socket(local.ia, local.port);
_sockList.add(socket);
new I2PTunnelRunner(s, socket, slock, null, _sockList);
local.socket = socket;
local.expire = getTunnel().getContext().clock().now() + OUTBOUND_EXPIRE;
_active.put(Integer.valueOf(myPort), local);
} catch (SocketException ex) {
try {
socket.close();
} catch (IOException ioe) {}
if (_log.shouldLog(Log.ERROR))
_log.error("Error connecting to server " + remoteHost + ':' + remotePort, ex);
Socket s = new Socket(local.ia, local.port);
_sockList.add(socket);
new I2PTunnelRunner(s, socket, slock, null, _sockList);
local.socket = socket;
local.expire = getTunnel().getContext().clock().now() + OUTBOUND_EXPIRE;
_active.put(Integer.valueOf(myPort), local);
} catch (SocketException ex) {
try {
socket.close();
} catch (IOException ioe) {}
_log.error("Error relaying incoming DCC connection to IRC client at " + local.ia + ':' + local.port, ex);
}
} catch (IOException ex) {
_log.error("Error while waiting for I2PConnections", ex);
}

View File

@@ -1,5 +1,10 @@
package net.i2p.i2ptunnel.irc;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Locale;
import java.util.Set;
import net.i2p.data.DataHelper;
import net.i2p.util.Log;
@@ -50,12 +55,13 @@ abstract class IRCFilter {
"CAP"
};
if(field[0].charAt(0)==':')
idx++;
try { command = field[idx++]; }
catch (IndexOutOfBoundsException ioobe) // wtf, server sent borked command?
{
try {
if (field[0].charAt(0) == ':')
idx++;
command = field[idx++].toUpperCase(Locale.US);
} catch (IndexOutOfBoundsException ioobe) {
// wtf, server sent borked command?
//_log.warn("Dropping defective message: index out of bounds while extracting command.");
return null;
}
@@ -69,9 +75,9 @@ abstract class IRCFilter {
} catch(NumberFormatException nfe){}
if ("PING".equalsIgnoreCase(command))
if ("PING".equals(command))
return "PING 127.0.0.1"; // no way to know what the ircd to i2ptunnel server con is, so localhost works
if ("PONG".equalsIgnoreCase(command)) {
if ("PONG".equals(command)) {
// Turn the received ":irc.freshcoffee.i2p PONG irc.freshcoffee.i2p :127.0.0.1"
// into ":127.0.0.1 PONG 127.0.0.1 " so that the caller can append the client's extra parameter
// though, does 127.0.0.1 work for irc clients connecting remotely? and for all of them? sure would
@@ -88,16 +94,16 @@ abstract class IRCFilter {
// Allow all allowedCommands
for(int i=0;i<allowedCommands.length;i++) {
if(allowedCommands[i].equalsIgnoreCase(command))
if(allowedCommands[i].equals(command))
return s;
}
// Allow PRIVMSG, but block CTCP.
if("PRIVMSG".equalsIgnoreCase(command) || "NOTICE".equalsIgnoreCase(command))
if("PRIVMSG".equals(command) || "NOTICE".equals(command))
{
String msg;
msg = field[idx++];
if(msg.indexOf(0x01) >= 0) // CTCP marker ^A can be anywhere, not just immediately after the ':'
{
// CTCP
@@ -126,7 +132,7 @@ abstract class IRCFilter {
}
// XDCC looks safe, ip/port happens over regular DCC
// http://en.wikipedia.org/wiki/XDCC
if (msg.toUpperCase().startsWith("XDCC ") && helper != null && helper.isEnabled())
if (msg.toUpperCase(Locale.US).startsWith("XDCC ") && helper != null && helper.isEnabled())
return s;
if (ALLOW_ALL_CTCP_IN)
return s;
@@ -134,11 +140,99 @@ abstract class IRCFilter {
}
return s;
}
// Block the rest
return null;
}
private static final Set<String> _allowedOutbound;
static {
final String[] allowedCommands =
{
// Commands that regular users might use
"ADMIN",
"AWAY", // should be harmless
"CAP", // http://tools.ietf.org/html/draft-mitchell-irc-capabilities-01
"CYCLE",
"DCCALLOW",
"HELPME", "HELPOP", // helpop is what unrealircd uses by default
"INVITE",
"ISON", // jIRCii uses this for a ping (response is 303)
"JOIN",
"KICK",
"KNOCK",
"LIST",
"LUSERS",
"MAP", // seems safe enough, the ircd should protect themselves though
"MODE",
"MOTD",
"NAMES",
"NICK",
// "NOTICE", // can contain CTCP
"OPER",
// "PART", // replace with filtered PART to hide client part messages
"PASS",
// "PING",
// "PONG", // replaced with a filtered PING/PONG since some clients send the server IP (thanks aardvax!)
// "QUIT", // replace with a filtered QUIT to hide client quit messages
"RULES",
"SETNAME",
"SILENCE",
"STATS",
"TOPIC",
"USERHOST",
"VHOST",
"WATCH",
"WHO",
"WHOIS",
"WHOWAS",
// the next few are default aliases on unreal (+ anope)
"BOTSERV", "BS",
"CHANSERV", "CS",
"HELPSERV",
"HOSTSERV", "HS",
"MEMOSERV", "MS",
"NICKSERV", "NS",
"OPERSERV", "OS",
"STATSERV",
// IRCop commands
"ADCHAT",
"ADDMOTD",
"ADDOMOTD",
"CHATOPS",
"CHGHOST",
"CHGIDENT",
"CHGNAME",
"CLOSE",
"DCCDENY",
"DIE",
"GLOBOPS",
"GZLINE",
"HTM", // "High Traffic Mode"
"KILL",
"KLINE",
"LOCOPS",
"NACHAT",
"OPERMOTD",
"REHASH",
"RESTART",
"SAJOIN",
"SAMODE",
"SAPART",
"SDESC",
"SETHOST",
"SETIDENT",
"SHUN",
"SPAMFILTER",
"SQUIT",
"TEMPSHUN",
"UNDCCDENY",
"WALLOPS",
"ZLINE"
};
_allowedOutbound = new HashSet(Arrays.asList(allowedCommands));
}
/*************************************************************************
*
* Modify or filter a single outbound line.
@@ -147,37 +241,8 @@ abstract class IRCFilter {
* @return the original or modified line, or null if it should be dropped.
*/
public static String outboundFilter(String s, StringBuffer expectedPong, DCCHelper helper) {
String field[]=s.split(" ",3);
String command;
final String[] allowedCommands =
{
// "NOTICE", // can contain CTCP
"MODE",
"JOIN",
"NICK",
"WHO",
"WHOIS",
"LIST",
"NAMES",
"NICK",
// "QUIT", // replace with a filtered QUIT to hide client quit messages
"SILENCE",
"MAP", // seems safe enough, the ircd should protect themselves though
// "PART", // replace with filtered PART to hide client part messages
"OPER",
// "PONG", // replaced with a filtered PING/PONG since some clients send the server IP (thanks aardvax!)
// "PING",
"KICK",
"HELPME",
"RULES",
"TOPIC",
"ISON", // jIRCii uses this for a ping (response is 303)
"INVITE",
"AWAY", // should be harmless
// http://tools.ietf.org/html/draft-mitchell-irc-capabilities-01
"CAP"
};
if(field[0].length()==0)
return null; // W T F?
@@ -186,7 +251,7 @@ abstract class IRCFilter {
if(field[0].charAt(0)==':')
return null; // wtf
command = field[0].toUpperCase();
String command = field[0].toUpperCase(Locale.US);
if ("PING".equals(command)) {
// Most clients just send a PING and are happy with any old PONG. Others,
@@ -228,11 +293,8 @@ abstract class IRCFilter {
return "PONG 127.0.0.1"; // no way to know what the ircd to i2ptunnel server con is, so localhost works
// Allow all allowedCommands
for(int i=0;i<allowedCommands.length;i++)
{
if(allowedCommands[i].equals(command))
return s;
}
if (_allowedOutbound.contains(command))
return s;
// mIRC sends "NOTICE user :DCC Send file (IP)"
// in addition to the CTCP version
@@ -272,7 +334,7 @@ abstract class IRCFilter {
return filterDCCOut(field[0] + ' ' + field[1] + " :\001DCC ", msg.substring(4), helper);
// XDCC looks safe, ip/port happens over regular DCC
// http://en.wikipedia.org/wiki/XDCC
if (msg.toUpperCase().startsWith("XDCC ") && helper != null && helper.isEnabled())
if (msg.toUpperCase(Locale.US).startsWith("XDCC ") && helper != null && helper.isEnabled())
return s;
if (ALLOW_ALL_CTCP_OUT)
return s;

View File

@@ -14,6 +14,7 @@ import java.net.InetAddress;
import java.net.Socket;
import java.net.SocketException;
import java.util.List;
import java.util.Locale;
import net.i2p.I2PAppContext;
import net.i2p.I2PException;
@@ -198,8 +199,8 @@ public class SOCKS4aServer extends SOCKSServer {
I2PSocket destSock;
try {
if (connHostName.toLowerCase().endsWith(".i2p") ||
connHostName.toLowerCase().endsWith(".onion")) {
if (connHostName.toLowerCase(Locale.US).endsWith(".i2p") ||
connHostName.toLowerCase(Locale.US).endsWith(".onion")) {
_log.debug("connecting to " + connHostName + "...");
// Let's not due a new Dest for every request, huh?
//I2PSocketManager sm = I2PSocketManagerFactory.createManager();

View File

@@ -16,6 +16,7 @@ import java.net.SocketException;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import java.util.Properties;
import net.i2p.I2PAppContext;
@@ -355,7 +356,7 @@ public class SOCKS5Server extends SOCKSServer {
I2PSocket destSock;
try {
if (connHostName.toLowerCase().endsWith(".i2p")) {
if (connHostName.toLowerCase(Locale.US).endsWith(".i2p")) {
_log.debug("connecting to " + connHostName + "...");
// Let's not due a new Dest for every request, huh?
//I2PSocketManager sm = I2PSocketManagerFactory.createManager();

View File

@@ -107,6 +107,7 @@ import net.i2p.util.Log;
try {
ByteArrayInputStream in = new ByteArrayInputStream(key);
_session = client.createSession(in, tunnel.getClientOptions());
connected(_session);
} catch(Exception exc) {
throw new RuntimeException("failed to create session", exc);
}

View File

@@ -103,6 +103,7 @@ public class I2PTunnelUDPServerBase extends I2PTunnelTask implements Source, Sin
try {
_session = client.createSession(privData, getTunnel().getClientOptions());
connected(_session);
} catch(I2PSessionException exc) {
throw new RuntimeException("failed to create session", exc);
}

View File

@@ -114,7 +114,7 @@ public class EditBean extends IndexBean {
public boolean isSharedClient(int tunnel) {
TunnelController tun = getController(tunnel);
if (tun != null)
return "true".equalsIgnoreCase(tun.getSharedClient());
return Boolean.valueOf(tun.getSharedClient()).booleanValue();
else
return false;
}

View File

@@ -14,6 +14,7 @@ import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
@@ -185,10 +186,10 @@ public class IndexBean {
else if ("start".equals(_action))
return start();
else if ("Save changes".equals(_action) || // IE workaround:
(_action.toLowerCase().indexOf("s</span>ave") >= 0))
(_action.toLowerCase(Locale.US).indexOf("s</span>ave") >= 0))
return saveChanges();
else if ("Delete this proxy".equals(_action) || // IE workaround:
(_action.toLowerCase().indexOf("d</span>elete") >= 0))
(_action.toLowerCase(Locale.US).indexOf("d</span>elete") >= 0))
return deleteTunnel();
else if ("Estimate".equals(_action))
return PrivateKeyFile.estimateHashCashTime(_hashCashValue);
@@ -265,7 +266,7 @@ public class IndexBean {
}
// Only modify other shared tunnels
// if the current tunnel is shared, and of supported type
if ("true".equalsIgnoreCase(cur.getSharedClient()) && isClient(cur.getType())) {
if (Boolean.valueOf(cur.getSharedClient()).booleanValue() && isClient(cur.getType())) {
// all clients use the same I2CP session, and as such, use the same I2CP options
List controllers = _group.getControllers();
@@ -277,7 +278,7 @@ public class IndexBean {
// Only modify this non-current tunnel
// if it belongs to a shared destination, and is of supported type
if ("true".equalsIgnoreCase(c.getSharedClient()) && isClient(c.getType())) {
if (Boolean.valueOf(c.getSharedClient()).booleanValue() && isClient(c.getType())) {
Properties cOpt = c.getConfig("");
if (_tunnelQuantity != null) {
cOpt.setProperty("option.inbound.quantity", _tunnelQuantity);
@@ -341,7 +342,8 @@ public class IndexBean {
String pk = cur.getPrivKeyFile();
if (pk == null)
pk = _privKeyFile;
if (pk != null && pk.startsWith("i2ptunnel") && pk.endsWith("-privKeys.dat")) {
if (pk != null && pk.startsWith("i2ptunnel") && pk.endsWith("-privKeys.dat") &&
((!isClient(cur.getType())) || cur.getPersistentClientKey())) {
File pkf = new File(_context.getConfigDir(), pk);
if (pkf.exists()) {
String name = cur.getName();

View File

@@ -0,0 +1,25 @@
package net.i2p.i2ptunnel.web;
/**
* A temporary data holder for the wizard pages
*
* Warning - This class is not part of the i2ptunnel API, and at some point
* it will be moved from the jar to the war.
* Usage by classes outside of i2ptunnel.war is deprecated.
*/
public class WizardBean extends EditBean {
private boolean _isClient;
public WizardBean() { super(); }
/**
* Whether the tunnel being set up is a client tunnel or not.
* @since 0.8.13
*/
public void setIsClient(String isClient) {
_isClient = Boolean.valueOf(isClient);
}
/** @since 0.8.13 */
public boolean getIsClient() {
return _isClient;
}
}

View File

@@ -56,7 +56,7 @@
<div class="header"></div>
<div class="footer">
<div class="toolbox">
<a class="control" href="list?nonce=<%=indexBean.getNextNonce()%>&amp;action=Stop%20all"><%=intl._("Stop All")%></a> <a class="control" href="list?nonce=<%=indexBean.getNextNonce()%>&amp;action=Start%20all"><%=intl._("Start All")%></a> <a class="control" href="list?nonce=<%=indexBean.getNextNonce()%>&amp;action=Restart%20all"><%=intl._("Restart All")%></a> <a class="control" href="list?nonce=<%=indexBean.getNextNonce()%>&amp;action=Reload%20configuration"><%=intl._("Reload Config")%></a>
<a class="control" href="wizard"><%=intl._("Tunnel Wizard")%></a> <a class="control" href="list?nonce=<%=indexBean.getNextNonce()%>&amp;action=Stop%20all"><%=intl._("Stop All")%></a> <a class="control" href="list?nonce=<%=indexBean.getNextNonce()%>&amp;action=Start%20all"><%=intl._("Start All")%></a> <a class="control" href="list?nonce=<%=indexBean.getNextNonce()%>&amp;action=Restart%20all"><%=intl._("Restart All")%></a> <a class="control" href="list?nonce=<%=indexBean.getNextNonce()%>&amp;action=Reload%20configuration"><%=intl._("Reload Config")%></a>
</div>
</div>
</div>

View File

@@ -18,6 +18,11 @@
<url-pattern>/edit</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>net.i2p.i2ptunnel.jsp.wizard_jsp</servlet-name>
<url-pattern>/wizard</url-pattern>
</servlet-mapping>
<session-config>
<session-timeout>
30

View File

@@ -0,0 +1,542 @@
<%
// NOTE: Do the header carefully so there is no whitespace before the <?xml... line
%><%@page pageEncoding="UTF-8"
%><%@page contentType="text/html" import="net.i2p.i2ptunnel.web.WizardBean"
%><?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<jsp:useBean class="net.i2p.i2ptunnel.web.WizardBean" id="wizardBean" scope="request" />
<jsp:useBean class="net.i2p.i2ptunnel.web.Messages" id="intl" scope="request" />
<% String pageStr = request.getParameter("page");
/* Get the number of the page we came from */
int lastPage = 0;
if (pageStr != null) {
try {
lastPage = Integer.parseInt(pageStr);
if (lastPage > 7 || lastPage < 0) {
lastPage = 0;
}
} catch (NumberFormatException nfe) {
lastPage = 0;
}
}
/* Determine what page to display now */
int curPage = 1;
if ("Previous page".equals(request.getParameter("action"))) {
curPage = lastPage - 1;
} else {
curPage = lastPage + 1;
}
if (curPage > 7 || curPage <= 0) {
curPage = 1;
}
/* Fetch and format a couple of regularly-used values */
boolean tunnelIsClient = Boolean.valueOf(request.getParameter("isClient"));
String tunnelType = request.getParameter("type");
/* Special case - don't display page 4 for server tunnels */
if (curPage == 4 && !tunnelIsClient) {
if ("Previous page".equals(request.getParameter("action"))) {
curPage = curPage - 1;
} else {
curPage = curPage + 1;
}
}
%>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title><%=intl._("I2P Tunnel Manager - Tunnel Creation Wizard")%></title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
<link href="/themes/console/images/favicon.ico" type="image/x-icon" rel="shortcut icon" />
<% if (wizardBean.allowCSS()) {
%><link href="<%=wizardBean.getTheme()%>default.css" rel="stylesheet" type="text/css" />
<link href="<%=wizardBean.getTheme()%>i2ptunnel.css" rel="stylesheet" type="text/css" />
<% }
%>
</head>
<body id="tunnelWizardPage">
<div id="pageHeader">
</div>
<form method="post" action="<%=(curPage == 7 ? "list" : "wizard") %>">
<div id="wizardPanel" class="panel">
<div class="header">
<%
if (curPage == 1) {
%><h4><%=intl._("Server or client tunnel?")%></h4><%
} else if (curPage == 2) {
%><h4><%=intl._("Tunnel type")%></h4><%
} else if (curPage == 3) {
%><h4><%=intl._("Tunnel name and description")%></h4><%
} else if (curPage == 4 && tunnelIsClient) {
%><h4><%=intl._("Tunnel destination")%></h4><%
} else if (curPage == 5) {
%><h4><%=intl._("Binding address and port")%></h4><%
} else if (curPage == 6) {
%><h4><%=intl._("Tunnel auto-start")%></h4><%
} else if (curPage == 7) {
%><h4><%=intl._("Wizard completed")%></h4><%
} %>
<input type="hidden" name="page" value="<%=curPage%>" />
<input type="hidden" name="tunnel" value="null" />
<input type="hidden" name="nonce" value="<%=wizardBean.getNextNonce()%>" />
</div>
<div class="separator">
<hr />
</div>
<% /* Page 1 - Whether to make a client or server tunnel */
if (curPage == 1) {
%><p>
<%=intl._("This wizard will take you through the various options available for creating tunnels in I2P.")%>
</p>
<p>
<%=intl._("The first thing to decide is whether you want to create a server or a client tunnel.")%>
<%=intl._("If you need to connect to a remote service, such as an IRC server inside I2P or a code repository, then you will require a CLIENT tunnel.")%>
<%=intl._("On the other hand, if you wish to host a service for others to connect to you'll need to create a SERVER tunnel.")%>
</p>
<div id="typeField" class="rowItem">
<label><%=intl._("Server Tunnel")%></label>
<input value="false" type="radio" id="baseType" name="isClient" class="tickbox" />
<label><%=intl._("Client Tunnel")%></label>
<input value="true" type="radio" id="baseType" name="isClient" class="tickbox" checked="checked" />
</div><%
} else {
%><input type="hidden" name="isClient" value="<%=tunnelIsClient%>" /><%
} /* curPage 1 */
/* End page 1 */ %>
<% /* Page 2 - Tunnel type */
if (curPage == 2) {
%><p>
<%=intl._("There are several types of tunnels to choose from:")%>
</p>
<table><%
if (tunnelIsClient) {
%>
<tr><td><%=intl._("Standard")%></td><td>
<%=intl._("Basic tunnel for connecting to a single service inside I2P.")%>
<%=intl._("Try this if none of the tunnel types below fit your requirements, or you don't know what type of tunnel you need.")%>
</td></tr>
<tr><td>HTTP</td><td>
<%=intl._("Tunnel that acts as an HTTP proxy for reaching eepsites inside I2P.")%>
<%=intl._("Set your browser to use this tunnel as an http proxy, or set your \"http_proxy\" environment variable for command-line applications in GNU/Linux.")%>
<%=intl._("Websites outside I2P can also be reached if an HTTP proxy within I2P is known.")%>
</td></tr>
<tr><td>IRC</td><td>
<%=intl._("Customised client tunnel specific for IRC connections.")%>
<%=intl._("With this tunnel type, your IRC client will be able to connect to an IRC network inside I2P.")%>
<%=intl._("Each IRC network in I2P that you wish to connect to will require its own tunnel. (See Also, SOCKS IRC)")%>
</td></tr>
<tr><td>SOCKS 4/4a/5</td><td>
<%=intl._("A tunnel that implements the SOCKS protocol.")%>
<%=intl._("This enables both TCP and UDP connections to be made through a SOCKS outproxy within I2P.")%>
</td></tr>
<tr><td>SOCKS IRC</td><td>
<%=intl._("A client tunnel implementing the SOCKS protocol, which is customised for connecting to IRC networks.")%>
<%=intl._("With this tunnel type, IRC networks in I2P can be reached by typing the I2P address into your IRC client, and configuring the IRC client to use this SOCKS tunnel.")%>
<%=intl._("This means that only one I2P tunnel is required rather than a separate tunnel per IRC network.")%>
<%=intl._("IRC networks outside I2P can also be reached if a SOCKS outproxy within I2P is known, though it depends on whether or not the outproxy has been blocked by the IRC network.")%>
</td></tr>
<tr><td>CONNECT</td><td>
<%=intl._("A client tunnel that implements the HTTP CONNECT command.")%>
<%=intl._("This enables TCP connections to be made through an HTTP outproxy, assuming the proxy supports the CONNECT command.")%>
</td></tr>
<tr><td>Streamr</td><td>
<%=intl._("A customised client tunnel for Streamr.")%><%
//XXX TODO<%=intl._("I have no idea what this is.")%>
</td></tr><%
} else {
%>
<tr><td><%=intl._("Standard")%></td><td>
<%=intl._("A basic server tunnel for hosting a generic service inside I2P.")%>
<%=intl._("Try this if none of the tunnel types below fit your requirements, or you don't know what type of tunnel you need.")%>
</td></tr>
<tr><td>HTTP</td><td>
<%=intl._("A server tunnel that is customised for HTTP connections.")%>
<%=intl._("Use this tunnel type if you want to host an eepsite.")%>
</td></tr>
<tr><td>HTTP bidir</td><td>
<%=intl._("A customised server tunnel that can both serve HTTP data and connect to other server tunnels.")%>
<%=intl._("This tunnel type is predominantly used when running a Seedless server.")%>
</td></tr>
<tr><td>IRC</td><td>
<%=intl._("A customised server tunnel for hosting IRC networks inside I2P.")%>
<%=intl._("Usually, a separate tunnel needs to be created for each IRC server that is to be accessible inside I2P.")%>
</td></tr>
<tr><td>Streamr</td><td>
<%=intl._("A customised server tunnel for Streamr.")%><%
//XXX TODO<%=intl._("I have no idea what this is.")%>
</td></tr><%
}
%>
</table>
<div id="typeField" class="rowItem">
<%
if (tunnelIsClient) {
%><select name="type">
<option value="client"><%=intl._("Standard")%></option>
<option value="httpclient">HTTP</option>
<option value="ircclient">IRC</option>
<option value="sockstunnel">SOCKS 4/4a/5</option>
<option value="socksirctunnel">SOCKS IRC</option>
<option value="connectclient">CONNECT</option>
<option value="streamrclient">Streamr</option>
</select><%
} else {
%><select name="type">
<option value="server"><%=intl._("Standard")%></option>
<option value="httpserver">HTTP</option>
<option value="httpbidirserver">HTTP bidir</option>
<option value="ircserver">IRC</option>
<option value="streamrserver">Streamr</option>
</select><%
} /* tunnelIsClient */ %>
</div><%
} else {
%><input type="hidden" name="type" value="<%=tunnelType%>" /><%
} /* curPage 2 */
/* End page 2 */ %>
<% /* Page 3 - Name and description */
if (curPage == 3) {
%><p>
<%=intl._("Choose a name and description for your tunnel.")%>
<%=intl._("These can be anything you want - they are just for ease of identifying the tunnel in the routerconsole.")%>
</p>
<div id="nameField" class="rowItem">
<label for="name" accesskey="N">
<%=intl._("Name")%>:(<span class="accessKey">N</span>)
</label>
<input type="text" size="30" maxlength="50" name="name" id="name" title="Tunnel Name" value="<%=(!"null".equals(request.getParameter("name")) ? request.getParameter("name") : "" ) %>" class="freetext" />
</div>
<div id="descriptionField" class="rowItem">
<label for="description" accesskey="e">
<%=intl._("Description")%>:(<span class="accessKey">E</span>)
</label>
<input type="text" size="60" maxlength="80" name="description" id="description" title="Tunnel Description" value="<%=(!"null".equals(request.getParameter("description")) ? request.getParameter("description") : "" ) %>" class="freetext" />
</div><%
} else {
%><input type="hidden" name="name" value="<%=request.getParameter("name")%>" />
<input type="hidden" name="description" value="<%=request.getParameter("description")%>" /><%
} /* curPage 3 */
/* End page 3 */ %>
<% /* Page 4 - Target destination or proxy list */
if (tunnelIsClient) {
if ("httpclient".equals(tunnelType) || "connectclient".equals(tunnelType) || "sockstunnel".equals(tunnelType) || "socksirctunnel".equals(tunnelType)) {
if (curPage == 4) {
%><p>
<%=intl._("If you know of any outproxies for this type of tunnel (either HTTP or SOCKS), fill them in below.")%>
<%=intl._("Separate multiple proxies with commas.")%>
</p>
<div id="destinationField" class="rowItem">
<label for="proxyList" accesskey="x">
<%=intl._("Outproxies")%>(<span class="accessKey">x</span>):
</label>
<input type="text" size="30" id="proxyList" name="proxyList" title="List of Outproxy I2P destinations" value="<%=(!"null".equals(request.getParameter("proxyList")) ? request.getParameter("proxyList") : "" ) %>" class="freetext" />
</div><%
} else {
%><input type="hidden" name="proxyList" value="<%=request.getParameter("proxyList")%>" /><%
} /* curPage 4 */
} else if ("client".equals(tunnelType) || "ircclient".equals(tunnelType) || "streamrclient".equals(tunnelType)) {
if (curPage == 4) {
%><p>
<%=intl._("Type in the I2P destination of the service that this client tunnel should connect to.")%>
<%=intl._("This could be the full base 64 destination key, or an I2P URL from your address book.")%>
</p>
<div id="destinationField" class="rowItem">
<label for="targetDestination" accesskey="T">
<%=intl._("Tunnel Destination")%>(<span class="accessKey">T</span>):
</label>
<input type="text" size="30" id="targetDestination" name="targetDestination" title="Destination of the Tunnel" value="<%=(!"null".equals(request.getParameter("targetDestination")) ? request.getParameter("targetDestination") : "" ) %>" class="freetext" />
<span class="comment">(<%=intl._("name or destination")%>; <%=intl._("b32 not recommended")%>)</span>
</div><%
} else {
%><input type="hidden" name="targetDestination" value="<%=request.getParameter("targetDestination")%>" /><%
} /* curPage 4 */
}
} /* tunnelIsClient */
/* End page 4 */ %>
<% /* Page 5 - Binding ports and addresses*/
if ((tunnelIsClient && "streamrclient".equals(tunnelType)) || (!tunnelIsClient && !"streamrserver".equals(tunnelType))) {
if (curPage == 5) {
%><p>
<%=intl._("This is the IP that your service is running on, this is usually on the same machine so 127.0.0.1 is autofilled.")%><%
//XXX TODO<%=intl._("For some reason streamrclient also uses this.")%>
</p>
<div id="hostField" class="rowItem">
<label for="targetHost" accesskey="H">
<%=intl._("Host")%>(<span class="accessKey">H</span>):
</label>
<input type="text" size="20" id="targetHost" name="targetHost" title="Target Hostname or IP" value="<%=(!"null".equals(request.getParameter("targetHost")) ? request.getParameter("targetHost") : "127.0.0.1" ) %>" class="freetext" />
</div><%
} else {
%><input type="hidden" name="targetHost" value="<%=request.getParameter("targetHost")%>" /><%
} /* curPage 5 */
} /* streamrclient or !streamrserver */ %>
<%
if (!tunnelIsClient) {
if (curPage == 5) {
%><p>
<%=intl._("This is the port that the service is accepting connections on.")%>
</p>
<div id="portField" class="rowItem">
<label for="targetPort" accesskey="P">
<%=intl._("Port")%>(<span class="accessKey">P</span>):
</label>
<input type="text" size="6" maxlength="5" id="targetPort" name="targetPort" title="Target Port Number" value="<%=(!"null".equals(request.getParameter("targetPort")) ? request.getParameter("targetPort") : "" ) %>" class="freetext" />
</div><%
} else {
%><input type="hidden" name="targetPort" value="<%=request.getParameter("targetPort")%>" /><%
} /* curPage 5 */
} /* !tunnelIsClient */ %>
<%
if (tunnelIsClient || "httpbidirserver".equals(tunnelType)) {
if (curPage == 5) {
%><p>
<%=intl._("This is the port that the client tunnel will be accessed from locally.")%>
<%=intl._("This is also the client port for the HTTPBidir server tunnel.")%>
</p>
<div id="portField" class="rowItem">
<label for="port" accesskey="P">
<span class="accessKey">P</span>ort:
</label>
<input type="text" size="6" maxlength="5" id="port" name="port" title="Access Port Number" value="<%=(!"null".equals(request.getParameter("port")) ? request.getParameter("port") : "" ) %>" class="freetext" />
</div><%
} else {
%><input type="hidden" name="port" value="<%=request.getParameter("port")%>" /><%
} /* curPage 5 */
} /* tunnelIsClient or httpbidirserver */ %>
<%
if ((tunnelIsClient && !"streamrclient".equals(tunnelType)) || "httpbidirserver".equals(tunnelType) || "streamrserver".equals(tunnelType)) {
if (curPage == 5) {
%><p>
<%=intl._("How do you want this tunnel to be accessed? By just this machine, your entire subnet, or external internet?")%>
<%=intl._("You will most likely want to just allow 127.0.0.1")%><%
//XXX TODO<%=intl._("Note that it is relevant to most Client tunnels, and httpbidirserver and streamrserver tunnels.")%><%
//XXX TODO<%=intl._("So the wording may need to change slightly for the client vs. server tunnels.")%>
</p>
<div id="reachField" class="rowItem">
<label for="reachableBy" accesskey="r">
<%=intl._("Reachable by")%>(<span class="accessKey">R</span>):
</label>
<select id="reachableBy" name="reachableBy" title="IP for Client Access" class="selectbox">
<%
String clientInterface = request.getParameter("reachableBy");
if ("null".equals(clientInterface)) {
clientInterface = "127.0.0.1";
}
for (String ifc : wizardBean.interfaceSet()) {
out.write("<option value=\"");
out.write(ifc);
out.write('\"');
if (ifc.equals(clientInterface))
out.write(" selected=\"selected\"");
out.write('>');
out.write(ifc);
out.write("</option>\n");
}
%>
</select>
</div><%
} else {
%><input type="hidden" name="reachableBy" value="<%=request.getParameter("reachableBy")%>" /><%
} /* curPage 5 */
} /* (tunnelIsClient && !streamrclient) || httpbidirserver || streamrserver */
/* End page 5 */ %>
<% /* Page 6 - Automatic start */
if (curPage == 6) {
%><p>
<%=intl._("The I2P router can automatically start this tunnel for you when the router is started.")%>
<%=intl._("This can be useful for frequently-used tunnels (especially server tunnels), but for tunnels that are only used occassionally it would mean that the I2P router is creating and maintaining unnecessary tunnels.")%>
</p>
<div id="startupField" class="rowItem">
<label for="startOnLoad" accesskey="a">
<%=intl._("Auto Start")%>(<span class="accessKey">A</span>):
</label>
<input value="1" type="checkbox" id="startOnLoad" name="startOnLoad" title="Start Tunnel Automatically"<%=("1".equals(request.getParameter("startOnLoad")) ? " checked=\"checked\"" : "")%> class="tickbox" />
<span class="comment"><%=intl._("(Check the Box for 'YES')")%></span>
</div><%
} else {
if ("1".equals(request.getParameter("startOnLoad"))) {
%><input type="hidden" name="startOnLoad" value="<%=request.getParameter("startOnLoad")%>" /><%
}
} /* curPage 6 */
/* End page 6 */ %>
<% /* Page 7 - Wizard complete */
if (curPage == 7) {
%><p>
<%=intl._("The wizard has now collected enough information to create your tunnel.")%>
<%=intl._("Upon clicking the Save button below, the wizard will set up the tunnel, and take you back to the main I2PTunnel page.")%>
<%
if ("1".equals(request.getParameter("startOnLoad"))) {
%><%=intl._("Because you chose to automatically start the tunnel when the router starts, you don't have to do anything further.")%>
<%=intl._("The router will start the tunnel once it has been set up.")%><%
} else {
%><%=intl._("Because you chose not to automatically start the tunnel, you will have to manually start it.")%>
<%=intl._("You can do this by clicking the Start button on the main page which corresponds to the new tunnel.")%><%
} %>
</p>
<p>
<%=intl._("Below is a summary of the options you chose:")%>
</p>
<table>
<tr><td><%=intl._("Server or client tunnel?")%></td><td>
<%=(tunnelIsClient ? "Client" : "Server")%>
</td></tr>
<tr><td><%=intl._("Tunnel type")%></td><td><%
if ("client".equals(tunnelType) || "server".equals(tunnelType)) { %>
<%=intl._("Standard")%><%
} else if ("httpclient".equals(tunnelType) || "httpserver".equals(tunnelType)) { %>
HTTP<%
} else if ("httpbidirserver".equals(tunnelType)) { %>
HTTP bidir<%
} else if ("ircclient".equals(tunnelType) || "ircserver".equals(tunnelType)) { %>
IRC<%
} else if ("sockstunnel".equals(tunnelType)) { %>
SOCKS 4/4a/5<%
} else if ("socksirctunnel".equals(tunnelType)) { %>
SOCKS IRC<%
} else if ("connectclient".equals(tunnelType)) { %>
CONNECT<%
} else if ("streamrclient".equals(tunnelType) || "streamrserver".equals(tunnelType)) { %>
Streamr<%
} %>
</td></tr>
<tr><td><%=intl._("Tunnel name and description")%></td><td>
<%=request.getParameter("name")%><br>
<%=request.getParameter("description")%>
</td></tr><%
if (tunnelIsClient) { %>
<tr><td><%=intl._("Tunnel destination")%></td><td><%
if ("httpclient".equals(tunnelType) || "connectclient".equals(tunnelType) || "sockstunnel".equals(tunnelType) || "socksirctunnel".equals(tunnelType)) { %>
<%=request.getParameter("proxyList")%><%
} else if ("client".equals(tunnelType) || "ircclient".equals(tunnelType) || "streamrclient".equals(tunnelType)) { %>
<%=request.getParameter("targetDestination")%><%
} %>
</td></tr><%
} %>
<tr><td><%=intl._("Binding address and port")%></td><td><%
if ((tunnelIsClient && "streamrclient".equals(tunnelType)) || (!tunnelIsClient && !"streamrserver".equals(tunnelType))) { %>
<%=request.getParameter("targetHost")%><br><%
}
if (!tunnelIsClient) { %>
<%=request.getParameter("targetPort")%><br><%
}
if (tunnelIsClient || "httpbidirserver".equals(tunnelType)) { %>
<br><%=request.getParameter("port")%><%
}
if ((tunnelIsClient && !"streamrclient".equals(tunnelType)) || "httpbidirserver".equals(tunnelType) || "streamrserver".equals(tunnelType)) { %>
<br><%=request.getParameter("reachableBy")%><%
} %>
</td></tr>
<tr><td><%=intl._("Tunnel auto-start")%></td><td><%
if ("1".equals(request.getParameter("startOnLoad"))) { %>
Yes<%
} else { %>
No<%
} %>
</td></tr>
</table>
<p>
<%=intl._("Alongside these basic settings, there are a number of advanced options for tunnel configuration.")%>
<%=intl._("The wizard will set reasonably sensible default values for these, but you can view and/or edit these by clicking on the tunnel's name in the main I2PTunnel page.")%>
</p>
<input type="hidden" name="tunnelDepth" value="2" />
<input type="hidden" name="tunnelVariance" value="0" />
<input type="hidden" name="tunnelQuantity" value="2" />
<input type="hidden" name="tunnelBackupQuantity" value="0" />
<input type="hidden" name="clientHost" value="internal" />
<input type="hidden" name="clientport" value="internal" />
<input type="hidden" name="customOptions" value="" />
<%
if (!"streamrclient".equals(tunnelType)) {
%><input type="hidden" name="profile" value="bulk" />
<input type="hidden" name="reduceCount" value="1" />
<input type="hidden" name="reduceTime" value="20" /><%
} /* !streamrclient */ %>
<%
if (tunnelIsClient) { /* Client-only defaults */
if (!"streamrclient".equals(tunnelType)) {
%><input type="hidden" name="newDest" value="0" />
<input type="hidden" name="closeTime" value="30" /><%
}
if ("httpclient".equals(tunnelType) || "connectclient".equals(tunnelType) || "sockstunnel".equals(tunnelType) || "socksirctunnel".equals(tunnelType)) {
%><input type="hidden" name="proxyUsername" value="" />
<input type="hidden" name="proxyPassword" value="" />
<input type="hidden" name="outproxyUsername" value="" />
<input type="hidden" name="outproxyPassword" value="" /><%
}
if ("httpclient".equals(tunnelType)) {
%><input type="hidden" name="jumpList" value="http://i2host.i2p/cgi-bin/i2hostjump?
http://stats.i2p/cgi-bin/jump.cgi?a=
http://i2jump.i2p/" /><%
} /* httpclient */
} else { /* Server-only defaults */
%><input type="hidden" name="encrypt" value="" />
<input type="hidden" name="encryptKey" value="" />
<input type="hidden" name="accessMode" value="0" />
<input type="hidden" name="accessList" value="" />
<input type="hidden" name="limitMinute" value="0" />
<input type="hidden" name="limitHour" value="0" />
<input type="hidden" name="limitDay" value="0" />
<input type="hidden" name="totalMinute" value="0" />
<input type="hidden" name="totalHour" value="0" />
<input type="hidden" name="totalDay" value="0" />
<input type="hidden" name="maxStreams" value="0" />
<input type="hidden" name="cert" value="0" /><%
} /* tunnelIsClient */
} /* curPage 7 */
/* End page 7 */ %>
</div>
<div id="globalOperationsPanel" class="panel">
<div class="header"></div>
<div class="footer">
<div class="toolbox">
<a class="control" href="list"><%=intl._("Cancel")%></a>
<% if (curPage != 1 && curPage != 7) {
%><button id="controlPrevious" accesskey="P" class="control" type="submit" name="action" value="Previous page" title="Previous Page"><%=intl._("Previous")%>(<span class="accessKey">P</span>)</button><%
} %>
<% if (curPage == 7) {
%><button id="controlSave" accesskey="S" class="control" type="submit" name="action" value="Save changes" title="Save Tunnel"><%=intl._("Save Tunnel")%>(<span class="accessKey">S</span>)</button><%
} else if (curPage == 6) {
%><button id="controlFinish" accesskey="F" class="control" type="submit" name="action" value="Next page" title="Finish Wizard"><%=intl._("Finish")%>(<span class="accessKey">F</span>)</button><%
} else {
%><button id="controlNext" accesskey="N" class="control" type="submit" name="action" value="Next page" title="Next Page"><%=intl._("Next")%>(<span class="accessKey">N</span>)</button><%
} %>
</div>
</div>
</div>
</form>
<div id="pageFooter">
</div>
</body>
</html>

File diff suppressed because it is too large Load Diff

View File

@@ -2,123 +2,124 @@
# Copyright (C) 2009 The I2P Project
# This file is distributed under the same license as the i2ptunnel package.
# To contribute translations, see http://www.i2p2.de/newdevelopers
#
#
# Translators:
# blabla, 2011.
# <blabla@trash-mail.com>, 2011.
# D.A. Loader <>, 2012.
# ducki2p <ducki2p@gmail.com>, 2011.
# foo <foo@bar>, 2009.
# mixxy, 2011.
msgid ""
msgstr ""
"Project-Id-Version: I2P\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-10-07 13:59+0000\n"
"PO-Revision-Date: 2011-10-07 01:43+0000\n"
"Last-Translator: blabla <blabla@trash-mail.com>\n"
"Language-Team: German (http://www.transifex.net/projects/p/I2P/team/de/)\n"
"Language: de\n"
"Report-Msgid-Bugs-To: https://trac.i2p2.de/\n"
"POT-Creation-Date: 2012-02-17 11:25+0000\n"
"PO-Revision-Date: 2012-02-19 14:19+0000\n"
"Last-Translator: D.A. Loader <>\n"
"Language-Team: German (http://www.transifex.net/projects/p/I2P/language/de/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: de\n"
"Plural-Forms: nplurals=2; plural=(n != 1)\n"
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:485
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:492
msgid "This seems to be a bad destination:"
msgstr "Dies scheint kein gültiges Ziel zu sein:"
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:485
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:492
msgid "i2paddresshelper cannot help you with a destination like that!"
msgstr "Der I2P-Adresshelfer kann dir bei solch einem Ziel nicht helfen."
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:554
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:561
#, java-format
msgid ""
"To visit the destination in your host database, click <a href=\"{0}\">here</"
"a>. To visit the conflicting addresshelper destination, click <a href="
"\"{1}\">here</a>."
msgstr ""
"Um das Ziel in Ihrer Host-Datenbank zu besuchen, klicken Sie <a href="
"\"{0}\">hier</a>, und um das Ziel aus der kollidierenden Adresshelfer-"
"Anfrage zu besuchen, <a href=\"{1}\">hier</a>!"
"To visit the destination in your host database, click <a "
"href=\"{0}\">here</a>. To visit the conflicting addresshelper destination, "
"click <a href=\"{1}\">here</a>."
msgstr "Um das Ziel in Ihrer Host-Datenbank zu besuchen, klicken Sie <a href=\"{0}\">hier</a>, und um das Ziel aus der kollidierenden Adresshelfer-Anfrage zu besuchen, <a href=\"{1}\">hier</a>!"
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:930
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:937
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:398
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:142
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:401
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:391
msgid "Host"
msgstr "Host"
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:931
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:370
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:938
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:372
msgid "Destination"
msgstr "Ziel"
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:936
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:943
#, java-format
msgid "Continue to {0} without saving"
msgstr "Weiter zu {0}, ohne zu speichern"
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:941
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:948
#, java-format
msgid "Save {0} to router address book and continue to eepsite"
msgstr "{0} im Router-Adressbuch speichern und auf die Eepseite weiterleiten"
#. only blockfile supports multiple books
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:944
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:951
#, java-format
msgid "Save {0} to master address book and continue to eepsite"
msgstr "{0} im Master-Adressbuch speichern und auf die Eepseite weiterleiten"
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:945
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:952
#, java-format
msgid "Save {0} to private address book and continue to eepsite"
msgstr "{0} im privaten Adressbuch speichern und auf die Eepseite weiterleiten"
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1101
msgid ""
"Click a link below to look for an address helper by using a \"jump\" service:"
msgstr ""
"Durch Klicken auf einen der untenstehenden Links bekommen Sie einen "
"Adresshelfer von einem \"Sprung\"-Service:"
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1107
msgid "HTTP Outproxy"
msgstr "HTTP-Outproxy"
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1319
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1112
msgid ""
"Click a link below to look for an address helper by using a \"jump\" "
"service:"
msgstr "Durch Klicken auf einen der untenstehenden Links bekommen Sie einen Adresshelfer von einem \"Sprung\"-Service:"
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1330
msgid "Added via address helper"
msgstr "Durch Adresshelfer hinzugefügt"
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1343
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1354
#, java-format
msgid "Redirecting to {0}"
msgstr "Weiterleitung zu {0}"
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1349
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1360
msgid "Router Console"
msgstr "Routerkonsole"
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1350
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1361
msgid "Addressbook"
msgstr "Adressbuch"
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1350
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1361
msgid "Configuration"
msgstr "Einstellungen"
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1350
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1361
msgid "Help"
msgstr "Hilfe"
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1355
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1366
#, java-format
msgid "Saved {0} to the {1} addressbook, redirecting now."
msgstr ""
"{0} wurde ins {1} Adressbuch geschrieben. Du wirst nun weitergeleitet."
msgstr "{0} wurde ins {1} Adressbuch geschrieben. Du wirst nun weitergeleitet."
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1356
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1367
#, java-format
msgid "Failed to save {0} to the {1} addressbook, redirecting now."
msgstr ""
"Konnte {0} nicht im {1} Adressbuch speichern. Du wirst nun weitergeleitet."
msgstr "Konnte {0} nicht im {1} Adressbuch speichern. Du wirst nun weitergeleitet."
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1358
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1369
msgid "Click here if you are not redirected automatically."
msgstr "Klick hier, wenn du nicht automatisch weitergeleitet wirst!"
@@ -127,95 +128,93 @@ msgstr "Klick hier, wenn du nicht automatisch weitergeleitet wirst!"
msgid "internal"
msgstr "intern"
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:174
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:175
msgid ""
"Invalid form submission, probably because you used the 'back' or 'reload' "
"button on your browser. Please resubmit."
msgstr ""
"Ungültige Formulareingabe - wahrscheinlich haben Sie den \"Zurück\"-Knopf "
"Ihres Browsers betätigt. Bitte neuladen!"
msgstr "Ungültige Formulareingabe - wahrscheinlich haben Sie den \"Zurück\"-Knopf Ihres Browsers betätigt. Bitte neuladen!"
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:221
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:222
msgid "Configuration reloaded for all tunnels"
msgstr "Einstellungen für alle Tunnel neugeladen"
#. and give them something to look at in any case
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:233
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:234
msgid "Starting tunnel"
msgstr "Starte Tunnel ..."
#. and give them something to look at in any case
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:246
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:247
msgid "Stopping tunnel"
msgstr "Beende Tunnel ..."
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:314
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:315
msgid "Configuration changes saved"
msgstr "Änderungen der Einstellungen gespeichert"
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:317
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:318
msgid "Failed to save configuration"
msgstr "Einstellungen nicht gespeichert"
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:435
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:436
msgid "New Tunnel"
msgstr "Neuer Tunnel"
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:455
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:456
msgid "Standard client"
msgstr "Standardklient"
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:456
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:457
msgid "HTTP client"
msgstr "HTTP-Klient"
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:457
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:458
msgid "IRC client"
msgstr "IRC-Klient"
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:458
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:459
msgid "Standard server"
msgstr "Standardserver"
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:459
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:460
msgid "HTTP server"
msgstr "HTTP-Server"
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:460
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:461
msgid "SOCKS 4/4a/5 proxy"
msgstr "SOCKS-4/4a/5-Proxy"
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:461
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:462
msgid "SOCKS IRC proxy"
msgstr "SOCKS-IRC-Proxy"
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:462
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:463
msgid "CONNECT/SSL/HTTPS proxy"
msgstr "CONNECT/SSL/HTTPS-Proxy"
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:463
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:464
msgid "IRC server"
msgstr "IRC-Server"
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:464
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:465
msgid "Streamr client"
msgstr "Streamr-Klient"
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:465
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:466
msgid "Streamr server"
msgstr "Streamr-Server"
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:466
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:467
msgid "HTTP bidir"
msgstr "HTTP Bidir"
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:554
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:293
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:555
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:295
msgid "Host not set"
msgstr "Host nicht gesetzt"
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:558
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:275
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:559
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:277
msgid "Port not set"
msgstr "Port nicht gesetzt"
@@ -233,24 +232,26 @@ msgstr "Neue Proxyeinstellungen"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:112
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:112
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:110
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:124
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:245
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:260
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:112
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:126
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:247
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:262
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:307
msgid "Name"
msgstr "Name"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:116
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:116
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:249
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:282
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:251
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:284
msgid "Type"
msgstr "Typ"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:120
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:120
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:229
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:389
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:231
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:391
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:311
msgid "Description"
msgstr "Beschreibung"
@@ -276,22 +277,27 @@ msgstr "benötigt"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:159
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:178
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:460
msgid "Reachable by"
msgstr "Erreichbar von"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:180
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:339
msgid "Outproxies"
msgstr "Ausgehende Proxies"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:187
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:359
msgid "Tunnel Destination"
msgstr "Ziel des Tunnels"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:199
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:363
msgid "name or destination"
msgstr "Name oder Ziel"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:202
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:366
msgid "b32 not recommended"
msgstr "B32-Adressen nicht empfohlen"
@@ -303,18 +309,18 @@ msgstr "versch. Klienten"
msgid ""
"(Share tunnels with other clients and irc/httpclients? Change requires "
"restart of client proxy)"
msgstr ""
"(Soll dieser Tunnel mit anderen Klienten und IRC/HTTP-Klienten geteilt "
"werden? Änderungen benötigen Neustart des Klientenproxys)"
msgstr "(Soll dieser Tunnel mit anderen Klienten und IRC/HTTP-Klienten geteilt werden? Änderungen benötigen Neustart des Klientenproxys)"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:216
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:124
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:500
msgid "Auto Start"
msgstr "Automatischer Start"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:220
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:228
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:128
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:504
msgid "(Check the Box for 'YES')"
msgstr "(Aktiviere das Kästchen für 'ja')"
@@ -331,9 +337,7 @@ msgstr "Erweiterte Netzwerkoptionen"
msgid ""
"(NOTE: when this client proxy is configured to share tunnels, then these "
"options are for all the shared proxy clients!)"
msgstr ""
"(HINWEIS: Ist dieser Proxy konfiguriert, Tunnel mit anderen Klienten zu "
"teilen, so gelten diese Optionen für alle Klienten des Proxys!)"
msgstr "(HINWEIS: Ist dieser Proxy konfiguriert, Tunnel mit anderen Klienten zu teilen, so gelten diese Optionen für alle Klienten des Proxys!)"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:236
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:245
@@ -378,15 +382,13 @@ msgstr "Varianz"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:278
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:287
msgid "0 hop variance (no randomisation, consistant performance)"
msgstr ""
"0-Hop-Varianz (keine zufällige Längenveränderung, konsistente Leistung)"
msgstr "0-Hop-Varianz (keine zufällige Längenveränderung, konsistente Leistung)"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:282
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:291
msgid ""
"+ 0-1 hop variance (medium additive randomisation, subtractive performance)"
msgstr ""
"+ 0-1 Hop Varianz (mittlere zufällige Verlängerung, verringert die Leistung)"
msgstr "+ 0-1 Hop Varianz (mittlere zufällige Verlängerung, verringert die Leistung)"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:286
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:295
@@ -397,8 +399,7 @@ msgstr "+ 0-2 Hops Varianz (hohe zufällige Verlängerung, verringerte Leistung)
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:290
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:299
msgid "+/- 0-1 hop variance (standard randomisation, standard performance)"
msgstr ""
"+/- 0-1 Hop Varianz (geringe zufällige Längenänderung, Standardleistung)"
msgstr "+/- 0-1 Hop Varianz (geringe zufällige Längenänderung, Standardleistung)"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:294
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:303
@@ -418,24 +419,20 @@ msgstr "Anzahl"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:318
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:327
msgid "1 inbound, 1 outbound tunnel (low bandwidth usage, less reliability)"
msgstr ""
"1 eingehender, 1 ausgehender Tunnel (geringe Bandbreitennutzung, weniger "
"zuverlässig)"
msgstr "1 eingehender, 1 ausgehender Tunnel (geringe Bandbreitennutzung, weniger zuverlässig)"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:322
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:331
msgid ""
"2 inbound, 2 outbound tunnels (standard bandwidth usage, standard "
"reliability)"
msgstr ""
"2 eingehende, 2 ausgehende Tunnel (Standardbandbreitennutzung, zuverlässig)"
msgstr "2 eingehende, 2 ausgehende Tunnel (Standardbandbreitennutzung, zuverlässig)"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:326
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:335
msgid ""
"3 inbound, 3 outbound tunnels (higher bandwidth usage, higher reliability)"
msgstr ""
"3 eingehende, 3 ausgehende Tunnel (hohe Bandbreitennutzung, zuverlässiger)"
msgstr "3 eingehende, 3 ausgehende Tunnel (hohe Bandbreitennutzung, zuverlässiger)"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:335
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:344
@@ -455,23 +452,18 @@ msgstr "0 Ersatztunnel (0 Redundanz, keine zusätzliche Ressourcennutzung)"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:351
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:360
msgid "1 backup tunnel each direction (low redundancy, low resource usage)"
msgstr ""
"1 Ersatztunnel in jede Richtung (geringe Redundanz, geringe "
"Ressourcennutzung)"
msgstr "1 Ersatztunnel in jede Richtung (geringe Redundanz, geringe Ressourcennutzung)"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:355
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:364
msgid ""
"2 backup tunnels each direction (medium redundancy, medium resource usage)"
msgstr ""
"2 Ersatztunnel in jede Richtung (mittlere Redundanz, mittlere "
"Ressourcennutzung)"
msgstr "2 Ersatztunnel in jede Richtung (mittlere Redundanz, mittlere Ressourcennutzung)"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:359
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:368
msgid "3 backup tunnels each direction (high redundancy, high resource usage)"
msgstr ""
"3 Ersatztunnel in jede Richtung (hohe Redundanz, hohe Ressourcennutzung)"
msgstr "3 Ersatztunnel in jede Richtung (hohe Redundanz, hohe Ressourcennutzung)"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:368
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:377
@@ -509,8 +501,9 @@ msgstr "I2CP-Adresse des Routers"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:406
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:148
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:409
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:247
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:269
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:249
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:271
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:412
msgid "Port"
msgstr "Port"
@@ -608,12 +601,11 @@ msgstr "Eigene Optionen"
msgid ""
"NOTE: If tunnel is currently running, most changes will not take effect "
"until tunnel is stopped and restarted."
msgstr ""
"HINWEIS: Falls der Tunnel gerade aktiv ist, werden die meisten Änderungen "
"erst nach einem Neustart des Tunnels wirksam."
msgstr "HINWEIS: Falls der Tunnel gerade aktiv ist, werden die meisten Änderungen erst nach einem Neustart des Tunnels wirksam."
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:524
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:531
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:678
msgid "Cancel"
msgstr "Abbrechen"
@@ -772,115 +764,466 @@ msgstr "Statusnachrichten"
msgid "Refresh"
msgstr "Auffrischen"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:94
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:92
msgid "Tunnel Wizard"
msgstr "Tunnel Wizard"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:96
msgid "Stop All"
msgstr "Alle stoppen"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:98
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:100
msgid "Start All"
msgstr "Alle starten"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:102
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:104
msgid "Restart All"
msgstr "Alle neustarten"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:106
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:108
msgid "Reload Config"
msgstr "Konfiguration neu einlesen"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:108
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:110
msgid "I2P Server Tunnels"
msgstr "I2P-Servertunnel"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:112
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:133
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:114
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:135
msgid "Points at"
msgstr "Läuft auf"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:114
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:156
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:160
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:116
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:158
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:162
msgid "Preview"
msgstr "Vorschau"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:116
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:180
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:253
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:300
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:118
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:182
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:255
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:302
msgid "Status"
msgstr "Status"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:166
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:168
msgid "Base32 Address"
msgstr "Basis-32-Adresse"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:174
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:176
msgid "No Preview"
msgstr "Keine Vorschau"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:187
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:307
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:189
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:309
msgid "Starting..."
msgstr "Starte ..."
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:194
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:208
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:314
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:328
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:342
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:196
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:210
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:316
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:330
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:344
msgid "Stop"
msgstr "Stopp"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:201
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:335
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:203
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:337
msgid "Running"
msgstr "Aktiv"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:215
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:349
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:217
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:351
msgid "Stopped"
msgstr "Gestoppt"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:222
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:356
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:224
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:358
msgid "Start"
msgstr "Start"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:237
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:239
msgid "New server tunnel"
msgstr "Neuer Servertunnel"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:239
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:399
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:241
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:401
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:204
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:246
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:276
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:282
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:554
msgid "Standard"
msgstr "Standard"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:241
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:401
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:243
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:403
msgid "Create"
msgstr "Erstellen"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:243
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:245
msgid "I2P Client Tunnels"
msgstr "I2P-Klienten-Tunnel"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:251
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:286
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:253
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:288
msgid "Interface"
msgstr "Interface"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:321
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:323
msgid "Standby"
msgstr "Wartestellung"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:366
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:368
msgid "Outproxy"
msgstr "Ausgehender Proxy"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:384
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:386
msgid "none"
msgstr "Keiner"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:397
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:399
msgid "New client tunnel"
msgstr "Neuer Kliententunnel"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:102
msgid "I2P Tunnel Manager - Tunnel Creation Wizard"
msgstr "I2P Tunnel Verwaltung - Tunnel aufsetz Wizard"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:120
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:545
msgid "Server or client tunnel?"
msgstr "Server oder Client Tunnel ?"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:126
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:549
msgid "Tunnel type"
msgstr "Tunnel Typ"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:132
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:579
msgid "Tunnel name and description"
msgstr "Tunnel Name und Beschreibung"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:138
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:588
msgid "Tunnel destination"
msgstr "Tunnel Ziel"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:144
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:604
msgid "Binding address and port"
msgstr "Adresse und Port"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:150
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:630
msgid "Tunnel auto-start"
msgstr "Tunnel automatisch starten ?"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:156
msgid "Wizard completed"
msgstr "Wizard abgeschlossen"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:170
msgid ""
"This wizard will take you through the various options available for creating"
" tunnels in I2P."
msgstr "Dieser Assisten wird durch die unterschiedlichen Optionen führen die zur Erstellung von I2P Tunneln verfügbar sind."
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:172
msgid ""
"The first thing to decide is whether you want to create a server or a client"
" tunnel."
msgstr "Das erste zu entscheiden ist, ob es ein Server oder Client Tunnel werden soll."
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:174
msgid ""
"If you need to connect to a remote service, such as an IRC server inside I2P"
" or a code repository, then you will require a CLIENT tunnel."
msgstr "Um auf einen I2P Service innerhalb des Netzes zuzugreifen (z.b. SVN), musst ein Client Tunnel erstellt werden."
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:176
msgid ""
"On the other hand, if you wish to host a service for others to connect to "
"you'll need to create a SERVER tunnel."
msgstr "Wenn andere auf einen Service zugreifen sollen, muss einen Server Tunnel erstellen."
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:178
msgid "Server Tunnel"
msgstr "Server Tunnel"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:180
msgid "Client Tunnel"
msgstr "Client Tunnel"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:198
msgid "There are several types of tunnels to choose from:"
msgstr "Es gibt mehrere unterschiedliche Typen von Tunneln aus denen gewählt werden kann:"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:206
msgid "Basic tunnel for connecting to a single service inside I2P."
msgstr "Standart Tunnel zur Verbindung mit einem einzelnen Service im I2P Netz"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:208
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:250
msgid ""
"Try this if none of the tunnel types below fit your requirements, or you "
"don't know what type of tunnel you need."
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:210
msgid "Tunnel that acts as an HTTP proxy for reaching eepsites inside I2P."
msgstr "Tunnel der als HTTP-Proxy fungiert, um Eepseiten im I2P Netz zu errreichen."
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:212
msgid ""
"Set your browser to use this tunnel as an http proxy, or set your "
"\"http_proxy\" environment variable for command-line applications in "
"GNU/Linux."
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:214
msgid ""
"Websites outside I2P can also be reached if an HTTP proxy within I2P is "
"known."
msgstr "Webseiten außerhalb von I2P können ebenfalls erreicht werden wenn ein HTTP-Proxy innerhalb des I2P Netzes bekannt ist."
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:216
msgid "Customised client tunnel specific for IRC connections."
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:218
msgid ""
"With this tunnel type, your IRC client will be able to connect to an IRC "
"network inside I2P."
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:220
msgid ""
"Each IRC network in I2P that you wish to connect to will require its own "
"tunnel. (See Also, SOCKS IRC)"
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:222
msgid "A tunnel that implements the SOCKS protocol."
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:224
msgid ""
"This enables both TCP and UDP connections to be made through a SOCKS "
"outproxy within I2P."
msgstr "Dies aktiviert TCP und UDP Verbindungen, die durch ein Socks-Outproxy in I2P gemacht werden können."
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:226
msgid ""
"A client tunnel implementing the SOCKS protocol, which is customised for "
"connecting to IRC networks."
msgstr "Ein Client Tunnel der das Socks-Protokoll implementiert, das speziell für die Verbindung zu IRC-Servern angepasst wurde."
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:228
msgid ""
"With this tunnel type, IRC networks in I2P can be reached by typing the I2P "
"address into your IRC client, and configuring the IRC client to use this "
"SOCKS tunnel."
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:230
msgid ""
"This means that only one I2P tunnel is required rather than a separate "
"tunnel per IRC network."
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:232
msgid ""
"IRC networks outside I2P can also be reached if a SOCKS outproxy within I2P "
"is known, though it depends on whether or not the outproxy has been blocked "
"by the IRC network."
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:234
msgid "A client tunnel that implements the HTTP CONNECT command."
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:236
msgid ""
"This enables TCP connections to be made through an HTTP outproxy, assuming "
"the proxy supports the CONNECT command."
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:238
msgid "A customised client tunnel for Streamr."
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:248
msgid "A basic server tunnel for hosting a generic service inside I2P."
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:252
msgid "A server tunnel that is customised for HTTP connections."
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:254
msgid "Use this tunnel type if you want to host an eepsite."
msgstr "Benutz diesen Tunnel Typ um eine Eepsite zu hosten."
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:256
msgid ""
"A customised server tunnel that can both serve HTTP data and connect to "
"other server tunnels."
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:258
msgid "This tunnel type is predominantly used when running a Seedless server."
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:260
msgid "A customised server tunnel for hosting IRC networks inside I2P."
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:262
msgid ""
"Usually, a separate tunnel needs to be created for each IRC server that is "
"to be accessible inside I2P."
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:264
msgid "A customised server tunnel for Streamr."
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:303
msgid "Choose a name and description for your tunnel."
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:305
msgid ""
"These can be anything you want - they are just for ease of identifying the "
"tunnel in the routerconsole."
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:335
msgid ""
"If you know of any outproxies for this type of tunnel (either HTTP or "
"SOCKS), fill them in below."
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:337
msgid "Separate multiple proxies with commas."
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:355
msgid ""
"Type in the I2P destination of the service that this client tunnel should "
"connect to."
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:357
msgid ""
"This could be the full base 64 destination key, or an I2P URL from your "
"address book."
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:387
msgid ""
"This is the IP that your service is running on, this is usually on the same "
"machine so 127.0.0.1 is autofilled."
msgstr "Dies ist die IP auf der der Service läuft, normalerweise ist dies der gleiche Computer, somit ist 127.0.0.1 automatisch eingetragen."
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:410
msgid "This is the port that the service is accepting connections on."
msgstr "Dies ist der Port auf dem der Service Verbindungen akzeptiert."
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:431
msgid "This is the port that the client tunnel will be accessed from locally."
msgstr "Dies ist der Port den der Client Tunnel lokal verwendet."
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:433
msgid "This is also the client port for the HTTPBidir server tunnel."
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:452
msgid ""
"How do you want this tunnel to be accessed? By just this machine, your "
"entire subnet, or external internet?"
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:454
msgid "You will most likely want to just allow 127.0.0.1"
msgstr "Hauptsächlich will man 127.0.0.1 erlauben"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:496
msgid ""
"The I2P router can automatically start this tunnel for you when the router "
"is started."
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:498
msgid ""
"This can be useful for frequently-used tunnels (especially server tunnels), "
"but for tunnels that are only used occassionally it would mean that the I2P "
"router is creating and maintaining unnecessary tunnels."
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:524
msgid "The wizard has now collected enough information to create your tunnel."
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:526
msgid ""
"Upon clicking the Save button below, the wizard will set up the tunnel, and "
"take you back to the main I2PTunnel page."
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:531
msgid ""
"Because you chose to automatically start the tunnel when the router starts, "
"you don't have to do anything further."
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:533
msgid "The router will start the tunnel once it has been set up."
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:537
msgid ""
"Because you chose not to automatically start the tunnel, you will have to "
"manually start it."
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:539
msgid ""
"You can do this by clicking the Start button on the main page which "
"corresponds to the new tunnel."
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:543
msgid "Below is a summary of the options you chose:"
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:641
msgid ""
"Alongside these basic settings, there are a number of advanced options for "
"tunnel configuration."
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:643
msgid ""
"The wizard will set reasonably sensible default values for these, but you "
"can view and/or edit these by clicking on the tunnel's name in the main "
"I2PTunnel page."
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:683
msgid "Previous"
msgstr "Vorheriges"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:691
msgid "Save Tunnel"
msgstr "Speichere Tunnel"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:697
msgid "Finish"
msgstr "Abschließen"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:703
msgid "Next"
msgstr "Nächstes"

View File

@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: I2P i2ptunnel\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-11-05 00:26+0000\n"
"POT-Creation-Date: 2012-02-17 11:25+0000\n"
"PO-Revision-Date: 2010-06-15 14:09+0100\n"
"Last-Translator: duck <duck@mail.i2p>\n"
"Language-Team: duck <duck@mail.i2p>\n"
@@ -18,15 +18,15 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1)\n"
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:487
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:492
msgid "This seems to be a bad destination:"
msgstr ""
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:487
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:492
msgid "i2paddresshelper cannot help you with a destination like that!"
msgstr ""
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:556
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:561
#, java-format
msgid ""
"To visit the destination in your host database, click <a href=\"{0}\">here</"
@@ -34,84 +34,85 @@ msgid ""
"\"{1}\">here</a>."
msgstr ""
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:932
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:937
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:398
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:142
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:401
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:391
msgid "Host"
msgstr ""
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:933
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:370
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:938
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:372
msgid "Destination"
msgstr ""
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:938
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:943
#, java-format
msgid "Continue to {0} without saving"
msgstr ""
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:943
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:948
#, java-format
msgid "Save {0} to router address book and continue to eepsite"
msgstr ""
#. only blockfile supports multiple books
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:946
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:951
#, java-format
msgid "Save {0} to master address book and continue to eepsite"
msgstr ""
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:947
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:952
#, java-format
msgid "Save {0} to private address book and continue to eepsite"
msgstr ""
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1102
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1107
msgid "HTTP Outproxy"
msgstr ""
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1107
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1112
msgid ""
"Click a link below to look for an address helper by using a \"jump\" service:"
msgstr ""
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1325
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1330
msgid "Added via address helper"
msgstr ""
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1349
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1354
#, java-format
msgid "Redirecting to {0}"
msgstr ""
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1355
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1360
msgid "Router Console"
msgstr ""
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1356
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1361
msgid "Addressbook"
msgstr ""
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1356
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1361
msgid "Configuration"
msgstr ""
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1356
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1361
msgid "Help"
msgstr ""
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1361
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1366
#, java-format
msgid "Saved {0} to the {1} addressbook, redirecting now."
msgstr ""
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1362
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1367
#, java-format
msgid "Failed to save {0} to the {1} addressbook, redirecting now."
msgstr ""
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1364
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1369
msgid "Click here if you are not redirected automatically."
msgstr ""
@@ -120,93 +121,93 @@ msgstr ""
msgid "internal"
msgstr ""
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:174
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:175
msgid ""
"Invalid form submission, probably because you used the 'back' or 'reload' "
"button on your browser. Please resubmit."
msgstr ""
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:221
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:222
msgid "Configuration reloaded for all tunnels"
msgstr ""
#. and give them something to look at in any case
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:233
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:234
msgid "Starting tunnel"
msgstr ""
#. and give them something to look at in any case
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:246
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:247
msgid "Stopping tunnel"
msgstr ""
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:314
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:315
msgid "Configuration changes saved"
msgstr ""
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:317
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:318
msgid "Failed to save configuration"
msgstr ""
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:435
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:436
msgid "New Tunnel"
msgstr ""
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:455
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:456
msgid "Standard client"
msgstr ""
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:456
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:457
msgid "HTTP client"
msgstr ""
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:457
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:458
msgid "IRC client"
msgstr ""
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:458
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:459
msgid "Standard server"
msgstr ""
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:459
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:460
msgid "HTTP server"
msgstr ""
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:460
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:461
msgid "SOCKS 4/4a/5 proxy"
msgstr ""
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:461
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:462
msgid "SOCKS IRC proxy"
msgstr ""
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:462
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:463
msgid "CONNECT/SSL/HTTPS proxy"
msgstr ""
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:463
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:464
msgid "IRC server"
msgstr ""
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:464
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:465
msgid "Streamr client"
msgstr ""
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:465
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:466
msgid "Streamr server"
msgstr ""
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:466
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:467
msgid "HTTP bidir"
msgstr ""
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:554
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:293
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:555
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:295
msgid "Host not set"
msgstr ""
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:558
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:275
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:559
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:277
msgid "Port not set"
msgstr ""
@@ -224,24 +225,26 @@ msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:112
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:112
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:110
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:124
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:245
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:260
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:112
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:126
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:247
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:262
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:307
msgid "Name"
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:116
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:116
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:249
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:282
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:251
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:284
msgid "Type"
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:120
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:120
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:229
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:389
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:231
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:391
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:311
msgid "Description"
msgstr ""
@@ -267,22 +270,27 @@ msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:159
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:178
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:460
msgid "Reachable by"
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:180
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:339
msgid "Outproxies"
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:187
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:359
msgid "Tunnel Destination"
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:199
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:363
msgid "name or destination"
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:202
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:366
msgid "b32 not recommended"
msgstr ""
@@ -298,12 +306,14 @@ msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:216
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:124
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:500
msgid "Auto Start"
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:220
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:228
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:128
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:504
msgid "(Check the Box for 'YES')"
msgstr ""
@@ -484,8 +494,9 @@ msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:406
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:148
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:409
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:247
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:269
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:249
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:271
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:412
msgid "Port"
msgstr ""
@@ -587,6 +598,7 @@ msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:524
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:531
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:678
msgid "Cancel"
msgstr ""
@@ -745,115 +757,466 @@ msgstr ""
msgid "Refresh"
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:94
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:92
msgid "Tunnel Wizard"
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:96
msgid "Stop All"
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:98
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:100
msgid "Start All"
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:102
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:104
msgid "Restart All"
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:106
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:108
msgid "Reload Config"
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:108
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:110
msgid "I2P Server Tunnels"
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:112
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:133
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:114
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:135
msgid "Points at"
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:114
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:156
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:160
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:116
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:158
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:162
msgid "Preview"
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:116
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:180
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:253
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:300
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:118
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:182
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:255
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:302
msgid "Status"
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:166
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:168
msgid "Base32 Address"
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:174
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:176
msgid "No Preview"
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:187
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:307
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:189
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:309
msgid "Starting..."
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:194
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:208
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:314
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:328
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:342
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:196
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:210
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:316
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:330
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:344
msgid "Stop"
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:201
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:335
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:203
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:337
msgid "Running"
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:215
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:349
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:217
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:351
msgid "Stopped"
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:222
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:356
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:224
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:358
msgid "Start"
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:237
msgid "New server tunnel"
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:239
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:399
msgid "Standard"
msgid "New server tunnel"
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:241
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:401
msgid "Create"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:204
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:246
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:276
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:282
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:554
msgid "Standard"
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:243
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:403
msgid "Create"
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:245
msgid "I2P Client Tunnels"
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:251
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:286
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:253
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:288
msgid "Interface"
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:321
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:323
msgid "Standby"
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:366
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:368
msgid "Outproxy"
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:384
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:386
msgid "none"
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:397
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:399
msgid "New client tunnel"
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:102
msgid "I2P Tunnel Manager - Tunnel Creation Wizard"
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:120
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:545
msgid "Server or client tunnel?"
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:126
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:549
msgid "Tunnel type"
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:132
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:579
msgid "Tunnel name and description"
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:138
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:588
msgid "Tunnel destination"
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:144
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:604
msgid "Binding address and port"
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:150
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:630
msgid "Tunnel auto-start"
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:156
msgid "Wizard completed"
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:170
msgid ""
"This wizard will take you through the various options available for creating "
"tunnels in I2P."
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:172
msgid ""
"The first thing to decide is whether you want to create a server or a client "
"tunnel."
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:174
msgid ""
"If you need to connect to a remote service, such as an IRC server inside I2P "
"or a code repository, then you will require a CLIENT tunnel."
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:176
msgid ""
"On the other hand, if you wish to host a service for others to connect to "
"you'll need to create a SERVER tunnel."
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:178
msgid "Server Tunnel"
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:180
msgid "Client Tunnel"
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:198
msgid "There are several types of tunnels to choose from:"
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:206
msgid "Basic tunnel for connecting to a single service inside I2P."
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:208
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:250
msgid ""
"Try this if none of the tunnel types below fit your requirements, or you "
"don't know what type of tunnel you need."
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:210
msgid "Tunnel that acts as an HTTP proxy for reaching eepsites inside I2P."
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:212
msgid ""
"Set your browser to use this tunnel as an http proxy, or set your "
"\"http_proxy\" environment variable for command-line applications in GNU/"
"Linux."
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:214
msgid ""
"Websites outside I2P can also be reached if an HTTP proxy within I2P is "
"known."
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:216
msgid "Customised client tunnel specific for IRC connections."
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:218
msgid ""
"With this tunnel type, your IRC client will be able to connect to an IRC "
"network inside I2P."
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:220
msgid ""
"Each IRC network in I2P that you wish to connect to will require its own "
"tunnel. (See Also, SOCKS IRC)"
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:222
msgid "A tunnel that implements the SOCKS protocol."
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:224
msgid ""
"This enables both TCP and UDP connections to be made through a SOCKS "
"outproxy within I2P."
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:226
msgid ""
"A client tunnel implementing the SOCKS protocol, which is customised for "
"connecting to IRC networks."
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:228
msgid ""
"With this tunnel type, IRC networks in I2P can be reached by typing the I2P "
"address into your IRC client, and configuring the IRC client to use this "
"SOCKS tunnel."
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:230
msgid ""
"This means that only one I2P tunnel is required rather than a separate "
"tunnel per IRC network."
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:232
msgid ""
"IRC networks outside I2P can also be reached if a SOCKS outproxy within I2P "
"is known, though it depends on whether or not the outproxy has been blocked "
"by the IRC network."
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:234
msgid "A client tunnel that implements the HTTP CONNECT command."
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:236
msgid ""
"This enables TCP connections to be made through an HTTP outproxy, assuming "
"the proxy supports the CONNECT command."
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:238
msgid "A customised client tunnel for Streamr."
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:248
msgid "A basic server tunnel for hosting a generic service inside I2P."
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:252
msgid "A server tunnel that is customised for HTTP connections."
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:254
msgid "Use this tunnel type if you want to host an eepsite."
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:256
msgid ""
"A customised server tunnel that can both serve HTTP data and connect to "
"other server tunnels."
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:258
msgid "This tunnel type is predominantly used when running a Seedless server."
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:260
msgid "A customised server tunnel for hosting IRC networks inside I2P."
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:262
msgid ""
"Usually, a separate tunnel needs to be created for each IRC server that is "
"to be accessible inside I2P."
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:264
msgid "A customised server tunnel for Streamr."
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:303
msgid "Choose a name and description for your tunnel."
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:305
msgid ""
"These can be anything you want - they are just for ease of identifying the "
"tunnel in the routerconsole."
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:335
msgid ""
"If you know of any outproxies for this type of tunnel (either HTTP or "
"SOCKS), fill them in below."
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:337
msgid "Separate multiple proxies with commas."
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:355
msgid ""
"Type in the I2P destination of the service that this client tunnel should "
"connect to."
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:357
msgid ""
"This could be the full base 64 destination key, or an I2P URL from your "
"address book."
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:387
msgid ""
"This is the IP that your service is running on, this is usually on the same "
"machine so 127.0.0.1 is autofilled."
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:410
msgid "This is the port that the service is accepting connections on."
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:431
msgid "This is the port that the client tunnel will be accessed from locally."
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:433
msgid "This is also the client port for the HTTPBidir server tunnel."
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:452
msgid ""
"How do you want this tunnel to be accessed? By just this machine, your "
"entire subnet, or external internet?"
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:454
msgid "You will most likely want to just allow 127.0.0.1"
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:496
msgid ""
"The I2P router can automatically start this tunnel for you when the router "
"is started."
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:498
msgid ""
"This can be useful for frequently-used tunnels (especially server tunnels), "
"but for tunnels that are only used occassionally it would mean that the I2P "
"router is creating and maintaining unnecessary tunnels."
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:524
msgid "The wizard has now collected enough information to create your tunnel."
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:526
msgid ""
"Upon clicking the Save button below, the wizard will set up the tunnel, and "
"take you back to the main I2PTunnel page."
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:531
msgid ""
"Because you chose to automatically start the tunnel when the router starts, "
"you don't have to do anything further."
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:533
msgid "The router will start the tunnel once it has been set up."
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:537
msgid ""
"Because you chose not to automatically start the tunnel, you will have to "
"manually start it."
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:539
msgid ""
"You can do this by clicking the Start button on the main page which "
"corresponds to the new tunnel."
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:543
msgid "Below is a summary of the options you chose:"
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:641
msgid ""
"Alongside these basic settings, there are a number of advanced options for "
"tunnel configuration."
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:643
msgid ""
"The wizard will set reasonably sensible default values for these, but you "
"can view and/or edit these by clicking on the tunnel's name in the main "
"I2PTunnel page."
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:683
msgid "Previous"
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:691
msgid "Save Tunnel"
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:697
msgid "Finish"
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:703
msgid "Next"
msgstr ""

File diff suppressed because it is too large Load Diff

View File

@@ -2,117 +2,119 @@
# Copyright (C) 2009 The I2P Project
# This file is distributed under the same license as the i2ptunnel package.
# To contribute translations, see http://www.i2p2.de/newdevelopers
#
#
# Translators:
# Martin Svensson <digitalmannen@gmail.com>, 2011, 2012.
msgid ""
msgstr ""
"Project-Id-Version: I2P\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-09-23 19:52+0000\n"
"PO-Revision-Date: 2011-08-26 09:28+0000\n"
"Last-Translator: digitalmannen <digitalmannen@gmail.com>\n"
"Language-Team: Swedish (Sweden) (http://www.transifex.net/projects/p/I2P/"
"team/sv_SE/)\n"
"Language: sv_SE\n"
"Report-Msgid-Bugs-To: https://trac.i2p2.de/\n"
"POT-Creation-Date: 2012-02-17 11:25+0000\n"
"PO-Revision-Date: 2012-02-20 15:28+0000\n"
"Last-Translator: Martin Svensson <digitalmannen@gmail.com>\n"
"Language-Team: Swedish (Sweden) (http://www.transifex.net/projects/p/I2P/language/sv_SE/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: sv_SE\n"
"Plural-Forms: nplurals=2; plural=(n != 1)\n"
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:485
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:492
msgid "This seems to be a bad destination:"
msgstr "Detta verkar vara ett felaktigt mål"
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:485
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:492
msgid "i2paddresshelper cannot help you with a destination like that!"
msgstr "i2padresshjälp kan inte hjälpa dig med ett sådant mål!"
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:554
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:561
#, java-format
msgid ""
"To visit the destination in your host database, click <a href=\"{0}\">here</"
"a>. To visit the conflicting addresshelper destination, click <a href="
"\"{1}\">here</a>."
msgstr ""
"För att besöka målet i din värd databas href=\"{0}\"> klicka <a här </ a>. "
"För att besöka de motstridiga hjälpaddresserna,<a href=\"{1}\"> klicka <a "
"här </ a>."
"To visit the destination in your host database, click <a "
"href=\"{0}\">here</a>. To visit the conflicting addresshelper destination, "
"click <a href=\"{1}\">here</a>."
msgstr "För att besöka målet i din värd databas href=\"{0}\"> klicka <a här </ a>. För att besöka de motstridiga hjälpaddresserna,<a href=\"{1}\"> klicka <a här </ a>."
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:930
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:937
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:398
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:142
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:401
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:391
msgid "Host"
msgstr "Värd"
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:931
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:370
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:938
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:372
msgid "Destination"
msgstr "Mål"
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:936
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:943
#, java-format
msgid "Continue to {0} without saving"
msgstr "Fortsätt till {0} utan att spara"
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:941
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:948
#, java-format
msgid "Save {0} to router address book and continue to eepsite"
msgstr "Spara {0} till routeradressboken och fortsätt till eepsite "
#. only blockfile supports multiple books
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:944
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:951
#, java-format
msgid "Save {0} to master address book and continue to eepsite"
msgstr "Spara {0} till huvudadressboken och fortsätt till eepsite "
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:945
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:952
#, java-format
msgid "Save {0} to private address book and continue to eepsite"
msgstr "Spara {0} till privatadressbok och fortsätt till eepsite "
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1101
msgid ""
"Click a link below to look for an address helper by using a \"jump\" service:"
msgstr ""
"Klicka på en länk nedan för att söka efter en hjälpaddress genom att använda "
"en \"hopp\" tjänst"
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1107
msgid "HTTP Outproxy"
msgstr "HTTP Utproxy"
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1319
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1112
msgid ""
"Click a link below to look for an address helper by using a \"jump\" "
"service:"
msgstr "Klicka på en länk nedan för att söka efter en hjälpaddress genom att använda en \"hopp\" tjänst"
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1330
msgid "Added via address helper"
msgstr "Tillagd via adresshjälpen "
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1343
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1354
#, java-format
msgid "Redirecting to {0}"
msgstr "Om dirigerar till {0}"
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1349
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1360
msgid "Router Console"
msgstr "Router konsol "
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1350
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1361
msgid "Addressbook"
msgstr "Adressbok"
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1350
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1361
msgid "Configuration"
msgstr "Konfiguration"
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1350
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1361
msgid "Help"
msgstr "Hjälp"
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1355
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1366
#, java-format
msgid "Saved {0} to the {1} addressbook, redirecting now."
msgstr "Spara {0} till {1}adressboken, omdirigerar nu "
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1356
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1367
#, java-format
msgid "Failed to save {0} to the {1} addressbook, redirecting now."
msgstr "Misslyckades med att spara {0} till {1}adressboken, omdirigerar nu "
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1358
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1369
msgid "Click here if you are not redirected automatically."
msgstr "Klicka här om du inte omdirigeras automatiskt "
@@ -121,95 +123,93 @@ msgstr "Klicka här om du inte omdirigeras automatiskt "
msgid "internal"
msgstr "Intern "
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:174
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:175
msgid ""
"Invalid form submission, probably because you used the 'back' or 'reload' "
"button on your browser. Please resubmit."
msgstr ""
"Ogiltigt formulärbegäran, beror troligtvis på attt du använde 'tillbaka' "
"eller 'uppdatera' knappen. Försök att skicka igen"
msgstr "Ogiltigt formulärbegäran, beror troligtvis på attt du använde 'tillbaka' eller 'uppdatera' knappen. Försök att skicka igen"
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:221
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:222
msgid "Configuration reloaded for all tunnels"
msgstr "Konfigurationen uppdateras för alla tunnlar"
#. and give them something to look at in any case
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:233
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:234
msgid "Starting tunnel"
msgstr "Startar tunnel"
#. and give them something to look at in any case
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:246
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:247
msgid "Stopping tunnel"
msgstr "Stannar tunnel"
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:314
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:315
msgid "Configuration changes saved"
msgstr "Konfigurationsändringar sparas"
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:317
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:318
msgid "Failed to save configuration"
msgstr "Det gick inte att spara konfigurationen"
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:435
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:436
msgid "New Tunnel"
msgstr "Ny tunnel"
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:455
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:456
msgid "Standard client"
msgstr "Standard klient"
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:456
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:457
msgid "HTTP client"
msgstr "HTTP-klient"
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:457
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:458
msgid "IRC client"
msgstr "IRC-klient"
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:458
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:459
msgid "Standard server"
msgstr "Standard server"
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:459
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:460
msgid "HTTP server"
msgstr "HTTP server"
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:460
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:461
msgid "SOCKS 4/4a/5 proxy"
msgstr "SOCKS 4/4a/5 proxy"
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:461
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:462
msgid "SOCKS IRC proxy"
msgstr "SOCKS IRC proxy"
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:462
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:463
msgid "CONNECT/SSL/HTTPS proxy"
msgstr "CONNECT/SSL/HTTPS proxy"
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:463
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:464
msgid "IRC server"
msgstr "IRC-server"
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:464
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:465
msgid "Streamr client"
msgstr "Klient för Streamr "
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:465
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:466
msgid "Streamr server"
msgstr "Server för Streamr"
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:466
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:467
msgid "HTTP bidir"
msgstr "HTTP bidir"
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:554
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:293
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:555
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:295
msgid "Host not set"
msgstr "Ingen värd angiven"
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:558
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:275
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:559
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:277
msgid "Port not set"
msgstr "Ingen port angiven"
@@ -227,24 +227,26 @@ msgstr "Inställningar för ny proxy "
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:112
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:112
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:110
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:124
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:245
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:260
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:112
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:126
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:247
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:262
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:307
msgid "Name"
msgstr "Namn"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:116
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:116
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:249
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:282
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:251
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:284
msgid "Type"
msgstr "Typ"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:120
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:120
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:229
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:389
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:231
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:391
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:311
msgid "Description"
msgstr "Beskrivning"
@@ -270,22 +272,27 @@ msgstr "krävs"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:159
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:178
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:460
msgid "Reachable by"
msgstr "Nåbar via"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:180
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:339
msgid "Outproxies"
msgstr "utgående proxy"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:187
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:359
msgid "Tunnel Destination"
msgstr "Tunnel mål"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:199
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:363
msgid "name or destination"
msgstr "namn eller mål"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:202
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:366
msgid "b32 not recommended"
msgstr "b32 rekommenderas ej"
@@ -297,18 +304,18 @@ msgstr "Delad klient"
msgid ""
"(Share tunnels with other clients and irc/httpclients? Change requires "
"restart of client proxy)"
msgstr ""
"(Dela tunnlarna med andra klienter och irc/HTTP-klienter? Ändring kräver "
"omstart av klientproxyn)"
msgstr "(Dela tunnlarna med andra klienter och irc/HTTP-klienter? Ändring kräver omstart av klientproxyn)"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:216
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:124
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:500
msgid "Auto Start"
msgstr "Starta automatiskt"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:220
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:228
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:128
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:504
msgid "(Check the Box for 'YES')"
msgstr "(Markera i boxen för 'Ja')"
@@ -325,9 +332,7 @@ msgstr "Avancerade nätverks instälningar"
msgid ""
"(NOTE: when this client proxy is configured to share tunnels, then these "
"options are for all the shared proxy clients!)"
msgstr ""
"(OBS: när denna klientproxyn är konfigurerad för att dela tunnlar, då gäller "
"dessa alternativ för alla delade proxyklienter!)"
msgstr "(OBS: när denna klientproxyn är konfigurerad för att dela tunnlar, då gäller dessa alternativ för alla delade proxyklienter!)"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:236
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:245
@@ -409,26 +414,20 @@ msgstr "Antal"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:318
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:327
msgid "1 inbound, 1 outbound tunnel (low bandwidth usage, less reliability)"
msgstr ""
"1 inkommande, 1 utgående tunnlar (låg bandbreddsanvändning, låg "
"tillförlitlighet)"
msgstr "1 inkommande, 1 utgående tunnlar (låg bandbreddsanvändning, låg tillförlitlighet)"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:322
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:331
msgid ""
"2 inbound, 2 outbound tunnels (standard bandwidth usage, standard "
"reliability)"
msgstr ""
"2 inkommande, 2 utgående tunnlar (normal bandbreddsanvändning, normal "
"tillförlitlighet)"
msgstr "2 inkommande, 2 utgående tunnlar (normal bandbreddsanvändning, normal tillförlitlighet)"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:326
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:335
msgid ""
"3 inbound, 3 outbound tunnels (higher bandwidth usage, higher reliability)"
msgstr ""
"3 inkommande, 3 utgående tunnlar (Högre bandbreddsanvändning, högre "
"tillförlitlighet)"
msgstr "3 inkommande, 3 utgående tunnlar (Högre bandbreddsanvändning, högre tillförlitlighet)"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:335
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:344
@@ -443,8 +442,7 @@ msgstr "Antal reserver"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:347
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:356
msgid "0 backup tunnels (0 redundancy, no added resource usage)"
msgstr ""
"0 reserv tunnlar i varje riktning (ingen redundans, ingen resursanvändning)"
msgstr "0 reserv tunnlar i varje riktning (ingen redundans, ingen resursanvändning)"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:351
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:360
@@ -455,15 +453,12 @@ msgstr "1 reserv tunnel i varje riktning (låg redundans, låg resursanvändning
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:364
msgid ""
"2 backup tunnels each direction (medium redundancy, medium resource usage)"
msgstr ""
"2 reserv tunnlar i varje riktning (medel hög redundans, medel hög "
"resursanvändning)"
msgstr "2 reserv tunnlar i varje riktning (medel hög redundans, medel hög resursanvändning)"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:359
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:368
msgid "3 backup tunnels each direction (high redundancy, high resource usage)"
msgstr ""
"3 reserv tunnlar i varje riktning (hög redundans, hög resursanvändning)"
msgstr "3 reserv tunnlar i varje riktning (hög redundans, hög resursanvändning)"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:368
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:377
@@ -501,8 +496,9 @@ msgstr "I2CP Routeradress"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:406
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:148
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:409
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:247
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:269
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:249
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:271
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:412
msgid "Port"
msgstr "Port"
@@ -600,12 +596,11 @@ msgstr "Anpassade alternativ"
msgid ""
"NOTE: If tunnel is currently running, most changes will not take effect "
"until tunnel is stopped and restarted."
msgstr ""
"OBS: Om tunneln är igång, kommer de flesta ändringarna inte att träda i "
"kraft förrän tunneln stoppats och startats om."
msgstr "OBS: Om tunneln är igång, kommer de flesta ändringarna inte att träda i kraft förrän tunneln stoppats och startats om."
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:524
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:531
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:678
msgid "Cancel"
msgstr "Avbryt"
@@ -764,115 +759,466 @@ msgstr "Status meddelande "
msgid "Refresh"
msgstr "Uppdatera"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:94
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:92
msgid "Tunnel Wizard"
msgstr "Tunnel guide"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:96
msgid "Stop All"
msgstr "Stoppa alla"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:98
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:100
msgid "Start All"
msgstr "Starta alla"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:102
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:104
msgid "Restart All"
msgstr "Starta om alla"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:106
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:108
msgid "Reload Config"
msgstr "Uppdatera konfigurationen"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:108
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:110
msgid "I2P Server Tunnels"
msgstr "I2P Servertunnlel"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:112
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:133
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:114
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:135
msgid "Points at"
msgstr "Pekar på"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:114
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:156
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:160
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:116
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:158
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:162
msgid "Preview"
msgstr "förhandsvisning"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:116
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:180
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:253
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:300
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:118
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:182
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:255
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:302
msgid "Status"
msgstr "Status"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:166
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:168
msgid "Base32 Address"
msgstr "Bas32 adress"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:174
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:176
msgid "No Preview"
msgstr "Ingen förhandsvisning"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:187
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:307
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:189
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:309
msgid "Starting..."
msgstr "Startar..."
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:194
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:208
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:314
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:328
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:342
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:196
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:210
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:316
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:330
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:344
msgid "Stop"
msgstr "Stopp"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:201
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:335
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:203
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:337
msgid "Running"
msgstr "Kör"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:215
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:349
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:217
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:351
msgid "Stopped"
msgstr "Stoppad"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:222
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:356
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:224
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:358
msgid "Start"
msgstr "Start"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:237
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:239
msgid "New server tunnel"
msgstr "Ny severtunnel "
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:239
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:399
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:241
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:401
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:204
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:246
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:276
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:282
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:554
msgid "Standard"
msgstr "Standard"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:241
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:401
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:243
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:403
msgid "Create"
msgstr "Skapa"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:243
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:245
msgid "I2P Client Tunnels"
msgstr "I2P Klienttunnel"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:251
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:286
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:253
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:288
msgid "Interface"
msgstr "Gränssnitt "
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:321
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:323
msgid "Standby"
msgstr "Standby"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:366
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:368
msgid "Outproxy"
msgstr "Utproxy"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:384
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:386
msgid "none"
msgstr "Ingen"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:397
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:399
msgid "New client tunnel"
msgstr "Ny klienttunnel"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:102
msgid "I2P Tunnel Manager - Tunnel Creation Wizard"
msgstr "I2P Tunnelhanterare - Guide för skapande av tunnlar "
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:120
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:545
msgid "Server or client tunnel?"
msgstr "Server- eller klient-tunnel"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:126
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:549
msgid "Tunnel type"
msgstr "Tunnel typ"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:132
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:579
msgid "Tunnel name and description"
msgstr "Tunnelnamn och beskrivning "
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:138
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:588
msgid "Tunnel destination"
msgstr "Mål för tunnel"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:144
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:604
msgid "Binding address and port"
msgstr "Adress och port"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:150
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:630
msgid "Tunnel auto-start"
msgstr "Tunnel auto-start"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:156
msgid "Wizard completed"
msgstr "Guiden färdig "
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:170
msgid ""
"This wizard will take you through the various options available for creating"
" tunnels in I2P."
msgstr "Guiden tar dig igenom de olika inställningsmöjligheterna för att skapa tunnlar."
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:172
msgid ""
"The first thing to decide is whether you want to create a server or a client"
" tunnel."
msgstr "Det första är att bestämma om det skall vara en server- eller klient-tunnel. "
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:174
msgid ""
"If you need to connect to a remote service, such as an IRC server inside I2P"
" or a code repository, then you will require a CLIENT tunnel."
msgstr "Om du ansluter till en fjärrtjänst så som tex en IRC-server inom I2P, behövs en KLIENT-tunnel. "
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:176
msgid ""
"On the other hand, if you wish to host a service for others to connect to "
"you'll need to create a SERVER tunnel."
msgstr "Men om du vill göra en tjänst tillgänglig för andra behövs en SERVER-tunnel."
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:178
msgid "Server Tunnel"
msgstr "Server-tunnel"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:180
msgid "Client Tunnel"
msgstr "Klient-tunnel"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:198
msgid "There are several types of tunnels to choose from:"
msgstr "Det finns flera typer av tunnlar att välja på:"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:206
msgid "Basic tunnel for connecting to a single service inside I2P."
msgstr "Grundläggande tunnel för anslutning till en snigel tjänst innanför I2P. "
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:208
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:250
msgid ""
"Try this if none of the tunnel types below fit your requirements, or you "
"don't know what type of tunnel you need."
msgstr "Prova detta om ingen av valen passar eller du inte vet vilken typ av tunnel som behövs."
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:210
msgid "Tunnel that acts as an HTTP proxy for reaching eepsites inside I2P."
msgstr "Tunneln agerar som en HTTP-proxy för att komma åt eepsites innanför I2P. "
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:212
msgid ""
"Set your browser to use this tunnel as an http proxy, or set your "
"\"http_proxy\" environment variable for command-line applications in "
"GNU/Linux."
msgstr "Peka din webbläsare på denna tunnel som en http-proxy eller ställ in miljövariabeln \"http_proxy\" för terminal baserade applikationer i GNU/Linux."
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:214
msgid ""
"Websites outside I2P can also be reached if an HTTP proxy within I2P is "
"known."
msgstr "Webbplats utanför I2P kan nås om en HTTP-proxy innanför I2P är känd."
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:216
msgid "Customised client tunnel specific for IRC connections."
msgstr "Specialiserad tunnel för IRC anslutningar. "
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:218
msgid ""
"With this tunnel type, your IRC client will be able to connect to an IRC "
"network inside I2P."
msgstr "Med denna tunneltyp kan IRC-klienter ansluta till IRC-nät inom I2P "
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:220
msgid ""
"Each IRC network in I2P that you wish to connect to will require its own "
"tunnel. (See Also, SOCKS IRC)"
msgstr "Varje IRC-nät inom I2P som du vill ansluta till kräver en egen tunnel (Se även: SOCKS IRC) "
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:222
msgid "A tunnel that implements the SOCKS protocol."
msgstr "En tunnel som implementerar SOCKS protokollet."
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:224
msgid ""
"This enables both TCP and UDP connections to be made through a SOCKS "
"outproxy within I2P."
msgstr "Detta möjliggör både TCP och UDP anslutningar genom SOCKS utgående-proxy innanför I2P "
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:226
msgid ""
"A client tunnel implementing the SOCKS protocol, which is customised for "
"connecting to IRC networks."
msgstr "En klient tunnel för SOCKS protokollet som är anpassad för IRC-nät."
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:228
msgid ""
"With this tunnel type, IRC networks in I2P can be reached by typing the I2P "
"address into your IRC client, and configuring the IRC client to use this "
"SOCKS tunnel."
msgstr "Med denna tunnel typen kan IRC-nät inom I2P nås genom att skriva in I2P adressen i IRC-klienten och konfigurera IRC-klienten att använda denna SOCKS-tunneln."
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:230
msgid ""
"This means that only one I2P tunnel is required rather than a separate "
"tunnel per IRC network."
msgstr "Detta innebär att enbart en I2P-tunnel behövs istället för en tunnel per IRC-nät."
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:232
msgid ""
"IRC networks outside I2P can also be reached if a SOCKS outproxy within I2P "
"is known, though it depends on whether or not the outproxy has been blocked "
"by the IRC network."
msgstr "IRC-nät utanför I2P kan nås om en SOCKS-proxy innanför I2P är känd, men det bror på om utgående-proxy har blockerats av IRC-nätet."
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:234
msgid "A client tunnel that implements the HTTP CONNECT command."
msgstr "En klient-tunnel som implementerar HTTP CONNECT kommandot. "
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:236
msgid ""
"This enables TCP connections to be made through an HTTP outproxy, assuming "
"the proxy supports the CONNECT command."
msgstr "Detta möjliggör TCP anslutningar genom en HTTP utgående-proxy om proxyn stödjer CONNECT kommandot"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:238
msgid "A customised client tunnel for Streamr."
msgstr "En anpassad tunnel för Streamr."
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:248
msgid "A basic server tunnel for hosting a generic service inside I2P."
msgstr "En server-tunnel för en godtycklig tjänst innanför I2P."
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:252
msgid "A server tunnel that is customised for HTTP connections."
msgstr "En server-tunnel anpassad för HTTP anslutningar."
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:254
msgid "Use this tunnel type if you want to host an eepsite."
msgstr "Använd denna denna typ av tunnel om du vill köra en eepsite."
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:256
msgid ""
"A customised server tunnel that can both serve HTTP data and connect to "
"other server tunnels."
msgstr "En anpassad server tunnel som hanterar både HTTP data och anslutningar till andra server-tunnlar."
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:258
msgid "This tunnel type is predominantly used when running a Seedless server."
msgstr "Tunneltypen använd vanligtvis när en Seedless server körs."
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:260
msgid "A customised server tunnel for hosting IRC networks inside I2P."
msgstr "En server-tunnel för IRC-Nät innanför I2P."
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:262
msgid ""
"Usually, a separate tunnel needs to be created for each IRC server that is "
"to be accessible inside I2P."
msgstr "Vanligtvis behövs en separat tunnel för varje IRC-server som skall anslutas till innanför I2P."
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:264
msgid "A customised server tunnel for Streamr."
msgstr "En server-tunnel för Streamr."
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:303
msgid "Choose a name and description for your tunnel."
msgstr "Välj namn och beskrivning av tunneln."
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:305
msgid ""
"These can be anything you want - they are just for ease of identifying the "
"tunnel in the routerconsole."
msgstr "Kan vad som helst, används enbart för att enkelt identifiera tunneln i routerkonsolen "
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:335
msgid ""
"If you know of any outproxies for this type of tunnel (either HTTP or "
"SOCKS), fill them in below."
msgstr "Om du känner till några utgående proxies för denna typen av tunnlar (HTTP eller SOCKS), fyll i dem nedan. "
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:337
msgid "Separate multiple proxies with commas."
msgstr "Separera flera proxyservrar med komma."
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:355
msgid ""
"Type in the I2P destination of the service that this client tunnel should "
"connect to."
msgstr "Ange I2P destinationen för tjänsten som tunneln skall ansluta till."
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:357
msgid ""
"This could be the full base 64 destination key, or an I2P URL from your "
"address book."
msgstr "Kan vara hela base 64 målsnyckeln eller en I2P URL från adressboken."
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:387
msgid ""
"This is the IP that your service is running on, this is usually on the same "
"machine so 127.0.0.1 is autofilled."
msgstr "Detta är IP-adressen som tjänsten körs på, detta är vanligtvis på samma maskin så 127.0.0.1 fylls i automatiskt. "
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:410
msgid "This is the port that the service is accepting connections on."
msgstr "Porten som tjänsten accepterar anslutningar via."
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:431
msgid "This is the port that the client tunnel will be accessed from locally."
msgstr "Porten som klient-tunneln kommer att ansluta till lokalt."
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:433
msgid "This is also the client port for the HTTPBidir server tunnel."
msgstr "Detta är också en klient-port för HTTPBidir server-tunneln."
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:452
msgid ""
"How do you want this tunnel to be accessed? By just this machine, your "
"entire subnet, or external internet?"
msgstr "Hur du vill att tunneln ska nås? Enbart denna maskinen, ditt lokala nät eller hela internet? "
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:454
msgid "You will most likely want to just allow 127.0.0.1"
msgstr "Med största sannolikhet vill du enbart tillåta 127.0.0.1"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:496
msgid ""
"The I2P router can automatically start this tunnel for you when the router "
"is started."
msgstr "I2P routern kan starta denna tunneln automatiskt vid uppstart."
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:498
msgid ""
"This can be useful for frequently-used tunnels (especially server tunnels), "
"but for tunnels that are only used occassionally it would mean that the I2P "
"router is creating and maintaining unnecessary tunnels."
msgstr "Detta kan vara användbart för tunnlar som används ofta (tex server-tunnlar) men för tunnlar som används sällan innebär det att onödiga tunnlar upprättas. "
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:524
msgid "The wizard has now collected enough information to create your tunnel."
msgstr "Guiden hat samlat tillräckligt med information för att skapa tunneln. "
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:526
msgid ""
"Upon clicking the Save button below, the wizard will set up the tunnel, and "
"take you back to the main I2PTunnel page."
msgstr "När du klickar på \"spara\" kommer guiden att skapa tunneln och sedan ta dig till sidan för tunnlar."
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:531
msgid ""
"Because you chose to automatically start the tunnel when the router starts, "
"you don't have to do anything further."
msgstr "Efter som du valt att starta tunneln samtidigt som routern startas behövs inget mer göras. "
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:533
msgid "The router will start the tunnel once it has been set up."
msgstr "Routern starta tunneln när den skapats. "
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:537
msgid ""
"Because you chose not to automatically start the tunnel, you will have to "
"manually start it."
msgstr "Efter som du valt att inte starta tunneln samtidigt som routern startas, behövs den startas manuellt."
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:539
msgid ""
"You can do this by clicking the Start button on the main page which "
"corresponds to the new tunnel."
msgstr "Du gör det genom att klicka på startknappen vid tunneln på huvudsidan."
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:543
msgid "Below is a summary of the options you chose:"
msgstr "Nedan är en sammanfattning över valen du kan göra:"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:641
msgid ""
"Alongside these basic settings, there are a number of advanced options for "
"tunnel configuration."
msgstr "Vid sidan om dessa grundägande inställningar finns att par avancerade val för tunneln. "
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:643
msgid ""
"The wizard will set reasonably sensible default values for these, but you "
"can view and/or edit these by clicking on the tunnel's name in the main "
"I2PTunnel page."
msgstr "Guiden väljer lämpliga värden för dessa. Men du kan ändra/se värdena på huvudsidan för I2P-tunnlar."
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:683
msgid "Previous"
msgstr "Föregående"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:691
msgid "Save Tunnel"
msgstr "Spara tunnel"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:697
msgid "Finish"
msgstr "Färdig"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:703
msgid "Next"
msgstr "Nästa"

View File

@@ -2,120 +2,120 @@
# Copyright (C) 2009 The I2P Project
# This file is distributed under the same license as the i2ptunnel package.
# To contribute translations, see http://www.i2p2.de/newdevelopers
#
#
# Translators:
# Denis <gribua@gmail.com>, 2011.
# Denis Lysenko <gribua@gmail.com>, 2012.
msgid ""
msgstr ""
"Project-Id-Version: I2P\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-11-01 00:05+0000\n"
"PO-Revision-Date: 2011-10-29 19:59+0000\n"
"Last-Translator: Pharmasolin <gribua@gmail.com>\n"
"Language-Team: Ukrainian (Ukraine) (http://www.transifex.net/projects/p/I2P/"
"team/uk_UA/)\n"
"Language: uk_UA\n"
"Report-Msgid-Bugs-To: https://trac.i2p2.de/\n"
"POT-Creation-Date: 2012-02-17 11:25+0000\n"
"PO-Revision-Date: 2012-02-17 12:01+0000\n"
"Last-Translator: Denis Lysenko <gribua@gmail.com>\n"
"Language-Team: Ukrainian (Ukraine) (http://www.transifex.net/projects/p/I2P/language/uk_UA/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)\n"
"Language: uk_UA\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)\n"
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:487
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:492
msgid "This seems to be a bad destination:"
msgstr "Скоріше всього це поганий адрес призначення:"
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:487
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:492
msgid "i2paddresshelper cannot help you with a destination like that!"
msgstr "i2paddresshelper не може допомогти Вам з місцем призначення як це!"
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:556
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:561
#, java-format
msgid ""
"To visit the destination in your host database, click <a href=\"{0}\">here</"
"a>. To visit the conflicting addresshelper destination, click <a href="
"\"{1}\">here</a>."
msgstr ""
"Для того щоб перейти по локальному посиланню з локальної адресної книги, "
"натисніть ось<a href=\"{0}\">тут</a>. Для переходу по новому addresshelper-"
"посиланню, натисніть будь-ласка <a href=\"{1}\">тут</a>."
"To visit the destination in your host database, click <a "
"href=\"{0}\">here</a>. To visit the conflicting addresshelper destination, "
"click <a href=\"{1}\">here</a>."
msgstr "Для того щоб перейти по локальному посиланню з локальної адресної книги, натисніть ось<a href=\"{0}\">тут</a>. Для переходу по новому addresshelper-посиланню, натисніть будь-ласка <a href=\"{1}\">тут</a>."
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:932
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:937
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:398
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:142
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:401
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:391
msgid "Host"
msgstr "Адрес"
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:933
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:370
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:938
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:372
msgid "Destination"
msgstr "Адреса призначення"
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:938
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:943
#, java-format
msgid "Continue to {0} without saving"
msgstr "Продовжити до {0} без збереження"
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:943
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:948
#, java-format
msgid "Save {0} to router address book and continue to eepsite"
msgstr "Зберегти {0} в адресну книгу роутера и продовжити перехід до eep-сайту"
#. only blockfile supports multiple books
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:946
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:951
#, java-format
msgid "Save {0} to master address book and continue to eepsite"
msgstr "Зберегти {0} в основну адресну книгу і продовжити перехід до еер-сайту"
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:947
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:952
#, java-format
msgid "Save {0} to private address book and continue to eepsite"
msgstr ""
"Зберегти {0} в приватну адресну книгу і продовжити перехід до еер-сайту."
msgstr "Зберегти {0} в приватну адресну книгу і продовжити перехід до еер-сайту."
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1103
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1107
msgid "HTTP Outproxy"
msgstr "Вихідний HTTP проксі"
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1112
msgid ""
"Click a link below to look for an address helper by using a \"jump\" service:"
msgstr ""
"\"Jump\" сервіси, які, можливо, знають необхідне Вам addresshelper-посилання."
"Click a link below to look for an address helper by using a \"jump\" "
"service:"
msgstr "\"Jump\" сервіси, які, можливо, знають необхідне Вам addresshelper-посилання."
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1321
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1330
msgid "Added via address helper"
msgstr "Додано через address helper"
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1345
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1354
#, java-format
msgid "Redirecting to {0}"
msgstr "Перенаправляємо до {0}"
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1351
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1360
msgid "Router Console"
msgstr "Консоль роутера"
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1352
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1361
msgid "Addressbook"
msgstr "Адресна книга"
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1352
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1361
msgid "Configuration"
msgstr "Настройки"
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1352
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1361
msgid "Help"
msgstr "Допомога"
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1357
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1366
#, java-format
msgid "Saved {0} to the {1} addressbook, redirecting now."
msgstr "{0} збережено в {1} адресної книги, перенапрявляємо."
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1358
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1367
#, java-format
msgid "Failed to save {0} to the {1} addressbook, redirecting now."
msgstr "Не вдалось зберегти {0} в {1} адресної книги, перенаправляємо."
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1360
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1369
msgid "Click here if you are not redirected automatically."
msgstr "Клацніть тут якщо вас не перенаправило автоматично."
@@ -124,97 +124,93 @@ msgstr "Клацніть тут якщо вас не перенаправило
msgid "internal"
msgstr "внутрішній"
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:174
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:175
msgid ""
"Invalid form submission, probably because you used the 'back' or 'reload' "
"button on your browser. Please resubmit."
msgstr ""
"Неправильно передана форма, можливо ви використовуєте дію браузера \"назад\" "
"або \"оновити\". Будь-ласка повторіть спробу."
msgstr "Неправильно передана форма, можливо ви використовуєте дію браузера \"назад\" або \"оновити\". Будь-ласка повторіть спробу."
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:221
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:222
msgid "Configuration reloaded for all tunnels"
msgstr "Конфігурація для всіх тунелів перечитана"
#. and give them something to look at in any case
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:233
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:234
msgid "Starting tunnel"
msgstr "Випуск тунелю"
#. and give them something to look at in any case
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:246
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:247
msgid "Stopping tunnel"
msgstr "Зупинка тунелю"
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:314
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:315
msgid "Configuration changes saved"
msgstr "Налаштування збережені"
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:317
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:318
msgid "Failed to save configuration"
msgstr "Помилка під час зберігання налаштувань"
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:435
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:436
msgid "New Tunnel"
msgstr "Новий тунель"
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:455
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:456
msgid "Standard client"
msgstr "Звичайний клієнт"
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:456
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:457
msgid "HTTP client"
msgstr "HTTP клієнт"
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:457
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:458
msgid "IRC client"
msgstr "IRC клієнт"
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:458
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:459
msgid "Standard server"
msgstr "Звичайний сервер"
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:459
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:460
msgid "HTTP server"
msgstr "HTTP сервер"
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:460
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:461
msgid "SOCKS 4/4a/5 proxy"
msgstr "SOCKS 4/4a/5 проксі"
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:461
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:462
msgid "SOCKS IRC proxy"
msgstr "SOCKS IRC проксі"
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:462
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:463
msgid "CONNECT/SSL/HTTPS proxy"
msgstr "CONNECT/SSL/HTTPS проксі"
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:463
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:464
msgid "IRC server"
msgstr "IRC сервер"
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:464
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:465
msgid "Streamr client"
msgstr "Streamr клієнт"
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:465
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:466
msgid "Streamr server"
msgstr "Streamr сервер"
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:466
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:467
msgid "HTTP bidir"
msgstr ""
"HTTP bidir (експерементальний двухнаправлений режим, інструкцію запитуйте у "
"sponge)"
msgstr "HTTP bidir (експерементальний двухнаправлений режим, інструкцію запитуйте у sponge)"
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:554
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:293
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:555
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:295
msgid "Host not set"
msgstr "Хост не заданий"
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:558
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:275
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:559
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:277
msgid "Port not set"
msgstr "Порт не заданий"
@@ -232,24 +228,26 @@ msgstr "Нові налаштування проксі"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:112
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:112
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:110
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:124
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:245
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:260
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:112
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:126
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:247
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:262
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:307
msgid "Name"
msgstr "Назва"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:116
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:116
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:249
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:282
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:251
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:284
msgid "Type"
msgstr "Тип"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:120
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:120
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:229
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:389
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:231
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:391
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:311
msgid "Description"
msgstr "Опис"
@@ -275,22 +273,27 @@ msgstr "необхідно"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:159
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:178
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:460
msgid "Reachable by"
msgstr "Доступно цим"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:180
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:339
msgid "Outproxies"
msgstr "Список вихідних проксі (Outproxies)"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:187
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:359
msgid "Tunnel Destination"
msgstr "Адреса Призначення Тунелю"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:199
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:363
msgid "name or destination"
msgstr "ім'я або призначення"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:202
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:366
msgid "b32 not recommended"
msgstr "b32 не рекомендується"
@@ -302,18 +305,18 @@ msgstr "Колективний Клієнт"
msgid ""
"(Share tunnels with other clients and irc/httpclients? Change requires "
"restart of client proxy)"
msgstr ""
"(Використовувати тунелі спільно з іншими клієнтами і irc/httpclients? Зміна "
"налаштування потребує перезапуску тунелю)"
msgstr "(Використовувати тунелі спільно з іншими клієнтами і irc/httpclients? Зміна налаштування потребує перезапуску тунелю)"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:216
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:124
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:500
msgid "Auto Start"
msgstr "Автозапуск"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:220
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:228
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:128
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:504
msgid "(Check the Box for 'YES')"
msgstr "(Виберіть чекбокс 'ТАК')"
@@ -330,9 +333,7 @@ msgstr "Розширені мережеві опції"
msgid ""
"(NOTE: when this client proxy is configured to share tunnels, then these "
"options are for all the shared proxy clients!)"
msgstr ""
"(Зверніть увагу: коли цей клієнтський проксі настроєний ділитись тунелями, "
"то ці опції будуть дійсні для всіх проксі клієнтів з якими ви ділитесь!)"
msgstr "(Зверніть увагу: коли цей клієнтський проксі настроєний ділитись тунелями, то ці опції будуть дійсні для всіх проксі клієнтів з якими ви ділитесь!)"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:236
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:245
@@ -362,8 +363,7 @@ msgstr "2 хоп тунель (висока анонімність, велики
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:257
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:266
msgid "3 hop tunnel (very high anonymity, poor performance)"
msgstr ""
"3 хоп тунель (дуже висока анонімність, погана продуктивність (комп'ютера))"
msgstr "3 хоп тунель (дуже висока анонімність, погана продуктивність (комп'ютера))"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:266
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:275
@@ -384,8 +384,7 @@ msgstr "0 хоп розкид (без рандомізації, фіксован
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:291
msgid ""
"+ 0-1 hop variance (medium additive randomisation, subtractive performance)"
msgstr ""
"+0-1 хоп розкид (помірна збільшена рандомізація, понижена продуктивність)"
msgstr "+0-1 хоп розкид (помірна збільшена рандомізація, понижена продуктивність)"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:286
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:295
@@ -416,25 +415,20 @@ msgstr "Кількість"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:318
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:327
msgid "1 inbound, 1 outbound tunnel (low bandwidth usage, less reliability)"
msgstr ""
"1 вхідний, 1 вихідний тунель (низька пропускна спроможність, низька "
"надійність)"
msgstr "1 вхідний, 1 вихідний тунель (низька пропускна спроможність, низька надійність)"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:322
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:331
msgid ""
"2 inbound, 2 outbound tunnels (standard bandwidth usage, standard "
"reliability)"
msgstr ""
"2 вхідні, 2 вихідні тунелі (стандартна пропускна спроможність, стандартна "
"надійність)"
msgstr "2 вхідні, 2 вихідні тунелі (стандартна пропускна спроможність, стандартна надійність)"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:326
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:335
msgid ""
"3 inbound, 3 outbound tunnels (higher bandwidth usage, higher reliability)"
msgstr ""
"3 вхідні, 3 вихідні тунелі (висока пропускна спроможність, висока надійність)"
msgstr "3 вхідні, 3 вихідні тунелі (висока пропускна спроможність, висока надійність)"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:335
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:344
@@ -449,31 +443,23 @@ msgstr "Резервна кількість"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:347
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:356
msgid "0 backup tunnels (0 redundancy, no added resource usage)"
msgstr ""
"0 резервних тунелів (0 надлишок, відсутність додаткового навантаження на "
"систему) "
msgstr "0 резервних тунелів (0 надлишок, відсутність додаткового навантаження на систему) "
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:351
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:360
msgid "1 backup tunnel each direction (low redundancy, low resource usage)"
msgstr ""
"1 резервний тунель в кожному напрямку (низька надлишковість, низьке "
"використання ресурсів системи)"
msgstr "1 резервний тунель в кожному напрямку (низька надлишковість, низьке використання ресурсів системи)"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:355
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:364
msgid ""
"2 backup tunnels each direction (medium redundancy, medium resource usage)"
msgstr ""
"2 резервні тунелі в кожному напрямку (середня надмірність, середнє "
"навантаження на систему)"
msgstr "2 резервні тунелі в кожному напрямку (середня надмірність, середнє навантаження на систему)"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:359
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:368
msgid "3 backup tunnels each direction (high redundancy, high resource usage)"
msgstr ""
"3 резервні тунелі в кожному напрямку (висока надмірність, високе "
"навантаження на систему)"
msgstr "3 резервні тунелі в кожному напрямку (висока надмірність, високе навантаження на систему)"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:368
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:377
@@ -501,9 +487,7 @@ msgstr "Затримка Зєднання"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:392
msgid "for request/response connections"
msgstr ""
"оптимізація для з'єднань, які починаються з запиту клієнта/відповіді "
"сервера. "
msgstr "оптимізація для з'єднань, які починаються з запиту клієнта/відповіді сервера. "
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:396
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:399
@@ -513,8 +497,9 @@ msgstr "I2CP Адрес Роутера"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:406
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:148
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:409
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:247
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:269
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:249
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:271
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:412
msgid "Port"
msgstr "Порт"
@@ -612,12 +597,11 @@ msgstr "Вибіркові параметри"
msgid ""
"NOTE: If tunnel is currently running, most changes will not take effect "
"until tunnel is stopped and restarted."
msgstr ""
"Примітка: Якщо тунель зараз активний, то більшість змін не почнуть діяти до "
"того моменту поки тунель не зупинять і перезапустять."
msgstr "Примітка: Якщо тунель зараз активний, то більшість змін не почнуть діяти до того моменту поки тунель не зупинять і перезапустять."
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:524
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:531
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:678
msgid "Cancel"
msgstr "Відмінити"
@@ -776,115 +760,466 @@ msgstr "Повідомлення про стан"
msgid "Refresh"
msgstr "Оновити"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:94
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:92
msgid "Tunnel Wizard"
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:96
msgid "Stop All"
msgstr "Зупинити все"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:98
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:100
msgid "Start All"
msgstr "Запустити все"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:102
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:104
msgid "Restart All"
msgstr "Перезапустити все"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:106
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:108
msgid "Reload Config"
msgstr "Перезапустити настройки"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:108
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:110
msgid "I2P Server Tunnels"
msgstr "Серверні I2P тунелі"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:112
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:133
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:114
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:135
msgid "Points at"
msgstr "Вказує на"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:114
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:156
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:160
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:116
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:158
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:162
msgid "Preview"
msgstr "Попередній перегляд"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:116
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:180
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:253
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:300
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:118
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:182
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:255
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:302
msgid "Status"
msgstr "Статус"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:166
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:168
msgid "Base32 Address"
msgstr "Base32-адрес"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:174
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:176
msgid "No Preview"
msgstr "Попередній перегляд недоступний"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:187
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:307
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:189
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:309
msgid "Starting..."
msgstr "Запускається..."
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:194
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:208
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:314
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:328
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:342
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:196
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:210
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:316
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:330
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:344
msgid "Stop"
msgstr "Зупинити"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:201
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:335
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:203
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:337
msgid "Running"
msgstr "Працює"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:215
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:349
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:217
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:351
msgid "Stopped"
msgstr "Зупинений"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:222
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:356
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:224
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:358
msgid "Start"
msgstr "Запустити"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:237
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:239
msgid "New server tunnel"
msgstr "Новий серверний тунель"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:239
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:399
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:241
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:401
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:204
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:246
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:276
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:282
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:554
msgid "Standard"
msgstr "Стандартний"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:241
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:401
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:243
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:403
msgid "Create"
msgstr "Створити"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:243
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:245
msgid "I2P Client Tunnels"
msgstr "Клієнтскі I2P тунелі"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:251
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:286
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:253
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:288
msgid "Interface"
msgstr "Мережевий інтерфейс"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:321
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:323
msgid "Standby"
msgstr "Режим очікування"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:366
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:368
msgid "Outproxy"
msgstr "Outproxy (зовнішній проксі)"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:384
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:386
msgid "none"
msgstr "ні"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:397
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:399
msgid "New client tunnel"
msgstr "Новий клієнтський тунель"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:102
msgid "I2P Tunnel Manager - Tunnel Creation Wizard"
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:120
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:545
msgid "Server or client tunnel?"
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:126
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:549
msgid "Tunnel type"
msgstr "Тип тунелю"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:132
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:579
msgid "Tunnel name and description"
msgstr "Ім'я і опис тунелю"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:138
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:588
msgid "Tunnel destination"
msgstr "Місце призначення тунелю"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:144
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:604
msgid "Binding address and port"
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:150
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:630
msgid "Tunnel auto-start"
msgstr "Авто-старт тунелю"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:156
msgid "Wizard completed"
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:170
msgid ""
"This wizard will take you through the various options available for creating"
" tunnels in I2P."
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:172
msgid ""
"The first thing to decide is whether you want to create a server or a client"
" tunnel."
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:174
msgid ""
"If you need to connect to a remote service, such as an IRC server inside I2P"
" or a code repository, then you will require a CLIENT tunnel."
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:176
msgid ""
"On the other hand, if you wish to host a service for others to connect to "
"you'll need to create a SERVER tunnel."
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:178
msgid "Server Tunnel"
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:180
msgid "Client Tunnel"
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:198
msgid "There are several types of tunnels to choose from:"
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:206
msgid "Basic tunnel for connecting to a single service inside I2P."
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:208
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:250
msgid ""
"Try this if none of the tunnel types below fit your requirements, or you "
"don't know what type of tunnel you need."
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:210
msgid "Tunnel that acts as an HTTP proxy for reaching eepsites inside I2P."
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:212
msgid ""
"Set your browser to use this tunnel as an http proxy, or set your "
"\"http_proxy\" environment variable for command-line applications in "
"GNU/Linux."
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:214
msgid ""
"Websites outside I2P can also be reached if an HTTP proxy within I2P is "
"known."
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:216
msgid "Customised client tunnel specific for IRC connections."
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:218
msgid ""
"With this tunnel type, your IRC client will be able to connect to an IRC "
"network inside I2P."
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:220
msgid ""
"Each IRC network in I2P that you wish to connect to will require its own "
"tunnel. (See Also, SOCKS IRC)"
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:222
msgid "A tunnel that implements the SOCKS protocol."
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:224
msgid ""
"This enables both TCP and UDP connections to be made through a SOCKS "
"outproxy within I2P."
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:226
msgid ""
"A client tunnel implementing the SOCKS protocol, which is customised for "
"connecting to IRC networks."
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:228
msgid ""
"With this tunnel type, IRC networks in I2P can be reached by typing the I2P "
"address into your IRC client, and configuring the IRC client to use this "
"SOCKS tunnel."
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:230
msgid ""
"This means that only one I2P tunnel is required rather than a separate "
"tunnel per IRC network."
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:232
msgid ""
"IRC networks outside I2P can also be reached if a SOCKS outproxy within I2P "
"is known, though it depends on whether or not the outproxy has been blocked "
"by the IRC network."
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:234
msgid "A client tunnel that implements the HTTP CONNECT command."
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:236
msgid ""
"This enables TCP connections to be made through an HTTP outproxy, assuming "
"the proxy supports the CONNECT command."
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:238
msgid "A customised client tunnel for Streamr."
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:248
msgid "A basic server tunnel for hosting a generic service inside I2P."
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:252
msgid "A server tunnel that is customised for HTTP connections."
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:254
msgid "Use this tunnel type if you want to host an eepsite."
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:256
msgid ""
"A customised server tunnel that can both serve HTTP data and connect to "
"other server tunnels."
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:258
msgid "This tunnel type is predominantly used when running a Seedless server."
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:260
msgid "A customised server tunnel for hosting IRC networks inside I2P."
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:262
msgid ""
"Usually, a separate tunnel needs to be created for each IRC server that is "
"to be accessible inside I2P."
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:264
msgid "A customised server tunnel for Streamr."
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:303
msgid "Choose a name and description for your tunnel."
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:305
msgid ""
"These can be anything you want - they are just for ease of identifying the "
"tunnel in the routerconsole."
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:335
msgid ""
"If you know of any outproxies for this type of tunnel (either HTTP or "
"SOCKS), fill them in below."
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:337
msgid "Separate multiple proxies with commas."
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:355
msgid ""
"Type in the I2P destination of the service that this client tunnel should "
"connect to."
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:357
msgid ""
"This could be the full base 64 destination key, or an I2P URL from your "
"address book."
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:387
msgid ""
"This is the IP that your service is running on, this is usually on the same "
"machine so 127.0.0.1 is autofilled."
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:410
msgid "This is the port that the service is accepting connections on."
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:431
msgid "This is the port that the client tunnel will be accessed from locally."
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:433
msgid "This is also the client port for the HTTPBidir server tunnel."
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:452
msgid ""
"How do you want this tunnel to be accessed? By just this machine, your "
"entire subnet, or external internet?"
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:454
msgid "You will most likely want to just allow 127.0.0.1"
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:496
msgid ""
"The I2P router can automatically start this tunnel for you when the router "
"is started."
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:498
msgid ""
"This can be useful for frequently-used tunnels (especially server tunnels), "
"but for tunnels that are only used occassionally it would mean that the I2P "
"router is creating and maintaining unnecessary tunnels."
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:524
msgid "The wizard has now collected enough information to create your tunnel."
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:526
msgid ""
"Upon clicking the Save button below, the wizard will set up the tunnel, and "
"take you back to the main I2PTunnel page."
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:531
msgid ""
"Because you chose to automatically start the tunnel when the router starts, "
"you don't have to do anything further."
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:533
msgid "The router will start the tunnel once it has been set up."
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:537
msgid ""
"Because you chose not to automatically start the tunnel, you will have to "
"manually start it."
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:539
msgid ""
"You can do this by clicking the Start button on the main page which "
"corresponds to the new tunnel."
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:543
msgid "Below is a summary of the options you chose:"
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:641
msgid ""
"Alongside these basic settings, there are a number of advanced options for "
"tunnel configuration."
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:643
msgid ""
"The wizard will set reasonably sensible default values for these, but you "
"can view and/or edit these by clicking on the tunnel's name in the main "
"I2PTunnel page."
msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:683
msgid "Previous"
msgstr "Попередній"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:691
msgid "Save Tunnel"
msgstr "Зберегти тунель"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:697
msgid "Finish"
msgstr "Завершити"
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:703
msgid "Next"
msgstr "Далі"

View File

@@ -50,6 +50,7 @@
<property name="workspace.changes.tr" value="" />
<jar destfile="./build/mstreaming.jar" basedir="./build/obj" includes="**/*.class" >
<manifest>
<attribute name="Implementation-Version" value="${full.version}" />
<attribute name="Build-Date" value="${build.timestamp}" />
<attribute name="Base-Revision" value="${workspace.version}" />
<attribute name="Workspace-Changes" value="${workspace.changes.tr}" />

View File

@@ -35,6 +35,7 @@
<dependset>
<srcfilelist dir="." files="../../../router/java/build/obj/net/i2p/router/RouterVersion.class" />
<targetfilelist dir="." files="build/obj/net/i2p/router/web/NewsFetcher.class" />
<targetfilelist dir="." files="build/obj/net/i2p/router/web/PluginStarter.class" />
<targetfilelist dir="." files="build/obj/net/i2p/router/web/SummaryHelper.class" />
<targetfilelist dir="." files="build/obj/net/i2p/router/web/UpdateHandler.class" />
</dependset>
@@ -90,6 +91,7 @@
<!-- top level installer will rename to jrobin.jar -->
<!-- DTG added in 0.8.4, not in the classpath for very old installs, before we changed wrapper.config to specify * -->
<attribute name="Class-Path" value="i2p.jar router.jar jrobin.jar desktopgui.jar" />
<attribute name="Implementation-Version" value="${full.version}" />
<attribute name="Build-Date" value="${build.timestamp}" />
<attribute name="Base-Revision" value="${workspace.version}" />
<attribute name="Workspace-Changes" value="${workspace.changes.j.tr}" />
@@ -169,6 +171,7 @@
<war destfile="build/routerconsole.war" webxml="../jsp/web-out.xml"
basedir="../jsp/" excludes="web.xml, *.css, **/*.java, *.jsp, *.jsi, web-fragment.xml, web-out.xml">
<manifest>
<attribute name="Implementation-Version" value="${full.version}" />
<attribute name="Build-Date" value="${build.timestamp}" />
<attribute name="Base-Revision" value="${workspace.version}" />
<attribute name="Workspace-Changes" value="${workspace.changes.w.tr}" />
@@ -292,6 +295,8 @@
<uptodate property="precompilejsp.uptodate" targetfile="../jsp/web-out.xml">
<srcfiles dir= "../jsp" includes="**/*.jsp, *.jsi, **/*.html, *.css, susimail/susimail, web.xml"/>
<!-- so the version is right on logs.jsp -->
<srcfiles dir= "../../../router/java/src/net/i2p/router" includes="RouterVersion.java"/>
</uptodate>
<target name="javadoc">

View File

@@ -44,7 +44,7 @@ fi
# list specific files in core/ and router/ here, so we don't scan the whole tree
ROUTERFILES="\
../../../core/java/src/net/i2p/data/DataHelper.java \
../../../router/java/src/net/i2p/router/Router.java \
../../../router/java/src/net/i2p/router/tasks/CoalesceStatsEvent.java \
../../../router/java/src/net/i2p/router/RouterThrottleImpl.java \
../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java \
../../../router/java/src/net/i2p/router/transport/TransportManager.java \

View File

@@ -38,8 +38,7 @@ public class CSSHelper extends HelperBase {
public void setLang(String lang) {
// Protected with nonce in css.jsi
if (lang != null && lang.length() == 2 && !lang.equals(_context.getProperty(Messages.PROP_LANG))) {
_context.router().setConfigSetting(Messages.PROP_LANG, lang);
_context.router().saveConfig();
_context.router().saveConfig(Messages.PROP_LANG, lang);
}
}
@@ -48,10 +47,20 @@ public class CSSHelper extends HelperBase {
return Messages.getLanguage(_context);
}
/**
* Show / hide news on home page
* @param val if non-null, "1" to show, else hide
* @since 0.8.12
*/
public void setNews(String val) {
// Protected with nonce in css.jsi
if (val != null)
NewsFetcher.getInstance(_context).showNews(val.equals("1"));
}
/** change refresh and save it */
public void setRefresh(String r) {
_context.router().setConfigSetting(PROP_REFRESH, r);
_context.router().saveConfig();
_context.router().saveConfig(PROP_REFRESH, r);
}
/** @return refresh time in seconds, as a string */

View File

@@ -1,11 +1,13 @@
package net.i2p.router.web;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
import net.i2p.data.DataHelper;
/**
* Handler to deal with form submissions from the advanced config form and act
@@ -39,36 +41,27 @@ public class ConfigAdvancedHandler extends FormHandler {
*
*/
private void saveChanges() {
HashSet unsetKeys = new HashSet(_context.router().getConfigMap().keySet());
Set<String> unsetKeys = new HashSet(_context.router().getConfigSettings());
if (_config != null) {
BufferedReader reader = new BufferedReader(new InputStreamReader(new ByteArrayInputStream(_config.getBytes())));
String line = null;
Properties props = new Properties();
try {
while ( (line = reader.readLine()) != null) {
int eq = line.indexOf('=');
if (eq == -1) continue;
if (eq >= line.length() - 1) continue;
String key = line.substring(0, eq).trim();
String val = line.substring(eq + 1).trim();
_context.router().setConfigSetting(key, val);
unsetKeys.remove(key);
}
DataHelper.loadProps(props, new ByteArrayInputStream(_config.getBytes()));
} catch (IOException ioe) {
_log.error("Config error", ioe);
addFormError(ioe.toString());
addFormError(_("Error updating the configuration - please see the error logs"));
return;
}
Iterator cleaner = unsetKeys.iterator();
while (cleaner.hasNext()) {
String unsetKey = (String)cleaner.next();
_context.router().removeConfigSetting(unsetKey);
for (Object key : props.keySet()) {
unsetKeys.remove(key);
}
boolean saved = _context.router().saveConfig();
boolean saved = _context.router().saveConfig(props, unsetKeys);
if (saved)
addFormNotice(_("Configuration saved successfully"));
else
addFormNotice(_("Error saving the configuration (applied but not saved) - please see the error logs"));
addFormError(_("Error saving the configuration (applied but not saved) - please see the error logs"));
//if (_forceRestart) {
// addFormNotice("Performing a soft restart");

View File

@@ -1,8 +1,7 @@
package net.i2p.router.web;
import java.util.Iterator;
import java.util.Set;
import java.util.TreeSet;
import java.util.Map;
import java.util.TreeMap;
public class ConfigAdvancedHelper extends HelperBase {
@@ -10,11 +9,11 @@ public class ConfigAdvancedHelper extends HelperBase {
public String getSettings() {
StringBuilder buf = new StringBuilder(4*1024);
Set names = _context.router().getConfigSettings();
TreeSet sortedNames = new TreeSet(names);
for (Iterator iter = sortedNames.iterator(); iter.hasNext(); ) {
String name = (String)iter.next();
String val = _context.router().getConfigSetting(name);
TreeMap<String, String> sorted = new TreeMap();
sorted.putAll(_context.router().getConfigMap());
for (Map.Entry<String, String> e : sorted.entrySet()) {
String name = e.getKey();
String val = e.getValue();
buf.append(name).append('=').append(val).append('\n');
}
return buf.toString();

View File

@@ -5,6 +5,7 @@ import java.io.IOException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
@@ -52,6 +53,10 @@ public class ConfigClientsHandler extends FormHandler {
installPlugin();
return;
}
if (_action.equals(_("Update All Installed Plugins"))) {
updateAllPlugins();
return;
}
// value
if (_action.startsWith("Start ")) {
String app = _action.substring(6);
@@ -131,8 +136,8 @@ public class ConfigClientsHandler extends FormHandler {
// label (IE)
String xStart = _("Start");
if (_action.toLowerCase().startsWith(xStart + "<span class=hide> ") &&
_action.toLowerCase().endsWith("</span>")) {
if (_action.toLowerCase(Locale.US).startsWith(xStart + "<span class=hide> ") &&
_action.toLowerCase(Locale.US).endsWith("</span>")) {
// IE sucks
String app = _action.substring(xStart.length() + 18, _action.length() - 7);
int appnum = -1;
@@ -320,6 +325,20 @@ public class ConfigClientsHandler extends FormHandler {
installPlugin(url);
}
/** @since 0.8.13 */
private void updateAllPlugins() {
if ("true".equals(System.getProperty(UpdateHandler.PROP_UPDATE_IN_PROGRESS))) {
addFormError(_("Plugin or update download already in progress."));
return;
}
addFormNotice(_("Updating all plugins"));
PluginStarter.updateAll(_context);
// So that update() will post a status to the summary bar before we reload
try {
Thread.sleep(1000);
} catch (InterruptedException ie) {}
}
private void installPlugin(String url) {
if ("true".equals(System.getProperty(UpdateHandler.PROP_UPDATE_IN_PROGRESS))) {
addFormError(_("Plugin or update download already in progress."));
@@ -371,31 +390,34 @@ public class ConfigClientsHandler extends FormHandler {
* @since 0.8.3
*/
private void saveInterfaceChanges() {
Map<String, String> changes = new HashMap();
String port = getJettyString("port");
if (port != null)
_context.router().setConfigSetting(ClientManagerFacadeImpl.PROP_CLIENT_PORT, port);
changes.put(ClientManagerFacadeImpl.PROP_CLIENT_PORT, port);
String intfc = getJettyString("interface");
if (intfc != null)
_context.router().setConfigSetting(ClientManagerFacadeImpl.PROP_CLIENT_HOST, intfc);
changes.put(ClientManagerFacadeImpl.PROP_CLIENT_HOST, intfc);
String user = getJettyString("user");
if (user != null)
_context.router().setConfigSetting(ConfigClientsHelper.PROP_USER, user);
changes.put(ConfigClientsHelper.PROP_USER, user);
String pw = getJettyString("pw");
if (pw != null)
_context.router().setConfigSetting(ConfigClientsHelper.PROP_PW, pw);
changes.put(ConfigClientsHelper.PROP_PW, pw);
String mode = getJettyString("mode");
boolean disabled = "0".equals(mode);
boolean ssl = "2".equals(mode);
_context.router().setConfigSetting(ConfigClientsHelper.PROP_DISABLE_EXTERNAL,
changes.put(ConfigClientsHelper.PROP_DISABLE_EXTERNAL,
Boolean.toString(disabled));
_context.router().setConfigSetting(ConfigClientsHelper.PROP_ENABLE_SSL,
changes.put(ConfigClientsHelper.PROP_ENABLE_SSL,
Boolean.toString(ssl));
_context.router().setConfigSetting(ConfigClientsHelper.PROP_AUTH,
changes.put(ConfigClientsHelper.PROP_AUTH,
Boolean.toString((_settings.get("auth") != null)));
boolean all = "0.0.0.0".equals(intfc) || "0:0:0:0:0:0:0:0".equals(intfc) ||
"::".equals(intfc);
_context.router().setConfigSetting(ConfigClientsHelper.BIND_ALL_INTERFACES, Boolean.toString(all));
_context.router().saveConfig();
addFormNotice(_("Interface configuration saved successfully - restart required to take effect."));
changes.put(ConfigClientsHelper.BIND_ALL_INTERFACES, Boolean.toString(all));
if (_context.router().saveConfig(changes, null))
addFormNotice(_("Interface configuration saved successfully - restart required to take effect."));
else
addFormError(_("Error saving the configuration (applied but not saved) - please see the error logs"));
}
}

View File

@@ -9,6 +9,7 @@ import java.util.Properties;
import java.util.Set;
import java.util.TreeSet;
import net.i2p.data.DataHelper;
import net.i2p.router.client.ClientManagerFacadeImpl;
import net.i2p.router.startup.ClientAppConfig;
import net.i2p.util.Addresses;
@@ -234,6 +235,7 @@ public class ConfigClientsHelper extends HelperBase {
boolean enabled, boolean ro, String desc, boolean edit,
boolean showEditButton, boolean showUpdateButton, boolean showStopButton,
boolean showDeleteButton, boolean showStartButton) {
String escapeddesc = DataHelper.escapeHTML(desc);
buf.append("<tr><td class=\"mediumtags\" align=\"right\" width=\"25%\">");
if (urlify && enabled) {
String link = "/";
@@ -256,19 +258,21 @@ public class ConfigClientsHelper extends HelperBase {
buf.append("disabled=\"true\" ");
}
buf.append("></td><td align=\"center\" width=\"15%\">");
// The icons were way too much, so there's an X in each button class,
// remove if you wnat to put them back
if (showStartButton && (!ro) && !edit) {
buf.append("<button type=\"submit\" name=\"action\" value=\"Start ").append(index).append("\" >" + _("Start") + "<span class=hide> ").append(index).append("</span></button>");
buf.append("<button type=\"submit\" class=\"Xaccept\" name=\"action\" value=\"Start ").append(index).append("\" >" + _("Start") + "<span class=hide> ").append(index).append("</span></button>");
}
if (showEditButton && (!edit) && !ro)
buf.append("<button type=\"submit\" name=\"edit\" value=\"Edit ").append(index).append("\" >" + _("Edit") + "<span class=hide> ").append(index).append("</span></button>");
buf.append("<button type=\"submit\" class=\"Xadd\" name=\"edit\" value=\"Edit ").append(index).append("\" >" + _("Edit") + "<span class=hide> ").append(index).append("</span></button>");
if (showStopButton && (!edit))
buf.append("<button type=\"submit\" name=\"action\" value=\"Stop ").append(index).append("\" >" + _("Stop") + "<span class=hide> ").append(index).append("</span></button>");
buf.append("<button type=\"submit\" class=\"Xstop\" name=\"action\" value=\"Stop ").append(index).append("\" >" + _("Stop") + "<span class=hide> ").append(index).append("</span></button>");
if (showUpdateButton && (!edit) && !ro) {
buf.append("<button type=\"submit\" name=\"action\" value=\"Check ").append(index).append("\" >" + _("Check for updates") + "<span class=hide> ").append(index).append("</span></button>");
buf.append("<button type=\"submit\" name=\"action\" value=\"Update ").append(index).append("\" >" + _("Update") + "<span class=hide> ").append(index).append("</span></button>");
buf.append("<button type=\"submit\" class=\"Xcheck\" name=\"action\" value=\"Check ").append(index).append("\" >" + _("Check for updates") + "<span class=hide> ").append(index).append("</span></button>");
buf.append("<button type=\"submit\" class=\"Xdownload\" name=\"action\" value=\"Update ").append(index).append("\" >" + _("Update") + "<span class=hide> ").append(index).append("</span></button>");
}
if (showDeleteButton && (!edit) && !ro) {
buf.append("<button type=\"submit\" name=\"action\" value=\"Delete ").append(index)
buf.append("<button type=\"submit\" class=\"Xdelete\" name=\"action\" value=\"Delete ").append(index)
.append("\" onclick=\"if (!confirm('")
.append(_("Are you sure you want to delete {0}?", _(name)))
.append("')) { return false; }\">")
@@ -277,7 +281,7 @@ public class ConfigClientsHelper extends HelperBase {
buf.append("</td><td align=\"left\" width=\"50%\">");
if (edit && !ro) {
buf.append("<input type=\"text\" size=\"80\" name=\"desc").append(index).append("\" value=\"");
buf.append(desc);
buf.append(escapeddesc);
buf.append("\" >");
} else {
buf.append(desc);

View File

@@ -159,7 +159,7 @@ public class ConfigLoggingHandler extends FormHandler {
if (saved)
addFormNotice(_("Log configuration saved"));
else
addFormNotice("Error saving the configuration (applied but not saved) - please see the error logs");
addFormError("Error saving the configuration (applied but not saved) - please see the error logs");
}
}
}

View File

@@ -3,6 +3,7 @@ package net.i2p.router.web;
import java.io.IOException;
/**
* Render the configuration menu at the top of all the config pages.
* refactored from confignav.jsp to reduce size and make translation easier
* @author zzz
*/
@@ -10,29 +11,45 @@ public class ConfigNavHelper extends HelperBase {
/** configX.jsp */
private static final String pages[] =
{"", "ui", "service", "update", "tunnels",
{"", "net", "ui", "service", "update", "tunnels",
"clients", "peer", "keyring", "logging", "stats",
"reseed", "advanced" };
private static final String titles[] =
{_x("Network"), _x("UI"), _x("Service"), _x("Update"), _x("Tunnels"),
{_x("Bandwidth"), _x("Network"), _x("UI"), _x("Service"), _x("Update"), _x("Tunnels"),
_x("Clients"), _x("Peers"), _x("Keyring"), _x("Logging"), _x("Stats"),
_x("Reseeding"), _x("Advanced") };
public void renderNavBar(String requestURI) throws IOException {
/**
* @param graphical false for text-mode browsers
*/
public void renderNavBar(String requestURI, boolean graphical) throws IOException {
StringBuilder buf = new StringBuilder(1024);
// TODO fix up the non-light themes
String theme = _context.getProperty(CSSHelper.PROP_THEME_NAME);
boolean span = graphical && (theme == null || theme.equals(CSSHelper.DEFAULT_THEME));
if (!span)
buf.append("<center>");
for (int i = 0; i < pages.length; i++) {
String page = "config" + pages[i];
if (requestURI.endsWith(page) || requestURI.endsWith(page + ".jsp")) {
// we are there
if (span)
buf.append("<span class=\"tab2\">");
buf.append(_(titles[i]));
} else {
// we are not there, make a link
if (span)
buf.append("<span class=\"tab\">");
buf.append("<a href=\"").append(page).append("\">").append(_(titles[i])).append("</a>");
}
if (i != pages.length - 1)
if (span)
buf.append(" </span>\n");
else if (i != pages.length - 1)
buf.append(" |\n");
}
if (!span)
buf.append("</center>");
_out.write(buf.toString());
}
}

View File

@@ -2,6 +2,10 @@ package net.i2p.router.web;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import net.i2p.router.Router;
import net.i2p.router.transport.FIFOBandwidthRefiller;
@@ -44,7 +48,9 @@ public class ConfigNetHandler extends FormHandler {
private String _reseedFrom;
private boolean _enableLoadTesting;
private String _sharePct;
private static final boolean _ratesOnly = false; // always false - delete me
private boolean _ratesOnly;
private boolean _udpDisabled;
private final Map<String, String> changes = new HashMap();
private static final String PROP_HIDDEN = Router.PROP_HIDDEN_HIDDEN; // see Router for other choice
@Override
@@ -120,6 +126,16 @@ public class ConfigNetHandler extends FormHandler {
_sharePct = (pct != null ? pct.trim() : null);
}
/** @since 0.8.12 */
public void setRatesOnly(String foo) {
_ratesOnly = true;
}
/** @since 0.8.13 */
public void setDisableUDP(String foo) {
_udpDisabled = true;
}
private void recheckReachability() {
_context.commSystem().recheckReachability();
addFormNotice(_("Rechecking router reachability..."));
@@ -132,10 +148,12 @@ public class ConfigNetHandler extends FormHandler {
*/
private void saveChanges() {
boolean restartRequired = false;
List<String> removes = new ArrayList();
if (!_ratesOnly) {
// IP Settings
String oldUdp = _context.getProperty(UDPTransport.PROP_SOURCES, UDPTransport.DEFAULT_SOURCES);
String oldUdp = _context.getProperty(UDPTransport.PROP_SOURCES,
_context.router().isHidden() ? "hidden" : UDPTransport.DEFAULT_SOURCES);
String oldUHost = _context.getProperty(UDPTransport.PROP_EXTERNAL_HOST, "");
if (_udpAutoIP != null) {
String uhost = "";
@@ -147,15 +165,15 @@ public class ConfigNetHandler extends FormHandler {
else
_udpAutoIP = UDPTransport.DEFAULT_SOURCES;
}
_context.router().setConfigSetting(UDPTransport.PROP_SOURCES, _udpAutoIP);
changes.put(UDPTransport.PROP_SOURCES, _udpAutoIP);
boolean valid = true;
if (uhost.length() > 0) {
valid = verifyAddress(uhost);
if (valid) {
_context.router().setConfigSetting(UDPTransport.PROP_EXTERNAL_HOST, uhost);
changes.put(UDPTransport.PROP_EXTERNAL_HOST, uhost);
}
} else {
_context.router().removeConfigSetting(UDPTransport.PROP_EXTERNAL_HOST);
removes.add(UDPTransport.PROP_EXTERNAL_HOST);
}
if (valid && ((!oldUdp.equals(_udpAutoIP)) || (!oldUHost.equals(uhost)))) {
addFormNotice(_("Updating IP address"));
@@ -169,7 +187,7 @@ public class ConfigNetHandler extends FormHandler {
String oldNPort = _context.getProperty(ConfigNetHelper.PROP_I2NP_NTCP_PORT, "");
String oldAutoHost = _context.getProperty(ConfigNetHelper.PROP_I2NP_NTCP_AUTO_IP, "true");
String sAutoPort = _context.getProperty(ConfigNetHelper.PROP_I2NP_NTCP_AUTO_PORT, "true");
boolean oldAutoPort = "true".equalsIgnoreCase(sAutoPort);
boolean oldAutoPort = Boolean.valueOf(sAutoPort).booleanValue();
if (_ntcpHostname == null) _ntcpHostname = "";
if (_ntcpPort == null) _ntcpPort = "";
if (_ntcpAutoIP == null) _ntcpAutoIP = "true";
@@ -181,31 +199,31 @@ public class ConfigNetHandler extends FormHandler {
} else if ("false".equals(_ntcpAutoIP) && _ntcpHostname.length() > 0) {
valid = verifyAddress(_ntcpHostname);
if (valid) {
_context.router().setConfigSetting(ConfigNetHelper.PROP_I2NP_NTCP_HOSTNAME, _ntcpHostname);
changes.put(ConfigNetHelper.PROP_I2NP_NTCP_HOSTNAME, _ntcpHostname);
addFormNotice(_("Updating inbound TCP address to") + " " + _ntcpHostname);
}
} else {
_context.router().removeConfigSetting(ConfigNetHelper.PROP_I2NP_NTCP_HOSTNAME);
removes.add(ConfigNetHelper.PROP_I2NP_NTCP_HOSTNAME);
if ("false".equals(_ntcpAutoIP))
addFormNotice(_("Disabling inbound TCP"));
else
addFormNotice(_("Updating inbound TCP address to auto")); // true or always
}
if (valid) {
_context.router().setConfigSetting(ConfigNetHelper.PROP_I2NP_NTCP_AUTO_IP, _ntcpAutoIP);
_context.router().setConfigSetting(TransportManager.PROP_ENABLE_NTCP, "" + !"disabled".equals(_ntcpAutoIP));
changes.put(ConfigNetHelper.PROP_I2NP_NTCP_AUTO_IP, _ntcpAutoIP);
changes.put(TransportManager.PROP_ENABLE_NTCP, "" + !"disabled".equals(_ntcpAutoIP));
restartRequired = true;
}
}
if (oldAutoPort != _ntcpAutoPort || ! oldNPort.equals(_ntcpPort)) {
if (_ntcpPort.length() > 0 && !_ntcpAutoPort) {
_context.router().setConfigSetting(ConfigNetHelper.PROP_I2NP_NTCP_PORT, _ntcpPort);
changes.put(ConfigNetHelper.PROP_I2NP_NTCP_PORT, _ntcpPort);
addFormNotice(_("Updating inbound TCP port to") + " " + _ntcpPort);
} else {
_context.router().removeConfigSetting(ConfigNetHelper.PROP_I2NP_NTCP_PORT);
removes.add(ConfigNetHelper.PROP_I2NP_NTCP_PORT);
addFormNotice(_("Updating inbound TCP port to auto"));
}
_context.router().setConfigSetting(ConfigNetHelper.PROP_I2NP_NTCP_AUTO_PORT, "" + _ntcpAutoPort);
changes.put(ConfigNetHelper.PROP_I2NP_NTCP_AUTO_PORT, "" + _ntcpAutoPort);
restartRequired = true;
}
@@ -213,8 +231,8 @@ public class ConfigNetHandler extends FormHandler {
if ( (_udpPort != null) && (_udpPort.length() > 0) ) {
String oldPort = "" + _context.getProperty(UDPTransport.PROP_INTERNAL_PORT, UDPTransport.DEFAULT_INTERNAL_PORT);
if (!oldPort.equals(_udpPort)) {
_context.router().setConfigSetting(UDPTransport.PROP_INTERNAL_PORT, _udpPort);
_context.router().setConfigSetting(UDPTransport.PROP_EXTERNAL_PORT, _udpPort);
changes.put(UDPTransport.PROP_INTERNAL_PORT, _udpPort);
changes.put(UDPTransport.PROP_EXTERNAL_PORT, _udpPort);
addFormNotice(_("Updating UDP port from") + " " + oldPort + " " + _("to") + " " + _udpPort);
restartRequired = true;
}
@@ -222,21 +240,21 @@ public class ConfigNetHandler extends FormHandler {
}
updateRates();
boolean ratesUpdated = updateRates();
boolean switchRequired = false;
if (!_ratesOnly) {
// If hidden mode value changes, restart is required
switchRequired = _hiddenMode != _context.router().isHidden();
if (switchRequired) {
_context.router().setConfigSetting(PROP_HIDDEN, "" + _hiddenMode);
changes.put(PROP_HIDDEN, "" + _hiddenMode);
if (_hiddenMode)
addFormError(_("Gracefully restarting into Hidden Router Mode"));
else
addFormError(_("Gracefully restarting to exit Hidden Router Mode"));
}
_context.router().setConfigSetting(Router.PROP_DYNAMIC_KEYS, "" + _dynamicKeys);
changes.put(Router.PROP_DYNAMIC_KEYS, "" + _dynamicKeys);
if (Boolean.valueOf(_context.getProperty(TransportManager.PROP_ENABLE_UPNP)).booleanValue() !=
_upnp) {
@@ -246,7 +264,7 @@ public class ConfigNetHandler extends FormHandler {
else
addFormNotice(_("Disabling UPnP, restart required to take effect"));
}
_context.router().setConfigSetting(TransportManager.PROP_ENABLE_UPNP, "" + _upnp);
changes.put(TransportManager.PROP_ENABLE_UPNP, "" + _upnp);
if (Boolean.valueOf(_context.getProperty(UDPTransport.PROP_LAPTOP_MODE)).booleanValue() !=
_laptop) {
@@ -256,30 +274,42 @@ public class ConfigNetHandler extends FormHandler {
else
addFormNotice(_("Disabling laptop mode"));
}
_context.router().setConfigSetting(UDPTransport.PROP_LAPTOP_MODE, "" + _laptop);
changes.put(UDPTransport.PROP_LAPTOP_MODE, "" + _laptop);
if (_context.getBooleanPropertyDefaultTrue(TransportManager.PROP_ENABLE_UDP) !=
!_udpDisabled) {
if (_udpDisabled)
addFormNotice(_("Disabling UDP"));
else
addFormNotice(_("Enabling UDP"));
restartRequired = true;
}
changes.put(TransportManager.PROP_ENABLE_UDP, "" + (!_udpDisabled));
if (_requireIntroductions) {
_context.router().setConfigSetting(UDPTransport.PROP_FORCE_INTRODUCERS, "true");
changes.put(UDPTransport.PROP_FORCE_INTRODUCERS, "true");
addFormNotice(_("Requiring SSU introducers"));
} else {
_context.router().removeConfigSetting(UDPTransport.PROP_FORCE_INTRODUCERS);
removes.add(UDPTransport.PROP_FORCE_INTRODUCERS);
}
// Time sync enable, means NOT disabled
// Hmm router sets this at startup, not required here
//_context.router().setConfigSetting(Timestamper.PROP_DISABLED, "false");
//changes.put(Timestamper.PROP_DISABLED, "false");
// Hidden in the GUI
//LoadTestManager.setEnableLoadTesting(_context, _enableLoadTesting);
}
boolean saved = _context.router().saveConfig();
if ( (_action != null) && (_("Save changes").equals(_action)) ) {
if (saved)
addFormNotice(_("Configuration saved successfully"));
else
addFormNotice(_("Error saving the configuration (applied but not saved) - please see the error logs"));
}
boolean saved = _context.router().saveConfig(changes, removes);
if (saved)
addFormNotice(_("Configuration saved successfully"));
else
addFormError(_("Error saving the configuration (applied but not saved) - please see the error logs"));
// this has to be after the save
if (ratesUpdated)
_context.bandwidthLimiter().reinitialize();
if (switchRequired) {
hiddenSwitch();
@@ -339,13 +369,17 @@ public class ConfigNetHandler extends FormHandler {
private static final int DEF_BURST_PCT = 10;
private static final int DEF_BURST_TIME = 20;
private void updateRates() {
/**
* @return changed
*/
private boolean updateRates() {
boolean updated = false;
boolean bwUpdated = false;
if (_sharePct != null) {
String old = _context.router().getConfigSetting(Router.PROP_BANDWIDTH_SHARE_PERCENTAGE);
if ( (old == null) || (!old.equalsIgnoreCase(_sharePct)) ) {
_context.router().setConfigSetting(Router.PROP_BANDWIDTH_SHARE_PERCENTAGE, _sharePct);
if ( (old == null) || (!old.equals(_sharePct)) ) {
changes.put(Router.PROP_BANDWIDTH_SHARE_PERCENTAGE, _sharePct);
addFormNotice(_("Updating bandwidth share percentage"));
updated = true;
}
@@ -354,24 +388,29 @@ public class ConfigNetHandler extends FormHandler {
// Since burst is now hidden in the gui, set burst to +10% for 20 seconds
if ( (_inboundRate != null) && (_inboundRate.length() > 0) &&
!_inboundRate.equals(_context.getProperty(FIFOBandwidthRefiller.PROP_INBOUND_BANDWIDTH, "" + FIFOBandwidthRefiller.DEFAULT_INBOUND_BANDWIDTH))) {
_context.router().setConfigSetting(FIFOBandwidthRefiller.PROP_INBOUND_BANDWIDTH, _inboundRate);
changes.put(FIFOBandwidthRefiller.PROP_INBOUND_BANDWIDTH, _inboundRate);
try {
int rate = Integer.parseInt(_inboundRate) * (100 + DEF_BURST_PCT) / 100;
int kb = DEF_BURST_TIME * rate;
_context.router().setConfigSetting(FIFOBandwidthRefiller.PROP_INBOUND_BURST_BANDWIDTH, "" + rate);
_context.router().setConfigSetting(FIFOBandwidthRefiller.PROP_INBOUND_BANDWIDTH_PEAK, "" + kb);
changes.put(FIFOBandwidthRefiller.PROP_INBOUND_BURST_BANDWIDTH, "" + rate);
changes.put(FIFOBandwidthRefiller.PROP_INBOUND_BANDWIDTH_PEAK, "" + kb);
} catch (NumberFormatException nfe) {}
updated = true;
bwUpdated = true;
}
if ( (_outboundRate != null) && (_outboundRate.length() > 0) &&
!_outboundRate.equals(_context.getProperty(FIFOBandwidthRefiller.PROP_OUTBOUND_BANDWIDTH, "" + FIFOBandwidthRefiller.DEFAULT_OUTBOUND_BANDWIDTH))) {
_context.router().setConfigSetting(FIFOBandwidthRefiller.PROP_OUTBOUND_BANDWIDTH, _outboundRate);
changes.put(FIFOBandwidthRefiller.PROP_OUTBOUND_BANDWIDTH, _outboundRate);
try {
int rate = Integer.parseInt(_outboundRate) * (100 + DEF_BURST_PCT) / 100;
int kb = DEF_BURST_TIME * rate;
_context.router().setConfigSetting(FIFOBandwidthRefiller.PROP_OUTBOUND_BURST_BANDWIDTH, "" + rate);
_context.router().setConfigSetting(FIFOBandwidthRefiller.PROP_OUTBOUND_BANDWIDTH_PEAK, "" + kb);
changes.put(FIFOBandwidthRefiller.PROP_OUTBOUND_BURST_BANDWIDTH, "" + rate);
changes.put(FIFOBandwidthRefiller.PROP_OUTBOUND_BANDWIDTH_PEAK, "" + kb);
} catch (NumberFormatException nfe) {}
bwUpdated = true;
}
if (bwUpdated) {
addFormNotice(_("Updated bandwidth limits"));
updated = true;
}
@@ -379,12 +418,12 @@ public class ConfigNetHandler extends FormHandler {
if ( (_inboundBurstRate != null) && (_inboundBurstRate.length() > 0) &&
!_inboundBurstRate.equals(_context.getProperty(FIFOBandwidthRefiller.PROP_INBOUND_BURST_BANDWIDTH, "" + FIFOBandwidthRefiller.DEFAULT_INBOUND_BURST_BANDWIDTH))) {
_context.router().setConfigSetting(FIFOBandwidthRefiller.PROP_INBOUND_BURST_BANDWIDTH, _inboundBurstRate);
changes.put(FIFOBandwidthRefiller.PROP_INBOUND_BURST_BANDWIDTH, _inboundBurstRate);
updated = true;
}
if ( (_outboundBurstRate != null) && (_outboundBurstRate.length() > 0) &&
!_outboundBurstRate.equals(_context.getProperty(FIFOBandwidthRefiller.PROP_OUTBOUND_BURST_BANDWIDTH, "" + FIFOBandwidthRefiller.DEFAULT_OUTBOUND_BURST_BANDWIDTH))) {
_context.router().setConfigSetting(FIFOBandwidthRefiller.PROP_OUTBOUND_BURST_BANDWIDTH, _outboundBurstRate);
changes.put(FIFOBandwidthRefiller.PROP_OUTBOUND_BURST_BANDWIDTH, _outboundBurstRate);
updated = true;
}
@@ -401,7 +440,7 @@ public class ConfigNetHandler extends FormHandler {
}
if ( (rateKBps > 0) && (burstSeconds > 0) ) {
int kb = rateKBps * burstSeconds;
_context.router().setConfigSetting(FIFOBandwidthRefiller.PROP_INBOUND_BANDWIDTH_PEAK, "" + kb);
changes.put(FIFOBandwidthRefiller.PROP_INBOUND_BANDWIDTH_PEAK, "" + kb);
updated = true;
}
}
@@ -419,17 +458,13 @@ public class ConfigNetHandler extends FormHandler {
}
if ( (rateKBps > 0) && (burstSeconds > 0) ) {
int kb = rateKBps * burstSeconds;
_context.router().setConfigSetting(FIFOBandwidthRefiller.PROP_OUTBOUND_BANDWIDTH_PEAK, "" + kb);
changes.put(FIFOBandwidthRefiller.PROP_OUTBOUND_BANDWIDTH_PEAK, "" + kb);
updated = true;
}
}
***********/
if (updated && !_ratesOnly) {
_context.bandwidthLimiter().reinitialize();
addFormNotice(_("Updated bandwidth limits"));
}
return updated;
}
}

View File

@@ -68,8 +68,8 @@ public class ConfigNetHelper extends HelperBase {
}
public String getEnableTimeSyncChecked() {
String disabled = _context.getProperty(Timestamper.PROP_DISABLED, "false");
if ( (disabled != null) && ("true".equalsIgnoreCase(disabled)) )
boolean disabled = _context.getBooleanProperty(Timestamper.PROP_DISABLED);
if (disabled)
return "";
else
return CHECKED;
@@ -77,7 +77,7 @@ public class ConfigNetHelper extends HelperBase {
/** @param prop must default to false */
public String getChecked(String prop) {
if (Boolean.valueOf(_context.getProperty(prop)).booleanValue())
if (_context.getBooleanProperty(prop))
return CHECKED;
return "";
}
@@ -130,7 +130,17 @@ public class ConfigNetHelper extends HelperBase {
/** default true */
public String getUpnpChecked() {
if (Boolean.valueOf(_context.getProperty(TransportManager.PROP_ENABLE_UPNP, "true")).booleanValue())
if (_context.getBooleanPropertyDefaultTrue(TransportManager.PROP_ENABLE_UPNP))
return CHECKED;
return "";
}
/**
* default false, inverse of default true property
* @since 0.8.13
*/
public String getUdpDisabledChecked() {
if (!_context.getBooleanPropertyDefaultTrue(TransportManager.PROP_ENABLE_UDP))
return CHECKED;
return "";
}
@@ -228,7 +238,7 @@ public class ConfigNetHelper extends HelperBase {
public String getSharePercentageBox() {
int pct = (int) (100 * _context.router().getSharePercentage());
StringBuilder buf = new StringBuilder(256);
buf.append("<select style=\"text-align: right;\" name=\"sharePercentage\">\n");
buf.append("<select style=\"text-align: right !important;\" name=\"sharePercentage\">\n");
boolean found = false;
for (int i = 30; i <= 110; i += 10) {
int val = i;

View File

@@ -1,6 +1,8 @@
package net.i2p.router.web;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import net.i2p.router.networkdb.reseed.Reseeder;
@@ -10,6 +12,8 @@ import net.i2p.router.networkdb.reseed.Reseeder;
*/
public class ConfigReseedHandler extends FormHandler {
private Map _settings;
private final Map<String, String> changes = new HashMap();
private final List<String> removes = new ArrayList();
@Override
protected void processForm() {
@@ -47,15 +51,15 @@ public class ConfigReseedHandler extends FormHandler {
private void saveString(String config, String param) {
String val = getJettyString(param);
if (val != null && val.length() > 0)
_context.router().setConfigSetting(config, val);
changes.put(config, val);
else
_context.router().removeConfigSetting(config);
removes.add(config);
}
/** @since 0.8.9 */
private void saveBoolean(String config, String param) {
boolean val = getJettyString(param) != null;
_context.router().setConfigSetting(config, Boolean.toString(val));
changes.put(config, Boolean.toString(val));
}
private void saveChanges() {
@@ -71,17 +75,19 @@ public class ConfigReseedHandler extends FormHandler {
saveBoolean(Reseeder.PROP_SPROXY_AUTH_ENABLE, "sauth");
String url = getJettyString("reseedURL");
if (url != null)
_context.router().setConfigSetting(Reseeder.PROP_RESEED_URL, url.trim().replace("\r\n", ",").replace("\n", ","));
changes.put(Reseeder.PROP_RESEED_URL, url.trim().replace("\r\n", ",").replace("\n", ","));
String mode = getJettyString("mode");
boolean req = "1".equals(mode);
boolean disabled = "2".equals(mode);
_context.router().setConfigSetting(Reseeder.PROP_SSL_REQUIRED,
changes.put(Reseeder.PROP_SSL_REQUIRED,
Boolean.toString(req));
_context.router().setConfigSetting(Reseeder.PROP_SSL_DISABLE,
changes.put(Reseeder.PROP_SSL_DISABLE,
Boolean.toString(disabled));
saveBoolean(Reseeder.PROP_PROXY_ENABLE, "enable");
saveBoolean(Reseeder.PROP_SPROXY_ENABLE, "senable");
_context.router().saveConfig();
addFormNotice(_("Configuration saved successfully."));
if (_context.router().saveConfig(changes, removes))
addFormNotice(_("Configuration saved successfully."));
else
addFormError(_("Error saving the configuration (applied but not saved) - please see the error logs"));
}
}

View File

@@ -9,11 +9,13 @@ import net.i2p.router.RouterContext;
*
*/
public class ConfigRestartBean {
/** all these are tagged below so no need to _x them here */
static final String[] SET1 = {"shutdownImmediate", "Shutdown immediately", "cancelShutdown", "Cancel shutdown"};
static final String[] SET2 = {"restartImmediate", "Restart immediately", "cancelShutdown", "Cancel restart"};
static final String[] SET3 = {"restart", "Restart", "shutdown", "Shutdown"};
static final String[] SET4 = {"shutdown", "Shutdown"};
/** all these are tagged below so no need to _x them here.
* order is: form value, form class, display text.
*/
static final String[] SET1 = {"shutdownImmediate", "stop", "Shutdown immediately", "cancelShutdown", "cancel", "Cancel shutdown"};
static final String[] SET2 = {"restartImmediate", "reload", "Restart immediately", "cancelShutdown", "cancel", "Cancel restart"};
static final String[] SET3 = {"restart", "reload", "Restart", "shutdown", "stop", "Shutdown"};
static final String[] SET4 = {"shutdown", "stop", "Shutdown"};
public static String getNonce() {
RouterContext ctx = ContextHelper.getContext(null);
@@ -58,21 +60,21 @@ public class ConfigRestartBean {
long timeRemaining = ctx.router().getShutdownTimeRemaining();
StringBuilder buf = new StringBuilder(128);
if ((shuttingDown || restarting) && timeRemaining <= 0) {
buf.append("<center><b>");
buf.append("<h4>");
if (restarting)
buf.append(_("Restart imminent", ctx));
else
buf.append(_("Shutdown imminent", ctx));
buf.append("</b></center>");
buf.append("</h4>");
} else if (shuttingDown) {
buf.append("<center><b>");
buf.append("<h4>");
buf.append(_("Shutdown in {0}", DataHelper.formatDuration2(timeRemaining), ctx));
buf.append("</b></center><br>");
buf.append("</h4><hr>");
buttons(ctx, buf, urlBase, systemNonce, SET1);
} else if (restarting) {
buf.append("<center><b>");
buf.append("<h4>");
buf.append(_("Restart in {0}", DataHelper.formatDuration2(timeRemaining), ctx));
buf.append("</b></center><br>");
buf.append("</h4><hr>");
buttons(ctx, buf, urlBase, systemNonce, SET2);
} else {
if (ctx.hasWrapper())
@@ -83,12 +85,16 @@ public class ConfigRestartBean {
return buf.toString();
}
/** @param s value,label,... pairs */
/** @param s value,class,label,... triplets */
private static void buttons(RouterContext ctx, StringBuilder buf, String url, String nonce, String[] s) {
buf.append("<form action=\"").append(url).append("\" method=\"POST\">\n");
buf.append("<input type=\"hidden\" name=\"consoleNonce\" value=\"").append(nonce).append("\" >\n");
for (int i = 0; i < s.length; i+= 2)
buf.append("<button type=\"submit\" name=\"action\" value=\"").append(s[i]).append("\" >").append(_(s[i+1], ctx)).append("</button>\n");
for (int i = 0; i < s.length; i+= 3) {
buf.append("<button type=\"submit\" name=\"action\" value=\"")
.append(s[i]).append("\" class=\"")
.append(s[i+1]).append("\" >")
.append(_(s[i+2], ctx)).append("</button>\n");
}
buf.append("</form>\n");
}

View File

@@ -8,6 +8,7 @@ import net.i2p.apps.systray.UrlLauncher;
import net.i2p.router.Router;
import net.i2p.router.RouterContext;
import net.i2p.router.startup.ClientAppConfig;
import net.i2p.util.VersionComparator;
import org.tanukisoftware.wrapper.WrapperManager;
@@ -18,6 +19,10 @@ import org.tanukisoftware.wrapper.WrapperManager;
*/
public class ConfigServiceHandler extends FormHandler {
private static WrapperListener _wrapperListener;
private static final String LISTENER_AVAILABLE = "3.2.0";
/**
* Register two shutdown hooks, one to rekey and/or tell the wrapper we are stopping,
* and a final one to tell the wrapper we are stopped.
@@ -127,6 +132,36 @@ public class ConfigServiceHandler extends FormHandler {
}
}
/**
* Register a handler for signals,
* so we can handle HUP from the wrapper (non-Windows only, wrapper 3.2.0 or higher)
*
* @since 0.8.13
*/
synchronized static void registerSignalHandler(RouterContext ctx) {
if (ctx.hasWrapper() && _wrapperListener == null &&
!System.getProperty("os.name").startsWith("Win")) {
String wv = System.getProperty("wrapper.version");
if (wv != null && (new VersionComparator()).compare(wv, LISTENER_AVAILABLE) >= 0) {
try {
_wrapperListener = new WrapperListener(ctx);
} catch (Throwable t) {}
}
}
}
/**
* Unregister the handler for signals
*
* @since 0.8.13
*/
public synchronized static void unregisterSignalHandler() {
if (_wrapperListener != null) {
_wrapperListener.unregister();
_wrapperListener = null;
}
}
@Override
protected void processForm() {
if (_action == null) return;
@@ -194,6 +229,7 @@ public class ConfigServiceHandler extends FormHandler {
addFormError(_("Warning: unable to install the service") + " - " + ioe.getMessage());
}
}
private void uninstallService() {
try {
Runtime.getRuntime().exec("uninstall_i2p_service_winnt.bat");

View File

@@ -1,7 +1,9 @@
package net.i2p.router.web;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.StringTokenizer;
import net.i2p.stat.StatManager;
@@ -73,9 +75,10 @@ public class ConfigStatsHandler extends FormHandler {
*
*/
private void saveChanges() {
Map<String, String> changes = new HashMap();
if (_filename == null)
_filename = StatManager.DEFAULT_STAT_FILE;
_context.router().setConfigSetting(StatManager.PROP_STAT_FILE, _filename);
changes.put(StatManager.PROP_STAT_FILE, _filename);
if (_explicitFilter) {
_stats.clear();
@@ -103,12 +106,12 @@ public class ConfigStatsHandler extends FormHandler {
stats.append(',');
}
_context.router().setConfigSetting(StatManager.PROP_STAT_FILTER, stats.toString());
changes.put(StatManager.PROP_STAT_FILTER, stats.toString());
boolean graphsChanged = !_graphs.equals(_context.getProperty("stat.summaries"));
_context.router().setConfigSetting("stat.summaries", _graphs);
changes.put("stat.summaries", _graphs);
boolean fullChanged = _context.getBooleanProperty(StatManager.PROP_STAT_FULL) != _isFull;
_context.router().setConfigSetting(StatManager.PROP_STAT_FULL, "" + _isFull);
_context.router().saveConfig();
changes.put(StatManager.PROP_STAT_FULL, "" + _isFull);
_context.router().saveConfig(changes, null);
if (!_stats.isEmpty())
addFormNotice(_("Stat filter and location updated successfully to") + ": " + stats.toString());
if (fullChanged) {

View File

@@ -44,6 +44,7 @@ public class ConfigTunnelsHandler extends FormHandler {
*/
private void saveChanges() {
boolean saveRequired = false;
Map<String, String> changes = new HashMap();
if (_log.shouldLog(Log.DEBUG))
_log.debug("Saving changes, with props = " + _settings + ".");
@@ -90,21 +91,21 @@ public class ConfigTunnelsHandler extends FormHandler {
out.setBackupQuantity(getInt(_settings.get(index + ".backupOutbound")));
if ("exploratory".equals(poolName)) {
_context.router().setConfigSetting(TunnelPoolSettings.PREFIX_INBOUND_EXPLORATORY +
changes.put(TunnelPoolSettings.PREFIX_INBOUND_EXPLORATORY +
TunnelPoolSettings.PROP_LENGTH, in.getLength()+"");
_context.router().setConfigSetting(TunnelPoolSettings.PREFIX_OUTBOUND_EXPLORATORY +
changes.put(TunnelPoolSettings.PREFIX_OUTBOUND_EXPLORATORY +
TunnelPoolSettings.PROP_LENGTH, out.getLength()+"");
_context.router().setConfigSetting(TunnelPoolSettings.PREFIX_INBOUND_EXPLORATORY +
changes.put(TunnelPoolSettings.PREFIX_INBOUND_EXPLORATORY +
TunnelPoolSettings.PROP_LENGTH_VARIANCE, in.getLengthVariance()+"");
_context.router().setConfigSetting(TunnelPoolSettings.PREFIX_OUTBOUND_EXPLORATORY +
changes.put(TunnelPoolSettings.PREFIX_OUTBOUND_EXPLORATORY +
TunnelPoolSettings.PROP_LENGTH_VARIANCE, out.getLengthVariance()+"");
_context.router().setConfigSetting(TunnelPoolSettings.PREFIX_INBOUND_EXPLORATORY +
changes.put(TunnelPoolSettings.PREFIX_INBOUND_EXPLORATORY +
TunnelPoolSettings.PROP_QUANTITY, in.getQuantity()+"");
_context.router().setConfigSetting(TunnelPoolSettings.PREFIX_OUTBOUND_EXPLORATORY +
changes.put(TunnelPoolSettings.PREFIX_OUTBOUND_EXPLORATORY +
TunnelPoolSettings.PROP_QUANTITY, out.getQuantity()+"");
_context.router().setConfigSetting(TunnelPoolSettings.PREFIX_INBOUND_EXPLORATORY +
changes.put(TunnelPoolSettings.PREFIX_INBOUND_EXPLORATORY +
TunnelPoolSettings.PROP_BACKUP_QUANTITY, in.getBackupQuantity()+"");
_context.router().setConfigSetting(TunnelPoolSettings.PREFIX_OUTBOUND_EXPLORATORY +
changes.put(TunnelPoolSettings.PREFIX_OUTBOUND_EXPLORATORY +
TunnelPoolSettings.PROP_BACKUP_QUANTITY, out.getBackupQuantity()+"");
}
@@ -135,11 +136,11 @@ public class ConfigTunnelsHandler extends FormHandler {
addFormNotice(_("Updated settings for all pools."));
if (saveRequired) {
boolean saved = _context.router().saveConfig();
boolean saved = _context.router().saveConfig(changes, null);
if (saved)
addFormNotice(_("Exploratory tunnel configuration saved successfully."));
else
addFormNotice(_("Error saving the configuration (applied but not saved) - please see the error logs."));
addFormError(_("Error saving the configuration (applied but not saved) - please see the error logs."));
}
}
private static final int getInt(Object val) {

View File

@@ -22,18 +22,19 @@ public class ConfigUIHandler extends FormHandler {
if (_config == null)
return;
String oldTheme = _context.getProperty(CSSHelper.PROP_THEME_NAME, CSSHelper.DEFAULT_THEME);
boolean ok;
if (_config.equals("default")) // obsolete
_context.router().removeConfigSetting(CSSHelper.PROP_THEME_NAME);
ok = _context.router().saveConfig(CSSHelper.PROP_THEME_NAME, null);
else
_context.router().setConfigSetting(CSSHelper.PROP_THEME_NAME, _config);
if (_context.router().saveConfig()) {
ok = _context.router().saveConfig(CSSHelper.PROP_THEME_NAME, _config);
if (ok) {
if (!oldTheme.equals(_config))
addFormNotice(_("Theme change saved.") +
" <a href=\"configui\">" +
_("Refresh the page to view.") +
"</a>");
} else {
addFormNotice(_("Error saving the configuration (applied but not saved) - please see the error logs."));
addFormError(_("Error saving the configuration (applied but not saved) - please see the error logs."));
}
}
}

View File

@@ -53,14 +53,14 @@ public class ConfigUIHelper extends HelperBase {
* Any language-specific flag added to the icon set must be
* added to the top-level build.xml for the updater.
*/
private static final String langs[] = {"ar", "da", "de", "en", "es", "fi",
private static final String langs[] = {"ar", "cs", "da", "de", "ee", "en", "es", "fi",
"fr", "it", "nl", "pl", "pt", "ru",
"sv", "uk", "vi", "zh"};
private static final String flags[] = {"lang_ar", "dk", "de", "us", "es", "fi",
private static final String flags[] = {"lang_ar", "cz", "dk", "de", "ee", "us", "es", "fi",
"fr", "it", "nl", "pl", "pt", "ru",
"se", "ua", "vn", "cn"};
private static final String xlangs[] = {_x("Arabic"), _x("Danish"),
_x("German"), _x("English"), _x("Spanish"),_x("Finnish"),
private static final String xlangs[] = {_x("Arabic"), _x("Czech"), _x("Danish"),
_x("German"), _x("Estonian"), _x("English"), _x("Spanish"), _x("Finnish"),
_x("French"), _x("Italian"), _x("Dutch"), _x("Polish"),
_x("Portuguese"), _x("Russian"), _x("Swedish"),
_x("Ukrainian"), _x("Vietnamese"), _x("Chinese")};

View File

@@ -1,8 +1,13 @@
package net.i2p.router.web;
import java.util.HashMap;
import java.util.Map;
import net.i2p.I2PAppContext;
import net.i2p.crypto.TrustedUpdate;
import net.i2p.data.DataHelper;
import net.i2p.util.FileUtil;
import net.i2p.util.PortMapper;
/**
*
@@ -74,7 +79,16 @@ public class ConfigUpdateHandler extends FormHandler {
public static final String PROP_TRUSTED_KEYS = "router.trustedUpdateKeys";
/**
* Convenience method for updaters
* @return the configured value, else the registered HTTP proxy, else the default
* @since 0.8.13
*/
static int proxyPort(I2PAppContext ctx) {
return ctx.getProperty(PROP_PROXY_PORT,
ctx.portMapper().getPort(PortMapper.SVC_HTTP_PROXY, DEFAULT_PROXY_PORT_INT));
}
@Override
protected void processForm() {
if (_action == null)
@@ -98,39 +112,41 @@ public class ConfigUpdateHandler extends FormHandler {
return;
}
Map<String, String> changes = new HashMap();
if ( (_newsURL != null) && (_newsURL.length() > 0) ) {
String oldURL = ConfigUpdateHelper.getNewsURL(_context);
if ( (oldURL == null) || (!_newsURL.equals(oldURL)) ) {
_context.router().setConfigSetting(PROP_NEWS_URL, _newsURL);
changes.put(PROP_NEWS_URL, _newsURL);
NewsFetcher.getInstance(_context).invalidateNews();
addFormNotice(_("Updating news URL to {0}", _newsURL));
}
}
if ( (_proxyHost != null) && (_proxyHost.length() > 0) ) {
if (_proxyHost != null && _proxyHost.length() > 0 && !_proxyHost.equals(_("internal"))) {
String oldHost = _context.router().getConfigSetting(PROP_PROXY_HOST);
if ( (oldHost == null) || (!_proxyHost.equals(oldHost)) ) {
_context.router().setConfigSetting(PROP_PROXY_HOST, _proxyHost);
changes.put(PROP_PROXY_HOST, _proxyHost);
addFormNotice(_("Updating proxy host to {0}", _proxyHost));
}
}
if ( (_proxyPort != null) && (_proxyPort.length() > 0) ) {
if (_proxyPort != null && _proxyPort.length() > 0 && !_proxyPort.equals(_("internal"))) {
String oldPort = _context.router().getConfigSetting(PROP_PROXY_PORT);
if ( (oldPort == null) || (!_proxyPort.equals(oldPort)) ) {
_context.router().setConfigSetting(PROP_PROXY_PORT, _proxyPort);
changes.put(PROP_PROXY_PORT, _proxyPort);
addFormNotice(_("Updating proxy port to {0}", _proxyPort));
}
}
_context.router().setConfigSetting(PROP_SHOULD_PROXY, "" + _updateThroughProxy);
_context.router().setConfigSetting(PROP_UPDATE_UNSIGNED, "" + _updateUnsigned);
changes.put(PROP_SHOULD_PROXY, "" + _updateThroughProxy);
changes.put(PROP_UPDATE_UNSIGNED, "" + _updateUnsigned);
String oldFreqStr = _context.getProperty(PROP_REFRESH_FREQUENCY, DEFAULT_REFRESH_FREQUENCY);
long oldFreq = DEFAULT_REFRESH_FREQ;
try { oldFreq = Long.parseLong(oldFreqStr); } catch (NumberFormatException nfe) {}
if (_refreshFrequency != oldFreq) {
_context.router().setConfigSetting(PROP_REFRESH_FREQUENCY, ""+_refreshFrequency);
changes.put(PROP_REFRESH_FREQUENCY, ""+_refreshFrequency);
addFormNotice(_("Updating refresh frequency to {0}",
_refreshFrequency <= 0 ? _("Never") : DataHelper.formatDuration2(_refreshFrequency)));
}
@@ -138,7 +154,7 @@ public class ConfigUpdateHandler extends FormHandler {
if ( (_updatePolicy != null) && (_updatePolicy.length() > 0) ) {
String oldPolicy = _context.router().getConfigSetting(PROP_UPDATE_POLICY);
if ( (oldPolicy == null) || (!_updatePolicy.equals(oldPolicy)) ) {
_context.router().setConfigSetting(PROP_UPDATE_POLICY, _updatePolicy);
changes.put(PROP_UPDATE_POLICY, _updatePolicy);
addFormNotice(_("Updating update policy to {0}", _updatePolicy));
}
}
@@ -147,7 +163,7 @@ public class ConfigUpdateHandler extends FormHandler {
_updateURL = _updateURL.replace("\r\n", ",").replace("\n", ",");
String oldURL = _context.router().getConfigSetting(PROP_UPDATE_URL);
if ( (oldURL == null) || (!_updateURL.equals(oldURL)) ) {
_context.router().setConfigSetting(PROP_UPDATE_URL, _updateURL);
changes.put(PROP_UPDATE_URL, _updateURL);
addFormNotice(_("Updating update URLs."));
}
}
@@ -158,7 +174,7 @@ public class ConfigUpdateHandler extends FormHandler {
oldKeys = oldKeys.replace("\r\n", ",");
if (!_trustedKeys.equals(oldKeys)) {
// note that keys are not validated here and no console error message will be generated
_context.router().setConfigSetting(PROP_TRUSTED_KEYS, _trustedKeys);
changes.put(PROP_TRUSTED_KEYS, _trustedKeys);
addFormNotice(_("Updating trusted keys."));
}
}
@@ -166,12 +182,12 @@ public class ConfigUpdateHandler extends FormHandler {
if ( (_zipURL != null) && (_zipURL.length() > 0) ) {
String oldURL = _context.router().getConfigSetting(PROP_ZIP_URL);
if ( (oldURL == null) || (!_zipURL.equals(oldURL)) ) {
_context.router().setConfigSetting(PROP_ZIP_URL, _zipURL);
changes.put(PROP_ZIP_URL, _zipURL);
addFormNotice(_("Updating unsigned update URL to {0}", _zipURL));
}
}
_context.router().saveConfig();
_context.router().saveConfig(changes, null);
}
public void setNewsURL(String url) { _newsURL = url; }

View File

@@ -3,6 +3,7 @@ package net.i2p.router.web;
import net.i2p.I2PAppContext;
import net.i2p.crypto.TrustedUpdate;
import net.i2p.data.DataHelper;
import net.i2p.util.PortMapper;
public class ConfigUpdateHelper extends HelperBase {
private boolean _dontInstall;
@@ -37,6 +38,7 @@ public class ConfigUpdateHelper extends HelperBase {
else
return ConfigUpdateHandler.DEFAULT_NEWS_URL;
}
public String getUpdateURL() {
String url = _context.getProperty(ConfigUpdateHandler.PROP_UPDATE_URL);
if (url != null)
@@ -44,11 +46,30 @@ public class ConfigUpdateHelper extends HelperBase {
else
return ConfigUpdateHandler.DEFAULT_UPDATE_URL;
}
public String getProxyHost() {
if (isInternal())
return _("internal") + "\" readonly=\"readonly";
return _context.getProperty(ConfigUpdateHandler.PROP_PROXY_HOST, ConfigUpdateHandler.DEFAULT_PROXY_HOST);
}
public String getProxyPort() {
return _context.getProperty(ConfigUpdateHandler.PROP_PROXY_PORT, ConfigUpdateHandler.DEFAULT_PROXY_PORT);
if (isInternal())
return _("internal") + "\" readonly=\"readonly";
return Integer.toString(ConfigUpdateHandler.proxyPort(_context));
}
/**
* This should almost always be true.
* @return true if settings are at defaults and proxy is registered
* @since 0.8.13
*/
private boolean isInternal() {
String host = _context.getProperty(ConfigUpdateHandler.PROP_PROXY_HOST);
String port = _context.getProperty(ConfigUpdateHandler.PROP_PROXY_PORT);
return (host == null || host.equals(ConfigUpdateHandler.DEFAULT_PROXY_HOST)) &&
(port == null || port.equals(ConfigUpdateHandler.DEFAULT_PROXY_PORT)) &&
_context.portMapper().getPort(PortMapper.SVC_HTTP_PROXY) == ConfigUpdateHandler.DEFAULT_PROXY_PORT_INT;
}
public String getUpdateThroughProxy() {

View File

@@ -9,19 +9,19 @@ class ContextHelper {
/** @throws IllegalStateException if no context available */
public static RouterContext getContext(String contextId) {
List contexts = RouterContext.listContexts();
List<RouterContext> contexts = RouterContext.listContexts();
if ( (contexts == null) || (contexts.isEmpty()) )
throw new IllegalStateException("No contexts. This is usually because the router is either starting up or shutting down.");
if ( (contextId == null) || (contextId.trim().length() <= 0) )
return (RouterContext)contexts.get(0);
return contexts.get(0);
for (int i = 0; i < contexts.size(); i++) {
RouterContext context = (RouterContext)contexts.get(i);
RouterContext context = contexts.get(i);
Hash hash = context.routerHash();
if (hash == null) continue;
if (hash.toBase64().startsWith(contextId))
return context;
}
// not found, so just give them the first we can find
return (RouterContext)contexts.get(0);
return contexts.get(0);
}
}

View File

@@ -0,0 +1,183 @@
package net.i2p.router.web;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.IOException;
import java.lang.ClassLoader;
import java.net.URL;
import java.net.URLClassLoader;
import java.security.MessageDigest;
import java.util.Arrays;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.jar.Attributes;
import java.util.jar.Manifest;
import net.i2p.crypto.SHA256Generator;
import net.i2p.data.DataHelper;
/**
* Dump info on jars and wars
*
* @since 0.8.13
*/
public class FileDumpHelper extends HelperBase {
public String getFileSummary() {
StringBuilder buf = new StringBuilder(16*1024);
buf.append("<table><tr><th>File</th><th>Size</th><th>Date</th><th>SHA 256</th><th>Revision</th>" +
"<th>JDK</th><th>Built</th><th>Mods</th></tr>");
// jars added in wrapper.config
URLClassLoader urlClassLoader = (URLClassLoader) ClassLoader.getSystemClassLoader();
URL[] urls = urlClassLoader.getURLs();
List<File> flist = new ArrayList();
for (int i = 0; i < urls.length; i++) {
String p = urls[i].toString();
if (p.startsWith("file:") && p.endsWith(".jar")) {
p = p.substring(5);
if (!(p.startsWith(_context.getBaseDir().getAbsolutePath()) ||
p.startsWith(_context.getConfigDir().getAbsolutePath()))) {
flist.add(new File(p));
}
}
}
Collections.sort(flist);
for (File f : flist) {
dumpFile(buf, f);
}
// our jars
File dir = new File(_context.getBaseDir(), "lib");
dumpDir(buf, dir, ".jar");
// our wars
dir = new File(_context.getBaseDir(), "webapps");
dumpDir(buf, dir, ".war");
// plugins
File pluginDir = new File(_context.getConfigDir(), PluginUpdateHandler.PLUGIN_DIR);
File[] files = pluginDir.listFiles();
if (files != null) {
Arrays.sort(files);
for (int i = 0; i < files.length; i++) {
dir = new File(files[i], "lib");
dumpDir(buf, dir, ".jar");
dir = new File(files[i], "console/webapps");
dumpDir(buf, dir, ".war");
}
}
buf.append("</table>");
return buf.toString();
}
private static void dumpDir(StringBuilder buf, File dir, String suffix) {
File[] files = dir.listFiles();
if (files == null)
return;
Arrays.sort(files);
for (int i = 0; i < files.length; i++) {
if (files[i].getName().endsWith(suffix))
dumpFile(buf, files[i]);
}
}
private static void dumpFile(StringBuilder buf, File f) {
buf.append("<tr><td><b>").append(f.getAbsolutePath()).append("</b></td>" +
"<td align=\"right\">").append(f.length()).append("</td>" +
"<td>");
long mod = f.lastModified();
if (mod > 0)
buf.append((new Date(mod)).toString());
else
buf.append("<font color=\"red\">Not found</font>");
buf.append("</td><td>");
byte[] hash = sha256(f);
if (hash != null) {
byte[] hh = new byte[16];
System.arraycopy(hash, 0, hh, 0, 16);
buf.append("<tt>");
String p1 = DataHelper.toHexString(hh);
for (int i = p1.length(); i < 32; i++) {
buf.append('0');
}
buf.append(p1).append("</tt><br>");
System.arraycopy(hash, 16, hh, 0, 16);
buf.append("<tt>").append(DataHelper.toHexString(hh)).append("</tt>");
}
Attributes att = attributes(f);
if (att == null)
att = new Attributes();
buf.append("<td align=\"center\">");
String iv = getAtt(att, "Implementation-Version");
if (iv != null)
buf.append("<b>").append(iv).append("</b>");
String s = getAtt(att, "Base-Revision");
if (s != null && s.length() > 20) {
if (iv != null)
buf.append("<br>");
buf.append("<a href=\"http://stats.i2p/cgi-bin/viewmtn/revision/info/").append(s)
.append("\">" +
"<tt>").append(s.substring(0, 20)).append("</tt>" +
"<br>" +
"<tt>").append(s.substring(20)).append("</tt></a>");
}
buf.append("</td><td>");
s = getAtt(att, "Created-By");
if (s != null)
buf.append(s);
buf.append("</td><td>");
s = getAtt(att, "Build-Date");
if (s != null)
buf.append(s);
buf.append("</td><td><font color=\"red\">");
s = getAtt(att, "Workspace-Changes");
if (s != null)
buf.append(s.replace(",", "<br>"));
buf.append("</font></td>");
}
private static byte[] sha256(File f) {
InputStream in = null;
try {
in = new FileInputStream(f);
MessageDigest md = SHA256Generator.getDigestInstance();
byte[] b = new byte[4096];
int cnt = 0;
while ((cnt = in.read(b)) >= 0) {
md.update(b, 0, cnt);
}
return md.digest();
} catch (IOException ioe) {
//ioe.printStackTrace();
return null;
} finally {
if (in != null) try { in.close(); } catch (IOException e) {}
}
}
private static Attributes attributes(File f) {
InputStream in = null;
try {
in = (new URL("jar:file:" + f.getAbsolutePath() + "!/META-INF/MANIFEST.MF")).openStream();
Manifest man = new Manifest(in);
return man.getMainAttributes();
} catch (IOException ioe) {
//ioe.printStackTrace();
return null;
} finally {
if (in != null) try { in.close(); } catch (IOException e) {}
}
}
private static String getAtt(Attributes atts, String s) {
String rv = atts.getValue(s);
if (rv != null)
rv = DataHelper.stripHTML(rv);
return rv;
}
}

View File

@@ -3,8 +3,10 @@ package net.i2p.router.web;
import java.io.IOException;
import java.io.Writer;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.TreeSet;
import net.i2p.data.DataHelper;
@@ -195,7 +197,7 @@ public class GraphHelper extends FormHandler {
if (persistent)
_out.write(" checked=\"true\"");
_out.write(">" +
"<hr><div class=\"formaction\"><input type=\"submit\" value=\"" + _("Save settings and redraw graphs") + "\"></div></form>");
"<hr><div class=\"formaction\"><input type=\"submit\" class=\"acceot\" value=\"" + _("Save settings and redraw graphs") + "\"></div></form>");
} catch (IOException ioe) {
ioe.printStackTrace();
}
@@ -216,8 +218,7 @@ public class GraphHelper extends FormHandler {
System.getProperty("java.runtime.version") + ')');
if (_context.getProperty(PROP_REFRESH, 0) >= 0) {
// force no refresh, save silently
_context.router().setConfigSetting(PROP_REFRESH, "-1");
_context.router().saveConfig();
_context.router().saveConfig(PROP_REFRESH, "-1");
}
}
return super.getAllMessages();
@@ -243,13 +244,14 @@ public class GraphHelper extends FormHandler {
_refreshDelaySeconds != _context.getProperty(PROP_REFRESH, DEFAULT_REFRESH) ||
_showEvents != _context.getBooleanProperty(PROP_EVENTS) ||
_persistent != _context.getBooleanPropertyDefaultTrue(SummaryListener.PROP_PERSISTENT)) {
_context.router().setConfigSetting(PROP_X, "" + _width);
_context.router().setConfigSetting(PROP_Y, "" + _height);
_context.router().setConfigSetting(PROP_PERIODS, "" + _periodCount);
_context.router().setConfigSetting(PROP_REFRESH, "" + _refreshDelaySeconds);
_context.router().setConfigSetting(PROP_EVENTS, "" + _showEvents);
_context.router().setConfigSetting(SummaryListener.PROP_PERSISTENT, "" + _persistent);
_context.router().saveConfig();
Map<String, String> changes = new HashMap();
changes.put(PROP_X, "" + _width);
changes.put(PROP_Y, "" + _height);
changes.put(PROP_PERIODS, "" + _periodCount);
changes.put(PROP_REFRESH, "" + _refreshDelaySeconds);
changes.put(PROP_EVENTS, "" + _showEvents);
changes.put(SummaryListener.PROP_PERSISTENT, "" + _persistent);
_context.router().saveConfig(changes, null);
addFormNotice(_("Graph settings saved"));
}
}

View File

@@ -14,14 +14,14 @@ import org.mortbay.jetty.servlet.WebApplicationHandler;
* Convert foo.jsp to foo_xx.jsp for language xx.
* This is appropriate for jsps with large amounts of text.
*
* Also, as of 0.8.2, rewrite "/" and "/index.html" to "/index.jsp",x
* Also, as of 0.8.2, rewrite "/" and "/index.html" to "/index.jsp",
* and "/foo" to "/foo.jsp".
*
* @author zzz
*/
public class LocaleWebAppHandler extends WebApplicationHandler
{
private I2PAppContext _context;
private final I2PAppContext _context;
public LocaleWebAppHandler(I2PAppContext ctx) {
super();
@@ -32,7 +32,7 @@ public class LocaleWebAppHandler extends WebApplicationHandler
* Handle foo.jsp by converting to foo_xx.jsp
* for language xx, where xx is the language for the default locale,
* or as specified in the routerconsole.lang property.
* Unless language==="en".
* Unless language == "en".
*/
@Override
public void handle(String pathInContext,

View File

@@ -4,10 +4,32 @@ import java.io.File;
import java.util.List;
import net.i2p.util.FileUtil;
import net.i2p.util.VersionComparator;
import org.mortbay.http.Version;
import org.tanukisoftware.wrapper.WrapperManager;
public class LogsHelper extends HelperBase {
public LogsHelper() {}
private static final String LOCATION_AVAILABLE = "3.3.7";
/** @since 0.8.12 */
public String getJettyVersion() {
return jettyVersion();
}
/** @since 0.8.13 */
static String jettyVersion() {
try {
String rv = Version.getImplVersion();
if (rv.startsWith("Jetty/"))
rv = rv.substring(6);
return rv;
} catch (Throwable t) {
return "unknown";
}
}
public String getLogs() {
String str = formatMessages(_context.logManager().getBuffer().getMostRecentMessages());
return _("File location") + ": <b><code>" + _context.logManager().currentFile() + "</code></b><br><br>" + str;
@@ -18,16 +40,26 @@ public class LogsHelper extends HelperBase {
}
public String getServiceLogs() {
// RouterLaunch puts the location here if no wrapper
String path = System.getProperty("wrapper.logfile");
File f;
if (path != null) {
f = new File(path);
} else {
// look in new and old places
f = new File(System.getProperty("java.io.tmpdir"), "wrapper.log");
if (!f.exists())
f = new File(_context.getBaseDir(), "wrapper.log");
File f = null;
if (_context.hasWrapper()) {
String wv = System.getProperty("wrapper.version");
if (wv != null && (new VersionComparator()).compare(wv, LOCATION_AVAILABLE) >= 0) {
try {
f = WrapperManager.getWrapperLogFile();
} catch (Throwable t) {}
}
}
if (f == null || !f.exists()) {
// RouterLaunch puts the location here if no wrapper
String path = System.getProperty("wrapper.logfile");
if (path != null) {
f = new File(path);
} else {
// look in new and old places
f = new File(System.getProperty("java.io.tmpdir"), "wrapper.log");
if (!f.exists())
f = new File(_context.getBaseDir(), "wrapper.log");
}
}
String str = FileUtil.readTextFile(f.getAbsolutePath(), 250, false);
if (str == null)

View File

@@ -39,7 +39,7 @@ import net.i2p.util.OrderedProperties;
import net.i2p.util.VersionComparator;
public class NetDbRenderer {
private RouterContext _context;
private final RouterContext _context;
public NetDbRenderer (RouterContext ctx) {
_context = ctx;
@@ -119,12 +119,19 @@ public class NetDbRenderer {
fmt = null;
}
leases.addAll(_context.netDb().getLeases());
int medianCount = leases.size() / 2;
int medianCount = 0;
BigInteger median = null;
int c = 0;
if (debug) {
// Find the center of the RAP leasesets
for (LeaseSet ls : leases) {
if (ls.getReceivedAsPublished())
medianCount++;
}
medianCount /= 2;
}
long now = _context.clock().now();
for (Iterator iter = leases.iterator(); iter.hasNext(); ) {
LeaseSet ls = (LeaseSet)iter.next();
for (LeaseSet ls : leases) {
Destination dest = ls.getDestination();
Hash key = dest.calculateHash();
buf.append("<b>").append(_("LeaseSet")).append(": ").append(key.toBase64());
@@ -153,13 +160,15 @@ public class NetDbRenderer {
else
buf.append(_("Expired {0} ago", DataHelper.formatDuration2(0-exp))).append("<br>\n");
if (debug) {
buf.append("RAP? " + ls.getReceivedAsPublished() + ' ');
buf.append("RAR? " + ls.getReceivedAsReply() + ' ');
buf.append("RAP? " + ls.getReceivedAsPublished());
buf.append(" RAR? " + ls.getReceivedAsReply());
BigInteger dist = HashDistance.getDistance(ourRKey, ls.getRoutingKey());
if (c++ == medianCount)
median = dist;
buf.append("Dist: <b>" + fmt.format(biLog2(dist)) + "</b> ");
buf.append("RKey: " + ls.getRoutingKey().toBase64() + ' ');
if (ls.getReceivedAsPublished()) {
if (c++ == medianCount)
median = dist;
}
buf.append(" Dist: <b>").append(fmt.format(biLog2(dist))).append("</b>");
buf.append(" RKey: ").append(ls.getRoutingKey().toBase64());
buf.append("<br>");
}
for (int i = 0; i < ls.getLeaseCount(); i++) {
@@ -174,9 +183,9 @@ public class NetDbRenderer {
if (debug) {
buf.append("<p><b>Total Leasesets: " + leases.size());
buf.append("</b></p><p><b>Published (RAP) Leasesets: " + _context.netDb().getKnownLeaseSets());
buf.append("</b></p><p><b>Mod Data: " + HexDump.dump(_context.routingKeyGenerator().getModData()));
//buf.append("</b></p><p><b>Mod Data: " + HexDump.dump(_context.routingKeyGenerator().getModData()));
buf.append("</b></p><p><b>Network data (only valid if floodfill):");
buf.append("</b></p><p><b>Center of Key Space (router hash): " + ourRKey.toBase64());
//buf.append("</b></p><p><b>Center of Key Space (router hash): " + ourRKey.toBase64());
if (median != null) {
double log2 = biLog2(median);
buf.append("</b></p><p><b>Median distance (bits): " + fmt.format(log2));
@@ -305,7 +314,7 @@ public class NetDbRenderer {
buf.append("<tr><th align=\"left\">" + _("Country") + "</th><th>" + _("Count") + "</th></tr>\n");
for (String country : countryList) {
int num = countries.count(country);
buf.append("<tr><td><img height=\"11\" width=\"16\" alt=\"").append(country.toUpperCase()).append("\"");
buf.append("<tr><td><img height=\"11\" width=\"16\" alt=\"").append(country.toUpperCase(Locale.US)).append("\"");
buf.append(" src=\"/flags.jsp?c=").append(country).append("\"> ");
buf.append(_(_context.commSystem().getCountryName(country)));
buf.append("</td><td align=\"center\">").append(num).append("</td></tr>\n");
@@ -365,7 +374,7 @@ public class NetDbRenderer {
buf.append("<b>" + _("Address(es)") + ":</b> ");
String country = _context.commSystem().getCountry(info.getIdentity().getHash());
if(country != null) {
buf.append("<img height=\"11\" width=\"16\" alt=\"").append(country.toUpperCase()).append('\"');
buf.append("<img height=\"11\" width=\"16\" alt=\"").append(country.toUpperCase(Locale.US)).append('\"');
buf.append(" title=\"").append(_(_context.commSystem().getCountryName(country))).append('\"');
buf.append(" src=\"/flags.jsp?c=").append(country).append("\"> ");
}
@@ -376,9 +385,8 @@ public class NetDbRenderer {
int cost = addr.getCost();
if (!((style.equals("SSU") && cost == 5) || (style.equals("NTCP") && cost == 10)))
buf.append('[').append(_("cost")).append('=').append("" + cost).append("] ");
Properties p = new OrderedProperties();
p.putAll(addr.getOptions());
for (Map.Entry e : p.entrySet()) {
Map p = addr.getOptionsMap();
for (Map.Entry e : (Set<Map.Entry>) p.entrySet()) {
String name = (String) e.getKey();
String val = (String) e.getValue();
buf.append('[').append(_(DataHelper.stripHTML(name))).append('=').append(DataHelper.stripHTML(val)).append("] ");
@@ -387,9 +395,10 @@ public class NetDbRenderer {
buf.append("</td></tr>\n");
if (full) {
buf.append("<tr><td>" + _("Stats") + ": <br><code>");
for (Iterator iter = info.getOptions().keySet().iterator(); iter.hasNext(); ) {
String key = (String)iter.next();
String val = info.getOption(key);
Map p = info.getOptionsMap();
for (Map.Entry e : (Set<Map.Entry>) p.entrySet()) {
String key = (String) e.getKey();
String val = (String) e.getValue();
buf.append(DataHelper.stripHTML(key)).append(" = ").append(DataHelper.stripHTML(val)).append("<br>\n");
}
buf.append("</code></td></tr>\n");
@@ -412,7 +421,7 @@ public class NetDbRenderer {
if (style.equals("NTCP")) {
rv |= NTCP;
} else if (style.equals("SSU")) {
if (addr.getOptions().getProperty("iport0") != null)
if (addr.getOption("iport0") != null)
rv |= SSUI;
else
rv |= SSU;

View File

@@ -24,8 +24,8 @@ import net.i2p.util.Log;
* track of whether that has an announcement for a new version.
*/
public class NewsFetcher implements Runnable, EepGet.StatusListener {
private I2PAppContext _context;
private Log _log;
private final RouterContext _context;
private final Log _log;
private boolean _updateAvailable;
private boolean _unsignedUpdateAvailable;
private long _lastFetch;
@@ -34,13 +34,13 @@ public class NewsFetcher implements Runnable, EepGet.StatusListener {
private String _unsignedUpdateVersion;
private String _lastModified;
private boolean _invalidated;
private File _newsFile;
private File _tempFile;
private final File _newsFile;
private final File _tempFile;
private static NewsFetcher _instance;
private volatile boolean _isRunning;
//public static final synchronized NewsFetcher getInstance() { return _instance; }
public static final synchronized NewsFetcher getInstance(I2PAppContext ctx) {
public static final synchronized NewsFetcher getInstance(RouterContext ctx) {
if (_instance != null)
return _instance;
_instance = new NewsFetcher(ctx);
@@ -52,8 +52,10 @@ public class NewsFetcher implements Runnable, EepGet.StatusListener {
/** @since 0.7.14 not configurable */
private static final String BACKUP_NEWS_URL = "http://www.i2p2.i2p/_static/news/news.xml";
private static final String PROP_LAST_CHECKED = "router.newsLastChecked";
/** @since 0.8.12 */
private static final String PROP_LAST_HIDDEN = "routerconsole.newsLastHidden";
private NewsFetcher(I2PAppContext ctx) {
private NewsFetcher(RouterContext ctx) {
_context = ctx;
_log = ctx.logManager().getLog(NewsFetcher.class);
_instance = this;
@@ -94,9 +96,39 @@ public class NewsFetcher implements Runnable, EepGet.StatusListener {
public boolean unsignedUpdateAvailable() { return _unsignedUpdateAvailable; }
public String unsignedUpdateVersion() { return _unsignedUpdateVersion; }
/**
* Is the news newer than the last time it was hidden?
* @since 0.8.12
*/
public boolean shouldShowNews() {
if (_lastUpdated <= 0)
return true;
String h = _context.getProperty(PROP_LAST_HIDDEN);
if (h == null)
return true;
long last = 0;
try {
last = Long.parseLong(h);
} catch (NumberFormatException nfe) {}
return _lastUpdated > last;
}
/**
* Save config with the timestamp of the current news to hide, or 0 to show
* @since 0.8.12
*/
public void showNews(boolean yes) {
long stamp = yes ? 0 : _lastUpdated;
_context.router().saveConfig(PROP_LAST_HIDDEN, Long.toString(stamp));
}
/**
* @return HTML
*/
public String status() {
StringBuilder buf = new StringBuilder(128);
long now = _context.clock().now();
buf.append("<i>");
if (_lastUpdated > 0) {
buf.append(Messages.getString("News last updated {0} ago.",
DataHelper.formatDuration2(now - _lastUpdated),
@@ -108,6 +140,18 @@ public class NewsFetcher implements Runnable, EepGet.StatusListener {
DataHelper.formatDuration2(now - _lastFetch),
_context));
}
buf.append("</i>");
String consoleNonce = System.getProperty("router.consoleNonce");
if (_lastUpdated > 0 && consoleNonce != null) {
if (shouldShowNews()) {
buf.append(" <a href=\"/?news=0&amp;consoleNonce=").append(consoleNonce).append("\">")
.append(Messages.getString("Hide news", _context));
} else {
buf.append(" <a href=\"/?news=1&amp;consoleNonce=").append(consoleNonce).append("\">")
.append(Messages.getString("Show news", _context));
}
buf.append("</a>");
}
return buf.toString();
}
@@ -180,7 +224,7 @@ public class NewsFetcher implements Runnable, EepGet.StatusListener {
String newsURL = ConfigUpdateHelper.getNewsURL(_context);
boolean shouldProxy = Boolean.valueOf(_context.getProperty(ConfigUpdateHandler.PROP_SHOULD_PROXY, ConfigUpdateHandler.DEFAULT_SHOULD_PROXY)).booleanValue();
String proxyHost = _context.getProperty(ConfigUpdateHandler.PROP_PROXY_HOST, ConfigUpdateHandler.DEFAULT_PROXY_HOST);
int proxyPort = _context.getProperty(ConfigUpdateHandler.PROP_PROXY_PORT, ConfigUpdateHandler.DEFAULT_PROXY_PORT_INT);
int proxyPort = ConfigUpdateHandler.proxyPort(_context);
if (_tempFile.exists())
_tempFile.delete();
@@ -232,16 +276,14 @@ public class NewsFetcher implements Runnable, EepGet.StatusListener {
if (get.fetch()) {
String lastmod = get.getLastModified();
if (lastmod != null) {
if (!(_context.isRouterContext())) return;
long modtime = RFC822Date.parse822Date(lastmod);
if (modtime <= 0) return;
String lastUpdate = _context.getProperty(UpdateHandler.PROP_LAST_UPDATE_TIME);
if (lastUpdate == null) {
// we don't know what version you have, so stamp it with the current time,
// and we'll look for something newer next time around.
((RouterContext)_context).router().setConfigSetting(UpdateHandler.PROP_LAST_UPDATE_TIME,
"" + _context.clock().now());
((RouterContext)_context).router().saveConfig();
_context.router().saveConfig(UpdateHandler.PROP_LAST_UPDATE_TIME,
Long.toString(_context.clock().now()));
return;
}
long ms = 0;
@@ -267,7 +309,7 @@ public class NewsFetcher implements Runnable, EepGet.StatusListener {
String url = _context.getProperty(ConfigUpdateHandler.PROP_ZIP_URL);
if (url == null || url.length() <= 0)
return;
UpdateHandler handler = new UnsignedUpdateHandler((RouterContext)_context, url,
UpdateHandler handler = new UnsignedUpdateHandler(_context, url,
_unsignedUpdateVersion);
handler.update();
}
@@ -329,18 +371,8 @@ public class NewsFetcher implements Runnable, EepGet.StatusListener {
if (shouldInstall()) {
if (_log.shouldLog(Log.DEBUG))
_log.debug("Policy requests update, so we update");
UpdateHandler handler = null;
if (_context.isRouterContext()) {
handler = new UpdateHandler((RouterContext)_context);
} else {
List contexts = RouterContext.listContexts();
if (!contexts.isEmpty())
handler = new UpdateHandler((RouterContext)contexts.get(0));
else
_log.log(Log.CRIT, "No router context to update with?");
}
if (handler != null)
handler.update();
UpdateHandler handler = new UpdateHandler(_context);
handler.update();
} else {
if (_log.shouldLog(Log.DEBUG))
_log.debug("Policy requests manual update, so we do nothing");
@@ -373,10 +405,7 @@ public class NewsFetcher implements Runnable, EepGet.StatusListener {
_log.warn("Transfer complete, but no file? - probably 304 Not Modified");
}
_lastFetch = now;
if (_context.isRouterContext()) {
((RouterContext)_context).router().setConfigSetting(PROP_LAST_CHECKED, "" + now);
((RouterContext)_context).router().saveConfig();
}
_context.router().saveConfig(PROP_LAST_CHECKED, Long.toString(now));
}
public void transferFailed(String url, long bytesTransferred, long bytesRemaining, int currentAttempt) {

View File

@@ -17,4 +17,9 @@ public class NewsHelper extends ContentHelper {
_page = (new File(_context.getBaseDir(), "docs/initialNews/initialNews.xml")).getAbsolutePath();
return super.getContent();
}
/** @since 0.8.12 */
public boolean shouldShowNews() {
return NewsFetcher.getInstance(_context).shouldShowNews();
}
}

View File

@@ -17,16 +17,20 @@ import java.util.Properties;
import java.util.StringTokenizer;
import java.util.concurrent.ConcurrentHashMap;
import net.i2p.CoreVersion;
import net.i2p.I2PAppContext;
import net.i2p.data.DataHelper;
import net.i2p.router.Job;
import net.i2p.router.RouterContext;
import net.i2p.router.RouterVersion;
import net.i2p.router.startup.ClientAppConfig;
import net.i2p.router.startup.LoadClientAppsJob;
import net.i2p.util.ConcurrentHashSet;
import net.i2p.util.FileUtil;
import net.i2p.util.I2PAppThread;
import net.i2p.util.Log;
import net.i2p.util.Translate;
import net.i2p.util.VersionComparator;
import org.mortbay.jetty.Server;
@@ -61,9 +65,103 @@ public class PluginStarter implements Runnable {
}
public void run() {
if (_context.getBooleanPropertyDefaultTrue("plugins.autoUpdate") &&
(!Boolean.valueOf(System.getProperty(UpdateHandler.PROP_UPDATE_IN_PROGRESS)).booleanValue()) &&
(!RouterVersion.VERSION.equals(_context.getProperty("router.previousVersion"))))
updateAll(_context, true);
startPlugins(_context);
}
/**
* threaded
* @since 0.8.13
*/
static void updateAll(RouterContext ctx) {
Thread t = new I2PAppThread(new PluginUpdater(ctx), "PluginUpdater", true);
t.start();
}
/**
* thread
* @since 0.8.13
*/
private static class PluginUpdater implements Runnable {
private final RouterContext _ctx;
public PluginUpdater(RouterContext ctx) {
_ctx = ctx;
}
public void run() {
updateAll(_ctx, false);
}
}
/**
* inline
* @since 0.8.13
*/
private static void updateAll(RouterContext ctx, boolean delay) {
List<String> plugins = getPlugins();
Map<String, String> toUpdate = new HashMap();
for (String appName : plugins) {
Properties props = pluginProperties(ctx, appName);
String url = props.getProperty("updateURL");
if (url != null)
toUpdate.put(appName, url);
}
if (toUpdate.isEmpty())
return;
PluginUpdateChecker puc = PluginUpdateChecker.getInstance(ctx);
if (puc.isRunning())
return;
if (delay) {
// wait for proxy
System.setProperty(UpdateHandler.PROP_UPDATE_IN_PROGRESS, "true");
puc.setAppStatus(Messages.getString("Checking for plugin updates", ctx));
try {
Thread.sleep(3*60*1000);
} catch (InterruptedException ie) {}
System.setProperty(UpdateHandler.PROP_UPDATE_IN_PROGRESS, "false");
}
Log log = ctx.logManager().getLog(PluginStarter.class);
int updated = 0;
for (Map.Entry<String, String> entry : toUpdate.entrySet()) {
String appName = entry.getKey();
if (log.shouldLog(Log.WARN))
log.warn("Checking for update plugin: " + appName);
puc.update(appName);
do {
try {
Thread.sleep(5*1000);
} catch (InterruptedException ie) {}
} while (puc.isRunning());
if (!puc.isNewerAvailable()) {
if (log.shouldLog(Log.WARN))
log.warn("No update available for plugin: " + appName);
continue;
}
PluginUpdateHandler puh = PluginUpdateHandler.getInstance(ctx);
String url = entry.getValue();
if (log.shouldLog(Log.WARN))
log.warn("Updating plugin: " + appName);
puh.update(url);
do {
try {
Thread.sleep(5*1000);
} catch (InterruptedException ie) {}
} while (puh.isRunning());
if (puh.wasUpdateSuccessful())
updated++;
}
if (updated > 0)
puc.setDoneStatus(ngettext("1 plugin updated", "{0} plugins updated", updated, ctx));
else
puc.setDoneStatus(Messages.getString("Plugin update check complete", ctx));
}
/** this shouldn't throw anything */
static void startPlugins(RouterContext ctx) {
Log log = ctx.logManager().getLog(PluginStarter.class);
@@ -73,6 +171,9 @@ public class PluginStarter implements Runnable {
if (name.startsWith(PREFIX) && name.endsWith(ENABLED)) {
if (Boolean.valueOf(props.getProperty(name)).booleanValue()) {
String app = name.substring(PREFIX.length(), name.lastIndexOf(ENABLED));
// plugins could have been started after update
if (isPluginRunning(app, ctx))
continue;
try {
if (!startPlugin(ctx, app))
log.error("Failed to start plugin: " + app);
@@ -93,8 +194,48 @@ public class PluginStarter implements Runnable {
File pluginDir = new File(ctx.getConfigDir(), PluginUpdateHandler.PLUGIN_DIR + '/' + appName);
if ((!pluginDir.exists()) || (!pluginDir.isDirectory())) {
log.error("Cannot start nonexistent plugin: " + appName);
disablePlugin(appName);
return false;
}
Properties props = pluginProperties(ctx, appName);
String minVersion = ConfigClientsHelper.stripHTML(props, "min-i2p-version");
if (minVersion != null &&
(new VersionComparator()).compare(CoreVersion.VERSION, minVersion) < 0) {
String foo = "Plugin " + appName + " requires I2P version " + minVersion + " or higher";
log.error(foo);
disablePlugin(appName);
throw new Exception(foo);
}
minVersion = ConfigClientsHelper.stripHTML(props, "min-java-version");
if (minVersion != null &&
(new VersionComparator()).compare(System.getProperty("java.version"), minVersion) < 0) {
String foo = "Plugin " + appName + " requires Java version " + minVersion + " or higher";
log.error(foo);
disablePlugin(appName);
throw new Exception(foo);
}
String jVersion = LogsHelper.jettyVersion();
minVersion = ConfigClientsHelper.stripHTML(props, "min-jetty-version");
if (minVersion != null &&
(new VersionComparator()).compare(minVersion, jVersion) > 0) {
String foo = "Plugin " + appName + " requires Jetty version " + minVersion + " or higher";
log.error(foo);
disablePlugin(appName);
throw new Exception(foo);
}
String maxVersion = ConfigClientsHelper.stripHTML(props, "max-jetty-version");
if (maxVersion != null &&
(new VersionComparator()).compare(maxVersion, jVersion) < 0) {
String foo = "Plugin " + appName + " requires Jetty version " + maxVersion + " or lower";
log.error(foo);
disablePlugin(appName);
throw new Exception(foo);
}
if (log.shouldLog(Log.INFO))
log.info("Starting plugin: " + appName);
@@ -113,8 +254,8 @@ public class PluginStarter implements Runnable {
// load and start things in clients.config
File clientConfig = new File(pluginDir, "clients.config");
if (clientConfig.exists()) {
Properties props = new Properties();
DataHelper.loadProps(props, clientConfig);
Properties cprops = new Properties();
DataHelper.loadProps(cprops, clientConfig);
List<ClientAppConfig> clients = ClientAppConfig.getClientApps(clientConfig);
runClientApps(ctx, pluginDir, clients, "start");
}
@@ -123,7 +264,7 @@ public class PluginStarter implements Runnable {
Server server = WebAppStarter.getConsoleServer();
if (server != null) {
File consoleDir = new File(pluginDir, "console");
Properties props = RouterConsoleRunner.webAppProperties(consoleDir.getAbsolutePath());
Properties wprops = RouterConsoleRunner.webAppProperties(consoleDir.getAbsolutePath());
File webappDir = new File(consoleDir, "webapps");
String fileNames[] = webappDir.list(RouterConsoleRunner.WarFilenameFilter.instance());
if (fileNames != null) {
@@ -138,7 +279,7 @@ public class PluginStarter implements Runnable {
log.error("Skipping duplicate webapp " + warName + " in plugin " + appName);
continue;
}
String enabled = props.getProperty(RouterConsoleRunner.PREFIX + warName + ENABLED);
String enabled = wprops.getProperty(RouterConsoleRunner.PREFIX + warName + ENABLED);
if (! "false".equals(enabled)) {
if (log.shouldLog(Log.INFO))
log.info("Starting webapp: " + warName);
@@ -181,7 +322,6 @@ public class PluginStarter implements Runnable {
}
// add summary bar link
Properties props = pluginProperties(ctx, appName);
String name = ConfigClientsHelper.stripHTML(props, "consoleLinkName_" + Messages.getLanguage(ctx));
if (name == null)
name = ConfigClientsHelper.stripHTML(props, "consoleLinkName");
@@ -283,22 +423,24 @@ public class PluginStarter implements Runnable {
File[] tfiles = dir.listFiles();
if (tfiles != null) {
String current = ctx.getProperty(CSSHelper.PROP_THEME_NAME);
Map<String, String> changes = new HashMap();
List<String> removes = new ArrayList();
for (int i = 0; i < tfiles.length; i++) {
String name = tfiles[i].getName();
if (tfiles[i].isDirectory() && (!Arrays.asList(STANDARD_THEMES).contains(tfiles[i]))) {
ctx.router().removeConfigSetting(ConfigUIHelper.PROP_THEME_PFX + name);
removes.add(ConfigUIHelper.PROP_THEME_PFX + name);
if (name.equals(current))
ctx.router().setConfigSetting(CSSHelper.PROP_THEME_NAME, CSSHelper.DEFAULT_THEME);
changes.put(CSSHelper.PROP_THEME_NAME, CSSHelper.DEFAULT_THEME);
}
}
ctx.router().saveConfig();
ctx.router().saveConfig(changes, removes);
}
FileUtil.rmdir(pluginDir, false);
Properties props = pluginProperties();
for (Iterator iter = props.keySet().iterator(); iter.hasNext(); ) {
String name = (String)iter.next();
if (name.startsWith(PREFIX + appName))
if (name.startsWith(PREFIX + appName + '.'))
iter.remove();
}
storePluginProperties(props);
@@ -337,6 +479,32 @@ public class PluginStarter implements Runnable {
return rv;
}
/**
* Is the plugin enabled in plugins.config?
* Default true
*
* @since 0.8.13
*/
public static boolean isPluginEnabled(String appName) {
Properties props = pluginProperties();
String prop = PREFIX + appName + ENABLED;
return Boolean.valueOf(props.getProperty(prop, "true")).booleanValue();
}
/**
* Disable in plugins.config
*
* @since 0.8.13
*/
public static void disablePlugin(String appName) {
Properties props = pluginProperties();
String prop = PREFIX + appName + ENABLED;
if (Boolean.valueOf(props.getProperty(prop, "true")).booleanValue()) {
props.setProperty(prop, "false");
storePluginProperties(props);
}
}
/**
* all installed plugins whether enabled or not
*/
@@ -603,4 +771,9 @@ public class PluginStarter implements Runnable {
method.setAccessible(true);
method.invoke(urlClassLoader, new Object[]{u});
}
/** translate a string */
private static String ngettext(String s, String p, int n, I2PAppContext ctx) {
return Messages.getString(n, s, p, ctx);
}
}

View File

@@ -4,7 +4,7 @@ import net.i2p.router.RouterContext;
import net.i2p.util.Log;
/**
* Stop all plugins that are installed
* Stop all plugins that are installed and running
*
* @since 0.7.13
* @author zzz
@@ -21,19 +21,20 @@ public class PluginStopper extends PluginStarter {
}
/**
* Stop all plugins
* (whether or not they were ever started)
* Stop all running plugins
*
* this shouldn't throw anything
*/
static void stopPlugins(RouterContext ctx) {
private static void stopPlugins(RouterContext ctx) {
Log log = ctx.logManager().getLog(PluginStopper.class);
for (String app : getPlugins()) {
try {
stopPlugin(ctx, app);
} catch (Throwable e) {
if (log.shouldLog(Log.WARN))
log.warn("Failed to stop plugin: " + app, e);
if (isPluginRunning(app, ctx)) {
try {
stopPlugin(ctx, app);
} catch (Throwable e) {
if (log.shouldLog(Log.WARN))
log.warn("Failed to stop plugin: " + app, e);
}
}
}
}

View File

@@ -36,6 +36,7 @@ public class PluginUpdateChecker extends UpdateHandler {
private String _appName;
private String _oldVersion;
private String _xpi2pURL;
private volatile boolean _isNewerAvailable;
private static PluginUpdateChecker _instance;
public static final synchronized PluginUpdateChecker getInstance(RouterContext ctx) {
@@ -49,12 +50,19 @@ public class PluginUpdateChecker extends UpdateHandler {
super(ctx);
}
/** check all plugins */
/**
* check all plugins
* @deprecated not finished
*/
public void update() {
Thread t = new I2PAppThread(new AllCheckerRunner(), "AllAppChecker", true);
t.start();
}
/**
* check all plugins
* @deprecated not finished
*/
public class AllCheckerRunner implements Runnable {
public void run() {
List<String> plugins = PluginStarter.getPlugins();
@@ -85,12 +93,24 @@ public class PluginUpdateChecker extends UpdateHandler {
_xpi2pURL = xpi2pURL;
_appName = appName;
_oldVersion = oldVersion;
_isNewerAvailable = false;
System.setProperty(PROP_UPDATE_IN_PROGRESS, "true");
I2PAppThread update = new I2PAppThread(_pluginUpdateCheckerRunner, "AppChecker", true);
update.start();
}
}
/** @since 0.8.13 */
public void setAppStatus(String status) {
updateStatus(status);
}
/** @since 0.8.13 */
public void setDoneStatus(String status) {
updateStatus(status);
scheduleStatusClean(status);
}
public boolean isRunning() {
return _pluginUpdateCheckerRunner != null && _pluginUpdateCheckerRunner.isRunning();
}
@@ -101,12 +121,17 @@ public class PluginUpdateChecker extends UpdateHandler {
return false;
}
/** @since 0.8.13 */
public boolean isNewerAvailable() {
return _isNewerAvailable;
}
private void scheduleStatusClean(String msg) {
SimpleScheduler.getInstance().addEvent(new Cleaner(msg), 60*60*1000);
SimpleScheduler.getInstance().addEvent(new Cleaner(msg), 20*60*1000);
}
private class Cleaner implements SimpleTimer.TimedEvent {
private String _msg;
private final String _msg;
public Cleaner(String msg) {
_msg = msg;
}
@@ -126,12 +151,13 @@ public class PluginUpdateChecker extends UpdateHandler {
@Override
protected void update() {
_isNewerAvailable = false;
updateStatus("<b>" + _("Checking for update of plugin {0}", _appName) + "</b>");
// use the same settings as for updater
// always proxy, or else FIXME
//boolean shouldProxy = Boolean.valueOf(_context.getProperty(ConfigUpdateHandler.PROP_SHOULD_PROXY, ConfigUpdateHandler.DEFAULT_SHOULD_PROXY)).booleanValue();
String proxyHost = _context.getProperty(ConfigUpdateHandler.PROP_PROXY_HOST, ConfigUpdateHandler.DEFAULT_PROXY_HOST);
int proxyPort = _context.getProperty(ConfigUpdateHandler.PROP_PROXY_PORT, ConfigUpdateHandler.DEFAULT_PROXY_PORT_INT);
int proxyPort = ConfigUpdateHandler.proxyPort(_context);
_baos.reset();
try {
_get = new PartialEepGet(_context, proxyHost, proxyPort, _baos, _xpi2pURL, TrustedUpdate.HEADER_BYTES);
@@ -142,6 +168,10 @@ public class PluginUpdateChecker extends UpdateHandler {
}
}
public boolean isNewerAvailable() {
return _isNewerAvailable;
}
@Override
public void bytesTransferred(long alreadyTransferred, int currentWrite, long bytesTransferred, long bytesRemaining, String url) {
}
@@ -151,10 +181,12 @@ public class PluginUpdateChecker extends UpdateHandler {
String newVersion = TrustedUpdate.getVersionString(new ByteArrayInputStream(_baos.toByteArray()));
boolean newer = (new VersionComparator()).compare(newVersion, _oldVersion) > 0;
String msg;
if (newer)
if (newer) {
msg = "<b>" + _("New plugin version {0} is available", newVersion) + "</b>";
else
_isNewerAvailable = true;
} else {
msg = "<b>" + _("No new version is available for plugin {0}", _appName) + "</b>";
}
updateStatus(msg);
scheduleStatusClean(msg);
}

View File

@@ -42,6 +42,8 @@ public class PluginUpdateHandler extends UpdateHandler {
private static PluginUpdateRunner _pluginUpdateRunner;
private String _xpi2pURL;
private String _appStatus;
private volatile boolean _updated;
private static final String XPI2P = "app.xpi2p";
private static final String ZIP = XPI2P + ".zip";
public static final String PLUGIN_DIR = "plugins";
@@ -92,12 +94,17 @@ public class PluginUpdateHandler extends UpdateHandler {
return false;
}
/** @since 0.8.13 */
public boolean wasUpdateSuccessful() {
return _updated;
}
private void scheduleStatusClean(String msg) {
SimpleScheduler.getInstance().addEvent(new Cleaner(msg), 60*60*1000);
SimpleScheduler.getInstance().addEvent(new Cleaner(msg), 20*60*1000);
}
private class Cleaner implements SimpleTimer.TimedEvent {
private String _msg;
private final String _msg;
public Cleaner(String msg) {
_msg = msg;
}
@@ -115,11 +122,12 @@ public class PluginUpdateHandler extends UpdateHandler {
@Override
protected void update() {
_updated = false;
updateStatus("<b>" + _("Downloading plugin from {0}", _xpi2pURL) + "</b>");
// use the same settings as for updater
boolean shouldProxy = Boolean.valueOf(_context.getProperty(ConfigUpdateHandler.PROP_SHOULD_PROXY, ConfigUpdateHandler.DEFAULT_SHOULD_PROXY)).booleanValue();
String proxyHost = _context.getProperty(ConfigUpdateHandler.PROP_PROXY_HOST, ConfigUpdateHandler.DEFAULT_PROXY_HOST);
int proxyPort = _context.getProperty(ConfigUpdateHandler.PROP_PROXY_PORT, ConfigUpdateHandler.DEFAULT_PROXY_PORT_INT);
int proxyPort = ConfigUpdateHandler.proxyPort(_context);
try {
if (shouldProxy)
// 10 retries!!
@@ -286,6 +294,7 @@ public class PluginUpdateHandler extends UpdateHandler {
return;
}
boolean wasRunning = false;
File destDir = new SecureDirectory(appDir, appName);
if (destDir.exists()) {
if (Boolean.valueOf(props.getProperty("install-only")).booleanValue()) {
@@ -334,15 +343,32 @@ public class PluginUpdateHandler extends UpdateHandler {
statusDone("<b>" + _("Plugin update requires installed plugin version {0} or lower", maxVersion) + "</b>");
return;
}
oldVersion = LogsHelper.jettyVersion();
minVersion = ConfigClientsHelper.stripHTML(props, "min-jetty-version");
if (minVersion != null &&
(new VersionComparator()).compare(minVersion, oldVersion) > 0) {
to.delete();
statusDone("<b>" + _("Plugin requires Jetty version {0} or higher", minVersion) + "</b>");
return;
}
maxVersion = ConfigClientsHelper.stripHTML(props, "max-jetty-version");
if (maxVersion != null &&
(new VersionComparator()).compare(maxVersion, oldVersion) < 0) {
to.delete();
statusDone("<b>" + _("Plugin requires Jetty version {0} or lower", maxVersion) + "</b>");
return;
}
// check if it is running first?
try {
if (!PluginStarter.stopPlugin(_context, appName)) {
// failed, ignore
if (PluginStarter.isPluginRunning(appName, _context)) {
wasRunning = true;
try {
if (!PluginStarter.stopPlugin(_context, appName)) {
// failed, ignore
}
} catch (Throwable e) {
// no updateStatus() for this one
_log.error("Error stopping plugin " + appName, e);
}
} catch (Throwable e) {
// no updateStatus() for this one
_log.error("Error stopping plugin " + appName, e);
}
} else {
@@ -365,6 +391,7 @@ public class PluginUpdateHandler extends UpdateHandler {
return;
}
_updated = true;
to.delete();
if (Boolean.valueOf(props.getProperty("dont-start-at-install")).booleanValue()) {
if (Boolean.valueOf(props.getProperty("router-restart-required")).booleanValue())
@@ -375,8 +402,8 @@ public class PluginUpdateHandler extends UpdateHandler {
pluginProps.setProperty(PluginStarter.PREFIX + appName + PluginStarter.ENABLED, "false");
PluginStarter.storePluginProperties(pluginProps);
}
} else {
// start everything
} else if (wasRunning || PluginStarter.isPluginEnabled(appName)) {
// start everything unless it was disabled and not running before
try {
if (PluginStarter.startPlugin(_context, appName)) {
String linkName = ConfigClientsHelper.stripHTML(props, "consoleLinkName_" + Messages.getLanguage(_context));
@@ -396,6 +423,8 @@ public class PluginUpdateHandler extends UpdateHandler {
statusDone("<b>" + _("Plugin {0} installed but failed to start", appName) + ": " + e + "</b>");
_log.error("Error starting plugin " + appName, e);
}
} else {
statusDone("<b>" + _("Plugin {0} installed", appName) + "</b>");
}
}

View File

@@ -6,7 +6,9 @@ import java.io.File;
import java.io.FilenameFilter;
import java.io.IOException;
import java.security.KeyStore;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.StringTokenizer;
@@ -18,6 +20,7 @@ import net.i2p.desktopgui.Main;
import net.i2p.router.RouterContext;
import net.i2p.util.FileUtil;
import net.i2p.util.I2PAppThread;
import net.i2p.util.PortMapper;
import net.i2p.util.SecureDirectory;
import net.i2p.util.SecureFileOutputStream;
import net.i2p.util.ShellCommand;
@@ -207,6 +210,7 @@ public class RouterConsoleRunner {
// add standard listeners
if (_listenPort != null) {
Integer lport = Integer.parseInt(_listenPort);
StringTokenizer tok = new StringTokenizer(_listenHost, " ,");
while (tok.hasMoreTokens()) {
String host = tok.nextToken().trim();
@@ -215,7 +219,6 @@ public class RouterConsoleRunner {
// _server.addListener('[' + host + "]:" + _listenPort);
//else
// _server.addListener(host + ':' + _listenPort);
Integer lport = Integer.parseInt(_listenPort);
InetAddrPort iap = new InetAddrPort(host, lport);
SocketListener lsnr = new SocketListener(iap);
lsnr.setMinThreads(1); // default 2
@@ -230,6 +233,8 @@ public class RouterConsoleRunner {
System.err.println("Unable to bind routerconsole to " + host + " port " + _listenPort + ' ' + ioe);
}
}
// XXX: what if listenhosts do not include 127.0.0.1? (Should that ever even happen?)
I2PAppContext.getGlobalContext().portMapper().register(PortMapper.SVC_CONSOLE,lport);
}
// add SSL listeners
@@ -267,6 +272,7 @@ public class RouterConsoleRunner {
System.err.println("Unable to bind routerconsole to " + host + " port " + sslPort + " for SSL: " + e);
}
}
I2PAppContext.getGlobalContext().portMapper().register(PortMapper.SVC_HTTPS_CONSOLE,sslPort);
} else {
System.err.println("Unable to create or access keystore for SSL: " + keyStore.getAbsolutePath());
}
@@ -341,25 +347,30 @@ public class RouterConsoleRunner {
}
}
NewsFetcher fetcher = NewsFetcher.getInstance(I2PAppContext.getGlobalContext());
Thread newsThread = new I2PAppThread(fetcher, "NewsFetcher", true);
newsThread.start();
Thread t = new I2PAppThread(new StatSummarizer(), "StatSummarizer", true);
t.setPriority(Thread.NORM_PRIORITY - 1);
t.start();
List<RouterContext> contexts = RouterContext.listContexts();
if (contexts != null) {
RouterContext ctx = contexts.get(0);
NewsFetcher fetcher = NewsFetcher.getInstance(ctx);
Thread newsThread = new I2PAppThread(fetcher, "NewsFetcher", true);
newsThread.setPriority(Thread.NORM_PRIORITY - 1);
newsThread.start();
if (PluginStarter.pluginsEnabled(ctx)) {
t = new I2PAppThread(new PluginStarter(ctx), "PluginStarter", true);
t.setPriority(Thread.NORM_PRIORITY - 1);
t.start();
ctx.addShutdownTask(new PluginStopper(ctx));
}
ctx.addShutdownTask(new NewsShutdown(fetcher, newsThread));
// stat summarizer registers its own hook
ctx.addShutdownTask(new ServerShutdown());
}
ConfigServiceHandler.registerSignalHandler(ctx);
} // else log CRIT ?
}
/**
@@ -422,9 +433,10 @@ public class RouterConsoleRunner {
SecureFileOutputStream.setPerms(ks);
try {
RouterContext rctx = (RouterContext) ctx;
rctx.router().setConfigSetting(PROP_KEYSTORE_PASSWORD, DEFAULT_KEYSTORE_PASSWORD);
rctx.router().setConfigSetting(PROP_KEY_PASSWORD, keyPassword);
rctx.router().saveConfig();
Map<String, String> changes = new HashMap();
changes.put(PROP_KEYSTORE_PASSWORD, DEFAULT_KEYSTORE_PASSWORD);
changes.put(PROP_KEY_PASSWORD, keyPassword);
rctx.router().saveConfig(changes, null);
} catch (Exception e) {} // class cast exception
}
}

View File

@@ -52,7 +52,7 @@ public class StatSummarizer implements Runnable {
private Thread _thread;
public StatSummarizer() {
_context = (RouterContext)RouterContext.listContexts().get(0); // fuck it, only summarize one per jvm
_context = RouterContext.listContexts().get(0); // fuck it, only summarize one per jvm
_log = _context.logManager().getLog(getClass());
_listeners = new CopyOnWriteArrayList();
_instance = this;

View File

@@ -28,14 +28,18 @@ public class SummaryBarRenderer {
StringBuilder buf = new StringBuilder(8*1024);
String theme = _context.getProperty(CSSHelper.PROP_THEME_NAME, CSSHelper.DEFAULT_THEME);
buf.append("<a href=\"/\" target=\"_top\"><img src=\"")
// TODO - the bar would render more cleanly if we specified the img height and width here,
// but unfortunately the images in the different themes are different sizes.
// They range in height from 37 to 43 px. But there's a -2 bottom margin...
// So put it in a div.
buf.append("<div style=\"height: 36px;\"><a href=\"/\" target=\"_top\"><img src=\"")
.append(CSSHelper.BASE_THEME_PATH)
.append(theme)
.append("/images/i2plogo.png\" alt=\"")
.append(_("I2P Router Console"))
.append("\" title=\"")
.append(_("I2P Router Console"))
.append("\"></a><hr>")
.append("\"></a></div><hr>")
.append("<h3><a href=\"/help\" target=\"_top\" title=\"")
.append(_("I2P Router Help &amp; FAQ"))
@@ -57,31 +61,25 @@ public class SummaryBarRenderer {
.append(_("I2P Services"))
.append("</a></h3>\n" +
"<hr><table>" +
"<hr class=\"b\"><table><tr><td>" +
"<tr><td><a href=\"/susidns/index.jsp\" target=\"_blank\" title=\"")
.append(_("Manage your I2P hosts file here (I2P domain name resolution)"))
"<a href=\"/susimail/susimail\" target=\"blank\" title=\"")
.append(_("Anonymous webmail client"))
.append("\">")
.append(_("Addressbook"))
.append(_("Email"))
.append("</a>\n" +
"<a href=\"/i2psnark/\" target=\"_blank\" title=\"")
.append(_("Built-in anonymous BitTorrent Client"))
.append("\">")
.append(_("Torrents"))
.append("</a>\n" +
"<a href=\"/susimail/susimail\" target=\"blank\" title=\"")
.append(_("Anonymous webmail client"))
.append("\">")
.append(_("Webmail"))
.append("</a>\n" +
"<a href=\"http://127.0.0.1:7658/\" target=\"_blank\" title=\"")
.append(_("Anonymous resident webserver"))
.append(_("Local web server"))
.append("\">")
.append(_("Webserver"))
.append("</a>")
.append(_("Website"))
.append("</a>\n")
.append(NavHelper.getClientAppLinks(_context))
@@ -91,7 +89,7 @@ public class SummaryBarRenderer {
.append(_("Configure I2P Router"))
.append("\">")
.append(_("I2P Internals"))
.append("</a></h3><hr>\n" +
.append("</a></h3><hr class=\"b\">\n" +
"<table><tr><td>\n" +
@@ -149,6 +147,12 @@ public class SummaryBarRenderer {
.append(_("Local Destinations"))
.append("\">")
.append(_("I2PTunnel"))
.append("</a>\n" +
"<a href=\"/susidns/index\" target=\"_blank\" title=\"")
.append(_("Manage your I2P hosts file here (I2P domain name resolution)"))
.append("\">")
.append(_("Addressbook"))
.append("</a>\n");
File javadoc = new File(_context.getBaseDir(), "docs/javadoc/index.html");
@@ -166,7 +170,7 @@ public class SummaryBarRenderer {
.append(_("I2P Router Help"))
.append("\">")
.append(_("General"))
.append("</a></h3><hr>\n" +
.append("</a></h3><hr class=\"b\">\n" +
"<table><tr>" +
"<td align=\"left\"><b>")
@@ -200,62 +204,26 @@ public class SummaryBarRenderer {
.append(_helper.getUptime())
.append("</td></tr></table>\n" +
"<hr><h4><a href=\"/config#help\" target=\"_top\" title=\"")
"<hr><h4><a href=\"/confignet#help\" target=\"_top\" title=\"")
.append(_("Help with configuring your firewall and router for optimal I2P performance"))
.append("\">")
.append(_("Network"))
.append(": ")
.append(_helper.getReachability())
.append("</a></h4><hr>\n");
.append("</a></h4><hr>\n")
// display all the time so we display the final failure message, and plugin update messages too
buf.append(UpdateHandler.getStatus());
if (_helper.updateAvailable() || _helper.unsignedUpdateAvailable()) {
if ("true".equals(System.getProperty(UpdateHandler.PROP_UPDATE_IN_PROGRESS))) {
// nothing
} else if(
// isDone() is always false for now, see UpdateHandler
// ((!update.isDone()) &&
_helper.getAction() == null &&
_helper.getUpdateNonce() == null &&
ConfigRestartBean.getRestartTimeRemaining() > 12*60*1000) {
long nonce = _context.random().nextLong();
String prev = System.getProperty("net.i2p.router.web.UpdateHandler.nonce");
if (prev != null)
System.setProperty("net.i2p.router.web.UpdateHandler.noncePrev", prev);
System.setProperty("net.i2p.router.web.UpdateHandler.nonce", nonce+"");
String uri = _helper.getRequestURI();
buf.append("<form action=\"").append(uri).append("\" method=\"POST\">\n");
buf.append("<input type=\"hidden\" name=\"updateNonce\" value=\"").append(nonce).append("\" >\n");
if (_helper.updateAvailable()) {
buf.append("<button type=\"submit\" name=\"updateAction\" value=\"signed\" >")
// Note to translators: parameter is a version, e.g. "0.8.4"
.append(_("Download {0} Update", _helper.getUpdateVersion()))
.append("</button><br>\n");
}
if (_helper.unsignedUpdateAvailable()) {
buf.append("<button type=\"submit\" name=\"updateAction\" value=\"Unsigned\" >")
// Note to translators: parameter is a date and time, e.g. "02-Mar 20:34 UTC"
// <br> is optional, to help the browser make the lines even in the button
// If the translation is shorter than the English, you should probably not include <br>
.append(_("Download Unsigned<br>Update {0}", _helper.getUnsignedUpdateVersion()))
.append("</button><br>\n");
}
buf.append("</form>\n");
}
}
.append(_helper.getUpdateStatus())
.append(_helper.getRestartStatus())
buf.append(ConfigRestartBean.renderStatus(_helper.getRequestURI(), _helper.getAction(), _helper.getConsoleNonce()))
.append("<hr><h3><a href=\"/peers\" target=\"_top\" title=\"")
.append(_("Show all current peer connections"))
.append("\">")
.append(_("Peers"))
.append("</a></h3><hr>\n" +
.append("</a></h3><hr class=\"b\">\n" +
"<table>\n" +
@@ -301,10 +269,10 @@ public class SummaryBarRenderer {
boolean anotherLine = false;
if (_helper.showFirewallWarning()) {
buf.append("<h4><a href=\"/config\" target=\"_top\" title=\"")
buf.append("<h4><a href=\"/confignet\" target=\"_top\" title=\"")
.append(_("Help with firewall configuration"))
.append("\">")
.append(_("Check NAT/firewall"))
.append(_("Check network connection and NAT/firewall"))
.append("</a></h4>");
anotherLine = true;
}
@@ -324,7 +292,7 @@ public class SummaryBarRenderer {
String uri = _helper.getRequestURI();
buf.append("<p><form action=\"").append(uri).append("\" method=\"POST\">\n");
buf.append("<input type=\"hidden\" name=\"reseedNonce\" value=\"").append(nonce).append("\" >\n");
buf.append("<button type=\"submit\" value=\"Reseed\" >").append(_("Reseed")).append("</button></form></p>\n");
buf.append("<button type=\"submit\" class=\"reload\" value=\"Reseed\" >").append(_("Reseed")).append("</button></form></p>\n");
}
anotherLine = true;
}
@@ -344,7 +312,7 @@ public class SummaryBarRenderer {
.append(_("Configure router bandwidth allocation"))
.append("\" target=\"_top\">")
.append(_("Bandwidth in/out"))
.append("</a></h3><hr>" +
.append("</a></h3><hr class=\"b\">" +
"<table>\n" +
"<tr><td align=\"left\"><b>")
@@ -381,7 +349,7 @@ public class SummaryBarRenderer {
.append(_("View existing tunnels and tunnel build status"))
.append("\">")
.append(_("Tunnels"))
.append("</a></h3><hr>" +
.append("</a></h3><hr class=\"b\">" +
"<table>\n" +
"<tr><td align=\"left\"><b>")
@@ -412,7 +380,7 @@ public class SummaryBarRenderer {
.append(_("What's in the router's job queue?"))
.append("\">")
.append(_("Congestion"))
.append("</a></h3><hr>" +
.append("</a></h3><hr class=\"b\">" +
"<table>\n" +
"<tr><td align=\"left\"><b>")
@@ -444,7 +412,9 @@ public class SummaryBarRenderer {
"</table><hr><h4>")
.append(_(_helper.getTunnelStatus()))
.append("</h4><hr>\n")
.append(_helper.getDestinations());
.append(_helper.getDestinations())
.append("<hr>\n");

View File

@@ -27,6 +27,8 @@ import net.i2p.stat.RateStat;
/**
* Simple helper to query the appropriate router for data necessary to render
* the summary sections on the router console.
*
* For the full summary bar use renderSummaryBar()
*/
public class SummaryHelper extends HelperBase {
@@ -101,6 +103,8 @@ public class SummaryHelper extends HelperBase {
}
private String reachability() {
if (_context.commSystem().isDummy())
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
@@ -180,6 +184,7 @@ public class SummaryHelper extends HelperBase {
return _context != null &&
_context.netDb().isInitialized() &&
_context.router().getUptime() > 2*60*1000 &&
(!_context.commSystem().isDummy()) &&
_context.commSystem().countActivePeers() <= 0 &&
_context.netDb().getKnownRouters() > 5;
}
@@ -367,7 +372,7 @@ public class SummaryHelper extends HelperBase {
List<Destination> clients = new ArrayList(_context.clientManager().listClients());
StringBuilder buf = new StringBuilder(512);
buf.append("<h3><a href=\"/i2ptunnel/\" target=\"_blank\" title=\"").append(_("Add/remove/edit &amp; control your client and server tunnels")).append("\">").append(_("Local Destinations")).append("</a></h3><hr><div class=\"tunnels\">");
buf.append("<h3><a href=\"/i2ptunnel/\" target=\"_blank\" title=\"").append(_("Add/remove/edit &amp; control your client and server tunnels")).append("\">").append(_("Local Destinations")).append("</a></h3><hr class=\"b\"><div class=\"tunnels\">");
if (!clients.isEmpty()) {
Collections.sort(clients, new AlphaComparator());
buf.append("<table>");
@@ -409,7 +414,7 @@ public class SummaryHelper extends HelperBase {
} else {
buf.append("<center><i>").append(_("none")).append("</i></center>");
}
buf.append("</div><hr>\n");
buf.append("</div>\n");
return buf.toString();
}
@@ -601,6 +606,62 @@ public class SummaryHelper extends HelperBase {
return NewsFetcher.getInstance(_context).unsignedUpdateVersion();
}
/**
* The update status and buttons
* @since 0.8.13 moved from SummaryBarRenderer
*/
public String getUpdateStatus() {
StringBuilder buf = new StringBuilder(512);
// display all the time so we display the final failure message, and plugin update messages too
String status = UpdateHandler.getStatus();
if (status.length() > 0) {
buf.append("<h4>").append(status).append("</h4><hr>\n");
}
if (updateAvailable() || unsignedUpdateAvailable()) {
if ("true".equals(System.getProperty(UpdateHandler.PROP_UPDATE_IN_PROGRESS))) {
// nothing
} else if(
// isDone() is always false for now, see UpdateHandler
// ((!update.isDone()) &&
getAction() == null &&
getUpdateNonce() == null &&
ConfigRestartBean.getRestartTimeRemaining() > 12*60*1000) {
long nonce = _context.random().nextLong();
String prev = System.getProperty("net.i2p.router.web.UpdateHandler.nonce");
if (prev != null)
System.setProperty("net.i2p.router.web.UpdateHandler.noncePrev", prev);
System.setProperty("net.i2p.router.web.UpdateHandler.nonce", nonce+"");
String uri = getRequestURI();
buf.append("<form action=\"").append(uri).append("\" method=\"POST\">\n");
buf.append("<input type=\"hidden\" name=\"updateNonce\" value=\"").append(nonce).append("\" >\n");
if (updateAvailable()) {
buf.append("<button type=\"submit\" class=\"download\" name=\"updateAction\" value=\"signed\" >")
// Note to translators: parameter is a version, e.g. "0.8.4"
.append(_("Download {0} Update", getUpdateVersion()))
.append("</button><br>\n");
}
if (unsignedUpdateAvailable()) {
buf.append("<button type=\"submit\" class=\"download\" name=\"updateAction\" value=\"Unsigned\" >")
// Note to translators: parameter is a date and time, e.g. "02-Mar 20:34 UTC"
// <br> is optional, to help the browser make the lines even in the button
// If the translation is shorter than the English, you should probably not include <br>
.append(_("Download Unsigned<br>Update {0}", getUnsignedUpdateVersion()))
.append("</button><br>\n");
}
buf.append("</form>\n");
}
}
return buf.toString();
}
/**
* The restart status and buttons
* @since 0.8.13 moved from SummaryBarRenderer
*/
public String getRestartStatus() {
return ConfigRestartBean.renderStatus(getRequestURI(), getAction(), getConsoleNonce());
}
/** output the summary bar to _out */
public void renderSummaryBar() throws IOException {
SummaryBarRenderer renderer = new SummaryBarRenderer(_context, this);

View File

@@ -28,7 +28,7 @@ import net.i2p.stat.RateStat;
import net.i2p.util.ObjectCounter;
/**
*
* tunnels.jsp
*/
public class TunnelRenderer {
private RouterContext _context;
@@ -133,12 +133,12 @@ public class TunnelRenderer {
out.write("<div class=\"statusnotes\"><b>" + _("Limited display to the {0} tunnels with the highest usage", DISPLAY_LIMIT) + "</b></div>\n");
out.write("<div class=\"statusnotes\"><b>" + _("Inactive participating tunnels") + ": " + inactive + "</b></div>\n");
out.write("<div class=\"statusnotes\"><b>" + _("Lifetime bandwidth usage") + ": " + DataHelper.formatSize2(processed*1024) + "B</b></div>\n");
renderPeers(out);
//renderPeers(out);
}
private static class TunnelComparator implements Comparator {
public int compare(Object l, Object r) {
return (int) (((HopConfig)r).getProcessedMessagesCount() - ((HopConfig)l).getProcessedMessagesCount());
private static class TunnelComparator implements Comparator<HopConfig> {
public int compare(HopConfig l, HopConfig r) {
return (int) (r.getProcessedMessagesCount() - l.getProcessedMessagesCount());
}
}
@@ -228,6 +228,7 @@ public class TunnelRenderer {
DataHelper.formatSize2(processedOut*1024) + "B " + _("out") + "</b></center></div>");
}
/****
private void renderPeers(Writer out) throws IOException {
// count up the peers in the local pools
ObjectCounter<Hash> lc = new ObjectCounter();
@@ -265,9 +266,11 @@ public class TunnelRenderer {
out.write("</b> <td>&nbsp;</td> <td align=\"center\"><b>" + partCount);
out.write("</b> <td>&nbsp;</td></tr></table></div>\n");
}
****/
/* duplicate of that in tunnelPoolManager for now */
/** @return total number of non-fallback expl. + client tunnels */
/****
private int countTunnelsPerPeer(ObjectCounter<Hash> lc) {
List<TunnelPool> pools = new ArrayList();
_context.tunnelManager().listPools(pools);
@@ -286,8 +289,10 @@ public class TunnelRenderer {
}
return tunnelCount;
}
****/
/** @return total number of part. tunnels */
/****
private int countParticipatingPerPeer(ObjectCounter<Hash> pc) {
List<HopConfig> participating = _context.tunnelDispatcher().listParticipatingTunnels();
for (HopConfig cfg : participating) {
@@ -301,12 +306,6 @@ public class TunnelRenderer {
return participating.size();
}
private static class HashComparator implements Comparator {
public int compare(Object l, Object r) {
return ((Hash)l).toBase64().compareTo(((Hash)r).toBase64());
}
}
private static class CountryComparator implements Comparator<Hash> {
public CountryComparator(CommSystemFacade comm) {
this.comm = comm;
@@ -326,7 +325,9 @@ public class TunnelRenderer {
private CommSystemFacade comm;
}
****/
/** cap string */
private String getCapacity(Hash peer) {
RouterInfo info = _context.netDb().lookupRouterInfoLocally(peer);
if (info != null) {

View File

@@ -70,7 +70,7 @@ public class UnsignedUpdateHandler extends UpdateHandler {
// always proxy for now
//boolean shouldProxy = Boolean.valueOf(_context.getProperty(ConfigUpdateHandler.PROP_SHOULD_PROXY, ConfigUpdateHandler.DEFAULT_SHOULD_PROXY)).booleanValue();
String proxyHost = _context.getProperty(ConfigUpdateHandler.PROP_PROXY_HOST, ConfigUpdateHandler.DEFAULT_PROXY_HOST);
int proxyPort = _context.getProperty(ConfigUpdateHandler.PROP_PROXY_PORT, ConfigUpdateHandler.DEFAULT_PROXY_PORT_INT);
int proxyPort = ConfigUpdateHandler.proxyPort(_context);
try {
// 40 retries!!
_get = new EepGet(_context, proxyHost, proxyPort, 40, _updateFile, _zipURL, false);
@@ -105,8 +105,7 @@ public class UnsignedUpdateHandler extends UpdateHandler {
modtime = RFC822Date.parse822Date(lastmod);
if (modtime <= 0)
modtime = _context.clock().now();
_context.router().setConfigSetting(PROP_LAST_UPDATE_TIME, "" + modtime);
_context.router().saveConfig();
_context.router().saveConfig(PROP_LAST_UPDATE_TIME, "" + modtime);
if ("install".equals(policy)) {
_log.log(Log.CRIT, "Update was downloaded, restarting to install it");
updateStatus("<b>" + _("Update downloaded") + "</b><br>" + _("Restarting"));

View File

@@ -127,7 +127,7 @@ public class UpdateHandler {
}
public class UpdateRunner implements Runnable, EepGet.StatusListener {
protected boolean _isRunning;
protected volatile boolean _isRunning;
protected boolean done;
protected EepGet _get;
protected final DecimalFormat _pct = new DecimalFormat("0.0%");
@@ -160,16 +160,15 @@ public class UpdateHandler {
* If it is, get the whole thing.
*/
protected void update() {
// TODO:
// Do a PartialEepGet on the selected URL, check for version we expect,
// and loop if it isn't what we want.
// This will allow us to do a release without waiting for the last host to install the update.
// This will allows us to do a release without waiting for the last host to install the update.
// Alternative: In bytesTransferred(), Check the data in the output file after
// we've received at least 56 bytes. Need a cancel() method in EepGet ?
boolean shouldProxy = Boolean.valueOf(_context.getProperty(ConfigUpdateHandler.PROP_SHOULD_PROXY, ConfigUpdateHandler.DEFAULT_SHOULD_PROXY)).booleanValue();
String proxyHost = _context.getProperty(ConfigUpdateHandler.PROP_PROXY_HOST, ConfigUpdateHandler.DEFAULT_PROXY_HOST);
int proxyPort = _context.getProperty(ConfigUpdateHandler.PROP_PROXY_PORT, ConfigUpdateHandler.DEFAULT_PROXY_PORT_INT);
int proxyPort = ConfigUpdateHandler.proxyPort(_context);
List<String> urls = getUpdateURLs();
if (urls.isEmpty()) {
@@ -275,8 +274,7 @@ public class UpdateHandler {
modtime = RFC822Date.parse822Date(lastmod);
if (modtime <= 0)
modtime = _context.clock().now();
_context.router().setConfigSetting(PROP_LAST_UPDATE_TIME, "" + modtime);
_context.router().saveConfig();
_context.router().saveConfig(PROP_LAST_UPDATE_TIME, "" + modtime);
if ("install".equals(policy)) {
_log.log(Log.CRIT, "Update was VERIFIED, restarting to install it");
updateStatus("<b>" + _("Update verified") + "</b><br>" + _("Restarting"));

View File

@@ -12,6 +12,7 @@ import net.i2p.I2PAppContext;
import net.i2p.util.FileUtil;
import net.i2p.util.Log;
import net.i2p.util.SecureDirectory;
import net.i2p.util.PortMapper;
import org.mortbay.http.HttpContext;
import org.mortbay.http.HttpListener;
@@ -136,12 +137,16 @@ public class WebAppStarter {
/** see comments in ConfigClientsHandler */
static Server getConsoleServer() {
PortMapper pm = I2PAppContext.getGlobalContext().portMapper();
int p1 = pm.getPort(PortMapper.SVC_CONSOLE);
int p2 = pm.getPort(PortMapper.SVC_HTTPS_CONSOLE);
Collection c = Server.getHttpServers();
for (int i = 0; i < c.size(); i++) {
Server s = (Server) c.toArray()[i];
HttpListener[] hl = s.getListeners();
for (int j = 0; j < hl.length; j++) {
if (hl[j].getPort() == 7657)
int port = hl[j].getPort();
if (port == p1 || port == p2)
return s;
}
}

View File

@@ -0,0 +1,89 @@
package net.i2p.router.web;
import net.i2p.router.Router;
import net.i2p.router.RouterContext;
import net.i2p.util.Log;
import org.tanukisoftware.wrapper.WrapperManager;
import org.tanukisoftware.wrapper.event.WrapperControlEvent;
import org.tanukisoftware.wrapper.event.WrapperEvent;
import org.tanukisoftware.wrapper.event.WrapperEventListener;
/**
* Listen for events. Requires wrapper 3.2.0 or higher.
* Hides the actual listener so that
* ConfigServiceHandler can have a static field and not die on
* class not found error with wrapper 3.1.1.
*
* @since 0.8.13
*/
class WrapperListener {
private final RouterContext _context;
private final WrapperEventListener _listener;
private static final String PROP_GRACEFUL_HUP = "router.gracefulHUP";
/**
* Wrapper must be 3.2.0 or higher, or will throw class not found error.
* Registers with the wrapper in the constructor.
*/
public WrapperListener(RouterContext ctx) {
_context = ctx;
_listener = new SignalHandler(ctx);
long mask = WrapperEventListener.EVENT_FLAG_CONTROL;
WrapperManager.addWrapperEventListener(_listener, mask);
}
/**
* Unregister the handler for signals
*/
public void unregister() {
WrapperManager.removeWrapperEventListener(_listener);
}
/**
* Catch signals.
* The wrapper will potentially forward HUP, USR1, and USR2.
* But USR1 and USR2 are used by the JVM GC and cannot be trapped.
* So we will only get HUP.
*
* @since 0.8.13
*/
private static class SignalHandler implements WrapperEventListener {
private final RouterContext _ctxt;
public SignalHandler(RouterContext ctx) {
_ctxt = ctx;
}
public void fired(WrapperEvent event) {
if (!(event instanceof WrapperControlEvent))
return;
WrapperControlEvent wce = (WrapperControlEvent) event;
Log log = _ctxt.logManager().getLog(ConfigServiceHandler.class);
if (log.shouldLog(Log.WARN))
log.warn("Got signal: " + wce.getControlEventName());
int sig = wce.getControlEvent();
switch (sig) {
case WrapperManager.WRAPPER_CTRL_HUP_EVENT:
if (_ctxt.getBooleanPropertyDefaultTrue(PROP_GRACEFUL_HUP)) {
wce.consume();
if (!(_ctxt.router().gracefulShutdownInProgress() ||
_ctxt.router().isFinalShutdownInProgress())) {
System.err.println("WARN: Graceful shutdown initiated by SIGHUP");
log.logAlways(Log.WARN, "Graceful shutdown initiated by SIGHUP");
ConfigServiceHandler.registerWrapperNotifier(_ctxt, Router.EXIT_GRACEFUL, false);
_ctxt.router().shutdownGracefully();
}
} else {
log.log(Log.CRIT, "Hard shutdown initiated by SIGHUP");
// JVM will call ShutdownHook if we don't do it ourselves
//wce.consume();
//registerWrapperNotifier(_ctxt, Router.EXIT_HARD, false);
//_ctxt.router().shutdown(Router.EXIT_HARD);
}
break;
}
}
}
}

View File

@@ -4,14 +4,14 @@
<html><head>
<%@include file="css.jsi" %>
<%=intl.title("config networking")%>
<%=intl.title("configure bandwidth")%>
</head><body>
<%@include file="summary.jsi" %>
<jsp:useBean class="net.i2p.router.web.ConfigNetHelper" id="nethelper" scope="request" />
<jsp:setProperty name="nethelper" property="contextId" value="<%=(String)session.getAttribute("i2p.contextId")%>" />
<h1><%=intl._("I2P Network Configuration")%></h1>
<h1><%=intl._("I2P Bandwidth Configuration")%></h1>
<div class="main" id="main">
<%@include file="confignav.jsi" %>
@@ -24,10 +24,12 @@
<form action="" method="POST">
<input type="hidden" name="nonce" value="<jsp:getProperty name="formhandler" property="newNonce" />" >
<input type="hidden" name="action" value="blah" >
<input type="hidden" name="ratesOnly" value="1" >
<h3><%=intl._("Bandwidth limiter")%></h3><p>
<img src="/themes/console/images/itoopie_xsm.png" alt="">
<b><%=intl._("I2P will work best if you configure your rates to match the speed of your internet connection.")%></b>
</p>
<div class="wideload"><p><table><tr><td><input style="text-align: right; width: 5em;" name="inboundrate" type="text" size="5" maxlength="5" value="<jsp:getProperty name="nethelper" property="inboundRate" />" >
<div class="wideload"><table><tr><td><input style="text-align: right; width: 5em;" name="inboundrate" type="text" size="5" maxlength="5" value="<jsp:getProperty name="nethelper" property="inboundRate" />" >
<%=intl._("KBps In")%>
</td><td>(<jsp:getProperty name="nethelper" property="inboundRateBits" />)</td>
<% /********
@@ -53,10 +55,10 @@
</tr><tr>
<td><jsp:getProperty name="nethelper" property="sharePercentageBox" /> <%=intl._("Share")%></td>
<td>(<jsp:getProperty name="nethelper" property="shareRateBits" />)
</td></tr></table></p></div></p>
<% int share = nethelper.getShareBandwidth();
</td></tr></table></div>
<p><% int share = nethelper.getShareBandwidth();
if (share < 12) {
out.print("<p><b>");
out.print("<b>");
out.print(intl._("NOTE"));
out.print("</b>: ");
out.print(intl._("You have configured I2P to share only {0} KBps.", share));
@@ -64,218 +66,18 @@
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.")+"</p>");
out.print(intl._("It improves your anonymity by creating cover traffic, and helps the network."));
} else {
out.print("<p>");
out.print(intl._("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.")+"</p><hr>");
out.print(intl._("The higher the share bandwidth the more you improve your anonymity and help the network."));
}
%>
%></p>
<p><a href="confignet"><%=intl._("Advanced network configuration page")%></a></p><hr>
<div class="formaction">
<input type="reset" value="<%=intl._("Cancel")%>" >
<input type="submit" name="save" value="<%=intl._("Save changes")%>" >
<input type="reset" class="cancel" value="<%=intl._("Cancel")%>" >
<input type="submit" class="accept" name="save" value="<%=intl._("Save changes")%>" >
</div>
<% /********
<!--
<b>Enable load testing: </b>
<input type="checkbox" class="optbox" name="enableloadtesting" value="true" <jsp:getProperty name="nethelper" property="enableLoadTesting" /> />
<p>If enabled, your router will periodically anonymously probe some of your peers
to see what sort of throughput they can handle. This improves your router's ability
to pick faster peers, but can cost substantial bandwidth. Relevant data from the
load testing is fed into the profiles as well as the
<a href="oldstats.jsp#test.rtt">test.rtt</a> and related stats.</p>
<br>
-->
*********/ %>
<h3><%=intl._("IP and Transport Configuration")%></h3><p>
<b><%=intl._("The default settings will work for most people.")%>
<a href="#chelp"><%=intl._("There is help below.")%></a></b>
</p><p><b><%=intl._("UPnP Configuration")%>:</b><br>
<input type="checkbox" class="optbox" name="upnp" value="true" <jsp:getProperty name="nethelper" property="upnpChecked" /> >
<%=intl._("Enable UPnP to open firewall ports")%> - <a href="peers#upnp"><%=intl._("UPnP status")%></a>
</p><p><b><%=intl._("IP Configuration")%>:</b><br>
<%=intl._("Externally reachable hostname or IP address")%>:<br>
<input type="radio" class="optbox" name="udpAutoIP" value="local,upnp,ssu" <%=nethelper.getUdpAutoIPChecked(3) %> >
<%=intl._("Use all auto-detect methods")%><br>
<input type="radio" class="optbox" name="udpAutoIP" value="local,ssu" <%=nethelper.getUdpAutoIPChecked(4) %> >
<%=intl._("Disable UPnP IP address detection")%><br>
<input type="radio" class="optbox" name="udpAutoIP" value="upnp,ssu" <%=nethelper.getUdpAutoIPChecked(5) %> >
<%=intl._("Ignore local interface IP address")%><br>
<input type="radio" class="optbox" name="udpAutoIP" value="ssu" <%=nethelper.getUdpAutoIPChecked(0) %> >
<%=intl._("Use SSU IP address detection only")%><br>
<input type="radio" class="optbox" name="udpAutoIP" value="fixed" <%=nethelper.getUdpAutoIPChecked(1) %> >
<%=intl._("Specify hostname or IP")%>:
<input name ="udpHost1" type="text" size="16" value="<jsp:getProperty name="nethelper" property="udphostname" />" >
<% String[] ips = nethelper.getAddresses();
if (ips.length > 0) {
out.print(intl._("or") + " <select name=\"udpHost2\"><option value=\"\" selected=\"true\">"+intl._("Select Interface")+"</option>\n");
for (int i = 0; i < ips.length; i++) {
out.print("<option value=\"");
out.print(ips[i]);
out.print("\">");
out.print(ips[i]);
out.print("</option>\n");
}
out.print("</select>\n");
}
%>
<br>
<input type="radio" class="optbox" name="udpAutoIP" value="hidden" <%=nethelper.getUdpAutoIPChecked(2) %> >
<%=intl._("Hidden mode - do not publish IP")%> <i><%=intl._("(prevents participating traffic)")%></i><br>
</p><p>
<%=intl._("Action when IP changes")%>:<br>
<input type="checkbox" class="optbox" name="laptop" value="true" <jsp:getProperty name="nethelper" property="laptopChecked" /> >
<%=intl._("Laptop mode - Change router identity and UDP port when IP changes for enhanced anonymity")%>
(<i><%=intl._("Experimental")%></i>)
</p><p><b><%=intl._("UDP Configuration:")%></b><br>
<%=intl._("UDP port:")%>
<input name ="udpPort" type="text" size="5" maxlength="5" value="<jsp:getProperty name="nethelper" property="configuredUdpPort" />" ><br>
<% /********
<!-- let's keep this simple...
<input type="checkbox" class="optbox" name="requireIntroductions" value="true" <jsp:getProperty name="nethelper" property="requireIntroductionsChecked" /> />
Require SSU introductions
<i>(Enable if you cannot open your firewall)</i>
</p><p>
Current External UDP address: <i><jsp:getProperty name="nethelper" property="udpAddress" /></i><br>
-->
*********/ %>
</p><p>
<b><%=intl._("TCP Configuration")%>:</b><br>
<%=intl._("Externally reachable hostname or IP address")%>:<br>
<input type="radio" class="optbox" name="ntcpAutoIP" value="true" <%=nethelper.getTcpAutoIPChecked(2) %> >
<%=intl._("Use auto-detected IP address")%>
<i>(<%=intl._("currently")%> <jsp:getProperty name="nethelper" property="udpIP" />)</i>
<%=intl._("if we are not firewalled")%><br>
<input type="radio" class="optbox" name="ntcpAutoIP" value="always" <%=nethelper.getTcpAutoIPChecked(3) %> >
<%=intl._("Always use auto-detected IP address (Not firewalled)")%><br>
<input type="radio" class="optbox" name="ntcpAutoIP" value="false" <%=nethelper.getTcpAutoIPChecked(1) %> >
<%=intl._("Specify hostname or IP")%>:
<input name ="ntcphost" type="text" size="16" value="<jsp:getProperty name="nethelper" property="ntcphostname" />" ><br>
<input type="radio" class="optbox" name="ntcpAutoIP" value="false" <%=nethelper.getTcpAutoIPChecked(0) %> >
<%=intl._("Disable inbound (Firewalled)")%><br>
<input type="radio" class="optbox" name="ntcpAutoIP" value="disabled" <%=nethelper.getTcpAutoIPChecked(4) %> >
<%=intl._("Completely disable")%> <i><%=intl._("(select only if behind a firewall that throttles or blocks outbound TCP)")%></i><br>
</p><p>
<%=intl._("Externally reachable TCP port")%>:<br>
<input type="radio" class="optbox" name="ntcpAutoPort" value="2" <%=nethelper.getTcpAutoPortChecked(2) %> >
<%=intl._("Use the same port configured for UDP")%>
<i>(<%=intl._("currently")%> <jsp:getProperty name="nethelper" property="udpPort" />)</i><br>
<input type="radio" class="optbox" name="ntcpAutoPort" value="1" <%=nethelper.getTcpAutoPortChecked(1) %> >
<%=intl._("Specify Port")%>:
<input name ="ntcpport" type="text" size="5" maxlength="5" value="<jsp:getProperty name="nethelper" property="ntcpport" />" ><br>
</p><p><b><%=intl._("Notes")%>: <%=intl._("a) Do not reveal your port numbers to anyone! b) Changing these settings will restart your router.")%></b></p>
<hr><div class="formaction">
<input type="reset" value="<%=intl._("Cancel")%>" >
<input type="submit" name="save" value="<%=intl._("Save changes")%>" >
</div><h3><a name="chelp"><%=intl._("Configuration Help")%>:</a></h3><div align="justify"><p>
<%=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.")%>
</p><p>
<%=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.")%>
</p>
<% /********
<!-- let's keep this simple...
<input type="submit" name="recheckReachability" value="Check network reachability..." />
</p>
-->
*********/ %>
<p>
<%=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")%>:
<ul>
<li class="tidylist"><%=intl._("No UPnP-compatible device present")%>
<li class="tidylist"><%=intl._("UPnP disabled on the device")%>
<li class="tidylist"><%=intl._("Software firewall interference with UPnP")%>
<li class="tidylist"><%=intl._("Bugs in the device's UPnP implementation")%>
<li class="tidylist"><%=intl._("Multiple firewall/routers in the internet connection path")%>
<li class="tidylist"><%=intl._("UPnP device change, reset, or address change")%>
</ul></p><p>
<a href="peers#upnp"><%=intl._("Review the UPnP status here.")%></a>
<%=intl._("UPnP may be enabled or disabled above, but a change requires a router restart to take effect.")%></p>
<p><%=intl._("Hostnames entered above will be published in the network database.")%>
<%=intl._("They are <b>not private</b>.")%>
<%=intl._("Also, <b>do not enter a private IP address</b> 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.")%>
</p>
<h3><a name="help"><%=intl._("Reachability Help")%>:</a></h3><p>
<%=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 <a href=\"logs.jsp\">logs</a> may also help diagnose the problem.")%>
<ul>
<li class="tidylist"><b><%=intl._("OK")%></b> -
<%=intl._("Your UDP port does not appear to be firewalled.")%>
<li class="tidylist"><b><%=intl._("Firewalled")%></b> -
<%=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.")%>
<li class="tidylist"><b><%=intl._("Testing")%></b> -
<%=intl._("The router is currently testing whether your UDP port is firewalled.")%>
<li class="tidylist"><b><%=intl._("Hidden")%></b> -
<%=intl._("The router is not configured to publish its address, therefore it does not expect incoming connections.")%>
<li class="tidylist"><b><%=intl._("WARN - Firewalled and Fast")%></b> -
<%=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.")%>
<li class="tidylist"><b><%=intl._("WARN - Firewalled and Floodfill")%></b> -
<%=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.")%>
<li class="tidylist"><b><%=intl._("WARN - Firewalled with Inbound TCP Enabled")%></b> -
<%=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.")%>
<li class="tidylist"><b><%=intl._("WARN - Firewalled with UDP Disabled")%></b> -
<%=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.")%>
<li class="tidylist"><b><%=intl._("ERR - Clock Skew")%></b> -
<%=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.")%>
<li class="tidylist"><b><%=intl._("ERR - Private TCP Address")%></b> -
<%=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.")%>
<li class="tidylist"><b><%=intl._("ERR - SymmetricNAT")%></b> -
<%=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.")%>
<li class="tidylist"><b><%=intl._("ERR - UDP Port In Use - Set i2np.udp.internalPort=xxxx in advanced config and restart")%></b> -
<%=intl._("I2P was unable to bind to port 8887 or other configured port.")%>
<%=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.")%>
<li class="tidylist"><b><%=intl._("ERR - UDP Disabled and Inbound TCP host/port not set")%></b> -
<%=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.")%>
<li class="tidylist"><b><%=intl._("ERR - Client Manager I2CP Error - check logs")%></b> -
<%=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.")%>
</ul></p><hr>
<% /********
<!--
<b>Dynamic Router Keys: </b>
<input type="checkbox" class="optbox" name="dynamicKeys" value="true" <jsp:getProperty name="nethelper" property="dynamicKeysChecked" /> /><br>
<p>
This setting causes your router identity to be regenerated every time your IP address
changes. If you have a dynamic IP this option can speed up your reintegration into
the network (since people will have shitlisted your old router identity), and, for
very weak adversaries, help frustrate trivial
<a href="http://www.i2p.net/how_threatmodel#intersection">intersection
attacks</a> against the NetDB. Your different router identities would only be
'hidden' among other I2P users at your ISP, and further analysis would link
the router identities further.</p>
<p>Note that when I2P detects an IP address change, it will automatically
initiate a restart in order to rekey and to disconnect from peers before they
update their profiles - any long lasting client connections will be disconnected,
though such would likely already be the case anyway, since the IP address changed.
</p>
<br>
-->
*********/ %>
</div></form></div></div></body></html>
</form>
</div></div></body></html>

View File

@@ -30,7 +30,7 @@
<h3><%=intl._("Advanced I2P Configuration")%></h3>
<textarea rows="32" cols="60" name="config" wrap="off" spellcheck="false"><jsp:getProperty name="advancedhelper" property="settings" /></textarea><br><hr>
<div class="formaction">
<input type="reset" value="<%=intl._("Cancel")%>" >
<input type="submit" name="shouldsave" value="<%=intl._("Save changes")%>" >
<input type="reset" class="cancel" value="<%=intl._("Cancel")%>" >
<input type="submit" name="shouldsave" class="accept" value="<%=intl._("Save changes")%>" >
<br><b><%=intl._("NOTE")%>:</b> <%=intl._("Some changes may require a restart to take effect.")%>
</div></form></div></div></div></body></html>

View File

@@ -9,6 +9,7 @@
button span.hide{
display:none;
}
input.default { width: 1px; height: 1px; visibility: hidden; }
</style></head><body>
<%@include file="summary.jsi" %>
@@ -41,11 +42,11 @@ button span.hide{
<%=net.i2p.router.startup.ClientAppConfig.configFile(net.i2p.I2PAppContext.getGlobalContext()).getAbsolutePath()%>.
<%=intl._("All changes require restart to take effect.")%></i>
</p><hr><div class="formaction">
<input type="submit" name="foo" value="<%=intl._("Cancel")%>" />
<input type="submit" class="cancel" name="foo" value="<%=intl._("Cancel")%>" />
<% if (request.getParameter("edit") == null) { %>
<input type="submit" name="edit" value="<%=intl._("Add Client")%>" />
<input type="submit" name="edit" class="add" value="<%=intl._("Add Client")%>" />
<% } %>
<input type="submit" name="action" value="<%=intl._("Save Client Configuration")%>" />
<input type="submit" class="accept" name="action" value="<%=intl._("Save Client Configuration")%>" />
</div></form></div>
<h3><a name="i2cp"></a><%=intl._("Advanced Client Interface Configuration")%></h3>
@@ -89,8 +90,9 @@ button span.hide{
<%=intl._("Many clients do not support SSL or authorization.")%>
<i><%=intl._("All changes require restart to take effect.")%></i>
</p><hr><div class="formaction">
<input type="submit" name="foo" value="<%=intl._("Cancel")%>" />
<input type="submit" name="action" value="<%=intl._("Save Interface Configuration")%>" />
<input type="submit" class="default" name="action" value="<%=intl._("Save Interface Configuration")%>" />
<input type="submit" class="cancel" name="foo" value="<%=intl._("Cancel")%>" />
<input type="submit" class="accept" name="action" value="<%=intl._("Save Interface Configuration")%>" />
</div></form>
<h3><a name="webapp"></a><%=intl._("WebApp Configuration")%></h3><p>
@@ -103,7 +105,8 @@ button span.hide{
<jsp:getProperty name="clientshelper" property="form2" />
<p><i><%=intl._("All changes require restart to take effect.")%></i>
</p><hr><div class="formaction">
<input type="submit" name="action" value="<%=intl._("Save WebApp Configuration")%>" />
<input type="submit" class="cancel" name="foo" value="<%=intl._("Cancel")%>" />
<input type="submit" name="action" class="accept" value="<%=intl._("Save WebApp Configuration")%>" />
</div></form></div>
<% if (clientshelper.showPlugins()) { %>
@@ -114,7 +117,8 @@ button span.hide{
<input type="hidden" name="nonce" value="<%=pageNonce%>" >
<jsp:getProperty name="clientshelper" property="form3" />
<hr><div class="formaction">
<input type="submit" name="action" value="<%=intl._("Save Plugin Configuration")%>" />
<input type="submit" class="cancel" name="foo" value="<%=intl._("Cancel")%>" />
<input type="submit" name="action" class="accept" value="<%=intl._("Save Plugin Configuration")%>" />
</div></form></div>
<h3><a name="plugin"></a><%=intl._("Plugin Installation")%></h3><p>
@@ -125,7 +129,10 @@ button span.hide{
<p>
<input type="text" size="60" name="pluginURL" >
</p><hr><div class="formaction">
<input type="submit" name="action" value="<%=intl._("Install Plugin")%>" />
<input type="submit" name="action" class="default" value="<%=intl._("Install Plugin")%>" />
<input type="submit" class="cancel" name="foo" value="<%=intl._("Cancel")%>" />
<input type="submit" name="action" class="download" value="<%=intl._("Install Plugin")%>" />
<input type="submit" name="action" class="reload" value="<%=intl._("Update All Installed Plugins")%>" />
</div></form></div>
<% } %>
</div></div></body></html>

View File

@@ -22,9 +22,9 @@
<div class="configure"><h2><%=intl._("Keyring")%></h2><p>
<%=intl._("The router keyring is used to decrypt encrypted leaseSets.")%>
<%=intl._("The keyring may contain keys for local or remote encrypted destinations.")%></p>
<div class="wideload"><p>
<div class="wideload">
<jsp:getProperty name="keyringhelper" property="summary" />
</p></div>
</div>
<form action="" method="POST">
<input type="hidden" name="nonce" value="<jsp:getProperty name="formhandler" property="newNonce" />" >
@@ -33,7 +33,7 @@
<%=intl._("Keys for local destinations must be entered on the")%> <a href="i2ptunnel/"><%=intl._("I2PTunnel page")%></a>.
</p>
<div class="wideload">
<p><table><tr>
<table><tr>
<td class="mediumtags" align="right"><%=intl._("Dest. name, hash, or full key")%>:</td>
<td><textarea name="peer" cols="44" rows="1" style="height: 3em;" wrap="off" spellcheck="false"></textarea></td>
</tr><tr>
@@ -41,7 +41,7 @@
<td><input type="text" size="55" name="key" ></td>
</tr><tr>
<td align="right" colspan="2">
<input type="reset" value="<%=intl._("Cancel")%>" >
<input type="submit" name="action" value="<%=intl._("Delete key")%>" >
<input type="submit" name="action" value="<%=intl._("Add key")%>" >
</td></tr></table></p></div></form></div></div></body></html>
<input type="reset" class="cancel" value="<%=intl._("Cancel")%>" >
<input type="submit" name="action" class="delete" value="<%=intl._("Delete key")%>" >
<input type="submit" name="action" class="add" value="<%=intl._("Add key")%>" >
</td></tr></table></div></form></div></div></body></html>

View File

@@ -26,7 +26,7 @@
<h3><%=intl._("Configure I2P Logging Options")%></h3>
<div class="wideload">
<table border="0" cellspacing="5">
<tr><td class="mediumtags" align="right"><b><%=intl._("Logging filename")%>:</b></td>
<tr><td class="mediumtags" align="right"><b><%=intl._("Log file")%>:</b></td>
<td><input type="text" name="logfilename" size="40" value="<jsp:getProperty name="logginghelper" property="logFilePattern" />" >
<br> <i><%=intl._("(the symbol '@' will be replaced during log rotation)")%></i></td>
</tr><tr><td class="mediumtags" align="right"><b><%=intl._("Log record format")%>:</b></td>
@@ -48,6 +48,6 @@
<td><jsp:getProperty name="logginghelper" property="newClassBox" /></td>
</tr><tr><td colspan="2"><hr></td>
</tr><tr class="tablefooter"><td colspan="2"> <div class="formaction">
<input type="reset" value="<%=intl._("Cancel")%>" >
<input type="submit" name="shouldsave" value="<%=intl._("Save changes")%>" >
<input type="reset" class="cancel" value="<%=intl._("Cancel")%>" >
<input type="submit" name="shouldsave" class="accept" value="<%=intl._("Save changes")%>" >
</div></td></tr></table></div></form></div></div></body></html>

View File

@@ -7,9 +7,9 @@
<jsp:setProperty name="navHelper" property="contextId" value="<%=(String)session.getAttribute("i2p.contextId")%>" />
<% navHelper.storeWriter(out); %>
<div class="confignav" id="confignav">
<center>
<%
// moved to java for ease of translation and to avoid 10 copies
navHelper.renderNavBar(request.getRequestURI());
// allowIFrame variable from summary.jsi
navHelper.renderNavBar(request.getRequestURI(), allowIFrame);
%>
</center></div>
</div>

View File

@@ -0,0 +1,222 @@
<%@page contentType="text/html" %>
<%@page pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head>
<%@include file="css.jsi" %>
<%=intl.title("config networking")%>
</head><body>
<%@include file="summary.jsi" %>
<jsp:useBean class="net.i2p.router.web.ConfigNetHelper" id="nethelper" scope="request" />
<jsp:setProperty name="nethelper" property="contextId" value="<%=(String)session.getAttribute("i2p.contextId")%>" />
<h1><%=intl._("I2P Network Configuration")%></h1>
<div class="main" id="main">
<%@include file="confignav.jsi" %>
<jsp:useBean class="net.i2p.router.web.ConfigNetHandler" id="formhandler" scope="request" />
<% formhandler.storeMethod(request.getMethod()); %>
<jsp:setProperty name="formhandler" property="*" />
<jsp:setProperty name="formhandler" property="contextId" value="<%=(String)session.getAttribute("i2p.contextId")%>" />
<jsp:getProperty name="formhandler" property="allMessages" />
<div class="configure">
<form action="" method="POST">
<input type="hidden" name="nonce" value="<jsp:getProperty name="formhandler" property="newNonce" />" >
<input type="hidden" name="action" value="blah" >
<h3><%=intl._("IP and Transport Configuration")%></h3><p>
<img src="/themes/console/images/itoopie_xsm.png" alt="">
<b><%=intl._("The default settings will work for most people.")%>
<a href="#chelp"><%=intl._("There is help below.")%></a></b>
</p><p><b><%=intl._("UPnP Configuration")%>:</b><br>
<input type="checkbox" class="optbox" name="upnp" value="true" <jsp:getProperty name="nethelper" property="upnpChecked" /> >
<%=intl._("Enable UPnP to open firewall ports")%> - <a href="peers#upnp"><%=intl._("UPnP status")%></a>
</p><p><b><%=intl._("IP Configuration")%>:</b><br>
<%=intl._("Externally reachable hostname or IP address")%>:<br>
<input type="radio" class="optbox" name="udpAutoIP" value="local,upnp,ssu" <%=nethelper.getUdpAutoIPChecked(3) %> >
<%=intl._("Use all auto-detect methods")%><br>
<input type="radio" class="optbox" name="udpAutoIP" value="local,ssu" <%=nethelper.getUdpAutoIPChecked(4) %> >
<%=intl._("Disable UPnP IP address detection")%><br>
<input type="radio" class="optbox" name="udpAutoIP" value="upnp,ssu" <%=nethelper.getUdpAutoIPChecked(5) %> >
<%=intl._("Ignore local interface IP address")%><br>
<input type="radio" class="optbox" name="udpAutoIP" value="ssu" <%=nethelper.getUdpAutoIPChecked(0) %> >
<%=intl._("Use SSU IP address detection only")%><br>
<input type="radio" class="optbox" name="udpAutoIP" value="fixed" <%=nethelper.getUdpAutoIPChecked(1) %> >
<%=intl._("Specify hostname or IP")%>:
<input name ="udpHost1" type="text" size="16" value="<jsp:getProperty name="nethelper" property="udphostname" />" >
<% String[] ips = nethelper.getAddresses();
if (ips.length > 0) {
out.print(intl._("or") + " <select name=\"udpHost2\"><option value=\"\" selected=\"true\">"+intl._("Select Interface")+"</option>\n");
for (int i = 0; i < ips.length; i++) {
out.print("<option value=\"");
out.print(ips[i]);
out.print("\">");
out.print(ips[i]);
out.print("</option>\n");
}
out.print("</select>\n");
}
%>
<br>
<input type="radio" class="optbox" name="udpAutoIP" value="hidden" <%=nethelper.getUdpAutoIPChecked(2) %> >
<%=intl._("Hidden mode - do not publish IP")%> <i><%=intl._("(prevents participating traffic)")%></i><br>
</p><p>
<%=intl._("Action when IP changes")%>:<br>
<input type="checkbox" class="optbox" name="laptop" value="true" <jsp:getProperty name="nethelper" property="laptopChecked" /> >
<%=intl._("Laptop mode - Change router identity and UDP port when IP changes for enhanced anonymity")%>
(<i><%=intl._("Experimental")%></i>)
</p><p><b><%=intl._("UDP Configuration:")%></b><br>
<%=intl._("UDP port:")%>
<input name ="udpPort" type="text" size="5" maxlength="5" value="<jsp:getProperty name="nethelper" property="configuredUdpPort" />" ><br>
<input type="checkbox" class="optbox" name="disableUDP" value="disabled" <%=nethelper.getUdpDisabledChecked() %> >
<%=intl._("Completely disable")%> <i><%=intl._("(select only if behind a firewall that blocks outbound UDP)")%></i><br>
<% /********
<!-- let's keep this simple...
<input type="checkbox" class="optbox" name="requireIntroductions" value="true" <jsp:getProperty name="nethelper" property="requireIntroductionsChecked" /> />
Require SSU introductions
<i>(Enable if you cannot open your firewall)</i>
</p><p>
Current External UDP address: <i><jsp:getProperty name="nethelper" property="udpAddress" /></i><br>
-->
*********/ %>
</p><p>
<b><%=intl._("TCP Configuration")%>:</b><br>
<%=intl._("Externally reachable hostname or IP address")%>:<br>
<input type="radio" class="optbox" name="ntcpAutoIP" value="true" <%=nethelper.getTcpAutoIPChecked(2) %> >
<%=intl._("Use auto-detected IP address")%>
<i>(<%=intl._("currently")%> <jsp:getProperty name="nethelper" property="udpIP" />)</i>
<%=intl._("if we are not firewalled")%><br>
<input type="radio" class="optbox" name="ntcpAutoIP" value="always" <%=nethelper.getTcpAutoIPChecked(3) %> >
<%=intl._("Always use auto-detected IP address (Not firewalled)")%><br>
<input type="radio" class="optbox" name="ntcpAutoIP" value="false" <%=nethelper.getTcpAutoIPChecked(1) %> >
<%=intl._("Specify hostname or IP")%>:
<input name ="ntcphost" type="text" size="16" value="<jsp:getProperty name="nethelper" property="ntcphostname" />" ><br>
<input type="radio" class="optbox" name="ntcpAutoIP" value="false" <%=nethelper.getTcpAutoIPChecked(0) %> >
<%=intl._("Disable inbound (Firewalled)")%><br>
<input type="radio" class="optbox" name="ntcpAutoIP" value="disabled" <%=nethelper.getTcpAutoIPChecked(4) %> >
<%=intl._("Completely disable")%> <i><%=intl._("(select only if behind a firewall that throttles or blocks outbound TCP)")%></i><br>
</p><p>
<%=intl._("Externally reachable TCP port")%>:<br>
<input type="radio" class="optbox" name="ntcpAutoPort" value="2" <%=nethelper.getTcpAutoPortChecked(2) %> >
<%=intl._("Use the same port configured for UDP")%>
<i>(<%=intl._("currently")%> <jsp:getProperty name="nethelper" property="udpPort" />)</i><br>
<input type="radio" class="optbox" name="ntcpAutoPort" value="1" <%=nethelper.getTcpAutoPortChecked(1) %> >
<%=intl._("Specify Port")%>:
<input name ="ntcpport" type="text" size="5" maxlength="5" value="<jsp:getProperty name="nethelper" property="ntcpport" />" ><br>
</p><p><b><%=intl._("Notes")%>: <%=intl._("a) Do not reveal your port numbers to anyone! b) Changing these settings will restart your router.")%></b></p>
<hr><div class="formaction">
<input type="reset" class="cancel" value="<%=intl._("Cancel")%>" >
<input type="submit" class="accept" name="save" value="<%=intl._("Save changes")%>" >
</div><h3><a name="chelp"><%=intl._("Configuration Help")%>:</a></h3><div align="justify"><p>
<%=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.")%>
</p><p>
<%=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.")%>
</p>
<% /********
<!-- let's keep this simple...
<input type="submit" name="recheckReachability" value="Check network reachability..." />
</p>
-->
*********/ %>
<p>
<%=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")%>:
</p>
<ul>
<li class="tidylist"><%=intl._("No UPnP-compatible device present")%>
<li class="tidylist"><%=intl._("UPnP disabled on the device")%>
<li class="tidylist"><%=intl._("Software firewall interference with UPnP")%>
<li class="tidylist"><%=intl._("Bugs in the device's UPnP implementation")%>
<li class="tidylist"><%=intl._("Multiple firewall/routers in the internet connection path")%>
<li class="tidylist"><%=intl._("UPnP device change, reset, or address change")%>
</ul>
<p><a href="peers#upnp"><%=intl._("Review the UPnP status here.")%></a>
<%=intl._("UPnP may be enabled or disabled above, but a change requires a router restart to take effect.")%></p>
<p><%=intl._("Hostnames entered above will be published in the network database.")%>
<%=intl._("They are <b>not private</b>.")%>
<%=intl._("Also, <b>do not enter a private IP address</b> 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.")%>
</p>
<h3><a name="help"><%=intl._("Reachability Help")%>:</a></h3><p>
<%=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 <a href=\"logs.jsp\">logs</a> may also help diagnose the problem.")%>
</p>
<ul>
<li class="tidylist"><b><%=intl._("OK")%></b> -
<%=intl._("Your UDP port does not appear to be firewalled.")%>
<li class="tidylist"><b><%=intl._("Firewalled")%></b> -
<%=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.")%>
<li class="tidylist"><b><%=intl._("Testing")%></b> -
<%=intl._("The router is currently testing whether your UDP port is firewalled.")%>
<li class="tidylist"><b><%=intl._("Hidden")%></b> -
<%=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.")%>
<li class="tidylist"><b><%=intl._("WARN - Firewalled and Fast")%></b> -
<%=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.")%>
<li class="tidylist"><b><%=intl._("WARN - Firewalled and Floodfill")%></b> -
<%=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.")%>
<li class="tidylist"><b><%=intl._("WARN - Firewalled with Inbound TCP Enabled")%></b> -
<%=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.")%>
<li class="tidylist"><b><%=intl._("WARN - Firewalled with UDP Disabled")%></b> -
<%=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.")%>
<li class="tidylist"><b><%=intl._("ERR - Clock Skew")%></b> -
<%=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.")%>
<li class="tidylist"><b><%=intl._("ERR - Private TCP Address")%></b> -
<%=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.")%>
<li class="tidylist"><b><%=intl._("ERR - SymmetricNAT")%></b> -
<%=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.")%>
<li class="tidylist"><b><%=intl._("ERR - UDP Port In Use - Set i2np.udp.internalPort=xxxx in advanced config and restart")%></b> -
<%=intl._("I2P was unable to bind to port 8887 or other configured port.")%>
<%=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.")%>
<li class="tidylist"><b><%=intl._("ERR - UDP Disabled and Inbound TCP host/port not set")%></b> -
<%=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.")%>
<li class="tidylist"><b><%=intl._("ERR - Client Manager I2CP Error - check logs")%></b> -
<%=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.")%>
</ul><hr>
<% /********
<!--
<b>Dynamic Router Keys: </b>
<input type="checkbox" class="optbox" name="dynamicKeys" value="true" <jsp:getProperty name="nethelper" property="dynamicKeysChecked" /> /><br>
<p>
This setting causes your router identity to be regenerated every time your IP address
changes. If you have a dynamic IP this option can speed up your reintegration into
the network (since people will have shitlisted your old router identity), and, for
very weak adversaries, help frustrate trivial
<a href="http://www.i2p.net/how_threatmodel#intersection">intersection
attacks</a> against the NetDB. Your different router identities would only be
'hidden' among other I2P users at your ISP, and further analysis would link
the router identities further.</p>
<p>Note that when I2P detects an IP address change, it will automatically
initiate a restart in order to rekey and to disconnect from peers before they
update their profiles - any long lasting client connections will be disconnected,
though such would likely already be the case anyway, since the IP address changed.
</p>
<br>
-->
*********/ %>
</div></form></div></div></body></html>

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