forked from I2P_Developers/i2p.i2p
Compare commits
193 Commits
i2p-1.7.0
...
i2p-androi
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0e8e8480ea | ||
|
|
8256f61d56 | ||
|
|
ffc5ed8dc2 | ||
|
|
860eb22af7 | ||
|
|
1a050303fa | ||
|
|
ce0c84c5d9 | ||
|
|
b537bd18b0 | ||
|
|
de79f52c81 | ||
|
|
a5bc80da09 | ||
|
|
5f4ad87d10 | ||
|
|
cc56c4b506 | ||
|
|
13efc59916 | ||
|
|
515a9b8d0d | ||
|
|
52958b95d5 | ||
|
|
b36ed7de1a | ||
|
|
693aefe83a | ||
|
|
ed30da0f0f | ||
|
|
81255e19ae | ||
|
|
07dbab9f02 | ||
|
|
bf27bf140d | ||
|
|
3a906a6ce5 | ||
|
|
47e02f7930 | ||
|
|
75b808fcf6 | ||
|
|
5cbdb7d806 | ||
|
|
2c8428d85e | ||
|
|
8fe9d7ac06 | ||
|
|
db8a843e82 | ||
|
|
a730c1acea | ||
|
|
d6aaf3ee3a | ||
|
|
9e4063a161 | ||
|
|
008943f699 | ||
|
|
71a58cb1bf | ||
|
|
4a6f6f8647 | ||
|
|
32bba60bed | ||
|
|
0f3abf0c9e | ||
|
|
5c1b6ba703 | ||
|
|
5e6ec442a7 | ||
|
|
cdf5bec155 | ||
|
|
281bf68098 | ||
|
|
ce2b5639b5 | ||
|
|
4c10b414c4 | ||
|
|
4c15a0e1c4 | ||
|
|
203fbdaa9f | ||
|
|
9431b9cfdc | ||
|
|
2bec84dd88 | ||
|
|
cf7efcada8 | ||
|
|
dda25bf1ed | ||
|
|
04b1bdb453 | ||
|
|
e04d31eb04 | ||
|
|
706ed2ced2 | ||
|
|
bb7278c5f6 | ||
|
|
3edc235104 | ||
|
|
806046df64 | ||
|
|
345c64ebaf | ||
|
|
53eb6ba7e0 | ||
|
|
eaa526583d | ||
|
|
c0b8fe94a8 | ||
|
|
6e5049c1db | ||
|
|
949f619ecc | ||
|
|
f7c3e06db5 | ||
|
|
1a26e1789c | ||
|
|
e40bbc9f18 | ||
|
|
ec72f3cdf6 | ||
|
|
b19998c072 | ||
|
|
66e1c94bee | ||
|
|
0449589406 | ||
|
|
cc85df19aa | ||
|
|
8418bda5a5 | ||
|
|
75492514ca | ||
|
|
e43810f182 | ||
|
|
9d49dc7af7 | ||
|
|
680320dede | ||
|
|
b2d6a091d1 | ||
|
|
5d22a2152a | ||
|
|
acbf849b44 | ||
|
|
7cf9895908 | ||
|
|
d41c39a4d0 | ||
|
|
b1852c127b | ||
|
|
8c59c514b2 | ||
|
|
93493a6d15 | ||
|
|
03e5c6c13c | ||
|
|
826bf3c24f | ||
|
|
68273cd256 | ||
| e130f85a65 | |||
|
|
9385ce7080 | ||
|
|
da190cc24f | ||
|
|
2a6dc58659 | ||
|
|
f4eda0551d | ||
|
|
0560b3221d | ||
|
|
631a6dd2b2 | ||
|
|
0154a87cbf | ||
|
|
4f8ad3b6cb | ||
|
|
458e980e2f | ||
|
|
e08d2f354a | ||
|
|
037e6940a9 | ||
|
|
b3055feff6 | ||
|
|
c520dcb0f6 | ||
|
|
fc88d672c5 | ||
|
|
c62884ef85 | ||
|
|
d9c629a6b1 | ||
|
|
70b7d1204b | ||
|
|
a90bbc3554 | ||
|
|
c2ec6cdeff | ||
|
|
f57abe84bd | ||
|
|
a1ee8220bb | ||
|
|
ce73b9e8da | ||
|
|
e6c3c097b5 | ||
|
|
8961009292 | ||
|
|
de27cb1a46 | ||
|
|
e8afbc5b92 | ||
|
|
587409daa7 | ||
|
|
af5019c8dd | ||
|
|
46bba0fe71 | ||
|
|
049456493f | ||
|
|
2f63762c80 | ||
|
|
ca0d9f5a26 | ||
|
|
aa620f5ed3 | ||
|
|
15bb157126 | ||
|
|
7e3e42ce42 | ||
|
|
981c5e3878 | ||
|
|
393ee71ad9 | ||
|
|
97736cef1c | ||
|
|
25af51faf9 | ||
|
|
a717dfb923 | ||
|
|
e594b9532c | ||
|
|
a7a5b06b5c | ||
|
|
eb72e97c03 | ||
|
|
25cdc988e1 | ||
|
|
3ce669575f | ||
|
|
63aa64f8bb | ||
|
|
a6f61d2bf6 | ||
|
|
9457271ce6 | ||
|
|
22512d3889 | ||
|
|
a7115263f0 | ||
|
|
c4b167b845 | ||
|
|
5e09245234 | ||
|
|
fee38c1c32 | ||
|
|
a1ced67bad | ||
|
|
87f7d470a6 | ||
|
|
32d60858da | ||
|
|
be4ad7eba9 | ||
|
|
7f8fa825ac | ||
|
|
1cd5926f6c | ||
|
|
9c31be66e6 | ||
|
|
0e89b07ae8 | ||
|
|
7b6e6270ba | ||
|
|
9d9310a726 | ||
|
|
0f26baf114 | ||
|
|
5ef93f11a9 | ||
|
|
ce53714ba1 | ||
|
|
50ce3c2856 | ||
|
|
21c1f89249 | ||
|
|
46ef49f2cf | ||
|
|
e53a59b4ac | ||
|
|
a13f2b9768 | ||
|
|
44c30e78fc | ||
|
|
ec63f41b27 | ||
|
|
c19944384e | ||
|
|
0c08a05bce | ||
|
|
7eda9c77af | ||
|
|
66045cebc2 | ||
|
|
2b93dbbf48 | ||
|
|
759f6968f6 | ||
|
|
e3db28542c | ||
|
|
e7f98e9243 | ||
|
|
4908f760d9 | ||
|
|
6bb3657de2 | ||
|
|
dc40755e7c | ||
|
|
140ab47354 | ||
|
|
da887f7c6c | ||
|
|
f4be99ecd0 | ||
|
|
b8407a261e | ||
|
|
969a8a5d8a | ||
|
|
b57d9f2f7e | ||
|
|
c9a97d889b | ||
|
|
51bdd9a283 | ||
|
|
04dd18615c | ||
|
|
265f5ee5df | ||
|
|
9c3f8602da | ||
|
|
74dedcf7f0 | ||
|
|
ae2b99b1c6 | ||
|
|
818ecc3563 | ||
|
|
5ccbeca676 | ||
|
|
a621f56c33 | ||
|
|
1513695768 | ||
|
|
63e202f8f0 | ||
|
|
80535875ad | ||
|
|
f0ad921fd2 | ||
|
|
63f3d88f78 | ||
|
|
9f7f1bbcab | ||
|
|
edc9d6fec5 | ||
|
|
a089156afc | ||
|
|
767a5043ab |
@@ -66,6 +66,7 @@ trans.tr_TR = apps/i2ptunnel/locale-proxy/messages_tr.po
|
||||
trans.uk_UA = apps/i2ptunnel/locale-proxy/messages_uk.po
|
||||
trans.vi = apps/i2ptunnel/locale-proxy/messages_vi.po
|
||||
trans.zh_CN = apps/i2ptunnel/locale-proxy/messages_zh.po
|
||||
trans.zh_TW = apps/i2ptunnel/locale-proxy/messages_zh_TW.po
|
||||
|
||||
[I2P.core]
|
||||
type = PO
|
||||
@@ -479,6 +480,7 @@ trans.sv_SE = installer/resources/locale/po/messages_sv.po
|
||||
trans.tr_TR = installer/resources/locale/po/messages_tr.po
|
||||
trans.uk_UA = installer/resources/locale/po/messages_uk.po
|
||||
trans.zh_CN = installer/resources/locale/po/messages_zh.po
|
||||
trans.zh_TW = installer/resources/locale/po/messages_zh_TW.po
|
||||
|
||||
[I2P.getopt]
|
||||
;;
|
||||
@@ -563,6 +565,7 @@ trans.tk = apps/ministreaming/locale/messages_tk.po
|
||||
trans.tr_TR = apps/ministreaming/locale/messages_tr.po
|
||||
trans.uk_UA = apps/ministreaming/locale/messages_uk.po
|
||||
trans.zh_CN = apps/ministreaming/locale/messages_zh.po
|
||||
trans.zh_TW = apps/ministreaming/locale/messages_zh_TW.po
|
||||
|
||||
[I2P.manpages]
|
||||
;;
|
||||
@@ -592,6 +595,7 @@ trans.ru_RU = installer/resources/locale-man/man_ru.po
|
||||
trans.sv_SE = installer/resources/locale-man/man_sv.po
|
||||
trans.tr_TR = installer/resources/locale-man/man_tr.po
|
||||
trans.zh_CN = installer/resources/locale-man/man_zh.po
|
||||
trans.zh_TW = installer/resources/locale-man/man_zh_TW.po
|
||||
|
||||
[I2P.eepsite]
|
||||
;;
|
||||
@@ -650,6 +654,7 @@ trans.sl = apps/routerconsole/resources/docs/readme_sl.html
|
||||
trans.tr_TR = apps/routerconsole/resources/docs/readme_tr.html
|
||||
trans.uk_UA = apps/routerconsole/resources/docs/readme_uk.html
|
||||
trans.zh_CN = apps/routerconsole/resources/docs/readme_zh.html
|
||||
trans.zh_TW = apps/routerconsole/resources/docs/readme_zh_TW.html
|
||||
|
||||
[main]
|
||||
host = https://www.transifex.com
|
||||
|
||||
@@ -212,10 +212,6 @@ Applications:
|
||||
Copyright (c) 2006, Matthew Estes
|
||||
See licenses/LICENSE-BlockFile.txt
|
||||
|
||||
BOB (BOB.jar):
|
||||
Copyright (C) sponge
|
||||
See licenses/COPYING-BOB.txt
|
||||
|
||||
Desktopgui (desktopgui.jar):
|
||||
Copyright (c) Mathias De Maré
|
||||
See licenses/LICENSE-DesktopGUI.txt
|
||||
@@ -339,9 +335,9 @@ Applications:
|
||||
Systray (systray.jar):
|
||||
Public domain.
|
||||
|
||||
Tomcat 9.0.54 (jasper-runtime.jar):
|
||||
Tomcat 9.0.62 (jasper-runtime.jar):
|
||||
(not included in most distribution packages)
|
||||
Copyright 1999-2021 The Apache Software Foundation
|
||||
Copyright 1999-2022 The Apache Software Foundation
|
||||
See licenses/LICENSE-Apache2.0.txt
|
||||
See licenses/NOTICE-Tomcat.txt
|
||||
|
||||
|
||||
@@ -1,14 +0,0 @@
|
||||
#bob.config
|
||||
#Tue Dec 30 00:00:00 UTC 2008
|
||||
# Please leave this file here for testing.
|
||||
# Thank you,
|
||||
# Sponge
|
||||
i2cp.tcp.port=7654
|
||||
BOB.host=localhost
|
||||
inbound.lengthVariance=0
|
||||
i2cp.messageReliability=BestEffort
|
||||
BOB.port=45678
|
||||
outbound.length=1
|
||||
inbound.length=1
|
||||
outbound.lengthVariance=0
|
||||
i2cp.tcp.host=localhost
|
||||
@@ -1,12 +0,0 @@
|
||||
sourceSets {
|
||||
main {
|
||||
java {
|
||||
srcDir 'src'
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
dependencies {
|
||||
compile project(':core')
|
||||
compile project(':apps:ministreaming')
|
||||
}
|
||||
@@ -1,115 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!-- You may freely edit this file. See commented blocks below for -->
|
||||
<!-- some examples of how to customize the build. -->
|
||||
<!-- (If you delete it and reopen the project it will be recreated.) -->
|
||||
<!-- By default, only the Clean and Build commands use this build script. -->
|
||||
<!-- Commands such as Run, Debug, and Test only use this build script if -->
|
||||
<!-- the Compile on Save feature is turned off for the project. -->
|
||||
<!-- You can turn off the Compile on Save (or Deploy on Save) setting -->
|
||||
<!-- in the project's Project Properties dialog box.-->
|
||||
<project name="BOB" default="default" basedir=".">
|
||||
<description>Builds, tests, and runs the project BOB.</description>
|
||||
<import file="nbproject/build-impl.xml"/>
|
||||
<!--
|
||||
|
||||
There exist several targets which are by default empty and which can be
|
||||
used for execution of your tasks. These targets are usually executed
|
||||
before and after some main targets. They are:
|
||||
|
||||
-pre-init: called before initialization of project properties
|
||||
-post-init: called after initialization of project properties
|
||||
-pre-compile: called before javac compilation
|
||||
-post-compile: called after javac compilation
|
||||
-pre-compile-single: called before javac compilation of single file
|
||||
-post-compile-single: called after javac compilation of single file
|
||||
-pre-compile-test: called before javac compilation of JUnit tests
|
||||
-post-compile-test: called after javac compilation of JUnit tests
|
||||
-pre-compile-test-single: called before javac compilation of single JUnit test
|
||||
-post-compile-test-single: called after javac compilation of single JUunit test
|
||||
-pre-jar: called before JAR building
|
||||
-post-jar: called after JAR building
|
||||
-post-clean: called after cleaning build products
|
||||
|
||||
(Targets beginning with '-' are not intended to be called on their own.)
|
||||
|
||||
Example of inserting an obfuscator after compilation could look like this:
|
||||
|
||||
<target name="-post-compile">
|
||||
<obfuscate>
|
||||
<fileset dir="${build.classes.dir}"/>
|
||||
</obfuscate>
|
||||
</target>
|
||||
|
||||
For list of available properties check the imported
|
||||
nbproject/build-impl.xml file.
|
||||
|
||||
|
||||
Another way to customize the build is by overriding existing main targets.
|
||||
The targets of interest are:
|
||||
|
||||
-init-macrodef-javac: defines macro for javac compilation
|
||||
-init-macrodef-junit: defines macro for junit execution
|
||||
-init-macrodef-debug: defines macro for class debugging
|
||||
-init-macrodef-java: defines macro for class execution
|
||||
-do-jar-with-manifest: JAR building (if you are using a manifest)
|
||||
-do-jar-without-manifest: JAR building (if you are not using a manifest)
|
||||
run: execution of project
|
||||
-javadoc-build: Javadoc generation
|
||||
test-report: JUnit report generation
|
||||
|
||||
An example of overriding the target for project execution could look like this:
|
||||
|
||||
<target name="run" depends="BOB-impl.jar">
|
||||
<exec dir="bin" executable="launcher.exe">
|
||||
<arg file="${dist.jar}"/>
|
||||
</exec>
|
||||
</target>
|
||||
|
||||
Notice that the overridden target depends on the jar target and not only on
|
||||
the compile target as the regular run target does. Again, for a list of available
|
||||
properties which you can use, check the target you are overriding in the
|
||||
nbproject/build-impl.xml file.
|
||||
|
||||
-->
|
||||
|
||||
<target depends="jar" description="Build BOB into a SINGLE JAR." name="onejar">
|
||||
<!-- Make needed working dirs -->
|
||||
<mkdir dir="${dist.dir}/lib" />
|
||||
<mkdir dir="${dist.dir}/classes" />
|
||||
|
||||
<!-- Copy jars -->
|
||||
<copy todir="${dist.dir}/lib" flatten="true" >
|
||||
<path>
|
||||
<pathelement path="${javac.classpath}" />
|
||||
</path>
|
||||
</copy>
|
||||
<copy todir="${dist.dir}/lib" file="../../build/jbigi.jar" />
|
||||
|
||||
<!-- Extract the classes inside the jar files -->
|
||||
<unjar dest="${dist.dir}/classes" >
|
||||
<fileset dir="${dist.dir}/lib" >
|
||||
<include name="**/*.jar" />
|
||||
</fileset>
|
||||
</unjar>
|
||||
|
||||
<!-- Recombine the classes into a new jar file -->
|
||||
<jar jarfile="${dist.dir}/lib/all-in-one.jar" >
|
||||
<fileset dir="${dist.dir}/classes" />
|
||||
</jar>
|
||||
|
||||
<!-- Clean up work area -->
|
||||
<delete dir="${dist.dir}/classes" followsymlinks="false" includeemptydirs="true"/>
|
||||
|
||||
<!-- Make the single jar file -->
|
||||
<jar jarfile="dist/BOB-one.jar" >
|
||||
<zipfileset src="${dist.jar}" excludes="META-INF/*" />
|
||||
<zipfileset src="${dist.dir}/lib/all-in-one.jar" excludes="**/META-INF/*" />
|
||||
<manifest>
|
||||
<attribute name="Main-Class" value="net.i2p.BOB.Main" />
|
||||
</manifest>
|
||||
</jar>
|
||||
|
||||
<!-- Clean up the fake jar file -->
|
||||
<delete file="${dist.dir}/lib/all-in-one.jar" />
|
||||
</target>
|
||||
</project>
|
||||
@@ -1,3 +0,0 @@
|
||||
Manifest-Version: 1.0
|
||||
X-COMMENT: Main-Class will be added automatically by build
|
||||
|
||||
@@ -1,643 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!--
|
||||
*** GENERATED FROM project.xml - DO NOT EDIT ***
|
||||
*** EDIT ../build.xml INSTEAD ***
|
||||
|
||||
For the purpose of easier reading the script
|
||||
is divided into following sections:
|
||||
|
||||
- initialization
|
||||
- compilation
|
||||
- jar
|
||||
- execution
|
||||
- debugging
|
||||
- javadoc
|
||||
- junit compilation
|
||||
- junit execution
|
||||
- junit debugging
|
||||
- applet
|
||||
- cleanup
|
||||
|
||||
-->
|
||||
<project xmlns:j2seproject1="http://www.netbeans.org/ns/j2se-project/1" xmlns:j2seproject3="http://www.netbeans.org/ns/j2se-project/3" xmlns:jaxrpc="http://www.netbeans.org/ns/j2se-project/jax-rpc" basedir=".." default="default" name="BOB-impl">
|
||||
<target depends="test,jar,javadoc" description="Build and test whole project." name="default"/>
|
||||
<!--
|
||||
======================
|
||||
INITIALIZATION SECTION
|
||||
======================
|
||||
-->
|
||||
<target name="-pre-init">
|
||||
<!-- Empty placeholder for easier customization. -->
|
||||
<!-- You can override this target in the ../build.xml file. -->
|
||||
</target>
|
||||
<target depends="-pre-init" name="-init-private">
|
||||
<property file="nbproject/private/config.properties"/>
|
||||
<property file="nbproject/private/configs/${config}.properties"/>
|
||||
<property file="nbproject/private/private.properties"/>
|
||||
</target>
|
||||
<target depends="-pre-init,-init-private" name="-init-user">
|
||||
<property file="${user.properties.file}"/>
|
||||
<!-- The two properties below are usually overridden -->
|
||||
<!-- by the active platform. Just a fallback. -->
|
||||
<property name="default.javac.source" value="1.8"/>
|
||||
<property name="default.javac.target" value="1.8"/>
|
||||
<property name="javac.release" value="8"/>
|
||||
</target>
|
||||
<target depends="-pre-init,-init-private,-init-user" name="-init-project">
|
||||
<property file="nbproject/configs/${config}.properties"/>
|
||||
<property file="nbproject/project.properties"/>
|
||||
</target>
|
||||
<target depends="-pre-init,-init-private,-init-user,-init-project,-init-macrodef-property" name="-do-init">
|
||||
<available file="${manifest.file}" property="manifest.available"/>
|
||||
<condition property="manifest.available+main.class">
|
||||
<and>
|
||||
<isset property="manifest.available"/>
|
||||
<isset property="main.class"/>
|
||||
<not>
|
||||
<equals arg1="${main.class}" arg2="" trim="true"/>
|
||||
</not>
|
||||
</and>
|
||||
</condition>
|
||||
<condition property="manifest.available+main.class+mkdist.available">
|
||||
<and>
|
||||
<istrue value="${manifest.available+main.class}"/>
|
||||
<isset property="libs.CopyLibs.classpath"/>
|
||||
</and>
|
||||
</condition>
|
||||
<condition property="have.tests">
|
||||
<or>
|
||||
<available file="${test.src.dir}"/>
|
||||
</or>
|
||||
</condition>
|
||||
<condition property="have.sources">
|
||||
<or>
|
||||
<available file="${src.dir}"/>
|
||||
</or>
|
||||
</condition>
|
||||
<condition property="netbeans.home+have.tests">
|
||||
<and>
|
||||
<isset property="netbeans.home"/>
|
||||
<isset property="have.tests"/>
|
||||
</and>
|
||||
</condition>
|
||||
<condition property="no.javadoc.preview">
|
||||
<and>
|
||||
<isset property="javadoc.preview"/>
|
||||
<isfalse value="${javadoc.preview}"/>
|
||||
</and>
|
||||
</condition>
|
||||
<property name="run.jvmargs" value=""/>
|
||||
<property name="javac.compilerargs" value=""/>
|
||||
<property name="work.dir" value="${basedir}"/>
|
||||
<condition property="no.deps">
|
||||
<and>
|
||||
<istrue value="${no.dependencies}"/>
|
||||
</and>
|
||||
</condition>
|
||||
<property name="javac.debug" value="true"/>
|
||||
<property name="javadoc.preview" value="true"/>
|
||||
<property name="application.args" value=""/>
|
||||
<property name="source.encoding" value="${file.encoding}"/>
|
||||
<condition property="javadoc.encoding.used" value="${javadoc.encoding}">
|
||||
<and>
|
||||
<isset property="javadoc.encoding"/>
|
||||
<not>
|
||||
<equals arg1="${javadoc.encoding}" arg2=""/>
|
||||
</not>
|
||||
</and>
|
||||
</condition>
|
||||
<property name="javadoc.encoding.used" value="${source.encoding}"/>
|
||||
<property name="includes" value="**"/>
|
||||
<property name="excludes" value=""/>
|
||||
<property name="do.depend" value="false"/>
|
||||
<condition property="do.depend.true">
|
||||
<istrue value="${do.depend}"/>
|
||||
</condition>
|
||||
<condition else="" property="javac.compilerargs.jaxws" value="-Djava.endorsed.dirs='${jaxws.endorsed.dir}'">
|
||||
<and>
|
||||
<isset property="jaxws.endorsed.dir"/>
|
||||
<available file="nbproject/jaxws-build.xml"/>
|
||||
</and>
|
||||
</condition>
|
||||
</target>
|
||||
<target name="-post-init">
|
||||
<!-- Empty placeholder for easier customization. -->
|
||||
<!-- You can override this target in the ../build.xml file. -->
|
||||
</target>
|
||||
<target depends="-pre-init,-init-private,-init-user,-init-project,-do-init" name="-init-check">
|
||||
<fail unless="src.dir">Must set src.dir</fail>
|
||||
<fail unless="test.src.dir">Must set test.src.dir</fail>
|
||||
<fail unless="build.dir">Must set build.dir</fail>
|
||||
<fail unless="dist.dir">Must set dist.dir</fail>
|
||||
<fail unless="build.classes.dir">Must set build.classes.dir</fail>
|
||||
<fail unless="dist.javadoc.dir">Must set dist.javadoc.dir</fail>
|
||||
<fail unless="build.test.classes.dir">Must set build.test.classes.dir</fail>
|
||||
<fail unless="build.test.results.dir">Must set build.test.results.dir</fail>
|
||||
<fail unless="build.classes.excludes">Must set build.classes.excludes</fail>
|
||||
<fail unless="dist.jar">Must set dist.jar</fail>
|
||||
</target>
|
||||
<target name="-init-macrodef-property">
|
||||
<macrodef name="property" uri="http://www.netbeans.org/ns/j2se-project/1">
|
||||
<attribute name="name"/>
|
||||
<attribute name="value"/>
|
||||
<sequential>
|
||||
<property name="@{name}" value="${@{value}}"/>
|
||||
</sequential>
|
||||
</macrodef>
|
||||
</target>
|
||||
<target name="-init-macrodef-javac">
|
||||
<macrodef name="javac" uri="http://www.netbeans.org/ns/j2se-project/3">
|
||||
<attribute default="${src.dir}" name="srcdir"/>
|
||||
<attribute default="${build.classes.dir}" name="destdir"/>
|
||||
<attribute default="${javac.classpath}" name="classpath"/>
|
||||
<attribute default="${includes}" name="includes"/>
|
||||
<attribute default="${excludes}" name="excludes"/>
|
||||
<attribute default="${javac.debug}" name="debug"/>
|
||||
<attribute default="/does/not/exist" name="sourcepath"/>
|
||||
<element name="customize" optional="true"/>
|
||||
<sequential>
|
||||
<javac debug="@{debug}" deprecation="${javac.deprecation}" destdir="@{destdir}" encoding="${source.encoding}" excludes="@{excludes}" includeantruntime="false" includes="@{includes}" source="${javac.source}" sourcepath="@{sourcepath}" srcdir="@{srcdir}" target="${javac.target}" release="${javac.release}">
|
||||
<classpath>
|
||||
<path path="@{classpath}"/>
|
||||
</classpath>
|
||||
<compilerarg line="${javac.compilerargs} ${javac.compilerargs.jaxws}"/>
|
||||
<customize/>
|
||||
</javac>
|
||||
</sequential>
|
||||
</macrodef>
|
||||
<macrodef name="depend" uri="http://www.netbeans.org/ns/j2se-project/3">
|
||||
<attribute default="${src.dir}" name="srcdir"/>
|
||||
<attribute default="${build.classes.dir}" name="destdir"/>
|
||||
<attribute default="${javac.classpath}" name="classpath"/>
|
||||
<sequential>
|
||||
<depend cache="${build.dir}/depcache" destdir="@{destdir}" excludes="${excludes}" includes="${includes}" srcdir="@{srcdir}">
|
||||
<classpath>
|
||||
<path path="@{classpath}"/>
|
||||
</classpath>
|
||||
</depend>
|
||||
</sequential>
|
||||
</macrodef>
|
||||
<macrodef name="force-recompile" uri="http://www.netbeans.org/ns/j2se-project/3">
|
||||
<attribute default="${build.classes.dir}" name="destdir"/>
|
||||
<sequential>
|
||||
<fail unless="javac.includes">Must set javac.includes</fail>
|
||||
<pathconvert pathsep="," property="javac.includes.binary">
|
||||
<path>
|
||||
<filelist dir="@{destdir}" files="${javac.includes}"/>
|
||||
</path>
|
||||
<globmapper from="*.java" to="*.class"/>
|
||||
</pathconvert>
|
||||
<delete>
|
||||
<files includes="${javac.includes.binary}"/>
|
||||
</delete>
|
||||
</sequential>
|
||||
</macrodef>
|
||||
</target>
|
||||
<target name="-init-macrodef-junit">
|
||||
<macrodef name="junit" uri="http://www.netbeans.org/ns/j2se-project/3">
|
||||
<attribute default="${includes}" name="includes"/>
|
||||
<attribute default="${excludes}" name="excludes"/>
|
||||
<attribute default="**" name="testincludes"/>
|
||||
<sequential>
|
||||
<junit dir="${work.dir}" errorproperty="tests.failed" failureproperty="tests.failed" fork="true" showoutput="true">
|
||||
<batchtest todir="${build.test.results.dir}">
|
||||
<fileset dir="${test.src.dir}" excludes="@{excludes},${excludes}" includes="@{includes}">
|
||||
<filename name="@{testincludes}"/>
|
||||
</fileset>
|
||||
</batchtest>
|
||||
<classpath>
|
||||
<path path="${run.test.classpath}"/>
|
||||
</classpath>
|
||||
<syspropertyset>
|
||||
<propertyref prefix="test-sys-prop."/>
|
||||
<mapper from="test-sys-prop.*" to="*" type="glob"/>
|
||||
</syspropertyset>
|
||||
<formatter type="brief" usefile="false"/>
|
||||
<formatter type="xml"/>
|
||||
<jvmarg line="${run.jvmargs}"/>
|
||||
</junit>
|
||||
</sequential>
|
||||
</macrodef>
|
||||
</target>
|
||||
<target depends="-init-debug-args" name="-init-macrodef-nbjpda">
|
||||
<macrodef name="nbjpdastart" uri="http://www.netbeans.org/ns/j2se-project/1">
|
||||
<attribute default="${main.class}" name="name"/>
|
||||
<attribute default="${debug.classpath}" name="classpath"/>
|
||||
<attribute default="" name="stopclassname"/>
|
||||
<sequential>
|
||||
<nbjpdastart addressproperty="jpda.address" name="@{name}" stopclassname="@{stopclassname}" transport="${debug-transport}">
|
||||
<classpath>
|
||||
<path path="@{classpath}"/>
|
||||
</classpath>
|
||||
</nbjpdastart>
|
||||
</sequential>
|
||||
</macrodef>
|
||||
<macrodef name="nbjpdareload" uri="http://www.netbeans.org/ns/j2se-project/1">
|
||||
<attribute default="${build.classes.dir}" name="dir"/>
|
||||
<sequential>
|
||||
<nbjpdareload>
|
||||
<fileset dir="@{dir}" includes="${fix.classes}">
|
||||
<include name="${fix.includes}*.class"/>
|
||||
</fileset>
|
||||
</nbjpdareload>
|
||||
</sequential>
|
||||
</macrodef>
|
||||
</target>
|
||||
<target name="-init-debug-args">
|
||||
<property name="version-output" value="java version "${ant.java.version}"/>
|
||||
<condition property="have-jdk-older-than-1.4">
|
||||
<or>
|
||||
<contains string="${version-output}" substring="java version "1.0"/>
|
||||
<contains string="${version-output}" substring="java version "1.1"/>
|
||||
<contains string="${version-output}" substring="java version "1.2"/>
|
||||
<contains string="${version-output}" substring="java version "1.3"/>
|
||||
</or>
|
||||
</condition>
|
||||
<condition else="-Xdebug" property="debug-args-line" value="-Xdebug -Xnoagent -Djava.compiler=none">
|
||||
<istrue value="${have-jdk-older-than-1.4}"/>
|
||||
</condition>
|
||||
<condition else="dt_socket" property="debug-transport-by-os" value="dt_shmem">
|
||||
<os family="windows"/>
|
||||
</condition>
|
||||
<condition else="${debug-transport-by-os}" property="debug-transport" value="${debug.transport}">
|
||||
<isset property="debug.transport"/>
|
||||
</condition>
|
||||
</target>
|
||||
<target depends="-init-debug-args" name="-init-macrodef-debug">
|
||||
<macrodef name="debug" uri="http://www.netbeans.org/ns/j2se-project/3">
|
||||
<attribute default="${main.class}" name="classname"/>
|
||||
<attribute default="${debug.classpath}" name="classpath"/>
|
||||
<element name="customize" optional="true"/>
|
||||
<sequential>
|
||||
<java classname="@{classname}" dir="${work.dir}" fork="true">
|
||||
<jvmarg line="${debug-args-line}"/>
|
||||
<jvmarg value="-Xrunjdwp:transport=${debug-transport},address=${jpda.address}"/>
|
||||
<jvmarg line="${run.jvmargs}"/>
|
||||
<classpath>
|
||||
<path path="@{classpath}"/>
|
||||
</classpath>
|
||||
<syspropertyset>
|
||||
<propertyref prefix="run-sys-prop."/>
|
||||
<mapper from="run-sys-prop.*" to="*" type="glob"/>
|
||||
</syspropertyset>
|
||||
<customize/>
|
||||
</java>
|
||||
</sequential>
|
||||
</macrodef>
|
||||
</target>
|
||||
<target name="-init-macrodef-java">
|
||||
<macrodef name="java" uri="http://www.netbeans.org/ns/j2se-project/1">
|
||||
<attribute default="${main.class}" name="classname"/>
|
||||
<element name="customize" optional="true"/>
|
||||
<sequential>
|
||||
<java classname="@{classname}" dir="${work.dir}" fork="true">
|
||||
<jvmarg line="${run.jvmargs}"/>
|
||||
<classpath>
|
||||
<path path="${run.classpath}"/>
|
||||
</classpath>
|
||||
<syspropertyset>
|
||||
<propertyref prefix="run-sys-prop."/>
|
||||
<mapper from="run-sys-prop.*" to="*" type="glob"/>
|
||||
</syspropertyset>
|
||||
<customize/>
|
||||
</java>
|
||||
</sequential>
|
||||
</macrodef>
|
||||
</target>
|
||||
<target name="-init-presetdef-jar">
|
||||
<presetdef name="jar" uri="http://www.netbeans.org/ns/j2se-project/1">
|
||||
<jar compress="${jar.compress}" jarfile="${dist.jar}">
|
||||
<j2seproject1:fileset dir="${build.classes.dir}"/>
|
||||
</jar>
|
||||
</presetdef>
|
||||
</target>
|
||||
<target depends="-pre-init,-init-private,-init-user,-init-project,-do-init,-post-init,-init-check,-init-macrodef-property,-init-macrodef-javac,-init-macrodef-junit,-init-macrodef-nbjpda,-init-macrodef-debug,-init-macrodef-java,-init-presetdef-jar" name="init"/>
|
||||
<!--
|
||||
===================
|
||||
COMPILATION SECTION
|
||||
===================
|
||||
-->
|
||||
<target depends="init" name="deps-jar" unless="no.deps"/>
|
||||
<target depends="init,-check-automatic-build,-clean-after-automatic-build" name="-verify-automatic-build"/>
|
||||
<target depends="init" name="-check-automatic-build">
|
||||
<available file="${build.classes.dir}/.netbeans_automatic_build" property="netbeans.automatic.build"/>
|
||||
</target>
|
||||
<target depends="init" if="netbeans.automatic.build" name="-clean-after-automatic-build">
|
||||
<antcall target="clean"/>
|
||||
</target>
|
||||
<target depends="init,deps-jar" name="-pre-pre-compile">
|
||||
<mkdir dir="${build.classes.dir}"/>
|
||||
</target>
|
||||
<target name="-pre-compile">
|
||||
<!-- Empty placeholder for easier customization. -->
|
||||
<!-- You can override this target in the ../build.xml file. -->
|
||||
</target>
|
||||
<target if="do.depend.true" name="-compile-depend">
|
||||
<j2seproject3:depend/>
|
||||
</target>
|
||||
<target depends="init,deps-jar,-pre-pre-compile,-pre-compile,-compile-depend" if="have.sources" name="-do-compile">
|
||||
<j2seproject3:javac/>
|
||||
<copy todir="${build.classes.dir}">
|
||||
<fileset dir="${src.dir}" excludes="${build.classes.excludes},${excludes}" includes="${includes}"/>
|
||||
</copy>
|
||||
</target>
|
||||
<target name="-post-compile">
|
||||
<!-- Empty placeholder for easier customization. -->
|
||||
<!-- You can override this target in the ../build.xml file. -->
|
||||
</target>
|
||||
<target depends="init,deps-jar,-verify-automatic-build,-pre-pre-compile,-pre-compile,-do-compile,-post-compile" description="Compile project." name="compile"/>
|
||||
<target name="-pre-compile-single">
|
||||
<!-- Empty placeholder for easier customization. -->
|
||||
<!-- You can override this target in the ../build.xml file. -->
|
||||
</target>
|
||||
<target depends="init,deps-jar,-pre-pre-compile" name="-do-compile-single">
|
||||
<fail unless="javac.includes">Must select some files in the IDE or set javac.includes</fail>
|
||||
<j2seproject3:force-recompile/>
|
||||
<j2seproject3:javac excludes="" includes="${javac.includes}" sourcepath="${src.dir}"/>
|
||||
</target>
|
||||
<target name="-post-compile-single">
|
||||
<!-- Empty placeholder for easier customization. -->
|
||||
<!-- You can override this target in the ../build.xml file. -->
|
||||
</target>
|
||||
<target depends="init,deps-jar,-verify-automatic-build,-pre-pre-compile,-pre-compile-single,-do-compile-single,-post-compile-single" name="compile-single"/>
|
||||
<!--
|
||||
====================
|
||||
JAR BUILDING SECTION
|
||||
====================
|
||||
-->
|
||||
<target depends="init" name="-pre-pre-jar">
|
||||
<dirname file="${dist.jar}" property="dist.jar.dir"/>
|
||||
<mkdir dir="${dist.jar.dir}"/>
|
||||
</target>
|
||||
<target name="-pre-jar">
|
||||
<!-- Empty placeholder for easier customization. -->
|
||||
<!-- You can override this target in the ../build.xml file. -->
|
||||
</target>
|
||||
<target depends="init,compile,-pre-pre-jar,-pre-jar" name="-do-jar-without-manifest" unless="manifest.available">
|
||||
<j2seproject1:jar/>
|
||||
</target>
|
||||
<target depends="init,compile,-pre-pre-jar,-pre-jar" if="manifest.available" name="-do-jar-with-manifest" unless="manifest.available+main.class">
|
||||
<j2seproject1:jar manifest="${manifest.file}"/>
|
||||
</target>
|
||||
<target depends="init,compile,-pre-pre-jar,-pre-jar" if="manifest.available+main.class" name="-do-jar-with-mainclass" unless="manifest.available+main.class+mkdist.available">
|
||||
<j2seproject1:jar manifest="${manifest.file}">
|
||||
<j2seproject1:manifest>
|
||||
<j2seproject1:attribute name="Main-Class" value="${main.class}"/>
|
||||
</j2seproject1:manifest>
|
||||
</j2seproject1:jar>
|
||||
<echo>To run this application from the command line without Ant, try:</echo>
|
||||
<property location="${build.classes.dir}" name="build.classes.dir.resolved"/>
|
||||
<property location="${dist.jar}" name="dist.jar.resolved"/>
|
||||
<pathconvert property="run.classpath.with.dist.jar">
|
||||
<path path="${run.classpath}"/>
|
||||
<map from="${build.classes.dir.resolved}" to="${dist.jar.resolved}"/>
|
||||
</pathconvert>
|
||||
<echo>java -cp "${run.classpath.with.dist.jar}" ${main.class}</echo>
|
||||
</target>
|
||||
<target depends="init,compile,-pre-pre-jar,-pre-jar" if="manifest.available+main.class+mkdist.available" name="-do-jar-with-libraries">
|
||||
<property location="${build.classes.dir}" name="build.classes.dir.resolved"/>
|
||||
<pathconvert property="run.classpath.without.build.classes.dir">
|
||||
<path path="${run.classpath}"/>
|
||||
<map from="${build.classes.dir.resolved}" to=""/>
|
||||
</pathconvert>
|
||||
<pathconvert pathsep=" " property="jar.classpath">
|
||||
<path path="${run.classpath.without.build.classes.dir}"/>
|
||||
<chainedmapper>
|
||||
<flattenmapper/>
|
||||
<globmapper from="*" to="lib/*"/>
|
||||
</chainedmapper>
|
||||
</pathconvert>
|
||||
<taskdef classname="org.netbeans.modules.java.j2seproject.copylibstask.CopyLibs" classpath="${libs.CopyLibs.classpath}" name="copylibs"/>
|
||||
<copylibs compress="${jar.compress}" jarfile="${dist.jar}" manifest="${manifest.file}" runtimeclasspath="${run.classpath.without.build.classes.dir}">
|
||||
<fileset dir="${build.classes.dir}"/>
|
||||
<manifest>
|
||||
<attribute name="Main-Class" value="${main.class}"/>
|
||||
<attribute name="Class-Path" value="${jar.classpath}"/>
|
||||
</manifest>
|
||||
</copylibs>
|
||||
<echo>To run this application from the command line without Ant, try:</echo>
|
||||
<property location="${dist.jar}" name="dist.jar.resolved"/>
|
||||
<echo>java -jar "${dist.jar.resolved}"</echo>
|
||||
</target>
|
||||
<target name="-post-jar">
|
||||
<!-- Empty placeholder for easier customization. -->
|
||||
<!-- You can override this target in the ../build.xml file. -->
|
||||
</target>
|
||||
<target depends="init,compile,-pre-jar,-do-jar-with-manifest,-do-jar-without-manifest,-do-jar-with-mainclass,-do-jar-with-libraries,-post-jar" description="Build JAR." name="jar"/>
|
||||
<!--
|
||||
=================
|
||||
EXECUTION SECTION
|
||||
=================
|
||||
-->
|
||||
<target depends="init,compile" description="Run a main class." name="run">
|
||||
<j2seproject1:java>
|
||||
<customize>
|
||||
<arg line="${application.args}"/>
|
||||
</customize>
|
||||
</j2seproject1:java>
|
||||
</target>
|
||||
<target name="-do-not-recompile">
|
||||
<property name="javac.includes.binary" value=""/>
|
||||
</target>
|
||||
<target depends="init,-do-not-recompile,compile-single" name="run-single">
|
||||
<fail unless="run.class">Must select one file in the IDE or set run.class</fail>
|
||||
<j2seproject1:java classname="${run.class}"/>
|
||||
</target>
|
||||
<!--
|
||||
=================
|
||||
DEBUGGING SECTION
|
||||
=================
|
||||
-->
|
||||
<target depends="init" if="netbeans.home" name="-debug-start-debugger">
|
||||
<j2seproject1:nbjpdastart name="${debug.class}"/>
|
||||
</target>
|
||||
<target depends="init,compile" name="-debug-start-debuggee">
|
||||
<j2seproject3:debug>
|
||||
<customize>
|
||||
<arg line="${application.args}"/>
|
||||
</customize>
|
||||
</j2seproject3:debug>
|
||||
</target>
|
||||
<target depends="init,compile,-debug-start-debugger,-debug-start-debuggee" description="Debug project in IDE." if="netbeans.home" name="debug"/>
|
||||
<target depends="init" if="netbeans.home" name="-debug-start-debugger-stepinto">
|
||||
<j2seproject1:nbjpdastart stopclassname="${main.class}"/>
|
||||
</target>
|
||||
<target depends="init,compile,-debug-start-debugger-stepinto,-debug-start-debuggee" if="netbeans.home" name="debug-stepinto"/>
|
||||
<target depends="init,compile-single" if="netbeans.home" name="-debug-start-debuggee-single">
|
||||
<fail unless="debug.class">Must select one file in the IDE or set debug.class</fail>
|
||||
<j2seproject3:debug classname="${debug.class}"/>
|
||||
</target>
|
||||
<target depends="init,-do-not-recompile,compile-single,-debug-start-debugger,-debug-start-debuggee-single" if="netbeans.home" name="debug-single"/>
|
||||
<target depends="init" name="-pre-debug-fix">
|
||||
<fail unless="fix.includes">Must set fix.includes</fail>
|
||||
<property name="javac.includes" value="${fix.includes}.java"/>
|
||||
</target>
|
||||
<target depends="init,-pre-debug-fix,compile-single" if="netbeans.home" name="-do-debug-fix">
|
||||
<j2seproject1:nbjpdareload/>
|
||||
</target>
|
||||
<target depends="init,-pre-debug-fix,-do-debug-fix" if="netbeans.home" name="debug-fix"/>
|
||||
<!--
|
||||
===============
|
||||
JAVADOC SECTION
|
||||
===============
|
||||
-->
|
||||
<target depends="init" name="-javadoc-build">
|
||||
<mkdir dir="${dist.javadoc.dir}"/>
|
||||
<javadoc additionalparam="${javadoc.additionalparam}" author="${javadoc.author}" charset="UTF-8" destdir="${dist.javadoc.dir}" docencoding="UTF-8" encoding="${javadoc.encoding.used}" failonerror="true" noindex="${javadoc.noindex}" nonavbar="${javadoc.nonavbar}" notree="${javadoc.notree}" private="${javadoc.private}" source="${javac.source}" splitindex="${javadoc.splitindex}" use="${javadoc.use}" useexternalfile="true" version="${javadoc.version}" windowtitle="${javadoc.windowtitle}">
|
||||
<classpath>
|
||||
<path path="${javac.classpath}"/>
|
||||
</classpath>
|
||||
<fileset dir="${src.dir}" excludes="${excludes}" includes="${includes}">
|
||||
<filename name="**/*.java"/>
|
||||
</fileset>
|
||||
</javadoc>
|
||||
</target>
|
||||
<target depends="init,-javadoc-build" if="netbeans.home" name="-javadoc-browse" unless="no.javadoc.preview">
|
||||
<nbbrowse file="${dist.javadoc.dir}/index.html"/>
|
||||
</target>
|
||||
<target depends="init,-javadoc-build,-javadoc-browse" description="Build Javadoc." name="javadoc"/>
|
||||
<!--
|
||||
=========================
|
||||
JUNIT COMPILATION SECTION
|
||||
=========================
|
||||
-->
|
||||
<target depends="init,compile" if="have.tests" name="-pre-pre-compile-test">
|
||||
<mkdir dir="${build.test.classes.dir}"/>
|
||||
</target>
|
||||
<target name="-pre-compile-test">
|
||||
<!-- Empty placeholder for easier customization. -->
|
||||
<!-- You can override this target in the ../build.xml file. -->
|
||||
</target>
|
||||
<target if="do.depend.true" name="-compile-test-depend">
|
||||
<j2seproject3:depend classpath="${javac.test.classpath}" destdir="${build.test.classes.dir}" srcdir="${test.src.dir}"/>
|
||||
</target>
|
||||
<target depends="init,compile,-pre-pre-compile-test,-pre-compile-test,-compile-test-depend" if="have.tests" name="-do-compile-test">
|
||||
<j2seproject3:javac classpath="${javac.test.classpath}" debug="true" destdir="${build.test.classes.dir}" srcdir="${test.src.dir}"/>
|
||||
<copy todir="${build.test.classes.dir}">
|
||||
<fileset dir="${test.src.dir}" excludes="${build.classes.excludes},${excludes}" includes="${includes}"/>
|
||||
</copy>
|
||||
</target>
|
||||
<target name="-post-compile-test">
|
||||
<!-- Empty placeholder for easier customization. -->
|
||||
<!-- You can override this target in the ../build.xml file. -->
|
||||
</target>
|
||||
<target depends="init,compile,-pre-pre-compile-test,-pre-compile-test,-do-compile-test,-post-compile-test" name="compile-test"/>
|
||||
<target name="-pre-compile-test-single">
|
||||
<!-- Empty placeholder for easier customization. -->
|
||||
<!-- You can override this target in the ../build.xml file. -->
|
||||
</target>
|
||||
<target depends="init,compile,-pre-pre-compile-test,-pre-compile-test-single" if="have.tests" name="-do-compile-test-single">
|
||||
<fail unless="javac.includes">Must select some files in the IDE or set javac.includes</fail>
|
||||
<j2seproject3:force-recompile destdir="${build.test.classes.dir}"/>
|
||||
<j2seproject3:javac classpath="${javac.test.classpath}" debug="true" destdir="${build.test.classes.dir}" excludes="" includes="${javac.includes}" sourcepath="${test.src.dir}" srcdir="${test.src.dir}"/>
|
||||
<copy todir="${build.test.classes.dir}">
|
||||
<fileset dir="${test.src.dir}" excludes="${build.classes.excludes},${excludes}" includes="${includes}"/>
|
||||
</copy>
|
||||
</target>
|
||||
<target name="-post-compile-test-single">
|
||||
<!-- Empty placeholder for easier customization. -->
|
||||
<!-- You can override this target in the ../build.xml file. -->
|
||||
</target>
|
||||
<target depends="init,compile,-pre-pre-compile-test,-pre-compile-test-single,-do-compile-test-single,-post-compile-test-single" name="compile-test-single"/>
|
||||
<!--
|
||||
=======================
|
||||
JUNIT EXECUTION SECTION
|
||||
=======================
|
||||
-->
|
||||
<target depends="init" if="have.tests" name="-pre-test-run">
|
||||
<mkdir dir="${build.test.results.dir}"/>
|
||||
</target>
|
||||
<target depends="init,compile-test,-pre-test-run" if="have.tests" name="-do-test-run">
|
||||
<j2seproject3:junit testincludes="**/*Test.java"/>
|
||||
</target>
|
||||
<target depends="init,compile-test,-pre-test-run,-do-test-run" if="have.tests" name="-post-test-run">
|
||||
<fail if="tests.failed">Some tests failed; see details above.</fail>
|
||||
</target>
|
||||
<target depends="init" if="have.tests" name="test-report"/>
|
||||
<target depends="init" if="netbeans.home+have.tests" name="-test-browse"/>
|
||||
<target depends="init,compile-test,-pre-test-run,-do-test-run,test-report,-post-test-run,-test-browse" description="Run unit tests." name="test"/>
|
||||
<target depends="init" if="have.tests" name="-pre-test-run-single">
|
||||
<mkdir dir="${build.test.results.dir}"/>
|
||||
</target>
|
||||
<target depends="init,compile-test-single,-pre-test-run-single" if="have.tests" name="-do-test-run-single">
|
||||
<fail unless="test.includes">Must select some files in the IDE or set test.includes</fail>
|
||||
<j2seproject3:junit excludes="" includes="${test.includes}"/>
|
||||
</target>
|
||||
<target depends="init,compile-test-single,-pre-test-run-single,-do-test-run-single" if="have.tests" name="-post-test-run-single">
|
||||
<fail if="tests.failed">Some tests failed; see details above.</fail>
|
||||
</target>
|
||||
<target depends="init,-do-not-recompile,compile-test-single,-pre-test-run-single,-do-test-run-single,-post-test-run-single" description="Run single unit test." name="test-single"/>
|
||||
<!--
|
||||
=======================
|
||||
JUNIT DEBUGGING SECTION
|
||||
=======================
|
||||
-->
|
||||
<target depends="init,compile-test" if="have.tests" name="-debug-start-debuggee-test">
|
||||
<fail unless="test.class">Must select one file in the IDE or set test.class</fail>
|
||||
<property location="${build.test.results.dir}/TEST-${test.class}.xml" name="test.report.file"/>
|
||||
<delete file="${test.report.file}"/>
|
||||
<mkdir dir="${build.test.results.dir}"/>
|
||||
<j2seproject3:debug classname="org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner" classpath="${ant.home}/lib/ant.jar:${ant.home}/lib/ant-junit.jar:${debug.test.classpath}">
|
||||
<customize>
|
||||
<syspropertyset>
|
||||
<propertyref prefix="test-sys-prop."/>
|
||||
<mapper from="test-sys-prop.*" to="*" type="glob"/>
|
||||
</syspropertyset>
|
||||
<arg value="${test.class}"/>
|
||||
<arg value="showoutput=true"/>
|
||||
<arg value="formatter=org.apache.tools.ant.taskdefs.optional.junit.BriefJUnitResultFormatter"/>
|
||||
<arg value="formatter=org.apache.tools.ant.taskdefs.optional.junit.XMLJUnitResultFormatter,${test.report.file}"/>
|
||||
</customize>
|
||||
</j2seproject3:debug>
|
||||
</target>
|
||||
<target depends="init,compile-test" if="netbeans.home+have.tests" name="-debug-start-debugger-test">
|
||||
<j2seproject1:nbjpdastart classpath="${debug.test.classpath}" name="${test.class}"/>
|
||||
</target>
|
||||
<target depends="init,-do-not-recompile,compile-test-single,-debug-start-debugger-test,-debug-start-debuggee-test" name="debug-test"/>
|
||||
<target depends="init,-pre-debug-fix,compile-test-single" if="netbeans.home" name="-do-debug-fix-test">
|
||||
<j2seproject1:nbjpdareload dir="${build.test.classes.dir}"/>
|
||||
</target>
|
||||
<target depends="init,-pre-debug-fix,-do-debug-fix-test" if="netbeans.home" name="debug-fix-test"/>
|
||||
<!--
|
||||
=========================
|
||||
APPLET EXECUTION SECTION
|
||||
=========================
|
||||
-->
|
||||
<target depends="init,compile-single" name="run-applet">
|
||||
<fail unless="applet.url">Must select one file in the IDE or set applet.url</fail>
|
||||
<j2seproject1:java classname="sun.applet.AppletViewer">
|
||||
<customize>
|
||||
<arg value="${applet.url}"/>
|
||||
</customize>
|
||||
</j2seproject1:java>
|
||||
</target>
|
||||
<!--
|
||||
=========================
|
||||
APPLET DEBUGGING SECTION
|
||||
=========================
|
||||
-->
|
||||
<target depends="init,compile-single" if="netbeans.home" name="-debug-start-debuggee-applet">
|
||||
<fail unless="applet.url">Must select one file in the IDE or set applet.url</fail>
|
||||
<j2seproject3:debug classname="sun.applet.AppletViewer">
|
||||
<customize>
|
||||
<arg value="${applet.url}"/>
|
||||
</customize>
|
||||
</j2seproject3:debug>
|
||||
</target>
|
||||
<target depends="init,compile-single,-debug-start-debugger,-debug-start-debuggee-applet" if="netbeans.home" name="debug-applet"/>
|
||||
<!--
|
||||
===============
|
||||
CLEANUP SECTION
|
||||
===============
|
||||
-->
|
||||
<target depends="init" name="deps-clean" unless="no.deps"/>
|
||||
<target depends="init" name="-do-clean">
|
||||
<delete dir="${build.dir}"/>
|
||||
<delete dir="${dist.dir}"/>
|
||||
</target>
|
||||
<target name="-post-clean">
|
||||
<!-- Empty placeholder for easier customization. -->
|
||||
<!-- You can override this target in the ../build.xml file. -->
|
||||
</target>
|
||||
<target depends="init,deps-clean,-do-clean,-post-clean" description="Clean build products." name="clean"/>
|
||||
</project>
|
||||
@@ -1,8 +0,0 @@
|
||||
build.xml.data.CRC32=209349b6
|
||||
build.xml.script.CRC32=403e69e6
|
||||
build.xml.stylesheet.CRC32=958a1d3e
|
||||
# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
|
||||
# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
|
||||
nbproject/build-impl.xml.data.CRC32=209349b6
|
||||
nbproject/build-impl.xml.script.CRC32=c51e188e
|
||||
nbproject/build-impl.xml.stylesheet.CRC32=65b8de21
|
||||
@@ -1,84 +0,0 @@
|
||||
application.homepage=http://bob.i2p/
|
||||
application.title=BOB
|
||||
application.vendor=Sponge
|
||||
auxiliary.org-netbeans-modules-editor-indent.CodeStyle.project.expand-tabs=false
|
||||
auxiliary.org-netbeans-modules-editor-indent.CodeStyle.project.indent-shift-width=8
|
||||
auxiliary.org-netbeans-modules-editor-indent.CodeStyle.project.spaces-per-tab=8
|
||||
auxiliary.org-netbeans-modules-editor-indent.CodeStyle.project.tab-size=8
|
||||
auxiliary.org-netbeans-modules-editor-indent.CodeStyle.project.text-limit-width=80
|
||||
auxiliary.org-netbeans-modules-editor-indent.CodeStyle.usedProfile=project
|
||||
build.classes.dir=${build.dir}/classes
|
||||
build.classes.excludes=**/*.java,**/*.form
|
||||
# This directory is removed when the project is cleaned:
|
||||
build.dir=build
|
||||
build.generated.dir=${build.dir}/generated
|
||||
build.generated.sources.dir=${build.dir}/generated-sources
|
||||
# Only compile against the classpath explicitly listed here:
|
||||
build.sysclasspath=ignore
|
||||
build.test.classes.dir=${build.dir}/test/classes
|
||||
build.test.results.dir=${build.dir}/test/results
|
||||
debug.classpath=\
|
||||
${run.classpath}
|
||||
debug.test.classpath=\
|
||||
${run.test.classpath}
|
||||
# This directory is removed when the project is cleaned:
|
||||
dist.dir=dist
|
||||
dist.jar=${dist.dir}/BOB.jar
|
||||
dist.javadoc.dir=${dist.dir}/javadoc
|
||||
endorsed.classpath=
|
||||
excludes=**/*.html,**/*.txt
|
||||
file.reference.build-javadoc=../../i2p.i2p/build/javadoc
|
||||
file.reference.i2p.jar=../../core/java/build/i2p.jar
|
||||
file.reference.mstreaming.jar=../ministreaming/java/build/mstreaming.jar
|
||||
includes=**
|
||||
jar.compress=true
|
||||
javac.classpath=\
|
||||
${file.reference.mstreaming.jar}:\
|
||||
${file.reference.i2p.jar}
|
||||
# Space-separated list of extra javac options
|
||||
javac.compilerargs=
|
||||
javac.deprecation=false
|
||||
javac.version=1.8
|
||||
javac.source=${javac.version}
|
||||
javac.target=${javac.version}
|
||||
javac.release=8
|
||||
javac.test.classpath=\
|
||||
${javac.classpath}:\
|
||||
${build.classes.dir}:\
|
||||
${libs.junit.classpath}:\
|
||||
${libs.junit_4.classpath}
|
||||
javadoc.additionalparam=
|
||||
javadoc.author=false
|
||||
javadoc.encoding=${source.encoding}
|
||||
javadoc.noindex=false
|
||||
javadoc.nonavbar=false
|
||||
javadoc.notree=false
|
||||
javadoc.private=false
|
||||
javadoc.splitindex=true
|
||||
javadoc.use=true
|
||||
javadoc.version=false
|
||||
javadoc.windowtitle=
|
||||
jaxbwiz.endorsed.dirs="${netbeans.home}/../ide12/modules/ext/jaxb/api"
|
||||
jnlp.codebase.type=local
|
||||
jnlp.codebase.url=file:/usblv/NetBeansProjects/i2p.i2p/apps/BOB/dist
|
||||
jnlp.descriptor=application
|
||||
jnlp.enabled=false
|
||||
jnlp.offline-allowed=false
|
||||
jnlp.signed=false
|
||||
main.class=net.i2p.BOB.Main
|
||||
manifest.file=manifest.mf
|
||||
meta.inf.dir=${src.dir}/META-INF
|
||||
platform.active=default_platform
|
||||
run.classpath=\
|
||||
${javac.classpath}:\
|
||||
${build.classes.dir}
|
||||
# Space-separated list of JVM arguments used when running the project
|
||||
# (you may also define separate properties like run-sys-prop.name=value instead of -Dname=value
|
||||
# or test-sys-prop.name=value to set system properties for unit tests):
|
||||
run.jvmargs=
|
||||
run.test.classpath=\
|
||||
${javac.test.classpath}:\
|
||||
${build.test.classes.dir}
|
||||
source.encoding=UTF-8
|
||||
src.dir=src
|
||||
test.src.dir=test
|
||||
@@ -1,16 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://www.netbeans.org/ns/project/1">
|
||||
<type>org.netbeans.modules.java.j2seproject</type>
|
||||
<configuration>
|
||||
<data xmlns="http://www.netbeans.org/ns/j2se-project/3">
|
||||
<name>BOB</name>
|
||||
<minimum-ant-version>1.9.8</minimum-ant-version>
|
||||
<source-roots>
|
||||
<root id="src.dir"/>
|
||||
</source-roots>
|
||||
<test-roots>
|
||||
<root id="test.src.dir"/>
|
||||
</test-roots>
|
||||
</data>
|
||||
</configuration>
|
||||
</project>
|
||||
@@ -1,542 +0,0 @@
|
||||
/**
|
||||
* WTFPL
|
||||
* Version 2, December 2004
|
||||
*
|
||||
* Copyright (C) sponge
|
||||
* Planet Earth
|
||||
*
|
||||
* See...
|
||||
*
|
||||
* http://sam.zoy.org/wtfpl/
|
||||
* and
|
||||
* http://en.wikipedia.org/wiki/WTFPL
|
||||
*
|
||||
* ...for any additional details and license questions.
|
||||
*/
|
||||
package net.i2p.BOB;
|
||||
|
||||
import static net.i2p.app.ClientAppState.*;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.net.ConnectException;
|
||||
import java.net.InetAddress;
|
||||
import java.net.ServerSocket;
|
||||
import java.net.Socket;
|
||||
import java.net.SocketTimeoutException;
|
||||
import java.net.URL;
|
||||
import java.util.Arrays;
|
||||
import java.util.Properties;
|
||||
import java.util.concurrent.atomic.AtomicBoolean;
|
||||
import java.util.jar.Attributes;
|
||||
import java.util.jar.Manifest;
|
||||
|
||||
import net.i2p.I2PAppContext;
|
||||
import net.i2p.app.*;
|
||||
import net.i2p.client.I2PClient;
|
||||
import net.i2p.util.I2PAppThread;
|
||||
import net.i2p.util.Log;
|
||||
import net.i2p.util.PortMapper;
|
||||
import net.i2p.util.SimpleTimer2;
|
||||
|
||||
/**
|
||||
* <span style="font-size:8px;font-family:courier;color:#EEEEEE;background-color:#000000">
|
||||
* ################################################################################<br>
|
||||
* ############################.#..........#..#..........##########################<br>
|
||||
* #######################......................................###################<br>
|
||||
* ####################...........................#.......#........################<br>
|
||||
* #################..................##...................#.........##############<br>
|
||||
* ###############................###...####.....#..###.....#.........#############<br>
|
||||
* #############...........###..#..###...#####...###.##........#.......############<br>
|
||||
* ###########................#......##...#####...##..##.......#..#........########<br>
|
||||
* ##########.........................#....##.##..#...##.....................######<br>
|
||||
* #########...................................#....#.........................#####<br>
|
||||
* ########.........................................#...............#..........####<br>
|
||||
* ########.........................................#..........#######..........###<br>
|
||||
* #######.................................................############..........##<br>
|
||||
* #######..........................................####################.........##<br>
|
||||
* #######............####################......########################.........##<br>
|
||||
* ######.............###############################################.##.........##<br>
|
||||
* ######............################################################..##........##<br>
|
||||
* ######............################################################..##........##<br>
|
||||
* ######.............##############################################..##.........##<br>
|
||||
* ######............##############################################...##..........#<br>
|
||||
* ######............#..###########################################...##..........#<br>
|
||||
* ######.............#############################################....#..........#<br>
|
||||
* #######...........###############################################..##.........##<br>
|
||||
* #######...........#####.#.#.#.########################.....#.####...##........##<br>
|
||||
* ######............#..............##################.................##.........#<br>
|
||||
* ######................####.........###############........#####......##........#<br>
|
||||
* ######..............####..#.........############.......##.#.######...##.......##<br>
|
||||
* ######.................#.####.........########...........##....###...##.......##<br>
|
||||
* #######....#....###...................#######...............#...###..##.......##<br>
|
||||
* #######.........###..###.....###.......######.##.#####.........####..##.......##<br>
|
||||
* #######.....#...##############.........############......###########.###......##<br>
|
||||
* #######....##...##########.......##...##############......#.############.....###<br>
|
||||
* ########....#..########......######...##################################....####<br>
|
||||
* ########....##.####################...##################################....####<br>
|
||||
* ########..#.##..###################..##################################..#..####<br>
|
||||
* ##########..###..#################...##################################...#.####<br>
|
||||
* #########....##...##############....########..#####.################.##..#.#####<br>
|
||||
* ############.##....##########.......#########.###.......###########..#.#########<br>
|
||||
* ###############.....#######...#.......########.....##.....######.....###########<br>
|
||||
* ###############......###....##..........##.......######....#.........#.#########<br>
|
||||
* ##############............##..................##########..............##########<br>
|
||||
* ##############..............................##########..#.............##########<br>
|
||||
* ###############.......##..................#####..............####....###########<br>
|
||||
* ###############.......#####.......#.............####.....#######.....###########<br>
|
||||
* ################...#...####......##################.....########....############<br>
|
||||
* ################...##..#####.........####.##.....#....##########....############<br>
|
||||
* ##################..##..####...........#####.#....############.....#############<br>
|
||||
* ##################......#####.................################....##############<br>
|
||||
* ###################.....####..........##########..###########....###############<br>
|
||||
* ####################..#..#..........................########.....###############<br>
|
||||
* #####################.##.......###.................########....#################<br>
|
||||
* ######################.........#.......#.##.###############....#################<br>
|
||||
* #############.#######...............#####################....###################<br>
|
||||
* ###..#.....##...####..........#.....####################....####################<br>
|
||||
* ####......##........................##################....######################<br>
|
||||
* #.##...###..............###.........###############......#######################<br>
|
||||
* #...###..##............######...........................########################<br>
|
||||
* ##.......###..........##########....#...#...........############################<br>
|
||||
* ##.........##.......############################################################<br>
|
||||
* ###........##.....##############################################################<br>
|
||||
* ####.............###############################################################<br>
|
||||
* ######.........#################################################################<br>
|
||||
* #########....###################################################################<br>
|
||||
* ################################################################################<br>
|
||||
* </span>
|
||||
* BOB, main command socket listener, launches the command parser engine.
|
||||
*
|
||||
* @author sponge
|
||||
* @deprecated Please port applications to SAMv3
|
||||
*/
|
||||
@Deprecated
|
||||
public class BOB implements Runnable, ClientApp {
|
||||
|
||||
public final static String PROP_CONFIG_LOCATION = "BOB.config";
|
||||
public final static String PROP_BOB_PORT = "BOB.port";
|
||||
public final static String PROP_BOB_HOST = "BOB.host";
|
||||
public final static String PROP_CFG_VER = "BOB.CFG.VER";
|
||||
|
||||
/** unused when started via the ClientApp interface */
|
||||
private static BOB _bob;
|
||||
|
||||
private final NamedDB database;
|
||||
private final Properties props = new Properties();
|
||||
private final AtomicBoolean spin = new AtomicBoolean(true);
|
||||
private static final String P_RUNNING = "RUNNING";
|
||||
private static final String P_STARTING = "STARTING";
|
||||
private static final String P_STOPPING = "STOPPING";
|
||||
private final AtomicBoolean lock = new AtomicBoolean(false);
|
||||
// no longer used.
|
||||
// private static int maxConnections = 0;
|
||||
|
||||
private final I2PAppContext _context;
|
||||
private final Logger _log;
|
||||
private final ClientAppManager _mgr;
|
||||
private final String[] _args;
|
||||
private volatile ClientAppState _state = UNINITIALIZED;
|
||||
|
||||
private volatile ServerSocket listener;
|
||||
private volatile Thread _runner;
|
||||
private volatile boolean _warned;
|
||||
|
||||
/**
|
||||
* Stop BOB gracefully
|
||||
* @deprecated unused
|
||||
*/
|
||||
@Deprecated
|
||||
public synchronized static void stop() {
|
||||
if (_bob != null)
|
||||
_bob.shutdown(null);
|
||||
}
|
||||
|
||||
/**
|
||||
* For ClientApp interface.
|
||||
* Does NOT open the listener socket or start threads; caller must call startup()
|
||||
*
|
||||
* @param mgr may be null
|
||||
* @param args non-null
|
||||
* @since 0.9.10
|
||||
*/
|
||||
public BOB(I2PAppContext context, ClientAppManager mgr, String[] args) {
|
||||
_context = context;
|
||||
// If we were run from command line, log to stdout
|
||||
boolean logToStdout = false;
|
||||
URL classResource = BOB.class.getResource("BOB.class");
|
||||
if (classResource != null) {
|
||||
String classPath = classResource.toString();
|
||||
if (classPath.startsWith("jar")) {
|
||||
String manifestPath = classPath.substring(0, classPath.lastIndexOf('!') + 1) +
|
||||
"/META-INF/MANIFEST.MF";
|
||||
try {
|
||||
Manifest manifest = new Manifest(new URL(manifestPath).openStream());
|
||||
Attributes attrs = manifest.getMainAttributes();
|
||||
String mainClass = attrs.getValue("Main-Class");
|
||||
if ("net.i2p.BOB.Main".equals(mainClass))
|
||||
logToStdout = true;
|
||||
} catch (IOException ioe) {}
|
||||
}
|
||||
}
|
||||
|
||||
_log = new Logger(context.logManager().getLog(BOB.class), logToStdout);
|
||||
|
||||
_mgr = mgr;
|
||||
_args = args;
|
||||
_state = INITIALIZED;
|
||||
database = new NamedDB();
|
||||
loadConfig();
|
||||
}
|
||||
|
||||
/**
|
||||
* Listen for incoming connections and handle them
|
||||
*
|
||||
* @param args
|
||||
*/
|
||||
public synchronized static void main(String[] args) {
|
||||
try {
|
||||
_bob = new BOB(I2PAppContext.getGlobalContext(), null, args);
|
||||
_bob.startup();
|
||||
} catch (RuntimeException e) {
|
||||
e.printStackTrace();
|
||||
throw e;
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @since 0.9.10
|
||||
*/
|
||||
private void loadConfig() {
|
||||
int i = 0;
|
||||
boolean save = false;
|
||||
// Set up all defaults to be passed forward to other threads.
|
||||
// Re-reading the config file in each thread is pretty damn stupid.
|
||||
String configLocation = System.getProperty(PROP_CONFIG_LOCATION, "bob.config");
|
||||
// This is here just to ensure there is no interference with our threadgroups.
|
||||
SimpleTimer2 Y2 = SimpleTimer2.getInstance();
|
||||
i = Y2.hashCode();
|
||||
{
|
||||
File cfg = new File(configLocation);
|
||||
if (!cfg.isAbsolute()) {
|
||||
cfg = new File(_context.getConfigDir(), configLocation);
|
||||
}
|
||||
FileInputStream fi = null;
|
||||
try {
|
||||
fi = new FileInputStream(cfg);
|
||||
props.load(fi);
|
||||
} catch (FileNotFoundException fnfe) {
|
||||
_log.warn("Unable to load up the BOB config file " + cfg.getAbsolutePath() + ", Using defaults.", fnfe);
|
||||
save = true;
|
||||
} catch (IOException ioe) {
|
||||
_log.warn("IOException on BOB config file " + cfg.getAbsolutePath() + ", using defaults.", ioe);
|
||||
} finally {
|
||||
if (fi != null) try { fi.close(); } catch (IOException ioe) {}
|
||||
}
|
||||
}
|
||||
// Global router and client API configurations that are missing are set to defaults here.
|
||||
if (!props.containsKey(I2PClient.PROP_TCP_HOST)) {
|
||||
props.setProperty(I2PClient.PROP_TCP_HOST, "localhost");
|
||||
save = true;
|
||||
}
|
||||
if (!props.containsKey(I2PClient.PROP_TCP_PORT)) {
|
||||
props.setProperty(I2PClient.PROP_TCP_PORT, Integer.toString(I2PClient.DEFAULT_LISTEN_PORT));
|
||||
save = true;
|
||||
}
|
||||
if (!props.containsKey(PROP_BOB_PORT)) {
|
||||
props.setProperty(PROP_BOB_PORT, "2827"); // 0xB0B
|
||||
save = true;
|
||||
}
|
||||
if (!props.containsKey("inbound.length")) {
|
||||
props.setProperty("inbound.length", "3");
|
||||
save = true;
|
||||
}
|
||||
if (!props.containsKey("outbound.length")) {
|
||||
props.setProperty("outbound.length", "3");
|
||||
save = true;
|
||||
}
|
||||
if (!props.containsKey("inbound.lengthVariance")) {
|
||||
props.setProperty("inbound.lengthVariance", "0");
|
||||
save = true;
|
||||
}
|
||||
if (!props.containsKey("outbound.lengthVariance")) {
|
||||
props.setProperty("outbound.lengthVariance", "0");
|
||||
save = true;
|
||||
}
|
||||
if (!props.containsKey(PROP_BOB_HOST)) {
|
||||
props.setProperty(PROP_BOB_HOST, "localhost");
|
||||
save = true;
|
||||
}
|
||||
// PROP_RELIABILITY_NONE, PROP_RELIABILITY_BEST_EFFORT, PROP_RELIABILITY_GUARANTEED
|
||||
if (!props.containsKey(PROP_CFG_VER)) {
|
||||
props.setProperty(I2PClient.PROP_RELIABILITY, I2PClient.PROP_RELIABILITY_NONE);
|
||||
props.setProperty(PROP_CFG_VER,"1");
|
||||
save = true;
|
||||
}
|
||||
if (save) {
|
||||
File cfg = new File(configLocation);
|
||||
if (!cfg.isAbsolute()) {
|
||||
cfg = new File(_context.getConfigDir(), configLocation);
|
||||
}
|
||||
FileOutputStream fo = null;
|
||||
try {
|
||||
_log.warn("Writing new defaults file " + cfg.getAbsolutePath());
|
||||
fo = new FileOutputStream(cfg);
|
||||
props.store(fo, cfg.getAbsolutePath());
|
||||
} catch (IOException ioe) {
|
||||
_log.error("IOException on BOB config file " + cfg.getAbsolutePath(), ioe);
|
||||
} finally {
|
||||
if (fo != null) try { fo.close(); } catch (IOException ioe) {}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @since 0.9.10
|
||||
*/
|
||||
private void startListener() throws IOException {
|
||||
listener = new ServerSocket(Integer.parseInt(props.getProperty(PROP_BOB_PORT)), 10, InetAddress.getByName(props.getProperty(PROP_BOB_HOST)));
|
||||
listener.setSoTimeout(500); // .5 sec
|
||||
}
|
||||
|
||||
/**
|
||||
* @since 0.9.10
|
||||
*/
|
||||
private void startThread() {
|
||||
I2PAppThread t = new I2PAppThread(this, "BOBListener");
|
||||
t.start();
|
||||
_runner = t;
|
||||
}
|
||||
|
||||
/**
|
||||
* @since 0.9.10
|
||||
*/
|
||||
public void run() {
|
||||
if (listener == null) return;
|
||||
changeState(RUNNING);
|
||||
_log.info("BOB is now running.");
|
||||
if (_mgr != null)
|
||||
_mgr.register(this);
|
||||
_context.portMapper().register(PortMapper.SVC_BOB, props.getProperty(PROP_BOB_HOST),
|
||||
Integer.parseInt(props.getProperty(PROP_BOB_PORT)));
|
||||
|
||||
int i = 0;
|
||||
boolean g = false;
|
||||
spin.set(true);
|
||||
try {
|
||||
Socket server = null;
|
||||
|
||||
while (spin.get()) {
|
||||
//DoCMDS connection;
|
||||
|
||||
try {
|
||||
server = listener.accept();
|
||||
server.setKeepAlive(true);
|
||||
g = true;
|
||||
} catch (ConnectException ce) {
|
||||
g = false;
|
||||
} catch (SocketTimeoutException ste) {
|
||||
g = false;
|
||||
}
|
||||
|
||||
if (g) {
|
||||
if (!_warned) {
|
||||
_warned = true;
|
||||
String s = "BOB is deprecated. Please port applications to SAMv3.";
|
||||
_context.logManager().getLog(BOB.class).logAlways(Log.WARN, s);
|
||||
_log.warn(s);
|
||||
}
|
||||
DoCMDS conn_c = new DoCMDS(spin, lock, server, props, database, _log);
|
||||
Thread t = new I2PAppThread(conn_c);
|
||||
t.setName("BOB.DoCMDS " + i);
|
||||
t.start();
|
||||
i++;
|
||||
}
|
||||
}
|
||||
changeState(STOPPING);
|
||||
} catch (Exception e) {
|
||||
if (spin.get())
|
||||
_log.error("Unexpected error while listening for connections", e);
|
||||
else
|
||||
e = null;
|
||||
changeState(STOPPING, e);
|
||||
} finally {
|
||||
_log.info("BOB is now shutting down...");
|
||||
_context.portMapper().unregister(PortMapper.SVC_BOB);
|
||||
// Clean up everything.
|
||||
try {
|
||||
listener.close();
|
||||
} catch (Exception ex) {
|
||||
// nop
|
||||
}
|
||||
// Find all our "BOB.DoCMDS" threads, wait for them to be finished.
|
||||
// We could order them to stop, but that could cause nasty issues in the locks.
|
||||
visitAllThreads();
|
||||
database.getReadLock();
|
||||
NamedDB nickinfo;
|
||||
try {
|
||||
for (Object ndb : database.values()) {
|
||||
nickinfo = (NamedDB) ndb;
|
||||
nickinfo.getReadLock();
|
||||
boolean released = false;
|
||||
try {
|
||||
if (nickinfo.get(P_RUNNING).equals(Boolean.TRUE) && nickinfo.get(P_STOPPING).equals(Boolean.FALSE) && nickinfo.get(P_STARTING).equals(Boolean.FALSE)) {
|
||||
nickinfo.releaseReadLock();
|
||||
released = true;
|
||||
nickinfo.getWriteLock();
|
||||
try {
|
||||
nickinfo.add(P_STOPPING, Boolean.TRUE);
|
||||
} finally {
|
||||
nickinfo.releaseWriteLock();
|
||||
}
|
||||
}
|
||||
} finally {
|
||||
if (!released)
|
||||
nickinfo.releaseReadLock();
|
||||
}
|
||||
}
|
||||
} finally {
|
||||
database.releaseReadLock();
|
||||
}
|
||||
changeState(STOPPED);
|
||||
_log.info("BOB is now stopped.");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Find the root thread group,
|
||||
* then find all theads with certain names and wait for them all to be dead.
|
||||
*
|
||||
*/
|
||||
private static void visitAllThreads() {
|
||||
ThreadGroup root = Thread.currentThread().getThreadGroup().getParent();
|
||||
while (root.getParent() != null) {
|
||||
root = root.getParent();
|
||||
}
|
||||
|
||||
// Visit each thread group
|
||||
waitjoin(root, 0, root.getName());
|
||||
}
|
||||
|
||||
private static void waitjoin(ThreadGroup group, int level, String tn) {
|
||||
// Get threads in `group'
|
||||
int numThreads = group.activeCount();
|
||||
Thread[] threads = new Thread[numThreads * 2];
|
||||
numThreads = group.enumerate(threads, false);
|
||||
// Enumerate each thread in `group' and wait for it to stop if it is one of ours.
|
||||
for (int i = 0; i < numThreads; i++) {
|
||||
// Get thread
|
||||
Thread thread = threads[i];
|
||||
if (thread.getName().startsWith("BOB.DoCMDS ")) {
|
||||
try {
|
||||
if (thread.isAlive()) {
|
||||
try {
|
||||
thread.join();
|
||||
} catch (InterruptedException ex) {
|
||||
}
|
||||
}
|
||||
} catch (SecurityException se) {
|
||||
//nop
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Get thread subgroups of `group'
|
||||
int numGroups = group.activeGroupCount();
|
||||
ThreadGroup[] groups = new ThreadGroup[numGroups * 2];
|
||||
numGroups = group.enumerate(groups, false);
|
||||
|
||||
// Recursively visit each subgroup
|
||||
for (int i = 0; i < numGroups; i++) {
|
||||
waitjoin(groups[i], level + 1, groups[i].getName());
|
||||
}
|
||||
}
|
||||
|
||||
////// begin ClientApp interface
|
||||
|
||||
/**
|
||||
* @since 0.9.10
|
||||
*/
|
||||
@Override
|
||||
public void startup() throws IOException {
|
||||
if (_state != INITIALIZED)
|
||||
return;
|
||||
changeState(STARTING);
|
||||
try {
|
||||
startListener();
|
||||
} catch (IOException e) {
|
||||
_log.error("Error starting BOB on"
|
||||
+ props.getProperty(PROP_BOB_HOST)
|
||||
+ ":" + props.getProperty(PROP_BOB_PORT), e);
|
||||
changeState(START_FAILED, e);
|
||||
throw e;
|
||||
}
|
||||
startThread();
|
||||
}
|
||||
|
||||
/**
|
||||
* @since 0.9.10
|
||||
*/
|
||||
@Override
|
||||
public void shutdown(String[] args) {
|
||||
if (_state != RUNNING)
|
||||
return;
|
||||
changeState(STOPPING);
|
||||
spin.set(false);
|
||||
if (_runner != null)
|
||||
_runner.interrupt();
|
||||
else
|
||||
changeState(STOPPED);
|
||||
}
|
||||
|
||||
/**
|
||||
* @since 0.9.10
|
||||
*/
|
||||
@Override
|
||||
public ClientAppState getState() {
|
||||
return _state;
|
||||
}
|
||||
|
||||
/**
|
||||
* @since 0.9.10
|
||||
*/
|
||||
@Override
|
||||
public String getName() {
|
||||
return "BOB";
|
||||
}
|
||||
|
||||
/**
|
||||
* @since 0.9.10
|
||||
*/
|
||||
@Override
|
||||
public String getDisplayName() {
|
||||
return "BOB " + Arrays.toString(_args);
|
||||
}
|
||||
|
||||
////// end ClientApp interface
|
||||
////// begin ClientApp helpers
|
||||
|
||||
/**
|
||||
* @since 0.9.10
|
||||
*/
|
||||
private void changeState(ClientAppState state) {
|
||||
changeState(state, null);
|
||||
}
|
||||
|
||||
/**
|
||||
* @since 0.9.10
|
||||
*/
|
||||
private synchronized void changeState(ClientAppState state, Exception e) {
|
||||
_state = state;
|
||||
if (_mgr != null)
|
||||
_mgr.notify(this, state, null, e);
|
||||
}
|
||||
|
||||
////// end ClientApp helpers
|
||||
}
|
||||
@@ -1,996 +0,0 @@
|
||||
/**
|
||||
* WTFPL
|
||||
* Version 2, December 2004
|
||||
*
|
||||
* Copyright (C) sponge
|
||||
* Planet Earth
|
||||
*
|
||||
* See...
|
||||
*
|
||||
* http://sam.zoy.org/wtfpl/
|
||||
* and
|
||||
* http://en.wikipedia.org/wiki/WTFPL
|
||||
*
|
||||
* ...for any additional details and license questions.
|
||||
*/
|
||||
package net.i2p.BOB;
|
||||
|
||||
import java.io.BufferedReader;
|
||||
import java.io.ByteArrayOutputStream;
|
||||
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;
|
||||
|
||||
import net.i2p.I2PAppContext;
|
||||
import net.i2p.I2PException;
|
||||
import net.i2p.client.I2PClientFactory;
|
||||
import net.i2p.data.Destination;
|
||||
import net.i2p.util.I2PAppThread;
|
||||
|
||||
// needed only for debugging.
|
||||
// import java.util.logging.Level;
|
||||
// import java.util.logging.Logger;
|
||||
|
||||
/**
|
||||
* Simplistic command parser for BOB
|
||||
*
|
||||
* @author sponge
|
||||
*
|
||||
*/
|
||||
public class DoCMDS implements Runnable {
|
||||
|
||||
// FIX ME
|
||||
// I need a better way to do versioning, but this will do for now.
|
||||
public static final String BMAJ = "00", BMIN = "00", BREV = "10", BEXT = "";
|
||||
public static final String BOBversion = BMAJ + "." + BMIN + "." + BREV + BEXT;
|
||||
private final Socket server;
|
||||
private final Properties props;
|
||||
private final NamedDB database;
|
||||
private String line;
|
||||
private Destination d;
|
||||
private ByteArrayOutputStream prikey;
|
||||
private boolean dk, ns, ip, op;
|
||||
private NamedDB nickinfo;
|
||||
private final Logger _log;
|
||||
private final AtomicBoolean LIVE;
|
||||
private final AtomicBoolean lock;
|
||||
/* database strings */
|
||||
private static final String P_DEST = "DESTINATION";
|
||||
private static final String P_INHOST = "INHOST";
|
||||
private static final String P_INPORT = "INPORT";
|
||||
private static final String P_KEYS = "KEYS";
|
||||
private static final String P_NICKNAME = "NICKNAME";
|
||||
private static final String P_OUTHOST = "OUTHOST";
|
||||
private static final String P_OUTPORT = "OUTPORT";
|
||||
private static final String P_PROPERTIES = "PROPERTIES";
|
||||
private static final String P_QUIET = "QUIET";
|
||||
private static final String P_RUNNING = "RUNNING";
|
||||
private static final String P_STARTING = "STARTING";
|
||||
private static final String P_STOPPING = "STOPPING";
|
||||
|
||||
/* command strings */
|
||||
private static final String C_help = "help";
|
||||
private static final String C_clear = "clear";
|
||||
private static final String C_getdest = "getdest";
|
||||
private static final String C_getkeys = "getkeys";
|
||||
private static final String C_getnick = "getnick";
|
||||
private static final String C_inhost = "inhost";
|
||||
private static final String C_inport = "inport";
|
||||
private static final String C_list = "list";
|
||||
private static final String C_lookup = "lookup";
|
||||
private static final String C_newkeys = "newkeys";
|
||||
private static final String C_option = "option";
|
||||
private static final String C_outhost = "outhost";
|
||||
private static final String C_outport = "outport";
|
||||
private static final String C_quiet = "quiet";
|
||||
private static final String C_quit = "quit";
|
||||
private static final String C_setkeys = "setkeys";
|
||||
private static final String C_setnick = "setnick";
|
||||
private static final String C_show = "show";
|
||||
private static final String C_show_props = "showprops";
|
||||
private static final String C_start = "start";
|
||||
private static final String C_status = "status";
|
||||
private static final String C_stop = "stop";
|
||||
private static final String C_verify = "verify";
|
||||
private static final String C_visit = "visit";
|
||||
private static final String C_zap = "zap";
|
||||
|
||||
/* all the commands available, plus description */
|
||||
private static final String C_ALL[][] = {
|
||||
{C_help, C_help + " <command> * Get help on a command."},
|
||||
{C_clear, C_clear + " * Clear the current nickname out of the list."},
|
||||
{C_getdest, C_getdest + " * Return the destination for the current nickname."},
|
||||
{C_getkeys, C_getkeys + " * Return the keypair for the current nickname."},
|
||||
{C_getnick, C_getnick + " tunnelname * Set the nickname from the database."},
|
||||
{C_inhost, C_inhost + " hostname | IP * Set the inbound hostname or IP."},
|
||||
{C_inport, C_inport + " port_number * Set the inbound port number nickname listens on."},
|
||||
{C_list, C_list + " * List all tunnels."},
|
||||
{C_lookup, C_lookup + " * Lookup an i2p address."},
|
||||
{C_newkeys, C_newkeys + " * Generate a new keypair for the current nickname."},
|
||||
{C_option, C_option + " I2CPoption=something * Set an I2CP option. NOTE: Don't use any spaces."},
|
||||
{C_outhost, C_outhost + " hostname | IP * Set the outbound hostname or IP."},
|
||||
{C_outport, C_outport + " port_number * Set the outbound port that nickname contacts."},
|
||||
{C_quiet, C_quiet + " True | False * Don't send to the application the incoming destination."},
|
||||
{C_quit, C_quit + " * Quits this session with BOB."},
|
||||
{C_setkeys, C_setkeys + " BASE64_keypair * Sets the keypair for the current nickname."},
|
||||
{C_setnick, C_setnick + " nickname * Create a new nickname."},
|
||||
{C_show, C_show + " * Display the status of the current nickname."},
|
||||
{C_show_props, C_show_props + " * Display the properties of the current nickname."},
|
||||
{C_start, C_start + " * Start the current nickname tunnel."},
|
||||
{C_status, C_status + " nickname * Display status of a nicknamed tunnel."},
|
||||
{C_stop, C_stop + " * Stops the current nicknamed tunnel."},
|
||||
{C_verify, C_verify + " BASE64_key * Verifies BASE64 destination."},
|
||||
{C_visit, C_visit + " * Thread dump to wrapper.log."},
|
||||
{C_zap, C_zap + " * Shuts down BOB."},
|
||||
{"", "COMMANDS: " + // this is ugly, but...
|
||||
C_help + " " +
|
||||
C_clear + " " +
|
||||
C_getdest + " " +
|
||||
C_getkeys + " " +
|
||||
C_getnick + " " +
|
||||
C_inhost + " " +
|
||||
C_inport + " " +
|
||||
C_list + " " +
|
||||
C_lookup + " " +
|
||||
C_newkeys + " " +
|
||||
C_option + " " +
|
||||
C_outhost + " " +
|
||||
C_outport + " " +
|
||||
C_quiet + " " +
|
||||
C_quit + " " +
|
||||
C_setkeys + " " +
|
||||
C_setnick + " " +
|
||||
C_show + " " +
|
||||
C_show_props + " " +
|
||||
C_start + " " +
|
||||
C_status + " " +
|
||||
C_stop + " " +
|
||||
C_verify + " " +
|
||||
C_visit + " " +
|
||||
C_zap
|
||||
},
|
||||
{" ", " "} // end of list
|
||||
};
|
||||
|
||||
/**
|
||||
* @param LIVE
|
||||
* @param server
|
||||
* @param props
|
||||
* @param database
|
||||
* @param _log
|
||||
*/
|
||||
DoCMDS(AtomicBoolean LIVE, AtomicBoolean lock, Socket server, Properties props, NamedDB database, Logger _log) {
|
||||
this.lock = lock;
|
||||
this.LIVE = LIVE;
|
||||
this.server = server;
|
||||
this.props = new Properties();
|
||||
this.database = database;
|
||||
this._log = _log;
|
||||
Lifted.copyProperties(props, this.props);
|
||||
}
|
||||
|
||||
private void rlock() {
|
||||
rlock(nickinfo);
|
||||
}
|
||||
|
||||
private void rlock(NamedDB Arg) {
|
||||
database.getReadLock();
|
||||
Arg.getReadLock();
|
||||
}
|
||||
|
||||
private void runlock() {
|
||||
runlock(nickinfo);
|
||||
}
|
||||
|
||||
private void runlock(NamedDB Arg) {
|
||||
Arg.releaseReadLock();
|
||||
database.releaseReadLock();
|
||||
}
|
||||
|
||||
private void wlock() {
|
||||
wlock(nickinfo);
|
||||
}
|
||||
|
||||
private void wlock(NamedDB Arg) {
|
||||
database.getWriteLock();
|
||||
Arg.getWriteLock();
|
||||
}
|
||||
|
||||
private void wunlock() {
|
||||
wunlock(nickinfo);
|
||||
}
|
||||
|
||||
private void wunlock(NamedDB Arg) {
|
||||
Arg.releaseWriteLock();
|
||||
database.releaseWriteLock();
|
||||
}
|
||||
|
||||
/**
|
||||
* Try to print info from the database
|
||||
*
|
||||
* @param out
|
||||
* @param info
|
||||
* @param key
|
||||
*/
|
||||
private void trypnt(PrintStream out, NamedDB info, String key) {
|
||||
rlock(info);
|
||||
try {
|
||||
out.print(" " + key + ": ");
|
||||
if (info.exists(key)) {
|
||||
out.print(info.get(key));
|
||||
} else {
|
||||
out.print("not_set");
|
||||
}
|
||||
} finally {
|
||||
runlock(info);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Print true or false if an object exists
|
||||
*
|
||||
* @param out
|
||||
* @param info
|
||||
* @param key
|
||||
*/
|
||||
private void tfpnt(PrintStream out, NamedDB info, String key) {
|
||||
rlock(info);
|
||||
try {
|
||||
out.print(" " + key + ": ");
|
||||
out.print(info.exists(key));
|
||||
} finally {
|
||||
runlock(info);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Print an error message
|
||||
*
|
||||
* @param out
|
||||
*/
|
||||
private static void nns(PrintStream out) {
|
||||
out.println("ERROR no nickname has been set");
|
||||
}
|
||||
|
||||
/**
|
||||
* Dump various information from the database
|
||||
*
|
||||
* @param out
|
||||
* @param info
|
||||
*/
|
||||
private void nickprint(PrintStream out, NamedDB info) {
|
||||
trypnt(out, info, P_NICKNAME);
|
||||
trypnt(out, info, P_STARTING);
|
||||
trypnt(out, info, P_RUNNING);
|
||||
trypnt(out, info, P_STOPPING);
|
||||
tfpnt(out, info, P_KEYS);
|
||||
trypnt(out, info, P_QUIET);
|
||||
trypnt(out, info, P_INPORT);
|
||||
trypnt(out, info, P_INHOST);
|
||||
trypnt(out, info, P_OUTPORT);
|
||||
trypnt(out, info, P_OUTHOST);
|
||||
out.println();
|
||||
}
|
||||
|
||||
/**
|
||||
* Dump properties information from the database
|
||||
*
|
||||
* @param out
|
||||
* @param info
|
||||
*/
|
||||
private void propprint(PrintStream out, NamedDB info) {
|
||||
trypnt(out, info, P_PROPERTIES);
|
||||
}
|
||||
|
||||
/**
|
||||
* Print information on a specific record, indicated by NamedDB
|
||||
* @param out
|
||||
* @param Arg
|
||||
*/
|
||||
private void ttlpnt(PrintStream out, String Arg) {
|
||||
database.getReadLock();
|
||||
try {
|
||||
if (database.exists(Arg)) {
|
||||
out.print("DATA");
|
||||
nickprint(out, (NamedDB) database.get(Arg));
|
||||
}
|
||||
} finally {
|
||||
database.releaseReadLock();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Is this NamedDB's tunnel active?
|
||||
*
|
||||
* @param Arg
|
||||
* @return true if the tunnel is active
|
||||
*/
|
||||
private boolean tunnelactive(NamedDB Arg) {
|
||||
boolean retval;
|
||||
rlock(Arg);
|
||||
try {
|
||||
retval = (Arg.get(P_STARTING).equals(Boolean.TRUE) ||
|
||||
Arg.get(P_STOPPING).equals(Boolean.TRUE) ||
|
||||
Arg.get(P_RUNNING).equals(Boolean.TRUE));
|
||||
} finally {
|
||||
runlock();
|
||||
}
|
||||
return retval;
|
||||
}
|
||||
|
||||
/**
|
||||
* Does the base64 information look OK
|
||||
*
|
||||
* @param data
|
||||
* @return OK
|
||||
*/
|
||||
private static boolean is64ok(String data) {
|
||||
try {
|
||||
new Destination(data);
|
||||
return true;
|
||||
} catch (Exception e) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* The actual parser.
|
||||
* It probabbly needs a rewrite into functions, but I kind-of like inline code.
|
||||
*
|
||||
*/
|
||||
public void run() {
|
||||
dk = ns = ip = op = false;
|
||||
try {
|
||||
try {
|
||||
// Get input from the client
|
||||
BufferedReader in = new BufferedReader(new InputStreamReader(server.getInputStream()));
|
||||
PrintStream out = new PrintStream(server.getOutputStream());
|
||||
quit:
|
||||
{
|
||||
die:
|
||||
{
|
||||
prikey = new ByteArrayOutputStream();
|
||||
out.println("BOB " + BOBversion);
|
||||
out.println("OK");
|
||||
while ((line = in.readLine()) != null) {
|
||||
StringTokenizer token = new StringTokenizer(line, " "); // use a space as a delimiter
|
||||
String Command = "";
|
||||
String Arg = "";
|
||||
NamedDB info;
|
||||
|
||||
if (token.countTokens() != 0) {
|
||||
Command = token.nextToken();
|
||||
Command =
|
||||
Command.toLowerCase(Locale.US);
|
||||
if (token.countTokens() != 0) {
|
||||
Arg = token.nextToken();
|
||||
} else {
|
||||
Arg = "";
|
||||
}
|
||||
// The rest of the tokens are considered junk,
|
||||
// and discarded without any warnings.
|
||||
if (Command.equals(C_help)) {
|
||||
for (int i = 0; !C_ALL[i][0].equals(" "); i++) {
|
||||
if (C_ALL[i][0].equalsIgnoreCase(Arg)) {
|
||||
out.println("OK " + C_ALL[i][1]);
|
||||
}
|
||||
}
|
||||
} else if (Command.equals(C_visit)) {
|
||||
visitAllThreads();
|
||||
out.println("OK ");
|
||||
} else if (Command.equals(C_lookup)) {
|
||||
Destination dest = null;
|
||||
String reply = null;
|
||||
if (Arg.endsWith(".i2p")) {
|
||||
try {
|
||||
//try {
|
||||
//dest = I2PTunnel.destFromName(Arg);
|
||||
//} catch (DataFormatException ex) {
|
||||
//}
|
||||
dest = I2PAppContext.getGlobalContext().namingService().lookup(Arg);
|
||||
if(dest != null) {
|
||||
reply = dest.toBase64();
|
||||
}
|
||||
} catch (NullPointerException npe) {
|
||||
// Could not find the destination!?
|
||||
}
|
||||
}
|
||||
if (reply == null) {
|
||||
out.println("ERROR Address Not found.");
|
||||
} else {
|
||||
out.println("OK " + reply);
|
||||
}
|
||||
} else if (Command.equals(C_getdest)) {
|
||||
if (ns) {
|
||||
if (dk) {
|
||||
rlock();
|
||||
try {
|
||||
out.println("OK " + nickinfo.get(P_DEST));
|
||||
} catch (Exception e) {
|
||||
break die;
|
||||
} finally {
|
||||
runlock();
|
||||
}
|
||||
} else {
|
||||
out.println("ERROR keys not set.");
|
||||
}
|
||||
} else {
|
||||
nns(out);
|
||||
}
|
||||
|
||||
} else if (Command.equals(C_list)) {
|
||||
// Produce a formatted list of all nicknames
|
||||
database.getReadLock();
|
||||
try {
|
||||
for (Object ndb : database.values()) {
|
||||
try {
|
||||
info = (NamedDB) ndb;
|
||||
out.print("DATA");
|
||||
} catch (Exception e) {
|
||||
break die;
|
||||
}
|
||||
nickprint(out, info);
|
||||
}
|
||||
} finally {
|
||||
database.releaseReadLock();
|
||||
}
|
||||
out.println("OK Listing done");
|
||||
} else if (Command.equals(C_quit)) {
|
||||
// End the command session
|
||||
break quit;
|
||||
} else if (Command.equals(C_zap)) {
|
||||
// Kill BOB!! (let's hope this works!)
|
||||
LIVE.set(false);
|
||||
// End the command session
|
||||
break quit;
|
||||
} else if (Command.equals(C_newkeys)) {
|
||||
if (ns) {
|
||||
try {
|
||||
if (tunnelactive(nickinfo)) {
|
||||
out.println("ERROR tunnel is active");
|
||||
} else {
|
||||
try {
|
||||
// Make a new PublicKey and PrivateKey
|
||||
prikey = new ByteArrayOutputStream();
|
||||
d = I2PClientFactory.createClient().createDestination(prikey);
|
||||
wlock();
|
||||
try {
|
||||
nickinfo.add(P_KEYS, prikey.toByteArray());
|
||||
nickinfo.add(P_DEST, d.toBase64());
|
||||
out.println("OK " + nickinfo.get(P_DEST));
|
||||
} catch (Exception e) {
|
||||
break die;
|
||||
} finally {
|
||||
wunlock();
|
||||
}
|
||||
dk = true;
|
||||
} catch (I2PException ipe) {
|
||||
_log.error("Error generating keys", ipe);
|
||||
out.println("ERROR generating keys");
|
||||
}
|
||||
}
|
||||
} catch (Exception e) {
|
||||
break die;
|
||||
}
|
||||
} else {
|
||||
nns(out);
|
||||
}
|
||||
|
||||
} else if (Command.equals(C_getkeys)) {
|
||||
// Return public key
|
||||
if (dk) {
|
||||
prikey = new ByteArrayOutputStream();
|
||||
rlock();
|
||||
try {
|
||||
prikey.write(((byte[]) nickinfo.get(P_KEYS)));
|
||||
} catch (Exception ex) {
|
||||
break die;
|
||||
} finally {
|
||||
runlock();
|
||||
}
|
||||
out.println("OK " + net.i2p.data.Base64.encode(prikey.toByteArray()));
|
||||
} else {
|
||||
out.println("ERROR no public key has been set");
|
||||
}
|
||||
|
||||
} else if (Command.equals(C_quiet)) {
|
||||
if (ns) {
|
||||
try {
|
||||
if (tunnelactive(nickinfo)) {
|
||||
out.println("ERROR tunnel is active");
|
||||
} else {
|
||||
wlock();
|
||||
try {
|
||||
nickinfo.add(P_QUIET, Boolean.valueOf(Arg));
|
||||
} catch (Exception ex) {
|
||||
break die;
|
||||
} finally {
|
||||
wunlock();
|
||||
}
|
||||
out.println("OK Quiet set");
|
||||
}
|
||||
} catch (Exception ex) {
|
||||
break die;
|
||||
}
|
||||
} else {
|
||||
nns(out);
|
||||
}
|
||||
|
||||
} else if (Command.equals(C_verify)) {
|
||||
if (is64ok(Arg)) {
|
||||
out.println("OK");
|
||||
} else {
|
||||
out.println("ERROR not in BASE64 format");
|
||||
}
|
||||
} else if (Command.equals(C_setkeys)) {
|
||||
// Set the NamedDB to a privatekey in BASE64 format
|
||||
if (ns) {
|
||||
try {
|
||||
if (tunnelactive(nickinfo)) {
|
||||
out.println("ERROR tunnel is active");
|
||||
} else {
|
||||
try {
|
||||
prikey = new ByteArrayOutputStream();
|
||||
prikey.write(net.i2p.data.Base64.decode(Arg));
|
||||
d = new Destination();
|
||||
d.fromBase64(Arg);
|
||||
} catch (Exception ex) {
|
||||
Arg = "";
|
||||
}
|
||||
|
||||
if ((Arg.length() == 884) && is64ok(Arg)) {
|
||||
wlock();
|
||||
try {
|
||||
nickinfo.add(P_KEYS, prikey.toByteArray());
|
||||
nickinfo.add(P_DEST, d.toBase64());
|
||||
out.println("OK " + nickinfo.get(P_DEST));
|
||||
} catch (Exception ex) {
|
||||
break die;
|
||||
} finally {
|
||||
wunlock();
|
||||
}
|
||||
dk = true;
|
||||
} else {
|
||||
out.println("ERROR not in BASE64 format");
|
||||
}
|
||||
}
|
||||
} catch (Exception ex) {
|
||||
break die;
|
||||
}
|
||||
} else {
|
||||
nns(out);
|
||||
}
|
||||
|
||||
} else if (Command.equals(C_setnick)) {
|
||||
ns = dk = ip = op = false;
|
||||
database.getReadLock();
|
||||
try {
|
||||
nickinfo = (NamedDB) database.get(Arg);
|
||||
if (!tunnelactive(nickinfo)) {
|
||||
nickinfo = null;
|
||||
ns = true;
|
||||
}
|
||||
|
||||
} catch (Exception b) {
|
||||
nickinfo = null;
|
||||
ns = true;
|
||||
} finally {
|
||||
database.releaseReadLock();
|
||||
}
|
||||
// Clears and Sets the initial NamedDB structure to work with
|
||||
if (ns) {
|
||||
nickinfo = new NamedDB();
|
||||
wlock();
|
||||
try {
|
||||
database.add(Arg, nickinfo);
|
||||
nickinfo.add(P_NICKNAME, Arg);
|
||||
nickinfo.add(P_STARTING, Boolean.FALSE);
|
||||
nickinfo.add(P_RUNNING, Boolean.FALSE);
|
||||
nickinfo.add(P_STOPPING, Boolean.FALSE);
|
||||
nickinfo.add(P_QUIET, Boolean.FALSE);
|
||||
nickinfo.add(P_INHOST, "localhost");
|
||||
nickinfo.add(P_OUTHOST, "localhost");
|
||||
Properties Q = new Properties();
|
||||
Lifted.copyProperties(this.props, Q);
|
||||
Q.setProperty("inbound.nickname", Arg);
|
||||
Q.setProperty("outbound.nickname", Arg);
|
||||
nickinfo.add(P_PROPERTIES, Q);
|
||||
} catch (Exception e) {
|
||||
break die;
|
||||
} finally {
|
||||
wunlock();
|
||||
}
|
||||
out.println("OK Nickname set to " + Arg);
|
||||
} else {
|
||||
out.println("ERROR tunnel is active");
|
||||
}
|
||||
|
||||
} else if (Command.equals(C_option)) {
|
||||
if (ns) {
|
||||
try {
|
||||
if (tunnelactive(nickinfo)) {
|
||||
out.println("ERROR tunnel is active");
|
||||
} else {
|
||||
StringTokenizer otoken = new StringTokenizer(Arg, "="); // use an equal sign as a delimiter
|
||||
if (otoken.countTokens() != 2) {
|
||||
out.println("ERROR too many or no options.");
|
||||
} else {
|
||||
String pname = otoken.nextToken();
|
||||
String pval = otoken.nextToken();
|
||||
wlock();
|
||||
try {
|
||||
Properties Q = (Properties) nickinfo.get(P_PROPERTIES);
|
||||
Q.setProperty(pname, pval);
|
||||
nickinfo.add(P_PROPERTIES, Q);
|
||||
} catch (Exception ex) {
|
||||
break die;
|
||||
} finally {
|
||||
wunlock();
|
||||
}
|
||||
out.println("OK " + pname + " set to " + pval);
|
||||
}
|
||||
}
|
||||
} catch (Exception ex) {
|
||||
break die;
|
||||
}
|
||||
} else {
|
||||
nns(out);
|
||||
}
|
||||
|
||||
} else if (Command.equals(C_getnick)) {
|
||||
// Get the NamedDB to work with...
|
||||
boolean nsfail = false;
|
||||
database.getReadLock();
|
||||
try {
|
||||
nickinfo = (NamedDB) database.get(Arg);
|
||||
ns = true;
|
||||
} catch (RuntimeException b) {
|
||||
nsfail = true;
|
||||
nns(out);
|
||||
} finally {
|
||||
database.releaseReadLock();
|
||||
}
|
||||
if (ns && !nsfail) {
|
||||
rlock();
|
||||
try {
|
||||
dk = nickinfo.exists(P_KEYS);
|
||||
ip = nickinfo.exists(P_INPORT);
|
||||
op = nickinfo.exists(P_OUTPORT);
|
||||
} catch (Exception ex) {
|
||||
break die;
|
||||
} finally {
|
||||
runlock();
|
||||
}
|
||||
// Finally say OK.
|
||||
out.println("OK Nickname set to " + Arg);
|
||||
}
|
||||
|
||||
} else if (Command.equals(C_inport)) {
|
||||
// Set the NamedDB inbound TO the router port
|
||||
// app --> BOB
|
||||
if (ns) {
|
||||
try {
|
||||
if (tunnelactive(nickinfo)) {
|
||||
out.println("ERROR tunnel is active");
|
||||
} else {
|
||||
int prt;
|
||||
wlock();
|
||||
try {
|
||||
nickinfo.kill(P_INPORT);
|
||||
prt = Integer.parseInt(Arg);
|
||||
if (prt > 1 && prt < 65536) {
|
||||
try {
|
||||
nickinfo.add(P_INPORT, Integer.valueOf(prt));
|
||||
} catch (Exception ex) {
|
||||
break die;
|
||||
}
|
||||
}
|
||||
ip = nickinfo.exists(P_INPORT);
|
||||
} catch (NumberFormatException nfe) {
|
||||
out.println("ERROR not a number");
|
||||
} finally {
|
||||
wunlock();
|
||||
}
|
||||
if (ip) {
|
||||
out.println("OK inbound port set");
|
||||
} else {
|
||||
out.println("ERROR port out of range");
|
||||
}
|
||||
}
|
||||
} catch (Exception ex) {
|
||||
break die;
|
||||
}
|
||||
} else {
|
||||
nns(out);
|
||||
}
|
||||
|
||||
} else if (Command.equals(C_outport)) {
|
||||
// Set the NamedDB outbound FROM the router port
|
||||
// BOB --> app
|
||||
if (ns) {
|
||||
try {
|
||||
if (tunnelactive(nickinfo)) {
|
||||
out.println("ERROR tunnel is active");
|
||||
} else {
|
||||
int prt;
|
||||
wlock();
|
||||
try {
|
||||
nickinfo.kill(P_OUTPORT);
|
||||
prt = Integer.parseInt(Arg);
|
||||
if (prt > 1 && prt < 65536) {
|
||||
nickinfo.add(P_OUTPORT, Integer.valueOf(prt));
|
||||
}
|
||||
ip = nickinfo.exists(P_OUTPORT);
|
||||
} catch (NumberFormatException nfe) {
|
||||
out.println("ERROR not a number");
|
||||
} catch (Exception ex) {
|
||||
break die;
|
||||
} finally {
|
||||
wunlock();
|
||||
}
|
||||
if (ip) {
|
||||
out.println("OK outbound port set");
|
||||
} else {
|
||||
out.println("ERROR port out of range");
|
||||
}
|
||||
}
|
||||
} catch (Exception ex) {
|
||||
break die;
|
||||
}
|
||||
} else {
|
||||
nns(out);
|
||||
}
|
||||
|
||||
} else if (Command.equals(C_inhost)) {
|
||||
if (ns) {
|
||||
try {
|
||||
if (tunnelactive(nickinfo)) {
|
||||
out.println("ERROR tunnel is active");
|
||||
} else {
|
||||
wlock();
|
||||
try {
|
||||
nickinfo.add(P_INHOST, Arg);
|
||||
} catch (Exception ex) {
|
||||
break die;
|
||||
} finally {
|
||||
wunlock();
|
||||
}
|
||||
out.println("OK inhost set");
|
||||
}
|
||||
} catch (Exception ex) {
|
||||
break die;
|
||||
}
|
||||
} else {
|
||||
nns(out);
|
||||
}
|
||||
|
||||
} else if (Command.equals(C_outhost)) {
|
||||
if (ns) {
|
||||
try {
|
||||
if (tunnelactive(nickinfo)) {
|
||||
out.println("ERROR tunnel is active");
|
||||
} else {
|
||||
wlock();
|
||||
try {
|
||||
nickinfo.add(P_OUTHOST, Arg);
|
||||
} catch (Exception ex) {
|
||||
break die;
|
||||
} finally {
|
||||
wunlock();
|
||||
}
|
||||
out.println("OK outhost set");
|
||||
}
|
||||
} catch (Exception ex) {
|
||||
break die;
|
||||
}
|
||||
} else {
|
||||
nns(out);
|
||||
}
|
||||
|
||||
} else if (Command.equals(C_show)) {
|
||||
// Get the current NamedDB properties
|
||||
if (ns) {
|
||||
out.print("OK");
|
||||
nickprint(out, nickinfo);
|
||||
} else {
|
||||
nns(out);
|
||||
}
|
||||
|
||||
} else if (Command.equals(C_show_props)) {
|
||||
// Get the current options properties
|
||||
if (ns) {
|
||||
out.print("OK");
|
||||
propprint(out, nickinfo);
|
||||
} else {
|
||||
nns(out);
|
||||
}
|
||||
|
||||
} else if (Command.equals(C_start)) {
|
||||
// Start the tunnel, if we have all the information
|
||||
if (ns && dk && (ip || op)) {
|
||||
try {
|
||||
if (tunnelactive(nickinfo)) {
|
||||
out.println("ERROR tunnel is active");
|
||||
} else {
|
||||
MUXlisten tunnel;
|
||||
try {
|
||||
while (!lock.compareAndSet(false, true)) {
|
||||
// wait
|
||||
}
|
||||
tunnel = new MUXlisten(lock, database, nickinfo, _log);
|
||||
Thread t = new I2PAppThread(tunnel);
|
||||
t.start();
|
||||
// try {
|
||||
// Thread.sleep(1000 * 10); // Slow down the startup.
|
||||
// } catch(InterruptedException ie) {
|
||||
// // ignore it
|
||||
// }
|
||||
out.println("OK tunnel starting");
|
||||
} catch (I2PException e) {
|
||||
lock.set(false);
|
||||
out.println("ERROR starting tunnel: " + e);
|
||||
} catch (IOException e) {
|
||||
lock.set(false);
|
||||
out.println("ERROR starting tunnel: " + e);
|
||||
}
|
||||
}
|
||||
} catch (Exception ex) {
|
||||
break die;
|
||||
}
|
||||
|
||||
} else {
|
||||
out.println("ERROR tunnel settings incomplete");
|
||||
}
|
||||
|
||||
} else if (Command.equals(C_stop)) {
|
||||
// Stop the tunnel, if it is running
|
||||
if (ns) {
|
||||
rlock();
|
||||
boolean released = false;
|
||||
try {
|
||||
if (nickinfo.get(P_RUNNING).equals(Boolean.TRUE) && nickinfo.get(P_STOPPING).equals(Boolean.FALSE) && nickinfo.get(P_STARTING).equals(Boolean.FALSE)) {
|
||||
runlock();
|
||||
released = true;
|
||||
wlock();
|
||||
try {
|
||||
nickinfo.add(P_STOPPING, Boolean.TRUE);
|
||||
} catch (Exception e) {
|
||||
break die;
|
||||
} finally {
|
||||
wunlock();
|
||||
}
|
||||
out.println("OK tunnel stopping");
|
||||
} else {
|
||||
out.println("ERROR tunnel is inactive");
|
||||
}
|
||||
} catch (Exception e) {
|
||||
break die;
|
||||
} finally {
|
||||
if (!released)
|
||||
runlock();
|
||||
}
|
||||
} else {
|
||||
nns(out);
|
||||
}
|
||||
|
||||
} else if (Command.equals(C_clear)) {
|
||||
// Clear use of the NamedDB if stopped
|
||||
if (ns) {
|
||||
try {
|
||||
if (tunnelactive(nickinfo)) {
|
||||
out.println("ERROR tunnel is active");
|
||||
} else {
|
||||
database.getWriteLock();
|
||||
try {
|
||||
database.kill((String) nickinfo.get(P_NICKNAME));
|
||||
} catch (Exception e) {
|
||||
} finally {
|
||||
database.releaseWriteLock();
|
||||
}
|
||||
dk = ns = ip = op = false;
|
||||
out.println("OK cleared");
|
||||
}
|
||||
|
||||
} catch (Exception ex) {
|
||||
break die;
|
||||
}
|
||||
} else {
|
||||
nns(out);
|
||||
}
|
||||
|
||||
} else if (Command.equals(C_status)) {
|
||||
database.getReadLock();
|
||||
try {
|
||||
if (database.exists(Arg)) {
|
||||
// Show status of a NamedDB
|
||||
out.print("OK ");
|
||||
try {
|
||||
ttlpnt(out, Arg);
|
||||
} catch (Exception e) {
|
||||
out.println(); // this will cause an IOE if IOE
|
||||
break die;
|
||||
}
|
||||
} else {
|
||||
nns(out);
|
||||
}
|
||||
} catch (Exception e) {
|
||||
break die;
|
||||
} finally {
|
||||
database.releaseReadLock();
|
||||
}
|
||||
} else {
|
||||
out.println("ERROR UNKNOWN COMMAND! Try help");
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
} // die
|
||||
out.print("ERROR A really bad error just happened, ");
|
||||
} // quit
|
||||
// Say goodbye.
|
||||
|
||||
out.println("OK Bye!");
|
||||
|
||||
} catch (IOException ioe) {
|
||||
// not really needed, except to debug.
|
||||
// BOB.warn("IOException on socket listen: " + ioe);
|
||||
// ioe.printStackTrace();
|
||||
}
|
||||
} finally {
|
||||
try {
|
||||
server.close();
|
||||
} catch (IOException ex) {
|
||||
// nop
|
||||
}
|
||||
}
|
||||
}
|
||||
// Debugging... None of this is normally used.
|
||||
|
||||
/**
|
||||
* Find the root thread group and print them all.
|
||||
*
|
||||
*/
|
||||
private void visitAllThreads() {
|
||||
ThreadGroup root = Thread.currentThread().getThreadGroup().getParent();
|
||||
while (root.getParent() != null) {
|
||||
root = root.getParent();
|
||||
}
|
||||
|
||||
// Visit each thread group
|
||||
visit(root, 0, root.getName());
|
||||
}
|
||||
|
||||
/**
|
||||
* Recursively visits all thread groups under `group' and dumps them.
|
||||
* @param group ThreadGroup to visit
|
||||
* @param level Current level
|
||||
*/
|
||||
private static void visit(ThreadGroup group, int level, String tn) {
|
||||
// Get threads in `group'
|
||||
int numThreads = group.activeCount();
|
||||
Thread[] threads = new Thread[numThreads * 2];
|
||||
numThreads = group.enumerate(threads, false);
|
||||
String indent = "------------------------------------".substring(0, level) + "-> ";
|
||||
// Enumerate each thread in `group' and print it.
|
||||
for (int i = 0; i < numThreads; i++) {
|
||||
// Get thread
|
||||
Thread thread = threads[i];
|
||||
System.out.println("BOB: " + indent + tn + ": " + thread.toString());
|
||||
}
|
||||
|
||||
// Get thread subgroups of `group'
|
||||
int numGroups = group.activeGroupCount();
|
||||
ThreadGroup[] groups = new ThreadGroup[numGroups * 2];
|
||||
numGroups = group.enumerate(groups, false);
|
||||
|
||||
// Recursively visit each subgroup
|
||||
for (int i = 0; i < numGroups; i++) {
|
||||
visit(groups[i], level + 1, groups[i].getName());
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,99 +0,0 @@
|
||||
/**
|
||||
* WTFPL
|
||||
* Version 2, December 2004
|
||||
*
|
||||
* Copyright (C) sponge
|
||||
* Planet Earth
|
||||
*
|
||||
* See...
|
||||
*
|
||||
* http://sam.zoy.org/wtfpl/
|
||||
* and
|
||||
* http://en.wikipedia.org/wiki/WTFPL
|
||||
*
|
||||
* ...for any additional details and license questions.
|
||||
*/
|
||||
package net.i2p.BOB;
|
||||
|
||||
import java.net.ConnectException;
|
||||
import java.net.SocketTimeoutException;
|
||||
import java.util.concurrent.atomic.AtomicBoolean;
|
||||
|
||||
import net.i2p.I2PException;
|
||||
import net.i2p.client.streaming.I2PServerSocket;
|
||||
import net.i2p.client.streaming.I2PSocket;
|
||||
import net.i2p.client.streaming.I2PSocketManager;
|
||||
import net.i2p.util.I2PAppThread;
|
||||
|
||||
/**
|
||||
* Listen on I2P and connect to TCP
|
||||
*
|
||||
* @author sponge
|
||||
*/
|
||||
public class I2Plistener implements Runnable {
|
||||
|
||||
private final NamedDB info, database;
|
||||
private final Logger _log;
|
||||
private final I2PServerSocket serverSocket;
|
||||
private final AtomicBoolean lives;
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
* @param SS
|
||||
* @param S unused
|
||||
* @param info
|
||||
* @param database
|
||||
* @param _log
|
||||
*/
|
||||
I2Plistener(I2PServerSocket SS, I2PSocketManager S, NamedDB info, NamedDB database, Logger _log, AtomicBoolean lives) {
|
||||
this.database = database;
|
||||
this.info = info;
|
||||
this._log = _log;
|
||||
this.serverSocket = SS;
|
||||
this.lives = lives;
|
||||
}
|
||||
|
||||
/**
|
||||
* Simply listen on I2P port, and thread connections
|
||||
*
|
||||
*/
|
||||
public void run() {
|
||||
boolean g = false;
|
||||
I2PSocket sessSocket = null;
|
||||
int conn = 0;
|
||||
try {
|
||||
try {
|
||||
serverSocket.setSoTimeout(50);
|
||||
|
||||
while (lives.get()) {
|
||||
try {
|
||||
sessSocket = serverSocket.accept();
|
||||
g = true;
|
||||
} catch (ConnectException ce) {
|
||||
g = false;
|
||||
} catch (SocketTimeoutException ste) {
|
||||
g = false;
|
||||
}
|
||||
if (g) {
|
||||
g = false;
|
||||
conn++;
|
||||
// toss the connection to a new thread.
|
||||
I2PtoTCP conn_c = new I2PtoTCP(sessSocket, info, database, lives);
|
||||
Thread t = new I2PAppThread(conn_c, Thread.currentThread().getName() + " I2PtoTCP " + conn);
|
||||
t.start();
|
||||
}
|
||||
|
||||
}
|
||||
} catch (I2PException e) {
|
||||
// bad stuff
|
||||
System.out.println("Exception " + e);
|
||||
}
|
||||
} finally {
|
||||
try {
|
||||
serverSocket.close();
|
||||
} catch (I2PException ex) {
|
||||
}
|
||||
// System.out.println("I2Plistener: Close");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,169 +0,0 @@
|
||||
/**
|
||||
* WTFPL
|
||||
* Version 2, December 2004
|
||||
*
|
||||
* Copyright (C) sponge
|
||||
* Planet Earth
|
||||
*
|
||||
* See...
|
||||
*
|
||||
* http://sam.zoy.org/wtfpl/
|
||||
* and
|
||||
* http://en.wikipedia.org/wiki/WTFPL
|
||||
*
|
||||
* ...for any additional details and license questions.
|
||||
*/
|
||||
package net.i2p.BOB;
|
||||
|
||||
import java.io.InputStream;
|
||||
import java.io.OutputStream;
|
||||
import java.net.Socket;
|
||||
import java.util.concurrent.atomic.AtomicBoolean;
|
||||
|
||||
import net.i2p.client.streaming.I2PSocket;
|
||||
import net.i2p.data.DataHelper;
|
||||
import net.i2p.util.I2PAppThread;
|
||||
|
||||
/**
|
||||
* Process I2P->TCP
|
||||
*
|
||||
* @author sponge
|
||||
*/
|
||||
public class I2PtoTCP implements Runnable {
|
||||
|
||||
private I2PSocket I2P;
|
||||
private final NamedDB info, database;
|
||||
private Socket sock;
|
||||
private final AtomicBoolean lives;
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*
|
||||
* @param I2Psock
|
||||
* @param info
|
||||
* @param database
|
||||
*/
|
||||
I2PtoTCP(I2PSocket I2Psock, NamedDB info, NamedDB database, AtomicBoolean lives) {
|
||||
this.I2P = I2Psock;
|
||||
this.info = info;
|
||||
this.database = database;
|
||||
this.lives = lives;
|
||||
}
|
||||
|
||||
private void rlock() {
|
||||
database.getReadLock();
|
||||
info.getReadLock();
|
||||
}
|
||||
|
||||
private void runlock() {
|
||||
info.releaseReadLock();
|
||||
database.releaseReadLock();
|
||||
}
|
||||
|
||||
/**
|
||||
* I2P stream to TCP stream thread starter
|
||||
*
|
||||
*/
|
||||
public void run() {
|
||||
String host;
|
||||
int port;
|
||||
boolean tell;
|
||||
InputStream in = null;
|
||||
OutputStream out = null;
|
||||
InputStream Iin = null;
|
||||
OutputStream Iout = null;
|
||||
Thread t = null;
|
||||
Thread q = null;
|
||||
try {
|
||||
die:
|
||||
{
|
||||
try {
|
||||
rlock();
|
||||
try {
|
||||
host = info.get("OUTHOST").toString();
|
||||
port = Integer.parseInt(info.get("OUTPORT").toString());
|
||||
tell = info.get("QUIET").equals(Boolean.FALSE);
|
||||
} catch (Exception e) {
|
||||
break die;
|
||||
} finally {
|
||||
runlock();
|
||||
}
|
||||
sock = new Socket(host, port);
|
||||
sock.setKeepAlive(true);
|
||||
// make readers/writers
|
||||
in = sock.getInputStream();
|
||||
out = sock.getOutputStream();
|
||||
Iin = I2P.getInputStream();
|
||||
Iout = I2P.getOutputStream();
|
||||
I2P.setReadTimeout(0); // temp bugfix, this *SHOULD* be the default
|
||||
|
||||
if (tell) {
|
||||
// tell who is connecting
|
||||
out.write(DataHelper.getASCII(I2P.getPeerDestination().toBase64()));
|
||||
out.write(10); // nl
|
||||
out.flush(); // not really needed, but...
|
||||
}
|
||||
// setup to cross the streams
|
||||
TCPio conn_c = new TCPio(in, Iout, lives); // app -> I2P
|
||||
TCPio conn_a = new TCPio(Iin, out, lives); // I2P -> app
|
||||
t = new I2PAppThread(conn_c, Thread.currentThread().getName() + " TCPioA");
|
||||
q = new I2PAppThread(conn_a, Thread.currentThread().getName() + " TCPioB");
|
||||
// Fire!
|
||||
t.start();
|
||||
q.start();
|
||||
while (t.isAlive() && q.isAlive() && lives.get()) { // AND is used here to kill off the other thread
|
||||
try {
|
||||
Thread.sleep(10); //sleep for 10 ms
|
||||
} catch (InterruptedException e) {
|
||||
break die;
|
||||
}
|
||||
}
|
||||
// System.out.println("I2PtoTCP: Going away...");
|
||||
} catch (Exception e) {
|
||||
// System.out.println("I2PtoTCP: Owch! damn!");
|
||||
break die;
|
||||
}
|
||||
} // die
|
||||
} finally {
|
||||
try {
|
||||
in.close();
|
||||
} catch (Exception ex) {
|
||||
}
|
||||
try {
|
||||
out.close();
|
||||
} catch (Exception ex) {
|
||||
}
|
||||
try {
|
||||
Iin.close();
|
||||
} catch (Exception ex) {
|
||||
}
|
||||
try {
|
||||
Iout.close();
|
||||
} catch (Exception ex) {
|
||||
}
|
||||
try {
|
||||
t.interrupt();
|
||||
} catch (Exception e) {
|
||||
}
|
||||
try {
|
||||
q.interrupt();
|
||||
} catch (Exception e) {
|
||||
}
|
||||
try {
|
||||
// System.out.println("I2PtoTCP: Close I2P");
|
||||
I2P.close();
|
||||
} catch (Exception e) {
|
||||
tell = false;
|
||||
}
|
||||
//System.out.println("I2PtoTCP: Closed I2P");
|
||||
try {
|
||||
// System.out.println("I2PtoTCP: Close sock");
|
||||
sock.close();
|
||||
} catch (Exception e) {
|
||||
tell = false;
|
||||
}
|
||||
// System.out.println("I2PtoTCP: Done");
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,46 +0,0 @@
|
||||
/**
|
||||
* WTFPL
|
||||
* Version 2, December 2004
|
||||
*
|
||||
* Copyright (C) sponge
|
||||
* Planet Earth
|
||||
*
|
||||
* See...
|
||||
*
|
||||
* http://sam.zoy.org/wtfpl/
|
||||
* and
|
||||
* http://en.wikipedia.org/wiki/WTFPL
|
||||
*
|
||||
* ...for any additional details and license questions.
|
||||
*/
|
||||
package net.i2p.BOB;
|
||||
|
||||
import java.util.Map;
|
||||
import java.util.Properties;
|
||||
|
||||
/**
|
||||
* Sets of "friendly" utilities to make life easier.
|
||||
* Any "Lifted" code will apear here, and credits given.
|
||||
* It's better to "Lift" a small chunk of "free" code than add in piles of
|
||||
* code we don't need, and don't want.
|
||||
*
|
||||
* @author sponge
|
||||
*/
|
||||
public class Lifted {
|
||||
|
||||
/**
|
||||
* Copy a set of properties from one Property to another.
|
||||
* Lifted from Apache Derby code svn repository.
|
||||
* Liscenced as follows:
|
||||
* http://svn.apache.org/repos/asf/db/derby/code/trunk/LICENSE
|
||||
*
|
||||
* @param src_prop Source set of properties to copy from.
|
||||
* @param dest_prop Dest Properties to copy into.
|
||||
*
|
||||
**/
|
||||
public static void copyProperties(Properties src_prop, Properties dest_prop) {
|
||||
for (Map.Entry<Object, Object> e : src_prop.entrySet()) {
|
||||
dest_prop.put((String)e.getKey(), (String)e.getValue());
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,44 +0,0 @@
|
||||
package net.i2p.BOB;
|
||||
|
||||
import net.i2p.util.Log;
|
||||
|
||||
public class Logger {
|
||||
public Log log;
|
||||
private boolean logToStdout;
|
||||
|
||||
public Logger(Log log, boolean logToStdout) {
|
||||
this.log = log;
|
||||
this.logToStdout = logToStdout;
|
||||
}
|
||||
|
||||
public void info(String msg) {
|
||||
if (logToStdout)
|
||||
System.out.println("INFO: " + msg);
|
||||
if (log.shouldLog(Log.INFO))
|
||||
log.info(msg);
|
||||
}
|
||||
|
||||
public void warn(String msg) {
|
||||
warn(msg, null);
|
||||
}
|
||||
|
||||
public void warn(String msg, Throwable e) {
|
||||
if (logToStdout) {
|
||||
System.out.println("WARNING: " + msg);
|
||||
if (e != null)
|
||||
e.printStackTrace();
|
||||
}
|
||||
if (log.shouldLog(Log.WARN))
|
||||
log.warn(msg, e);
|
||||
}
|
||||
|
||||
public void error(String msg, Throwable e) {
|
||||
if (logToStdout) {
|
||||
System.out.println("ERROR: " + msg);
|
||||
if (e != null)
|
||||
e.printStackTrace();
|
||||
}
|
||||
if (log.shouldLog(Log.ERROR))
|
||||
log.error(msg, e);
|
||||
}
|
||||
}
|
||||
@@ -1,416 +0,0 @@
|
||||
/**
|
||||
* WTFPL
|
||||
* Version 2, December 2004
|
||||
*
|
||||
* Copyright (C) sponge
|
||||
* Planet Earth
|
||||
*
|
||||
* See...
|
||||
*
|
||||
* http://sam.zoy.org/wtfpl/
|
||||
* and
|
||||
* http://en.wikipedia.org/wiki/WTFPL
|
||||
*
|
||||
* ...for any additional details and license questions.
|
||||
*/
|
||||
package net.i2p.BOB;
|
||||
|
||||
import java.io.ByteArrayInputStream;
|
||||
import java.io.IOException;
|
||||
import java.net.InetAddress;
|
||||
import java.net.ServerSocket;
|
||||
import java.util.Properties;
|
||||
import java.util.concurrent.atomic.AtomicBoolean;
|
||||
|
||||
import net.i2p.I2PException;
|
||||
import net.i2p.client.I2PClient;
|
||||
import net.i2p.client.streaming.I2PServerSocket;
|
||||
import net.i2p.client.streaming.I2PSocketManager;
|
||||
import net.i2p.client.streaming.I2PSocketManagerFactory;
|
||||
import net.i2p.util.I2PAppThread;
|
||||
import net.i2p.util.Log;
|
||||
|
||||
/**
|
||||
*
|
||||
* Multiplex listeners for TCP and I2P
|
||||
*
|
||||
* @author sponge
|
||||
*/
|
||||
public class MUXlisten implements Runnable {
|
||||
|
||||
private final NamedDB database, info;
|
||||
private final Logger _log;
|
||||
private final I2PSocketManager socketManager;
|
||||
private final ByteArrayInputStream prikey;
|
||||
private ThreadGroup tg;
|
||||
private final String N;
|
||||
private ServerSocket listener;
|
||||
private static final int backlog = 50; // should this be more? less?
|
||||
private final boolean go_out;
|
||||
private final boolean come_in;
|
||||
private final AtomicBoolean lock;
|
||||
private final AtomicBoolean lives;
|
||||
|
||||
/**
|
||||
* Constructor Will fail if INPORT is occupied.
|
||||
*
|
||||
* @param info DB entry for this tunnel
|
||||
* @param database master database of tunnels
|
||||
* @param _log
|
||||
* @throws net.i2p.I2PException
|
||||
* @throws java.io.IOException
|
||||
*/
|
||||
MUXlisten(AtomicBoolean lock, NamedDB database, NamedDB info, Logger _log) throws I2PException, IOException, RuntimeException {
|
||||
int port = 0;
|
||||
InetAddress host = null;
|
||||
this.lock = lock;
|
||||
this.tg = null;
|
||||
this.database = database;
|
||||
this.info = info;
|
||||
this._log = _log;
|
||||
lives = new AtomicBoolean(false);
|
||||
try {
|
||||
wlock();
|
||||
try {
|
||||
this.info.add("STARTING", Boolean.TRUE);
|
||||
} finally {
|
||||
wunlock();
|
||||
}
|
||||
Properties Q = new Properties();
|
||||
rlock();
|
||||
try {
|
||||
N = this.info.get("NICKNAME").toString();
|
||||
prikey = new ByteArrayInputStream((byte[]) info.get("KEYS"));
|
||||
// Make a new copy so that anything else won't muck with our database.
|
||||
Properties R = (Properties) info.get("PROPERTIES");
|
||||
Lifted.copyProperties(R, Q);
|
||||
|
||||
this.go_out = info.exists("OUTPORT");
|
||||
this.come_in = info.exists("INPORT");
|
||||
if (this.come_in) {
|
||||
port = Integer.parseInt(info.get("INPORT").toString());
|
||||
host = InetAddress.getByName(info.get("INHOST").toString());
|
||||
}
|
||||
} finally {
|
||||
runlock();
|
||||
}
|
||||
|
||||
String i2cpHost = Q.getProperty(I2PClient.PROP_TCP_HOST, "127.0.0.1");
|
||||
int i2cpPort = I2PClient.DEFAULT_LISTEN_PORT;
|
||||
String i2cpPortStr = Q.getProperty(I2PClient.PROP_TCP_PORT);
|
||||
if (i2cpPortStr != null) {
|
||||
try {
|
||||
i2cpPort = Integer.parseInt(i2cpPortStr);
|
||||
} catch (NumberFormatException nfe) {
|
||||
throw new IllegalArgumentException("Invalid I2CP port specified [" + i2cpPortStr + "]");
|
||||
}
|
||||
}
|
||||
|
||||
if (this.come_in) {
|
||||
this.listener = new ServerSocket(port, backlog, host);
|
||||
}
|
||||
socketManager = I2PSocketManagerFactory.createManager(
|
||||
prikey, i2cpHost, i2cpPort, Q);
|
||||
} catch (IOException e) {
|
||||
// Something went bad.
|
||||
wlock();
|
||||
try {
|
||||
this.info.add("STARTING", Boolean.FALSE);
|
||||
} finally {
|
||||
wunlock();
|
||||
}
|
||||
throw e;
|
||||
} catch (RuntimeException e) {
|
||||
// Something went bad.
|
||||
wlock();
|
||||
try {
|
||||
this.info.add("STARTING", Boolean.FALSE);
|
||||
} finally {
|
||||
wunlock();
|
||||
}
|
||||
throw e;
|
||||
} catch (Exception e) {
|
||||
// Something else went bad.
|
||||
wlock();
|
||||
try {
|
||||
this.info.add("STARTING", Boolean.FALSE);
|
||||
} finally {
|
||||
wunlock();
|
||||
}
|
||||
e.printStackTrace();
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
private void rlock() {
|
||||
database.getReadLock();
|
||||
info.getReadLock();
|
||||
}
|
||||
|
||||
private void runlock() {
|
||||
info.releaseReadLock();
|
||||
database.releaseReadLock();
|
||||
}
|
||||
|
||||
private void wlock() {
|
||||
database.getWriteLock();
|
||||
info.getWriteLock();
|
||||
}
|
||||
|
||||
private void wunlock() {
|
||||
info.releaseWriteLock();
|
||||
database.releaseWriteLock();
|
||||
}
|
||||
|
||||
/**
|
||||
* MUX sockets, fire off a thread to connect, get destination info, and do I/O
|
||||
*
|
||||
*/
|
||||
public void run() {
|
||||
I2PServerSocket SS = null;
|
||||
Thread t = null;
|
||||
Thread q = null;
|
||||
try {
|
||||
wlock();
|
||||
try {
|
||||
try {
|
||||
info.add("RUNNING", Boolean.TRUE);
|
||||
} catch (Exception e) {
|
||||
lock.set(false);
|
||||
return;
|
||||
}
|
||||
} catch (Exception e) {
|
||||
lock.set(false);
|
||||
return;
|
||||
} finally {
|
||||
wunlock();
|
||||
}
|
||||
lives.set(true);
|
||||
lock.set(false);
|
||||
quit:
|
||||
{
|
||||
try {
|
||||
tg = new ThreadGroup(N);
|
||||
{
|
||||
// toss the connections to a new threads.
|
||||
// will wrap with TCP and UDP when UDP works
|
||||
|
||||
if (go_out) {
|
||||
// I2P -> TCP
|
||||
SS = socketManager.getServerSocket();
|
||||
I2Plistener conn = new I2Plistener(SS, socketManager, info, database, _log, lives);
|
||||
t = new I2PAppThread(tg, conn, "BOBI2Plistener " + N);
|
||||
t.start();
|
||||
}
|
||||
|
||||
if (come_in) {
|
||||
// TCP -> I2P
|
||||
TCPlistener conn = new TCPlistener(listener, socketManager, info, database, _log, lives);
|
||||
q = new I2PAppThread(tg, conn, "BOBTCPlistener " + N);
|
||||
q.start();
|
||||
}
|
||||
|
||||
wlock();
|
||||
try {
|
||||
try {
|
||||
info.add("STARTING", Boolean.FALSE);
|
||||
} catch (Exception e) {
|
||||
break quit;
|
||||
}
|
||||
} catch (Exception e) {
|
||||
break quit;
|
||||
} finally {
|
||||
wunlock();
|
||||
}
|
||||
boolean spin = true;
|
||||
while (spin && lives.get()) {
|
||||
try {
|
||||
Thread.sleep(1000); //sleep for 1 second
|
||||
} catch (InterruptedException e) {
|
||||
break quit;
|
||||
}
|
||||
rlock();
|
||||
try {
|
||||
try {
|
||||
spin = info.get("STOPPING").equals(Boolean.FALSE);
|
||||
} catch (Exception e) {
|
||||
break quit;
|
||||
}
|
||||
} catch (Exception e) {
|
||||
break quit;
|
||||
} finally {
|
||||
runlock();
|
||||
}
|
||||
}
|
||||
} // die
|
||||
|
||||
} catch (Exception e) {
|
||||
// System.out.println("MUXlisten: Caught an exception" + e);
|
||||
break quit;
|
||||
}
|
||||
} // quit
|
||||
} finally {
|
||||
lives.set(false);
|
||||
// Some grace time.
|
||||
try {
|
||||
Thread.sleep(100);
|
||||
} catch (InterruptedException ex) {
|
||||
}
|
||||
try {
|
||||
wlock();
|
||||
try {
|
||||
info.add("STARTING", Boolean.FALSE);
|
||||
info.add("STOPPING", Boolean.TRUE);
|
||||
info.add("RUNNING", Boolean.FALSE);
|
||||
} catch (Exception e) {
|
||||
lock.set(false);
|
||||
return;
|
||||
}
|
||||
} catch (Exception e) {
|
||||
} finally {
|
||||
wunlock();
|
||||
}
|
||||
// Start cleanup.
|
||||
while (!lock.compareAndSet(false, true)) {
|
||||
// wait
|
||||
}
|
||||
if (SS != null) {
|
||||
try {
|
||||
SS.close();
|
||||
} catch (I2PException ex) {
|
||||
}
|
||||
}
|
||||
if (listener != null) {
|
||||
try {
|
||||
listener.close();
|
||||
} catch (IOException e) {
|
||||
}
|
||||
}
|
||||
|
||||
// Some grace time.
|
||||
try {
|
||||
Thread.sleep(100);
|
||||
} catch (InterruptedException ex) {
|
||||
}
|
||||
|
||||
// Hopefully nuke stuff here...
|
||||
{
|
||||
String groupName = tg.getName();
|
||||
try {
|
||||
_log.warn("destroySocketManager " + groupName);
|
||||
socketManager.destroySocketManager();
|
||||
_log.warn("destroySocketManager Successful" + groupName);
|
||||
} catch (Exception e) {
|
||||
// nop
|
||||
_log.warn("destroySocketManager Failed" + groupName);
|
||||
_log.warn(e.toString());
|
||||
}
|
||||
}
|
||||
// zero out everything.
|
||||
try {
|
||||
wlock();
|
||||
try {
|
||||
info.add("STARTING", Boolean.FALSE);
|
||||
info.add("STOPPING", Boolean.FALSE);
|
||||
info.add("RUNNING", Boolean.FALSE);
|
||||
} catch (Exception e) {
|
||||
lock.set(false);
|
||||
return;
|
||||
} finally {
|
||||
wunlock();
|
||||
}
|
||||
} catch (Exception e) {
|
||||
}
|
||||
|
||||
lock.set(false); // Should we force waiting for all threads??
|
||||
|
||||
// Wait around till all threads are collected.
|
||||
if (tg != null) {
|
||||
String groupName = tg.getName();
|
||||
// System.out.println("BOB: MUXlisten: Starting thread collection for: " + groupName);
|
||||
_log.warn("BOB: MUXlisten: Starting thread collection for: " + groupName);
|
||||
if (tg.activeCount() + tg.activeGroupCount() != 0) {
|
||||
// visit(tg, 0, groupName);
|
||||
int foo = tg.activeCount() + tg.activeGroupCount();
|
||||
// hopefully no longer needed!
|
||||
// int bar = lives;
|
||||
// System.out.println("BOB: MUXlisten: Waiting on threads for " + groupName);
|
||||
// System.out.println("\nBOB: MUXlisten: ThreadGroup dump BEGIN " + groupName);
|
||||
// visit(tg, 0, groupName);
|
||||
// System.out.println("BOB: MUXlisten: ThreadGroup dump END " + groupName + "\n");
|
||||
// Happily spin forever :-(
|
||||
while (foo != 0) {
|
||||
foo = tg.activeCount() + tg.activeGroupCount();
|
||||
// if (lives != bar && lives != 0) {
|
||||
// System.out.println("\nBOB: MUXlisten: ThreadGroup dump BEGIN " + groupName);
|
||||
// visit(tg, 0, groupName);
|
||||
// System.out.println("BOB: MUXlisten: ThreadGroup dump END " + groupName + "\n");
|
||||
// }
|
||||
// bar = lives;
|
||||
try {
|
||||
Thread.sleep(100); //sleep for 100 ms (One tenth second)
|
||||
} catch (InterruptedException ex) {
|
||||
// nop
|
||||
}
|
||||
}
|
||||
}
|
||||
// System.out.println("BOB: MUXlisten: Threads went away. Success: " + groupName);
|
||||
_log.warn("BOB: MUXlisten: Threads went away. Success: " + groupName);
|
||||
tg.destroy();
|
||||
// Zap reference to the ThreadGroup so the JVM can GC it.
|
||||
tg = null;
|
||||
}
|
||||
try {
|
||||
socketManager.destroySocketManager();
|
||||
} catch (Exception e) {
|
||||
// nop
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Debugging... None of this is normally used.
|
||||
/**
|
||||
* Find the root thread group and print them all.
|
||||
*
|
||||
*/
|
||||
private void visitAllThreads() {
|
||||
ThreadGroup root = Thread.currentThread().getThreadGroup().getParent();
|
||||
while (root.getParent() != null) {
|
||||
root = root.getParent();
|
||||
}
|
||||
|
||||
// Visit each thread group
|
||||
visit(root, 0, root.getName());
|
||||
}
|
||||
|
||||
/**
|
||||
* Recursively visits all thread groups under `group' and dumps them.
|
||||
* @param group ThreadGroup to visit
|
||||
* @param level Current level
|
||||
*/
|
||||
private static void visit(ThreadGroup group, int level, String tn) {
|
||||
// Get threads in `group'
|
||||
int numThreads = group.activeCount();
|
||||
Thread[] threads = new Thread[numThreads * 2];
|
||||
numThreads = group.enumerate(threads, false);
|
||||
String indent = "------------------------------------".substring(0, level) + "-> ";
|
||||
// Enumerate each thread in `group' and print it.
|
||||
for (int i = 0; i < numThreads; i++) {
|
||||
// Get thread
|
||||
Thread thread = threads[i];
|
||||
System.out.println("BOB: MUXlisten: " + tn + ": " + indent + thread.toString());
|
||||
}
|
||||
|
||||
// Get thread subgroups of `group'
|
||||
int numGroups = group.activeGroupCount();
|
||||
ThreadGroup[] groups = new ThreadGroup[numGroups * 2];
|
||||
numGroups = group.enumerate(groups, false);
|
||||
|
||||
// Recursively visit each subgroup
|
||||
for (int i = 0; i < numGroups; i++) {
|
||||
visit(groups[i], level + 1, groups[i].getName());
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,39 +0,0 @@
|
||||
/**
|
||||
* WTFPL
|
||||
* Version 2, December 2004
|
||||
*
|
||||
* Copyright (C) sponge
|
||||
* Planet Earth
|
||||
*
|
||||
* See...
|
||||
*
|
||||
* http://sam.zoy.org/wtfpl/
|
||||
* and
|
||||
* http://en.wikipedia.org/wiki/WTFPL
|
||||
*
|
||||
* ...for any additional details and license questions.
|
||||
*/
|
||||
package net.i2p.BOB;
|
||||
|
||||
import net.i2p.util.SimpleTimer2;
|
||||
|
||||
/**
|
||||
* Start from command line
|
||||
*
|
||||
* @author sponge
|
||||
*
|
||||
*/
|
||||
public class Main {
|
||||
|
||||
/**
|
||||
* @param args the command line arguments, these are not used yet
|
||||
*/
|
||||
public static void main(String[] args) {
|
||||
// THINK THINK THINK THINK THINK THINK
|
||||
SimpleTimer2 Y2 = SimpleTimer2.getInstance();
|
||||
|
||||
BOB.main(args);
|
||||
|
||||
Y2.stop();
|
||||
}
|
||||
}
|
||||
@@ -1,106 +0,0 @@
|
||||
/**
|
||||
* WTFPL
|
||||
* Version 2, December 2004
|
||||
*
|
||||
* Copyright (C) sponge
|
||||
* Planet Earth
|
||||
*
|
||||
* See...
|
||||
*
|
||||
* http://sam.zoy.org/wtfpl/
|
||||
* and
|
||||
* http://en.wikipedia.org/wiki/WTFPL
|
||||
*
|
||||
* ...for any additional details and license questions.
|
||||
*/
|
||||
package net.i2p.BOB;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.locks.ReentrantReadWriteLock;
|
||||
|
||||
|
||||
/**
|
||||
* Internal database to relate nicknames to options to values
|
||||
*
|
||||
* @author sponge
|
||||
*/
|
||||
public class NamedDB {
|
||||
|
||||
private final Map<String, Object> data;
|
||||
private final ReentrantReadWriteLock lock = new ReentrantReadWriteLock(false);
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
public NamedDB() {
|
||||
this.data = new HashMap<String, Object>();
|
||||
}
|
||||
|
||||
public void getReadLock() {
|
||||
lock.readLock().lock();
|
||||
}
|
||||
|
||||
public void releaseReadLock() {
|
||||
lock.readLock().unlock();
|
||||
}
|
||||
|
||||
public void getWriteLock() {
|
||||
lock.writeLock().lock();
|
||||
}
|
||||
|
||||
public void releaseWriteLock() {
|
||||
lock.writeLock().unlock();
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete an object if it exists
|
||||
*
|
||||
* @param key
|
||||
*/
|
||||
public void kill(String key) {
|
||||
data.remove(key);
|
||||
}
|
||||
|
||||
/**
|
||||
* Add object, deletes the old one if it exists
|
||||
*
|
||||
* @param key
|
||||
* @param val
|
||||
*/
|
||||
public void add(String key, Object val) {
|
||||
data.put(key, val);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the object, and return it, throws RuntimeException if not found
|
||||
*
|
||||
* @param key non-null
|
||||
* @return Object non-null
|
||||
* @throws java.lang.RuntimeException if not found
|
||||
*/
|
||||
public Object get(String key) throws RuntimeException {
|
||||
Object rv = data.get(key);
|
||||
if (rv != null)
|
||||
return rv;
|
||||
throw new RuntimeException("Key not found");
|
||||
}
|
||||
|
||||
/**
|
||||
* returns true if an object exists, else returns false
|
||||
*
|
||||
* @param key
|
||||
* @return true if an object exists, else returns false
|
||||
*/
|
||||
public boolean exists(String key) {
|
||||
return data.containsKey(key);
|
||||
}
|
||||
|
||||
/**
|
||||
* @since 0.9.29 replaces getcount() and getnext(int)
|
||||
*/
|
||||
public Collection<Object> values() {
|
||||
return data.values();
|
||||
}
|
||||
}
|
||||
@@ -1,121 +0,0 @@
|
||||
/**
|
||||
* WTFPL
|
||||
* Version 2, December 2004
|
||||
*
|
||||
* Copyright (C) sponge
|
||||
* Planet Earth
|
||||
*
|
||||
* See...
|
||||
*
|
||||
* http://sam.zoy.org/wtfpl/
|
||||
* and
|
||||
* http://en.wikipedia.org/wiki/WTFPL
|
||||
*
|
||||
* ...for any additional details and license questions.
|
||||
*/
|
||||
package net.i2p.BOB;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.OutputStream;
|
||||
import java.util.concurrent.atomic.AtomicBoolean;
|
||||
|
||||
/**
|
||||
* Shove data from one stream to the other.
|
||||
*
|
||||
* @author sponge
|
||||
*/
|
||||
public class TCPio implements Runnable {
|
||||
|
||||
private final InputStream Ain;
|
||||
private final OutputStream Aout;
|
||||
private final AtomicBoolean lives;
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*
|
||||
* @param Ain InputStream
|
||||
* @param Aout OutputStream
|
||||
*
|
||||
* param database
|
||||
*/
|
||||
TCPio(InputStream Ain, OutputStream Aout, AtomicBoolean lives) {
|
||||
this.Ain = Ain;
|
||||
this.Aout = Aout;
|
||||
this.lives = lives;
|
||||
}
|
||||
|
||||
/**
|
||||
* Copy from source to destination...
|
||||
* and yes, we are totally OK to block here on writes,
|
||||
* The OS has buffers, and I intend to use them.
|
||||
* We send an interrupt signal to the threadgroup to
|
||||
* unwedge any pending writes.
|
||||
*
|
||||
*/
|
||||
public void run() {
|
||||
/*
|
||||
* NOTE:
|
||||
* The write method of OutputStream calls the write method of
|
||||
* one argument on each of the bytes to be written out.
|
||||
* Subclasses are encouraged to override this method and provide
|
||||
* a more efficient implementation.
|
||||
*
|
||||
* So, is this really a performance problem?
|
||||
* Should we expand to several bytes?
|
||||
* I don't believe there would be any gain, since read method
|
||||
* has the same reccomendations. If anyone has a better way to
|
||||
* do this, I'm interested in performance improvements.
|
||||
*
|
||||
* --Sponge
|
||||
*
|
||||
* Tested with 128 bytes, and there was no performance gain.
|
||||
* 8192 bytes did lower load average across many connections.
|
||||
* Should I raise it higer? The correct thing to do would be to
|
||||
* override... perhaps use NTCP, but I2P's streaming lib lacks
|
||||
* anything NTCP compatable.
|
||||
*
|
||||
* --Sponge
|
||||
*/
|
||||
|
||||
int b;
|
||||
byte a[] = new byte[8192];
|
||||
try {
|
||||
try {
|
||||
while (lives.get()) {
|
||||
b = Ain.read(a, 0, 8192);
|
||||
if (b > 0) {
|
||||
Aout.write(a, 0, b);
|
||||
} else if (b == 0) {
|
||||
while(Ain.available() == 0) {
|
||||
Thread.sleep(20);
|
||||
}
|
||||
} else {
|
||||
/* according to the specs:
|
||||
*
|
||||
* The total number of bytes read into the buffer,
|
||||
* or -1 if there is no more data because the end of
|
||||
* the stream has been reached.
|
||||
*
|
||||
*/
|
||||
// System.out.println("TCPio: End Of Stream");
|
||||
break;
|
||||
}
|
||||
}
|
||||
} catch (Exception e) {
|
||||
}
|
||||
// System.out.println("TCPio: Leaving.");
|
||||
} finally {
|
||||
// Eject!!! Eject!!!
|
||||
//System.out.println("TCPio: Caught an exception " + e);
|
||||
try {
|
||||
Ain.close();
|
||||
} catch (IOException ex) {
|
||||
}
|
||||
try {
|
||||
Aout.close();
|
||||
} catch (IOException ex) {
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,95 +0,0 @@
|
||||
/**
|
||||
* WTFPL
|
||||
* Version 2, December 2004
|
||||
*
|
||||
* Copyright (C) sponge
|
||||
* Planet Earth
|
||||
*
|
||||
* See...
|
||||
*
|
||||
* http://sam.zoy.org/wtfpl/
|
||||
* and
|
||||
* http://en.wikipedia.org/wiki/WTFPL
|
||||
*
|
||||
* ...for any additional details and license questions.
|
||||
*/
|
||||
package net.i2p.BOB;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.net.ServerSocket;
|
||||
import java.net.Socket;
|
||||
import java.net.SocketTimeoutException;
|
||||
import java.util.concurrent.atomic.AtomicBoolean;
|
||||
|
||||
import net.i2p.client.streaming.I2PServerSocket;
|
||||
import net.i2p.client.streaming.I2PSocketManager;
|
||||
import net.i2p.util.I2PAppThread;
|
||||
|
||||
/**
|
||||
* Listen on TCP port and connect to I2P
|
||||
*
|
||||
* @author sponge
|
||||
*/
|
||||
public class TCPlistener implements Runnable {
|
||||
|
||||
private final NamedDB info, database;
|
||||
private final Logger _log;
|
||||
private final I2PSocketManager socketManager;
|
||||
private final ServerSocket listener;
|
||||
private final AtomicBoolean lives;
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
* @param S
|
||||
* @param info
|
||||
* @param database
|
||||
* @param _log
|
||||
*/
|
||||
TCPlistener(ServerSocket listener, I2PSocketManager S, NamedDB info, NamedDB database, Logger _log, AtomicBoolean lives) {
|
||||
this.database = database;
|
||||
this.info = info;
|
||||
this._log = _log;
|
||||
this.socketManager = S;
|
||||
this.listener = listener;
|
||||
this.lives = lives;
|
||||
}
|
||||
|
||||
/**
|
||||
* Simply listen on TCP port, and thread connections
|
||||
*
|
||||
*/
|
||||
public void run() {
|
||||
boolean g = false;
|
||||
int conn = 0;
|
||||
Socket server = null;
|
||||
try {
|
||||
try {
|
||||
listener.setSoTimeout(50); // We don't block, we cycle and check.
|
||||
while (lives.get()) {
|
||||
try {
|
||||
server = listener.accept();
|
||||
server.setKeepAlive(true);
|
||||
g = true;
|
||||
} catch (SocketTimeoutException ste) {
|
||||
g = false;
|
||||
}
|
||||
if (g) {
|
||||
conn++;
|
||||
// toss the connection to a new thread.
|
||||
TCPtoI2P conn_c = new TCPtoI2P(socketManager, server, info, database, lives);
|
||||
Thread t = new I2PAppThread(conn_c, Thread.currentThread().getName() + " TCPtoI2P " + conn);
|
||||
t.start();
|
||||
g = false;
|
||||
}
|
||||
}
|
||||
} catch (IOException ioe) {
|
||||
}
|
||||
} finally {
|
||||
try {
|
||||
listener.close();
|
||||
} catch (IOException ex) {
|
||||
}
|
||||
//System.out.println("TCPlistener: " + Thread.currentThread().getName() + "Done.");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,222 +0,0 @@
|
||||
/**
|
||||
* WTFPL
|
||||
* Version 2, December 2004
|
||||
*
|
||||
* Copyright (C) sponge
|
||||
* Planet Earth
|
||||
*
|
||||
* See...
|
||||
*
|
||||
* http://sam.zoy.org/wtfpl/
|
||||
* and
|
||||
* http://en.wikipedia.org/wiki/WTFPL
|
||||
*
|
||||
* ...for any additional details and license questions.
|
||||
*/
|
||||
package net.i2p.BOB;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.InterruptedIOException;
|
||||
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.I2PAppContext;
|
||||
import net.i2p.I2PException;
|
||||
import net.i2p.client.streaming.I2PSocket;
|
||||
import net.i2p.client.streaming.I2PSocketManager;
|
||||
import net.i2p.data.DataFormatException;
|
||||
import net.i2p.data.Destination;
|
||||
import net.i2p.util.I2PAppThread;
|
||||
|
||||
/**
|
||||
*
|
||||
* Process TCP->I2P
|
||||
*
|
||||
* @author sponge
|
||||
*/
|
||||
public class TCPtoI2P implements Runnable {
|
||||
|
||||
private I2PSocket I2P;
|
||||
private final Socket sock;
|
||||
private final I2PSocketManager socketManager;
|
||||
private final AtomicBoolean lives;
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
* @param i2p
|
||||
* @param socket
|
||||
* @param info unused
|
||||
* @param database unused
|
||||
*/
|
||||
TCPtoI2P(I2PSocketManager i2p, Socket socket, NamedDB info, NamedDB database, AtomicBoolean lives) {
|
||||
this.sock = socket;
|
||||
this.socketManager = i2p;
|
||||
this.lives = lives;
|
||||
}
|
||||
|
||||
/**
|
||||
* This is a more forgiving readline,
|
||||
* it works on unbuffered streams
|
||||
*
|
||||
* @param in
|
||||
* @return line of text as a String
|
||||
* @throws IOException
|
||||
*/
|
||||
private static String lnRead(InputStream in) throws IOException {
|
||||
StringBuilder builder = new StringBuilder();
|
||||
int b;
|
||||
char c;
|
||||
|
||||
while (true) {
|
||||
b = in.read();
|
||||
if (b == 13) {
|
||||
//skip CR
|
||||
continue;
|
||||
}
|
||||
if (b < 20 || b > 126) {
|
||||
// exit on anything not legal
|
||||
break;
|
||||
}
|
||||
c = (char) (b & 0x7f); // We only care about ASCII
|
||||
builder.append(c);
|
||||
}
|
||||
return builder.toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* Print an error message to out
|
||||
*
|
||||
* @param e
|
||||
* @param out
|
||||
* @throws java.io.IOException
|
||||
*/
|
||||
private void Emsg(String e, OutputStream out) throws IOException {
|
||||
// Debugging System.out.println("ERROR TCPtoI2P: " + e);
|
||||
out.write("ERROR ".concat(e).getBytes("UTF-8"));
|
||||
out.write(13);
|
||||
out.write(10);
|
||||
out.flush();
|
||||
}
|
||||
|
||||
/**
|
||||
* TCP stream to I2P stream thread starter
|
||||
*
|
||||
*/
|
||||
public void run() {
|
||||
String line, input;
|
||||
InputStream Iin = null;
|
||||
OutputStream Iout = null;
|
||||
InputStream in = null;
|
||||
OutputStream out = null;
|
||||
Thread t = null;
|
||||
Thread q = null;
|
||||
try {
|
||||
try {
|
||||
|
||||
in = sock.getInputStream();
|
||||
out = sock.getOutputStream();
|
||||
line = lnRead(in);
|
||||
input = line.toLowerCase(Locale.US);
|
||||
Destination dest = null;
|
||||
if (input.endsWith(".i2p")) {
|
||||
//dest = I2PTunnel.destFromName(input);
|
||||
dest = I2PAppContext.getGlobalContext().namingService().lookup(input);
|
||||
if (dest != null) {
|
||||
line = dest.toBase64();
|
||||
} else {
|
||||
Emsg("Can't find destination: " + input, out);
|
||||
return;
|
||||
}
|
||||
}
|
||||
dest = new Destination();
|
||||
dest.fromBase64(line);
|
||||
|
||||
try {
|
||||
// get a client socket
|
||||
I2P = socketManager.connect(dest);
|
||||
I2P.setReadTimeout(0); // temp bugfix, this *SHOULD* be the default
|
||||
// make readers/writers
|
||||
Iin = I2P.getInputStream();
|
||||
Iout = I2P.getOutputStream();
|
||||
// setup to cross the streams
|
||||
TCPio conn_c = new TCPio(in, Iout, lives); // app -> I2P
|
||||
TCPio conn_a = new TCPio(Iin, out, lives); // I2P -> app
|
||||
t = new I2PAppThread(conn_c, Thread.currentThread().getName() + " TCPioA");
|
||||
q = new I2PAppThread(conn_a, Thread.currentThread().getName() + " TCPioB");
|
||||
// Fire!
|
||||
t.start();
|
||||
q.start();
|
||||
while (t.isAlive() && q.isAlive() && lives.get()) { // AND is used here to kill off the other thread
|
||||
Thread.sleep(10); //sleep for 10 ms
|
||||
}
|
||||
} catch (I2PException e) {
|
||||
Emsg(e.toString(), out);
|
||||
} catch (ConnectException e) {
|
||||
Emsg(e.toString(), out);
|
||||
} catch (NoRouteToHostException e) {
|
||||
Emsg(e.toString(), out);
|
||||
}
|
||||
|
||||
} catch (InterruptedIOException e) {
|
||||
// We're breaking away.
|
||||
} catch (InterruptedException e) {
|
||||
// ditto
|
||||
} catch (IOException e) {
|
||||
try {
|
||||
Emsg(e.toString(), out);
|
||||
} catch (IOException ex) {
|
||||
// ditto
|
||||
}
|
||||
} catch (DataFormatException e) {
|
||||
try {
|
||||
Emsg(e.toString(), out);
|
||||
} catch (IOException ex) {
|
||||
// ditto
|
||||
}
|
||||
}
|
||||
|
||||
} finally {
|
||||
try {
|
||||
t.interrupt();
|
||||
} catch (Exception e) {
|
||||
}
|
||||
try {
|
||||
q.interrupt();
|
||||
} catch (Exception e) {
|
||||
}
|
||||
try {
|
||||
in.close();
|
||||
} catch (Exception e) {
|
||||
}
|
||||
try {
|
||||
out.close();
|
||||
} catch (Exception e) {
|
||||
}
|
||||
try {
|
||||
Iin.close();
|
||||
} catch (Exception e) {
|
||||
}
|
||||
try {
|
||||
Iout.close();
|
||||
} catch (Exception e) {
|
||||
}
|
||||
try {
|
||||
// System.out.println("TCPtoI2P: Close I2P");
|
||||
I2P.close();
|
||||
} catch (Exception e) {
|
||||
}
|
||||
|
||||
try {
|
||||
// System.out.println("TCPtoI2P: Close sock");
|
||||
sock.close();
|
||||
} catch (Exception e) {
|
||||
}
|
||||
}
|
||||
// System.out.println("TCPtoI2P: Done.");
|
||||
}
|
||||
}
|
||||
@@ -1,140 +0,0 @@
|
||||
/**
|
||||
* WTFPL
|
||||
* Version 2, December 2004
|
||||
*
|
||||
* Copyright (C) sponge
|
||||
* Planet Earth
|
||||
*
|
||||
* See...
|
||||
*
|
||||
* http://sam.zoy.org/wtfpl/
|
||||
* and
|
||||
* http://en.wikipedia.org/wiki/WTFPL
|
||||
*
|
||||
* ...for any additional details and license questions.
|
||||
*/
|
||||
package net.i2p.BOB;
|
||||
|
||||
import java.io.DataInputStream;
|
||||
import java.io.DataOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.net.Socket;
|
||||
import net.i2p.client.I2PSession;
|
||||
import net.i2p.client.I2PSessionException;
|
||||
import net.i2p.client.I2PSessionListener;
|
||||
import net.i2p.data.Destination;
|
||||
import net.i2p.util.Log;
|
||||
|
||||
/**
|
||||
* UDP IO on I2P
|
||||
*
|
||||
* FIX ME: Untested, and incomplete!
|
||||
* I have no personal need to UDP yet,
|
||||
* however alot of p2p apps pretty much demand it.
|
||||
* The skeletal frame is here, just needs to be finished.
|
||||
*
|
||||
* @author sponge
|
||||
* @deprecated incomplete, unused
|
||||
*/
|
||||
@Deprecated
|
||||
public class UDPIOthread implements I2PSessionListener, Runnable {
|
||||
|
||||
private final NamedDB info;
|
||||
private final Log _log;
|
||||
private final Socket socket;
|
||||
private DataInputStream in;
|
||||
private DataOutputStream out;
|
||||
private final I2PSession _session;
|
||||
// FIXME never set
|
||||
private Destination _peerDestination;
|
||||
private boolean up;
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
* @param info
|
||||
* @param _log
|
||||
* @param socket
|
||||
* @param _session
|
||||
*/
|
||||
UDPIOthread(NamedDB info, Log _log, Socket socket, I2PSession _session) {
|
||||
this.info = info;
|
||||
this._log = _log;
|
||||
this.socket = socket;
|
||||
this._session = _session;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
public void run() {
|
||||
byte data[] = new byte[1024];
|
||||
up = true;
|
||||
try {
|
||||
in = new DataInputStream(socket.getInputStream());
|
||||
out = new DataOutputStream(socket.getOutputStream());
|
||||
while (up) {
|
||||
int c = in.read(data);
|
||||
// Note: could do a loopback test here with a wrapper.
|
||||
boolean ok = _session.sendMessage(_peerDestination, data, 0, c);
|
||||
|
||||
if (!ok) {
|
||||
up = false; // Is this the right thing to do??
|
||||
}
|
||||
}
|
||||
} catch (IOException ioe) {
|
||||
_log.error("Error running", ioe);
|
||||
} catch (I2PSessionException ise) {
|
||||
_log.error("Error communicating", ise);
|
||||
// } catch(DataFormatException dfe) {
|
||||
// _log.error("Peer destination file is not valid", dfe);
|
||||
} finally {
|
||||
if (_session != null) {
|
||||
try {
|
||||
_session.destroySession();
|
||||
} catch (I2PSessionException ise) {
|
||||
// ignored
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param session
|
||||
* @param msgId
|
||||
* @param size
|
||||
*/
|
||||
public void messageAvailable(I2PSession session, int msgId, long size) {
|
||||
// _log.debug("Message available: id = " + msgId + " size = " + size);
|
||||
try {
|
||||
byte msg[] = session.receiveMessage(msgId);
|
||||
if (msg != null) {
|
||||
out.write(msg);
|
||||
out.flush();
|
||||
}
|
||||
} catch (I2PSessionException ise) {
|
||||
up = false;
|
||||
} catch (IOException ioe) {
|
||||
up = false;
|
||||
}
|
||||
}
|
||||
|
||||
// Great, can these be used to kill ourselves.
|
||||
/** required by {@link I2PSessionListener I2PSessionListener} to notify of disconnect */
|
||||
public void disconnected(I2PSession session) {
|
||||
_log.debug("Disconnected");
|
||||
// up = false;
|
||||
}
|
||||
|
||||
/** required by {@link I2PSessionListener I2PSessionListener} to notify of error */
|
||||
public void errorOccurred(I2PSession session, String message, Throwable error) {
|
||||
_log.debug("Error occurred: " + message, error);
|
||||
// up = false;
|
||||
}
|
||||
|
||||
/** required by {@link I2PSessionListener I2PSessionListener} to notify of abuse */
|
||||
public void reportAbuse(I2PSession session, int severity) {
|
||||
_log.debug("Abuse reported of severity " + severity);
|
||||
// up = false;
|
||||
}
|
||||
}
|
||||
@@ -1,21 +0,0 @@
|
||||
DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
|
||||
Version 2, December 2004
|
||||
|
||||
Copyright (C) sponge
|
||||
Planet Earth
|
||||
Everyone is permitted to copy and distribute verbatim or modified
|
||||
copies of this license document, and changing it is allowed as long
|
||||
as the name is changed.
|
||||
|
||||
DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
|
||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||
|
||||
0. You just DO WHAT THE FUCK YOU WANT TO.
|
||||
|
||||
See...
|
||||
|
||||
http://sam.zoy.org/wtfpl/
|
||||
and
|
||||
http://en.wikipedia.org/wiki/WTFPL
|
||||
|
||||
...for any additional details and license questions.
|
||||
@@ -1,5 +0,0 @@
|
||||
<html>
|
||||
<body>
|
||||
<p>BOB, the Basic Open Bridge, allows TCP applications to talk over I2P - DEPRECATED - Please port applications to SAMv3.</p>
|
||||
</body>
|
||||
</html>
|
||||
@@ -4,14 +4,15 @@
|
||||
# To contribute translations, see http://www.i2p2.de/newdevelopers
|
||||
#
|
||||
# Translators:
|
||||
# slrslr, 2022
|
||||
# slrslr, 2021
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: I2P\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2016-05-25 12:29+0000\n"
|
||||
"PO-Revision-Date: 2021-07-08 09:41+0000\n"
|
||||
"Last-Translator: slrslr\n"
|
||||
"POT-Creation-Date: 2022-02-09 19:13+0000\n"
|
||||
"PO-Revision-Date: 2011-02-13 12:05+0000\n"
|
||||
"Last-Translator: slrslr, 2022\n"
|
||||
"Language-Team: Czech (http://www.transifex.com/otf/I2P/language/cs/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
@@ -26,69 +27,81 @@ msgstr "Spustit I2P"
|
||||
|
||||
#: src/net/i2p/desktopgui/ExternalTrayManager.java:44
|
||||
#: src/net/i2p/desktopgui/ExternalTrayManager.java:72
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:55
|
||||
msgid "I2P is starting!"
|
||||
msgstr "I2P startuje!"
|
||||
|
||||
#: src/net/i2p/desktopgui/ExternalTrayManager.java:44
|
||||
#: src/net/i2p/desktopgui/ExternalTrayManager.java:72
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:55
|
||||
msgid "Starting"
|
||||
msgstr "Startuji"
|
||||
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:55
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:207
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:65
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:249
|
||||
msgid "Launch I2P Browser"
|
||||
msgstr "Spouštím I2P Browser"
|
||||
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:76
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:228
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:86
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:270
|
||||
msgid "Configure I2P System Tray"
|
||||
msgstr "Nastavit I2P Systémovou Lištu"
|
||||
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:77
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:229
|
||||
msgid "Disable"
|
||||
msgstr "Zakázat"
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:87
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:271
|
||||
msgid "Enable notifications"
|
||||
msgstr "Zapnout upozornění"
|
||||
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:93
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:245
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:101
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:285
|
||||
msgid "Disable notifications"
|
||||
msgstr "Vypnout upozornění"
|
||||
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:115
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:299
|
||||
msgid "Disable system tray"
|
||||
msgstr "Vypnout ikonu systémové lišty"
|
||||
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:131
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:315
|
||||
msgid "Restart I2P"
|
||||
msgstr "Restart I2P"
|
||||
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:110
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:262
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:148
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:332
|
||||
msgid "Stop I2P"
|
||||
msgstr "Zastavit I2P"
|
||||
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:126
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:278
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:164
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:348
|
||||
msgid "Restart I2P Immediately"
|
||||
msgstr "Restartovat I2P Hned"
|
||||
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:143
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:295
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:181
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:365
|
||||
msgid "Stop I2P Immediately"
|
||||
msgstr "Zastavit I2P Hned"
|
||||
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:157
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:309
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:195
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:379
|
||||
msgid "Cancel I2P Shutdown"
|
||||
msgstr "Zrušit I2P Zastavení"
|
||||
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:363
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:437
|
||||
#, java-format
|
||||
msgid "Shutdown in {0}"
|
||||
msgstr "Zastavení za {0}"
|
||||
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:365
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:439
|
||||
msgid "Shutdown imminent"
|
||||
msgstr "Vypínání"
|
||||
|
||||
#. status translations are in the console bundle
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:370
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:444
|
||||
msgid "Network"
|
||||
msgstr "Síť"
|
||||
|
||||
#. Windows typically has tooltips; Linux (at least Ubuntu) doesn't
|
||||
#: src/net/i2p/desktopgui/TrayManager.java:63
|
||||
#: src/net/i2p/desktopgui/TrayManager.java:73
|
||||
msgid "I2P: Right-click for menu"
|
||||
msgstr "I2P: Pravé-kliknutí pro menu"
|
||||
|
||||
@@ -9,9 +9,9 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: I2P\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2016-05-25 12:29+0000\n"
|
||||
"PO-Revision-Date: 2018-10-04 00:43+0000\n"
|
||||
"Last-Translator: erinm\n"
|
||||
"POT-Creation-Date: 2022-02-09 19:13+0000\n"
|
||||
"PO-Revision-Date: 2011-02-13 12:05+0000\n"
|
||||
"Last-Translator: 黃彥儒 <r1235613@gmail.com>, 2017\n"
|
||||
"Language-Team: Chinese (Taiwan) (http://www.transifex.com/otf/I2P/language/zh_TW/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
@@ -26,69 +26,81 @@ msgstr "啟動I2P"
|
||||
|
||||
#: src/net/i2p/desktopgui/ExternalTrayManager.java:44
|
||||
#: src/net/i2p/desktopgui/ExternalTrayManager.java:72
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:55
|
||||
msgid "I2P is starting!"
|
||||
msgstr "I2P已啟動"
|
||||
|
||||
#: src/net/i2p/desktopgui/ExternalTrayManager.java:44
|
||||
#: src/net/i2p/desktopgui/ExternalTrayManager.java:72
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:55
|
||||
msgid "Starting"
|
||||
msgstr "啟動中"
|
||||
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:55
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:207
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:65
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:249
|
||||
msgid "Launch I2P Browser"
|
||||
msgstr "開啟I2P瀏覽器"
|
||||
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:76
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:228
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:86
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:270
|
||||
msgid "Configure I2P System Tray"
|
||||
msgstr "設定I2P系統文件夾"
|
||||
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:77
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:229
|
||||
msgid "Disable"
|
||||
msgstr "停用"
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:87
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:271
|
||||
msgid "Enable notifications"
|
||||
msgstr "启用通知"
|
||||
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:93
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:245
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:101
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:285
|
||||
msgid "Disable notifications"
|
||||
msgstr "禁用通知"
|
||||
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:115
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:299
|
||||
msgid "Disable system tray"
|
||||
msgstr "禁用系统托盘"
|
||||
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:131
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:315
|
||||
msgid "Restart I2P"
|
||||
msgstr "重啟I2P"
|
||||
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:110
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:262
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:148
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:332
|
||||
msgid "Stop I2P"
|
||||
msgstr "停止I2P"
|
||||
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:126
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:278
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:164
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:348
|
||||
msgid "Restart I2P Immediately"
|
||||
msgstr "強制重啟I2P"
|
||||
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:143
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:295
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:181
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:365
|
||||
msgid "Stop I2P Immediately"
|
||||
msgstr "強制終止I2P"
|
||||
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:157
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:309
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:195
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:379
|
||||
msgid "Cancel I2P Shutdown"
|
||||
msgstr "取消停止I2P"
|
||||
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:363
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:437
|
||||
#, java-format
|
||||
msgid "Shutdown in {0}"
|
||||
msgstr "關閉於 {0}"
|
||||
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:365
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:439
|
||||
msgid "Shutdown imminent"
|
||||
msgstr "強制關閉"
|
||||
|
||||
#. status translations are in the console bundle
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:370
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:444
|
||||
msgid "Network"
|
||||
msgstr "網路"
|
||||
|
||||
#. Windows typically has tooltips; Linux (at least Ubuntu) doesn't
|
||||
#: src/net/i2p/desktopgui/TrayManager.java:63
|
||||
#: src/net/i2p/desktopgui/TrayManager.java:73
|
||||
msgid "I2P: Right-click for menu"
|
||||
msgstr "I2P:右鍵開啟選單"
|
||||
|
||||
227
apps/desktopgui/src/net/i2p/desktopgui/ExternalMain.java
Normal file
227
apps/desktopgui/src/net/i2p/desktopgui/ExternalMain.java
Normal file
@@ -0,0 +1,227 @@
|
||||
package net.i2p.desktopgui;
|
||||
|
||||
import java.awt.Image;
|
||||
import java.awt.SystemTray;
|
||||
import java.awt.Toolkit;
|
||||
import java.io.File;
|
||||
import java.lang.reflect.Method;
|
||||
import java.net.URL;
|
||||
|
||||
import javax.swing.SwingUtilities;
|
||||
|
||||
import net.i2p.I2PAppContext;
|
||||
import net.i2p.app.ClientAppManager;
|
||||
import net.i2p.app.ClientApp;
|
||||
import net.i2p.app.ClientAppState;
|
||||
import net.i2p.app.NotificationService;
|
||||
import net.i2p.util.Log;
|
||||
import net.i2p.util.SystemVersion;
|
||||
|
||||
/**
|
||||
* A simplified Main that does not require router.jar, for App Context only.
|
||||
* Invokes ExternalTrayManager only.
|
||||
* No state tracking, ClientAppManager doesn't care.
|
||||
*
|
||||
* @since 0.9.54
|
||||
*/
|
||||
public class ExternalMain implements ClientApp, NotificationService {
|
||||
|
||||
private final I2PAppContext _appContext;
|
||||
private final ClientAppManager _mgr;
|
||||
private final Log log;
|
||||
private TrayManager _trayManager;
|
||||
|
||||
private static final String PROP_SWING = "desktopgui.swing";
|
||||
|
||||
public ExternalMain(I2PAppContext ctx, ClientAppManager mgr, String args[]) {
|
||||
_appContext = ctx;
|
||||
_mgr = mgr;
|
||||
log = _appContext.logManager().getLog(ExternalMain.class);
|
||||
}
|
||||
|
||||
public ExternalMain() {
|
||||
_appContext = I2PAppContext.getGlobalContext();
|
||||
_mgr = _appContext.clientAppManager();
|
||||
log = _appContext.logManager().getLog(ExternalMain.class);
|
||||
}
|
||||
|
||||
public static void main(String[] args) {
|
||||
// early check so we can bail out when started via CLI
|
||||
if (!SystemTray.isSupported()) {
|
||||
System.err.println("SystemTray not supported");
|
||||
return;
|
||||
}
|
||||
ExternalMain main = new ExternalMain();
|
||||
main.beginStartup(args);
|
||||
}
|
||||
|
||||
/**
|
||||
* Start the tray icon code (loads tray icon in the tray area).
|
||||
* @throws AWTException on startup error, including systray not supported
|
||||
*/
|
||||
private synchronized void startUp() throws Exception {
|
||||
final TrayManager trayManager;
|
||||
boolean useSwingDefault = !(SystemVersion.isWindows() || SystemVersion.isMac());
|
||||
boolean useSwing = _appContext.getProperty(PROP_SWING, useSwingDefault);
|
||||
_trayManager = new ExternalTrayManager(_appContext, useSwing);
|
||||
_trayManager.startManager();
|
||||
if (_mgr != null)
|
||||
_mgr.register(this);
|
||||
}
|
||||
|
||||
/**
|
||||
* Main method launching the application.
|
||||
*
|
||||
* @param args unused
|
||||
*/
|
||||
private void beginStartup(String[] args) {
|
||||
String headless = System.getProperty("java.awt.headless");
|
||||
boolean isHeadless = Boolean.parseBoolean(headless);
|
||||
if (isHeadless) {
|
||||
log.warn("Headless environment: not starting desktopgui!");
|
||||
return;
|
||||
}
|
||||
if (SystemVersion.isMac())
|
||||
setMacTrayIcon();
|
||||
launchForeverLoop();
|
||||
|
||||
// We'll be doing GUI work, so let's stay in the event dispatcher thread.
|
||||
SwingUtilities.invokeLater(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
try {
|
||||
startUp();
|
||||
} catch(Exception e) {
|
||||
log.error("Failed while running desktopgui!", e);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Unless we do this, when we start DesktopGUI we get a Java coffee cup
|
||||
* in the tray.
|
||||
*
|
||||
* Based on code from https://gist.github.com/bchapuis/1562406 , no apparent license.
|
||||
* See also https://stackoverflow.com/questions/6006173/how-do-you-change-the-dock-icon-of-a-java-program
|
||||
*
|
||||
* TODO, if we wanted to add our own menu, see
|
||||
* https://stackoverflow.com/questions/1319805/java-os-x-dock-menu
|
||||
*
|
||||
* TODO, if we want to make it bounce, see
|
||||
* https://stackoverflow.com/questions/15079783/how-to-make-my-app-icon-bounce-in-the-mac-dock
|
||||
*
|
||||
* TODO, if we want to handle Quit, see
|
||||
* https://nakkaya.com/2009/04/19/java-osx-integration/
|
||||
*
|
||||
* @since 0.9.33
|
||||
*/
|
||||
@SuppressWarnings("unchecked")
|
||||
private void setMacTrayIcon() {
|
||||
File f = new File(_appContext.getBaseDir(), "docs/themes/console/images/itoopie_sm.png");
|
||||
if (!f.exists())
|
||||
return;
|
||||
try {
|
||||
Class util = Class.forName("com.apple.eawt.Application");
|
||||
Method getApplication = util.getMethod("getApplication", new Class[0]);
|
||||
Object application = getApplication.invoke(util);
|
||||
Class params[] = new Class[1];
|
||||
params[0] = Image.class;
|
||||
Method setDockIconImage = util.getMethod("setDockIconImage", params);
|
||||
URL url = f.toURI().toURL();
|
||||
Image image = Toolkit.getDefaultToolkit().getImage(url);
|
||||
setDockIconImage.invoke(application, image);
|
||||
} catch (Exception e) {
|
||||
if (log.shouldWarn())
|
||||
log.warn("Can't set OSX Dock icon", e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Avoids the app terminating because no Window is opened anymore.
|
||||
* More info: http://java.sun.com/javase/6/docs/api/java/awt/doc-files/AWTThreadIssues.html#Autoshutdown
|
||||
*/
|
||||
private static void launchForeverLoop() {
|
||||
Runnable r = new Runnable() {
|
||||
public void run() {
|
||||
try {
|
||||
Object o = new Object();
|
||||
synchronized (o) {
|
||||
o.wait();
|
||||
}
|
||||
} catch (InterruptedException ie) {
|
||||
}
|
||||
}
|
||||
};
|
||||
Thread t = new Thread(r, "DesktopGUI spinner");
|
||||
t.setDaemon(false);
|
||||
t.start();
|
||||
}
|
||||
|
||||
/////// NotificationService methods
|
||||
|
||||
/**
|
||||
* Send a notification to the user.
|
||||
*
|
||||
* @param source unsupported
|
||||
* @param category unsupported
|
||||
* @param priority unsupported
|
||||
* @param title for the popup, translated
|
||||
* @param message translated
|
||||
* @param path unsupported
|
||||
* @return 0, or -1 on failure
|
||||
*/
|
||||
public int notify(String source, String category, int priority, String title, String message, String path) {
|
||||
TrayManager tm = _trayManager;
|
||||
if (tm == null)
|
||||
return -1;
|
||||
return tm.displayMessage(priority, title, message, path);
|
||||
}
|
||||
|
||||
/**
|
||||
* Cancel a notification if possible.
|
||||
* Unsupported.
|
||||
*
|
||||
* @return false always
|
||||
*/
|
||||
public boolean cancel(int id) {
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Update the text of a notification if possible.
|
||||
* Unsupported.
|
||||
*
|
||||
* @return false always
|
||||
*/
|
||||
public boolean update(int id, String title, String message, String path) {
|
||||
return false;
|
||||
}
|
||||
|
||||
/////// ClientApp methods
|
||||
|
||||
public synchronized void startup() {
|
||||
beginStartup(null);
|
||||
}
|
||||
|
||||
public synchronized void shutdown(String[] args) {
|
||||
if (_trayManager != null)
|
||||
_trayManager.stopManager();
|
||||
}
|
||||
|
||||
public ClientAppState getState() {
|
||||
return ClientAppState.INITIALIZED;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return "desktopgui";
|
||||
}
|
||||
|
||||
public String getDisplayName() {
|
||||
return "Desktop GUI";
|
||||
}
|
||||
|
||||
/////// end ClientApp methods
|
||||
}
|
||||
@@ -22,8 +22,8 @@ import net.i2p.desktopgui.router.RouterManager;
|
||||
*/
|
||||
class ExternalTrayManager extends TrayManager {
|
||||
|
||||
public ExternalTrayManager(I2PAppContext ctx, Main main, boolean useSwing) {
|
||||
super(ctx, main, useSwing);
|
||||
public ExternalTrayManager(I2PAppContext ctx, boolean useSwing) {
|
||||
super(ctx, useSwing);
|
||||
}
|
||||
|
||||
public PopupMenu getMainMenu() {
|
||||
|
||||
@@ -30,6 +30,7 @@ class InternalTrayManager extends TrayManager {
|
||||
|
||||
private final RouterContext _context;
|
||||
private final Log log;
|
||||
private final Main _main;
|
||||
private MenuItem _statusItem, _browserItem, _configItem, _restartItem, _stopItem,
|
||||
_restartHardItem, _stopHardItem, _cancelItem,
|
||||
_notificationItem1, _notificationItem2;
|
||||
@@ -42,8 +43,9 @@ class InternalTrayManager extends TrayManager {
|
||||
private static final String CONSOLE_BUNDLE_NAME = "net.i2p.router.web.messages";
|
||||
|
||||
public InternalTrayManager(RouterContext ctx, Main main, boolean useSwing) {
|
||||
super(ctx, main, useSwing);
|
||||
super(ctx, useSwing);
|
||||
_context = ctx;
|
||||
_main = main;
|
||||
log = ctx.logManager().getLog(InternalTrayManager.class);
|
||||
}
|
||||
|
||||
|
||||
@@ -57,7 +57,7 @@ public class Main implements RouterApp, NotificationService {
|
||||
*/
|
||||
public Main() {
|
||||
_appContext = I2PAppContext.getGlobalContext();
|
||||
if (_appContext instanceof RouterContext)
|
||||
if (_appContext.isRouterContext())
|
||||
_context = (RouterContext) _appContext;
|
||||
else
|
||||
_context = null;
|
||||
@@ -77,7 +77,7 @@ public class Main implements RouterApp, NotificationService {
|
||||
if (_context != null)
|
||||
trayManager = new InternalTrayManager(_context, this, useSwing);
|
||||
else
|
||||
trayManager = new ExternalTrayManager(_appContext, this, useSwing);
|
||||
trayManager = new ExternalTrayManager(_appContext, useSwing);
|
||||
trayManager.startManager();
|
||||
_trayManager = trayManager;
|
||||
changeState(RUNNING);
|
||||
|
||||
@@ -37,7 +37,6 @@ import net.i2p.util.SystemVersion;
|
||||
abstract class TrayManager {
|
||||
|
||||
protected final I2PAppContext _appContext;
|
||||
protected final Main _main;
|
||||
protected final boolean _useSwing;
|
||||
///The tray area, or null if unsupported
|
||||
protected SystemTray tray;
|
||||
@@ -55,9 +54,8 @@ abstract class TrayManager {
|
||||
/**
|
||||
* Instantiate tray manager.
|
||||
*/
|
||||
protected TrayManager(I2PAppContext ctx, Main main, boolean useSwing) {
|
||||
protected TrayManager(I2PAppContext ctx, boolean useSwing) {
|
||||
_appContext = ctx;
|
||||
_main = main;
|
||||
_useSwing = useSwing;
|
||||
}
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@ import net.i2p.I2PAppContext;
|
||||
import net.i2p.data.DataHelper;
|
||||
import net.i2p.util.Log;
|
||||
|
||||
import org.apache.http.conn.util.InetAddressUtils;
|
||||
import net.i2p.apache.http.conn.util.InetAddressUtils;
|
||||
|
||||
import org.eclipse.jetty.server.Request;
|
||||
import org.eclipse.jetty.server.handler.HandlerWrapper;
|
||||
|
||||
@@ -4,5 +4,9 @@
|
||||
#
|
||||
# disable browser launch on startup
|
||||
#routerconsole.browser=/bin/false
|
||||
# disable browser launch on startup (Windows)
|
||||
#routerconsole.browser=NUL
|
||||
# change browser
|
||||
#routerconsole.browser=firefox
|
||||
# disable system tray
|
||||
#desktopgui.enabled=false
|
||||
|
||||
@@ -21,6 +21,8 @@
|
||||
<pathelement location="../../jetty/jettylib/javax.servlet.jar" />
|
||||
<!-- jsp-api.jar only present for debian builds -->
|
||||
<pathelement location="../../jetty/jettylib/jsp-api.jar" />
|
||||
<!-- following jars only for standalone builds -->
|
||||
<pathelement location="../../desktopgui/dist/desktopgui.jar" />
|
||||
</classpath>
|
||||
</depend>
|
||||
</target>
|
||||
@@ -60,6 +62,7 @@
|
||||
<pathelement location="../../systray/java/build/systray.jar" />
|
||||
<pathelement location="../../jetty/jettylib/org.mortbay.jetty.jar" />
|
||||
<pathelement location="../../jetty/jettylib/jetty-util.jar" />
|
||||
<pathelement location="../../desktopgui/dist/desktopgui.jar" />
|
||||
</classpath>
|
||||
</javac>
|
||||
</target>
|
||||
@@ -236,6 +239,7 @@
|
||||
<zipfileset src="../../streaming/java/build/streaming.jar" />
|
||||
<zipfileset src="../../systray/java/build/systray.jar" />
|
||||
<zipfileset src="../../../build/jbigi.jar" />
|
||||
<zipfileset src="../../desktopgui/dist/desktopgui.jar" />
|
||||
<!-- Countries translations. The i2psnark translations are in the war but it's easier to put these here -->
|
||||
<!-- 300KB just to translate "Brazil", but why not... -->
|
||||
<!--
|
||||
|
||||
@@ -30,6 +30,7 @@ import net.i2p.I2PAppContext;
|
||||
import net.i2p.I2PException;
|
||||
import net.i2p.client.streaming.I2PServerSocket;
|
||||
import net.i2p.client.streaming.I2PSocket;
|
||||
import net.i2p.client.streaming.RouterRestartException;
|
||||
import net.i2p.data.Hash;
|
||||
import net.i2p.util.I2PAppThread;
|
||||
import net.i2p.util.Log;
|
||||
@@ -131,12 +132,13 @@ class ConnectionAcceptor implements Runnable
|
||||
/**
|
||||
* Effectively unused, would only be called if we changed
|
||||
* I2CP host/port, which is hidden in the gui if in router context
|
||||
* FIXME this only works if already running
|
||||
*/
|
||||
public synchronized void restart() {
|
||||
Thread t = thread;
|
||||
if (t != null)
|
||||
t.interrupt();
|
||||
else
|
||||
startAccepting();
|
||||
}
|
||||
|
||||
public int getPort()
|
||||
@@ -201,6 +203,24 @@ class ConnectionAcceptor implements Runnable
|
||||
t.start();
|
||||
}
|
||||
}
|
||||
catch (RouterRestartException rre) {
|
||||
if (_log.shouldWarn())
|
||||
_log.warn("Waiting for router restart", rre);
|
||||
try {
|
||||
Thread.sleep(2*60*1000);
|
||||
} catch (InterruptedException ie) {}
|
||||
while (true) {
|
||||
if (_util.connected())
|
||||
break;
|
||||
if (_util.connect())
|
||||
break;
|
||||
try {
|
||||
Thread.sleep(60*1000);
|
||||
} catch (InterruptedException ie) { break; }
|
||||
}
|
||||
if (_log.shouldWarn())
|
||||
_log.warn("Router restarted");
|
||||
}
|
||||
catch (I2PException ioe)
|
||||
{
|
||||
int level = stop ? Log.WARN : Log.ERROR;
|
||||
|
||||
@@ -720,8 +720,9 @@ public class MetaInfo
|
||||
if (infoMap != null)
|
||||
return Collections.unmodifiableMap(infoMap);
|
||||
// we should only get here if serving a magnet on a torrent we created
|
||||
if (_log.shouldLog(Log.WARN))
|
||||
_log.warn("Creating new infomap", new Exception());
|
||||
// or on edit torrent save
|
||||
if (_log.shouldDebug())
|
||||
_log.debug("Creating new infomap", new Exception());
|
||||
// otherwise we must create it
|
||||
Map<String, BEValue> info = new HashMap<String, BEValue>();
|
||||
info.put("name", new BEValue(DataHelper.getUTF8(name)));
|
||||
|
||||
@@ -279,7 +279,6 @@ class PeerCoordinator implements PeerListener
|
||||
|
||||
/**
|
||||
* Bytes not yet in storage. Does NOT account for skipped files.
|
||||
* Not exact (does not adjust for last piece size).
|
||||
* Returns how many bytes are still needed to get the complete torrent.
|
||||
* @return -1 if in magnet mode
|
||||
*/
|
||||
@@ -287,8 +286,13 @@ class PeerCoordinator implements PeerListener
|
||||
{
|
||||
if (metainfo == null | storage == null)
|
||||
return -1;
|
||||
// XXX - Only an approximation.
|
||||
return ((long) storage.needed()) * metainfo.getPieceLength(0);
|
||||
int psz = metainfo.getPieceLength(0);
|
||||
long rv = ((long) storage.needed()) * psz;
|
||||
int last = metainfo.getPieces() - 1;
|
||||
BitField bf = storage.getBitField();
|
||||
if (bf != null && !bf.get(last))
|
||||
rv -= psz - metainfo.getPieceLength(last);
|
||||
return rv;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -1259,6 +1259,8 @@ public class Snark
|
||||
*/
|
||||
private void fatalRouter(String s, Throwable t) throws RouterException {
|
||||
_log.error(s, t);
|
||||
if (!_util.getContext().isRouterContext())
|
||||
System.out.println(s);
|
||||
stopTorrent(true);
|
||||
if (completeListener != null)
|
||||
completeListener.fatal(this, s);
|
||||
|
||||
@@ -85,8 +85,8 @@ public class SnarkManager implements CompleteListener, ClientApp, DisconnectList
|
||||
private final Log _log;
|
||||
private final UIMessages _messages;
|
||||
private final I2PSnarkUtil _util;
|
||||
private PeerCoordinatorSet _peerCoordinatorSet;
|
||||
private ConnectionAcceptor _connectionAcceptor;
|
||||
private final PeerCoordinatorSet _peerCoordinatorSet;
|
||||
private final ConnectionAcceptor _connectionAcceptor;
|
||||
private Thread _monitor;
|
||||
private volatile boolean _running;
|
||||
private volatile boolean _stopping;
|
||||
@@ -271,6 +271,8 @@ public class SnarkManager implements CompleteListener, ClientApp, DisconnectList
|
||||
_log = _context.logManager().getLog(SnarkManager.class);
|
||||
_messages = new UIMessages(MAX_MESSAGES);
|
||||
_util = new I2PSnarkUtil(_context, ctxName, this);
|
||||
_peerCoordinatorSet = new PeerCoordinatorSet();
|
||||
_connectionAcceptor = new ConnectionAcceptor(_util, _peerCoordinatorSet);
|
||||
DEFAULT_AUTO_START = !ctx.isRouterContext();
|
||||
String cfile = ctxName + CONFIG_FILE_SUFFIX;
|
||||
File configFile = new File(cfile);
|
||||
@@ -296,8 +298,6 @@ public class SnarkManager implements CompleteListener, ClientApp, DisconnectList
|
||||
if (cmgr != null)
|
||||
cmgr.register(this);
|
||||
}
|
||||
_peerCoordinatorSet = new PeerCoordinatorSet();
|
||||
_connectionAcceptor = new ConnectionAcceptor(_util, _peerCoordinatorSet);
|
||||
_monitor = new I2PAppThread(new DirMonitor(), "Snark DirMonitor", true);
|
||||
_monitor.start();
|
||||
// only if default instance
|
||||
@@ -1718,21 +1718,31 @@ public class SnarkManager implements CompleteListener, ClientApp, DisconnectList
|
||||
String link = linkify(torrent);
|
||||
if (!dontAutoStart && shouldAutoStart() && running) {
|
||||
if (!_util.connected()) {
|
||||
addMessage(_t("Connecting to I2P"));
|
||||
String msg = _t("Connecting to I2P");
|
||||
addMessage(msg);
|
||||
if (!_context.isRouterContext())
|
||||
System.out.println(msg);
|
||||
boolean ok = _util.connect();
|
||||
if (!ok) {
|
||||
if (_context.isRouterContext())
|
||||
if (_context.isRouterContext()) {
|
||||
addMessage(_t("Unable to connect to I2P"));
|
||||
else
|
||||
addMessage(_t("Error connecting to I2P - check your I2CP settings!") + ' ' + _util.getI2CPHost() + ':' + _util.getI2CPPort());
|
||||
} else {
|
||||
msg = _t("Error connecting to I2P - check your I2CP settings!") + ' ' + _util.getI2CPHost() + ':' + _util.getI2CPPort();
|
||||
addMessage(msg);
|
||||
System.out.println(msg);
|
||||
}
|
||||
// this would rename the torrent to .BAD
|
||||
//return false;
|
||||
}
|
||||
}
|
||||
torrent.startTorrent();
|
||||
addMessageNoEscape(_t("Torrent added and started: {0}", link));
|
||||
if (!_context.isRouterContext())
|
||||
System.out.println(_t("Torrent added and started: {0}", torrent.getBaseName()));
|
||||
} else {
|
||||
addMessageNoEscape(_t("Torrent added: {0}", link));
|
||||
if (!_context.isRouterContext())
|
||||
System.out.println(_t("Torrent added: {0}", torrent.getBaseName()));
|
||||
}
|
||||
return true;
|
||||
}
|
||||
@@ -2554,6 +2564,9 @@ public class SnarkManager implements CompleteListener, ClientApp, DisconnectList
|
||||
// Test if the router is there
|
||||
// For standalone, this will probe the router every 60 seconds if not connected
|
||||
boolean oldOK = routerOK;
|
||||
// standalone, first time only
|
||||
if (doMagnets && !_context.isRouterContext())
|
||||
dtgNotify(Log.INFO, _t("Connecting to I2P") + ' ' + _util.getI2CPHost() + ':' + _util.getI2CPPort());
|
||||
routerOK = getBWLimit();
|
||||
if (routerOK) {
|
||||
autostart = shouldAutoStart();
|
||||
@@ -2564,17 +2577,29 @@ public class SnarkManager implements CompleteListener, ClientApp, DisconnectList
|
||||
String prop = config.getProperty(PROP_META_RUNNING);
|
||||
if (prop == null || Boolean.parseBoolean(prop)) {
|
||||
if (!_util.connected()) {
|
||||
addMessage(_t("Connecting to I2P"));
|
||||
String msg = _t("Connecting to I2P");
|
||||
addMessage(msg);
|
||||
if (!_context.isRouterContext())
|
||||
dtgNotify(Log.INFO, msg + ' ' + _util.getI2CPHost() + ':' + _util.getI2CPPort());
|
||||
// getBWLimit() was successful so this should work
|
||||
boolean ok = _util.connect();
|
||||
if (!ok) {
|
||||
if (_context.isRouterContext())
|
||||
if (_context.isRouterContext()) {
|
||||
addMessage(_t("Unable to connect to I2P"));
|
||||
else
|
||||
addMessage(_t("Error connecting to I2P - check your I2CP settings!") + ' ' + _util.getI2CPHost() + ':' + _util.getI2CPPort());
|
||||
} else {
|
||||
msg = _t("Error connecting to I2P - check your I2CP settings!") + ' ' + _util.getI2CPHost() + ':' + _util.getI2CPPort();
|
||||
addMessage(msg);
|
||||
dtgNotify(Log.ERROR, msg);
|
||||
}
|
||||
routerOK = false;
|
||||
autostart = false;
|
||||
break;
|
||||
} else {
|
||||
if (!_context.isRouterContext()) {
|
||||
msg = "Connected to I2P at " + ' ' + _util.getI2CPHost() + ':' + _util.getI2CPPort();
|
||||
addMessage(msg);
|
||||
dtgNotify(Log.INFO, msg);
|
||||
}
|
||||
}
|
||||
}
|
||||
addMessageNoEscape(_t("Starting up torrent {0}", linkify(snark)));
|
||||
@@ -2623,10 +2648,13 @@ public class SnarkManager implements CompleteListener, ClientApp, DisconnectList
|
||||
if (ok)
|
||||
cleanupTorrentStatus();
|
||||
if (!routerOK) {
|
||||
if (_context.isRouterContext())
|
||||
if (_context.isRouterContext()) {
|
||||
addMessage(_t("Unable to connect to I2P"));
|
||||
else
|
||||
addMessage(_t("Error connecting to I2P - check your I2CP settings!") + ' ' + _util.getI2CPHost() + ':' + _util.getI2CPPort());
|
||||
} else {
|
||||
String msg = _t("Error connecting to I2P - check your I2CP settings!") + ' ' + _util.getI2CPHost() + ':' + _util.getI2CPPort();
|
||||
addMessage(msg);
|
||||
dtgNotify(Log.ERROR, msg);
|
||||
}
|
||||
}
|
||||
}
|
||||
try { Thread.sleep(60*1000); } catch (InterruptedException ie) {}
|
||||
@@ -2646,15 +2674,9 @@ public class SnarkManager implements CompleteListener, ClientApp, DisconnectList
|
||||
return;
|
||||
if (snark.getDownloaded() > 0) {
|
||||
addMessageNoEscape(_t("Download finished: {0}", linkify(snark)));
|
||||
ClientAppManager cmgr = _context.clientAppManager();
|
||||
if (cmgr != null) {
|
||||
NotificationService ns = (NotificationService) cmgr.getRegisteredApp("desktopgui");
|
||||
if (ns != null) {
|
||||
ns.notify("I2PSnark", null, Log.INFO, _t("I2PSnark"),
|
||||
_t("Download finished: {0}", snark.getName()),
|
||||
"/i2psnark/" + linkify(snark));
|
||||
}
|
||||
}
|
||||
dtgNotify(Log.INFO,
|
||||
_t("Download finished: {0}", snark.getName()),
|
||||
"/i2psnark/" + linkify(snark));
|
||||
}
|
||||
updateStatus(snark);
|
||||
}
|
||||
@@ -2745,6 +2767,38 @@ public class SnarkManager implements CompleteListener, ClientApp, DisconnectList
|
||||
|
||||
// End Snark.CompleteListeners
|
||||
|
||||
/**
|
||||
* Send a notification to the user via desktopgui and,
|
||||
* if standalone, on the console.
|
||||
*
|
||||
* @param priority log level
|
||||
* @param message translated
|
||||
* @since 0.9.54
|
||||
*/
|
||||
private void dtgNotify(int priority, String message) {
|
||||
dtgNotify(priority, message, null);
|
||||
}
|
||||
|
||||
/**
|
||||
* Send a notification to the user via desktopgui and,
|
||||
* if standalone, on the console.
|
||||
*
|
||||
* @param priority log level
|
||||
* @param message translated
|
||||
* @param path in console for more information, starting with /, must be URL-escaped, or null
|
||||
* @since 0.9.54
|
||||
*/
|
||||
private void dtgNotify(int priority, String message, String path) {
|
||||
ClientAppManager cmgr = _context.clientAppManager();
|
||||
if (cmgr != null) {
|
||||
NotificationService ns = (NotificationService) cmgr.getRegisteredApp("desktopgui");
|
||||
if (ns != null)
|
||||
ns.notify("I2PSnark", null, priority, _t("I2PSnark"), message, path);
|
||||
}
|
||||
if (!_context.isRouterContext())
|
||||
System.out.println(message);
|
||||
}
|
||||
|
||||
/**
|
||||
* An HTML link to the file if complete and a single file,
|
||||
* to the directory if not complete or not a single file,
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
package org.klomp.snark.standalone;
|
||||
|
||||
import java.awt.GraphicsEnvironment;
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.util.Properties;
|
||||
@@ -9,8 +10,10 @@ import org.eclipse.jetty.util.log.Log;
|
||||
import net.i2p.I2PAppContext;
|
||||
import net.i2p.apps.systray.UrlLauncher;
|
||||
import net.i2p.data.DataHelper;
|
||||
import net.i2p.desktopgui.ExternalMain;
|
||||
import net.i2p.jetty.I2PLogger;
|
||||
import net.i2p.jetty.JettyStart;
|
||||
import net.i2p.util.SystemVersion;
|
||||
|
||||
/**
|
||||
* @since moved from ../web and fixed in 0.9.27
|
||||
@@ -23,6 +26,7 @@ public class RunStandalone {
|
||||
private String _host = "127.0.0.1";
|
||||
private static RunStandalone _instance;
|
||||
static final File APP_CONFIG_FILE = new File("i2psnark-appctx.config");
|
||||
private static final String PROP_DTG_ENABLED = "desktopgui.enabled";
|
||||
|
||||
private RunStandalone(String args[]) throws Exception {
|
||||
Properties p = new Properties();
|
||||
@@ -66,8 +70,10 @@ public class RunStandalone {
|
||||
|
||||
public void start() {
|
||||
try {
|
||||
_jettyStart.startup();
|
||||
String url = "http://" + _host + ':' + _port + "/i2psnark/";
|
||||
System.out.println("Starting i2psnark at " + url);
|
||||
startTrayApp();
|
||||
_jettyStart.startup();
|
||||
try {
|
||||
Thread.sleep(1000);
|
||||
} catch (InterruptedException ie) {}
|
||||
@@ -92,4 +98,39 @@ public class RunStandalone {
|
||||
} catch (InterruptedException ie) {}
|
||||
System.exit(1);
|
||||
}
|
||||
|
||||
/**
|
||||
* @since 0.9.54 adapted from RouterConsoleRunner
|
||||
*/
|
||||
private static boolean isSystrayEnabled(I2PAppContext context) {
|
||||
if (GraphicsEnvironment.isHeadless())
|
||||
return false;
|
||||
// default false except on OSX and Windows,
|
||||
// and on Linux KDE and LXDE.
|
||||
// Xubuntu XFCE works but doesn't look very good
|
||||
// Ubuntu Unity was far too buggy to enable
|
||||
// Ubuntu GNOME does not work, SystemTray.isSupported() returns false
|
||||
String xdg = System.getenv("XDG_CURRENT_DESKTOP");
|
||||
boolean dflt = SystemVersion.isWindows() ||
|
||||
SystemVersion.isMac() ||
|
||||
//"XFCE".equals(xdg) ||
|
||||
"KDE".equals(xdg) ||
|
||||
"LXDE".equals(xdg);
|
||||
return context.getProperty(PROP_DTG_ENABLED, dflt);
|
||||
}
|
||||
|
||||
/**
|
||||
* @since 0.9.54 adapted from RouterConsoleRunner
|
||||
*/
|
||||
private void startTrayApp() {
|
||||
try {
|
||||
if (isSystrayEnabled(_context)) {
|
||||
System.setProperty("java.awt.headless", "false");
|
||||
ExternalMain dtg = new ExternalMain(_context, _context.clientAppManager(), null);
|
||||
dtg.startup();
|
||||
}
|
||||
} catch (Throwable t) {
|
||||
t.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -320,7 +320,9 @@ public class I2PSnarkServlet extends BasicServlet {
|
||||
|
||||
// we want it to go to the base URI so we don't refresh with some funky action= value
|
||||
int delay = 0;
|
||||
if (!isConfigure) {
|
||||
if (isConfigure) {
|
||||
out.write("<script src=\".resources/js/configui.js?" + CoreVersion.VERSION + "\" type=\"text/javascript\"></script>\n");
|
||||
} else {
|
||||
delay = _manager.getRefreshDelaySeconds();
|
||||
if (delay > 0) {
|
||||
String jsPfx = _context.isRouterContext() ? "" : ".resources";
|
||||
@@ -2503,7 +2505,7 @@ public class I2PSnarkServlet extends BasicServlet {
|
||||
out.write(_t("Theme"));
|
||||
out.write(":<td colspan=\"2\">");
|
||||
if (_manager.getUniversalTheming()) {
|
||||
out.write("<select name='theme' disabled=\"disabled\" title=\"");
|
||||
out.write("<select id=\"theme\" name=\"theme\" disabled=\"disabled\" title=\"");
|
||||
out.write(_t("To change themes manually, disable universal theming"));
|
||||
out.write("\"><option>");
|
||||
out.write(_manager.getTheme());
|
||||
@@ -2513,7 +2515,7 @@ public class I2PSnarkServlet extends BasicServlet {
|
||||
out.write(_t("Configure"));
|
||||
out.write("]</a>");
|
||||
} else {
|
||||
out.write("<select name='theme'>");
|
||||
out.write("<select id=\"theme\" name=\"theme\">");
|
||||
String theme = _manager.getTheme();
|
||||
String[] themes = _manager.getThemes();
|
||||
// translated sort
|
||||
@@ -2954,7 +2956,7 @@ public class I2PSnarkServlet extends BasicServlet {
|
||||
}
|
||||
|
||||
private static final String DOCTYPE = "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\n";
|
||||
private static final String HEADER_A = "<link href=\"";
|
||||
private static final String HEADER_A = "<link id=\"pagestyle\" href=\"";
|
||||
private static final String HEADER_B = "snark.css?" + CoreVersion.VERSION + "\" rel=\"stylesheet\" type=\"text/css\" >";
|
||||
private static final String HEADER_C = "nocollapse.css?" + CoreVersion.VERSION + "\" rel=\"stylesheet\" type=\"text/css\" >";
|
||||
|
||||
|
||||
@@ -14,6 +14,10 @@
|
||||
|
||||
package org.klomp.snark.web;
|
||||
|
||||
import java.io.BufferedReader;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.InputStreamReader;
|
||||
import java.io.IOException;
|
||||
import java.util.Enumeration;
|
||||
import java.util.Locale;
|
||||
import java.util.Map;
|
||||
@@ -21,6 +25,9 @@ import java.util.MissingResourceException;
|
||||
import java.util.ResourceBundle;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
|
||||
import net.i2p.data.DataHelper;
|
||||
import net.i2p.util.SystemVersion;
|
||||
|
||||
|
||||
/* ------------------------------------------------------------ */
|
||||
/**
|
||||
@@ -47,6 +54,8 @@ class MimeTypes
|
||||
|
||||
public MimeTypes() {
|
||||
_mimeMap = new ConcurrentHashMap<String, String>();
|
||||
if (!(SystemVersion.isWindows() || SystemVersion.isMac() || SystemVersion.getMaxMemory() < 100*1024*1024L))
|
||||
loadSystemMimeTypes();
|
||||
}
|
||||
|
||||
/* ------------------------------------------------------------ */
|
||||
@@ -86,6 +95,37 @@ class MimeTypes
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Load mime types from /etc/mime.types
|
||||
* Format: mimetype suffix1 suffix2 ...
|
||||
*
|
||||
* @since 0.9.54
|
||||
*/
|
||||
private void loadSystemMimeTypes() {
|
||||
BufferedReader in = null;
|
||||
try {
|
||||
in = new BufferedReader(new InputStreamReader(new FileInputStream("/etc/mime.types"), "ISO-8859-1"));
|
||||
while (true) {
|
||||
String line = in.readLine();
|
||||
if (line == null)
|
||||
break;
|
||||
if (line.startsWith("#"))
|
||||
continue;
|
||||
String[] s = DataHelper.split(line, "[ \t]+", 16);
|
||||
if (s.length < 2)
|
||||
continue;
|
||||
for (int i = 1; i < s.length; i++) {
|
||||
_mimeMap.put(s[i].toLowerCase(Locale.US), s[0]);
|
||||
//System.out.println("Mapping: '" + s[i] + "' -> '" + s[0] + "'");
|
||||
}
|
||||
}
|
||||
//System.out.println("Loaded " + _mimeMap.size() + " mime types from /etc/mime.types");
|
||||
} catch (IOException ioe) {
|
||||
} finally {
|
||||
if (in != null) try { in.close(); } catch (IOException ioe) {}
|
||||
}
|
||||
}
|
||||
|
||||
/* ------------------------------------------------------------ */
|
||||
/** Get the MIME type by filename extension.
|
||||
*
|
||||
|
||||
@@ -8,6 +8,9 @@
|
||||
# Raise the soft open files soft ulimit to this value, if able
|
||||
OPEN_FILES_ULIMIT=2048
|
||||
|
||||
# Increase memory to 512 MB
|
||||
JAVA_OPTS='-Xmx512m'
|
||||
|
||||
raiseopenfilesulimit() {
|
||||
OPEN_FILES_SOFT=`ulimit -S -n` 2> /dev/null || return
|
||||
if [ "$OPEN_FILES_SOFT" != "unlimited" ]
|
||||
@@ -33,4 +36,4 @@ raiseopenfilesulimit() {
|
||||
raiseopenfilesulimit
|
||||
|
||||
I2P="."
|
||||
java -jar "$I2P/i2psnark.jar"
|
||||
java $JAVA_OPTS -jar "$I2P/i2psnark.jar"
|
||||
|
||||
@@ -11,8 +11,8 @@ msgstr ""
|
||||
"Project-Id-Version: I2P\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2022-02-09 19:13+0000\n"
|
||||
"PO-Revision-Date: 2022-02-09 19:23+0000\n"
|
||||
"Last-Translator: A5h8d0wf0x <littleslyfoxie28@gmail.com>\n"
|
||||
"PO-Revision-Date: 2011-02-13 12:00+0000\n"
|
||||
"Last-Translator: A5h8d0wf0x <littleslyfoxie28@gmail.com>, 2014\n"
|
||||
"Language-Team: Czech (http://www.transifex.com/otf/I2P/language/cs/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
@@ -1128,7 +1128,7 @@ msgstr ""
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1891
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3277
|
||||
msgid "Completed"
|
||||
msgstr ""
|
||||
msgstr "Dokončeno"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1929
|
||||
msgid "Stop the torrent"
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
# D.A. Loader, 2012
|
||||
# ducki2p <ducki2p@gmail.com>, 2011
|
||||
# Ettore Atalan <atalanttore@googlemail.com>, 2014,2017
|
||||
# Fabian Schuler, 2022
|
||||
# foo <foo@bar>, 2009
|
||||
# SteinQuadrat, 2013
|
||||
# Lars Schimmer <echelon@i2pmail.org>, 2014-2016,2018,2020-2021
|
||||
@@ -25,8 +26,8 @@ msgstr ""
|
||||
"Project-Id-Version: I2P\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2022-02-09 19:13+0000\n"
|
||||
"PO-Revision-Date: 2022-02-09 19:23+0000\n"
|
||||
"Last-Translator: ducki2p <ducki2p@gmail.com>\n"
|
||||
"PO-Revision-Date: 2011-02-13 12:00+0000\n"
|
||||
"Last-Translator: Fabian Schuler, 2022\n"
|
||||
"Language-Team: German (http://www.transifex.com/otf/I2P/language/de/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
@@ -56,7 +57,7 @@ msgstr "Magnet"
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:2572
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:2627
|
||||
msgid "Unable to connect to I2P"
|
||||
msgstr ""
|
||||
msgstr "Verbindung zu I2P nicht möglich"
|
||||
|
||||
#: ../java/src/org/klomp/snark/Snark.java:597
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1727
|
||||
@@ -1546,7 +1547,7 @@ msgstr[1] "{0} Tunnel"
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3121
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3428
|
||||
msgid "Edit Torrent"
|
||||
msgstr ""
|
||||
msgstr "Torrent bearbeiten"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3131
|
||||
msgid "Torrent file"
|
||||
@@ -1641,7 +1642,7 @@ msgstr "Überprüfung forcieren"
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:4205
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:4544
|
||||
msgid "Torrent must be stopped"
|
||||
msgstr ""
|
||||
msgstr "Torrent muss beendet werden"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3425
|
||||
msgid "Check integrity of the downloaded files"
|
||||
@@ -1649,7 +1650,7 @@ msgstr "Integrität der heruntergeladenen Dateien überprüfen."
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3434
|
||||
msgid "Add or remove trackers"
|
||||
msgstr ""
|
||||
msgstr "Tracker hinzufügen oder entfernen"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3444
|
||||
msgid "Download files in order"
|
||||
@@ -1821,7 +1822,7 @@ msgstr "Tracker"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:4273
|
||||
msgid "Add Tracker"
|
||||
msgstr ""
|
||||
msgstr "Tracker hinzufügen"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:4313
|
||||
msgid "Save Changes"
|
||||
|
||||
@@ -10,8 +10,8 @@ msgstr ""
|
||||
"Project-Id-Version: I2P\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2022-02-09 19:13+0000\n"
|
||||
"PO-Revision-Date: 2022-02-09 19:23+0000\n"
|
||||
"Last-Translator: Alex <hestia@riseup.net>\n"
|
||||
"PO-Revision-Date: 2011-02-13 12:00+0000\n"
|
||||
"Last-Translator: LaScapigliata <ditri2000@hotmail.com>, 2015\n"
|
||||
"Language-Team: Greek (http://www.transifex.com/otf/I2P/language/el/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
@@ -1598,7 +1598,7 @@ msgstr "Υπόλοιπα"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3375
|
||||
msgid "Skipped"
|
||||
msgstr ""
|
||||
msgstr "Παρελήφθη"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3383
|
||||
msgid "Files"
|
||||
|
||||
@@ -11,8 +11,8 @@ msgstr ""
|
||||
"Project-Id-Version: I2P\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2022-02-09 19:13+0000\n"
|
||||
"PO-Revision-Date: 2022-02-09 19:23+0000\n"
|
||||
"Last-Translator: Martus Translations <translations@martus.org>\n"
|
||||
"PO-Revision-Date: 2011-02-13 12:00+0000\n"
|
||||
"Last-Translator: Reza Ghasemi, 2019\n"
|
||||
"Language-Team: Persian (http://www.transifex.com/otf/I2P/language/fa/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
@@ -1114,7 +1114,7 @@ msgstr ""
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1891
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3277
|
||||
msgid "Completed"
|
||||
msgstr ""
|
||||
msgstr "تکمیل شد"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1929
|
||||
msgid "Stop the torrent"
|
||||
|
||||
@@ -11,8 +11,8 @@ msgstr ""
|
||||
"Project-Id-Version: I2P\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2022-02-09 19:13+0000\n"
|
||||
"PO-Revision-Date: 2022-02-09 19:23+0000\n"
|
||||
"Last-Translator: outolumo <outolumo@gmail.com>\n"
|
||||
"PO-Revision-Date: 2011-02-13 12:00+0000\n"
|
||||
"Last-Translator: outolumo <outolumo@gmail.com>, 2016\n"
|
||||
"Language-Team: Finnish (http://www.transifex.com/otf/I2P/language/fi/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
@@ -1795,7 +1795,7 @@ msgstr ""
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:4165
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:4251
|
||||
msgid "Mark for deletion"
|
||||
msgstr ""
|
||||
msgstr "Merkitse poistettavaksi"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:4178
|
||||
msgid "Delete Selected"
|
||||
@@ -1811,4 +1811,4 @@ msgstr ""
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:4313
|
||||
msgid "Save Changes"
|
||||
msgstr ""
|
||||
msgstr "Tallenna muutokset"
|
||||
|
||||
@@ -11,8 +11,8 @@ msgstr ""
|
||||
"Project-Id-Version: I2P\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2022-02-09 19:13+0000\n"
|
||||
"PO-Revision-Date: 2022-02-09 19:23+0000\n"
|
||||
"Last-Translator: Allan Nordhøy <epost@anotheragency.no>\n"
|
||||
"PO-Revision-Date: 2011-02-13 12:00+0000\n"
|
||||
"Last-Translator: Allan Nordhøy <epost@anotheragency.no>, 2017\n"
|
||||
"Language-Team: Norwegian Bokmål (http://www.transifex.com/otf/I2P/language/nb/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
@@ -804,7 +804,7 @@ msgstr ""
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:916
|
||||
msgid "First"
|
||||
msgstr ""
|
||||
msgstr "Først"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:916
|
||||
msgid "First page"
|
||||
@@ -828,7 +828,7 @@ msgstr ""
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:967
|
||||
msgid "Last"
|
||||
msgstr ""
|
||||
msgstr "Sist"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:967
|
||||
msgid "Last page"
|
||||
@@ -1092,7 +1092,7 @@ msgstr "Torrentdetaljer"
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1839
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:4036
|
||||
msgid "Comments"
|
||||
msgstr ""
|
||||
msgstr "Kommentarer"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1863
|
||||
msgid "View files"
|
||||
@@ -1599,7 +1599,7 @@ msgstr "Gjennstår"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3375
|
||||
msgid "Skipped"
|
||||
msgstr ""
|
||||
msgstr "Hoppet over"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3383
|
||||
msgid "Files"
|
||||
@@ -1777,7 +1777,7 @@ msgstr ""
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:4087
|
||||
msgid "Add Comment"
|
||||
msgstr ""
|
||||
msgstr "Legg til kommentar"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:4099
|
||||
msgid "My Rating"
|
||||
@@ -1811,4 +1811,4 @@ msgstr ""
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:4313
|
||||
msgid "Save Changes"
|
||||
msgstr ""
|
||||
msgstr "Lagre endringer"
|
||||
|
||||
@@ -20,8 +20,8 @@ msgstr ""
|
||||
"Project-Id-Version: I2P\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2022-02-09 19:13+0000\n"
|
||||
"PO-Revision-Date: 2022-02-09 19:23+0000\n"
|
||||
"Last-Translator: hxdcmls\n"
|
||||
"PO-Revision-Date: 2011-02-13 12:00+0000\n"
|
||||
"Last-Translator: Manuela Silva <mmsrs@sky.com>, 2017-2018\n"
|
||||
"Language-Team: Portuguese (http://www.transifex.com/otf/I2P/language/pt/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
@@ -247,11 +247,11 @@ msgstr ""
|
||||
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1326
|
||||
msgid "Enabled Comments."
|
||||
msgstr ""
|
||||
msgstr "Comentário Ativado."
|
||||
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1328
|
||||
msgid "Disabled Comments."
|
||||
msgstr ""
|
||||
msgstr "Comentário Desativado."
|
||||
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1341
|
||||
#, java-format
|
||||
@@ -1123,7 +1123,7 @@ msgstr "restantes"
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1891
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3277
|
||||
msgid "Completed"
|
||||
msgstr ""
|
||||
msgstr "Completado"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1929
|
||||
msgid "Stop the torrent"
|
||||
@@ -1608,7 +1608,7 @@ msgstr "Restantes"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3375
|
||||
msgid "Skipped"
|
||||
msgstr ""
|
||||
msgstr "Ignorado"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3383
|
||||
msgid "Files"
|
||||
@@ -1786,7 +1786,7 @@ msgstr ""
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:4087
|
||||
msgid "Add Comment"
|
||||
msgstr ""
|
||||
msgstr "Adicionar Comentário"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:4099
|
||||
msgid "My Rating"
|
||||
|
||||
@@ -6,14 +6,14 @@
|
||||
# Translators:
|
||||
# testsubject67 <deborinha97@hotmail.com>, 2014
|
||||
# Eduardo Rodrigues, 2020
|
||||
# blueboy, 2015-2016
|
||||
# L., 2015-2016
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: I2P\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2022-02-09 19:13+0000\n"
|
||||
"PO-Revision-Date: 2022-02-09 19:23+0000\n"
|
||||
"Last-Translator: blueboy\n"
|
||||
"PO-Revision-Date: 2011-02-13 12:00+0000\n"
|
||||
"Last-Translator: Eduardo Rodrigues, 2020\n"
|
||||
"Language-Team: Portuguese (Brazil) (http://www.transifex.com/otf/I2P/language/pt_BR/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
@@ -23,7 +23,7 @@ msgstr ""
|
||||
|
||||
#: ../java/src/org/klomp/snark/IdleChecker.java:76
|
||||
msgid "No more torrents running."
|
||||
msgstr ""
|
||||
msgstr "Sem mais torrents em execução."
|
||||
|
||||
#: ../java/src/org/klomp/snark/IdleChecker.java:77
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:3149
|
||||
@@ -35,7 +35,7 @@ msgstr "Túnel I2P fechado"
|
||||
#: ../java/src/org/klomp/snark/MagnetURI.java:60
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:2788
|
||||
msgid "Magnet"
|
||||
msgstr ""
|
||||
msgstr "magnet"
|
||||
|
||||
#: ../java/src/org/klomp/snark/Snark.java:595
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:355
|
||||
@@ -67,7 +67,7 @@ msgstr ""
|
||||
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:146
|
||||
msgid "vanilla"
|
||||
msgstr ""
|
||||
msgstr "vanilla"
|
||||
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:997
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1151
|
||||
@@ -77,14 +77,14 @@ msgstr ""
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1242
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1350
|
||||
msgid "No write permissions for data directory"
|
||||
msgstr ""
|
||||
msgstr "Sem permissões de gravação para a diretoria de dados"
|
||||
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1000
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1144
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:735
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1054
|
||||
msgid "Data directory cannot be created"
|
||||
msgstr ""
|
||||
msgstr "Não é possível criar a diretoria de dados"
|
||||
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1062
|
||||
#, java-format
|
||||
@@ -114,33 +114,33 @@ msgstr "Atraso de inicialização alterada para {0}"
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1101
|
||||
#, java-format
|
||||
msgid "Refresh time changed to {0}"
|
||||
msgstr ""
|
||||
msgstr "Tempo de actualização alterado para {0}"
|
||||
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1103
|
||||
msgid "Refresh disabled"
|
||||
msgstr ""
|
||||
msgstr "Actualização desactivada"
|
||||
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1119
|
||||
#, java-format
|
||||
msgid "Page size changed to {0}"
|
||||
msgstr ""
|
||||
msgstr "Tamanho de pagina alterado para {0}"
|
||||
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1129
|
||||
msgid "New files will be publicly readable"
|
||||
msgstr ""
|
||||
msgstr "Novos ficheiros serão lidos pelo publico"
|
||||
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1131
|
||||
msgid "New files will not be publicly readable"
|
||||
msgstr ""
|
||||
msgstr "Novos ficheiros não serão lidos pelo publico"
|
||||
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1139
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1050
|
||||
msgid "Data directory must be an absolute path"
|
||||
msgstr ""
|
||||
msgstr "Diretório de dados deve ter um caminho absoluto"
|
||||
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1143
|
||||
msgid "Data directory does not exist"
|
||||
msgstr ""
|
||||
msgstr "Diretório de dados não existe"
|
||||
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1146
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:737
|
||||
@@ -155,7 +155,7 @@ msgstr "Não legível"
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1155
|
||||
#, java-format
|
||||
msgid "Data directory changed to {0}"
|
||||
msgstr ""
|
||||
msgstr "Diretório de dados alterado para {0}"
|
||||
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1236
|
||||
msgid "I2CP and tunnel changes will take effect after stopping all torrents"
|
||||
@@ -164,7 +164,7 @@ msgstr "Alterações em túneis e I2C entrarão em vigor depois de parar todos t
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1240
|
||||
#, java-format
|
||||
msgid "I2CP options changed to {0}"
|
||||
msgstr ""
|
||||
msgstr "opções de I2cp alteradas para {0}"
|
||||
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1246
|
||||
msgid "Disconnecting old I2CP destination"
|
||||
@@ -219,15 +219,15 @@ msgstr "Trackers abertos não permitidos - reinício de torrents é preciso para
|
||||
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1306
|
||||
msgid "Enabled DHT."
|
||||
msgstr ""
|
||||
msgstr "Habilitar DHT."
|
||||
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1308
|
||||
msgid "Disabled DHT."
|
||||
msgstr ""
|
||||
msgstr "Desabilitar DHT."
|
||||
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1310
|
||||
msgid "DHT change requires tunnel shutdown and reopen"
|
||||
msgstr ""
|
||||
msgstr "Mudança no DHT requer fechamento e reabertura do túnel"
|
||||
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1317
|
||||
msgid "Enabled Ratings."
|
||||
@@ -273,7 +273,7 @@ msgstr "Lista de trackers abertos alterada - reinício de torrents é preciso pa
|
||||
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1409
|
||||
msgid "Private tracker list changed - affects newly created torrents only."
|
||||
msgstr ""
|
||||
msgstr "Lista de rastreadores privados alterada - somente afetará os novos torrentes criados."
|
||||
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1455
|
||||
#, java-format
|
||||
@@ -307,7 +307,7 @@ msgstr "Erro: não é possível adicionar o torrent {0}"
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1131
|
||||
#, java-format
|
||||
msgid "Torrent already running: {0}"
|
||||
msgstr ""
|
||||
msgstr "torrente já em marcha: {0}"
|
||||
|
||||
#. catch this here so we don't try do delete it below
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1624
|
||||
@@ -335,21 +335,21 @@ msgstr ""
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1655
|
||||
#, java-format
|
||||
msgid "ERROR - No I2P trackers in private torrent \"{0}\""
|
||||
msgstr ""
|
||||
msgstr "ERRO - Não há tracker I2P no torrent privado \"{0}\""
|
||||
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1657
|
||||
#, java-format
|
||||
msgid ""
|
||||
"Warning - No I2P trackers in \"{0}\", will announce to I2P open trackers and"
|
||||
" DHT only."
|
||||
msgstr ""
|
||||
msgstr "Aviso - Nenhum rastreador I2P em \"{0}\", o anúncio será feito apenas por rastreadores I2P abertos e DHT."
|
||||
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1660
|
||||
#, java-format
|
||||
msgid ""
|
||||
"Warning - No I2P trackers in \"{0}\", and open trackers are disabled, will "
|
||||
"announce to DHT only."
|
||||
msgstr ""
|
||||
msgstr "Aviso - Nenhum rastreador I2P em \"{0}\", e rastreadores I2P abertos estão desabilitados. O anúncio será feito apenas por DHT."
|
||||
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1662
|
||||
#, java-format
|
||||
@@ -357,7 +357,7 @@ msgid ""
|
||||
"Warning - No I2P trackers in \"{0}\", and DHT and open trackers are "
|
||||
"disabled, you should enable open trackers or DHT before starting the "
|
||||
"torrent."
|
||||
msgstr ""
|
||||
msgstr "Aviso - Nenhum rastreador I2P em \"{0}\", e DHT e rastreadores abertos estão desabilitados. Rastreadores abertos ou DHT devem ser habilitados antes de começar o torrente."
|
||||
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1688
|
||||
#, java-format
|
||||
@@ -369,7 +369,7 @@ msgstr "O torrent em \"{0}\" é inválido"
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1148
|
||||
#, java-format
|
||||
msgid "ERROR - Out of memory, cannot create torrent from {0}"
|
||||
msgstr ""
|
||||
msgstr "ERRO - Não ha espaço suficente, não se pode crear um torrente desde {0}."
|
||||
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1721
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:2567
|
||||
@@ -398,7 +398,7 @@ msgid ""
|
||||
"Open trackers are disabled and we have no DHT peers. Fetch of {0} may not "
|
||||
"succeed until you start another torrent, enable open trackers, or enable "
|
||||
"DHT."
|
||||
msgstr ""
|
||||
msgstr "Rastreadores abertos estão desabilitados e não há participantes DHT. Descarregamento de {0} pode não prosseguir enquanto outra torrente não for iniciada, rastreadores abertos forem habilitados ou DHT habilitado."
|
||||
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1823
|
||||
#, java-format
|
||||
@@ -408,7 +408,7 @@ msgstr "Adicionando {0}"
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1856
|
||||
#, java-format
|
||||
msgid "Download already running: {0}"
|
||||
msgstr ""
|
||||
msgstr "arquivo já descarregando: {0}"
|
||||
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1906
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1916
|
||||
@@ -496,7 +496,7 @@ msgstr "Iniciando torrent {0}"
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:2617
|
||||
#, java-format
|
||||
msgid "Up bandwidth limit is {0} KBps"
|
||||
msgstr ""
|
||||
msgstr "Limite de transmissão de dados é {0} KBps"
|
||||
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:2648
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:2654
|
||||
@@ -515,12 +515,12 @@ msgstr "I2PSnar"
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:2729
|
||||
#, java-format
|
||||
msgid "Error on torrent {0}"
|
||||
msgstr ""
|
||||
msgstr "Erro no torrente {0}"
|
||||
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:3022
|
||||
#: ../java/src/org/klomp/snark/web/FetchAndAdd.java:130
|
||||
msgid "Opening the I2P tunnel"
|
||||
msgstr ""
|
||||
msgstr "Abrindo o túnel I2P"
|
||||
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:3042
|
||||
msgid "Opening the I2P tunnel and starting all torrents."
|
||||
@@ -532,7 +532,7 @@ msgstr "Parando todos os torrents e fechando o túnel I2P"
|
||||
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:3134
|
||||
msgid "Closing I2P tunnel after notifying trackers."
|
||||
msgstr ""
|
||||
msgstr "Fechando túnel I2P após notificar os rastreadores."
|
||||
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:3204
|
||||
#, java-format
|
||||
@@ -552,7 +552,7 @@ msgstr ""
|
||||
#: ../java/src/org/klomp/snark/TrackerClient.java:245
|
||||
#, java-format
|
||||
msgid "No valid trackers for {0} - enable opentrackers or DHT?"
|
||||
msgstr ""
|
||||
msgstr "Nenhum rastreador válido para {0} - habilitar rastreadores abertos ou DHT?"
|
||||
|
||||
#: ../java/src/org/klomp/snark/UpdateHandler.java:49
|
||||
#: ../java/src/org/klomp/snark/UpdateRunner.java:233
|
||||
@@ -567,30 +567,30 @@ msgstr "Atualizando a partir de {0}"
|
||||
#: ../java/src/org/klomp/snark/web/FetchAndAdd.java:80
|
||||
#, java-format
|
||||
msgid "Download torrent file from {0}"
|
||||
msgstr ""
|
||||
msgstr "Descarregando arquivo torrente de {0}"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/FetchAndAdd.java:103
|
||||
#, java-format
|
||||
msgid "Torrent was not retrieved from {0}"
|
||||
msgstr ""
|
||||
msgstr "Não se pode obter torrente de {0}"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/FetchAndAdd.java:157
|
||||
#, java-format
|
||||
msgid "Torrent fetched from {0}"
|
||||
msgstr ""
|
||||
msgstr "torrente obtido de {0}"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/FetchAndAdd.java:180
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1133
|
||||
#, java-format
|
||||
msgid "Torrent already in the queue: {0}"
|
||||
msgstr ""
|
||||
msgstr "torrente já na cola: {0}"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/FetchAndAdd.java:193
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1107
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1146
|
||||
#, java-format
|
||||
msgid "Torrent at {0} was not valid"
|
||||
msgstr ""
|
||||
msgstr "torrente em {0} não foi válido"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:311
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2436
|
||||
@@ -615,7 +615,7 @@ msgstr "O roteador está fora do ar"
|
||||
msgid ""
|
||||
"Are you sure you want to delete the file \\''{0}\\'' (downloaded data will "
|
||||
"not be deleted) ?"
|
||||
msgstr ""
|
||||
msgstr "Tem a certeza que deseja apagar o ficheiro \\\"{0}\\\" (dados transferidos não serão apagados) ?"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:339
|
||||
#, java-format
|
||||
@@ -634,11 +634,11 @@ msgstr "Recarregar página"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:384
|
||||
msgid "Click \"Add torrent\" button to fetch torrent"
|
||||
msgstr ""
|
||||
msgstr "Clique no botão \"Adicionar torrent\" para obter o torrent"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:448
|
||||
msgid "clear messages"
|
||||
msgstr ""
|
||||
msgstr "limpar mensagens"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:505
|
||||
msgid "Status"
|
||||
@@ -724,7 +724,7 @@ msgstr "Uploaded"
|
||||
#. Translators: Please keep short or translate as " "
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:647
|
||||
msgid "RX Rate"
|
||||
msgstr ""
|
||||
msgstr "Taxa de recepção"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:649
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:650
|
||||
@@ -734,7 +734,7 @@ msgstr "Taxa de down"
|
||||
#. Translators: Please keep short or translate as " "
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:662
|
||||
msgid "TX Rate"
|
||||
msgstr ""
|
||||
msgstr "Taxa de transmissão"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:664
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:665
|
||||
@@ -751,7 +751,7 @@ msgstr "Parar todos"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:694
|
||||
msgid "Start all stopped torrents"
|
||||
msgstr ""
|
||||
msgstr "Iniciar todos os torrents interrompidos"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:696
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:710
|
||||
@@ -809,7 +809,7 @@ msgstr "Primeiro"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:916
|
||||
msgid "First page"
|
||||
msgstr ""
|
||||
msgstr "Primeira página"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:926
|
||||
msgid "Prev"
|
||||
@@ -817,7 +817,7 @@ msgstr "Anterior"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:926
|
||||
msgid "Previous page"
|
||||
msgstr ""
|
||||
msgstr "Página anterior"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:959
|
||||
msgid "Next"
|
||||
@@ -825,7 +825,7 @@ msgstr "Próximo"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:959
|
||||
msgid "Next page"
|
||||
msgstr ""
|
||||
msgstr "Próxima página"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:967
|
||||
msgid "Last"
|
||||
@@ -833,7 +833,7 @@ msgstr "Último"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:967
|
||||
msgid "Last page"
|
||||
msgstr ""
|
||||
msgstr "Última página"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1064
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1376
|
||||
@@ -867,7 +867,7 @@ msgstr ""
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1228
|
||||
#, java-format
|
||||
msgid "Download deleted: {0}"
|
||||
msgstr ""
|
||||
msgstr "Download excluído: {0}"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1254
|
||||
#, java-format
|
||||
@@ -883,12 +883,12 @@ msgstr "Não foi possível apagar o arquivo de data: {0}"
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1283
|
||||
#, java-format
|
||||
msgid "Directory could not be deleted: {0}"
|
||||
msgstr ""
|
||||
msgstr "Pasta não pôde ser excluída: {0}"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1291
|
||||
#, java-format
|
||||
msgid "Directory deleted: {0}"
|
||||
msgstr ""
|
||||
msgstr "Pasta excluída: {0}"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1355
|
||||
#, java-format
|
||||
@@ -912,11 +912,11 @@ msgstr ""
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1407
|
||||
msgid "Error - Cannot include alternate trackers without a primary tracker"
|
||||
msgstr ""
|
||||
msgstr "Erro - Impossível incluir rastreadores alternativos sem o rastreador primário"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1420
|
||||
msgid "Error - Cannot mix private and public trackers in a torrent"
|
||||
msgstr ""
|
||||
msgstr "Erro - Impossível misturar rastreadores públicos e privados num torrent"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1442
|
||||
#, java-format
|
||||
@@ -947,12 +947,12 @@ msgstr "Erro ao criar torrent - é preciso entrar com um arquivo ou diretório"
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1491
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2798
|
||||
msgid "Delete selected"
|
||||
msgstr ""
|
||||
msgstr "Apagar selecionados"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1491
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2800
|
||||
msgid "Save tracker configuration"
|
||||
msgstr ""
|
||||
msgstr "Salvar configurações do rastreador"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1508
|
||||
msgid "Removed"
|
||||
@@ -963,35 +963,35 @@ msgstr "Removido"
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2799
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:4279
|
||||
msgid "Add tracker"
|
||||
msgstr ""
|
||||
msgstr "Adicionar tracker"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1563
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1566
|
||||
msgid "Enter valid tracker name and URLs"
|
||||
msgstr ""
|
||||
msgstr "Insira um nome válido para o tracker e URLs"
|
||||
|
||||
#. "<input type=\"reset\" class=\"cancel\"
|
||||
#. value=\"").append(_t("Cancel")).append("\">\n" +
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1568
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2802
|
||||
msgid "Restore defaults"
|
||||
msgstr ""
|
||||
msgstr "Voltar ao padrão"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1571
|
||||
msgid "Restored default trackers"
|
||||
msgstr ""
|
||||
msgstr "Voltar aos rastreadores padrão"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1684
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1685
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3404
|
||||
msgid "Checking"
|
||||
msgstr ""
|
||||
msgstr "Verificando"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1688
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1689
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3411
|
||||
msgid "Allocating"
|
||||
msgstr ""
|
||||
msgstr "Reservando espaço"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1704
|
||||
msgid "Tracker Error"
|
||||
@@ -1105,12 +1105,12 @@ msgstr "Abrir arquivo"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1883
|
||||
msgid "complete"
|
||||
msgstr ""
|
||||
msgstr "completo"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1883
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3691
|
||||
msgid "remaining"
|
||||
msgstr ""
|
||||
msgstr "restantes"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1891
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3277
|
||||
@@ -1249,7 +1249,7 @@ msgstr "Criar torrent"
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2359
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2728
|
||||
msgid "Trackers"
|
||||
msgstr ""
|
||||
msgstr "Rastreadores"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2361
|
||||
msgid "Primary"
|
||||
@@ -1257,7 +1257,7 @@ msgstr "Primária"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2363
|
||||
msgid "Alternates"
|
||||
msgstr ""
|
||||
msgstr "Alternativos"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2365
|
||||
msgid "Tracker Type"
|
||||
@@ -1293,7 +1293,7 @@ msgstr ""
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2448
|
||||
msgid "Files readable by all"
|
||||
msgstr ""
|
||||
msgstr "Ficheiro legível por todos"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2452
|
||||
msgid ""
|
||||
@@ -1357,7 +1357,7 @@ msgstr "Configurar"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2536
|
||||
msgid "Refresh time"
|
||||
msgstr ""
|
||||
msgstr "Tempo de actualização"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2539
|
||||
msgid "How frequently torrent status is updated on the main page"
|
||||
@@ -1413,15 +1413,15 @@ msgstr ""
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2614
|
||||
msgid "Half available bandwidth recommended."
|
||||
msgstr ""
|
||||
msgstr "Se recomenda a metade da largura de banda disponível."
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2617
|
||||
msgid "View or change router bandwidth"
|
||||
msgstr ""
|
||||
msgstr "mostrar e mudar as preferências da largura de banda do roteador"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2623
|
||||
msgid "Use open trackers also"
|
||||
msgstr ""
|
||||
msgstr "usar também rastreadores abertos"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2627
|
||||
msgid ""
|
||||
@@ -1431,7 +1431,7 @@ msgstr ""
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2631
|
||||
msgid "Enable DHT"
|
||||
msgstr ""
|
||||
msgstr "Habilitar DHT"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2635
|
||||
msgid "Use DHT to find additional peers"
|
||||
@@ -1463,11 +1463,11 @@ msgstr ""
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2672
|
||||
msgid "Inbound Settings"
|
||||
msgstr ""
|
||||
msgstr "Preferências de entrada"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2679
|
||||
msgid "Outbound Settings"
|
||||
msgstr ""
|
||||
msgstr "Preferências de saida"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2688
|
||||
msgid "I2CP host"
|
||||
@@ -1483,7 +1483,7 @@ msgstr "opções I2CP"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2713
|
||||
msgid "Save configuration"
|
||||
msgstr ""
|
||||
msgstr "Guardar configuração"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2731
|
||||
msgid "Select trackers for removal from I2PSnark's known list"
|
||||
@@ -1496,11 +1496,11 @@ msgstr "Nome"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2736
|
||||
msgid "Website URL"
|
||||
msgstr ""
|
||||
msgstr "URL do Website"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2744
|
||||
msgid "Announce URL"
|
||||
msgstr ""
|
||||
msgstr "URL para anúncio"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2756
|
||||
msgid "Mark tracker for deletion"
|
||||
@@ -1513,7 +1513,7 @@ msgstr "Adicionar"
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2835
|
||||
#, java-format
|
||||
msgid "Invalid magnet URL {0}"
|
||||
msgstr ""
|
||||
msgstr "URL magnet {0} não válida"
|
||||
|
||||
#. * dummies for translation
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2843
|
||||
@@ -1537,7 +1537,7 @@ msgstr ""
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3131
|
||||
msgid "Torrent file"
|
||||
msgstr ""
|
||||
msgstr "Arquivo torrente"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3139
|
||||
msgid "Data location"
|
||||
@@ -1549,11 +1549,11 @@ msgstr ""
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3170
|
||||
msgid "Primary Tracker"
|
||||
msgstr ""
|
||||
msgstr "Rastreador Primário"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3189
|
||||
msgid "Tracker List"
|
||||
msgstr ""
|
||||
msgstr "Lista de Rastreadores"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3215
|
||||
msgid "Web Seeds"
|
||||
@@ -1571,7 +1571,7 @@ msgstr "Criada"
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3258
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:4307
|
||||
msgid "Created By"
|
||||
msgstr ""
|
||||
msgstr "Criado por"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3268
|
||||
msgid "Added"
|
||||
@@ -1583,15 +1583,15 @@ msgstr "Última atividade"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3302
|
||||
msgid "Magnet link"
|
||||
msgstr ""
|
||||
msgstr "URL magnet"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3317
|
||||
msgid "Private torrent"
|
||||
msgstr ""
|
||||
msgstr "Torrente privado"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3331
|
||||
msgid "Completion"
|
||||
msgstr ""
|
||||
msgstr "Finalização"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3366
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3604
|
||||
@@ -1608,11 +1608,11 @@ msgstr "Arquivos"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3389
|
||||
msgid "Pieces"
|
||||
msgstr ""
|
||||
msgstr "Peças"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3394
|
||||
msgid "Piece size"
|
||||
msgstr ""
|
||||
msgstr "Tamanho das peças"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3407
|
||||
msgid "Refresh page for results"
|
||||
@@ -1683,7 +1683,7 @@ msgstr ""
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3626
|
||||
msgid "Up to higher level directory"
|
||||
msgstr ""
|
||||
msgstr "Subir uma herarquia"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3637
|
||||
msgid "Audio Playlist"
|
||||
@@ -1691,11 +1691,11 @@ msgstr ""
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3669
|
||||
msgid "Torrent not found?"
|
||||
msgstr ""
|
||||
msgstr "Não achei o arquivo torrente?"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3675
|
||||
msgid "File not found in torrent?"
|
||||
msgstr ""
|
||||
msgstr "Arquivo não achado no torrente?"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3717
|
||||
msgid "Preview"
|
||||
@@ -1739,7 +1739,7 @@ msgstr ""
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3806
|
||||
msgid "Save priorities"
|
||||
msgstr ""
|
||||
msgstr "Guardar prioridades"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:4020
|
||||
msgid "Ratings and Comments"
|
||||
@@ -1804,7 +1804,7 @@ msgstr "Apagar selecionado"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:4238
|
||||
msgid "Tracker"
|
||||
msgstr ""
|
||||
msgstr "Rastreador"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:4273
|
||||
msgid "Add Tracker"
|
||||
|
||||
@@ -32,8 +32,8 @@ msgstr ""
|
||||
"Project-Id-Version: I2P\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2022-02-09 19:13+0000\n"
|
||||
"PO-Revision-Date: 2022-02-09 19:23+0000\n"
|
||||
"Last-Translator: Irina Fedulova <istartlin@gmail.com>\n"
|
||||
"PO-Revision-Date: 2011-02-13 12:00+0000\n"
|
||||
"Last-Translator: ValdikSS <iam@valdikss.org.ru>, 2017-2021\n"
|
||||
"Language-Team: Russian (Russia) (http://www.transifex.com/otf/I2P/language/ru_RU/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
@@ -1852,4 +1852,4 @@ msgstr ""
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:4313
|
||||
msgid "Save Changes"
|
||||
msgstr ""
|
||||
msgstr "Сохранить изменения"
|
||||
|
||||
@@ -24,8 +24,8 @@ msgstr ""
|
||||
"Project-Id-Version: I2P\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2022-02-09 19:13+0000\n"
|
||||
"PO-Revision-Date: 2022-02-09 19:23+0000\n"
|
||||
"Last-Translator: efef6ec5b435a041fce803c7f8af77d2_2341d43\n"
|
||||
"PO-Revision-Date: 2011-02-13 12:00+0000\n"
|
||||
"Last-Translator: Jonatan Nyberg <jonatan@autistici.org>, 2017,2021-2022\n"
|
||||
"Language-Team: Swedish (Sweden) (http://www.transifex.com/otf/I2P/language/sv_SE/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
@@ -1591,7 +1591,7 @@ msgstr "Tillagd"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3288
|
||||
msgid "Last activity"
|
||||
msgstr ""
|
||||
msgstr "Senaste aktivitet"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3302
|
||||
msgid "Magnet link"
|
||||
@@ -1824,4 +1824,4 @@ msgstr ""
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:4313
|
||||
msgid "Save Changes"
|
||||
msgstr ""
|
||||
msgstr "Spara ändringar"
|
||||
|
||||
@@ -11,8 +11,8 @@ msgstr ""
|
||||
"Project-Id-Version: I2P\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2022-02-09 19:13+0000\n"
|
||||
"PO-Revision-Date: 2022-02-10 06:32+0000\n"
|
||||
"Last-Translator: Kaya Zeren <kayazeren@gmail.com>\n"
|
||||
"PO-Revision-Date: 2011-02-13 12:00+0000\n"
|
||||
"Last-Translator: Kaya Zeren <kayazeren@gmail.com>, 2015-2022\n"
|
||||
"Language-Team: Turkish (Turkey) (http://www.transifex.com/otf/I2P/language/tr_TR/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
@@ -1474,7 +1474,7 @@ msgstr "I2CP sunucusu"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2693
|
||||
msgid "I2CP port"
|
||||
msgstr "I2CP kapı numarası"
|
||||
msgstr "I2CP bağlantı noktası"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2708
|
||||
msgid "I2CP options"
|
||||
|
||||
@@ -14,8 +14,8 @@ msgstr ""
|
||||
"Project-Id-Version: I2P\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2022-02-09 19:13+0000\n"
|
||||
"PO-Revision-Date: 2022-02-09 19:23+0000\n"
|
||||
"Last-Translator: madjong <madjong@i2pmail.org>\n"
|
||||
"PO-Revision-Date: 2011-02-13 12:00+0000\n"
|
||||
"Last-Translator: Greg Koval <gregjsmith@gmx.com>, 2020\n"
|
||||
"Language-Team: Ukrainian (Ukraine) (http://www.transifex.com/otf/I2P/language/uk_UA/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
@@ -1109,7 +1109,7 @@ msgstr "Деталі торрента"
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1839
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:4036
|
||||
msgid "Comments"
|
||||
msgstr ""
|
||||
msgstr "Коментарі"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1863
|
||||
msgid "View files"
|
||||
@@ -1269,7 +1269,7 @@ msgstr "Трекери"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2361
|
||||
msgid "Primary"
|
||||
msgstr ""
|
||||
msgstr "Основний"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2363
|
||||
msgid "Alternates"
|
||||
@@ -1512,7 +1512,7 @@ msgstr "Назва"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2736
|
||||
msgid "Website URL"
|
||||
msgstr ""
|
||||
msgstr "URL-адреса сайту"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2744
|
||||
msgid "Announce URL"
|
||||
@@ -1599,7 +1599,7 @@ msgstr "Додано"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3288
|
||||
msgid "Last activity"
|
||||
msgstr ""
|
||||
msgstr "Остання активність"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3302
|
||||
msgid "Magnet link"
|
||||
@@ -1620,7 +1620,7 @@ msgstr "Залишилось"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3375
|
||||
msgid "Skipped"
|
||||
msgstr ""
|
||||
msgstr "Пропущено"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3383
|
||||
msgid "Files"
|
||||
@@ -1678,7 +1678,7 @@ msgstr ""
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3463
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3481
|
||||
msgid "Resource"
|
||||
msgstr ""
|
||||
msgstr "Джерело"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3464
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3482
|
||||
@@ -1800,7 +1800,7 @@ msgstr ""
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:4087
|
||||
msgid "Add Comment"
|
||||
msgstr ""
|
||||
msgstr "Додати Коментар"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:4099
|
||||
msgid "My Rating"
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
# Translators:
|
||||
# ducki2p <ducki2p@gmail.com>, 2011
|
||||
# foo <foo@bar>, 2009
|
||||
# Fosworn D4, 2022
|
||||
# Scott Rhodes <starring169@gmail.com>, 2020-2022
|
||||
# Tommy Lmath <l5h5t7@qq.com>, 2016
|
||||
# walking <waling@mail.i2p>, 2013
|
||||
@@ -16,8 +17,8 @@ msgstr ""
|
||||
"Project-Id-Version: I2P\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2022-02-09 19:13+0000\n"
|
||||
"PO-Revision-Date: 2022-02-10 03:00+0000\n"
|
||||
"Last-Translator: Scott Rhodes <starring169@gmail.com>\n"
|
||||
"PO-Revision-Date: 2011-02-13 12:00+0000\n"
|
||||
"Last-Translator: Fosworn D4, 2022\n"
|
||||
"Language-Team: Chinese (China) (http://www.transifex.com/otf/I2P/language/zh_CN/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
@@ -81,7 +82,7 @@ msgstr "香草白"
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1242
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1350
|
||||
msgid "No write permissions for data directory"
|
||||
msgstr ""
|
||||
msgstr "没有对数据文件夹的写入权限。"
|
||||
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1000
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1144
|
||||
@@ -252,20 +253,20 @@ msgstr "已禁用评论。"
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1341
|
||||
#, java-format
|
||||
msgid "Comments name set to {0}."
|
||||
msgstr ""
|
||||
msgstr "评论名设置为{0}。"
|
||||
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1348
|
||||
#, java-format
|
||||
msgid "{0} theme loaded."
|
||||
msgstr ""
|
||||
msgstr "{0}主题已加载。"
|
||||
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1355
|
||||
msgid "Collapsible panels enabled."
|
||||
msgstr ""
|
||||
msgstr "可折叠面板已启用。"
|
||||
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1357
|
||||
msgid "Collapsible panels disabled."
|
||||
msgstr ""
|
||||
msgstr "可折叠面板已禁用。"
|
||||
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1367
|
||||
msgid "Configuration unchanged."
|
||||
@@ -334,7 +335,7 @@ msgstr "具有相同Hash链接的种子已在下载中:{0}"
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1896
|
||||
#, java-format
|
||||
msgid "Torrent with the same data location is already running: {0}"
|
||||
msgstr ""
|
||||
msgstr "具有相同数据地址的种子已在下载中:{0}"
|
||||
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1655
|
||||
#, java-format
|
||||
@@ -846,12 +847,12 @@ msgstr "无法添加内含另一个种子的种子 {0}:{1}"
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1082
|
||||
#, java-format
|
||||
msgid "Download from non-I2P location {0} is not supported"
|
||||
msgstr ""
|
||||
msgstr "不支持从非 I2P 地址{0}下载"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1153
|
||||
#, java-format
|
||||
msgid "Invalid URL: Must start with \"{0}\" or \"{1}\""
|
||||
msgstr ""
|
||||
msgstr "无效的 URL:必须以“{0}”或“{1}”开头。"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1195
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1230
|
||||
@@ -863,7 +864,7 @@ msgstr "Magnet 已删除:{0}"
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1243
|
||||
#, java-format
|
||||
msgid "Torrent file could not be deleted: {0}"
|
||||
msgstr ""
|
||||
msgstr "无法删除种子文件:{0}"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1228
|
||||
#, java-format
|
||||
@@ -1024,7 +1025,7 @@ msgstr "正做种"
|
||||
#, java-format
|
||||
msgid "Seeding to {0} peer"
|
||||
msgid_plural "Seeding to {0} peers"
|
||||
msgstr[0] ""
|
||||
msgstr[0] "正在与用户{0}做种"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1731
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1747
|
||||
@@ -1050,13 +1051,13 @@ msgstr "正常"
|
||||
#, java-format
|
||||
msgid "Downloading from {0} peer"
|
||||
msgid_plural "Downloading from {0} peers"
|
||||
msgstr[0] ""
|
||||
msgstr[0] "正在从节点{0}下载"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1763
|
||||
#, java-format
|
||||
msgid "Connected to {0} peer"
|
||||
msgid_plural "Connected to {0} peers"
|
||||
msgstr[0] ""
|
||||
msgstr[0] "已连接到节点{0}"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1763
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1764
|
||||
@@ -1142,7 +1143,7 @@ msgstr "移除"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1978
|
||||
msgid "Delete the .torrent file and the associated data files"
|
||||
msgstr ""
|
||||
msgstr "删除种子及所下载的文件"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1982
|
||||
msgid "Delete"
|
||||
@@ -1150,7 +1151,7 @@ msgstr "删除"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1998
|
||||
msgid "Peer attached to swarm"
|
||||
msgstr ""
|
||||
msgstr "附属于集群的节点"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2028
|
||||
msgid "Unknown"
|
||||
@@ -1200,7 +1201,7 @@ msgstr "从URL"
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2315
|
||||
msgid ""
|
||||
"Enter the torrent file download URL (I2P only), magnet link, or info hash"
|
||||
msgstr ""
|
||||
msgstr "输入种子文件的下载链接(仅支持 I2P ),magnet 链接,或信息散列值"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2320
|
||||
msgid "Add torrent"
|
||||
@@ -1286,7 +1287,7 @@ msgstr "数据文件夹"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2443
|
||||
msgid "Directory where torrents and downloaded/shared files are stored"
|
||||
msgstr ""
|
||||
msgstr " 种子和下载/分享的文件存储目录"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2448
|
||||
msgid "Files readable by all"
|
||||
@@ -1296,7 +1297,7 @@ msgstr "文件对所有人可读"
|
||||
msgid ""
|
||||
"Set file permissions to allow other local users to access the downloaded "
|
||||
"files"
|
||||
msgstr ""
|
||||
msgstr "给其他本地用户设置文件权限使其能够访问已下载文件"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2456
|
||||
msgid "Auto start torrents"
|
||||
@@ -1306,7 +1307,7 @@ msgstr "自动开始种子"
|
||||
msgid ""
|
||||
"Automatically start torrents when added and restart torrents when I2PSnark "
|
||||
"starts"
|
||||
msgstr ""
|
||||
msgstr "当种子被添加时自动启动并且在 I2PSnark 启动时自动重启种子"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2464
|
||||
msgid "Smart torrent sorting"
|
||||
@@ -1314,21 +1315,21 @@ msgstr "智能种子排序"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2468
|
||||
msgid "Ignore words such as 'a' and 'the' when sorting"
|
||||
msgstr ""
|
||||
msgstr "排序时忽略诸如 ‘a’ 和 ‘the’ 的单词"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2472
|
||||
msgid "Collapsible panels"
|
||||
msgstr ""
|
||||
msgstr "可折叠面板"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2477
|
||||
msgid "Your browser does not support this feature."
|
||||
msgstr ""
|
||||
msgstr "您的浏览器不支持这个功能。"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2480
|
||||
msgid ""
|
||||
"Allow the 'Add Torrent' and 'Create Torrent' panels to be collapsed, and "
|
||||
"collapse by default in non-embedded mode"
|
||||
msgstr ""
|
||||
msgstr "允许‘添加种子’和‘创建种子’面板被折叠,并且在非嵌入模式下默认折叠。"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2492
|
||||
msgid "Language"
|
||||
@@ -1340,11 +1341,11 @@ msgstr "主题"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2507
|
||||
msgid "To change themes manually, disable universal theming"
|
||||
msgstr ""
|
||||
msgstr "要手动更改主题,请禁用通用主题"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2511
|
||||
msgid "Universal theming is enabled."
|
||||
msgstr ""
|
||||
msgstr "通用主题已开启。"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2513
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2619
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,6 +1,8 @@
|
||||
To run i2psnark's standalone mode make sure you have an i2p router running in the background, then run:
|
||||
|
||||
java -jar i2psnark.jar
|
||||
launch-i2psnark
|
||||
or
|
||||
launch-i2psnark.bat (Windows)
|
||||
|
||||
I2PSnark web ui will be at http://127.0.0.1:8002/i2psnark/
|
||||
|
||||
|
||||
35
apps/i2psnark/resources/js/configui.js
Normal file
35
apps/i2psnark/resources/js/configui.js
Normal file
@@ -0,0 +1,35 @@
|
||||
/* @license http://creativecommons.org/publicdomain/zero/1.0/legalcode CC0-1.0 */
|
||||
|
||||
// This component is dedicated to the public domain. It uses the CC0
|
||||
// as a formal dedication to the public domain and in circumstances where
|
||||
// a public domain is not usable.
|
||||
|
||||
var oldTheme = "ubergine";
|
||||
var change = false;
|
||||
|
||||
function swapStyleSheet(theme) {
|
||||
// https://stackoverflow.com/questions/14292997/changing-style-sheet-javascript
|
||||
document.getElementById("pagestyle").setAttribute("href", "/i2psnark/.resources/themes/" + theme + "/snark.css");
|
||||
}
|
||||
|
||||
function initThemeSwitcher() {
|
||||
var theme = document.getElementById("theme");
|
||||
if (theme == null) {
|
||||
return;
|
||||
}
|
||||
oldtheme = theme.value;
|
||||
theme.onclick = function() {
|
||||
if (change) {
|
||||
swapStyleSheet(theme.value);
|
||||
} else {
|
||||
// skip the first click to avoid the flash
|
||||
change = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
document.addEventListener("DOMContentLoaded", function() {
|
||||
initThemeSwitcher();
|
||||
}, true);
|
||||
|
||||
/* @license-end */
|
||||
@@ -2264,7 +2264,7 @@ hr.debug:last-child {
|
||||
}
|
||||
|
||||
.accept {
|
||||
background: url(/i2psnark/.resources/icons/solid/yes.png) left 6px center no-repeat !important;
|
||||
background: url(/i2psnark/.resources/icons/solid/tick.png) left 6px center no-repeat !important;
|
||||
background-size: 12px 12px !important;
|
||||
}
|
||||
|
||||
|
||||
@@ -1968,7 +1968,7 @@ hr.debug:last-child {
|
||||
}
|
||||
|
||||
.accept {
|
||||
background: url(/i2psnark/.resources/icons/solid/yes.png) left 6px center no-repeat;
|
||||
background: url(/i2psnark/.resources/icons/solid/tick.png) left 6px center no-repeat;
|
||||
background-size: 12px 12px;
|
||||
}
|
||||
|
||||
|
||||
@@ -38,6 +38,7 @@ import net.i2p.data.Destination;
|
||||
import net.i2p.data.Hash;
|
||||
import net.i2p.i2ptunnel.localServer.LocalHTTPServer;
|
||||
import net.i2p.util.ConvertToHash;
|
||||
import net.i2p.util.DNSOverHTTPS;
|
||||
import net.i2p.util.EventDispatcher;
|
||||
import net.i2p.util.Log;
|
||||
import net.i2p.util.PortMapper;
|
||||
@@ -92,7 +93,7 @@ public class I2PTunnelHTTPClient extends I2PTunnelHTTPClientBase implements Runn
|
||||
"\r\n";
|
||||
// ESR version of Firefox, same as Tor Browser
|
||||
private static final String UA_CLEARNET = "User-Agent: " +
|
||||
"Mozilla/5.0 (Windows NT 10.0; rv:78.0) Gecko/20100101 Firefox/78.0" +
|
||||
DNSOverHTTPS.UA_CLEARNET +
|
||||
"\r\n";
|
||||
// overrides
|
||||
private static final String PROP_UA_I2P = "httpclient.userAgent.i2p";
|
||||
|
||||
@@ -233,7 +233,7 @@ public class I2PTunnelServer extends I2PTunnelTask implements Runnable {
|
||||
try {
|
||||
_filter = FilterFactory.createFilter(context, filterDefinition);
|
||||
} catch (IOException | InvalidDefinitionException bad) {
|
||||
throw new IllegalArgumentException("Can't create socket manager "+bad.getMessage(), bad);
|
||||
throw new IllegalArgumentException("Bad filter definition file: " + bad.getMessage(), bad);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -667,6 +667,7 @@ public class I2PTunnelServer extends I2PTunnelTask implements Runnable {
|
||||
} catch (InterruptedException ie) {}
|
||||
// This should be the same as before, but we have to call getServerSocket()
|
||||
// so sockMgr will call ConnectionManager.setAllowIncomingConnections(true) again
|
||||
_log.logAlways(Log.WARN, "Reconnecting to router after restart");
|
||||
i2pss = sockMgr.getServerSocket();
|
||||
} catch (I2PException ipe) {
|
||||
String s = "Error accepting - KILLING THE TUNNEL SERVER";
|
||||
|
||||
@@ -11,8 +11,8 @@ msgstr ""
|
||||
"Project-Id-Version: I2P\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2021-02-05 14:31+0000\n"
|
||||
"PO-Revision-Date: 2021-02-05 15:27+0000\n"
|
||||
"Last-Translator: kytv <killyourtv@i2pmail.org>\n"
|
||||
"PO-Revision-Date: 2013-07-20 14:50+0000\n"
|
||||
"Last-Translator: Allan Nordhøy <epost@anotheragency.no>, 2017\n"
|
||||
"Language-Team: Norwegian Bokmål (http://www.transifex.com/otf/I2P/language/nb/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
@@ -588,7 +588,7 @@ msgstr "Opprett"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1525
|
||||
msgid "Encryption key"
|
||||
msgstr ""
|
||||
msgstr "Krypteringsnøkkel"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1526
|
||||
msgid ""
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
# kgtm <fabio.h.f.antunes@gmail.com>, 2014
|
||||
# hxdcmls, 2013
|
||||
# hxdcmls, 2013
|
||||
# Manuela Silva <manuelarodsilva@gmail.com>, 2017
|
||||
# Manuela Silva <mmsrs@sky.com>, 2017
|
||||
# rafaelbf, 2013
|
||||
# tuliouel, 2013
|
||||
# wicked, 2012
|
||||
@@ -17,8 +17,8 @@ msgstr ""
|
||||
"Project-Id-Version: I2P\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2021-02-05 14:31+0000\n"
|
||||
"PO-Revision-Date: 2021-02-05 15:27+0000\n"
|
||||
"Last-Translator: e8f1a29f7bd45d2490d729ad149fc504_6eadd8e\n"
|
||||
"PO-Revision-Date: 2013-07-20 14:50+0000\n"
|
||||
"Last-Translator: Manuela Silva <mmsrs@sky.com>, 2017\n"
|
||||
"Language-Team: Portuguese (http://www.transifex.com/otf/I2P/language/pt/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
@@ -144,7 +144,7 @@ msgstr ""
|
||||
#: ../java/build/Proxy.java:24
|
||||
msgid ""
|
||||
"The outproxy is probably down, but there could also be network congestion."
|
||||
msgstr ""
|
||||
msgstr "O proxy de saída está provavelmente fora do ar, mas pode ser também congestionamento na rede."
|
||||
|
||||
#: ../java/build/Proxy.java:25 ../java/build/Proxy.java:169
|
||||
#: ../java/build/Proxy.java:194 ../java/build/Proxy.java:215
|
||||
@@ -213,7 +213,7 @@ msgstr ""
|
||||
#: ../java/build/Proxy.java:57
|
||||
msgid ""
|
||||
"The website is probably down, but there could also be network congestion."
|
||||
msgstr ""
|
||||
msgstr "O website está provavelmente fora do ar, mas pode ser também congestionamento na rede."
|
||||
|
||||
#: ../java/build/Proxy.java:60 ../java/build/Proxy.java:66
|
||||
msgid "Warning: Invalid Request URI"
|
||||
@@ -249,15 +249,15 @@ msgstr "Não utilize o proxy para aceder à consola do roteador, anfitrião loca
|
||||
|
||||
#: ../java/build/Proxy.java:78
|
||||
msgid "Website Unknown"
|
||||
msgstr ""
|
||||
msgstr "Site Desconhecido"
|
||||
|
||||
#: ../java/build/Proxy.java:84
|
||||
msgid "Website Not Found in Addressbook"
|
||||
msgstr ""
|
||||
msgstr "Website Não Encontrado no Livro de endereços"
|
||||
|
||||
#: ../java/build/Proxy.java:85
|
||||
msgid "The website was not found in your router's addressbook."
|
||||
msgstr ""
|
||||
msgstr "O website não foi encontrado no livro de endereços do seu roteador."
|
||||
|
||||
#: ../java/build/Proxy.java:86
|
||||
msgid "Check the link or find a Base 32 or Base 64 address."
|
||||
@@ -289,7 +289,7 @@ msgstr ""
|
||||
|
||||
#: ../java/build/Proxy.java:99 ../java/build/Proxy.java:217
|
||||
msgid "Could not connect to the following destination:"
|
||||
msgstr ""
|
||||
msgstr "Não foi possível se conectar ao seguinte destino:"
|
||||
|
||||
#: ../java/build/Proxy.java:100 ../java/build/Proxy.java:106
|
||||
#: ../java/build/Proxy.java:185 ../java/build/Proxy.java:191
|
||||
@@ -298,13 +298,13 @@ msgstr ""
|
||||
|
||||
#: ../java/build/Proxy.java:107
|
||||
msgid "The connection to the website was reset while the page was loading."
|
||||
msgstr ""
|
||||
msgstr "A conexão ao website foi resetada enquanto a página carregava."
|
||||
|
||||
#: ../java/build/Proxy.java:108
|
||||
msgid ""
|
||||
"The website could be temporarily unavailable, too busy, or it has blocked "
|
||||
"your access."
|
||||
msgstr ""
|
||||
msgstr "O site pode estar temporariamente indisponível, sobrecarregado ou bloqueando o seu acesso."
|
||||
|
||||
#: ../java/build/Proxy.java:117
|
||||
msgid "Warning: Authorization Required"
|
||||
@@ -314,7 +314,7 @@ msgstr ""
|
||||
msgid ""
|
||||
"The website destination specified was not valid, or was otherwise "
|
||||
"unreachable."
|
||||
msgstr ""
|
||||
msgstr "O destino de website especificado não era válido ou era inatingível."
|
||||
|
||||
#: ../java/build/Proxy.java:127
|
||||
msgid ""
|
||||
@@ -348,7 +348,7 @@ msgstr "Aviso: Conflito entre ligações de ajudante de endereço"
|
||||
msgid ""
|
||||
"The address helper link you followed specifies a different destination key "
|
||||
"than the entry in your address book."
|
||||
msgstr ""
|
||||
msgstr "O linque do auxiliar de endereço que você seguiu especifica uma chave de destino diferente da que consta na entrada do seu livro de endereços."
|
||||
|
||||
#: ../java/build/Proxy.java:148
|
||||
msgid ""
|
||||
@@ -430,13 +430,13 @@ msgstr "Para desabilitar a autorização, remova a configuração {0}i2ptunnel.p
|
||||
|
||||
#: ../java/build/Proxy.java:192
|
||||
msgid "The connection to the proxy was reset."
|
||||
msgstr ""
|
||||
msgstr "A conexão com o proxy foi resetada."
|
||||
|
||||
#: ../java/build/Proxy.java:193
|
||||
msgid ""
|
||||
"The proxy could be temporarily unavailable, too busy, or it has blocked your"
|
||||
" access."
|
||||
msgstr ""
|
||||
msgstr "O proxy pode estar temporariamente indisponível, sobrecarregado ou bloqueando o seu acesso."
|
||||
|
||||
#: ../java/build/Proxy.java:197 ../java/build/Proxy.java:203
|
||||
msgid "Warning: Non-HTTP Protocol"
|
||||
@@ -448,15 +448,15 @@ msgstr "O pedido usa um protocolo ruim."
|
||||
|
||||
#: ../java/build/Proxy.java:205
|
||||
msgid "The I2P HTTP Proxy supports HTTP and HTTPS requests only."
|
||||
msgstr ""
|
||||
msgstr "O proxy HTTP I2P suporta apenas requisições HTTP e HTTPS."
|
||||
|
||||
#: ../java/build/Proxy.java:206
|
||||
msgid "Other protocols such as FTP are not allowed."
|
||||
msgstr ""
|
||||
msgstr "Outros protocolos como FTP não são permitidos."
|
||||
|
||||
#: ../java/build/Proxy.java:207 ../java/build/Proxy.java:213
|
||||
msgid "Outproxy Unreachable"
|
||||
msgstr ""
|
||||
msgstr "Proxy de saída inalcançável"
|
||||
|
||||
#: ../java/build/Proxy.java:214
|
||||
msgid ""
|
||||
@@ -495,7 +495,7 @@ msgstr ""
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1304
|
||||
msgid "Destination lease set not found"
|
||||
msgstr ""
|
||||
msgstr "Conjunto de locação de destino não encontrado"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1437
|
||||
msgid "Host"
|
||||
@@ -528,7 +528,7 @@ msgstr ""
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1460
|
||||
#, java-format
|
||||
msgid "Save {0} to router address book and continue to website"
|
||||
msgstr ""
|
||||
msgstr "Salvar {0} no livro de endereços do roteador e continuar no website."
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1461
|
||||
msgid ""
|
||||
@@ -594,7 +594,7 @@ msgstr "Gerar"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1525
|
||||
msgid "Encryption key"
|
||||
msgstr ""
|
||||
msgstr "Chave de Criptografia"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1526
|
||||
msgid ""
|
||||
|
||||
@@ -4,16 +4,16 @@
|
||||
# To contribute translations, see http://www.i2p2.de/newdevelopers
|
||||
#
|
||||
# Translators:
|
||||
# blueboy, 2013
|
||||
# blueboy, 2015,2017
|
||||
# blueboy, 2013-2014
|
||||
# L., 2013
|
||||
# L., 2015,2017
|
||||
# L., 2013-2014
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: I2P\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2021-02-05 14:31+0000\n"
|
||||
"PO-Revision-Date: 2021-02-09 18:15+0000\n"
|
||||
"Last-Translator: Eduardo Rodrigues\n"
|
||||
"PO-Revision-Date: 2013-07-20 14:50+0000\n"
|
||||
"Last-Translator: L., 2015,2017\n"
|
||||
"Language-Team: Portuguese (Brazil) (http://www.transifex.com/otf/I2P/language/pt_BR/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
@@ -147,7 +147,7 @@ msgstr "O proxy de saída está provavelmente fora do ar, mas pode ser também c
|
||||
msgid ""
|
||||
"You may want to {0}retry{1} as this will randomly reselect an outproxy from "
|
||||
"the pool you have defined {2}here{3} (if you have more than one configured)."
|
||||
msgstr ""
|
||||
msgstr "Talvez queiras {0}tentar novamente{1}, o que irá selecionar aleatoriamente um intermediador externo a rede I2P da lista que definiste {2}aqui{3} (Se tens mais de um configurado)."
|
||||
|
||||
#: ../java/build/Proxy.java:26 ../java/build/Proxy.java:170
|
||||
#: ../java/build/Proxy.java:195 ../java/build/Proxy.java:216
|
||||
@@ -274,7 +274,7 @@ msgstr "Noutro caso, procure um endereço Base 32 ou um linque de auxiliar de en
|
||||
msgid ""
|
||||
"Seeing this page often? See {0}the FAQ{1} for help in {2}adding some "
|
||||
"subscriptions{3} to your addressbook."
|
||||
msgstr ""
|
||||
msgstr "Estar a ver esta página frequentemente? Veja as {0}perguntas frequentes{1} para ajuda em {2}incluindo novos registros{3} em teu livro de endereços."
|
||||
|
||||
#: ../java/build/Proxy.java:98
|
||||
msgid ""
|
||||
@@ -315,7 +315,7 @@ msgstr "O destino de website especificado não era válido ou era inatingível."
|
||||
msgid ""
|
||||
"Perhaps you pasted in the wrong Base 64 string or the link you are following"
|
||||
" is bad."
|
||||
msgstr ""
|
||||
msgstr "Talvez colaste uma cadeia de caracteres na base 64 errada ou a ligação que seguiste não serve."
|
||||
|
||||
#: ../java/build/Proxy.java:128
|
||||
msgid "The I2P host could also be offline."
|
||||
@@ -365,7 +365,7 @@ msgstr "Aviso: Auxiliar de endereço ruim"
|
||||
#: ../java/build/Proxy.java:157
|
||||
#, java-format
|
||||
msgid "The helper key in the URL ({0}i2paddresshelper={1}) is not resolvable."
|
||||
msgstr ""
|
||||
msgstr "A palavra ajudante na URL({0}i2paddresshelper={1}) não é traduzível."
|
||||
|
||||
#: ../java/build/Proxy.java:158
|
||||
msgid "It seems to be garbage data, or a mistyped Base 32 address."
|
||||
@@ -508,7 +508,7 @@ msgstr "Destino"
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1451
|
||||
#, java-format
|
||||
msgid "Continue to {0} without saving"
|
||||
msgstr ""
|
||||
msgstr "Continuar para {0} sem salvar"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1452
|
||||
msgid ""
|
||||
|
||||
@@ -18,8 +18,8 @@ msgstr ""
|
||||
"Project-Id-Version: I2P\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2021-02-05 14:31+0000\n"
|
||||
"PO-Revision-Date: 2022-01-14 17:57+0000\n"
|
||||
"Last-Translator: Jonatan Nyberg <jonatan@autistici.org>\n"
|
||||
"PO-Revision-Date: 2013-07-20 14:50+0000\n"
|
||||
"Last-Translator: Jonatan Nyberg <jonatan@autistici.org>, 2016-2017,2021-2022\n"
|
||||
"Language-Team: Swedish (Sweden) (http://www.transifex.com/otf/I2P/language/sv_SE/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
@@ -339,7 +339,7 @@ msgstr "Din förfrågan gällde en webbplats utanför I2P, men du har ingen HTTP
|
||||
|
||||
#: ../java/build/Proxy.java:139
|
||||
msgid "Please configure an outproxy in I2PTunnel."
|
||||
msgstr "Vänligen ställ in en utproxy i I2PTunnel."
|
||||
msgstr "Ställ in en utproxy i I2PTunnel."
|
||||
|
||||
#: ../java/build/Proxy.java:140 ../java/build/Proxy.java:146
|
||||
msgid "Warning: Destination Key Conflict"
|
||||
@@ -419,7 +419,7 @@ msgstr "Denna proxy är inställd till att kräva användarnamn och lösenord f
|
||||
msgid ""
|
||||
"Please enter your username and password, or check your {0}router "
|
||||
"configuration{1} or {2}I2PTunnel configuration{3}."
|
||||
msgstr "Vänligen ange ditt användarnamn och lösenord eller kontrollera din {0}router-konfiguration{1} eller {2}I2PTunnel-konfiguration{3}."
|
||||
msgstr "Ange ditt användarnamn och lösenord eller kontrollera din {0}router-konfiguration{1} eller {2}I2PTunnel-konfiguration{3}."
|
||||
|
||||
#: ../java/build/Proxy.java:184
|
||||
#, java-format
|
||||
@@ -595,7 +595,7 @@ msgstr "Generera"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1525
|
||||
msgid "Encryption key"
|
||||
msgstr ""
|
||||
msgstr "Krypteringsnyckel"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1526
|
||||
msgid ""
|
||||
|
||||
@@ -12,8 +12,8 @@ msgstr ""
|
||||
"Project-Id-Version: I2P\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2021-02-05 14:31+0000\n"
|
||||
"PO-Revision-Date: 2022-02-03 06:12+0000\n"
|
||||
"Last-Translator: Kaya Zeren <kayazeren@gmail.com>\n"
|
||||
"PO-Revision-Date: 2013-07-20 14:50+0000\n"
|
||||
"Last-Translator: Kaya Zeren <kayazeren@gmail.com>, 2016-2022\n"
|
||||
"Language-Team: Turkish (Turkey) (http://www.transifex.com/otf/I2P/language/tr_TR/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
@@ -55,7 +55,7 @@ msgstr "Yöneltici Panosu"
|
||||
#: ../java/build/Proxy.java:174 ../java/build/Proxy.java:187
|
||||
#: ../java/build/Proxy.java:199 ../java/build/Proxy.java:209
|
||||
msgid "I2P Router Console"
|
||||
msgstr "I2P Yöneltici Panosu"
|
||||
msgstr "I2P yöneltici panosu"
|
||||
|
||||
#: ../java/build/Proxy.java:8 ../java/build/Proxy.java:19
|
||||
#: ../java/build/Proxy.java:31 ../java/build/Proxy.java:43
|
||||
|
||||
@@ -16,8 +16,8 @@ msgstr ""
|
||||
"Project-Id-Version: I2P\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2021-02-05 14:31+0000\n"
|
||||
"PO-Revision-Date: 2021-02-05 15:27+0000\n"
|
||||
"Last-Translator: LinuxChata\n"
|
||||
"PO-Revision-Date: 2013-07-20 14:50+0000\n"
|
||||
"Last-Translator: Greg Koval <gregjsmith@gmx.com>, 2020\n"
|
||||
"Language-Team: Ukrainian (Ukraine) (http://www.transifex.com/otf/I2P/language/uk_UA/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
@@ -593,7 +593,7 @@ msgstr "Згенерувати"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1525
|
||||
msgid "Encryption key"
|
||||
msgstr ""
|
||||
msgstr "Ключ шифрування"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1526
|
||||
msgid ""
|
||||
|
||||
700
apps/i2ptunnel/locale-proxy/messages_zh_TW.po
Normal file
700
apps/i2ptunnel/locale-proxy/messages_zh_TW.po
Normal file
@@ -0,0 +1,700 @@
|
||||
# I2P
|
||||
# Copyright (C) 2009 The I2P Project
|
||||
# This file is distributed under the same license as the i2ptunnel package.
|
||||
# To contribute translations, see http://www.i2p2.de/newdevelopers
|
||||
#
|
||||
# Translators:
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: I2P\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2021-02-05 14:31+0000\n"
|
||||
"PO-Revision-Date: 2013-07-20 14:50+0000\n"
|
||||
"Last-Translator: duck <duck@mail.i2p>\n"
|
||||
"Language-Team: Chinese (Taiwan) (http://www.transifex.com/otf/I2P/language/zh_TW/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Language: zh_TW\n"
|
||||
"Plural-Forms: nplurals=1; plural=0;\n"
|
||||
|
||||
#: ../java/build/Proxy.java:5 ../java/build/Proxy.java:11
|
||||
#: ../java/build/Proxy.java:40 ../java/build/Proxy.java:49
|
||||
#: ../java/build/Proxy.java:55 ../java/build/Proxy.java:91
|
||||
#: ../java/build/Proxy.java:97 ../java/build/Proxy.java:111
|
||||
msgid "Website Unreachable"
|
||||
msgstr "网站不可达"
|
||||
|
||||
#: ../java/build/Proxy.java:6 ../java/build/Proxy.java:17
|
||||
#: ../java/build/Proxy.java:29 ../java/build/Proxy.java:41
|
||||
#: ../java/build/Proxy.java:50 ../java/build/Proxy.java:61
|
||||
#: ../java/build/Proxy.java:70 ../java/build/Proxy.java:79
|
||||
#: ../java/build/Proxy.java:92 ../java/build/Proxy.java:101
|
||||
#: ../java/build/Proxy.java:112 ../java/build/Proxy.java:120
|
||||
#: ../java/build/Proxy.java:132 ../java/build/Proxy.java:141
|
||||
#: ../java/build/Proxy.java:151 ../java/build/Proxy.java:161
|
||||
#: ../java/build/Proxy.java:173 ../java/build/Proxy.java:186
|
||||
#: ../java/build/Proxy.java:198 ../java/build/Proxy.java:208
|
||||
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:294
|
||||
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:368
|
||||
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:402
|
||||
msgid "Router Console"
|
||||
msgstr "路由控制檯"
|
||||
|
||||
#: ../java/build/Proxy.java:7 ../java/build/Proxy.java:18
|
||||
#: ../java/build/Proxy.java:30 ../java/build/Proxy.java:42
|
||||
#: ../java/build/Proxy.java:51 ../java/build/Proxy.java:62
|
||||
#: ../java/build/Proxy.java:71 ../java/build/Proxy.java:80
|
||||
#: ../java/build/Proxy.java:93 ../java/build/Proxy.java:102
|
||||
#: ../java/build/Proxy.java:113 ../java/build/Proxy.java:121
|
||||
#: ../java/build/Proxy.java:133 ../java/build/Proxy.java:142
|
||||
#: ../java/build/Proxy.java:152 ../java/build/Proxy.java:162
|
||||
#: ../java/build/Proxy.java:174 ../java/build/Proxy.java:187
|
||||
#: ../java/build/Proxy.java:199 ../java/build/Proxy.java:209
|
||||
msgid "I2P Router Console"
|
||||
msgstr "I2P 路由控制檯"
|
||||
|
||||
#: ../java/build/Proxy.java:8 ../java/build/Proxy.java:19
|
||||
#: ../java/build/Proxy.java:31 ../java/build/Proxy.java:43
|
||||
#: ../java/build/Proxy.java:52 ../java/build/Proxy.java:63
|
||||
#: ../java/build/Proxy.java:72 ../java/build/Proxy.java:81
|
||||
#: ../java/build/Proxy.java:94 ../java/build/Proxy.java:103
|
||||
#: ../java/build/Proxy.java:114 ../java/build/Proxy.java:122
|
||||
#: ../java/build/Proxy.java:134 ../java/build/Proxy.java:143
|
||||
#: ../java/build/Proxy.java:153 ../java/build/Proxy.java:163
|
||||
#: ../java/build/Proxy.java:175 ../java/build/Proxy.java:188
|
||||
#: ../java/build/Proxy.java:200 ../java/build/Proxy.java:210
|
||||
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:297
|
||||
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:369
|
||||
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:403
|
||||
msgid "Configuration"
|
||||
msgstr "設定"
|
||||
|
||||
#: ../java/build/Proxy.java:9 ../java/build/Proxy.java:20
|
||||
#: ../java/build/Proxy.java:32 ../java/build/Proxy.java:44
|
||||
#: ../java/build/Proxy.java:53 ../java/build/Proxy.java:64
|
||||
#: ../java/build/Proxy.java:73 ../java/build/Proxy.java:82
|
||||
#: ../java/build/Proxy.java:95 ../java/build/Proxy.java:104
|
||||
#: ../java/build/Proxy.java:115 ../java/build/Proxy.java:123
|
||||
#: ../java/build/Proxy.java:135 ../java/build/Proxy.java:144
|
||||
#: ../java/build/Proxy.java:154 ../java/build/Proxy.java:164
|
||||
#: ../java/build/Proxy.java:176 ../java/build/Proxy.java:189
|
||||
#: ../java/build/Proxy.java:201 ../java/build/Proxy.java:211
|
||||
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:298
|
||||
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:369
|
||||
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:403
|
||||
msgid "Help"
|
||||
msgstr "幫助"
|
||||
|
||||
#: ../java/build/Proxy.java:10 ../java/build/Proxy.java:21
|
||||
#: ../java/build/Proxy.java:33 ../java/build/Proxy.java:45
|
||||
#: ../java/build/Proxy.java:54 ../java/build/Proxy.java:65
|
||||
#: ../java/build/Proxy.java:74 ../java/build/Proxy.java:83
|
||||
#: ../java/build/Proxy.java:96 ../java/build/Proxy.java:105
|
||||
#: ../java/build/Proxy.java:116 ../java/build/Proxy.java:124
|
||||
#: ../java/build/Proxy.java:136 ../java/build/Proxy.java:145
|
||||
#: ../java/build/Proxy.java:155 ../java/build/Proxy.java:165
|
||||
#: ../java/build/Proxy.java:177 ../java/build/Proxy.java:190
|
||||
#: ../java/build/Proxy.java:202 ../java/build/Proxy.java:212
|
||||
msgid "Addressbook"
|
||||
msgstr "地址簿"
|
||||
|
||||
#: ../java/build/Proxy.java:12
|
||||
msgid "The website was not reachable."
|
||||
msgstr "该网站不可达。"
|
||||
|
||||
#: ../java/build/Proxy.java:13
|
||||
msgid ""
|
||||
"The website is offline, there is network congestion, or your router is not "
|
||||
"yet well-integrated with peers."
|
||||
msgstr "该网站已离线,可能由于网络拥堵,或者您的路由器未良好的与网络整合。"
|
||||
|
||||
#: ../java/build/Proxy.java:14 ../java/build/Proxy.java:58
|
||||
#: ../java/build/Proxy.java:109 ../java/build/Proxy.java:129
|
||||
#, java-format
|
||||
msgid "You may want to {0}retry{1}."
|
||||
msgstr "您可能希望{0}重试{1}。"
|
||||
|
||||
#: ../java/build/Proxy.java:15 ../java/build/Proxy.java:27
|
||||
#: ../java/build/Proxy.java:48 ../java/build/Proxy.java:59
|
||||
#: ../java/build/Proxy.java:90 ../java/build/Proxy.java:110
|
||||
#: ../java/build/Proxy.java:118 ../java/build/Proxy.java:130
|
||||
#: ../java/build/Proxy.java:171 ../java/build/Proxy.java:196
|
||||
msgid "Could not find the following destination:"
|
||||
msgstr "未能找到下列目的地:"
|
||||
|
||||
#: ../java/build/Proxy.java:16 ../java/build/Proxy.java:22
|
||||
#: ../java/build/Proxy.java:160 ../java/build/Proxy.java:166
|
||||
msgid "Outproxy Not Found"
|
||||
msgstr "出口代理未找到"
|
||||
|
||||
#: ../java/build/Proxy.java:23
|
||||
msgid ""
|
||||
"The HTTP outproxy was not reachable, because its lease set was not found."
|
||||
msgstr "HTTP 出口代理不可达,因为找不到其租契。"
|
||||
|
||||
#: ../java/build/Proxy.java:24
|
||||
msgid ""
|
||||
"The outproxy is probably down, but there could also be network congestion."
|
||||
msgstr "出口代理可能已下线,但也可能是由于网络拥堵。"
|
||||
|
||||
#: ../java/build/Proxy.java:25 ../java/build/Proxy.java:169
|
||||
#: ../java/build/Proxy.java:194 ../java/build/Proxy.java:215
|
||||
#, java-format
|
||||
msgid ""
|
||||
"You may want to {0}retry{1} as this will randomly reselect an outproxy from "
|
||||
"the pool you have defined {2}here{3} (if you have more than one configured)."
|
||||
msgstr "您可能想要{0}重试{1}因为这将从您在{2}此处{3}定义的出口代理列表中随机选择一个进行连接(如果您设置了多个出口代理)。"
|
||||
|
||||
#: ../java/build/Proxy.java:26 ../java/build/Proxy.java:170
|
||||
#: ../java/build/Proxy.java:195 ../java/build/Proxy.java:216
|
||||
#, java-format
|
||||
msgid ""
|
||||
"If you continue to have trouble you may want to edit your outproxy list "
|
||||
"{0}here{1}."
|
||||
msgstr "如果问题持续存在,您可能需要{0}在此{1}编辑出口代理列表。"
|
||||
|
||||
#: ../java/build/Proxy.java:28
|
||||
msgid "Information: New Host Name"
|
||||
msgstr "信息:新站点地址"
|
||||
|
||||
#: ../java/build/Proxy.java:34
|
||||
msgid "Information: New Host Name with Address Helper"
|
||||
msgstr "信息:通过地址助手发现的新站点地址"
|
||||
|
||||
#: ../java/build/Proxy.java:35
|
||||
msgid ""
|
||||
"The address helper link you followed is for a new host name that is not in "
|
||||
"your address book."
|
||||
msgstr "您打开的地址助手链接指向了一个新站点,您的I2P地址簿中尚未收录。"
|
||||
|
||||
#: ../java/build/Proxy.java:36
|
||||
msgid "You may save this host name to your local address book."
|
||||
msgstr "您可以将此站点网址保存至您的本地地址簿中。"
|
||||
|
||||
#: ../java/build/Proxy.java:37
|
||||
msgid ""
|
||||
"If you save it to your address book, you will not see this message again."
|
||||
msgstr "在地址簿中保存后,此提示将不在显示。"
|
||||
|
||||
#: ../java/build/Proxy.java:38
|
||||
msgid ""
|
||||
"If you do not save it, the host name will be forgotten after the next router"
|
||||
" restart."
|
||||
msgstr "如果不保存,路由重启后,此站点地址将被遗忘。"
|
||||
|
||||
#: ../java/build/Proxy.java:39
|
||||
msgid ""
|
||||
"If you do not wish to visit this host, click the \"back\" button on your "
|
||||
"browser."
|
||||
msgstr "如果您不像访问此站点,请点击浏览器的“后退”按钮。"
|
||||
|
||||
#: ../java/build/Proxy.java:46 ../java/build/Proxy.java:119
|
||||
#: ../java/build/Proxy.java:125
|
||||
msgid "Warning: Invalid Destination"
|
||||
msgstr "警告:无效目标"
|
||||
|
||||
#: ../java/build/Proxy.java:47
|
||||
msgid "The Base32 address is invalid."
|
||||
msgstr "Base32 地址无效。"
|
||||
|
||||
#: ../java/build/Proxy.java:56
|
||||
msgid "The website was not reachable, because its lease set was not found."
|
||||
msgstr "该网站不可达,因为找不到其租契集。"
|
||||
|
||||
#: ../java/build/Proxy.java:57
|
||||
msgid ""
|
||||
"The website is probably down, but there could also be network congestion."
|
||||
msgstr "该网站可能已下线,但也可能是由于网络拥堵。"
|
||||
|
||||
#: ../java/build/Proxy.java:60 ../java/build/Proxy.java:66
|
||||
msgid "Warning: Invalid Request URI"
|
||||
msgstr "警告:请求的 URI 无效。"
|
||||
|
||||
#: ../java/build/Proxy.java:67
|
||||
msgid "The request URI is invalid, and probably contains illegal characters."
|
||||
msgstr "请求的 URI 无效或包含非法字符。"
|
||||
|
||||
#: ../java/build/Proxy.java:68
|
||||
msgid ""
|
||||
"If you clicked a link, check the end of the URI for any characters the "
|
||||
"browser has mistakenly added on."
|
||||
msgstr "如果您点击的是链接,请检查 URI 结尾是否有浏览器错误添加的多余字符。"
|
||||
|
||||
#: ../java/build/Proxy.java:69
|
||||
msgid "Error: Request Denied"
|
||||
msgstr "错误:请求被拒绝"
|
||||
|
||||
#: ../java/build/Proxy.java:75
|
||||
msgid "Error: Local Access"
|
||||
msgstr "错误:本地访问"
|
||||
|
||||
#: ../java/build/Proxy.java:76
|
||||
msgid "Your browser is misconfigured."
|
||||
msgstr "您的浏览器配置有误。"
|
||||
|
||||
#: ../java/build/Proxy.java:77
|
||||
msgid ""
|
||||
"Do not use the proxy to access the router console, localhost, or local LAN "
|
||||
"destinations."
|
||||
msgstr "请不要使用代理访问路由控制台,localhost 或局域网地址。"
|
||||
|
||||
#: ../java/build/Proxy.java:78
|
||||
msgid "Website Unknown"
|
||||
msgstr "网站未知"
|
||||
|
||||
#: ../java/build/Proxy.java:84
|
||||
msgid "Website Not Found in Addressbook"
|
||||
msgstr "未在地址簿中找到网站"
|
||||
|
||||
#: ../java/build/Proxy.java:85
|
||||
msgid "The website was not found in your router's addressbook."
|
||||
msgstr "未在您的地址簿中找到此网站。"
|
||||
|
||||
#: ../java/build/Proxy.java:86
|
||||
msgid "Check the link or find a Base 32 or Base 64 address."
|
||||
msgstr "请检查链接或找到其对应的 Base32 或 Base64 地址。"
|
||||
|
||||
#: ../java/build/Proxy.java:87
|
||||
#, java-format
|
||||
msgid "If you have the Base 64 address, {0}add it to your addressbook{1}."
|
||||
msgstr "如果您拥有 Base64 地址,请{0}将其添加至您的地址簿{1}。"
|
||||
|
||||
#: ../java/build/Proxy.java:88
|
||||
msgid ""
|
||||
"Otherwise, find a Base 32 or address helper link, or use a jump service link"
|
||||
" below."
|
||||
msgstr "否则,请找到其对应的 Base32 地址或地址助手链接,或使用下面列出的跳转服务之一。"
|
||||
|
||||
#: ../java/build/Proxy.java:89
|
||||
#, java-format
|
||||
msgid ""
|
||||
"Seeing this page often? See {0}the FAQ{1} for help in {2}adding some "
|
||||
"subscriptions{3} to your addressbook."
|
||||
msgstr "经常碰到此页面?请参见 {0}常见问题集 FAQ{1} 查看如何为您的地址簿 {2}添加订阅{3}。"
|
||||
|
||||
#: ../java/build/Proxy.java:98
|
||||
msgid ""
|
||||
"The website was not reachable, because it uses encryption options that are "
|
||||
"not supported by your I2P or Java version."
|
||||
msgstr "此网站不可达,因为您使用的 I2P 或者 Java 版本不支持它使用的加密选项。"
|
||||
|
||||
#: ../java/build/Proxy.java:99 ../java/build/Proxy.java:217
|
||||
msgid "Could not connect to the following destination:"
|
||||
msgstr "无法连接到以下目标:"
|
||||
|
||||
#: ../java/build/Proxy.java:100 ../java/build/Proxy.java:106
|
||||
#: ../java/build/Proxy.java:185 ../java/build/Proxy.java:191
|
||||
msgid "Connection Reset"
|
||||
msgstr "连接重置"
|
||||
|
||||
#: ../java/build/Proxy.java:107
|
||||
msgid "The connection to the website was reset while the page was loading."
|
||||
msgstr "载入页面时到该网站的连接被重置。"
|
||||
|
||||
#: ../java/build/Proxy.java:108
|
||||
msgid ""
|
||||
"The website could be temporarily unavailable, too busy, or it has blocked "
|
||||
"your access."
|
||||
msgstr "网站暂时不可用、太忙或者被屏蔽。"
|
||||
|
||||
#: ../java/build/Proxy.java:117
|
||||
msgid "Warning: Authorization Required"
|
||||
msgstr "警告:需要授权"
|
||||
|
||||
#: ../java/build/Proxy.java:126
|
||||
msgid ""
|
||||
"The website destination specified was not valid, or was otherwise "
|
||||
"unreachable."
|
||||
msgstr "指定的网站目标无效,或者不可达。"
|
||||
|
||||
#: ../java/build/Proxy.java:127
|
||||
msgid ""
|
||||
"Perhaps you pasted in the wrong Base 64 string or the link you are following"
|
||||
" is bad."
|
||||
msgstr "或许您粘贴的 Base64 字符串有误或您打开的链接有问题。"
|
||||
|
||||
#: ../java/build/Proxy.java:128
|
||||
msgid "The I2P host could also be offline."
|
||||
msgstr "也可能是 I2P 站点目前已下线。"
|
||||
|
||||
#: ../java/build/Proxy.java:131 ../java/build/Proxy.java:137
|
||||
msgid "Warning: No Outproxy Configured"
|
||||
msgstr "警告:没有配置出口代理"
|
||||
|
||||
#: ../java/build/Proxy.java:138
|
||||
msgid ""
|
||||
"Your request was for a site outside of I2P, but you have no HTTP outproxy "
|
||||
"configured."
|
||||
msgstr "请求的站点在 I2P 网络之外,但您没有配置 HTTP 出口代理。"
|
||||
|
||||
#: ../java/build/Proxy.java:139
|
||||
msgid "Please configure an outproxy in I2PTunnel."
|
||||
msgstr "请到 I2PTunnel 中配置出口代理。"
|
||||
|
||||
#: ../java/build/Proxy.java:140 ../java/build/Proxy.java:146
|
||||
msgid "Warning: Destination Key Conflict"
|
||||
msgstr "警告:目标密钥冲突"
|
||||
|
||||
#: ../java/build/Proxy.java:147
|
||||
msgid ""
|
||||
"The address helper link you followed specifies a different destination key "
|
||||
"than the entry in your address book."
|
||||
msgstr "您所打开的地址助手链接指定的目标密钥与您的地址簿中的记录不同。"
|
||||
|
||||
#: ../java/build/Proxy.java:148
|
||||
msgid ""
|
||||
"Someone could be trying to impersonate another website, or people have given"
|
||||
" two websites identical names."
|
||||
msgstr "有人可能在试图冒充另一个网站,或者人们给两个网站赋予了同一个名称。"
|
||||
|
||||
#: ../java/build/Proxy.java:149
|
||||
msgid ""
|
||||
"Resolve the conflict by deciding which key you trust, and then either ignore"
|
||||
" the address helper link, or delete the host entry from your address book "
|
||||
"and click the address helper link again."
|
||||
msgstr "决定您信任哪个密钥以解决冲突,然后要么忽略地址助手链接,要么在您的地址簿中删除该主机项,并再次点击该地址助手链接。"
|
||||
|
||||
#: ../java/build/Proxy.java:150 ../java/build/Proxy.java:156
|
||||
msgid "Warning: Bad Address Helper"
|
||||
msgstr "警告:无效地址助手"
|
||||
|
||||
#: ../java/build/Proxy.java:157
|
||||
#, java-format
|
||||
msgid "The helper key in the URL ({0}i2paddresshelper={1}) is not resolvable."
|
||||
msgstr "URL中的助手键值 ({0}i2paddresshelper={1}) 无法解析。"
|
||||
|
||||
#: ../java/build/Proxy.java:158
|
||||
msgid "It seems to be garbage data, or a mistyped Base 32 address."
|
||||
msgstr "它看起来可能是无效数据或输入有误的 Base32 地址。"
|
||||
|
||||
#: ../java/build/Proxy.java:159
|
||||
msgid ""
|
||||
"Check your URL to try and fix the helper key to be a valid Base 32 hostname "
|
||||
"or Base 64 key."
|
||||
msgstr "请检查您的链接尝试修复助手密钥为有效的 Base32 地址或 Base64 密钥。"
|
||||
|
||||
#: ../java/build/Proxy.java:167
|
||||
msgid "The HTTP Outproxy was not found."
|
||||
msgstr "未找到 HTTP 出口代理。"
|
||||
|
||||
#: ../java/build/Proxy.java:168
|
||||
msgid ""
|
||||
"It is offline, there is network congestion, or your router is not yet well-"
|
||||
"integrated with peers."
|
||||
msgstr "它已经下线,遇到网络拥堵,或您的路由尚未完全整合至 I2P 网络中。"
|
||||
|
||||
#: ../java/build/Proxy.java:172 ../java/build/Proxy.java:178
|
||||
msgid "Warning: Request Denied"
|
||||
msgstr "警告:请求被拒绝"
|
||||
|
||||
#: ../java/build/Proxy.java:179
|
||||
msgid "You attempted to connect to a non-I2P website or location."
|
||||
msgstr "您尝试连接的网站非 I2P 站点或位置。"
|
||||
|
||||
#: ../java/build/Proxy.java:180
|
||||
msgid "Proxy Authorization Required"
|
||||
msgstr "出口代理认证"
|
||||
|
||||
#: ../java/build/Proxy.java:181
|
||||
msgid "I2P HTTP Proxy Authorization Required"
|
||||
msgstr "出口代理认证"
|
||||
|
||||
#: ../java/build/Proxy.java:182
|
||||
msgid ""
|
||||
"This proxy is configured to require a username and password for access."
|
||||
msgstr "代理配置要求提供用户名和密码才能访问。"
|
||||
|
||||
#: ../java/build/Proxy.java:183
|
||||
#, java-format
|
||||
msgid ""
|
||||
"Please enter your username and password, or check your {0}router "
|
||||
"configuration{1} or {2}I2PTunnel configuration{3}."
|
||||
msgstr "请输入您的用户名和密码,否则请检查您的 {0} 路由配置 {1} 或 {2} I2PTunnel 配置 {3}。"
|
||||
|
||||
#: ../java/build/Proxy.java:184
|
||||
#, java-format
|
||||
msgid ""
|
||||
"To disable authorization, remove the configuration "
|
||||
"{0}i2ptunnel.proxy.auth=basic{1}, then stop and restart the HTTP Proxy "
|
||||
"tunnel."
|
||||
msgstr "要禁用身份认证,请删除配置 {0}i2ptunnel.proxy.auth=basic{1}, 然后停止并重启 HTTP Proxy 隧道。"
|
||||
|
||||
#: ../java/build/Proxy.java:192
|
||||
msgid "The connection to the proxy was reset."
|
||||
msgstr "到代理的连接被重置。"
|
||||
|
||||
#: ../java/build/Proxy.java:193
|
||||
msgid ""
|
||||
"The proxy could be temporarily unavailable, too busy, or it has blocked your"
|
||||
" access."
|
||||
msgstr "代理暂时不可用、太忙或者被屏蔽。"
|
||||
|
||||
#: ../java/build/Proxy.java:197 ../java/build/Proxy.java:203
|
||||
msgid "Warning: Non-HTTP Protocol"
|
||||
msgstr "警告:非 HTTP 协议"
|
||||
|
||||
#: ../java/build/Proxy.java:204
|
||||
msgid "The request uses a bad protocol."
|
||||
msgstr "请求使用了无效协议。"
|
||||
|
||||
#: ../java/build/Proxy.java:205
|
||||
msgid "The I2P HTTP Proxy supports HTTP and HTTPS requests only."
|
||||
msgstr "I2P HTTP 代理只支持 HTTP 和 HTTPS 请求。"
|
||||
|
||||
#: ../java/build/Proxy.java:206
|
||||
msgid "Other protocols such as FTP are not allowed."
|
||||
msgstr "其他协议例如FTP不被支持。"
|
||||
|
||||
#: ../java/build/Proxy.java:207 ../java/build/Proxy.java:213
|
||||
msgid "Outproxy Unreachable"
|
||||
msgstr "出口代理不可达"
|
||||
|
||||
#: ../java/build/Proxy.java:214
|
||||
msgid ""
|
||||
"The HTTP outproxy was not reachable, because it uses encryption options that"
|
||||
" are not supported by your I2P or Java version."
|
||||
msgstr "此 HTTP 出口代理不可达,因为您使用的 I2P 或者 Java 版本不支持它使用的加密选项。"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:692
|
||||
msgid "This seems to be a bad destination:"
|
||||
msgstr "目标似乎无效:"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:693
|
||||
msgid "i2paddresshelper cannot help you with a destination like that!"
|
||||
msgstr "i2p 地址助手对您输入的目标无能为力!"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:765
|
||||
#, java-format
|
||||
msgid ""
|
||||
"To visit the destination in your address book, click <a "
|
||||
"href=\"{0}\">here</a>. To visit the conflicting addresshelper destination, "
|
||||
"click <a href=\"{1}\">here</a>."
|
||||
msgstr "要访问您的地址簿中的该目标,请点击<a href=\"{0}\">这里</a>。要访问冲突的地址助手目标,点击<a href=\"{1}\">这里</a>。"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:774
|
||||
#, java-format
|
||||
msgid "Destination for {0} in address book"
|
||||
msgstr "地址簿中的 {0} 的目标"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:777
|
||||
msgid "Conflicting address helper destination"
|
||||
msgstr "确认地址助手目标"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1224
|
||||
msgid "Corrupt Base32 address"
|
||||
msgstr "损坏的 Base32 地址"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1304
|
||||
msgid "Destination lease set not found"
|
||||
msgstr "找不到目标租赁"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1437
|
||||
msgid "Host"
|
||||
msgstr "主機"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1441
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1502
|
||||
msgid "Base32"
|
||||
msgstr "Base32"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1445
|
||||
msgid "Destination"
|
||||
msgstr "目標"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1451
|
||||
#, java-format
|
||||
msgid "Continue to {0} without saving"
|
||||
msgstr "继续{0},而不保存"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1452
|
||||
msgid ""
|
||||
"You can browse to the site without saving it to the address book. The "
|
||||
"address will be remembered until you restart your I2P router."
|
||||
msgstr "您可以不将站点添加到地址簿而进行浏览。地址会被记录直到您重启您的I2P路由器。"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1453
|
||||
msgid "Continue without saving"
|
||||
msgstr "继续,而不保存"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1460
|
||||
#, java-format
|
||||
msgid "Save {0} to router address book and continue to website"
|
||||
msgstr "保存 {0} 到路由器地址簿并继续访问网站"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1461
|
||||
msgid ""
|
||||
"This address will be saved to your Router address book where your "
|
||||
"subscription-based addresses are stored."
|
||||
msgstr "本地址会被存储在您的路由器地址簿,您基于订阅的地址所存储的地方。"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1463
|
||||
msgid ""
|
||||
"If you want to keep track of sites you have added manually, add to your "
|
||||
"Local or Private address book instead."
|
||||
msgstr "如果您希望追踪您手动添加的站点,请将其添加到本地或私有地址簿。"
|
||||
|
||||
#. FIXME wasn't escaped
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1466
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1548
|
||||
msgid "Save & continue"
|
||||
msgstr "保存并继续"
|
||||
|
||||
#. only blockfile supports multiple books
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1473
|
||||
#, java-format
|
||||
msgid "Save {0} to local address book and continue to website"
|
||||
msgstr "保存 {0} 到路由器地址簿并继续访问网站"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1474
|
||||
msgid ""
|
||||
"This address will be saved to your Local address book. Select this option "
|
||||
"for addresses you wish to keep separate from the main router address book, "
|
||||
"but don't mind publishing."
|
||||
msgstr "该地址会被保存到你的本地地址簿。如果您希望与主路由器地址簿分开存储,但不介意发布的话,请选择此选项。"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1478
|
||||
#, java-format
|
||||
msgid "Save {0} to private address book and continue to website"
|
||||
msgstr "保存 {0} 到私有地址簿并继续访问网站"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1479
|
||||
msgid ""
|
||||
"This address will be saved to your Private address book, ensuring it is "
|
||||
"never published."
|
||||
msgstr "本地址会被存储到您的私有地址簿,以保证其永不被发布。"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1507
|
||||
msgid "Base32 address requires lookup password"
|
||||
msgstr "Base32地址需要查找密码"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1509
|
||||
msgid "Base32 address requires encryption key"
|
||||
msgstr "Base32地址需要加密密钥"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1511
|
||||
msgid "Base32 address requires encryption key and lookup password"
|
||||
msgstr "Base32 地址需要加密密钥和查找密码"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1513
|
||||
msgid "Base32 address decryption failure, check encryption key"
|
||||
msgstr "Base32 地址解密失败,检查加密密钥"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1524
|
||||
msgid "Generate"
|
||||
msgstr "產生"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1525
|
||||
msgid "Encryption key"
|
||||
msgstr "加密密钥"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1526
|
||||
msgid ""
|
||||
"You must either enter a PSK encryption key provided by the server operator, "
|
||||
"or generate a DH encryption key and send that to the server operator."
|
||||
msgstr "您必须输入一个服务器操作员提供的 PSK 加密密钥或生成一个 DH 加密密钥并发送到服务器操作员。"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1527
|
||||
msgid "Ask the server operator for help."
|
||||
msgstr "向服务器操作者寻求帮助"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1530
|
||||
msgid "Enter PSK encryption key"
|
||||
msgstr "输入 PSK 加密密钥"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1533
|
||||
msgid "Generate new DH encryption key"
|
||||
msgstr "生成新的加密密钥"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1541
|
||||
msgid "Lookup password"
|
||||
msgstr "查找密码"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1542
|
||||
msgid "You must enter the password provided by the server operator."
|
||||
msgstr "您需要输入服务器操作者提供的密码。"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:196
|
||||
#, java-format
|
||||
msgid "Added via address helper from {0}"
|
||||
msgstr "已通过地址助手 {0} 添加"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:198
|
||||
msgid "Added via address helper"
|
||||
msgstr "已通过地址助手添加"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:235
|
||||
msgid "Missing lookup password"
|
||||
msgstr "查找密码不存在"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:249
|
||||
msgid "Missing private key"
|
||||
msgstr "私有密钥不存在"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:254
|
||||
msgid "Invalid private key"
|
||||
msgstr "私有密钥无效"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:287
|
||||
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:306
|
||||
msgid "Your new encryption key"
|
||||
msgstr "您的新加密密钥"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:301
|
||||
msgid "Address book"
|
||||
msgstr "通讯录"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:311
|
||||
msgid "Copy the key and send it to the server operator."
|
||||
msgstr "复制密钥,并发送给服务器操作者"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:313
|
||||
msgid "After you are granted permission, you may proceed to the website."
|
||||
msgstr "被授予权限后,您才可以访问这个网站"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:334
|
||||
msgid "Go back and fix the error"
|
||||
msgstr "返回并修复错误"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:345
|
||||
msgid "router"
|
||||
msgstr "路由器"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:347
|
||||
msgid "local"
|
||||
msgstr "本地"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:349
|
||||
msgid "private"
|
||||
msgstr "私有"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:362
|
||||
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:396
|
||||
#, java-format
|
||||
msgid "Redirecting to {0}"
|
||||
msgstr "正在重定向至 {0}"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:371
|
||||
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:405
|
||||
msgid "Address Book"
|
||||
msgstr "地址簿"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:376
|
||||
#, java-format
|
||||
msgid "Saved {0} to the {1} address book, redirecting now."
|
||||
msgstr "目标{0}已保存至{1}地址簿中,正在重定向至此目标。"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:377
|
||||
#, java-format
|
||||
msgid "Failed to save {0} to the {1} address book, redirecting now."
|
||||
msgstr "目标{0}在{1}地址簿中保存失败,正在重定向至此目标。"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:379
|
||||
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:411
|
||||
msgid "Click here if you are not redirected automatically."
|
||||
msgstr "如果未能自动转到,请点击这里。"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:409
|
||||
#, java-format
|
||||
msgid "Saved the authentication for {0}, redirecting now."
|
||||
msgstr "已保存 {0} 的凭据,正在重定向。"
|
||||
@@ -10,8 +10,8 @@ msgstr ""
|
||||
"Project-Id-Version: I2P\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2021-11-17 13:12+0000\n"
|
||||
"PO-Revision-Date: 2021-11-17 13:34+0000\n"
|
||||
"Last-Translator: zzzi2p\n"
|
||||
"PO-Revision-Date: 2011-02-13 11:46+0000\n"
|
||||
"Last-Translator: KIA <kia___@hushmail.com>, 2011\n"
|
||||
"Language-Team: Danish (http://www.transifex.com/otf/I2P/language/da/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
@@ -1148,7 +1148,7 @@ msgstr ""
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1784
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:382
|
||||
msgid "Encrypted"
|
||||
msgstr ""
|
||||
msgstr "Krypteret"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1764
|
||||
msgid "Prevents server discovery by floodfills"
|
||||
|
||||
@@ -18,8 +18,8 @@ msgstr ""
|
||||
"Project-Id-Version: I2P\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2021-11-17 13:12+0000\n"
|
||||
"PO-Revision-Date: 2021-11-17 13:34+0000\n"
|
||||
"Last-Translator: strel\n"
|
||||
"PO-Revision-Date: 2011-02-13 11:46+0000\n"
|
||||
"Last-Translator: strel, 2013-2018\n"
|
||||
"Language-Team: Spanish (http://www.transifex.com/otf/I2P/language/es/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
@@ -1743,7 +1743,7 @@ msgstr "El destino I2P local no está disponible. Inicie el túnel."
|
||||
msgid ""
|
||||
"To enable registration verification, edit tunnel and set name (or website "
|
||||
"name) to a valid hostname ending in '.i2p'"
|
||||
msgstr ""
|
||||
msgstr "Para habilitar la verificación del registro, edite el túnel y establezca el nombre (o nombre del sitio web) a un nombre de servidor válido acabado en '.i2p'"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:285
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:681
|
||||
@@ -2109,7 +2109,7 @@ msgstr "Esto permite que las conexiones TCP y UDP se hagan a través de un outpr
|
||||
msgid ""
|
||||
"A client tunnel implementing the SOCKS protocol, which is customized for "
|
||||
"connecting to IRC networks."
|
||||
msgstr ""
|
||||
msgstr "Un túnel de cliente que implementa el protocolo SOCKS, personalizado para la conexión con redes IRC."
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:310
|
||||
msgid ""
|
||||
@@ -2234,7 +2234,7 @@ msgid ""
|
||||
"This can be useful for frequently-used tunnels (especially server tunnels), "
|
||||
"but for tunnels that are only used occasionally it would mean that the I2P "
|
||||
"router is creating and maintaining unnecessary tunnels."
|
||||
msgstr ""
|
||||
msgstr "Esto puede ser útil para los túneles de uso frecuente (especialmente en los túneles de servidor), pero para los túneles que sólo se utilizan ocasionalmente, significaría que el router I2P está creando y manteniendo túneles innecesarios."
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:604
|
||||
msgid "The wizard has now collected enough information to create your tunnel."
|
||||
|
||||
@@ -12,8 +12,8 @@ msgstr ""
|
||||
"Project-Id-Version: I2P\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2021-11-17 13:12+0000\n"
|
||||
"PO-Revision-Date: 2021-11-17 13:34+0000\n"
|
||||
"Last-Translator: Reza Ghasemi\n"
|
||||
"PO-Revision-Date: 2011-02-13 11:46+0000\n"
|
||||
"Last-Translator: Reza Ghasemi, 2019\n"
|
||||
"Language-Team: Persian (http://www.transifex.com/otf/I2P/language/fa/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
@@ -593,7 +593,7 @@ msgstr ""
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1619
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1669
|
||||
msgid "Count"
|
||||
msgstr ""
|
||||
msgstr "شمارش"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:635
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1621
|
||||
|
||||
@@ -11,8 +11,8 @@ msgstr ""
|
||||
"Project-Id-Version: I2P\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2021-11-17 13:12+0000\n"
|
||||
"PO-Revision-Date: 2021-11-17 13:34+0000\n"
|
||||
"Last-Translator: zzzi2p\n"
|
||||
"PO-Revision-Date: 2011-02-13 11:46+0000\n"
|
||||
"Last-Translator: Jorma Karvonen <karvonen.jorma@gmail.com>, 2015\n"
|
||||
"Language-Team: Finnish (http://www.transifex.com/otf/I2P/language/fi/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
@@ -192,7 +192,7 @@ msgstr "Muokkaa piilotettua palvelua"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:184
|
||||
msgid "Are you sure you want to delete?"
|
||||
msgstr ""
|
||||
msgstr "Oletko varma, etä haluat poistaa tämän?"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:208
|
||||
msgid "Edit proxy settings"
|
||||
@@ -1392,7 +1392,7 @@ msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2311
|
||||
msgid "unlimited"
|
||||
msgstr ""
|
||||
msgstr "rajoittamaton"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2314
|
||||
msgid ""
|
||||
|
||||
@@ -10,8 +10,8 @@ msgstr ""
|
||||
"Project-Id-Version: I2P\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2021-11-17 13:12+0000\n"
|
||||
"PO-Revision-Date: 2021-11-17 13:34+0000\n"
|
||||
"Last-Translator: Robert Dafis <robertdafis@gmail.com>\n"
|
||||
"PO-Revision-Date: 2011-02-13 11:46+0000\n"
|
||||
"Last-Translator: Robert Dafis <robertdafis@gmail.com>, 2018\n"
|
||||
"Language-Team: Indonesian (http://www.transifex.com/otf/I2P/language/id/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
@@ -1730,7 +1730,7 @@ msgstr "Destinasi lokal ini tidak tersedia. Aktifkan tunnel ini.."
|
||||
msgid ""
|
||||
"To enable registration verification, edit tunnel and set name (or website "
|
||||
"name) to a valid hostname ending in '.i2p'"
|
||||
msgstr ""
|
||||
msgstr "Untuk mengaktifkan verifikasi pendaftaran, mengedit tunnel dan menetapkan nama (atau nama website) untuk nama host yang berlaku, yang berakhir dengan '.i2p'"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:285
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:681
|
||||
@@ -2096,7 +2096,7 @@ msgstr "Ini memungkinkan koneksi TCP dan UDP dibuat melalui outproxy SOCKS di da
|
||||
msgid ""
|
||||
"A client tunnel implementing the SOCKS protocol, which is customized for "
|
||||
"connecting to IRC networks."
|
||||
msgstr ""
|
||||
msgstr "Client tunnel yang menerapkan protokol SOCKS, yang disesuaikan untuk terhubung ke jaringan IRC."
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:310
|
||||
msgid ""
|
||||
@@ -2221,7 +2221,7 @@ msgid ""
|
||||
"This can be useful for frequently-used tunnels (especially server tunnels), "
|
||||
"but for tunnels that are only used occasionally it would mean that the I2P "
|
||||
"router is creating and maintaining unnecessary tunnels."
|
||||
msgstr ""
|
||||
msgstr "Ini dapat berguna untuk tunnel yang sering digunakan (terutama server tunnel), namun untuk tunnel yang hanya digunakan sesekali, router I2P menciptakan dan memelihara tunnel yang tidak diperlukan."
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:604
|
||||
msgid "The wizard has now collected enough information to create your tunnel."
|
||||
|
||||
@@ -25,8 +25,8 @@ msgstr ""
|
||||
"Project-Id-Version: I2P\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2021-11-17 13:12+0000\n"
|
||||
"PO-Revision-Date: 2021-11-17 13:34+0000\n"
|
||||
"Last-Translator: c2ed1e40dec4c77110b8433ca0e8b4a8_488379a <85dd5f0e022835b2532b5ca0658d8435_534014>\n"
|
||||
"PO-Revision-Date: 2011-02-13 11:46+0000\n"
|
||||
"Last-Translator: SebastianoPistore <SebastianoPistore.info@protonmail.ch>, 2021\n"
|
||||
"Language-Team: Italian (http://www.transifex.com/otf/I2P/language/it/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
@@ -2116,7 +2116,7 @@ msgstr "Questo abilita entrambe le connessioni TCP e UDP a passare tramite un ou
|
||||
msgid ""
|
||||
"A client tunnel implementing the SOCKS protocol, which is customized for "
|
||||
"connecting to IRC networks."
|
||||
msgstr ""
|
||||
msgstr "Un tunnel client che implementa un protocollo di tipo SOCKS, che è personalizzato per connettersi alla rete IRC."
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:310
|
||||
msgid ""
|
||||
@@ -2241,7 +2241,7 @@ msgid ""
|
||||
"This can be useful for frequently-used tunnels (especially server tunnels), "
|
||||
"but for tunnels that are only used occasionally it would mean that the I2P "
|
||||
"router is creating and maintaining unnecessary tunnels."
|
||||
msgstr ""
|
||||
msgstr "Questo può essere utile per tunnel usati spesso (specie tunnel server), ma per i tunnel usati solo occasionalmente comporta che il router I2P sta creando e mantenendo tunnel non necessari."
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:604
|
||||
msgid "The wizard has now collected enough information to create your tunnel."
|
||||
|
||||
@@ -11,8 +11,8 @@ msgstr ""
|
||||
"Project-Id-Version: I2P\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2021-11-17 13:12+0000\n"
|
||||
"PO-Revision-Date: 2021-11-17 13:34+0000\n"
|
||||
"Last-Translator: HelloKS <kqwe1859@gmail.com>\n"
|
||||
"PO-Revision-Date: 2011-02-13 11:46+0000\n"
|
||||
"Last-Translator: HelloKS <kqwe1859@gmail.com>, 2017\n"
|
||||
"Language-Team: Korean (http://www.transifex.com/otf/I2P/language/ko/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
@@ -1731,7 +1731,7 @@ msgstr "로컬 목적지가 사용 가능하지 않습니다. 터널을 재시
|
||||
msgid ""
|
||||
"To enable registration verification, edit tunnel and set name (or website "
|
||||
"name) to a valid hostname ending in '.i2p'"
|
||||
msgstr ""
|
||||
msgstr "가입 인증을 활성화하려면 터널을 편집하고 이름을 세팅하세요 (또는 웹사이트 이름) '.i2p'로 끝나야 합니다."
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:285
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:681
|
||||
@@ -2097,7 +2097,7 @@ msgstr "TCP와 UDP 모두를 I2P SOCKS 아웃프록시로 가도록 활성화합
|
||||
msgid ""
|
||||
"A client tunnel implementing the SOCKS protocol, which is customized for "
|
||||
"connecting to IRC networks."
|
||||
msgstr ""
|
||||
msgstr "클라이언트 터널이 IRC 네트워크 연결을 위해 커스텀된 SOCKS 프로토콜을 사용중입니다."
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:310
|
||||
msgid ""
|
||||
@@ -2222,7 +2222,7 @@ msgid ""
|
||||
"This can be useful for frequently-used tunnels (especially server tunnels), "
|
||||
"but for tunnels that are only used occasionally it would mean that the I2P "
|
||||
"router is creating and maintaining unnecessary tunnels."
|
||||
msgstr ""
|
||||
msgstr "자주 사용되는 터널에도 유용할 수 있습니다 (특히 서버 터널), 하지만 가끔 사용되는 터널에 대해서는 자원의 낭비가 있을 수 있습니다. I2P 라우터가 쓸모없는 터널을 생성하고 관리하는 격이니까요."
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:604
|
||||
msgid "The wizard has now collected enough information to create your tunnel."
|
||||
|
||||
@@ -13,8 +13,8 @@ msgstr ""
|
||||
"Project-Id-Version: I2P\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2021-11-17 13:12+0000\n"
|
||||
"PO-Revision-Date: 2021-11-17 13:34+0000\n"
|
||||
"Last-Translator: Allan Nordhøy <epost@anotheragency.no>\n"
|
||||
"PO-Revision-Date: 2011-02-13 11:46+0000\n"
|
||||
"Last-Translator: Allan Nordhøy <epost@anotheragency.no>, 2016-2017\n"
|
||||
"Language-Team: Norwegian Bokmål (http://www.transifex.com/otf/I2P/language/nb/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
@@ -1631,7 +1631,7 @@ msgstr "Mål"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:371
|
||||
msgid "Hostname"
|
||||
msgstr ""
|
||||
msgstr "Vertsnavn"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:412
|
||||
msgid "Share your site using the hostname"
|
||||
@@ -2104,7 +2104,7 @@ msgstr "Dette gjør at både TCP og UDP-tilkoblinger skal sendes gjennom en SOCK
|
||||
msgid ""
|
||||
"A client tunnel implementing the SOCKS protocol, which is customized for "
|
||||
"connecting to IRC networks."
|
||||
msgstr ""
|
||||
msgstr "En klient tunnel implementering av SOCKS-protokollen, som er tilpasset for tilkobling til IRC-nettverk."
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:310
|
||||
msgid ""
|
||||
@@ -2229,7 +2229,7 @@ msgid ""
|
||||
"This can be useful for frequently-used tunnels (especially server tunnels), "
|
||||
"but for tunnels that are only used occasionally it would mean that the I2P "
|
||||
"router is creating and maintaining unnecessary tunnels."
|
||||
msgstr ""
|
||||
msgstr "Dette kan være nyttig for ofte brukte tunneler (spesielt tjenertunneler), men for tunneler som bare brukes innimellom vil det bety at I2P-ruteren skaper og opprettholder unødvendige tunneler."
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:604
|
||||
msgid "The wizard has now collected enough information to create your tunnel."
|
||||
@@ -2298,7 +2298,7 @@ msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:750
|
||||
msgid "Return to previous page"
|
||||
msgstr ""
|
||||
msgstr "Gå tilbake til forrige side"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:753
|
||||
msgid "Previous"
|
||||
|
||||
@@ -16,8 +16,8 @@ msgstr ""
|
||||
"Project-Id-Version: I2P\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2021-11-17 13:12+0000\n"
|
||||
"PO-Revision-Date: 2021-11-17 13:34+0000\n"
|
||||
"Last-Translator: Nathan Follens\n"
|
||||
"PO-Revision-Date: 2011-02-13 11:46+0000\n"
|
||||
"Last-Translator: Nathan Follens, 2015,2018\n"
|
||||
"Language-Team: Dutch (http://www.transifex.com/otf/I2P/language/nl/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
@@ -1741,7 +1741,7 @@ msgstr "Lokale bestemming is niet beschikbaar. Start de tunnel."
|
||||
msgid ""
|
||||
"To enable registration verification, edit tunnel and set name (or website "
|
||||
"name) to a valid hostname ending in '.i2p'"
|
||||
msgstr ""
|
||||
msgstr "Om registratie verificatie in te schakelen, bewerk de tunnel en stel een naam (of website naam) in als valide host eindigend op '.i2p'"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:285
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:681
|
||||
@@ -2107,7 +2107,7 @@ msgstr "Dit zorgt ervoor dat zowel TCP- als UDP-connecties gemaakt kunnen worden
|
||||
msgid ""
|
||||
"A client tunnel implementing the SOCKS protocol, which is customized for "
|
||||
"connecting to IRC networks."
|
||||
msgstr ""
|
||||
msgstr "Een cliënt-tunnel die het SOCKS-protocol implementeert, speciaal om met IRC-netwerken te verbinden."
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:310
|
||||
msgid ""
|
||||
@@ -2232,7 +2232,7 @@ msgid ""
|
||||
"This can be useful for frequently-used tunnels (especially server tunnels), "
|
||||
"but for tunnels that are only used occasionally it would mean that the I2P "
|
||||
"router is creating and maintaining unnecessary tunnels."
|
||||
msgstr ""
|
||||
msgstr "Dit kan handig zijn voor veelgebruikte tunnels (vooral server tunnels), maar voor tunnels die maar af en toe gebruikt worden betekent het dat de I2P router onnodige tunnels maakt en bijhoudt."
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:604
|
||||
msgid "The wizard has now collected enough information to create your tunnel."
|
||||
|
||||
@@ -10,8 +10,8 @@ msgstr ""
|
||||
"Project-Id-Version: I2P\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2021-11-17 13:12+0000\n"
|
||||
"PO-Revision-Date: 2021-11-17 13:34+0000\n"
|
||||
"Last-Translator: zzzi2p\n"
|
||||
"PO-Revision-Date: 2011-02-13 11:46+0000\n"
|
||||
"Last-Translator: <n414210@rtrtr.com>, 2012\n"
|
||||
"Language-Team: Norwegian Nynorsk (http://www.transifex.com/otf/I2P/language/nn/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
@@ -1148,7 +1148,7 @@ msgstr ""
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1784
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:382
|
||||
msgid "Encrypted"
|
||||
msgstr ""
|
||||
msgstr "Kryptert"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1764
|
||||
msgid "Prevents server discovery by floodfills"
|
||||
@@ -2101,7 +2101,7 @@ msgstr "Dette gjer det moleg å oppretta både TCP- og UDP-tilkoplingar gjennom
|
||||
msgid ""
|
||||
"A client tunnel implementing the SOCKS protocol, which is customized for "
|
||||
"connecting to IRC networks."
|
||||
msgstr ""
|
||||
msgstr "Ein klienttunell som implementerer SOCKS-protokollen, som i tillegg er spesielt innstilt for IRC-nettverk."
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:310
|
||||
msgid ""
|
||||
@@ -2226,7 +2226,7 @@ msgid ""
|
||||
"This can be useful for frequently-used tunnels (especially server tunnels), "
|
||||
"but for tunnels that are only used occasionally it would mean that the I2P "
|
||||
"router is creating and maintaining unnecessary tunnels."
|
||||
msgstr ""
|
||||
msgstr "Dette kan vera nyttig for tunellar du nyttar ofte (spesielt tenartunellar). For tunellar som berre blir nytta av og til vil det tyda at I2P-ruteren opprettar og vedlikehaldar tunellar du ikkje treng."
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:604
|
||||
msgid "The wizard has now collected enough information to create your tunnel."
|
||||
|
||||
@@ -15,8 +15,8 @@ msgstr ""
|
||||
"Project-Id-Version: I2P\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2021-11-17 13:12+0000\n"
|
||||
"PO-Revision-Date: 2021-11-17 13:34+0000\n"
|
||||
"Last-Translator: dllud\n"
|
||||
"PO-Revision-Date: 2011-02-13 11:46+0000\n"
|
||||
"Last-Translator: Manuela Silva <mmsrs@sky.com>, 2017-2018\n"
|
||||
"Language-Team: Portuguese (http://www.transifex.com/otf/I2P/language/pt/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
@@ -240,7 +240,7 @@ msgstr "Descrição"
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:272
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1125
|
||||
msgid "Auto Start Tunnel"
|
||||
msgstr ""
|
||||
msgstr "Iniciar túnel automaticamente"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:274
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1127
|
||||
@@ -260,7 +260,7 @@ msgstr ""
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1135
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:584
|
||||
msgid "Automatically start tunnel when router starts"
|
||||
msgstr ""
|
||||
msgstr "Iniciar túnel automaticamente quando o roteador iniciar"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:286
|
||||
msgid ""
|
||||
@@ -308,7 +308,7 @@ msgstr "obrigatório"
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1177
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:512
|
||||
msgid "Specify the local port this service should be accessible from"
|
||||
msgstr ""
|
||||
msgstr "Especificar a porta local a partir da qual esse serviço deve ser acessível"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:330
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1020
|
||||
@@ -322,7 +322,7 @@ msgstr "Anfitrião"
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1163
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:466
|
||||
msgid "Hostname or IP address of the target server"
|
||||
msgstr ""
|
||||
msgstr "Nome do host ou endereço IP do servidor-alvo"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:347
|
||||
msgid "Local interface (ip address) the client tunnel will be reachable from"
|
||||
@@ -371,11 +371,11 @@ msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:406
|
||||
msgid "SSL Outproxies"
|
||||
msgstr ""
|
||||
msgstr "Proxies de saída SSL"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:418
|
||||
msgid "Use Outproxy Plugin"
|
||||
msgstr ""
|
||||
msgstr "Usar extensão de proxy de saída"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:420
|
||||
msgid ""
|
||||
@@ -1153,7 +1153,7 @@ msgstr ""
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1784
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:382
|
||||
msgid "Encrypted"
|
||||
msgstr ""
|
||||
msgstr "Encriptado"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1764
|
||||
msgid "Prevents server discovery by floodfills"
|
||||
@@ -1453,7 +1453,7 @@ msgstr "Limite de POSTs"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2352
|
||||
msgid "Per Period"
|
||||
msgstr ""
|
||||
msgstr "Por período"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2354
|
||||
msgid "Ban Duration"
|
||||
@@ -1520,7 +1520,7 @@ msgstr "Apagar"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:203
|
||||
msgid "Global Tunnel Control"
|
||||
msgstr ""
|
||||
msgstr "Controle de túnel global"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:205
|
||||
msgid "Tunnel Wizard"
|
||||
@@ -1592,7 +1592,7 @@ msgstr "Iniciando..."
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:328
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:517
|
||||
msgid "Stop this Tunnel"
|
||||
msgstr ""
|
||||
msgstr "Interromper esse túnel"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:316
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:335
|
||||
@@ -1619,7 +1619,7 @@ msgstr "Parado"
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:347
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:570
|
||||
msgid "Start this Tunnel"
|
||||
msgstr ""
|
||||
msgstr "Iniciar esse túnel"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:354
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:577
|
||||
@@ -1633,7 +1633,7 @@ msgstr "Destino"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:371
|
||||
msgid "Hostname"
|
||||
msgstr ""
|
||||
msgstr "Nome do hospedeiro"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:412
|
||||
msgid "Share your site using the hostname"
|
||||
@@ -1676,7 +1676,7 @@ msgstr "Interface"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:479
|
||||
msgid "Edit Tunnel Settings for"
|
||||
msgstr ""
|
||||
msgstr "Editar as configurações de túnel para"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:531
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:534
|
||||
@@ -2106,7 +2106,7 @@ msgstr "Isto habilita tanto conexões TCP quanto o UDP a serem feitas através d
|
||||
msgid ""
|
||||
"A client tunnel implementing the SOCKS protocol, which is customized for "
|
||||
"connecting to IRC networks."
|
||||
msgstr ""
|
||||
msgstr "Um túnel de cliente implementando o protocolo SOCKS, e projetado para conectar em redes IRC."
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:310
|
||||
msgid ""
|
||||
@@ -2231,7 +2231,7 @@ msgid ""
|
||||
"This can be useful for frequently-used tunnels (especially server tunnels), "
|
||||
"but for tunnels that are only used occasionally it would mean that the I2P "
|
||||
"router is creating and maintaining unnecessary tunnels."
|
||||
msgstr ""
|
||||
msgstr "Isto pode ser útil em túneis muito utilizados (especialmente os túneis de servidor), mas para os túneis que são utilizado ocasionalmente significa que o I2P vai ficar mantendo túneis desnecessários."
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:604
|
||||
msgid "The wizard has now collected enough information to create your tunnel."
|
||||
@@ -2300,7 +2300,7 @@ msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:750
|
||||
msgid "Return to previous page"
|
||||
msgstr ""
|
||||
msgstr "Retornar para a página anterior"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:753
|
||||
msgid "Previous"
|
||||
|
||||
@@ -6,16 +6,16 @@
|
||||
# Translators:
|
||||
# testsubject67 <deborinha97@hotmail.com>, 2014
|
||||
# Eduardo Rodrigues, 2021
|
||||
# blueboy, 2013
|
||||
# blueboy, 2015-2016,2020
|
||||
# blueboy, 2013-2014
|
||||
# L., 2013
|
||||
# L., 2015-2016,2020
|
||||
# L., 2013-2014
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: I2P\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2021-11-17 13:12+0000\n"
|
||||
"PO-Revision-Date: 2021-11-17 13:34+0000\n"
|
||||
"Last-Translator: Rafael Ferrari\n"
|
||||
"PO-Revision-Date: 2011-02-13 11:46+0000\n"
|
||||
"Last-Translator: Eduardo Rodrigues, 2021\n"
|
||||
"Language-Team: Portuguese (Brazil) (http://www.transifex.com/otf/I2P/language/pt_BR/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
@@ -1099,7 +1099,7 @@ msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1371
|
||||
msgid "Registration Authentication"
|
||||
msgstr ""
|
||||
msgstr "Autenticação de Registo"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1377
|
||||
msgid "HTTPS configuration"
|
||||
@@ -1945,7 +1945,7 @@ msgstr "Ativado"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:843
|
||||
msgid "I2P webserver (eepsite)"
|
||||
msgstr ""
|
||||
msgstr "servidor web I2P (eepsite)"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:1025
|
||||
msgid "SSL is enabled"
|
||||
@@ -2000,7 +2000,7 @@ msgstr "Destino do túnel"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:226
|
||||
msgid "Binding address and port"
|
||||
msgstr ""
|
||||
msgstr "Endereço e porta de escuta"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:232
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:711
|
||||
@@ -2015,25 +2015,25 @@ msgstr "Assistente completado"
|
||||
msgid ""
|
||||
"This wizard will take you through the various options available for creating"
|
||||
" tunnels in I2P."
|
||||
msgstr ""
|
||||
msgstr "Este assistente vai apresentar várias opções disponíveis para a criação de túneis I2P."
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:254
|
||||
msgid ""
|
||||
"The first thing to decide is whether you want to create a server or a client"
|
||||
" tunnel."
|
||||
msgstr ""
|
||||
msgstr "A primeira informação é escolher se o túnel será um servidor ou um cliente."
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:256
|
||||
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 ""
|
||||
msgstr "Se você vai se conectar em um serviço remoto, como um servidor IRC dentro da rede I2P ou um repositório de código fonte, então você precisa de um Túnel de CLIENTE."
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:258
|
||||
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 ""
|
||||
msgstr "Mas se vai hospedar um serviço para os outros se conectarem, então você precisa criar um Túnel de SERVIDOR."
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:260
|
||||
msgid "Server Tunnel"
|
||||
@@ -2045,18 +2045,18 @@ msgstr "Túnel cliente"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:280
|
||||
msgid "There are several types of tunnels to choose from:"
|
||||
msgstr ""
|
||||
msgstr "Existem diversos tipos de túneis para escolher:"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:288
|
||||
msgid "Basic tunnel for connecting to a single service inside I2P."
|
||||
msgstr ""
|
||||
msgstr "Túnel básico para se conectar em um único serviço na rede I2P."
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:290
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:324
|
||||
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 ""
|
||||
msgstr "Tente isto se nenhum dos tipos de túneis abaixo atente seus requisitos, ou se você não conhece o tipo de túnel necessário."
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:292
|
||||
msgid "Tunnel that acts as an HTTP proxy for reaching I2P Sites inside I2P."
|
||||
@@ -2067,7 +2067,7 @@ 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 ""
|
||||
msgstr "Configure seu navegador para usar este túnel como um proxy HTTP, ou configure a variável ambiente \"http_proxy\" para aplicativos GNU/Linux em modo texto."
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:296
|
||||
msgid ""
|
||||
@@ -2083,13 +2083,13 @@ msgstr ""
|
||||
msgid ""
|
||||
"With this tunnel type, your IRC client will be able to connect to an IRC "
|
||||
"network inside I2P."
|
||||
msgstr ""
|
||||
msgstr "Com este tipo de túnel, o seu cliente IRC vai poder se conectar nas redes IRC dentro do I2P."
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:302
|
||||
msgid ""
|
||||
"Each IRC network in I2P that you wish to connect to will require its own "
|
||||
"tunnel. (See Also, SOCKS IRC)"
|
||||
msgstr ""
|
||||
msgstr "Cada rede IRC do I2P que você vai se conectar requer o seu próprio túnel. (Veja também SOCKS IRC)"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:304
|
||||
msgid "A tunnel that implements the SOCKS protocol."
|
||||
@@ -2099,37 +2099,37 @@ msgstr "Um túnel que implementa o protocolo SOCKS."
|
||||
msgid ""
|
||||
"This enables both TCP and UDP connections to be made through a SOCKS "
|
||||
"outproxy within I2P."
|
||||
msgstr ""
|
||||
msgstr "Isto habilita tanto conexões TCP quanto o UDP a serem feitas através de proxy de saída SOCKS, para a rede I2P."
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:308
|
||||
msgid ""
|
||||
"A client tunnel implementing the SOCKS protocol, which is customized for "
|
||||
"connecting to IRC networks."
|
||||
msgstr ""
|
||||
msgstr "Um túnel de cliente implementando o protocolo SOCKS, e projetado para conectar em redes IRC."
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:310
|
||||
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 ""
|
||||
msgstr "Com este tipo de túnel, as redes IRC do I2P pode ser acessadas digitando o endereço I2P dentro do seu cliente IRC, e configurando ele para utilizar o túnel SOCKS."
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:312
|
||||
msgid ""
|
||||
"This means that only one I2P tunnel is required rather than a separate "
|
||||
"tunnel per IRC network."
|
||||
msgstr ""
|
||||
msgstr "Isto significa que somente um túnel I2P é necessário para se conectar em redes IRC, ao invés de dois túneis."
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:314
|
||||
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 ""
|
||||
msgstr "Redes IRC fora do I2P também pode ser acessadas se for conhecido um servidor de saída SOCKS dentro da rede I2P, contudo depende deste servidor não estar bloqueado pela rede IRC."
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:322
|
||||
msgid "A basic server tunnel for hosting a generic service inside I2P."
|
||||
msgstr ""
|
||||
msgstr "Um túnel de servidor básico para hospedar um serviço genérico dentro da rede I2P."
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:326
|
||||
msgid "A server tunnel that is customized for HTTP connections."
|
||||
@@ -2147,7 +2147,7 @@ msgstr ""
|
||||
msgid ""
|
||||
"Usually, a separate tunnel needs to be created for each IRC server that is "
|
||||
"to be accessible inside I2P."
|
||||
msgstr ""
|
||||
msgstr "Geralmente, cada servidor IRC que vai ser acessado de dentro da rede I2P precisa de um túnel separado."
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:338
|
||||
msgid "Select tunnel type"
|
||||
@@ -2161,13 +2161,13 @@ msgstr "Escolha um nome e uma descrição para o seu túnel."
|
||||
msgid ""
|
||||
"These can be anything you want - they are just for ease of identifying the "
|
||||
"tunnel in the routerconsole."
|
||||
msgstr ""
|
||||
msgstr "Pode ser qualquer informação, é apenas para a sua identificação no Painel do Roteador."
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:407
|
||||
msgid ""
|
||||
"If you know of any outproxies for this type of tunnel (either HTTP or "
|
||||
"SOCKS), fill them in below."
|
||||
msgstr ""
|
||||
msgstr "Se você conhece algum proxy de saída para este tipo de túnel (HTTP ou SOCKS), preencha ele abaixo."
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:409
|
||||
msgid "Separate multiple proxies with commas."
|
||||
@@ -2183,7 +2183,7 @@ msgstr ""
|
||||
msgid ""
|
||||
"Type in the I2P destination of the service that this client tunnel should "
|
||||
"connect to."
|
||||
msgstr ""
|
||||
msgstr "Tipo do serviço no destino I2P que teste túnel de cliente vai conectar."
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:431
|
||||
msgid ""
|
||||
@@ -2207,62 +2207,62 @@ msgstr "Essa é a porta pela qual o serviço está aceitando conexões."
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:508
|
||||
msgid "This is the port that the client tunnel will be accessed from locally."
|
||||
msgstr ""
|
||||
msgstr "Esta é a porta que o túnel de cliente escuta para ser acessado localmente."
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:531
|
||||
msgid ""
|
||||
"How do you want this tunnel to be accessed? By just this machine, your "
|
||||
"entire subnet, or external internet?"
|
||||
msgstr ""
|
||||
msgstr "Como você deseja que este túnel seja acessado? Apenas por esta máquina, sua sub rede, ou pela internet?"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:533
|
||||
msgid "You will most likely want to just allow 127.0.0.1"
|
||||
msgstr ""
|
||||
msgstr "Você precisa apenas permitir conexões de 127.0.0.1"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:576
|
||||
msgid ""
|
||||
"The I2P router can automatically start this tunnel for you when the router "
|
||||
"is started."
|
||||
msgstr ""
|
||||
msgstr "O roteador I2P pode iniciar automaticamente este túnel para você quando for iniciado."
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:578
|
||||
msgid ""
|
||||
"This can be useful for frequently-used tunnels (especially server tunnels), "
|
||||
"but for tunnels that are only used occasionally it would mean that the I2P "
|
||||
"router is creating and maintaining unnecessary tunnels."
|
||||
msgstr ""
|
||||
msgstr "Isto pode ser útil em túneis muito utilizados (especialmente os túneis de servidor), mas para os túneis que são utilizado ocasionalmente significa que o I2P vai ficar mantendo túneis desnecessários."
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:604
|
||||
msgid "The wizard has now collected enough information to create your tunnel."
|
||||
msgstr ""
|
||||
msgstr "O assistente já possui agora todas as informações para criar o seu túnel."
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:606
|
||||
msgid ""
|
||||
"Upon clicking the Save button below, the wizard will set up the tunnel, and "
|
||||
"take you back to the main I2PTunnel page."
|
||||
msgstr ""
|
||||
msgstr "Ao clicar no botão Salvar abaixo, o assistente vai criar o túnel e voltar para a página principal dos túneis I2P."
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:611
|
||||
msgid ""
|
||||
"Because you chose to automatically start the tunnel when the router starts, "
|
||||
"you don't have to do anything further."
|
||||
msgstr ""
|
||||
msgstr "Como você escolheu para iniciar o túnel automaticamente quando o roteador I2P inicia, não é necessário fazer nenhuma configuração adicional."
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:613
|
||||
msgid "The router will start the tunnel once it has been set up."
|
||||
msgstr ""
|
||||
msgstr "O roteador I2P vai iniciar o túnel assim que ele estiver configurado."
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:617
|
||||
msgid ""
|
||||
"Because you chose not to automatically start the tunnel, you will have to "
|
||||
"manually start it."
|
||||
msgstr ""
|
||||
msgstr "Como você escolheu para não iniciar o túnel automaticamente, você precisa sempre iniciar ele manualmente."
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:619
|
||||
msgid ""
|
||||
"You can do this by clicking the Start button on the main page which "
|
||||
"corresponds to the new tunnel."
|
||||
msgstr ""
|
||||
msgstr "Você pode fazer isto clicando no botão Iniciar na página principal do novo túnel."
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:623
|
||||
msgid "Below is a summary of the options you chose:"
|
||||
@@ -2284,14 +2284,14 @@ msgstr ""
|
||||
msgid ""
|
||||
"Alongside these basic settings, there are a number of advanced options for "
|
||||
"tunnel configuration."
|
||||
msgstr ""
|
||||
msgstr "Além destas configurações básicas, existem várias opções avançadas para a configuração do túnel."
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:724
|
||||
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 ""
|
||||
msgstr "O assistente vai configurar os parâmetros importantes no padrão recomendado, mas você pode ver/editar estes parâmetros clicando no nome do túnel na página principal dos túneis I2P."
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:743
|
||||
msgid "Cancel the wizard and return to Tunnel Manager home page"
|
||||
|
||||
@@ -11,8 +11,8 @@ msgstr ""
|
||||
"Project-Id-Version: I2P\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2021-11-17 13:12+0000\n"
|
||||
"PO-Revision-Date: 2021-11-17 13:34+0000\n"
|
||||
"Last-Translator: polearnik <polearnik@mail.ru>\n"
|
||||
"PO-Revision-Date: 2011-02-13 11:46+0000\n"
|
||||
"Last-Translator: polearnik <polearnik@mail.ru>, 2019-2020\n"
|
||||
"Language-Team: Romanian (http://www.transifex.com/otf/I2P/language/ro/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
@@ -1741,7 +1741,7 @@ msgstr "Destinația locală nu este disponibilă. Porniți tunelul."
|
||||
msgid ""
|
||||
"To enable registration verification, edit tunnel and set name (or website "
|
||||
"name) to a valid hostname ending in '.i2p'"
|
||||
msgstr ""
|
||||
msgstr "Pentru a activa verificarea înregistrării, editați tunelul și setați numele (sau numele site-ului) la un nume de gazdă valabil care se încheie în „.i2p”"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:285
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:681
|
||||
@@ -2107,7 +2107,7 @@ msgstr "Acest lucru permite conexiunile cit TCP atât si UDP să se facă printr
|
||||
msgid ""
|
||||
"A client tunnel implementing the SOCKS protocol, which is customized for "
|
||||
"connecting to IRC networks."
|
||||
msgstr ""
|
||||
msgstr "Un tunel client de punere în aplicare protocolul SOCKS, care este personalizat pentru conectarea la retele de IRC."
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:310
|
||||
msgid ""
|
||||
@@ -2232,7 +2232,7 @@ msgid ""
|
||||
"This can be useful for frequently-used tunnels (especially server tunnels), "
|
||||
"but for tunnels that are only used occasionally it would mean that the I2P "
|
||||
"router is creating and maintaining unnecessary tunnels."
|
||||
msgstr ""
|
||||
msgstr "Acest lucru poate fi util pentru tuneluri utilizate frecvent (mai ales tuneluri server), dar pentru tuneluri care sunt utilizate doar ocazional, aceasta ar însemna că router-ul I2P creaza și menține tuneluri inutile."
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:604
|
||||
msgid "The wizard has now collected enough information to create your tunnel."
|
||||
|
||||
@@ -10,8 +10,8 @@ msgstr ""
|
||||
"Project-Id-Version: I2P\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2021-11-17 13:12+0000\n"
|
||||
"PO-Revision-Date: 2021-11-17 13:34+0000\n"
|
||||
"Last-Translator: zzzi2p\n"
|
||||
"PO-Revision-Date: 2011-02-13 11:46+0000\n"
|
||||
"Last-Translator: Roman 'Kaktuxista' Benji <romanbeno273@gmail.com>, 2014\n"
|
||||
"Language-Team: Slovak (http://www.transifex.com/otf/I2P/language/sk/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
@@ -2111,7 +2111,7 @@ msgstr "Toto umožňuje aj TCP aj UDP pripojeniam byť vytvorenými prostredníc
|
||||
msgid ""
|
||||
"A client tunnel implementing the SOCKS protocol, which is customized for "
|
||||
"connecting to IRC networks."
|
||||
msgstr ""
|
||||
msgstr "Klientský tunel implementujúci protokol SOCKS, ktorý je špeciálne určený na pripájanie sa k IRC sieťam."
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:310
|
||||
msgid ""
|
||||
@@ -2236,7 +2236,7 @@ msgid ""
|
||||
"This can be useful for frequently-used tunnels (especially server tunnels), "
|
||||
"but for tunnels that are only used occasionally it would mean that the I2P "
|
||||
"router is creating and maintaining unnecessary tunnels."
|
||||
msgstr ""
|
||||
msgstr "To môže byť užitočné pre často používané tunely (obvlášť serverové tunely), avšak pre tunely používané len príležitostne by to pre I2P router znamenalo vytvorenie a udržiavanie zbytočných tunelov."
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:604
|
||||
msgid "The wizard has now collected enough information to create your tunnel."
|
||||
|
||||
@@ -19,8 +19,8 @@ msgstr ""
|
||||
"Project-Id-Version: I2P\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2021-11-17 13:12+0000\n"
|
||||
"PO-Revision-Date: 2022-01-22 09:36+0000\n"
|
||||
"Last-Translator: Jonatan Nyberg <jonatan@autistici.org>\n"
|
||||
"PO-Revision-Date: 2011-02-13 11:46+0000\n"
|
||||
"Last-Translator: Jonatan Nyberg <jonatan@autistici.org>, 2016-2017,2021-2022\n"
|
||||
"Language-Team: Swedish (Sweden) (http://www.transifex.com/otf/I2P/language/sv_SE/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
@@ -70,14 +70,14 @@ msgstr "högre bandbredd och pålitlighet"
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:615
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:1093
|
||||
msgid "Tunnels are not initialized yet, please reload in two minutes."
|
||||
msgstr "Tunnlar har inte initierats ännu, vänligen uppdatera om två minuter."
|
||||
msgstr "Tunnlar har inte initierats ännu, uppdatera om två minuter."
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:187
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:314
|
||||
msgid ""
|
||||
"Invalid form submission, probably because you used the 'back' or 'reload' "
|
||||
"button on your browser. Please resubmit."
|
||||
msgstr "Ogiltig formulärbegäran, troligen för att du använde knappen \"tillbaka\" eller \"uppdatera\" i din webbläsare. Vänligen skicka igen."
|
||||
msgstr "Ogiltig formulärbegäran, troligen för att du använde knappen \"tillbaka\" eller \"uppdatera\" i din webbläsare. Försök att skicka igen."
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:189
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:316
|
||||
@@ -1157,7 +1157,7 @@ msgstr ""
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1784
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:382
|
||||
msgid "Encrypted"
|
||||
msgstr ""
|
||||
msgstr "Krypterat"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1764
|
||||
msgid "Prevents server discovery by floodfills"
|
||||
@@ -2110,7 +2110,7 @@ msgstr "Detta möjliggör både TCP- och UDP-anslutningar kan göras genom en SO
|
||||
msgid ""
|
||||
"A client tunnel implementing the SOCKS protocol, which is customized for "
|
||||
"connecting to IRC networks."
|
||||
msgstr ""
|
||||
msgstr "En klienttunnel som implementerar SOCKS-protokollet, som är anpassat för anslutning till IRC-nätverk."
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:310
|
||||
msgid ""
|
||||
@@ -2235,7 +2235,7 @@ msgid ""
|
||||
"This can be useful for frequently-used tunnels (especially server tunnels), "
|
||||
"but for tunnels that are only used occasionally it would mean that the I2P "
|
||||
"router is creating and maintaining unnecessary tunnels."
|
||||
msgstr ""
|
||||
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:604
|
||||
msgid "The wizard has now collected enough information to create your tunnel."
|
||||
|
||||
@@ -12,8 +12,8 @@ msgstr ""
|
||||
"Project-Id-Version: I2P\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2021-11-17 13:12+0000\n"
|
||||
"PO-Revision-Date: 2022-02-03 06:28+0000\n"
|
||||
"Last-Translator: Kaya Zeren <kayazeren@gmail.com>\n"
|
||||
"PO-Revision-Date: 2011-02-13 11:46+0000\n"
|
||||
"Last-Translator: Kaya Zeren <kayazeren@gmail.com>, 2016-2022\n"
|
||||
"Language-Team: Turkish (Turkey) (http://www.transifex.com/otf/I2P/language/tr_TR/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
@@ -103,20 +103,20 @@ msgstr "Yeni Tünel"
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:444
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:530
|
||||
msgid "Port not set"
|
||||
msgstr "Kapı numarası ayarlanmamış"
|
||||
msgstr "Bağlantı noktası ayarlanmamış"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:417
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:532
|
||||
msgid "Invalid port"
|
||||
msgstr "Kapı numarası geçersiz"
|
||||
msgstr "Bağlantı noktası geçersiz"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:420
|
||||
msgid "Warning - ports less than 1024 are not recommended"
|
||||
msgstr "Uyarı - 1024 altındaki kapı numaralarının kullanılması önerilmez"
|
||||
msgstr "Uyarı - 1024 altındaki bağlantı noktalarının kullanılması önerilmez"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:437
|
||||
msgid "Warning - duplicate port"
|
||||
msgstr "Uyarı - Çift kapı numarası"
|
||||
msgstr "Uyarı - Çift bağlantı noktası"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:456
|
||||
msgid "Standard client"
|
||||
@@ -290,7 +290,7 @@ msgstr "Erişim Noktası"
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:510
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:696
|
||||
msgid "Port"
|
||||
msgstr "Kapı numarası"
|
||||
msgstr "Bağlantı noktası"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:312
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:336
|
||||
@@ -305,7 +305,7 @@ msgstr "zorunlu"
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1177
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:512
|
||||
msgid "Specify the local port this service should be accessible from"
|
||||
msgstr "Bu hizmete erişilebilecek yerel kapı numarasını yazın"
|
||||
msgstr "Bu hizmete erişilebilecek yerel bağlantı noktasını yazın"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:330
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1020
|
||||
@@ -397,7 +397,7 @@ msgstr "Tünelin .i2p adresini ya da hedefini (b32 ya da b64) buraya yazın."
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:446
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:439
|
||||
msgid "name, name:port, or destination"
|
||||
msgstr "ad, ad:kapı numarası ya da hedef"
|
||||
msgstr "ad, ad:bağlantı noktası ya da hedef"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:452
|
||||
msgid "b32 not recommended"
|
||||
@@ -702,7 +702,7 @@ msgstr "Bu seçenek etkinleştirildiğinde, tüneller yalnızca gerektiğinde a
|
||||
msgid ""
|
||||
"Delay opening client tunnel until activity is detected on the configured "
|
||||
"tunnel port"
|
||||
msgstr "Bu seçenek etkinleştirildiğinde, istemci tünelinin açılması yapılandırılan tünel kapısında bir işlem algılanana kadar geciktirilir"
|
||||
msgstr "Bu seçenek etkinleştirildiğinde, istemci tünelinin açılması yapılandırılan tünel bağlantı noktasında bir işlem algılanana kadar geciktirilir"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:730
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2278
|
||||
@@ -980,7 +980,7 @@ msgstr "I2CO Sunucu Adı ya da IP Adresi"
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1028
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2404
|
||||
msgid "I2CP Port Number"
|
||||
msgstr "I2CP Kapı Numarası"
|
||||
msgstr "I2CP Bağlantı Noktası"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1036
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2412
|
||||
@@ -1029,7 +1029,7 @@ msgstr "Bu ayarı değiştirebilmek için gizli hizmetin durdurulması gerekir"
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1178
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:489
|
||||
msgid "Specify the port the server is running on"
|
||||
msgstr "Sunucunun çalıştığı yerel kapı numarasını yazın"
|
||||
msgstr "Sunucunun çalıştığı yerel bağlantı noktasını yazın"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1193
|
||||
msgid ""
|
||||
@@ -1046,7 +1046,7 @@ msgstr "Hedefe bağlanmak için SSL kullanılsın"
|
||||
msgid ""
|
||||
"Port required to access service (this can be a different port to the port "
|
||||
"the service is hosted on)"
|
||||
msgstr "Hizmete erişmek için kullanılacak kapı numarası (barındırılan hizmetin kapı numarasından farklı olabilir)"
|
||||
msgstr "Hizmete erişmek için kullanılacak bağlantı noktası (barındırılan hizmetin bağlantı noktasından farklı olabilir)"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1232
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:540
|
||||
@@ -1133,7 +1133,7 @@ msgstr "Gidiş"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1721
|
||||
msgid "Encrypt Leaseset"
|
||||
msgstr "Kiralama Kümesini Şifrele"
|
||||
msgstr "Kiralama Kümesi'ni Şifrele"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1730
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1740
|
||||
@@ -1372,7 +1372,7 @@ msgstr "Sunucu Hızını Yavaşlatma"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2300
|
||||
msgid "Inbound connection limits"
|
||||
msgstr "Gelen bağlantı sınırları"
|
||||
msgstr "Geliş bağlantısı sınırları"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2302
|
||||
msgid "Per Minute"
|
||||
@@ -1705,7 +1705,7 @@ msgstr "Kayıt Yardımcısı"
|
||||
msgid ""
|
||||
"This service uses encrypted leasesets. Registration is not recommended. "
|
||||
"Registration authentication is disabled."
|
||||
msgstr "Bu hizmet şifrelenmiş kiralama kümeleri kullanır. Kayıt olmak gerekmez. Kayıt kimliği doğrulaması devre dışıdır."
|
||||
msgstr "Bu hizmet Şifrelenmiş Kiralama Kümeleri kullanır. Kayıt olmak gerekmez. Kayıt kimliği doğrulaması devre dışıdır."
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:246
|
||||
msgid ""
|
||||
@@ -1905,11 +1905,11 @@ msgstr "Alt Base32"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:706
|
||||
msgid "Incoming I2P Port Routing"
|
||||
msgstr "Gelen I2P Kapı Numarası Yöneltmesi"
|
||||
msgstr "Geliş I2P Bağlantı Noktası Yöneltmesi"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:708
|
||||
msgid "I2P Port"
|
||||
msgstr "I2P Kapı Numarası"
|
||||
msgstr "I2P Bağlantı Noktası"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:710
|
||||
msgid "Virtual Host"
|
||||
@@ -1998,7 +1998,7 @@ msgstr "Tünel hedefi"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:226
|
||||
msgid "Binding address and port"
|
||||
msgstr "Bağlanılacak adres ve kapı numarası"
|
||||
msgstr "Bağlanılacak adres ve bağlantı noktası"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:232
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:711
|
||||
@@ -2201,11 +2201,11 @@ msgstr "Çalıştırdığınız hizmetin IP adresi. Genellikle aynı bilgisayard
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:485
|
||||
msgid "This is the port that the service is accepting connections on."
|
||||
msgstr "Hizmetin bağlantıları kabul edeceği kapı numarası."
|
||||
msgstr "Hizmetin bağlantıları kabul edeceği bağlantı noktası."
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:508
|
||||
msgid "This is the port that the client tunnel will be accessed from locally."
|
||||
msgstr "İstemci tüneline yerel olarak erişilebilecek kapı numarası."
|
||||
msgstr "İstemci tüneline yerel olarak erişilebilecek bağlantı noktası."
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:531
|
||||
msgid ""
|
||||
@@ -2276,7 +2276,7 @@ msgstr "Bağlanacak adres"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:688
|
||||
msgid "Tunnel port"
|
||||
msgstr "Tünel kapı numarası"
|
||||
msgstr "Tünel bağlantı noktası"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:722
|
||||
msgid ""
|
||||
|
||||
@@ -16,8 +16,8 @@ msgstr ""
|
||||
"Project-Id-Version: I2P\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2021-11-17 13:12+0000\n"
|
||||
"PO-Revision-Date: 2021-11-17 13:34+0000\n"
|
||||
"Last-Translator: Maxym Mykhalchuk\n"
|
||||
"PO-Revision-Date: 2011-02-13 11:46+0000\n"
|
||||
"Last-Translator: samalero <ivan.barabash96@mail.ru>, 2017\n"
|
||||
"Language-Team: Ukrainian (Ukraine) (http://www.transifex.com/otf/I2P/language/uk_UA/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
@@ -203,7 +203,7 @@ msgstr "Редагувати прихований сервіс"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:184
|
||||
msgid "Are you sure you want to delete?"
|
||||
msgstr ""
|
||||
msgstr "Ви справді хочете вилучити?"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:208
|
||||
msgid "Edit proxy settings"
|
||||
@@ -1226,7 +1226,7 @@ msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1886
|
||||
msgid "Revoke"
|
||||
msgstr ""
|
||||
msgstr "Відкликати"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1888
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1925
|
||||
@@ -1751,7 +1751,7 @@ msgstr "Локальна адреса призначення недоступн
|
||||
msgid ""
|
||||
"To enable registration verification, edit tunnel and set name (or website "
|
||||
"name) to a valid hostname ending in '.i2p'"
|
||||
msgstr ""
|
||||
msgstr "Для активації реєстраційної перевірки змініть тунель і встановіть назву (чи назву сайту) з правильним суфіксом '.i2p'"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:285
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:681
|
||||
@@ -2117,7 +2117,7 @@ msgstr "Це дозволяє як TCP, так і UDP з’єднання чер
|
||||
msgid ""
|
||||
"A client tunnel implementing the SOCKS protocol, which is customized for "
|
||||
"connecting to IRC networks."
|
||||
msgstr ""
|
||||
msgstr "Клієнтський тунель, що реалізує протокол SOCKS, налаштований для з’єднання з мережами IRC."
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:310
|
||||
msgid ""
|
||||
@@ -2242,7 +2242,7 @@ msgid ""
|
||||
"This can be useful for frequently-used tunnels (especially server tunnels), "
|
||||
"but for tunnels that are only used occasionally it would mean that the I2P "
|
||||
"router is creating and maintaining unnecessary tunnels."
|
||||
msgstr ""
|
||||
msgstr "Це може бути корисно для часто використовуваних тунелів (особливо серверних тунелів), але для тунелів які використовуються тільки іноді це означатиме що маршрутизатор I2P створює і підтримує зайві тунелі."
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:604
|
||||
msgid "The wizard has now collected enough information to create your tunnel."
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
# Translators:
|
||||
# Beta Ba <linsui@inbox.lv>, 2020
|
||||
# ducki2p <ducki2p@gmail.com>, 2011
|
||||
# Fosworn D4, 2022
|
||||
# gzs, 2019
|
||||
# a7c0396e818c2941c33529bda1f6bf1b_d554568 <93d1ed349b85f9981f2c90624c315cde_129513>, 2013
|
||||
# xkimo_daeee <michael_ies@yahoo.com>, 2014
|
||||
@@ -27,8 +28,8 @@ msgstr ""
|
||||
"Project-Id-Version: I2P\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2021-11-17 13:12+0000\n"
|
||||
"PO-Revision-Date: 2021-11-17 13:34+0000\n"
|
||||
"Last-Translator: YFdyh000 <yfdyh000@gmail.com>\n"
|
||||
"PO-Revision-Date: 2011-02-13 11:46+0000\n"
|
||||
"Last-Translator: Fosworn D4, 2022\n"
|
||||
"Language-Team: Chinese (China) (http://www.transifex.com/otf/I2P/language/zh_CN/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
@@ -549,40 +550,40 @@ msgstr "无随机性,恒定性能"
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1486
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1576
|
||||
msgid "+ 0-1 hop variance"
|
||||
msgstr ""
|
||||
msgstr "+ 0-1 跳点变化幅度"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:600
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1487
|
||||
msgid "medium randomization, lower performance"
|
||||
msgstr ""
|
||||
msgstr "中等随机性,更低性能"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:604
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1491
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1580
|
||||
msgid "+ 0-2 hop variance"
|
||||
msgstr ""
|
||||
msgstr "+ 0-2 跳点变化幅度"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:605
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1492
|
||||
msgid "high randomization, very low performance"
|
||||
msgstr ""
|
||||
msgstr "高随机性,极低性能"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:609
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1496
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1584
|
||||
msgid "+/- 0-1 hop variance"
|
||||
msgstr ""
|
||||
msgstr "+/- 0-1 跳点变化幅度"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:610
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1497
|
||||
msgid "standard randomization, standard performance"
|
||||
msgstr ""
|
||||
msgstr "标准随机性,标准性能"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:614
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1501
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1588
|
||||
msgid "+/- 0-2 hop variance"
|
||||
msgstr ""
|
||||
msgstr "+/- 0-2 跳点变化幅度"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:615
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1502
|
||||
@@ -647,22 +648,22 @@ msgstr[0] "{0} 备份隧道"
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:650
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1635
|
||||
msgid "no redundancy, no added resource usage"
|
||||
msgstr ""
|
||||
msgstr "无冗余,不增加资源占用"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:655
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1640
|
||||
msgid "low redundancy, low resource usage"
|
||||
msgstr ""
|
||||
msgstr "低冗余,低资源占用"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:660
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1645
|
||||
msgid "medium redundancy, medium resource usage"
|
||||
msgstr ""
|
||||
msgstr "中等冗余,中等资源占用"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:665
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1650
|
||||
msgid "high redundancy, high resource usage"
|
||||
msgstr ""
|
||||
msgstr "高冗余,高资源占用"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:679
|
||||
msgid "Tunnel Management Options"
|
||||
@@ -873,7 +874,7 @@ msgstr "允许 SSL 到 I2P 地址簿"
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:881
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2014
|
||||
msgid "Configuration cannot be changed after destination is created"
|
||||
msgstr ""
|
||||
msgstr "一旦目标被创建后配置将不能被更改"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:886
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1719
|
||||
@@ -1034,7 +1035,7 @@ msgstr "新服务设置"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1138
|
||||
msgid "The hidden service must be stopped to change this setting"
|
||||
msgstr ""
|
||||
msgstr "为更改此设置,隐藏服务必须被停止"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1178
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:489
|
||||
@@ -1196,12 +1197,12 @@ msgstr "单独发送密钥给每个用户。"
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1796
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1809
|
||||
msgid "Encrypted with per-user key"
|
||||
msgstr ""
|
||||
msgstr "用按用户密钥加密"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1803
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1816
|
||||
msgid "Encrypted with lookup password and per-user key"
|
||||
msgstr ""
|
||||
msgstr "用查找密码和按用户密钥加密"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1805
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1811
|
||||
@@ -1218,7 +1219,7 @@ msgstr "加密密钥"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1872
|
||||
msgid "Encryption key required to access this service"
|
||||
msgstr ""
|
||||
msgstr "需要加密密钥来访问这个服务器"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1886
|
||||
msgid "Revoke"
|
||||
@@ -1245,7 +1246,7 @@ msgstr "添加"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2055
|
||||
msgid "Recommended for blinded and encrypted destinations"
|
||||
msgstr ""
|
||||
msgstr "推荐匿名和加密的目标"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2097
|
||||
msgid "Alternate private key file"
|
||||
@@ -1257,11 +1258,11 @@ msgstr "备用本地目的地"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2113
|
||||
msgid "Read Only: Alternate Local Destination"
|
||||
msgstr ""
|
||||
msgstr "只读:可选的本地目标"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2172
|
||||
msgid "Tunnel Access Control Options"
|
||||
msgstr ""
|
||||
msgstr "隧道地址控制选项"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2174
|
||||
msgid "Restricted Access List"
|
||||
@@ -1309,7 +1310,7 @@ msgstr "格式规范"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2208
|
||||
msgid "Absolute path to file containing filter definition"
|
||||
msgstr ""
|
||||
msgstr "包含过滤目标的文件绝对地址"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2212
|
||||
msgid "Server Access Options"
|
||||
@@ -1363,11 +1364,11 @@ msgstr "隧道性能选项"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2286
|
||||
msgid "Number of tunnels to keep open to maintain availability of service"
|
||||
msgstr ""
|
||||
msgstr "许多隧道保持开放来保持服务的有效性"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2292
|
||||
msgid "Period of inactivity before tunnel number is reduced"
|
||||
msgstr ""
|
||||
msgstr "隧道数量减少前的非活动期"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2296
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2366
|
||||
@@ -1382,7 +1383,7 @@ msgstr "服务器节流"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2300
|
||||
msgid "Inbound connection limits"
|
||||
msgstr ""
|
||||
msgstr "入站连接限制"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2302
|
||||
msgid "Per Minute"
|
||||
@@ -1403,7 +1404,7 @@ msgstr "每个客户端"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2311
|
||||
msgid "unlimited"
|
||||
msgstr ""
|
||||
msgstr "无限制"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2314
|
||||
msgid ""
|
||||
@@ -1415,13 +1416,13 @@ msgstr "在对服务器的访问被阻挡之前,每分钟用于唯一客户端
|
||||
msgid ""
|
||||
"Maximum number of web page requests per hour for a unique client before "
|
||||
"access to the server is blocked"
|
||||
msgstr ""
|
||||
msgstr "在对服务器的访问被阻挡之前,每小时用于唯一客户端的最大网页请求数"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2322
|
||||
msgid ""
|
||||
"Maximum number of web page requests per day for a unique client before "
|
||||
"access to the server is blocked"
|
||||
msgstr ""
|
||||
msgstr "在对服务器的访问被阻挡之前,每天用于唯一客户端的最大网页请求数"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2326
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2368
|
||||
@@ -1432,23 +1433,23 @@ msgstr "总数"
|
||||
msgid ""
|
||||
"Total number of web page requests per minute before access to the server is "
|
||||
"blocked"
|
||||
msgstr ""
|
||||
msgstr "在对服务器的访问被阻挡之前,每分钟用于唯一客户端的总网页请求数"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2332
|
||||
msgid ""
|
||||
"Total number of web page requests per hour before access to the server is "
|
||||
"blocked"
|
||||
msgstr ""
|
||||
msgstr "在对服务器的访问被阻挡之前,每小时用于唯一客户端的总网页请求数"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2336
|
||||
msgid ""
|
||||
"Total number of web page requests per day before access to the server is "
|
||||
"blocked"
|
||||
msgstr ""
|
||||
msgstr "在对服务器的访问被阻挡之前,每天用于唯一客户端的总网页请求数"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2340
|
||||
msgid "Max concurrent connections"
|
||||
msgstr ""
|
||||
msgstr "最大并发连接数"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2342
|
||||
msgid "Maximum number of simultaneous client connections"
|
||||
@@ -1476,17 +1477,17 @@ msgstr "配置的时间跨度中用于唯一客户端的最大网页请求数"
|
||||
msgid ""
|
||||
"If a client exceeds the maximum number of post requests per allocated "
|
||||
"period, enforce a ban for this number of minutes"
|
||||
msgstr ""
|
||||
msgstr "如果一个客户端提交的 POST 请求数量超过了每分配时段的最大 POST 请求数量,那么服务端将会强制执行该数量的分钟数的封禁"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2370
|
||||
msgid "Total number of post requests permitted for the configured time span"
|
||||
msgstr ""
|
||||
msgstr "配置的时间跨度中被允许的总 POST 请求数"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2374
|
||||
msgid ""
|
||||
"If the maximum number of post requests per allocated period is exceeded, "
|
||||
"enforce a global access ban for this number of minutes"
|
||||
msgstr ""
|
||||
msgstr "如果提交的 POST 请求数量超过了每分配时段的最大 POST 请求数量,那么服务端将会强制执行该数量的分钟数的全局封禁"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2380
|
||||
msgid "POST limit period"
|
||||
@@ -1496,7 +1497,7 @@ msgstr "POST 限制时长"
|
||||
msgid ""
|
||||
"Time span for the maximum number of post requests to be reached before a ban"
|
||||
" is triggered"
|
||||
msgstr ""
|
||||
msgstr "在实施封禁之前达到的最大 POST 请求数的时间跨度"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2435
|
||||
msgid "Tunnels not initialized yet; please retry in a few moments."
|
||||
@@ -1644,11 +1645,11 @@ msgstr "主机名"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:412
|
||||
msgid "Share your site using the hostname"
|
||||
msgstr ""
|
||||
msgstr "通过主机名来分享您的站点"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:433
|
||||
msgid "Copy the hostname to the clipboard"
|
||||
msgstr ""
|
||||
msgstr "将该主机名复制到剪贴板上"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:436
|
||||
msgid "Copy Hostname"
|
||||
@@ -1715,7 +1716,7 @@ msgstr "注册助手"
|
||||
msgid ""
|
||||
"This service uses encrypted leasesets. Registration is not recommended. "
|
||||
"Registration authentication is disabled."
|
||||
msgstr ""
|
||||
msgstr "这个服务使用了加密的租契集。我们不推荐您注册,因为注册认证已被关闭。"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:246
|
||||
msgid ""
|
||||
@@ -1747,14 +1748,14 @@ msgstr "本地目标不可用。启动隧道。"
|
||||
msgid ""
|
||||
"To enable registration verification, edit tunnel and set name (or website "
|
||||
"name) to a valid hostname ending in '.i2p'"
|
||||
msgstr ""
|
||||
msgstr "为注册验证,编辑隧道并设置名称(或网站名称)为一个有效的以 '.i2p' 结尾的主机名"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:285
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:681
|
||||
msgid ""
|
||||
"To enable registration verification, edit tunnel and set name to a valid "
|
||||
"hostname ending in '.i2p'"
|
||||
msgstr ""
|
||||
msgstr "要启用注册验证,请编辑隧道并设置一个名称为以 '.i2p' 结尾的有效主机名"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:294
|
||||
msgid "Destination signing key is not available. Start the tunnel."
|
||||
@@ -1763,12 +1764,12 @@ msgstr "目标签名密钥不可用。开始隧道。"
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:300
|
||||
msgid ""
|
||||
"Destination signing key is offline. Use CLI tools on the offline machine."
|
||||
msgstr ""
|
||||
msgstr "目标签名密钥已离线。请在离线机器上使用 CLI 工具。"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:310
|
||||
#, java-format
|
||||
msgid "Authentication for adding host {0}"
|
||||
msgstr ""
|
||||
msgstr "添加主机{0}认证"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:312
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:327
|
||||
@@ -1788,7 +1789,7 @@ msgstr "高级认证字符串"
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:325
|
||||
#, java-format
|
||||
msgid "Authentication for removing host {0}"
|
||||
msgstr ""
|
||||
msgstr "移除主机{0}认证"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:356
|
||||
msgid "Authentication for changing name"
|
||||
@@ -1802,7 +1803,7 @@ msgstr "这将更改名称 {0} 至 {1},使用同一个目标"
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:376
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:409
|
||||
msgid "This tunnel must be configured with the new hostname."
|
||||
msgstr ""
|
||||
msgstr "此隧道必须使用新的主机名称配置。"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:378
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:411
|
||||
@@ -1899,7 +1900,7 @@ msgstr "生成"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:182
|
||||
msgid "SSL Helper"
|
||||
msgstr ""
|
||||
msgstr "SSL 助手"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:653
|
||||
msgid "Experts only!"
|
||||
@@ -1915,7 +1916,7 @@ msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:706
|
||||
msgid "Incoming I2P Port Routing"
|
||||
msgstr ""
|
||||
msgstr "传入 I2P 端口路由"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:708
|
||||
msgid "I2P Port"
|
||||
@@ -2145,11 +2146,11 @@ msgstr "为HTTP连接而调整的服务隧道。"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:328
|
||||
msgid "Use this tunnel type if you want to host an I2P Site."
|
||||
msgstr ""
|
||||
msgstr "如果您想要创建一个 I2P 网站请使用此隧道类型。"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:330
|
||||
msgid "A customized server tunnel for hosting IRC networks inside I2P."
|
||||
msgstr ""
|
||||
msgstr "一个为在 I2P 内部主持 IRC 网络而设立的自定义服务器隧道"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:332
|
||||
msgid ""
|
||||
@@ -2197,7 +2198,7 @@ msgstr "请输入该客户端隧道应连接的 I2P 服务目标。"
|
||||
msgid ""
|
||||
"This could be the full Base64 destination key, or an I2P URL from your "
|
||||
"address book."
|
||||
msgstr ""
|
||||
msgstr "这可能是一个完整的 Base64 编码的目标密钥或您地址簿中的一个 I2P URL。"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:435
|
||||
msgid "Enter a b64 or .i2p address here"
|
||||
@@ -2238,7 +2239,7 @@ msgid ""
|
||||
"This can be useful for frequently-used tunnels (especially server tunnels), "
|
||||
"but for tunnels that are only used occasionally it would mean that the I2P "
|
||||
"router is creating and maintaining unnecessary tunnels."
|
||||
msgstr ""
|
||||
msgstr "这适用于经常使用的隧道(尤其是服务端隧道),但如果隧道仅偶尔使用,会不必要地占用I2P的资源。"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:604
|
||||
msgid "The wizard has now collected enough information to create your tunnel."
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1,5 +1,5 @@
|
||||
Apache Tomcat
|
||||
Copyright 1999-2021 The Apache Software Foundation
|
||||
Copyright 1999-2022 The Apache Software Foundation
|
||||
|
||||
This product includes software developed at
|
||||
The Apache Software Foundation (https://www.apache.org/).
|
||||
BIN
apps/jetty/apache-tomcat-9.0.62/bin/tomcat-juli.jar
Normal file
BIN
apps/jetty/apache-tomcat-9.0.62/bin/tomcat-juli.jar
Normal file
Binary file not shown.
BIN
apps/jetty/apache-tomcat-9.0.62/lib/el-api.jar
Normal file
BIN
apps/jetty/apache-tomcat-9.0.62/lib/el-api.jar
Normal file
Binary file not shown.
BIN
apps/jetty/apache-tomcat-9.0.62/lib/jasper-el.jar
Normal file
BIN
apps/jetty/apache-tomcat-9.0.62/lib/jasper-el.jar
Normal file
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user