propagate from branch 'i2p.i2p' (head 34802d93f1d32368153a6769608d8e1046d0d117)

to branch 'i2p.i2p.str4d.test2' (head 0981aa4b9874c1752456cbf381aadc2fe829d57b)
This commit is contained in:
str4d
2016-07-10 14:31:03 +00:00
985 changed files with 138405 additions and 73373 deletions

6
.idea/ant.xml generated Normal file
View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="AntConfiguration">
<buildFile url="file://$PROJECT_DIR$/build.xml" />
</component>
</project>

22
.idea/compiler.xml generated Normal file
View File

@ -0,0 +1,22 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="CompilerConfiguration">
<resourceExtensions />
<wildcardResourcePatterns>
<entry name="!?*.java" />
<entry name="!?*.form" />
<entry name="!?*.class" />
<entry name="!?*.groovy" />
<entry name="!?*.scala" />
<entry name="!?*.flex" />
<entry name="!?*.kt" />
<entry name="!?*.clj" />
<entry name="!?*.aj" />
</wildcardResourcePatterns>
<annotationProcessing>
<profile default="true" name="Default" enabled="false">
<processorPath useClasspath="true" />
</profile>
</annotationProcessing>
</component>
</project>

3
.idea/copyright/profiles_settings.xml generated Normal file
View File

@ -0,0 +1,3 @@
<component name="CopyrightManager">
<settings default="" />
</component>

View File

@ -0,0 +1,9 @@
<component name="libraryTable">
<library name="javax.servlet.jsp-2.2.0.v201112011158">
<CLASSES>
<root url="jar://$PROJECT_DIR$/apps/jetty/jetty-distribution-8.1.17.v20150415/lib/jsp/javax.servlet.jsp-2.2.0.v201112011158.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>

22
.idea/libraries/jettylib.xml generated Normal file
View File

@ -0,0 +1,22 @@
<component name="libraryTable">
<library name="jettylib">
<CLASSES>
<root url="jar://$PROJECT_DIR$/apps/jetty/jetty-distribution-8.1.17.v20150415/lib/jetty-security-8.1.17.v20150415.jar!/" />
<root url="jar://$PROJECT_DIR$/apps/jetty/jetty-distribution-8.1.17.v20150415/lib/jetty-servlets-8.1.17.v20150415.jar!/" />
<root url="jar://$PROJECT_DIR$/apps/jetty/jetty-distribution-8.1.17.v20150415/lib/jetty-deploy-8.1.17.v20150415.jar!/" />
<root url="jar://$PROJECT_DIR$/apps/jetty/jetty-distribution-8.1.17.v20150415/lib/jetty-util-8.1.17.v20150415.jar!/" />
<root url="jar://$PROJECT_DIR$/apps/jetty/jetty-distribution-8.1.17.v20150415/lib/jetty-servlet-8.1.17.v20150415.jar!/" />
<root url="jar://$PROJECT_DIR$/apps/jetty/jetty-distribution-8.1.17.v20150415/lib/jetty-http-8.1.17.v20150415.jar!/" />
<root url="jar://$PROJECT_DIR$/apps/jetty/jetty-distribution-8.1.17.v20150415/lib/jetty-xml-8.1.17.v20150415.jar!/" />
<root url="jar://$PROJECT_DIR$/apps/jetty/jetty-distribution-8.1.17.v20150415/lib/jetty-server-8.1.17.v20150415.jar!/" />
<root url="jar://$PROJECT_DIR$/apps/jetty/jetty-distribution-8.1.17.v20150415/lib/servlet-api-3.0.jar!/" />
<root url="jar://$PROJECT_DIR$/apps/jetty/jetty-distribution-8.1.17.v20150415/lib/jetty-jmx-8.1.17.v20150415.jar!/" />
<root url="jar://$PROJECT_DIR$/apps/jetty/jetty-distribution-8.1.17.v20150415/lib/jetty-webapp-8.1.17.v20150415.jar!/" />
<root url="jar://$PROJECT_DIR$/apps/jetty/jetty-distribution-8.1.17.v20150415/lib/jetty-io-8.1.17.v20150415.jar!/" />
<root url="jar://$PROJECT_DIR$/apps/jetty/jetty-distribution-8.1.17.v20150415/lib/jetty-continuation-8.1.17.v20150415.jar!/" />
<root url="jar://$PROJECT_DIR$/apps/jetty/jetty-distribution-8.1.17.v20150415/lib/jetty-rewrite-8.1.17.v20150415.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>

9
.idea/libraries/jrobin_1_5_9_1.xml generated Normal file
View File

@ -0,0 +1,9 @@
<component name="libraryTable">
<library name="jrobin-1.5.9.1">
<CLASSES>
<root url="jar://$PROJECT_DIR$/apps/jrobin/jrobin-1.5.9.1.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>

10
.idea/libraries/lib.xml generated Normal file
View File

@ -0,0 +1,10 @@
<component name="libraryTable">
<library name="lib">
<CLASSES>
<root url="jar://$PROJECT_DIR$/apps/susidns/src/lib/jstl.jar!/" />
<root url="jar://$PROJECT_DIR$/apps/susidns/src/lib/standard.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>

9
.idea/libraries/start.xml generated Normal file
View File

@ -0,0 +1,9 @@
<component name="libraryTable">
<library name="start">
<CLASSES>
<root url="jar://$PROJECT_DIR$/apps/jetty/jetty-distribution-8.1.17.v20150415/start.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>

9
.idea/libraries/systray4j.xml generated Normal file
View File

@ -0,0 +1,9 @@
<component name="libraryTable">
<library name="systray4j">
<CLASSES>
<root url="jar://$PROJECT_DIR$/apps/systray/java/lib/systray4j.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>

9
.idea/libraries/tomcat_coyote_util.xml generated Normal file
View File

@ -0,0 +1,9 @@
<component name="libraryTable">
<library name="tomcat-coyote-util">
<CLASSES>
<root url="jar://$PROJECT_DIR$/apps/jetty/apache-tomcat/lib/tomcat-coyote-util.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>

12
.idea/libraries/tomcat_lib.xml generated Normal file
View File

@ -0,0 +1,12 @@
<component name="libraryTable">
<library name="tomcat-lib">
<CLASSES>
<root url="jar://$PROJECT_DIR$/apps/jetty/apache-tomcat-deployer/lib/tomcat-juli.jar!/" />
<root url="jar://$PROJECT_DIR$/apps/jetty/apache-tomcat-deployer/lib/el-api.jar!/" />
<root url="jar://$PROJECT_DIR$/apps/jetty/apache-tomcat-deployer/lib/jasper.jar!/" />
<root url="jar://$PROJECT_DIR$/apps/jetty/apache-tomcat-deployer/lib/jasper-el.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>

9
.idea/libraries/wrapper.xml generated Normal file
View File

@ -0,0 +1,9 @@
<component name="libraryTable">
<library name="wrapper">
<CLASSES>
<root url="jar://$PROJECT_DIR$/installer/lib/wrapper/all/wrapper.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>

9
.idea/libraries/wrapper_win.xml generated Normal file
View File

@ -0,0 +1,9 @@
<component name="libraryTable">
<library name="wrapper-win">
<CLASSES>
<root url="jar://$PROJECT_DIR$/installer/lib/wrapper/win-all/wrapper.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>

57
.idea/misc.xml generated Normal file
View File

@ -0,0 +1,57 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ClientPropertiesManager">
<properties class="javax.swing.AbstractButton">
<property name="hideActionText" class="java.lang.Boolean" />
</properties>
<properties class="javax.swing.JComponent">
<property name="html.disable" class="java.lang.Boolean" />
</properties>
<properties class="javax.swing.JEditorPane">
<property name="JEditorPane.w3cLengthUnits" class="java.lang.Boolean" />
<property name="JEditorPane.honorDisplayProperties" class="java.lang.Boolean" />
<property name="charset" class="java.lang.String" />
</properties>
<properties class="javax.swing.JList">
<property name="List.isFileList" class="java.lang.Boolean" />
</properties>
<properties class="javax.swing.JPasswordField">
<property name="JPasswordField.cutCopyAllowed" class="java.lang.Boolean" />
</properties>
<properties class="javax.swing.JSlider">
<property name="Slider.paintThumbArrowShape" class="java.lang.Boolean" />
<property name="JSlider.isFilled" class="java.lang.Boolean" />
</properties>
<properties class="javax.swing.JTable">
<property name="Table.isFileList" class="java.lang.Boolean" />
<property name="JTable.autoStartsEdit" class="java.lang.Boolean" />
<property name="terminateEditOnFocusLost" class="java.lang.Boolean" />
</properties>
<properties class="javax.swing.JToolBar">
<property name="JToolBar.isRollover" class="java.lang.Boolean" />
</properties>
<properties class="javax.swing.JTree">
<property name="JTree.lineStyle" class="java.lang.String" />
</properties>
<properties class="javax.swing.text.JTextComponent">
<property name="caretAspectRatio" class="java.lang.Double" />
<property name="caretWidth" class="java.lang.Integer" />
</properties>
</component>
<component name="EntryPointsManager">
<entry_points version="2.0" />
</component>
<component name="ProjectLevelVcsManager" settingsEditedManually="false">
<OptionsSetting value="true" id="Add" />
<OptionsSetting value="true" id="Remove" />
<OptionsSetting value="true" id="Checkout" />
<OptionsSetting value="true" id="Update" />
<OptionsSetting value="true" id="Status" />
<OptionsSetting value="true" id="Edit" />
<ConfirmationsSetting value="0" id="Add" />
<ConfirmationsSetting value="0" id="Remove" />
</component>
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_7" default="true" assert-keyword="true" jdk-15="true" project-jdk-name="1.7" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/build" />
</component>
</project>

27
.idea/modules.xml generated Normal file
View File

@ -0,0 +1,27 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/apps/BOB/BOB.iml" filepath="$PROJECT_DIR$/apps/BOB/BOB.iml" />
<module fileurl="file://$PROJECT_DIR$/apps/addressbook/addressbook.iml" filepath="$PROJECT_DIR$/apps/addressbook/addressbook.iml" />
<module fileurl="file://$PROJECT_DIR$/apps/admin/admin.iml" filepath="$PROJECT_DIR$/apps/admin/admin.iml" />
<module fileurl="file://$PROJECT_DIR$/core/core.iml" filepath="$PROJECT_DIR$/core/core.iml" />
<module fileurl="file://$PROJECT_DIR$/apps/desktopgui/desktopgui.iml" filepath="$PROJECT_DIR$/apps/desktopgui/desktopgui.iml" />
<module fileurl="file://$PROJECT_DIR$/apps/i2psnark/i2psnark.iml" filepath="$PROJECT_DIR$/apps/i2psnark/i2psnark.iml" />
<module fileurl="file://$PROJECT_DIR$/apps/i2ptunnel/i2ptunnel.iml" filepath="$PROJECT_DIR$/apps/i2ptunnel/i2ptunnel.iml" />
<module fileurl="file://$PROJECT_DIR$/apps/imagegen/identicon/identicon.iml" filepath="$PROJECT_DIR$/apps/imagegen/identicon/identicon.iml" />
<module fileurl="file://$PROJECT_DIR$/apps/imagegen/imagegen/imagegen.iml" filepath="$PROJECT_DIR$/apps/imagegen/imagegen/imagegen.iml" />
<module fileurl="file://$PROJECT_DIR$/installer/installer.iml" filepath="$PROJECT_DIR$/installer/installer.iml" />
<module fileurl="file://$PROJECT_DIR$/apps/jetty/jetty.iml" filepath="$PROJECT_DIR$/apps/jetty/jetty.iml" />
<module fileurl="file://$PROJECT_DIR$/apps/ministreaming/ministreaming.iml" filepath="$PROJECT_DIR$/apps/ministreaming/ministreaming.iml" />
<module fileurl="file://$PROJECT_DIR$/router/router.iml" filepath="$PROJECT_DIR$/router/router.iml" />
<module fileurl="file://$PROJECT_DIR$/apps/routerconsole/routerconsole.iml" filepath="$PROJECT_DIR$/apps/routerconsole/routerconsole.iml" />
<module fileurl="file://$PROJECT_DIR$/apps/sam/sam.iml" filepath="$PROJECT_DIR$/apps/sam/sam.iml" />
<module fileurl="file://$PROJECT_DIR$/apps/streaming/streaming.iml" filepath="$PROJECT_DIR$/apps/streaming/streaming.iml" />
<module fileurl="file://$PROJECT_DIR$/apps/susidns/susidns.iml" filepath="$PROJECT_DIR$/apps/susidns/susidns.iml" />
<module fileurl="file://$PROJECT_DIR$/apps/susimail/susimail.iml" filepath="$PROJECT_DIR$/apps/susimail/susimail.iml" />
<module fileurl="file://$PROJECT_DIR$/apps/systray/systray.iml" filepath="$PROJECT_DIR$/apps/systray/systray.iml" />
<module fileurl="file://$PROJECT_DIR$/apps/imagegen/zxing/zxing.iml" filepath="$PROJECT_DIR$/apps/imagegen/zxing/zxing.iml" />
</modules>
</component>
</project>

6
.idea/runConfigurations/updater.xml generated Normal file
View File

@ -0,0 +1,6 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="updater" type="AntRunConfiguration" factoryName="Ant Target">
<antsettings antfile="file://$PROJECT_DIR$/build.xml" target="updater" />
<method />
</configuration>
</component>

View File

@ -37,9 +37,14 @@ web-out.xml
/tmp /tmp
^apps/jetty/jettylib ^apps/jetty/jettylib
# MSVC files
core/c/jcpuid/msvc/*.opendb
core/c/jcpuid/msvc/*.pdb
core/c/jcpuid/msvc/*.sdf
core/c/jcpuid/msvc/*.user
# Debian-related # Debian-related
^debian/copyright ^debian/copyright
^debian/changelog
^.pc/ ^.pc/
# Build property overrides # Build property overrides

View File

@ -6,6 +6,7 @@ trans.cs = apps/i2ptunnel/locale/messages_cs.po
trans.da = apps/i2ptunnel/locale/messages_da.po trans.da = apps/i2ptunnel/locale/messages_da.po
trans.de = apps/i2ptunnel/locale/messages_de.po trans.de = apps/i2ptunnel/locale/messages_de.po
trans.es = apps/i2ptunnel/locale/messages_es.po trans.es = apps/i2ptunnel/locale/messages_es.po
trans.fi = apps/i2ptunnel/locale/messages_fi.po
trans.fr = apps/i2ptunnel/locale/messages_fr.po trans.fr = apps/i2ptunnel/locale/messages_fr.po
trans.hu = apps/i2ptunnel/locale/messages_hu.po trans.hu = apps/i2ptunnel/locale/messages_hu.po
trans.it = apps/i2ptunnel/locale/messages_it.po trans.it = apps/i2ptunnel/locale/messages_it.po
@ -23,6 +24,7 @@ trans.sv_SE = apps/i2ptunnel/locale/messages_sv.po
trans.uk_UA = apps/i2ptunnel/locale/messages_uk.po trans.uk_UA = apps/i2ptunnel/locale/messages_uk.po
trans.vi = apps/i2ptunnel/locale/messages_vi.po trans.vi = apps/i2ptunnel/locale/messages_vi.po
trans.zh_CN = apps/i2ptunnel/locale/messages_zh.po trans.zh_CN = apps/i2ptunnel/locale/messages_zh.po
trans.zh_TW = apps/i2ptunnel/locale/messages_zh_TW.po
[I2P.proxy] [I2P.proxy]
source_file = apps/i2ptunnel/locale-proxy/messages_en.po source_file = apps/i2ptunnel/locale-proxy/messages_en.po
@ -31,6 +33,7 @@ trans.ar = apps/i2ptunnel/locale-proxy/messages_ar.po
trans.cs = apps/i2ptunnel/locale-proxy/messages_cs.po trans.cs = apps/i2ptunnel/locale-proxy/messages_cs.po
trans.de = apps/i2ptunnel/locale-proxy/messages_de.po trans.de = apps/i2ptunnel/locale-proxy/messages_de.po
trans.es = apps/i2ptunnel/locale-proxy/messages_es.po trans.es = apps/i2ptunnel/locale-proxy/messages_es.po
trans.fi = apps/i2ptunnel/locale-proxy/messages_fi.po
trans.fr = apps/i2ptunnel/locale-proxy/messages_fr.po trans.fr = apps/i2ptunnel/locale-proxy/messages_fr.po
trans.hu = apps/i2ptunnel/locale-proxy/messages_hu.po trans.hu = apps/i2ptunnel/locale-proxy/messages_hu.po
;; Java converts id to in ;; Java converts id to in
@ -45,6 +48,7 @@ trans.ro = apps/i2ptunnel/locale-proxy/messages_ro.po
trans.ru_RU = apps/i2ptunnel/locale-proxy/messages_ru.po trans.ru_RU = apps/i2ptunnel/locale-proxy/messages_ru.po
trans.sk = apps/i2ptunnel/locale-proxy/messages_sk.po trans.sk = apps/i2ptunnel/locale-proxy/messages_sk.po
trans.sv_SE = apps/i2ptunnel/locale-proxy/messages_sv.po trans.sv_SE = apps/i2ptunnel/locale-proxy/messages_sv.po
trans.tr_TR = apps/i2ptunnel/locale-proxy/messages_tr.po
trans.uk_UA = apps/i2ptunnel/locale-proxy/messages_uk.po trans.uk_UA = apps/i2ptunnel/locale-proxy/messages_uk.po
trans.vi = apps/i2ptunnel/locale-proxy/messages_vi.po trans.vi = apps/i2ptunnel/locale-proxy/messages_vi.po
trans.zh_CN = apps/i2ptunnel/locale-proxy/messages_zh.po trans.zh_CN = apps/i2ptunnel/locale-proxy/messages_zh.po
@ -76,6 +80,7 @@ trans.tr_TR = apps/routerconsole/locale/messages_tr.po
trans.uk_UA = apps/routerconsole/locale/messages_uk.po trans.uk_UA = apps/routerconsole/locale/messages_uk.po
trans.vi = apps/routerconsole/locale/messages_vi.po trans.vi = apps/routerconsole/locale/messages_vi.po
trans.zh_CN = apps/routerconsole/locale/messages_zh.po trans.zh_CN = apps/routerconsole/locale/messages_zh.po
trans.zh_TW = apps/routerconsole/locale/messages_zh_TW.po
[I2P.welcome] [I2P.welcome]
source_file = apps/routerconsole/locale-news/messages_en.po source_file = apps/routerconsole/locale-news/messages_en.po
@ -105,6 +110,7 @@ trans.sv_SE = apps/routerconsole/locale-news/messages_sv.po
trans.tr_TR = apps/routerconsole/locale-news/messages_tr.po trans.tr_TR = apps/routerconsole/locale-news/messages_tr.po
trans.uk_UA = apps/routerconsole/locale-news/messages_uk.po trans.uk_UA = apps/routerconsole/locale-news/messages_uk.po
trans.zh_CN = apps/routerconsole/locale-news/messages_zh.po trans.zh_CN = apps/routerconsole/locale-news/messages_zh.po
trans.zh_TW = apps/routerconsole/locale-news/messages_zh_TW.po
[I2P.countries] [I2P.countries]
type = PO type = PO
@ -116,6 +122,7 @@ trans.de = apps/routerconsole/locale-countries/messages_de.po
trans.el = apps/routerconsole/locale-countries/messages_el.po trans.el = apps/routerconsole/locale-countries/messages_el.po
trans.es = apps/routerconsole/locale-countries/messages_es.po trans.es = apps/routerconsole/locale-countries/messages_es.po
trans.et_EE = apps/routerconsole/locale-countries/messages_et.po trans.et_EE = apps/routerconsole/locale-countries/messages_et.po
trans.fa = apps/routerconsole/locale-countries/messages_fa.po
trans.fi = apps/routerconsole/locale-countries/messages_fi.po trans.fi = apps/routerconsole/locale-countries/messages_fi.po
trans.fr = apps/routerconsole/locale-countries/messages_fr.po trans.fr = apps/routerconsole/locale-countries/messages_fr.po
trans.hu = apps/routerconsole/locale-countries/messages_hu.po trans.hu = apps/routerconsole/locale-countries/messages_hu.po
@ -136,6 +143,7 @@ trans.uk_UA = apps/routerconsole/locale-countries/messages_uk.po
trans.tr_TR = apps/routerconsole/locale-countries/messages_tr.po trans.tr_TR = apps/routerconsole/locale-countries/messages_tr.po
trans.vi = apps/routerconsole/locale-countries/messages_vi.po trans.vi = apps/routerconsole/locale-countries/messages_vi.po
trans.zh_CN = apps/routerconsole/locale-countries/messages_zh.po trans.zh_CN = apps/routerconsole/locale-countries/messages_zh.po
trans.zh_TW = apps/routerconsole/locale-countries/messages_zh_TW.po
[I2P.i2psnark] [I2P.i2psnark]
source_file = apps/i2psnark/locale/messages_en.po source_file = apps/i2psnark/locale/messages_en.po
@ -144,18 +152,22 @@ trans.ar = apps/i2psnark/locale/messages_ar.po
trans.cs = apps/i2psnark/locale/messages_cs.po trans.cs = apps/i2psnark/locale/messages_cs.po
trans.de = apps/i2psnark/locale/messages_de.po trans.de = apps/i2psnark/locale/messages_de.po
trans.es = apps/i2psnark/locale/messages_es.po trans.es = apps/i2psnark/locale/messages_es.po
trans.fi = apps/i2psnark/locale/messages_fi.po
trans.fr = apps/i2psnark/locale/messages_fr.po trans.fr = apps/i2psnark/locale/messages_fr.po
trans.hu = apps/i2psnark/locale/messages_hu.po trans.hu = apps/i2psnark/locale/messages_hu.po
trans.it = apps/i2psnark/locale/messages_it.po trans.it = apps/i2psnark/locale/messages_it.po
trans.ja = apps/i2psnark/locale/messages_ja.po
trans.nb = apps/i2psnark/locale/messages_nb.po trans.nb = apps/i2psnark/locale/messages_nb.po
trans.nl = apps/i2psnark/locale/messages_nl.po trans.nl = apps/i2psnark/locale/messages_nl.po
trans.pl = apps/i2psnark/locale/messages_pl.po trans.pl = apps/i2psnark/locale/messages_pl.po
trans.pt = apps/i2psnark/locale/messages_pt.po trans.pt = apps/i2psnark/locale/messages_pt.po
trans.pt_BR = apps/i2psnark/locale/messages_pt_bR.po trans.pt_BR = apps/i2psnark/locale/messages_pt_BR.po
trans.ro = apps/i2psnark/locale/messages_ro.po trans.ro = apps/i2psnark/locale/messages_ro.po
trans.ru_RU = apps/i2psnark/locale/messages_ru.po trans.ru_RU = apps/i2psnark/locale/messages_ru.po
trans.sk = apps/i2psnark/locale/messages_sk.po trans.sk = apps/i2psnark/locale/messages_sk.po
trans.sv_SE = apps/i2psnark/locale/messages_sv.po trans.sv_SE = apps/i2psnark/locale/messages_sv.po
trans.tr_TR = apps/i2psnark/locale/messages_tr.po
trans.uk_UA = apps/i2psnark/locale/messages_uk.po
trans.vi = apps/i2psnark/locale/messages_vi.po trans.vi = apps/i2psnark/locale/messages_vi.po
trans.zh_CN = apps/i2psnark/locale/messages_zh.po trans.zh_CN = apps/i2psnark/locale/messages_zh.po
@ -168,6 +180,7 @@ trans.da = apps/susidns/locale/messages_da.po
trans.de = apps/susidns/locale/messages_de.po trans.de = apps/susidns/locale/messages_de.po
trans.el = apps/susidns/locale/messages_el.po trans.el = apps/susidns/locale/messages_el.po
trans.es = apps/susidns/locale/messages_es.po trans.es = apps/susidns/locale/messages_es.po
trans.fi = apps/susidns/locale/messages_fi.po
trans.fr = apps/susidns/locale/messages_fr.po trans.fr = apps/susidns/locale/messages_fr.po
trans.hu = apps/susidns/locale/messages_hu.po trans.hu = apps/susidns/locale/messages_hu.po
trans.it = apps/susidns/locale/messages_it.po trans.it = apps/susidns/locale/messages_it.po
@ -188,22 +201,33 @@ trans.zh_CN = apps/susidns/locale/messages_zh.po
source_file = apps/desktopgui/locale/messages_en.po source_file = apps/desktopgui/locale/messages_en.po
source_lang = en source_lang = en
trans.ar = apps/desktopgui/locale/messages_ar.po trans.ar = apps/desktopgui/locale/messages_ar.po
trans.bg = apps/desktopgui/locale/messages_bg.po
trans.ca = apps/desktopgui/locale/messages_ca.po
trans.cs = apps/desktopgui/locale/messages_cs.po trans.cs = apps/desktopgui/locale/messages_cs.po
trans.da = apps/desktopgui/locale/messages_da.po trans.da = apps/desktopgui/locale/messages_da.po
trans.de = apps/desktopgui/locale/messages_de.po trans.de = apps/desktopgui/locale/messages_de.po
trans.el = apps/desktopgui/locale/messages_el.po trans.el = apps/desktopgui/locale/messages_el.po
trans.es = apps/desktopgui/locale/messages_es.po trans.es = apps/desktopgui/locale/messages_es.po
trans.fa = apps/desktopgui/locale/messages_fa.po
trans.fi = apps/desktopgui/locale/messages_fi.po
trans.fr = apps/desktopgui/locale/messages_fr.po trans.fr = apps/desktopgui/locale/messages_fr.po
trans.hu = apps/desktopgui/locale/messages_hu.po trans.hu = apps/desktopgui/locale/messages_hu.po
;; Java converts id to in
trans.id = apps/desktopgui/locale/messages_in.po
trans.it = apps/desktopgui/locale/messages_it.po trans.it = apps/desktopgui/locale/messages_it.po
trans.ja = apps/desktopgui/locale/messages_ja.po trans.ja = apps/desktopgui/locale/messages_ja.po
trans.ko = apps/desktopgui/locale/messages_ko.po
trans.mg = apps/desktopgui/locale/messages_mg.po
trans.nb = apps/desktopgui/locale/messages_nb.po
trans.nl = apps/desktopgui/locale/messages_nl.po trans.nl = apps/desktopgui/locale/messages_nl.po
trans.pl = apps/desktopgui/locale/messages_pl.po trans.pl = apps/desktopgui/locale/messages_pl.po
trans.pt = apps/desktopgui/locale/messages_pt.po
trans.pt_BR = apps/desktopgui/locale/messages_pt_BR.po trans.pt_BR = apps/desktopgui/locale/messages_pt_BR.po
trans.ro = apps/desktopgui/locale/messages_ro.po trans.ro = apps/desktopgui/locale/messages_ro.po
trans.ru_RU = apps/desktopgui/locale/messages_ru.po trans.ru_RU = apps/desktopgui/locale/messages_ru.po
trans.sk = apps/desktopgui/locale/messages_sk.po trans.sk = apps/desktopgui/locale/messages_sk.po
trans.sv_SE = apps/desktopgui/locale/messages_sv.po trans.sv_SE = apps/desktopgui/locale/messages_sv.po
trans.sq = apps/desktopgui/locale/messages_sq.po
trans.uk_UA = apps/desktopgui/locale/messages_uk.po trans.uk_UA = apps/desktopgui/locale/messages_uk.po
trans.tr_TR = apps/desktopgui/locale/messages_tr.po trans.tr_TR = apps/desktopgui/locale/messages_tr.po
trans.vi = apps/desktopgui/locale/messages_vi.po trans.vi = apps/desktopgui/locale/messages_vi.po
@ -232,6 +256,7 @@ trans.ro = apps/susimail/locale/messages_ro.po
trans.ru_RU = apps/susimail/locale/messages_ru.po trans.ru_RU = apps/susimail/locale/messages_ru.po
trans.sq = apps/susimail/locale/messages_sq.po trans.sq = apps/susimail/locale/messages_sq.po
trans.sv_SE = apps/susimail/locale/messages_sv.po trans.sv_SE = apps/susimail/locale/messages_sv.po
trans.tr_TR = apps/susimail/locale/messages_tr.po
trans.uk_UA = apps/susimail/locale/messages_uk.po trans.uk_UA = apps/susimail/locale/messages_uk.po
trans.vi = apps/susimail/locale/messages_vi.po trans.vi = apps/susimail/locale/messages_vi.po
trans.zh_CN = apps/susimail/locale/messages_zh.po trans.zh_CN = apps/susimail/locale/messages_zh.po
@ -259,8 +284,8 @@ trans.ru_RU = debian/po/ru.po
trans.sk = debian/po/sk.po trans.sk = debian/po/sk.po
trans.sq = debian/po/sq.po trans.sq = debian/po/sq.po
trans.sv_SE = debian/po/sv.po trans.sv_SE = debian/po/sv.po
trans.uk_UA = debian/po/uk.po
trans.tr_TR = debian/po/tr.po trans.tr_TR = debian/po/tr.po
trans.uk_UA = debian/po/uk.po
trans.zh_CN = debian/po/zh.po trans.zh_CN = debian/po/zh.po
[I2P.i2prouter-script] [I2P.i2prouter-script]
@ -319,6 +344,8 @@ trans.ru_RU = core/java/src/gnu/getopt/MessagesBundle_ru.properties
trans.sk = core/java/src/gnu/getopt/MessagesBundle_sk.properties trans.sk = core/java/src/gnu/getopt/MessagesBundle_sk.properties
;; currently corrupt, non-UTF-8 ;; currently corrupt, non-UTF-8
;;trans.sq = core/java/src/gnu/getopt/MessagesBundle_sq.properties ;;trans.sq = core/java/src/gnu/getopt/MessagesBundle_sq.properties
;; currently corrupt, non-UTF-8
;;trans.tr_TR = core/java/src/gnu/getopt/MessagesBundle_tr.properties
trans.uk_UA = core/java/src/gnu/getopt/MessagesBundle_uk.properties trans.uk_UA = core/java/src/gnu/getopt/MessagesBundle_uk.properties
trans.zh_CN = core/java/src/gnu/getopt/MessagesBundle_zh.properties trans.zh_CN = core/java/src/gnu/getopt/MessagesBundle_zh.properties
@ -326,17 +353,22 @@ trans.zh_CN = core/java/src/gnu/getopt/MessagesBundle_zh.properties
source_file = apps/ministreaming/locale/messages_en.po source_file = apps/ministreaming/locale/messages_en.po
source_lang = en source_lang = en
trans.ca = apps/ministreaming/locale/messages_ca.po trans.ca = apps/ministreaming/locale/messages_ca.po
trans.cs = apps/ministreaming/locale/messages_cs.po
trans.de = apps/ministreaming/locale/messages_de.po trans.de = apps/ministreaming/locale/messages_de.po
trans.es = apps/ministreaming/locale/messages_es.po trans.es = apps/ministreaming/locale/messages_es.po
trans.fi = apps/ministreaming/locale/messages_fi.po
trans.fr = apps/ministreaming/locale/messages_fr.po trans.fr = apps/ministreaming/locale/messages_fr.po
;; Java converts id to in ;; Java converts id to in
trans.id = apps/ministreaming/locale/messages_in.po trans.id = apps/ministreaming/locale/messages_in.po
trans.it = apps/ministreaming/locale/messages_it.po trans.it = apps/ministreaming/locale/messages_it.po
trans.nb = apps/ministreaming/locale/messages_nb.po trans.nb = apps/ministreaming/locale/messages_nb.po
trans.nl = apps/ministreaming/locale/messages_nl.po
trans.pl = apps/ministreaming/locale/messages_pl.po trans.pl = apps/ministreaming/locale/messages_pl.po
trans.pt_BR = apps/ministreaming/locale/messages_pt_BR.po
trans.ro = apps/ministreaming/locale/messages_ro.po trans.ro = apps/ministreaming/locale/messages_ro.po
trans.ru_RU = apps/ministreaming/locale/messages_ru.po trans.ru_RU = apps/ministreaming/locale/messages_ru.po
trans.sv_SE = apps/ministreaming/locale/messages_sv.po trans.sv_SE = apps/ministreaming/locale/messages_sv.po
trans.tr_TR = apps/ministreaming/locale/messages_tr.po
trans.uk_UA = apps/ministreaming/locale/messages_uk.po trans.uk_UA = apps/ministreaming/locale/messages_uk.po
trans.zh_CN = apps/ministreaming/locale/messages_zh.po trans.zh_CN = apps/ministreaming/locale/messages_zh.po

View File

@ -7,6 +7,7 @@ Prerequisites to build from source:
Apache Ant 1.7.0 or higher Apache Ant 1.7.0 or higher
The xgettext, msgfmt, and msgmerge tools installed The xgettext, msgfmt, and msgmerge tools installed
from the GNU gettext package http://www.gnu.org/software/gettext/ from the GNU gettext package http://www.gnu.org/software/gettext/
Build environment must use a UTF-8 locale.
To build and install I2P from source, you must first build To build and install I2P from source, you must first build
and package up the appropriate installer by running: and package up the appropriate installer by running:

View File

@ -40,6 +40,10 @@ Public domain except as listed below:
Copyright (c) 2000 - 2004 The Legion Of The Bouncy Castle Copyright (c) 2000 - 2004 The Legion Of The Bouncy Castle
See licenses/LICENSE-SHA256.txt See licenses/LICENSE-SHA256.txt
ElGamal:
Copyright (c) 2000 - 2013 The Legion of the Bouncy Castle Inc. (http://www.bouncycastle.org)
See licenses/LICENSE-SHA256.txt
AES code: AES code:
Copyright (c) 1995-2005 The Cryptix Foundation Limited. Copyright (c) 1995-2005 The Cryptix Foundation Limited.
See licenses/LICENSE-Cryptix.txt See licenses/LICENSE-Cryptix.txt
@ -99,9 +103,14 @@ Public domain except as listed below:
http://creativecommons.org/licenses/by-sa/3.0/ http://creativecommons.org/licenses/by-sa/3.0/
This product includes GeoLite data created by MaxMind, available from http://www.maxmind.com/ This product includes GeoLite data created by MaxMind, available from http://www.maxmind.com/
GeoIP API 1.3.1:
See licenses/LICENSE-LGPLv2.1.txt
Installer: Installer:
Launch4j 3.0.1: Launch4j 3.0.1:
(Launch4j is only included in the upstream source package and Windows binaries.
Not applicable for non-Windows binaries or Debian/Launchpad packages.)
Copyright (c) 2004, 2008 Grzegorz Kowal Copyright (c) 2004, 2008 Grzegorz Kowal
See licenses/LICENSE-Launch4j.txt (in binary packages) See licenses/LICENSE-Launch4j.txt (in binary packages)
See installer/lib/launch4j/LICENSE.txt (in source packages) See installer/lib/launch4j/LICENSE.txt (in source packages)
@ -164,6 +173,10 @@ Applications:
Copyright (C) sponge Copyright (C) sponge
See licenses/COPYING-BOB.txt See licenses/COPYING-BOB.txt
Desktopgui
Copyright (c) Mathias De Maré
See licenses/LICENSE-DesktopGUI.txt
I2PSnark: I2PSnark:
Copyright (C) 2003 Mark J. Wielaard Copyright (C) 2003 Mark J. Wielaard
GPLv2 (or any later version) GPLv2 (or any later version)
@ -186,6 +199,17 @@ Applications:
By welterde. By welterde.
See licenses/LICENSE-GPLv2.txt See licenses/LICENSE-GPLv2.txt
Imagegen:
Identicon:
Copyright (c) 2007-2014 Don Park <donpark@docuverse.com>
See licenses/LICENSE-Identicon.txt
RandomArt:
Copyright (c) 2000, 2001 Markus Friedl. All rights reserved.
Copyright (c) 2008 Alexander von Gernler. All rights reserved.
See licenses/LICENSE-BSD.txt
Zxing:
See licenses/LICENSE-Apache2.0.txt
Jetty 8.1.17.v20150415: Jetty 8.1.17.v20150415:
See licenses/ABOUT-Jetty.html See licenses/ABOUT-Jetty.html
See licenses/NOTICE-Jetty.html See licenses/NOTICE-Jetty.html
@ -271,10 +295,6 @@ distributions. See the source package for the additional license information.
Copyright (C) sponge Copyright (C) sponge
DWTFYWTPL DWTFYWTPL
Desktopgui
Copyright (c) Mathias De Maré
See apps/desktopgui/LICENSE
SAM C Library: SAM C Library:
Copyright (c) 2004, Matthew P. Cashdollar <mpc@innographx.com> Copyright (c) 2004, Matthew P. Cashdollar <mpc@innographx.com>
See apps/sam/c/doc/license.txt See apps/sam/c/doc/license.txt

View File

@ -5,6 +5,7 @@ Prerequisites to build from source:
Apache Ant 1.7.0 or higher Apache Ant 1.7.0 or higher
The xgettext, msgfmt, and msgmerge tools installed The xgettext, msgfmt, and msgmerge tools installed
from the GNU gettext package http://www.gnu.org/software/gettext/ from the GNU gettext package http://www.gnu.org/software/gettext/
Build environment must use a UTF-8 locale.
To build: To build:
Full builds are not yet possible, but the command is: Full builds are not yet possible, but the command is:

13
apps/BOB/BOB.iml Normal file
View File

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4">
<component name="NewModuleRootManager" inherit-compiler-output="true">
<exclude-output />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="module" module-name="core" />
<orderEntry type="module" module-name="ministreaming" />
</component>
</module>

View File

@ -143,6 +143,7 @@ public class BOB implements Runnable, ClientApp {
* Stop BOB gracefully * Stop BOB gracefully
* @deprecated unused * @deprecated unused
*/ */
@Deprecated
public synchronized static void stop() { public synchronized static void stop() {
if (_bob != null) if (_bob != null)
_bob.shutdown(null); _bob.shutdown(null);

View File

@ -910,6 +910,8 @@ public class DoCMDS implements Runnable {
} else if (Command.equals(C_getnick)) { } else if (Command.equals(C_getnick)) {
// Get the NamedDB to work with... // Get the NamedDB to work with...
boolean nsfail = false;
try { try {
database.getReadLock(); database.getReadLock();
} catch (Exception ex) { } catch (Exception ex) {
@ -920,6 +922,7 @@ public class DoCMDS implements Runnable {
ns = true; ns = true;
} catch (RuntimeException b) { } catch (RuntimeException b) {
try { try {
nsfail = true;
nns(out); nns(out);
} catch (Exception ex) { } catch (Exception ex) {
try { try {
@ -932,7 +935,7 @@ public class DoCMDS implements Runnable {
} }
database.releaseReadLock(); database.releaseReadLock();
if (ns) { if (ns && !nsfail) {
try { try {
rlock(); rlock();
} catch (Exception e) { } catch (Exception e) {

View File

@ -36,6 +36,7 @@ import net.i2p.util.Log;
* @author sponge * @author sponge
* @deprecated incomplete, unused * @deprecated incomplete, unused
*/ */
@Deprecated
public class UDPIOthread implements I2PSessionListener, Runnable { public class UDPIOthread implements I2PSessionListener, Runnable {
private final NamedDB info; private final NamedDB info;

View File

@ -0,0 +1,25 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4">
<component name="FacetManager">
<facet type="web" name="Web">
<configuration>
<descriptors>
<deploymentDescriptor name="web.xml" url="file://$MODULE_DIR$/web.xml" />
</descriptors>
<webroots>
<root url="file://$MODULE_DIR$" relative="/WEB-INF" />
</webroots>
</configuration>
</facet>
</component>
<component name="NewModuleRootManager" inherit-compiler-output="true">
<exclude-output />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/java/src" isTestSource="false" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="library" name="jettylib" level="project" />
<orderEntry type="module" module-name="core" />
</component>
</module>

View File

@ -77,15 +77,15 @@
<!-- unused for now (except for Android), as we oddly ship addressbook as a .war --> <!-- unused for now (except for Android), as we oddly ship addressbook as a .war -->
<target name="jar" depends="compile, changes"> <target name="jar" depends="compile, changes">
<!-- set if unset --> <!-- set if unset -->
<property name="workspace.changes" value="" /> <property name="workspace.changes.tr" value="" />
<jar basedir="${build}" destfile="${dist}/${jar}"> <jar basedir="${build}" destfile="${dist}/${jar}">
<manifest> <manifest>
<attribute name="Main-Class" value="addressbook.Daemon"/> <attribute name="Main-Class" value="net.i2p.addressbook.Daemon"/>
<attribute name="Implementation-Version" value="${full.version}" /> <attribute name="Implementation-Version" value="${full.version}" />
<attribute name="Built-By" value="${build.built-by}" /> <attribute name="Built-By" value="${build.built-by}" />
<attribute name="Build-Date" value="${build.timestamp}" /> <attribute name="Build-Date" value="${build.timestamp}" />
<attribute name="Base-Revision" value="${workspace.version}" /> <attribute name="Base-Revision" value="${workspace.version}" />
<attribute name="Workspace-Changes" value="${workspace.changes}" /> <attribute name="Workspace-Changes" value="${workspace.changes.tr}" />
</manifest> </manifest>
</jar> </jar>
</target> </target>

View File

@ -30,6 +30,7 @@ import java.util.Map;
import java.util.regex.Pattern; import java.util.regex.Pattern;
import net.i2p.I2PAppContext; import net.i2p.I2PAppContext;
import net.i2p.client.naming.HostTxtEntry;
import net.i2p.util.EepGet; import net.i2p.util.EepGet;
import net.i2p.util.SecureFile; import net.i2p.util.SecureFile;
@ -38,14 +39,16 @@ import net.i2p.util.SecureFile;
* destinations. AddressBooks can be created from local and remote files, merged * destinations. AddressBooks can be created from local and remote files, merged
* together, and written out to local files. * together, and written out to local files.
* *
* Methods are NOT thread-safe.
*
* @author Ragnarok * @author Ragnarok
* *
*/ */
class AddressBook { class AddressBook implements Iterable<Map.Entry<String, HostTxtEntry>> {
private final String location; private final String location;
/** either addresses or subFile will be non-null, but not both */ /** either addresses or subFile will be non-null, but not both */
private final Map<String, String> addresses; private final Map<String, HostTxtEntry> addresses;
private final File subFile; private final File subFile;
private boolean modified; private boolean modified;
private static final boolean DEBUG = false; private static final boolean DEBUG = false;
@ -77,7 +80,7 @@ class AddressBook {
* A Map containing human readable addresses as keys, mapped to * A Map containing human readable addresses as keys, mapped to
* base64 i2p destinations. * base64 i2p destinations.
*/ */
public AddressBook(Map<String, String> addresses) { public AddressBook(Map<String, HostTxtEntry> addresses) {
this.addresses = addresses; this.addresses = addresses;
this.subFile = null; this.subFile = null;
this.location = null; this.location = null;
@ -107,7 +110,7 @@ class AddressBook {
new File("addressbook.tmp").delete(); new File("addressbook.tmp").delete();
} }
*/ */
static final long MAX_SUB_SIZE = 3 * 1024 * 1024l; //about 5,000 hosts static final long MAX_SUB_SIZE = 5 * 1024 * 1024l; //about 8,000 hosts
/** /**
* Construct an AddressBook from the Subscription subscription. If the * Construct an AddressBook from the Subscription subscription. If the
@ -128,7 +131,7 @@ class AddressBook {
* @param proxyPort port number of proxy * @param proxyPort port number of proxy
*/ */
public AddressBook(Subscription subscription, String proxyHost, int proxyPort) { public AddressBook(Subscription subscription, String proxyHost, int proxyPort) {
Map<String, String> a = null; Map<String, HostTxtEntry> a = null;
File subf = null; File subf = null;
try { try {
File tmp = SecureFile.createTempFile("addressbook", null, I2PAppContext.getGlobalContext().getTempDir()); File tmp = SecureFile.createTempFile("addressbook", null, I2PAppContext.getGlobalContext().getTempDir());
@ -165,26 +168,38 @@ class AddressBook {
*/ */
public AddressBook(File file) { public AddressBook(File file) {
this.location = file.toString(); this.location = file.toString();
Map<String, String> a; Map<String, HostTxtEntry> a;
try { try {
a = ConfigParser.parse(file); a = HostTxtParser.parse(file);
} catch (IOException exp) { } catch (IOException exp) {
a = new HashMap<String, String>(); a = new HashMap<String, HostTxtEntry>();
} }
this.addresses = a; this.addresses = a;
this.subFile = null; this.subFile = null;
} }
/**
* Test only.
*
* @param testsubfile path to a file containing the simulated fetch of a subscription
* @since 0.9.26
*/
public AddressBook(String testsubfile) {
this.location = testsubfile;
this.addresses = null;
this.subFile = new File(testsubfile);
}
/** /**
* Return an iterator over the addresses in the AddressBook. * Return an iterator over the addresses in the AddressBook.
* @since 0.8.7 * @since 0.8.7
*/ */
public Iterator<Map.Entry<String, String>> iterator() { public Iterator<Map.Entry<String, HostTxtEntry>> iterator() {
if (this.subFile != null) { if (this.subFile != null) {
try { try {
return new ConfigIterator(this.subFile); return new HostTxtIterator(this.subFile);
} catch (IOException ioe) { } catch (IOException ioe) {
return new ConfigIterator(); return new HostTxtIterator();
} }
} }
return this.addresses.entrySet().iterator(); return this.addresses.entrySet().iterator();
@ -229,7 +244,7 @@ class AddressBook {
/** /**
* Do basic validation of the hostname * Do basic validation of the hostname
* hostname was already converted to lower case by ConfigParser.parse() * hostname was already converted to lower case by HostTxtParser.parse()
*/ */
public static boolean isValidKey(String host) { public static boolean isValidKey(String host) {
return return
@ -291,15 +306,15 @@ class AddressBook {
public void merge(AddressBook other, boolean overwrite, Log log) { public void merge(AddressBook other, boolean overwrite, Log log) {
if (this.addresses == null) if (this.addresses == null)
throw new IllegalStateException(); throw new IllegalStateException();
for (Iterator<Map.Entry<String, String>> iter = other.iterator(); iter.hasNext(); ) { for (Iterator<Map.Entry<String, HostTxtEntry>> iter = other.iterator(); iter.hasNext(); ) {
Map.Entry<String, String> entry = iter.next(); Map.Entry<String, HostTxtEntry> entry = iter.next();
String otherKey = entry.getKey(); String otherKey = entry.getKey();
String otherValue = entry.getValue(); HostTxtEntry otherValue = entry.getValue();
if (isValidKey(otherKey) && isValidDest(otherValue)) { if (isValidKey(otherKey) && isValidDest(otherValue.getDest())) {
if (this.addresses.containsKey(otherKey) && !overwrite) { if (this.addresses.containsKey(otherKey) && !overwrite) {
if (DEBUG && log != null && if (DEBUG && log != null &&
!this.addresses.get(otherKey).equals(otherValue)) { !this.addresses.get(otherKey).equals(otherValue.getDest())) {
log.append("Conflict for " + otherKey + " from " log.append("Conflict for " + otherKey + " from "
+ other.location + other.location
+ ". Destination in remote address book is " + ". Destination in remote address book is "
@ -332,7 +347,7 @@ class AddressBook {
throw new IllegalStateException(); throw new IllegalStateException();
if (this.modified) { if (this.modified) {
try { try {
ConfigParser.write(this.addresses, file); HostTxtParser.write(this.addresses, file);
} catch (IOException exp) { } catch (IOException exp) {
System.err.println("Error writing addressbook " + file.getAbsolutePath() + " : " + exp.toString()); System.err.println("Error writing addressbook " + file.getAbsolutePath() + " : " + exp.toString());
} }

View File

@ -29,8 +29,8 @@ import java.io.IOException;
import java.io.InputStreamReader; import java.io.InputStreamReader;
import java.io.OutputStreamWriter; import java.io.OutputStreamWriter;
import java.io.StringReader; import java.io.StringReader;
import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.LinkedList;
import java.util.List; import java.util.List;
import java.util.Locale; import java.util.Locale;
import java.util.Map; import java.util.Map;
@ -44,8 +44,7 @@ import net.i2p.util.SystemVersion;
* Utility class providing methods to parse and write files in config file * Utility class providing methods to parse and write files in config file
* format, and subscription file format. * format, and subscription file format.
* *
* TODO: Change file encoding from default to UTF-8? * TODO: switch to the DataHelper loadProps/storeProps methods?
* Or switch to the DataHelper loadProps/storeProps methods?
* *
* @author Ragnarok * @author Ragnarok
*/ */
@ -88,20 +87,23 @@ class ConfigParser {
* if the BufferedReader cannot be read. * if the BufferedReader cannot be read.
* *
*/ */
public static Map<String, String> parse(BufferedReader input) throws IOException { private static Map<String, String> parse(BufferedReader input) throws IOException {
try {
Map<String, String> result = new HashMap<String, String>(); Map<String, String> result = new HashMap<String, String>();
String inputLine; String inputLine;
inputLine = input.readLine(); while ((inputLine = input.readLine()) != null) {
while (inputLine != null) {
inputLine = stripComments(inputLine); inputLine = stripComments(inputLine);
String[] splitLine = DataHelper.split(inputLine, "="); if (inputLine.length() == 0)
continue;
String[] splitLine = DataHelper.split(inputLine, "=", 2);
if (splitLine.length == 2) { if (splitLine.length == 2) {
result.put(splitLine[0].trim().toLowerCase(Locale.US), splitLine[1].trim()); result.put(splitLine[0].trim().toLowerCase(Locale.US), splitLine[1].trim());
} }
inputLine = input.readLine();
} }
input.close();
return result; return result;
} finally {
try { input.close(); } catch (IOException ioe) {}
}
} }
/** /**
@ -115,14 +117,20 @@ class ConfigParser {
* if file cannot be read. * if file cannot be read.
*/ */
public static Map<String, String> parse(File file) throws IOException { public static Map<String, String> parse(File file) throws IOException {
FileInputStream fileStream = new FileInputStream(file); FileInputStream fileStream = null;
try {
fileStream = new FileInputStream(file);
BufferedReader input = new BufferedReader(new InputStreamReader( BufferedReader input = new BufferedReader(new InputStreamReader(
fileStream, "UTF-8")); fileStream, "UTF-8"));
Map<String, String> rv = parse(input); Map<String, String> rv = parse(input);
return rv;
} finally {
if (fileStream != null) {
try { try {
fileStream.close(); fileStream.close();
} catch (IOException ioe) {} } catch (IOException ioe) {}
return rv; }
}
} }
/** /**
@ -135,11 +143,13 @@ class ConfigParser {
* @throws IOException * @throws IOException
* if file cannot be read. * if file cannot be read.
*/ */
/****
public static Map<String, String> parse(String string) throws IOException { public static Map<String, String> parse(String string) throws IOException {
StringReader stringReader = new StringReader(string); StringReader stringReader = new StringReader(string);
BufferedReader input = new BufferedReader(stringReader); BufferedReader input = new BufferedReader(stringReader);
return parse(input); return parse(input);
} }
****/
/** /**
* Return a Map using the contents of the File file. If file cannot be read, * Return a Map using the contents of the File file. If file cannot be read,
@ -179,19 +189,21 @@ class ConfigParser {
* @throws IOException * @throws IOException
* if input cannot be read. * if input cannot be read.
*/ */
public static List<String> parseSubscriptions(BufferedReader input) private static List<String> parseSubscriptions(BufferedReader input)
throws IOException { throws IOException {
List<String> result = new LinkedList<String>(); try {
String inputLine = input.readLine(); List<String> result = new ArrayList<String>(4);
while (inputLine != null) { String inputLine;
while ((inputLine = input.readLine()) != null) {
inputLine = stripComments(inputLine).trim(); inputLine = stripComments(inputLine).trim();
if (inputLine.length() > 0) { if (inputLine.length() > 0) {
result.add(inputLine); result.add(inputLine);
} }
inputLine = input.readLine();
} }
input.close();
return result; return result;
} finally {
try { input.close(); } catch (IOException ioe) {}
}
} }
/** /**
@ -203,15 +215,21 @@ class ConfigParser {
* @throws IOException * @throws IOException
* if file cannot be read. * if file cannot be read.
*/ */
public static List<String> parseSubscriptions(File file) throws IOException { private static List<String> parseSubscriptions(File file) throws IOException {
FileInputStream fileStream = new FileInputStream(file); FileInputStream fileStream = null;
try {
fileStream = new FileInputStream(file);
BufferedReader input = new BufferedReader(new InputStreamReader( BufferedReader input = new BufferedReader(new InputStreamReader(
fileStream, "UTF-8")); fileStream, "UTF-8"));
List<String> rv = parseSubscriptions(input); List<String> rv = parseSubscriptions(input);
return rv;
} finally {
if (fileStream != null) {
try { try {
fileStream.close(); fileStream.close();
} catch (IOException ioe) {} } catch (IOException ioe) {}
return rv; }
}
} }
/** /**
@ -223,11 +241,13 @@ class ConfigParser {
* @throws IOException * @throws IOException
* if string cannot be read. * if string cannot be read.
*/ */
/****
public static List<String> parseSubscriptions(String string) throws IOException { public static List<String> parseSubscriptions(String string) throws IOException {
StringReader stringReader = new StringReader(string); StringReader stringReader = new StringReader(string);
BufferedReader input = new BufferedReader(stringReader); BufferedReader input = new BufferedReader(stringReader);
return parseSubscriptions(input); return parseSubscriptions(input);
} }
****/
/** /**
* Return a List using the contents of the File file. If file cannot be * Return a List using the contents of the File file. If file cannot be
@ -277,12 +297,15 @@ class ConfigParser {
* @throws IOException * @throws IOException
* if the BufferedWriter cannot be written to. * if the BufferedWriter cannot be written to.
*/ */
public static void write(Map<String, String> map, BufferedWriter output) throws IOException { private static void write(Map<String, String> map, BufferedWriter output) throws IOException {
try {
for (Map.Entry<String, String> entry : map.entrySet()) { for (Map.Entry<String, String> entry : map.entrySet()) {
output.write(entry.getKey() + '=' + entry.getValue()); output.write(entry.getKey() + '=' + entry.getValue());
output.newLine(); output.newLine();
} }
output.close(); } finally {
try { output.close(); } catch (IOException ioe) {}
}
} }
/** /**
@ -327,13 +350,16 @@ class ConfigParser {
* @throws IOException * @throws IOException
* if output cannot be written to. * if output cannot be written to.
*/ */
public static void writeSubscriptions(List<String> list, BufferedWriter output) private static void writeSubscriptions(List<String> list, BufferedWriter output)
throws IOException { throws IOException {
try {
for (String s : list) { for (String s : list) {
output.write(s); output.write(s);
output.newLine(); output.newLine();
} }
output.close(); } finally {
try { output.close(); } catch (IOException ioe) {}
}
} }
/** /**
@ -347,7 +373,7 @@ class ConfigParser {
* @throws IOException * @throws IOException
* if output cannot be written to. * if output cannot be written to.
*/ */
public static void writeSubscriptions(List<String> list, File file) private static void writeSubscriptions(List<String> list, File file)
throws IOException { throws IOException {
writeSubscriptions(list, new BufferedWriter( writeSubscriptions(list, new BufferedWriter(
new OutputStreamWriter(new SecureFileOutputStream(file), "UTF-8"))); new OutputStreamWriter(new SecureFileOutputStream(file), "UTF-8")));

View File

@ -23,19 +23,21 @@ package net.i2p.addressbook;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.Iterator; import java.util.Iterator;
import java.util.LinkedList;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Properties; import java.util.Properties;
import java.util.Set; import java.util.Set;
import net.i2p.I2PAppContext; import net.i2p.I2PAppContext;
import net.i2p.client.naming.HostTxtEntry;
import net.i2p.client.naming.NamingService; import net.i2p.client.naming.NamingService;
import net.i2p.client.naming.SingleFileNamingService; import net.i2p.client.naming.SingleFileNamingService;
import net.i2p.data.DataFormatException; import net.i2p.data.DataFormatException;
import net.i2p.data.Destination; import net.i2p.data.Destination;
import net.i2p.util.OrderedProperties;
import net.i2p.util.SecureDirectory; import net.i2p.util.SecureDirectory;
import net.i2p.util.SystemVersion; import net.i2p.util.SystemVersion;
@ -53,6 +55,12 @@ public class Daemon {
private static final String DEFAULT_SUB = "http://i2p-projekt.i2p/hosts.txt"; private static final String DEFAULT_SUB = "http://i2p-projekt.i2p/hosts.txt";
/** @since 0.9.12 */ /** @since 0.9.12 */
static final String OLD_DEFAULT_SUB = "http://www.i2p2.i2p/hosts.txt"; static final String OLD_DEFAULT_SUB = "http://www.i2p2.i2p/hosts.txt";
/** Any properties we receive from the subscription, we store to the
* addressbook with this prefix, so it knows it's part of the signature.
* This is also chosen so that it can't be spoofed.
*/
private static final String RCVD_PROP_PREFIX = "=";
private static final boolean MUST_VALIDATE = false;
/** /**
* Update the router and published address books using remote data from the * Update the router and published address books using remote data from the
@ -80,10 +88,9 @@ public class Daemon {
*/ */
public static void update(AddressBook master, AddressBook router, public static void update(AddressBook master, AddressBook router,
File published, SubscriptionList subscriptions, Log log) { File published, SubscriptionList subscriptions, Log log) {
Iterator<AddressBook> iter = subscriptions.iterator(); for (AddressBook book : subscriptions) {
while (iter.hasNext()) {
// yes, the EepGet fetch() is done in next() // yes, the EepGet fetch() is done in next()
router.merge(iter.next(), false, log); router.merge(book, false, log);
} }
router.write(); router.write();
if (published != null) { if (published != null) {
@ -129,18 +136,22 @@ public class Daemon {
while (iter.hasNext()) { while (iter.hasNext()) {
// yes, the EepGet fetch() is done in next() // yes, the EepGet fetch() is done in next()
long start = System.currentTimeMillis(); long start = System.currentTimeMillis();
AddressBook sub = iter.next(); AddressBook addressbook = iter.next();
long end = System.currentTimeMillis();
// SubscriptionIterator puts in a dummy AddressBook with no location if no fetch is done // SubscriptionIterator puts in a dummy AddressBook with no location if no fetch is done
if (DEBUG && log != null && sub.getLocation() != null) if (DEBUG && log != null && addressbook.getLocation() != null) {
log.append("Fetch of " + sub.getLocation() + " took " + (end - start)); long end = System.currentTimeMillis();
log.append("Fetch of " + addressbook.getLocation() + " took " + (end - start));
start = end; start = end;
}
int old = 0, nnew = 0, invalid = 0, conflict = 0, total = 0; int old = 0, nnew = 0, invalid = 0, conflict = 0, total = 0;
for (Iterator<Map.Entry<String, String>> eIter = sub.iterator(); eIter.hasNext(); ) { int deleted = 0;
Map.Entry<String, String> entry = eIter.next(); for (Map.Entry<String, HostTxtEntry> entry : addressbook) {
total++;
// may be null for 'remove' entries
String key = entry.getKey(); String key = entry.getKey();
boolean isKnown; boolean isKnown;
Destination oldDest = null; // NOT set for text file NamingService
Destination oldDest;
if (isTextFile) { if (isTextFile) {
if (knownNames == null) { if (knownNames == null) {
// load the hostname set // load the hostname set
@ -148,22 +159,305 @@ public class Daemon {
opts.setProperty("file", "hosts.txt"); opts.setProperty("file", "hosts.txt");
knownNames = router.getNames(opts); knownNames = router.getNames(opts);
} }
isKnown = knownNames.contains(key); oldDest = null;
isKnown = key != null ? knownNames.contains(key) : null;
} else { } else {
oldDest = router.lookup(key); oldDest = key != null ? router.lookup(key) : null;
isKnown = oldDest != null; isKnown = oldDest != null;
} }
try { try {
if (!isKnown) { HostTxtEntry he = entry.getValue();
if (AddressBook.isValidKey(key)) { Properties hprops = he.getProps();
Destination dest = new Destination(entry.getValue()); boolean mustValidate = MUST_VALIDATE || hprops != null;
Properties props = new Properties(); String action = hprops != null ? hprops.getProperty(HostTxtEntry.PROP_ACTION) : null;
props.setProperty("s", sub.getLocation()); if (key == null && !he.hasValidRemoveSig()) {
if (log != null) {
log.append("Bad signature of action " + action + " for key " +
hprops.getProperty(HostTxtEntry.PROP_NAME) +
". From: " + addressbook.getLocation());
}
invalid++;
} else if (key != null && mustValidate && !he.hasValidSig()) {
if (log != null) {
log.append("Bad signature of action " + action + " for key " + key +
". From: " + addressbook.getLocation());
}
invalid++;
} else if (action != null || !isKnown) {
if (key != null && AddressBook.isValidKey(key)) {
Destination dest = new Destination(he.getDest());
Properties props = new OrderedProperties();
props.setProperty("s", addressbook.getLocation());
boolean allowExistingKeyInPublished = false;
if (mustValidate) {
// sig checked above
props.setProperty("v", "true");
}
if (hprops != null) {
// merge in all the received properties
for (Map.Entry<Object, Object> e : hprops.entrySet()) {
// Add prefix to indicate received property
props.setProperty(RCVD_PROP_PREFIX + e.getKey(), (String) e.getValue());
}
}
if (action != null) {
// Process commands. hprops is non-null.
// Must handle isKnown in each case.
if (action.equals(HostTxtEntry.ACTION_ADDDEST)) {
// Add an alternate destination (new crypto) for existing hostname
// Requires new NamingService support if the key exists
String polddest = hprops.getProperty(HostTxtEntry.PROP_OLDDEST);
if (polddest != null) {
Destination pod = new Destination(polddest);
List<Destination> pod2 = router.lookupAll(key);
if (pod2 == null) {
// we didn't know it before, so we'll add it
// check inner sig anyway
if (!he.hasValidInnerSig()) {
logInner(log, action, key, addressbook);
invalid++;
continue;
}
} else if (pod2.contains(dest)) {
// we knew it before, with the same dest
old++;
continue;
} else if (pod2.contains(pod)) {
// checks out, so verify the inner sig
if (!he.hasValidInnerSig()) {
logInner(log, action, key, addressbook);
invalid++;
continue;
}
// TODO Requires NamingService support
// if (isTextFile), do we replace or not? check sigType.isAvailable()
boolean success = router.addDestination(key, dest, props);
if (log != null) {
if (success)
log.append("Additional address for " + key +
" added to address book. From: " + addressbook.getLocation());
else
log.append("Failed to add additional address for " + key +
" From: " + addressbook.getLocation());
}
// now update the published addressbook
// ditto
if (published != null) {
if (publishedNS == null)
publishedNS = new SingleFileNamingService(I2PAppContext.getGlobalContext(), published.getAbsolutePath());
// FIXME this fails, no support in SFNS
success = publishedNS.addDestination(key, dest, props);
if (log != null && !success)
log.append("Add to published address book " + published.getAbsolutePath() + " failed for " + key);
}
nnew++;
continue;
} else {
// mismatch, disallow
logMismatch(log, action, key, pod2, he.getDest(), addressbook);
invalid++;
continue;
}
} else {
logMissing(log, action, key, addressbook);
invalid++;
continue;
}
} else if (action.equals(HostTxtEntry.ACTION_ADDNAME)) {
// Add an alias for an existing hostname, same dest
if (isKnown) {
// could be same or different dest
old++;
continue;
}
String poldname = hprops.getProperty(HostTxtEntry.PROP_OLDNAME);
if (poldname != null) {
List<Destination> pod = router.lookupAll(poldname);
if (pod == null) {
// we didn't have the old one, so we'll add the new one
} else if (pod.contains(dest)) {
// checks out, so we'll add the new one
} else {
// mismatch, disallow
logMismatch(log, action, key, pod, he.getDest(), addressbook);
invalid++;
continue;
}
} else {
logMissing(log, action, key, addressbook);
invalid++;
continue;
}
} else if (action.equals(HostTxtEntry.ACTION_ADDSUBDOMAIN)) {
// add a subdomain with verification
if (isKnown) {
old++;
continue;
}
String polddest = hprops.getProperty(HostTxtEntry.PROP_OLDDEST);
String poldname = hprops.getProperty(HostTxtEntry.PROP_OLDNAME);
if (polddest != null && poldname != null) {
// check for valid subdomain
if (!AddressBook.isValidKey(poldname) ||
key.indexOf('.' + poldname) <= 0) {
if (log != null)
log.append("Action: " + action + " failed because" +
" old name " + poldname +
" is invalid" +
". From: " + addressbook.getLocation());
invalid++;
continue;
}
Destination pod = new Destination(polddest);
List<Destination> pod2 = router.lookupAll(poldname);
if (pod2 == null) {
// we didn't have the old name
// check inner sig anyway
if (!he.hasValidInnerSig()) {
logInner(log, action, key, addressbook);
invalid++;
continue;
}
} else if (pod2.contains(pod)) {
// checks out, so verify the inner sig
if (!he.hasValidInnerSig()) {
logInner(log, action, key, addressbook);
invalid++;
continue;
}
} else {
// mismatch, disallow
logMismatch(log, action, key, pod2, polddest, addressbook);
invalid++;
continue;
}
} else {
logMissing(log, action, key, addressbook);
invalid++;
continue;
}
} else if (action.equals(HostTxtEntry.ACTION_CHANGEDEST)) {
// change destination on an existing entry
// This removes all previous destinations under that hostname,
// is this what we want?
String polddest = hprops.getProperty(HostTxtEntry.PROP_OLDDEST);
if (polddest != null) {
Destination pod = new Destination(polddest);
List<Destination> pod2 = router.lookupAll(key);
if (pod2 == null) {
// we didn't have the old name
// check inner sig anyway
if (!he.hasValidInnerSig()) {
logInner(log, action, key, addressbook);
invalid++;
continue;
}
} else if (pod2.contains(dest)) {
// we already have the new dest
old++;
continue;
} else if (pod2.contains(pod)) {
// checks out, so verify the inner sig
if (!he.hasValidInnerSig()) {
logInner(log, action, key, addressbook);
invalid++;
continue;
}
if (log != null) {
if (pod2.size() == 1)
log.append("Changing destination for " + key +
". From: " + addressbook.getLocation());
else
log.append("Replacing " + pod2.size() + " destinations for " + key +
". From: " + addressbook.getLocation());
}
allowExistingKeyInPublished = true;
props.setProperty("m", Long.toString(I2PAppContext.getGlobalContext().clock().now()));
} else {
// mismatch, disallow
logMismatch(log, action, key, pod2, polddest, addressbook);
invalid++;
continue;
}
} else {
logMissing(log, action, key, addressbook);
invalid++;
continue;
}
} else if (action.equals(HostTxtEntry.ACTION_CHANGENAME)) {
// Delete old name, replace with new
// This removes all previous destinations under that hostname,
// is this what we want?
if (isKnown) {
old++;
continue;
}
String poldname = hprops.getProperty(HostTxtEntry.PROP_OLDNAME);
if (poldname != null) {
List<Destination> pod = router.lookupAll(poldname);
if (pod == null) {
// we didn't have the old name
} else if (pod.contains(dest)) {
// checks out, so we'll delete it
if (knownNames != null)
knownNames.remove(poldname);
boolean success = router.remove(poldname, dest);
if (success)
deleted++;
if (log != null) {
if (success)
log.append("Removed: " + poldname +
" to be replaced with " + key +
". From: " + addressbook.getLocation());
else
log.append("Remove failed for: " + poldname +
" to be replaced with " + key +
". From: " + addressbook.getLocation());
}
// now update the published addressbook
if (published != null) {
if (publishedNS == null)
publishedNS = new SingleFileNamingService(I2PAppContext.getGlobalContext(), published.getAbsolutePath());
success = publishedNS.remove(poldname, dest);
if (log != null && !success)
log.append("Remove from published address book " + published.getAbsolutePath() + " failed for " + poldname);
}
} else {
// mismatch, disallow
logMismatch(log, action, key, pod, he.getDest(), addressbook);
continue;
}
} else {
logMissing(log, action, key, addressbook);
invalid++;
continue;
}
} else if (action.equals(HostTxtEntry.ACTION_REMOVE) ||
action.equals(HostTxtEntry.ACTION_REMOVEALL)) {
// w/o name=dest handled below
if (log != null)
log.append("Action: " + action + " with name=dest invalid" +
". From: " + addressbook.getLocation());
invalid++;
continue;
} else if (action.equals(HostTxtEntry.ACTION_UPDATE)) {
if (isKnown) {
allowExistingKeyInPublished = true;
props.setProperty("m", Long.toString(I2PAppContext.getGlobalContext().clock().now()));
}
} else {
if (log != null)
log.append("Action: " + action + " unrecognized" +
". From: " + addressbook.getLocation());
invalid++;
continue;
}
} // action != null
boolean success = router.put(key, dest, props); boolean success = router.put(key, dest, props);
if (log != null) { if (log != null) {
if (success) if (success)
log.append("New address " + key + log.append("New address " + key +
" added to address book. From: " + sub.getLocation()); " added to address book. From: " + addressbook.getLocation());
else else
log.append("Save to naming service " + router + " failed for new key " + key); log.append("Save to naming service " + router + " failed for new key " + key);
} }
@ -171,59 +465,236 @@ public class Daemon {
if (published != null) { if (published != null) {
if (publishedNS == null) if (publishedNS == null)
publishedNS = new SingleFileNamingService(I2PAppContext.getGlobalContext(), published.getAbsolutePath()); publishedNS = new SingleFileNamingService(I2PAppContext.getGlobalContext(), published.getAbsolutePath());
success = publishedNS.putIfAbsent(key, dest); if (allowExistingKeyInPublished)
success = publishedNS.put(key, dest, props);
else
success = publishedNS.putIfAbsent(key, dest, props);
if (log != null && !success) { if (log != null && !success) {
try { log.append("Save to published address book " + published.getAbsolutePath() + " failed for new key " + key);
log.append("Save to published address book " + published.getCanonicalPath() + " failed for new key " + key);
} catch (IOException ioe) {}
} }
} }
if (isTextFile) if (isTextFile)
// keep track for later dup check // keep track for later dup check
knownNames.add(key); knownNames.add(key);
nnew++; nnew++;
} else if (log != null) { } else if (key == null) {
log.append("Bad hostname " + key + " from " // 'remove' actions
+ sub.getLocation()); // isKnown is false
if (action != null) {
// Process commands. hprops is non-null.
if (action.equals(HostTxtEntry.ACTION_REMOVE)) {
// delete this entry
String polddest = hprops.getProperty(HostTxtEntry.PROP_DEST);
String poldname = hprops.getProperty(HostTxtEntry.PROP_NAME);
if (polddest != null && poldname != null) {
Destination pod = new Destination(polddest);
List<Destination> pod2 = router.lookupAll(poldname);
if (pod2 != null && pod2.contains(pod)) {
if (knownNames != null && pod2.size() == 1)
knownNames.remove(poldname);
boolean success = router.remove(poldname, pod);
if (success)
deleted++;
if (log != null) {
if (success)
log.append("Removed: " + poldname +
" as requested" +
". From: " + addressbook.getLocation());
else
log.append("Remove failed for: " + poldname +
" as requested" +
". From: " + addressbook.getLocation());
}
// now update the published addressbook
if (published != null) {
if (publishedNS == null)
publishedNS = new SingleFileNamingService(I2PAppContext.getGlobalContext(), published.getAbsolutePath());
success = publishedNS.remove(poldname, pod);
if (log != null && !success)
log.append("Remove from published address book " + published.getAbsolutePath() + " failed for " + poldname);
}
} else if (pod2 != null) {
// mismatch, disallow
logMismatch(log, action, key, pod2, polddest, addressbook);
invalid++;
} else {
old++;
}
} else {
logMissing(log, action, "delete", addressbook);
invalid++; invalid++;
} }
} else if (action.equals(HostTxtEntry.ACTION_REMOVEALL)) {
// delete all entries with this destination
String polddest = hprops.getProperty(HostTxtEntry.PROP_DEST);
// oldname is optional, but nice because not all books support reverse lookup
if (polddest != null) {
Destination pod = new Destination(polddest);
String poldname = hprops.getProperty(HostTxtEntry.PROP_NAME);
if (poldname != null) {
List<Destination> pod2 = router.lookupAll(poldname);
if (pod2 != null && pod2.contains(pod)) {
if (knownNames != null)
knownNames.remove(poldname);
boolean success = router.remove(poldname, pod);
if (success)
deleted++;
if (log != null) {
if (success)
log.append("Removed: " + poldname +
" as requested" +
". From: " + addressbook.getLocation());
else
log.append("Remove failed for: " + poldname +
" as requested" +
". From: " + addressbook.getLocation());
}
// now update the published addressbook
if (published != null) {
if (publishedNS == null)
publishedNS = new SingleFileNamingService(I2PAppContext.getGlobalContext(), published.getAbsolutePath());
success = publishedNS.remove(poldname, pod);
if (log != null && !success)
log.append("Remove from published address book " + published.getAbsolutePath() + " failed for " + poldname);
}
} else if (pod2 != null) {
// mismatch, disallow
logMismatch(log, action, key, pod2, polddest, addressbook);
invalid++;
} else {
old++;
}
}
// reverse lookup, delete all
List<String> revs = router.reverseLookupAll(pod);
if (revs != null) {
for (String rev : revs) {
if (knownNames != null)
knownNames.remove(rev);
boolean success = router.remove(rev, pod);
if (success)
deleted++;
if (log != null) {
if (success)
log.append("Removed: " + rev +
" as requested" +
". From: " + addressbook.getLocation());
else
log.append("Remove failed for: " + rev +
" as requested" +
". From: " + addressbook.getLocation());
}
// now update the published addressbook
if (published != null) {
if (publishedNS == null)
publishedNS = new SingleFileNamingService(I2PAppContext.getGlobalContext(), published.getAbsolutePath());
success = publishedNS.remove(rev, pod);
if (log != null && !success)
log.append("Remove from published address book " + published.getAbsolutePath() + " failed for " + rev);
}
}
}
} else {
logMissing(log, action, "delete", addressbook);
invalid++;
}
} else {
if (log != null)
log.append("Action: " + action + " w/o name=dest unrecognized" +
". From: " + addressbook.getLocation());
invalid++;
}
continue;
} else {
if (log != null)
log.append("No action in command line" +
". From: " + addressbook.getLocation());
invalid++;
continue;
}
} else if (log != null) {
log.append("Bad hostname " + key + ". From: "
+ addressbook.getLocation());
invalid++;
}
/****
} else if (false && DEBUG && log != null) { } else if (false && DEBUG && log != null) {
// lookup the conflict if we haven't yet (O(n**2) for text file) // lookup the conflict if we haven't yet (O(n**2) for text file)
if (isTextFile) if (isTextFile)
oldDest = router.lookup(key); oldDest = router.lookup(key);
if (oldDest != null && !oldDest.toBase64().equals(entry.getValue())) { if (oldDest != null && !oldDest.toBase64().equals(entry.getValue())) {
log.append("Conflict for " + key + " from " log.append("Conflict for " + key + ". From: "
+ sub.getLocation() + addressbook.getLocation()
+ ". Destination in remote address book is " + ". Destination in remote address book is "
+ entry.getValue()); + entry.getValue());
conflict++; conflict++;
} else { } else {
old++; old++;
} }
****/
} else { } else {
old++; old++;
} }
} catch (DataFormatException dfe) { } catch (DataFormatException dfe) {
if (log != null) if (log != null)
log.append("Invalid b64 for " + key + " From: " + sub.getLocation()); log.append("Invalid b64 for " + key + " From: " + addressbook.getLocation());
invalid++; invalid++;
} }
total++;
} }
if (DEBUG && log != null && total > 0) { if (DEBUG && log != null && total > 0) {
log.append("Merge of " + sub.getLocation() + " into " + router + log.append("Merge of " + addressbook.getLocation() + " into " + router +
" took " + (System.currentTimeMillis() - start) + " ms with " + " took " + (System.currentTimeMillis() - start) + " ms with " +
total + " total, " + total + " total, " +
nnew + " new, " + nnew + " new, " +
old + " old, " + old + " old, " +
deleted + " deleted, " +
invalid + " invalid, " + invalid + " invalid, " +
conflict + " conflicts"); conflict + " conflicts");
} } // entries
sub.delete(); addressbook.delete();
} } // subscriptions
subscriptions.write(); subscriptions.write();
} }
/** @since 0.9.26 */
private static void logInner(Log log, String action, String name, AddressBook addressbook) {
if (log != null) {
log.append("Action: " + action + " failed because" +
" inner signature for key " + name +
" failed" +
". From: " + addressbook.getLocation());
}
}
/** @since 0.9.26 */
private static void logMissing(Log log, String action, String name, AddressBook addressbook) {
if (log != null) {
log.append("Action: " + action + " for " + name +
" failed, missing required parameters" +
". From: " + addressbook.getLocation());
}
}
/** @since 0.9.26 */
private static void logMismatch(Log log, String action, String name, List<Destination> dests,
String olddest, AddressBook addressbook) {
if (log != null) {
StringBuilder buf = new StringBuilder(16);
final int sz = dests.size();
for (int i = 0; i < sz; i++) {
buf.append(dests.get(i).toBase64().substring(0, 6));
if (i != sz - 1)
buf.append(", ");
}
log.append("Action: " + action + " failed because" +
" destinations for " + name +
" (" + buf + ')' +
" do not include" +
" (" + olddest.substring(0, 6) + ')' +
". From: " + addressbook.getLocation());
}
}
/** /**
* Run an update, using the Map settings to provide the parameters. * Run an update, using the Map settings to provide the parameters.
* *
@ -236,16 +707,12 @@ public class Daemon {
File published = null; File published = null;
boolean should_publish = Boolean.parseBoolean(settings.get("should_publish")); boolean should_publish = Boolean.parseBoolean(settings.get("should_publish"));
if (should_publish) if (should_publish)
published = new File(home, settings published = new File(home, settings.get("published_addressbook"));
.get("published_addressbook")); File subscriptionFile = new File(home, settings.get("subscriptions"));
File subscriptionFile = new File(home, settings
.get("subscriptions"));
File logFile = new File(home, settings.get("log")); File logFile = new File(home, settings.get("log"));
File etagsFile = new File(home, settings.get("etags")); File etagsFile = new File(home, settings.get("etags"));
File lastModifiedFile = new File(home, settings File lastModifiedFile = new File(home, settings.get("last_modified"));
.get("last_modified")); File lastFetchedFile = new File(home, settings.get("last_fetched"));
File lastFetchedFile = new File(home, settings
.get("last_fetched"));
long delay; long delay;
try { try {
delay = Long.parseLong(settings.get("update_delay")); delay = Long.parseLong(settings.get("update_delay"));
@ -254,13 +721,14 @@ public class Daemon {
} }
delay *= 60 * 60 * 1000; delay *= 60 * 60 * 1000;
List<String> defaultSubs = new LinkedList<String>(); List<String> defaultSubs = new ArrayList<String>(4);
// defaultSubs.add("http://i2p/NF2RLVUxVulR3IqK0sGJR0dHQcGXAzwa6rEO4WAWYXOHw-DoZhKnlbf1nzHXwMEJoex5nFTyiNMqxJMWlY54cvU~UenZdkyQQeUSBZXyuSweflUXFqKN-y8xIoK2w9Ylq1k8IcrAFDsITyOzjUKoOPfVq34rKNDo7fYyis4kT5bAHy~2N1EVMs34pi2RFabATIOBk38Qhab57Umpa6yEoE~rbyR~suDRvD7gjBvBiIKFqhFueXsR2uSrPB-yzwAGofTXuklofK3DdKspciclTVzqbDjsk5UXfu2nTrC1agkhLyqlOfjhyqC~t1IXm-Vs2o7911k7KKLGjB4lmH508YJ7G9fLAUyjuB-wwwhejoWqvg7oWvqo4oIok8LG6ECR71C3dzCvIjY2QcrhoaazA9G4zcGMm6NKND-H4XY6tUWhpB~5GefB3YczOqMbHq4wi0O9MzBFrOJEOs3X4hwboKWANf7DT5PZKJZ5KorQPsYRSq0E3wSOsFCSsdVCKUGsAAAA/i2p/hosts.txt"); // defaultSubs.add("http://i2p/NF2RLVUxVulR3IqK0sGJR0dHQcGXAzwa6rEO4WAWYXOHw-DoZhKnlbf1nzHXwMEJoex5nFTyiNMqxJMWlY54cvU~UenZdkyQQeUSBZXyuSweflUXFqKN-y8xIoK2w9Ylq1k8IcrAFDsITyOzjUKoOPfVq34rKNDo7fYyis4kT5bAHy~2N1EVMs34pi2RFabATIOBk38Qhab57Umpa6yEoE~rbyR~suDRvD7gjBvBiIKFqhFueXsR2uSrPB-yzwAGofTXuklofK3DdKspciclTVzqbDjsk5UXfu2nTrC1agkhLyqlOfjhyqC~t1IXm-Vs2o7911k7KKLGjB4lmH508YJ7G9fLAUyjuB-wwwhejoWqvg7oWvqo4oIok8LG6ECR71C3dzCvIjY2QcrhoaazA9G4zcGMm6NKND-H4XY6tUWhpB~5GefB3YczOqMbHq4wi0O9MzBFrOJEOs3X4hwboKWANf7DT5PZKJZ5KorQPsYRSq0E3wSOsFCSsdVCKUGsAAAA/i2p/hosts.txt");
defaultSubs.add(DEFAULT_SUB); defaultSubs.add(DEFAULT_SUB);
SubscriptionList subscriptions = new SubscriptionList(subscriptionFile, SubscriptionList subscriptions = new SubscriptionList(subscriptionFile,
etagsFile, lastModifiedFile, lastFetchedFile, delay, defaultSubs, settings etagsFile, lastModifiedFile, lastFetchedFile,
.get("proxy_host"), Integer.parseInt(settings.get("proxy_port"))); delay, defaultSubs, settings.get("proxy_host"),
Integer.parseInt(settings.get("proxy_port")));
Log log = SystemVersion.isAndroid() ? null : new Log(logFile); Log log = SystemVersion.isAndroid() ? null : new Log(logFile);
// If false, add hosts via naming service; if true, write hosts.txt file directly // If false, add hosts via naming service; if true, write hosts.txt file directly
@ -319,9 +787,26 @@ public class Daemon {
* others are ignored. * others are ignored.
*/ */
public static void main(String[] args) { public static void main(String[] args) {
if (args != null && args.length > 0 && args[0].equals("test"))
_instance.test(args);
else
_instance.run(args); _instance.run(args);
} }
/** @since 0.9.26 */
private static void test(String[] args) {
Properties ctxProps = new Properties();
String PROP_FORCE = "i2p.naming.blockfile.writeInAppContext";
ctxProps.setProperty(PROP_FORCE, "true");
I2PAppContext ctx = new I2PAppContext(ctxProps);
NamingService ns = getNamingService("hosts.txt");
File published = new File("test-published.txt");
Log log = new Log(new File("test-log.txt"));
SubscriptionList subscriptions = new SubscriptionList("test-sub.txt");
update(ns, published, subscriptions, log);
ctx.logManager().flush();
}
public void run(String[] args) { public void run(String[] args) {
_running = true; _running = true;
String settingsLocation = "config.txt"; String settingsLocation = "config.txt";

View File

@ -35,7 +35,7 @@ import net.i2p.util.I2PAppThread;
*/ */
public class DaemonThread extends I2PAppThread implements NamingServiceUpdater { public class DaemonThread extends I2PAppThread implements NamingServiceUpdater {
private String[] args; private final String[] args;
/** /**
* Construct a DaemonThread with the command line arguments args. * Construct a DaemonThread with the command line arguments args.

View File

@ -32,6 +32,7 @@ import java.util.Locale;
import java.util.Map; import java.util.Map;
import java.util.NoSuchElementException; import java.util.NoSuchElementException;
import net.i2p.client.naming.HostTxtEntry;
import net.i2p.data.DataHelper; import net.i2p.data.DataHelper;
/** /**
@ -42,22 +43,25 @@ import net.i2p.data.DataHelper;
* Callers should iterate all the way through or call close() * Callers should iterate all the way through or call close()
* to ensure the underlying stream is closed. * to ensure the underlying stream is closed.
* *
* @since 0.8.7 * This is not used for config files.
* It is only used for subscriptions.
*
* @since 0.8.7, renamed from ConfigIterator in 0.9.26
*/ */
class ConfigIterator implements Iterator<Map.Entry<String, String>>, Closeable { class HostTxtIterator implements Iterator<Map.Entry<String, HostTxtEntry>>, Closeable {
private BufferedReader input; private BufferedReader input;
private ConfigEntry next; private MapEntry next;
/** /**
* A dummy iterator in which hasNext() is always false. * A dummy iterator in which hasNext() is always false.
*/ */
public ConfigIterator() {} public HostTxtIterator() {}
/** /**
* An iterator over the key/value pairs in the file. * An iterator over the key/value pairs in the file.
*/ */
public ConfigIterator(File file) throws IOException { public HostTxtIterator(File file) throws IOException {
FileInputStream fileStream = new FileInputStream(file); FileInputStream fileStream = new FileInputStream(file);
input = new BufferedReader(new InputStreamReader(fileStream, "UTF-8")); input = new BufferedReader(new InputStreamReader(fileStream, "UTF-8"));
} }
@ -68,16 +72,14 @@ class ConfigIterator implements Iterator<Map.Entry<String, String>>, Closeable {
if (next != null) if (next != null)
return true; return true;
try { try {
String inputLine = input.readLine(); String inputLine;
while (inputLine != null) { while ((inputLine = input.readLine()) != null) {
inputLine = ConfigParser.stripComments(inputLine); HostTxtEntry he = HostTxtParser.parse(inputLine, true);
String[] splitLine = DataHelper.split(inputLine, "="); if (he == null)
if (splitLine.length == 2) { continue;
next = new ConfigEntry(splitLine[0].trim().toLowerCase(Locale.US), splitLine[1].trim()); next = new MapEntry(he.getName(), he);
return true; return true;
} }
inputLine = input.readLine();
}
} catch (IOException ioe) {} } catch (IOException ioe) {}
try { input.close(); } catch (IOException ioe) {} try { input.close(); } catch (IOException ioe) {}
input = null; input = null;
@ -85,10 +87,15 @@ class ConfigIterator implements Iterator<Map.Entry<String, String>>, Closeable {
return false; return false;
} }
public Map.Entry<String, String> next() { /**
* 'remove' entries will be returned with a null key,
* and the value will contain a null name, null dest,
* and non-null props.
*/
public Map.Entry<String, HostTxtEntry> next() {
if (!hasNext()) if (!hasNext())
throw new NoSuchElementException(); throw new NoSuchElementException();
Map.Entry<String, String> rv = next; Map.Entry<String, HostTxtEntry> rv = next;
next = null; next = null;
return rv; return rv;
} }
@ -111,11 +118,11 @@ class ConfigIterator implements Iterator<Map.Entry<String, String>>, Closeable {
/** /**
* The object returned by the iterator. * The object returned by the iterator.
*/ */
private static class ConfigEntry implements Map.Entry<String, String> { private static class MapEntry implements Map.Entry<String, HostTxtEntry> {
private final String key; private final String key;
private final String value; private final HostTxtEntry value;
public ConfigEntry(String k, String v) { public MapEntry(String k, HostTxtEntry v) {
key = k; key = k;
value = v; value = v;
} }
@ -124,11 +131,11 @@ class ConfigIterator implements Iterator<Map.Entry<String, String>>, Closeable {
return key; return key;
} }
public String getValue() { public HostTxtEntry getValue() {
return value; return value;
} }
public String setValue(String v) { public HostTxtEntry setValue(HostTxtEntry v) {
throw new UnsupportedOperationException(); throw new UnsupportedOperationException();
} }

View File

@ -0,0 +1,250 @@
package net.i2p.addressbook;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import net.i2p.client.naming.HostTxtEntry;
import net.i2p.data.DataHelper;
import net.i2p.util.SecureFile;
import net.i2p.util.SecureFileOutputStream;
import net.i2p.util.SystemVersion;
/**
* Utility class providing methods to parse and write files in a hosts.txt file
* format, and subscription file format.
*
* @since 0.9.26 modified from ConfigParser
*/
class HostTxtParser {
private static final boolean isWindows = SystemVersion.isWindows();
/**
* Return a Map using the contents of BufferedReader input. input must have
* a single key, value pair on each line, in the format: key=value. Lines
* starting with '#' or ';' are considered comments, and ignored. Lines that
* are obviously not in the format key=value are also ignored.
* The key is converted to lower case.
*
* Returned map will not contain null ("remove") entries.
*
* @param input
* A BufferedReader with lines in key=value format to parse into
* a Map.
* @return A Map containing the key, value pairs from input.
* @throws IOException
* if the BufferedReader cannot be read.
*
*/
private static Map<String, HostTxtEntry> parse(BufferedReader input) throws IOException {
try {
Map<String, HostTxtEntry> result = new HashMap<String, HostTxtEntry>();
String inputLine;
while ((inputLine = input.readLine()) != null) {
HostTxtEntry he = parse(inputLine, false);
if (he == null)
continue;
result.put(he.getName(), he);
}
return result;
} finally {
try { input.close(); } catch (IOException ioe) {}
}
}
/**
* Return a HostTxtEntry from the contents of the inputLine.
*
* @param inputLine key=value[#!k1=v1#k2=v2...]
* @param allowCommandOnly if true, a line starting with #! will return
* a HostTxtEntry with a null name and dest and non-null props.
* If false, these lines will return null.
* @return null if no entry found or on error
*/
public static HostTxtEntry parse(String inputLine, boolean allowCommandOnly) {
if (inputLine.startsWith(";"))
return null;
int comment = inputLine.indexOf("#");
String kv;
String sprops;
if (comment >= 0) {
int shebang = inputLine.indexOf(HostTxtEntry.PROPS_SEPARATOR);
if (shebang == comment && shebang + 2 < inputLine.length()) {
if (comment == 0 && !allowCommandOnly)
return null;
sprops = inputLine.substring(shebang + 2);
} else {
if (comment == 0)
return null;
sprops = null;
}
kv = inputLine.substring(0, comment);
} else {
sprops = null;
kv = inputLine;
}
String name, dest;
if (comment != 0) {
// we have a name=dest
String[] splitLine = DataHelper.split(kv, "=", 2);
if (splitLine.length < 2)
return null;
name = splitLine[0].trim().toLowerCase(Locale.US);
dest = splitLine[1].trim();
if (name.length() == 0 || dest.length() == 0)
return null;
} else {
// line starts with #!, rv will contain props only
name = null;
dest = null;
}
HostTxtEntry he;
if (sprops != null) {
try {
he = new HostTxtEntry(name, dest, sprops);
} catch (IllegalArgumentException iae) {
return null;
}
} else {
he = new HostTxtEntry(name, dest);
}
return he;
}
/**
* Return a Map using the contents of the File file. See parse(BufferedReader)
* for details of the input format.
*
* Returned map will not contain null ("remove") entries.
*
* @param file
* A File to parse.
* @return A Map containing the key, value pairs from file.
* @throws IOException
* if file cannot be read.
*/
public static Map<String, HostTxtEntry> parse(File file) throws IOException {
FileInputStream fileStream = null;
try {
fileStream = new FileInputStream(file);
BufferedReader input = new BufferedReader(new InputStreamReader(
fileStream, "UTF-8"));
Map<String, HostTxtEntry> rv = parse(input);
return rv;
} finally {
if (fileStream != null) {
try {
fileStream.close();
} catch (IOException ioe) {}
}
}
}
/**
* Return a Map using the contents of the File file. If file cannot be read,
* use map instead, and write the result to where file should have been.
*
* Returned map will not contain null ("remove") entries.
*
* @param file
* A File to attempt to parse.
* @param map
* A Map containing values to use as defaults.
* @return A Map containing the key, value pairs from file, or if file
* cannot be read, map.
*/
public static Map<String, HostTxtEntry> parse(File file, Map<String, HostTxtEntry> map) {
Map<String, HostTxtEntry> result;
try {
result = parse(file);
for (Map.Entry<String, HostTxtEntry> entry : map.entrySet()) {
if (!result.containsKey(entry.getKey()))
result.put(entry.getKey(), entry.getValue());
}
} catch (IOException exp) {
result = map;
try {
write(result, file);
} catch (IOException exp2) {
}
}
return result;
}
/**
* Write contents of Map map to BufferedWriter output. Output is written
* with one key, value pair on each line, in the format: key=value.
*
* @param map
* A Map to write to output.
* @param output
* A BufferedWriter to write the Map to.
* @throws IOException
* if the BufferedWriter cannot be written to.
*/
private static void write(Map<String, HostTxtEntry> map, BufferedWriter output) throws IOException {
try {
for (Map.Entry<String, HostTxtEntry> entry : map.entrySet()) {
entry.getValue().write(output);
}
} finally {
try { output.close(); } catch (IOException ioe) {}
}
}
/**
* Write contents of Map map to the File file. Output is written
* with one key, value pair on each line, in the format: key=value.
* Write to a temp file in the same directory and then rename, to not corrupt
* simultaneous accesses by the router. Except on Windows where renameTo()
* will fail if the target exists.
*
* @param map
* A Map to write to file.
* @param file
* A File to write the Map to.
* @throws IOException
* if file cannot be written to.
*/
public static void write(Map<String, HostTxtEntry> map, File file) throws IOException {
boolean success = false;
if (!isWindows) {
File tmp = SecureFile.createTempFile("temp-", ".tmp", file.getAbsoluteFile().getParentFile());
write(map, new BufferedWriter(new OutputStreamWriter(new SecureFileOutputStream(tmp), "UTF-8")));
success = tmp.renameTo(file);
if (!success) {
tmp.delete();
//System.out.println("Warning: addressbook rename fail from " + tmp + " to " + file);
}
}
if (!success) {
// hmm, that didn't work, try it the old way
write(map, new BufferedWriter(new OutputStreamWriter(new SecureFileOutputStream(file), "UTF-8")));
}
}
public static void main(String[] args) throws Exception {
File f = new File("tmp-hosts.txt");
Map<String, HostTxtEntry> map = parse(f);
for (HostTxtEntry e : map.values()) {
System.out.println("Host: " + e.getName() +
"\nDest: " + e.getDest() +
"\nAction: " + (e.getProps() != null ? e.getProps().getProperty("action") : "(none)") +
"\nValid Inner? " + e.hasValidInnerSig() +
"\nValid? " + e.hasValidSig() +
'\n');
}
}
}

View File

@ -36,7 +36,7 @@ import java.util.Date;
*/ */
class Log { class Log {
private File file; private final File file;
/** /**
* Construct a Log instance that writes to the File file. * Construct a Log instance that writes to the File file.
@ -74,7 +74,9 @@ class Log {
* *
* @return The File that the log is writing to. * @return The File that the log is writing to.
*/ */
/****
public File getFile() { public File getFile() {
return this.file; return this.file;
} }
****/
} }

View File

@ -29,10 +29,8 @@ package net.i2p.addressbook;
*/ */
class Subscription { class Subscription {
private String location; private final String location;
private String etag; private String etag;
private String lastModified; private String lastModified;
private long lastFetched; private long lastFetched;
@ -41,14 +39,15 @@ class Subscription {
* was last read at the time represented by etag and lastModified. * was last read at the time represented by etag and lastModified.
* *
* @param location * @param location
* A String representing a url to a remote address book. * A String representing a url to a remote address book. Non-null.
* @param etag * @param etag
* The etag header that we recieved the last time we read this * The etag header that we received the last time we read this
* subscription. * subscription. May be null.
* @param lastModified * @param lastModified
* the last-modified header we recieved the last time we read * the last-modified header we received the last time we read
* this subscription. * this subscription. May be null.
* @param lastFetched when the subscription was last fetched (Java time, as a String) * @param lastFetched when the subscription was last fetched (Java time, as a String).
* May be null.
*/ */
public Subscription(String location, String etag, String lastModified, String lastFetched) { public Subscription(String location, String etag, String lastModified, String lastFetched) {
this.location = location; this.location = location;
@ -71,7 +70,7 @@ class Subscription {
} }
/** /**
* Return the etag header that we recieved the last time we read this * Return the etag header that we received the last time we read this
* subscription. * subscription.
* *
* @return A String containing the etag header. * @return A String containing the etag header.
@ -91,7 +90,7 @@ class Subscription {
} }
/** /**
* Return the last-modified header that we recieved the last time we read * Return the last-modified header that we received the last time we read
* this subscription. * this subscription.
* *
* @return A String containing the last-modified header. * @return A String containing the last-modified header.

View File

@ -26,6 +26,7 @@ import java.util.Iterator;
import java.util.List; import java.util.List;
import net.i2p.I2PAppContext; import net.i2p.I2PAppContext;
import net.i2p.client.naming.HostTxtEntry;
import net.i2p.util.PortMapper; import net.i2p.util.PortMapper;
/** /**
@ -37,9 +38,9 @@ import net.i2p.util.PortMapper;
*/ */
class SubscriptionIterator implements Iterator<AddressBook> { class SubscriptionIterator implements Iterator<AddressBook> {
private Iterator<Subscription> subIterator; private final Iterator<Subscription> subIterator;
private String proxyHost; private final String proxyHost;
private int proxyPort; private final int proxyPort;
private final long delay; private final long delay;
/** /**
@ -75,7 +76,10 @@ class SubscriptionIterator implements Iterator<AddressBook> {
*/ */
public AddressBook next() { public AddressBook next() {
Subscription sub = this.subIterator.next(); Subscription sub = this.subIterator.next();
if (sub.getLastFetched() + this.delay < I2PAppContext.getGlobalContext().clock().now() && if (sub.getLocation().startsWith("file:")) {
// test only
return new AddressBook(sub.getLocation().substring(5));
} else if (sub.getLastFetched() + this.delay < I2PAppContext.getGlobalContext().clock().now() &&
I2PAppContext.getGlobalContext().portMapper().getPort(PortMapper.SVC_HTTP_PROXY) >= 0 && I2PAppContext.getGlobalContext().portMapper().getPort(PortMapper.SVC_HTTP_PROXY) >= 0 &&
!I2PAppContext.getGlobalContext().getBooleanProperty("i2p.vmCommSystem")) { !I2PAppContext.getGlobalContext().getBooleanProperty("i2p.vmCommSystem")) {
//System.err.println("Fetching addressbook from " + sub.getLocation()); //System.err.println("Fetching addressbook from " + sub.getLocation());
@ -85,7 +89,7 @@ class SubscriptionIterator implements Iterator<AddressBook> {
// DataHelper.formatDuration(I2PAppContext.getGlobalContext().clock().now() - sub.getLastFetched()) + // DataHelper.formatDuration(I2PAppContext.getGlobalContext().clock().now() - sub.getLastFetched()) +
// " ago but the minimum delay is " + // " ago but the minimum delay is " +
// DataHelper.formatDuration(this.delay)); // DataHelper.formatDuration(this.delay));
return new AddressBook(Collections.<String, String> emptyMap()); return new AddressBook(Collections.<String, HostTxtEntry>emptyMap());
} }
} }

View File

@ -23,8 +23,9 @@ package net.i2p.addressbook;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
import java.util.LinkedList;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@ -34,19 +35,15 @@ import java.util.Map;
* @author Ragnarok * @author Ragnarok
* *
*/ */
class SubscriptionList { class SubscriptionList implements Iterable<AddressBook> {
private List<Subscription> subscriptions; private final List<Subscription> subscriptions;
private final File etagsFile;
private File etagsFile; private final File lastModifiedFile;
private final File lastFetchedFile;
private File lastModifiedFile;
private File lastFetchedFile;
private final long delay; private final long delay;
private final String proxyHost;
private String proxyHost; private final int proxyPort;
private int proxyPort;
/** /**
* Construct a SubscriptionList using the urls from locationsFile and, if * Construct a SubscriptionList using the urls from locationsFile and, if
@ -69,7 +66,7 @@ class SubscriptionList {
public SubscriptionList(File locationsFile, File etagsFile, public SubscriptionList(File locationsFile, File etagsFile,
File lastModifiedFile, File lastFetchedFile, long delay, List<String> defaultSubs, String proxyHost, File lastModifiedFile, File lastFetchedFile, long delay, List<String> defaultSubs, String proxyHost,
int proxyPort) { int proxyPort) {
this.subscriptions = new LinkedList<Subscription>(); this.subscriptions = new ArrayList<Subscription>(4);
this.etagsFile = etagsFile; this.etagsFile = etagsFile;
this.lastModifiedFile = lastModifiedFile; this.lastModifiedFile = lastModifiedFile;
this.lastFetchedFile = lastFetchedFile; this.lastFetchedFile = lastFetchedFile;
@ -84,17 +81,17 @@ class SubscriptionList {
try { try {
etags = ConfigParser.parse(etagsFile); etags = ConfigParser.parse(etagsFile);
} catch (IOException exp) { } catch (IOException exp) {
etags = new HashMap<String, String>(); etags = Collections.<String, String>emptyMap();
} }
try { try {
lastModified = ConfigParser.parse(lastModifiedFile); lastModified = ConfigParser.parse(lastModifiedFile);
} catch (IOException exp) { } catch (IOException exp) {
lastModified = new HashMap<String, String>(); lastModified = Collections.<String, String>emptyMap();
} }
try { try {
lastFetched = ConfigParser.parse(lastFetchedFile); lastFetched = ConfigParser.parse(lastFetchedFile);
} catch (IOException exp) { } catch (IOException exp) {
lastFetched = new HashMap<String, String>(); lastFetched = Collections.<String, String>emptyMap();
} }
for (String location : locations) { for (String location : locations) {
this.subscriptions.add(new Subscription(location, etags.get(location), this.subscriptions.add(new Subscription(location, etags.get(location),
@ -103,6 +100,24 @@ class SubscriptionList {
} }
} }
/**
* Testing only.
*
* @param hoststxt path to a local file used as the test 'subscription' input
* @since 0.9.26
*/
public SubscriptionList(String hoststxt) {
File dummy = new File("/dev/null");
this.etagsFile = dummy;
this.lastModifiedFile = dummy;
this.lastFetchedFile = dummy;
this.delay = 0;
this.proxyHost = "127.0.0.1";
this.proxyPort = 4444;
Subscription sub = new Subscription("file:" + hoststxt, null, null, null);
this.subscriptions = Collections.singletonList(sub);
}
/** /**
* Return an iterator over the AddressBooks represented by the Subscriptions * Return an iterator over the AddressBooks represented by the Subscriptions
* in this SubscriptionList. * in this SubscriptionList.
@ -121,9 +136,10 @@ class SubscriptionList {
* won't be read back correctly; the '=' should be escaped. * won't be read back correctly; the '=' should be escaped.
*/ */
public void write() { public void write() {
Map<String, String> etags = new HashMap<String, String>(); int sz = subscriptions.size();
Map<String, String> lastModified = new HashMap<String, String>(); Map<String, String> etags = new HashMap<String, String>(sz);
Map<String, String> lastFetched = new HashMap<String, String>(); Map<String, String> lastModified = new HashMap<String, String>(sz);
Map<String, String> lastFetched = new HashMap<String, String>(sz);
for (Subscription sub : this.subscriptions) { for (Subscription sub : this.subscriptions) {
if (sub.getEtag() != null) { if (sub.getEtag() != null) {
etags.put(sub.getLocation(), sub.getEtag()); etags.put(sub.getLocation(), sub.getEtag());
@ -131,13 +147,16 @@ class SubscriptionList {
if (sub.getLastModified() != null) { if (sub.getLastModified() != null) {
lastModified.put(sub.getLocation(), sub.getLastModified()); lastModified.put(sub.getLocation(), sub.getLastModified());
} }
lastFetched.put(sub.getLocation(), "" + sub.getLastFetched()); lastFetched.put(sub.getLocation(), Long.toString(sub.getLastFetched()));
} }
try { try {
ConfigParser.write(etags, this.etagsFile); ConfigParser.write(etags, this.etagsFile);
} catch (IOException exp) {}
try {
ConfigParser.write(lastModified, this.lastModifiedFile); ConfigParser.write(lastModified, this.lastModifiedFile);
} catch (IOException exp) {}
try {
ConfigParser.write(lastFetched, this.lastFetchedFile); ConfigParser.write(lastFetched, this.lastFetchedFile);
} catch (IOException exp) { } catch (IOException exp) {}
}
} }
} }

View File

@ -1,7 +1,7 @@
<html> <html>
<body> <body>
<p> <p>
The addressbook application, which fetches hosts.txt files from subscription URLS via The addressbook application, which fetches hosts.txt files from subscription URLs via
HTTP and adds new hosts to the local database. HTTP and adds new hosts to the local database.
While implemented as a webapp, this application contains no user interface. While implemented as a webapp, this application contains no user interface.
May also be packaged as a jar, as is done for Android. May also be packaged as a jar, as is done for Android.

14
apps/admin/admin.iml Normal file
View File

@ -0,0 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4">
<component name="NewModuleRootManager" inherit-compiler-output="true">
<exclude-output />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/java/src" isTestSource="false" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="module" module-name="core" />
<orderEntry type="module" module-name="router" />
<orderEntry type="module" module-name="routerconsole" />
</component>
</module>

View File

@ -11,9 +11,10 @@ import java.util.Iterator;
import java.util.Set; import java.util.Set;
import net.i2p.data.Hash; import net.i2p.data.Hash;
import net.i2p.data.DataHelper import net.i2p.data.DataHelper;
import net.i2p.router.Router; import net.i2p.router.Router;
import net.i2p.router.RouterContext; import net.i2p.router.RouterContext;
import net.i2p.router.web.StatsGenerator;
import net.i2p.util.I2PThread; import net.i2p.util.I2PThread;
import net.i2p.util.Log; import net.i2p.util.Log;
@ -49,7 +50,7 @@ class AdminRunner implements Runnable {
} else if ( (command.indexOf("routerStats.html") >= 0) || (command.indexOf("oldstats.jsp") >= 0) ) { } else if ( (command.indexOf("routerStats.html") >= 0) || (command.indexOf("oldstats.jsp") >= 0) ) {
try { try {
out.write(DataHelper.getASCII("HTTP/1.1 200 OK\nConnection: close\nCache-control: no-cache\nContent-type: text/html\n\n")); out.write(DataHelper.getASCII("HTTP/1.1 200 OK\nConnection: close\nCache-control: no-cache\nContent-type: text/html\n\n"));
_generator.generateStatsPage(new OutputStreamWriter(out)); _generator.generateStatsPage(new OutputStreamWriter(out), true);
out.close(); out.close();
} catch (IOException ioe) { } catch (IOException ioe) {
if (_log.shouldLog(Log.WARN)) if (_log.shouldLog(Log.WARN))
@ -63,7 +64,8 @@ class AdminRunner implements Runnable {
} else if (true || command.indexOf("routerConsole.html") > 0) { } else if (true || command.indexOf("routerConsole.html") > 0) {
try { try {
out.write(DataHelper.getASCII("HTTP/1.1 200 OK\nConnection: close\nCache-control: no-cache\nContent-type: text/html\n\n")); out.write(DataHelper.getASCII("HTTP/1.1 200 OK\nConnection: close\nCache-control: no-cache\nContent-type: text/html\n\n"));
_context.router().renderStatusHTML(new OutputStreamWriter(out)); // TODO Not technically the same as router().renderStatusHTML() was
_context.routerAppManager().renderStatusHTML(new OutputStreamWriter(out));
out.close(); out.close();
} catch (IOException ioe) { } catch (IOException ioe) {
if (_log.shouldLog(Log.WARN)) if (_log.shouldLog(Log.WARN))

View File

@ -5,7 +5,6 @@
<property name="build" value="build"/> <property name="build" value="build"/>
<property name="dist" location="dist"/> <property name="dist" location="dist"/>
<property name="jar" value="desktopgui.jar"/> <property name="jar" value="desktopgui.jar"/>
<property name="resources" value="resources"/>
<property name="javadoc" value="javadoc"/> <property name="javadoc" value="javadoc"/>
<property name="javac.compilerargs" value=""/> <property name="javac.compilerargs" value=""/>
<property name="javac.version" value="1.6" /> <property name="javac.version" value="1.6" />
@ -17,8 +16,7 @@
<target name="init"> <target name="init">
<mkdir dir="${build}"/> <mkdir dir="${build}"/>
<mkdir dir="${build}/${resources}"/> <mkdir dir="${build}/messages-src"/>
<mkdir dir="${build}/${javadoc}"/>
<mkdir dir="${dist}"/> <mkdir dir="${dist}"/>
</target> </target>
@ -38,12 +36,9 @@
<pathelement location="../../router/java/build/router.jar" /> <pathelement location="../../router/java/build/router.jar" />
</classpath> </classpath>
</javac> </javac>
<copy todir="${build}/desktopgui/${resources}">
<fileset dir="${resources}" />
</copy>
</target> </target>
<target name="bundle" unless="no.bundle"> <target name="bundle" unless="no.bundle" depends="init">
<exec executable="sh" osfamily="unix" failifexecutionfails="true" failonerror="${require.gettext}" > <exec executable="sh" osfamily="unix" failifexecutionfails="true" failonerror="${require.gettext}" >
<env key="JAVA_HOME" value="${java.home}" /> <env key="JAVA_HOME" value="${java.home}" />
<arg value="./bundle-messages.sh" /> <arg value="./bundle-messages.sh" />
@ -51,10 +46,14 @@
<exec executable="sh" osfamily="mac" failifexecutionfails="true" failonerror="${require.gettext}" > <exec executable="sh" osfamily="mac" failifexecutionfails="true" failonerror="${require.gettext}" >
<arg value="./bundle-messages.sh" /> <arg value="./bundle-messages.sh" />
</exec> </exec>
<!-- multi-lang is optional -->
<exec executable="sh" osfamily="windows" failifexecutionfails="false" > <exec executable="sh" osfamily="windows" failifexecutionfails="false" >
<arg value="./bundle-messages.sh" /> <arg value="./bundle-messages.sh" />
</exec> </exec>
<javac source="${javac.version}" target="${javac.version}"
includeAntRuntime="false"
srcdir="${build}/messages-src" destdir="${build}">
<compilerarg line="${javac.compilerargs}" />
</javac>
</target> </target>
<target name="listChangedFiles" depends="jarUpToDate" if="shouldListChanges" > <target name="listChangedFiles" depends="jarUpToDate" if="shouldListChanges" >
@ -74,7 +73,11 @@
<target name="jar" depends="compile, bundle, listChangedFiles" unless="jar.uptodate" > <target name="jar" depends="compile, bundle, listChangedFiles" unless="jar.uptodate" >
<!-- set if unset --> <!-- set if unset -->
<property name="workspace.changes.tr" value="" /> <property name="workspace.changes.tr" value="" />
<jar basedir="${build}" destfile="${dist}/${jar}"> <!-- ideal for linux: 24x24, but transparency doesn't work -->
<copy tofile="${build}/desktopgui/resources/images/logo.png" file="../../installer/resources/themes/console/images/itoopie_xsm.png" />
<copy todir="${build}/desktopgui/resources/images" file="images/itoopie_black_24.png" />
<copy todir="${build}/desktopgui/resources/images" file="images/itoopie_white_24.png" />
<jar basedir="${build}" excludes="messages-src/**" destfile="${dist}/${jar}">
<manifest> <manifest>
<attribute name="Main-Class" value="net.i2p.desktopgui.Main"/> <attribute name="Main-Class" value="net.i2p.desktopgui.Main"/>
<attribute name="Build-Date" value="${build.timestamp}" /> <attribute name="Build-Date" value="${build.timestamp}" />

View File

@ -105,6 +105,10 @@ do
# only generate for non-source language # only generate for non-source language
echo "Generating ${CLASS}_$LG ResourceBundle..." echo "Generating ${CLASS}_$LG ResourceBundle..."
msgfmt -V | grep -q '0\.19'
if [ $? -ne 0 ]
then
# slow way
# convert to class files in build # convert to class files in build
msgfmt --java --statistics -r $CLASS -l $LG -d build $i msgfmt --java --statistics -r $CLASS -l $LG -d build $i
if [ $? -ne 0 ] if [ $? -ne 0 ]
@ -115,6 +119,27 @@ do
RC=1 RC=1
break break
fi fi
else
# fast way
# convert to java files in build/messages-src
TD=build/messages-src-tmp
TDX=$TD/net/i2p/desktopgui
TD2=build/messages-src
TDY=$TD2/net/i2p/desktopgui
rm -rf $TD
mkdir -p $TD $TDY
msgfmt --java --statistics --source -r $CLASS -l $LG -d $TD $i
if [ $? -ne 0 ]
then
echo "ERROR - msgfmt failed on ${i}, not updating translations"
# msgfmt leaves the class file there so the build would work the next time
find build -name messages_${LG}.class -exec rm -f {} \;
RC=1
break
fi
mv $TDX/messages_$LG.java $TDY
rm -rf $TD
fi
fi fi
done done
rm -f $TMPFILE rm -f $TMPFILE

View File

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4">
<component name="NewModuleRootManager" inherit-compiler-output="true">
<exclude-output />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="module" module-name="core" />
<orderEntry type="module" module-name="router" />
</component>
</module>

Binary file not shown.

After

Width:  |  Height:  |  Size: 558 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 677 B

View File

@ -2,55 +2,94 @@
# Copyright (C) 2009 The I2P Project # Copyright (C) 2009 The I2P Project
# This file is distributed under the same license as the desktopgui package. # This file is distributed under the same license as the desktopgui package.
# To contribute translations, see http://www.i2p2.de/newdevelopers # To contribute translations, see http://www.i2p2.de/newdevelopers
# foo <foo@bar>, 2009.
# #
# Translators:
# ducki2p <ducki2p@gmail.com>, 2011
# foo <foo@bar>, 2009
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: I2P desktopgui\n" "Project-Id-Version: I2P\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-02-20 11:53+0000\n" "POT-Creation-Date: 2016-05-25 12:29+0000\n"
"PO-Revision-Date: 2011-02-26 19:46-0000\n" "PO-Revision-Date: 2016-05-25 12:34+0000\n"
"Last-Translator: hamada <hamada@mail.i2p>\n" "Last-Translator: zzzi2p\n"
"Language: ar\n" "Language-Team: Arabic (http://www.transifex.com/otf/I2P/language/ar/)\n"
"Language-Team: duck <duck@mail.i2p>\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1)\n" "Language: ar\n"
"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n"
#: src/net/i2p/desktopgui/ExternalTrayManager.java:23 #: src/net/i2p/desktopgui/ExternalTrayManager.java:31
#: src/net/i2p/desktopgui/ExternalTrayManager.java:59
msgid "Start I2P" msgid "Start I2P"
msgstr "ابدأ I2P" msgstr "ابدأ I2P"
#: src/net/i2p/desktopgui/ExternalTrayManager.java:38 #: src/net/i2p/desktopgui/ExternalTrayManager.java:44
#: src/net/i2p/desktopgui/ExternalTrayManager.java:72
msgid "I2P is starting!" msgid "I2P is starting!"
msgstr "جاري تشغيل I2P" msgstr "جاري تشغيل I2P"
#: src/net/i2p/desktopgui/ExternalTrayManager.java:38 #: src/net/i2p/desktopgui/ExternalTrayManager.java:44
#: src/net/i2p/desktopgui/ExternalTrayManager.java:72
msgid "Starting" msgid "Starting"
msgstr "جاري البدأ" msgstr "جاري البدأ"
#: src/net/i2p/desktopgui/InternalTrayManager.java:26 #: src/net/i2p/desktopgui/InternalTrayManager.java:55
#: src/net/i2p/desktopgui/InternalTrayManager.java:207
msgid "Launch I2P Browser" msgid "Launch I2P Browser"
msgstr " تشغيل متصفح I2P" msgstr " تشغيل متصفح I2P"
#: src/net/i2p/desktopgui/InternalTrayManager.java:50 #: src/net/i2p/desktopgui/InternalTrayManager.java:76
msgid "Configure desktopgui" #: src/net/i2p/desktopgui/InternalTrayManager.java:228
msgstr "اعدادات" msgid "Configure I2P System Tray"
msgstr ""
#: src/net/i2p/desktopgui/InternalTrayManager.java:67 #: src/net/i2p/desktopgui/InternalTrayManager.java:77
#: src/net/i2p/desktopgui/InternalTrayManager.java:229
msgid "Disable"
msgstr ""
#: src/net/i2p/desktopgui/InternalTrayManager.java:93
#: src/net/i2p/desktopgui/InternalTrayManager.java:245
msgid "Restart I2P" msgid "Restart I2P"
msgstr "اعادة تشغيل" msgstr "اعادة تشغيل"
#: src/net/i2p/desktopgui/InternalTrayManager.java:85 #: src/net/i2p/desktopgui/InternalTrayManager.java:110
#: src/net/i2p/desktopgui/InternalTrayManager.java:262
msgid "Stop I2P" msgid "Stop I2P"
msgstr "توقيف I2P" msgstr "توقيف I2P"
#: src/net/i2p/desktopgui/gui/DesktopguiConfigurationFrame.java:44 #: src/net/i2p/desktopgui/InternalTrayManager.java:126
msgid "Tray icon configuration" #: src/net/i2p/desktopgui/InternalTrayManager.java:278
msgstr "اعدادات الأيقونة" msgid "Restart I2P Immediately"
msgstr ""
#: src/net/i2p/desktopgui/gui/DesktopguiConfigurationFrame.java:47 #: src/net/i2p/desktopgui/InternalTrayManager.java:143
msgid "Should tray icon be enabled?" #: src/net/i2p/desktopgui/InternalTrayManager.java:295
msgstr "هل ترغب في تفعيل الأيقونة؟" msgid "Stop I2P Immediately"
msgstr ""
#: src/net/i2p/desktopgui/InternalTrayManager.java:157
#: src/net/i2p/desktopgui/InternalTrayManager.java:309
msgid "Cancel I2P Shutdown"
msgstr ""
#: src/net/i2p/desktopgui/InternalTrayManager.java:363
#, java-format
msgid "Shutdown in {0}"
msgstr ""
#: src/net/i2p/desktopgui/InternalTrayManager.java:365
msgid "Shutdown imminent"
msgstr ""
#. status translations are in the console bundle
#: src/net/i2p/desktopgui/InternalTrayManager.java:370
msgid "Network"
msgstr ""
#. Windows typically has tooltips; Linux (at least Ubuntu) doesn't
#: src/net/i2p/desktopgui/TrayManager.java:63
msgid "I2P: Right-click for menu"
msgstr ""

View File

@ -0,0 +1,94 @@
# I2P
# Copyright (C) 2009 The I2P Project
# This file is distributed under the same license as the desktopgui package.
# To contribute translations, see http://www.i2p2.de/newdevelopers
#
# Translators:
# Gabriel Radev <gabosss@gmail.com>, 2015
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: 2016-05-25 12:34+0000\n"
"Last-Translator: zzzi2p\n"
"Language-Team: Bulgarian (http://www.transifex.com/otf/I2P/language/bg/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: bg\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: src/net/i2p/desktopgui/ExternalTrayManager.java:31
#: src/net/i2p/desktopgui/ExternalTrayManager.java:59
msgid "Start I2P"
msgstr "Стартиране на I2P"
#: src/net/i2p/desktopgui/ExternalTrayManager.java:44
#: src/net/i2p/desktopgui/ExternalTrayManager.java:72
msgid "I2P is starting!"
msgstr "I2P е стартиран!"
#: src/net/i2p/desktopgui/ExternalTrayManager.java:44
#: src/net/i2p/desktopgui/ExternalTrayManager.java:72
msgid "Starting"
msgstr "Стартиране"
#: src/net/i2p/desktopgui/InternalTrayManager.java:55
#: src/net/i2p/desktopgui/InternalTrayManager.java:207
msgid "Launch I2P Browser"
msgstr "Стартиране на I2P Браузер"
#: src/net/i2p/desktopgui/InternalTrayManager.java:76
#: src/net/i2p/desktopgui/InternalTrayManager.java:228
msgid "Configure I2P System Tray"
msgstr ""
#: src/net/i2p/desktopgui/InternalTrayManager.java:77
#: src/net/i2p/desktopgui/InternalTrayManager.java:229
msgid "Disable"
msgstr ""
#: src/net/i2p/desktopgui/InternalTrayManager.java:93
#: src/net/i2p/desktopgui/InternalTrayManager.java:245
msgid "Restart I2P"
msgstr "Рестартиране на I2P"
#: src/net/i2p/desktopgui/InternalTrayManager.java:110
#: src/net/i2p/desktopgui/InternalTrayManager.java:262
msgid "Stop I2P"
msgstr "Спиране на I2P"
#: src/net/i2p/desktopgui/InternalTrayManager.java:126
#: src/net/i2p/desktopgui/InternalTrayManager.java:278
msgid "Restart I2P Immediately"
msgstr ""
#: src/net/i2p/desktopgui/InternalTrayManager.java:143
#: src/net/i2p/desktopgui/InternalTrayManager.java:295
msgid "Stop I2P Immediately"
msgstr ""
#: src/net/i2p/desktopgui/InternalTrayManager.java:157
#: src/net/i2p/desktopgui/InternalTrayManager.java:309
msgid "Cancel I2P Shutdown"
msgstr ""
#: src/net/i2p/desktopgui/InternalTrayManager.java:363
#, java-format
msgid "Shutdown in {0}"
msgstr ""
#: src/net/i2p/desktopgui/InternalTrayManager.java:365
msgid "Shutdown imminent"
msgstr ""
#. status translations are in the console bundle
#: src/net/i2p/desktopgui/InternalTrayManager.java:370
msgid "Network"
msgstr ""
#. Windows typically has tooltips; Linux (at least Ubuntu) doesn't
#: src/net/i2p/desktopgui/TrayManager.java:63
msgid "I2P: Right-click for menu"
msgstr ""

View File

@ -0,0 +1,93 @@
# I2P
# Copyright (C) 2009 The I2P Project
# This file is distributed under the same license as the desktopgui package.
# To contribute translations, see http://www.i2p2.de/newdevelopers
#
# Translators:
msgid ""
msgstr ""
"Project-Id-Version: I2P\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2016-05-25 12:29+0000\n"
"PO-Revision-Date: 2016-05-25 12:34+0000\n"
"Last-Translator: zzzi2p\n"
"Language-Team: Catalan (http://www.transifex.com/otf/I2P/language/ca/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: ca\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: src/net/i2p/desktopgui/ExternalTrayManager.java:31
#: src/net/i2p/desktopgui/ExternalTrayManager.java:59
msgid "Start I2P"
msgstr "Iniciar I2P"
#: src/net/i2p/desktopgui/ExternalTrayManager.java:44
#: src/net/i2p/desktopgui/ExternalTrayManager.java:72
msgid "I2P is starting!"
msgstr "I2P s'està iniciant."
#: src/net/i2p/desktopgui/ExternalTrayManager.java:44
#: src/net/i2p/desktopgui/ExternalTrayManager.java:72
msgid "Starting"
msgstr "Iniciant"
#: src/net/i2p/desktopgui/InternalTrayManager.java:55
#: src/net/i2p/desktopgui/InternalTrayManager.java:207
msgid "Launch I2P Browser"
msgstr "Iniciar navegador I2P"
#: src/net/i2p/desktopgui/InternalTrayManager.java:76
#: src/net/i2p/desktopgui/InternalTrayManager.java:228
msgid "Configure I2P System Tray"
msgstr ""
#: src/net/i2p/desktopgui/InternalTrayManager.java:77
#: src/net/i2p/desktopgui/InternalTrayManager.java:229
msgid "Disable"
msgstr ""
#: src/net/i2p/desktopgui/InternalTrayManager.java:93
#: src/net/i2p/desktopgui/InternalTrayManager.java:245
msgid "Restart I2P"
msgstr "Reiniciar I2P "
#: src/net/i2p/desktopgui/InternalTrayManager.java:110
#: src/net/i2p/desktopgui/InternalTrayManager.java:262
msgid "Stop I2P"
msgstr "Aturar I2P "
#: src/net/i2p/desktopgui/InternalTrayManager.java:126
#: src/net/i2p/desktopgui/InternalTrayManager.java:278
msgid "Restart I2P Immediately"
msgstr ""
#: src/net/i2p/desktopgui/InternalTrayManager.java:143
#: src/net/i2p/desktopgui/InternalTrayManager.java:295
msgid "Stop I2P Immediately"
msgstr ""
#: src/net/i2p/desktopgui/InternalTrayManager.java:157
#: src/net/i2p/desktopgui/InternalTrayManager.java:309
msgid "Cancel I2P Shutdown"
msgstr ""
#: src/net/i2p/desktopgui/InternalTrayManager.java:363
#, java-format
msgid "Shutdown in {0}"
msgstr ""
#: src/net/i2p/desktopgui/InternalTrayManager.java:365
msgid "Shutdown imminent"
msgstr ""
#. status translations are in the console bundle
#: src/net/i2p/desktopgui/InternalTrayManager.java:370
msgid "Network"
msgstr ""
#. Windows typically has tooltips; Linux (at least Ubuntu) doesn't
#: src/net/i2p/desktopgui/TrayManager.java:63
msgid "I2P: Right-click for menu"
msgstr ""

View File

@ -7,49 +7,87 @@
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: I2P\n" "Project-Id-Version: I2P\n"
"Report-Msgid-Bugs-To: https://trac.i2p2.de/\n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-03-03 18:29+0000\n" "POT-Creation-Date: 2016-05-25 12:29+0000\n"
"PO-Revision-Date: 2012-02-12 19:44+0000\n" "PO-Revision-Date: 2016-05-25 12:34+0000\n"
"Last-Translator: Waseihou Watashi <waseihou@gmail.com>\n" "Last-Translator: zzzi2p\n"
"Language-Team: Czech (http://www.transifex.net/projects/p/I2P/language/cs/)\n" "Language-Team: Czech (http://www.transifex.com/otf/I2P/language/cs/)\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Language: cs\n" "Language: cs\n"
"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
#: src/net/i2p/desktopgui/ExternalTrayManager.java:23 #: src/net/i2p/desktopgui/ExternalTrayManager.java:31
#: src/net/i2p/desktopgui/ExternalTrayManager.java:59
msgid "Start I2P" msgid "Start I2P"
msgstr "Spustit I2P" msgstr "Spustit I2P"
#: src/net/i2p/desktopgui/ExternalTrayManager.java:38 #: src/net/i2p/desktopgui/ExternalTrayManager.java:44
#: src/net/i2p/desktopgui/ExternalTrayManager.java:72
msgid "I2P is starting!" msgid "I2P is starting!"
msgstr "I2P startuje!" msgstr "I2P startuje!"
#: src/net/i2p/desktopgui/ExternalTrayManager.java:38 #: src/net/i2p/desktopgui/ExternalTrayManager.java:44
#: src/net/i2p/desktopgui/ExternalTrayManager.java:72
msgid "Starting" msgid "Starting"
msgstr "Startuji" msgstr "Startuji"
#: src/net/i2p/desktopgui/InternalTrayManager.java:26 #: src/net/i2p/desktopgui/InternalTrayManager.java:55
#: src/net/i2p/desktopgui/InternalTrayManager.java:207
msgid "Launch I2P Browser" msgid "Launch I2P Browser"
msgstr "Spouštím I2P Browser" msgstr "Spouštím I2P Browser"
#: src/net/i2p/desktopgui/InternalTrayManager.java:50 #: src/net/i2p/desktopgui/InternalTrayManager.java:76
msgid "Configure desktopgui" #: src/net/i2p/desktopgui/InternalTrayManager.java:228
msgstr "Nastavuji desktopgui" msgid "Configure I2P System Tray"
msgstr ""
#: src/net/i2p/desktopgui/InternalTrayManager.java:67 #: src/net/i2p/desktopgui/InternalTrayManager.java:77
#: src/net/i2p/desktopgui/InternalTrayManager.java:229
msgid "Disable"
msgstr ""
#: src/net/i2p/desktopgui/InternalTrayManager.java:93
#: src/net/i2p/desktopgui/InternalTrayManager.java:245
msgid "Restart I2P" msgid "Restart I2P"
msgstr "Restart I2P" msgstr "Restart I2P"
#: src/net/i2p/desktopgui/InternalTrayManager.java:85 #: src/net/i2p/desktopgui/InternalTrayManager.java:110
#: src/net/i2p/desktopgui/InternalTrayManager.java:262
msgid "Stop I2P" msgid "Stop I2P"
msgstr "Zastavit I2P" msgstr "Zastavit I2P"
#: src/net/i2p/desktopgui/gui/DesktopguiConfigurationFrame.java:44 #: src/net/i2p/desktopgui/InternalTrayManager.java:126
msgid "Tray icon configuration" #: src/net/i2p/desktopgui/InternalTrayManager.java:278
msgstr "Nastavení ikony na liště (tray icon)" msgid "Restart I2P Immediately"
msgstr ""
#: src/net/i2p/desktopgui/gui/DesktopguiConfigurationFrame.java:47 #: src/net/i2p/desktopgui/InternalTrayManager.java:143
msgid "Should tray icon be enabled?" #: src/net/i2p/desktopgui/InternalTrayManager.java:295
msgstr "Zapnout ikonu na liště?" msgid "Stop I2P Immediately"
msgstr ""
#: src/net/i2p/desktopgui/InternalTrayManager.java:157
#: src/net/i2p/desktopgui/InternalTrayManager.java:309
msgid "Cancel I2P Shutdown"
msgstr ""
#: src/net/i2p/desktopgui/InternalTrayManager.java:363
#, java-format
msgid "Shutdown in {0}"
msgstr ""
#: src/net/i2p/desktopgui/InternalTrayManager.java:365
msgid "Shutdown imminent"
msgstr ""
#. status translations are in the console bundle
#: src/net/i2p/desktopgui/InternalTrayManager.java:370
msgid "Network"
msgstr ""
#. Windows typically has tooltips; Linux (at least Ubuntu) doesn't
#: src/net/i2p/desktopgui/TrayManager.java:63
msgid "I2P: Right-click for menu"
msgstr ""

View File

@ -3,55 +3,93 @@
# This file is distributed under the same license as the desktopgui package. # This file is distributed under the same license as the desktopgui package.
# To contribute translations, see http://www.i2p2.de/newdevelopers # To contribute translations, see http://www.i2p2.de/newdevelopers
# #
# <kia___@hushmail.com>, 2011. # Translators:
# Aesthese, 2016
# KIA <kia___@hushmail.com>, 2011
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: I2P\n" "Project-Id-Version: I2P\n"
"Report-Msgid-Bugs-To: https://trac.i2p2.de/\n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-03-03 18:29+0000\n" "POT-Creation-Date: 2016-05-25 12:29+0000\n"
"PO-Revision-Date: 2011-07-12 19:41+0000\n" "PO-Revision-Date: 2016-05-25 12:34+0000\n"
"Last-Translator: KIA <kia___@hushmail.com>\n" "Last-Translator: zzzi2p\n"
"Language-Team: Danish (http://www.transifex.net/projects/p/I2P/team/da/)\n" "Language-Team: Danish (http://www.transifex.com/otf/I2P/language/da/)\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Language: da\n" "Language: da\n"
"Plural-Forms: nplurals=2; plural=(n != 1)\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: src/net/i2p/desktopgui/ExternalTrayManager.java:23 #: src/net/i2p/desktopgui/ExternalTrayManager.java:31
#: src/net/i2p/desktopgui/ExternalTrayManager.java:59
msgid "Start I2P" msgid "Start I2P"
msgstr "Start I2P" msgstr "Start I2P"
#: src/net/i2p/desktopgui/ExternalTrayManager.java:38 #: src/net/i2p/desktopgui/ExternalTrayManager.java:44
#: src/net/i2p/desktopgui/ExternalTrayManager.java:72
msgid "I2P is starting!" msgid "I2P is starting!"
msgstr "I2P starter nu!" msgstr "I2P starter!"
#: src/net/i2p/desktopgui/ExternalTrayManager.java:38 #: src/net/i2p/desktopgui/ExternalTrayManager.java:44
#: src/net/i2p/desktopgui/ExternalTrayManager.java:72
msgid "Starting" msgid "Starting"
msgstr "Starter" msgstr "Starter"
#: src/net/i2p/desktopgui/InternalTrayManager.java:26 #: src/net/i2p/desktopgui/InternalTrayManager.java:55
#: src/net/i2p/desktopgui/InternalTrayManager.java:207
msgid "Launch I2P Browser" msgid "Launch I2P Browser"
msgstr "Start I2P Browseren" msgstr "Start I2P Browseren"
#: src/net/i2p/desktopgui/InternalTrayManager.java:50 #: src/net/i2p/desktopgui/InternalTrayManager.java:76
msgid "Configure desktopgui" #: src/net/i2p/desktopgui/InternalTrayManager.java:228
msgstr "Konfigurer desktopgui" msgid "Configure I2P System Tray"
msgstr ""
#: src/net/i2p/desktopgui/InternalTrayManager.java:67 #: src/net/i2p/desktopgui/InternalTrayManager.java:77
#: src/net/i2p/desktopgui/InternalTrayManager.java:229
msgid "Disable"
msgstr ""
#: src/net/i2p/desktopgui/InternalTrayManager.java:93
#: src/net/i2p/desktopgui/InternalTrayManager.java:245
msgid "Restart I2P" msgid "Restart I2P"
msgstr "Genstart I2P" msgstr "Genstart I2P"
#: src/net/i2p/desktopgui/InternalTrayManager.java:85 #: src/net/i2p/desktopgui/InternalTrayManager.java:110
#: src/net/i2p/desktopgui/InternalTrayManager.java:262
msgid "Stop I2P" msgid "Stop I2P"
msgstr "Stop I2P" msgstr "Stop I2P"
#: src/net/i2p/desktopgui/gui/DesktopguiConfigurationFrame.java:44 #: src/net/i2p/desktopgui/InternalTrayManager.java:126
msgid "Tray icon configuration" #: src/net/i2p/desktopgui/InternalTrayManager.java:278
msgstr "Konfiguration af processbar ikonet" msgid "Restart I2P Immediately"
msgstr ""
#: src/net/i2p/desktopgui/gui/DesktopguiConfigurationFrame.java:47 #: src/net/i2p/desktopgui/InternalTrayManager.java:143
msgid "Should tray icon be enabled?" #: src/net/i2p/desktopgui/InternalTrayManager.java:295
msgstr "Skal processbar ikonet være aktivt?" msgid "Stop I2P Immediately"
msgstr ""
#: src/net/i2p/desktopgui/InternalTrayManager.java:157
#: src/net/i2p/desktopgui/InternalTrayManager.java:309
msgid "Cancel I2P Shutdown"
msgstr ""
#: src/net/i2p/desktopgui/InternalTrayManager.java:363
#, java-format
msgid "Shutdown in {0}"
msgstr ""
#: src/net/i2p/desktopgui/InternalTrayManager.java:365
msgid "Shutdown imminent"
msgstr ""
#. status translations are in the console bundle
#: src/net/i2p/desktopgui/InternalTrayManager.java:370
msgid "Network"
msgstr ""
#. Windows typically has tooltips; Linux (at least Ubuntu) doesn't
#: src/net/i2p/desktopgui/TrayManager.java:63
msgid "I2P: Right-click for menu"
msgstr ""

View File

@ -2,54 +2,95 @@
# Copyright (C) 2009 The I2P Project # Copyright (C) 2009 The I2P Project
# This file is distributed under the same license as the desktopgui package. # This file is distributed under the same license as the desktopgui package.
# To contribute translations, see http://www.i2p2.de/newdevelopers # To contribute translations, see http://www.i2p2.de/newdevelopers
# foo <foo@bar>, 2009.
# #
# Translators:
# blabla <blabla@trash-mail.com>, 2011
# Ettore Atalan <atalanttore@googlemail.com>, 2016
# foo <foo@bar>, 2009
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: I2P\n" "Project-Id-Version: I2P\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2014-01-09 18:07+0000\n" "POT-Creation-Date: 2016-05-25 12:29+0000\n"
"PO-Revision-Date: 2011-03-22 15:49+0000\n" "PO-Revision-Date: 2016-05-27 08:26+0000\n"
"Last-Translator: blabla <blabla@trash-mail.com>\n" "Last-Translator: Ettore Atalan <atalanttore@googlemail.com>\n"
"Language-Team: German <>\n" "Language-Team: German (http://www.transifex.com/otf/I2P/language/de/)\n"
"Language: de\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1)\n" "Language: de\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: src/net/i2p/desktopgui/ExternalTrayManager.java:23 #: src/net/i2p/desktopgui/ExternalTrayManager.java:31
#: src/net/i2p/desktopgui/ExternalTrayManager.java:59
msgid "Start I2P" msgid "Start I2P"
msgstr "I2P starten" msgstr "I2P starten"
#: src/net/i2p/desktopgui/ExternalTrayManager.java:38 #: src/net/i2p/desktopgui/ExternalTrayManager.java:44
#: src/net/i2p/desktopgui/ExternalTrayManager.java:72
msgid "I2P is starting!" msgid "I2P is starting!"
msgstr "I2P startet gerade!" msgstr "I2P startet gerade!"
#: src/net/i2p/desktopgui/ExternalTrayManager.java:38 #: src/net/i2p/desktopgui/ExternalTrayManager.java:44
#: src/net/i2p/desktopgui/ExternalTrayManager.java:72
msgid "Starting" msgid "Starting"
msgstr "Startend" msgstr "Startend"
#: src/net/i2p/desktopgui/InternalTrayManager.java:26 #: src/net/i2p/desktopgui/InternalTrayManager.java:55
#: src/net/i2p/desktopgui/InternalTrayManager.java:207
msgid "Launch I2P Browser" msgid "Launch I2P Browser"
msgstr "I2P-Browser öffnen" msgstr "I2P-Browser öffnen"
#: src/net/i2p/desktopgui/InternalTrayManager.java:50 #: src/net/i2p/desktopgui/InternalTrayManager.java:76
msgid "Configure desktopgui" #: src/net/i2p/desktopgui/InternalTrayManager.java:228
msgstr "Desktopgui konfigurieren" msgid "Configure I2P System Tray"
msgstr ""
#: src/net/i2p/desktopgui/InternalTrayManager.java:67 #: src/net/i2p/desktopgui/InternalTrayManager.java:77
#: src/net/i2p/desktopgui/InternalTrayManager.java:229
msgid "Disable"
msgstr "Deaktivieren"
#: src/net/i2p/desktopgui/InternalTrayManager.java:93
#: src/net/i2p/desktopgui/InternalTrayManager.java:245
msgid "Restart I2P" msgid "Restart I2P"
msgstr "I2P neustarten" msgstr "I2P neustarten"
#: src/net/i2p/desktopgui/InternalTrayManager.java:85 #: src/net/i2p/desktopgui/InternalTrayManager.java:110
#: src/net/i2p/desktopgui/InternalTrayManager.java:262
msgid "Stop I2P" msgid "Stop I2P"
msgstr "I2P beenden" msgstr "I2P beenden"
#: src/net/i2p/desktopgui/gui/DesktopguiConfigurationFrame.java:43 #: src/net/i2p/desktopgui/InternalTrayManager.java:126
msgid "Tray icon configuration" #: src/net/i2p/desktopgui/InternalTrayManager.java:278
msgstr "Systemleistensymbol konfigurieren" msgid "Restart I2P Immediately"
msgstr "I2P sofort neustarten"
#: src/net/i2p/desktopgui/gui/DesktopguiConfigurationFrame.java:46 #: src/net/i2p/desktopgui/InternalTrayManager.java:143
msgid "Should tray icon be enabled?" #: src/net/i2p/desktopgui/InternalTrayManager.java:295
msgstr "Systemleistensymbol aktivieren?" msgid "Stop I2P Immediately"
msgstr "I2P sofort beenden"
#: src/net/i2p/desktopgui/InternalTrayManager.java:157
#: src/net/i2p/desktopgui/InternalTrayManager.java:309
msgid "Cancel I2P Shutdown"
msgstr "Herunterfahren von I2P abbrechen"
#: src/net/i2p/desktopgui/InternalTrayManager.java:363
#, java-format
msgid "Shutdown in {0}"
msgstr "Herunterfahren in {0}"
#: src/net/i2p/desktopgui/InternalTrayManager.java:365
msgid "Shutdown imminent"
msgstr "Herunterfahren bevorstehend"
#. status translations are in the console bundle
#: src/net/i2p/desktopgui/InternalTrayManager.java:370
msgid "Network"
msgstr "Netzwerk"
#. Windows typically has tooltips; Linux (at least Ubuntu) doesn't
#: src/net/i2p/desktopgui/TrayManager.java:63
msgid "I2P: Right-click for menu"
msgstr "I2P: Rechtsklick für Menü"

View File

@ -4,53 +4,91 @@
# To contribute translations, see http://www.i2p2.de/newdevelopers # To contribute translations, see http://www.i2p2.de/newdevelopers
# #
# Translators: # Translators:
# <lixtetrax@grhack.net>, 2012. # lixtetrax <lixtetrax@grhack.net>, 2012
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: I2P\n" "Project-Id-Version: I2P\n"
"Report-Msgid-Bugs-To: https://trac.i2p2.de/\n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-03-03 18:29+0000\n" "POT-Creation-Date: 2016-05-25 12:29+0000\n"
"PO-Revision-Date: 2012-07-02 11:28+0000\n" "PO-Revision-Date: 2016-05-25 12:34+0000\n"
"Last-Translator: lixtetrax <lixtetrax@grhack.net>\n" "Last-Translator: zzzi2p\n"
"Language-Team: Greek (http://www.transifex.com/projects/p/I2P/language/el/)\n" "Language-Team: Greek (http://www.transifex.com/otf/I2P/language/el/)\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Language: el\n" "Language: el\n"
"Plural-Forms: nplurals=2; plural=(n != 1)\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: src/net/i2p/desktopgui/ExternalTrayManager.java:23 #: src/net/i2p/desktopgui/ExternalTrayManager.java:31
#: src/net/i2p/desktopgui/ExternalTrayManager.java:59
msgid "Start I2P" msgid "Start I2P"
msgstr "Έναρξη Ι2Ρ" msgstr "Έναρξη Ι2Ρ"
#: src/net/i2p/desktopgui/ExternalTrayManager.java:38 #: src/net/i2p/desktopgui/ExternalTrayManager.java:44
#: src/net/i2p/desktopgui/ExternalTrayManager.java:72
msgid "I2P is starting!" msgid "I2P is starting!"
msgstr "Το Ι2Ρ ξεκίνησε!" msgstr "Το Ι2Ρ ξεκίνησε!"
#: src/net/i2p/desktopgui/ExternalTrayManager.java:38 #: src/net/i2p/desktopgui/ExternalTrayManager.java:44
#: src/net/i2p/desktopgui/ExternalTrayManager.java:72
msgid "Starting" msgid "Starting"
msgstr "Έναρξη" msgstr "Έναρξη"
#: src/net/i2p/desktopgui/InternalTrayManager.java:26 #: src/net/i2p/desktopgui/InternalTrayManager.java:55
#: src/net/i2p/desktopgui/InternalTrayManager.java:207
msgid "Launch I2P Browser" msgid "Launch I2P Browser"
msgstr "Έναρξη φυλλομετρητή Ι2Ρ" msgstr "Έναρξη φυλλομετρητή Ι2Ρ"
#: src/net/i2p/desktopgui/InternalTrayManager.java:50 #: src/net/i2p/desktopgui/InternalTrayManager.java:76
msgid "Configure desktopgui" #: src/net/i2p/desktopgui/InternalTrayManager.java:228
msgstr "Παραμετροποίηση desktopgui" msgid "Configure I2P System Tray"
msgstr ""
#: src/net/i2p/desktopgui/InternalTrayManager.java:67 #: src/net/i2p/desktopgui/InternalTrayManager.java:77
#: src/net/i2p/desktopgui/InternalTrayManager.java:229
msgid "Disable"
msgstr ""
#: src/net/i2p/desktopgui/InternalTrayManager.java:93
#: src/net/i2p/desktopgui/InternalTrayManager.java:245
msgid "Restart I2P" msgid "Restart I2P"
msgstr "Επανεκκίνηση Ι2Ρ" msgstr "Επανεκκίνηση Ι2Ρ"
#: src/net/i2p/desktopgui/InternalTrayManager.java:85 #: src/net/i2p/desktopgui/InternalTrayManager.java:110
#: src/net/i2p/desktopgui/InternalTrayManager.java:262
msgid "Stop I2P" msgid "Stop I2P"
msgstr "Τερματισμός Ι2Ρ" msgstr "Τερματισμός Ι2Ρ"
#: src/net/i2p/desktopgui/gui/DesktopguiConfigurationFrame.java:44 #: src/net/i2p/desktopgui/InternalTrayManager.java:126
msgid "Tray icon configuration" #: src/net/i2p/desktopgui/InternalTrayManager.java:278
msgstr "Παραμετροποίηση εικονιδίου" msgid "Restart I2P Immediately"
msgstr ""
#: src/net/i2p/desktopgui/gui/DesktopguiConfigurationFrame.java:47 #: src/net/i2p/desktopgui/InternalTrayManager.java:143
msgid "Should tray icon be enabled?" #: src/net/i2p/desktopgui/InternalTrayManager.java:295
msgstr "Ενεργοποίηση εικονιδίου;" msgid "Stop I2P Immediately"
msgstr ""
#: src/net/i2p/desktopgui/InternalTrayManager.java:157
#: src/net/i2p/desktopgui/InternalTrayManager.java:309
msgid "Cancel I2P Shutdown"
msgstr ""
#: src/net/i2p/desktopgui/InternalTrayManager.java:363
#, java-format
msgid "Shutdown in {0}"
msgstr ""
#: src/net/i2p/desktopgui/InternalTrayManager.java:365
msgid "Shutdown imminent"
msgstr ""
#. status translations are in the console bundle
#: src/net/i2p/desktopgui/InternalTrayManager.java:370
msgid "Network"
msgstr ""
#. Windows typically has tooltips; Linux (at least Ubuntu) doesn't
#: src/net/i2p/desktopgui/TrayManager.java:63
msgid "I2P: Right-click for menu"
msgstr ""

View File

@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: I2P desktopgui\n" "Project-Id-Version: I2P desktopgui\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2014-01-09 19:27+0000\n" "POT-Creation-Date: 2016-05-25 12:29+0000\n"
"PO-Revision-Date: 2010-06-15 14:09+0100\n" "PO-Revision-Date: 2010-06-15 14:09+0100\n"
"Last-Translator: duck <duck@mail.i2p>\n" "Last-Translator: duck <duck@mail.i2p>\n"
"Language-Team: duck <duck@mail.i2p>\n" "Language-Team: duck <duck@mail.i2p>\n"
@ -18,38 +18,76 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1)\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n"
#: src/net/i2p/desktopgui/ExternalTrayManager.java:23 #: src/net/i2p/desktopgui/ExternalTrayManager.java:31
#: src/net/i2p/desktopgui/ExternalTrayManager.java:59
msgid "Start I2P" msgid "Start I2P"
msgstr "" msgstr ""
#: src/net/i2p/desktopgui/ExternalTrayManager.java:38 #: src/net/i2p/desktopgui/ExternalTrayManager.java:44
#: src/net/i2p/desktopgui/ExternalTrayManager.java:72
msgid "I2P is starting!" msgid "I2P is starting!"
msgstr "" msgstr ""
#: src/net/i2p/desktopgui/ExternalTrayManager.java:38 #: src/net/i2p/desktopgui/ExternalTrayManager.java:44
#: src/net/i2p/desktopgui/ExternalTrayManager.java:72
msgid "Starting" msgid "Starting"
msgstr "" msgstr ""
#: src/net/i2p/desktopgui/InternalTrayManager.java:26 #: src/net/i2p/desktopgui/InternalTrayManager.java:55
#: src/net/i2p/desktopgui/InternalTrayManager.java:207
msgid "Launch I2P Browser" msgid "Launch I2P Browser"
msgstr "" msgstr ""
#: src/net/i2p/desktopgui/InternalTrayManager.java:50 #: src/net/i2p/desktopgui/InternalTrayManager.java:76
msgid "Configure desktopgui" #: src/net/i2p/desktopgui/InternalTrayManager.java:228
msgid "Configure I2P System Tray"
msgstr "" msgstr ""
#: src/net/i2p/desktopgui/InternalTrayManager.java:67 #: src/net/i2p/desktopgui/InternalTrayManager.java:77
#: src/net/i2p/desktopgui/InternalTrayManager.java:229
msgid "Disable"
msgstr ""
#: src/net/i2p/desktopgui/InternalTrayManager.java:93
#: src/net/i2p/desktopgui/InternalTrayManager.java:245
msgid "Restart I2P" msgid "Restart I2P"
msgstr "" msgstr ""
#: src/net/i2p/desktopgui/InternalTrayManager.java:85 #: src/net/i2p/desktopgui/InternalTrayManager.java:110
#: src/net/i2p/desktopgui/InternalTrayManager.java:262
msgid "Stop I2P" msgid "Stop I2P"
msgstr "" msgstr ""
#: src/net/i2p/desktopgui/gui/DesktopguiConfigurationFrame.java:43 #: src/net/i2p/desktopgui/InternalTrayManager.java:126
msgid "Tray icon configuration" #: src/net/i2p/desktopgui/InternalTrayManager.java:278
msgid "Restart I2P Immediately"
msgstr "" msgstr ""
#: src/net/i2p/desktopgui/gui/DesktopguiConfigurationFrame.java:46 #: src/net/i2p/desktopgui/InternalTrayManager.java:143
msgid "Should tray icon be enabled?" #: src/net/i2p/desktopgui/InternalTrayManager.java:295
msgid "Stop I2P Immediately"
msgstr ""
#: src/net/i2p/desktopgui/InternalTrayManager.java:157
#: src/net/i2p/desktopgui/InternalTrayManager.java:309
msgid "Cancel I2P Shutdown"
msgstr ""
#: src/net/i2p/desktopgui/InternalTrayManager.java:363
#, java-format
msgid "Shutdown in {0}"
msgstr ""
#: src/net/i2p/desktopgui/InternalTrayManager.java:365
msgid "Shutdown imminent"
msgstr ""
#. status translations are in the console bundle
#: src/net/i2p/desktopgui/InternalTrayManager.java:370
msgid "Network"
msgstr ""
#. Windows typically has tooltips; Linux (at least Ubuntu) doesn't
#: src/net/i2p/desktopgui/TrayManager.java:63
msgid "I2P: Right-click for menu"
msgstr "" msgstr ""

View File

@ -2,55 +2,96 @@
# Copyright (C) 2009 The I2P Project # Copyright (C) 2009 The I2P Project
# This file is distributed under the same license as the desktopgui package. # This file is distributed under the same license as the desktopgui package.
# To contribute translations, see http://www.i2p2.de/newdevelopers # To contribute translations, see http://www.i2p2.de/newdevelopers
# foo <foo@bar>, 2009.
# #
# Translators:
# ducki2p <ducki2p@gmail.com>, 2011
# foo <foo@bar>, 2009
# punkibastardo <punkibastardo@gmail.com>, 2011
# strel, 2016
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: I2P\n" "Project-Id-Version: I2P\n"
"Report-Msgid-Bugs-To: https://trac.i2p2.de/\n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-03-03 18:29+0000\n" "POT-Creation-Date: 2016-05-25 12:29+0000\n"
"PO-Revision-Date: 2011-04-02 23:57+0100\n" "PO-Revision-Date: 2016-05-27 21:54+0000\n"
"Last-Translator: mixxy <m1xxy@mail.i2p>\n" "Last-Translator: strel\n"
"Language-Team: Spanish (Castilian) <None>\n" "Language-Team: Spanish (http://www.transifex.com/otf/I2P/language/es/)\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Language: es\n" "Language: es\n"
"Plural-Forms: nplurals=2; plural=(n != 1)\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: src/net/i2p/desktopgui/ExternalTrayManager.java:23 #: src/net/i2p/desktopgui/ExternalTrayManager.java:31
#: src/net/i2p/desktopgui/ExternalTrayManager.java:59
msgid "Start I2P" msgid "Start I2P"
msgstr "Iniciar I2P" msgstr "Iniciar I2P"
#: src/net/i2p/desktopgui/ExternalTrayManager.java:38 #: src/net/i2p/desktopgui/ExternalTrayManager.java:44
#: src/net/i2p/desktopgui/ExternalTrayManager.java:72
msgid "I2P is starting!" msgid "I2P is starting!"
msgstr "I2P está iniciando!" msgstr "I2P está iniciando!"
#: src/net/i2p/desktopgui/ExternalTrayManager.java:38 #: src/net/i2p/desktopgui/ExternalTrayManager.java:44
#: src/net/i2p/desktopgui/ExternalTrayManager.java:72
msgid "Starting" msgid "Starting"
msgstr "Iniciando" msgstr "Iniciando"
#: src/net/i2p/desktopgui/InternalTrayManager.java:26 #: src/net/i2p/desktopgui/InternalTrayManager.java:55
#: src/net/i2p/desktopgui/InternalTrayManager.java:207
msgid "Launch I2P Browser" msgid "Launch I2P Browser"
msgstr "Lanzar navegador I2P" msgstr "Lanzar navegador I2P"
#: src/net/i2p/desktopgui/InternalTrayManager.java:50 #: src/net/i2p/desktopgui/InternalTrayManager.java:76
msgid "Configure desktopgui" #: src/net/i2p/desktopgui/InternalTrayManager.java:228
msgstr "Configurar desktopgui" msgid "Configure I2P System Tray"
msgstr "Configurar la bandeja de sistema de I2P"
#: src/net/i2p/desktopgui/InternalTrayManager.java:67 #: src/net/i2p/desktopgui/InternalTrayManager.java:77
#: src/net/i2p/desktopgui/InternalTrayManager.java:229
msgid "Disable"
msgstr "Deshabilitar"
#: src/net/i2p/desktopgui/InternalTrayManager.java:93
#: src/net/i2p/desktopgui/InternalTrayManager.java:245
msgid "Restart I2P" msgid "Restart I2P"
msgstr "Reiniciar I2P" msgstr "Reiniciar I2P"
#: src/net/i2p/desktopgui/InternalTrayManager.java:85 #: src/net/i2p/desktopgui/InternalTrayManager.java:110
#: src/net/i2p/desktopgui/InternalTrayManager.java:262
msgid "Stop I2P" msgid "Stop I2P"
msgstr "Detener I2P" msgstr "Detener I2P"
#: src/net/i2p/desktopgui/gui/DesktopguiConfigurationFrame.java:44 #: src/net/i2p/desktopgui/InternalTrayManager.java:126
msgid "Tray icon configuration" #: src/net/i2p/desktopgui/InternalTrayManager.java:278
msgstr "Configuración del ícono de la barra de tareas" msgid "Restart I2P Immediately"
msgstr "Reiniciar I2P inmediatamente"
#: src/net/i2p/desktopgui/gui/DesktopguiConfigurationFrame.java:47 #: src/net/i2p/desktopgui/InternalTrayManager.java:143
msgid "Should tray icon be enabled?" #: src/net/i2p/desktopgui/InternalTrayManager.java:295
msgstr "¿Debería estar activado el ícono de la barra de tareas?" msgid "Stop I2P Immediately"
msgstr "Detener I2P inmediatamente"
#: src/net/i2p/desktopgui/InternalTrayManager.java:157
#: src/net/i2p/desktopgui/InternalTrayManager.java:309
msgid "Cancel I2P Shutdown"
msgstr "Cancelar el cierre de I2P"
#: src/net/i2p/desktopgui/InternalTrayManager.java:363
#, java-format
msgid "Shutdown in {0}"
msgstr "Cierre en {0}"
#: src/net/i2p/desktopgui/InternalTrayManager.java:365
msgid "Shutdown imminent"
msgstr "Cierre inminente"
#. status translations are in the console bundle
#: src/net/i2p/desktopgui/InternalTrayManager.java:370
msgid "Network"
msgstr "Red"
#. Windows typically has tooltips; Linux (at least Ubuntu) doesn't
#: src/net/i2p/desktopgui/TrayManager.java:63
msgid "I2P: Right-click for menu"
msgstr "I2P: Clic secundario para menú"

View File

@ -0,0 +1,94 @@
# I2P
# Copyright (C) 2009 The I2P Project
# This file is distributed under the same license as the desktopgui package.
# To contribute translations, see http://www.i2p2.de/newdevelopers
#
# Translators:
# NoProfile, 2016
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: 2016-05-25 12:34+0000\n"
"Last-Translator: zzzi2p\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"
"Content-Transfer-Encoding: 8bit\n"
"Language: fa\n"
"Plural-Forms: nplurals=1; plural=0;\n"
#: src/net/i2p/desktopgui/ExternalTrayManager.java:31
#: src/net/i2p/desktopgui/ExternalTrayManager.java:59
msgid "Start I2P"
msgstr "شروع I2P"
#: src/net/i2p/desktopgui/ExternalTrayManager.java:44
#: src/net/i2p/desktopgui/ExternalTrayManager.java:72
msgid "I2P is starting!"
msgstr ""
#: src/net/i2p/desktopgui/ExternalTrayManager.java:44
#: src/net/i2p/desktopgui/ExternalTrayManager.java:72
msgid "Starting"
msgstr "راه اندازی"
#: src/net/i2p/desktopgui/InternalTrayManager.java:55
#: src/net/i2p/desktopgui/InternalTrayManager.java:207
msgid "Launch I2P Browser"
msgstr "راه اندازی مرورگر I2P"
#: src/net/i2p/desktopgui/InternalTrayManager.java:76
#: src/net/i2p/desktopgui/InternalTrayManager.java:228
msgid "Configure I2P System Tray"
msgstr ""
#: src/net/i2p/desktopgui/InternalTrayManager.java:77
#: src/net/i2p/desktopgui/InternalTrayManager.java:229
msgid "Disable"
msgstr ""
#: src/net/i2p/desktopgui/InternalTrayManager.java:93
#: src/net/i2p/desktopgui/InternalTrayManager.java:245
msgid "Restart I2P"
msgstr ""
#: src/net/i2p/desktopgui/InternalTrayManager.java:110
#: src/net/i2p/desktopgui/InternalTrayManager.java:262
msgid "Stop I2P"
msgstr ""
#: src/net/i2p/desktopgui/InternalTrayManager.java:126
#: src/net/i2p/desktopgui/InternalTrayManager.java:278
msgid "Restart I2P Immediately"
msgstr ""
#: src/net/i2p/desktopgui/InternalTrayManager.java:143
#: src/net/i2p/desktopgui/InternalTrayManager.java:295
msgid "Stop I2P Immediately"
msgstr ""
#: src/net/i2p/desktopgui/InternalTrayManager.java:157
#: src/net/i2p/desktopgui/InternalTrayManager.java:309
msgid "Cancel I2P Shutdown"
msgstr ""
#: src/net/i2p/desktopgui/InternalTrayManager.java:363
#, java-format
msgid "Shutdown in {0}"
msgstr ""
#: src/net/i2p/desktopgui/InternalTrayManager.java:365
msgid "Shutdown imminent"
msgstr ""
#. status translations are in the console bundle
#: src/net/i2p/desktopgui/InternalTrayManager.java:370
msgid "Network"
msgstr ""
#. Windows typically has tooltips; Linux (at least Ubuntu) doesn't
#: src/net/i2p/desktopgui/TrayManager.java:63
msgid "I2P: Right-click for menu"
msgstr ""

View File

@ -0,0 +1,95 @@
# I2P
# Copyright (C) 2009 The I2P Project
# This file is distributed under the same license as the desktopgui package.
# To contribute translations, see http://www.i2p2.de/newdevelopers
#
# Translators:
# Jorma Karvonen <karvonen.jorma@gmail.com>, 2015
# outolumo <outolumo@gmail.com>, 2015-2016
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: 2016-06-01 18:50+0000\n"
"Last-Translator: outolumo <outolumo@gmail.com>\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"
"Content-Transfer-Encoding: 8bit\n"
"Language: fi\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: src/net/i2p/desktopgui/ExternalTrayManager.java:31
#: src/net/i2p/desktopgui/ExternalTrayManager.java:59
msgid "Start I2P"
msgstr "Käynnistä I2P"
#: src/net/i2p/desktopgui/ExternalTrayManager.java:44
#: src/net/i2p/desktopgui/ExternalTrayManager.java:72
msgid "I2P is starting!"
msgstr "I2P on käynnistyy!"
#: src/net/i2p/desktopgui/ExternalTrayManager.java:44
#: src/net/i2p/desktopgui/ExternalTrayManager.java:72
msgid "Starting"
msgstr "Käynnistetään"
#: src/net/i2p/desktopgui/InternalTrayManager.java:55
#: src/net/i2p/desktopgui/InternalTrayManager.java:207
msgid "Launch I2P Browser"
msgstr "Käynnistä I2P-selain"
#: src/net/i2p/desktopgui/InternalTrayManager.java:76
#: src/net/i2p/desktopgui/InternalTrayManager.java:228
msgid "Configure I2P System Tray"
msgstr "I2P tehtäväpalkin asetukset"
#: src/net/i2p/desktopgui/InternalTrayManager.java:77
#: src/net/i2p/desktopgui/InternalTrayManager.java:229
msgid "Disable"
msgstr "Poista käytöstä"
#: src/net/i2p/desktopgui/InternalTrayManager.java:93
#: src/net/i2p/desktopgui/InternalTrayManager.java:245
msgid "Restart I2P"
msgstr "Käynnistä I2P uudelleen"
#: src/net/i2p/desktopgui/InternalTrayManager.java:110
#: src/net/i2p/desktopgui/InternalTrayManager.java:262
msgid "Stop I2P"
msgstr "Pysäytä I2P"
#: src/net/i2p/desktopgui/InternalTrayManager.java:126
#: src/net/i2p/desktopgui/InternalTrayManager.java:278
msgid "Restart I2P Immediately"
msgstr "Käynnistä I2P uudelleen heti"
#: src/net/i2p/desktopgui/InternalTrayManager.java:143
#: src/net/i2p/desktopgui/InternalTrayManager.java:295
msgid "Stop I2P Immediately"
msgstr "Pysäytä I2P heti"
#: src/net/i2p/desktopgui/InternalTrayManager.java:157
#: src/net/i2p/desktopgui/InternalTrayManager.java:309
msgid "Cancel I2P Shutdown"
msgstr "Peruuta I2P:n sammutus"
#: src/net/i2p/desktopgui/InternalTrayManager.java:363
#, java-format
msgid "Shutdown in {0}"
msgstr "Sammuta {0} kuluttua..."
#: src/net/i2p/desktopgui/InternalTrayManager.java:365
msgid "Shutdown imminent"
msgstr "Sammutus välittömästi"
#. status translations are in the console bundle
#: src/net/i2p/desktopgui/InternalTrayManager.java:370
msgid "Network"
msgstr "Verkko"
#. Windows typically has tooltips; Linux (at least Ubuntu) doesn't
#: src/net/i2p/desktopgui/TrayManager.java:63
msgid "I2P: Right-click for menu"
msgstr "I2P: Valikko hiiren kakkosnapilla"

View File

@ -5,56 +5,95 @@
# #
# Translators: # Translators:
# blabla <blabla@trash-mail.com>, 2011 # blabla <blabla@trash-mail.com>, 2011
# Boxoa590, 2013
# ducki2p <ducki2p@gmail.com>, 2011 # ducki2p <ducki2p@gmail.com>, 2011
# foo <foo@bar>, 2009 # foo <foo@bar>, 2009
# Boxoa590, 2013 # Boxoa590, 2013
# Towinet, 2016
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: I2P\n" "Project-Id-Version: I2P\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2014-01-09 19:14+0000\n" "POT-Creation-Date: 2016-05-25 12:29+0000\n"
"PO-Revision-Date: 2013-06-08 04:50+0000\n" "PO-Revision-Date: 2016-05-26 15:55+0000\n"
"Last-Translator: Boxoa590\n" "Last-Translator: Towinet\n"
"Language-Team: French (http://www.transifex.com/projects/p/I2P/language/" "Language-Team: French (http://www.transifex.com/otf/I2P/language/fr/)\n"
"fr/)\n"
"Language: fr\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Language: fr\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n"
#: src/net/i2p/desktopgui/ExternalTrayManager.java:23 #: src/net/i2p/desktopgui/ExternalTrayManager.java:31
#: src/net/i2p/desktopgui/ExternalTrayManager.java:59
msgid "Start I2P" msgid "Start I2P"
msgstr "Démarrer I2P" msgstr "Démarrer I2P"
#: src/net/i2p/desktopgui/ExternalTrayManager.java:38 #: src/net/i2p/desktopgui/ExternalTrayManager.java:44
#: src/net/i2p/desktopgui/ExternalTrayManager.java:72
msgid "I2P is starting!" msgid "I2P is starting!"
msgstr "I2P démarre !" msgstr "I2P démarre !"
#: src/net/i2p/desktopgui/ExternalTrayManager.java:38 #: src/net/i2p/desktopgui/ExternalTrayManager.java:44
#: src/net/i2p/desktopgui/ExternalTrayManager.java:72
msgid "Starting" msgid "Starting"
msgstr "Démarrage" msgstr "Démarrage"
#: src/net/i2p/desktopgui/InternalTrayManager.java:26 #: src/net/i2p/desktopgui/InternalTrayManager.java:55
#: src/net/i2p/desktopgui/InternalTrayManager.java:207
msgid "Launch I2P Browser" msgid "Launch I2P Browser"
msgstr "Lancer le navigateur I2P" msgstr "Lancer le navigateur I2P"
#: src/net/i2p/desktopgui/InternalTrayManager.java:50 #: src/net/i2p/desktopgui/InternalTrayManager.java:76
msgid "Configure desktopgui" #: src/net/i2p/desktopgui/InternalTrayManager.java:228
msgstr "Configurer l'interface de bureau" msgid "Configure I2P System Tray"
msgstr "Configurer la zone de notification d'I2P"
#: src/net/i2p/desktopgui/InternalTrayManager.java:67 #: src/net/i2p/desktopgui/InternalTrayManager.java:77
#: src/net/i2p/desktopgui/InternalTrayManager.java:229
msgid "Disable"
msgstr "Désactiver"
#: src/net/i2p/desktopgui/InternalTrayManager.java:93
#: src/net/i2p/desktopgui/InternalTrayManager.java:245
msgid "Restart I2P" msgid "Restart I2P"
msgstr "Redémarrer I2P" msgstr "Redémarrer I2P"
#: src/net/i2p/desktopgui/InternalTrayManager.java:85 #: src/net/i2p/desktopgui/InternalTrayManager.java:110
#: src/net/i2p/desktopgui/InternalTrayManager.java:262
msgid "Stop I2P" msgid "Stop I2P"
msgstr "Arrêter I2P" msgstr "Arrêter I2P"
#: src/net/i2p/desktopgui/gui/DesktopguiConfigurationFrame.java:43 #: src/net/i2p/desktopgui/InternalTrayManager.java:126
msgid "Tray icon configuration" #: src/net/i2p/desktopgui/InternalTrayManager.java:278
msgstr "Configuration de l'icône de notification" msgid "Restart I2P Immediately"
msgstr "Redémarrer I2P immédiatement"
#: src/net/i2p/desktopgui/gui/DesktopguiConfigurationFrame.java:46 #: src/net/i2p/desktopgui/InternalTrayManager.java:143
msgid "Should tray icon be enabled?" #: src/net/i2p/desktopgui/InternalTrayManager.java:295
msgstr "Activer l'icône de notification ?" msgid "Stop I2P Immediately"
msgstr "Arrêter I2P immédiatement"
#: src/net/i2p/desktopgui/InternalTrayManager.java:157
#: src/net/i2p/desktopgui/InternalTrayManager.java:309
msgid "Cancel I2P Shutdown"
msgstr "Annuler l'arrêt d'I2P"
#: src/net/i2p/desktopgui/InternalTrayManager.java:363
#, java-format
msgid "Shutdown in {0}"
msgstr "Arrêt dans {0}"
#: src/net/i2p/desktopgui/InternalTrayManager.java:365
msgid "Shutdown imminent"
msgstr "Arrêt imminent"
#. status translations are in the console bundle
#: src/net/i2p/desktopgui/InternalTrayManager.java:370
msgid "Network"
msgstr "Réseau"
#. Windows typically has tooltips; Linux (at least Ubuntu) doesn't
#: src/net/i2p/desktopgui/TrayManager.java:63
msgid "I2P: Right-click for menu"
msgstr "I2P : clic droit pour menu"

View File

@ -7,49 +7,87 @@
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: I2P\n" "Project-Id-Version: I2P\n"
"Report-Msgid-Bugs-To: https://trac.i2p2.de/\n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-03-03 18:29+0000\n" "POT-Creation-Date: 2016-05-25 12:29+0000\n"
"PO-Revision-Date: 2012-06-01 16:28+0000\n" "PO-Revision-Date: 2016-05-25 12:34+0000\n"
"Last-Translator: AdminLMH <lehetmashogy@i2pmail.org>\n" "Last-Translator: zzzi2p\n"
"Language-Team: Hungarian (http://www.transifex.net/projects/p/I2P/language/hu/)\n" "Language-Team: Hungarian (http://www.transifex.com/otf/I2P/language/hu/)\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Language: hu\n" "Language: hu\n"
"Plural-Forms: nplurals=2; plural=(n != 1)\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: src/net/i2p/desktopgui/ExternalTrayManager.java:23 #: src/net/i2p/desktopgui/ExternalTrayManager.java:31
#: src/net/i2p/desktopgui/ExternalTrayManager.java:59
msgid "Start I2P" msgid "Start I2P"
msgstr "I2P indítása" msgstr "I2P indítása"
#: src/net/i2p/desktopgui/ExternalTrayManager.java:38 #: src/net/i2p/desktopgui/ExternalTrayManager.java:44
#: src/net/i2p/desktopgui/ExternalTrayManager.java:72
msgid "I2P is starting!" msgid "I2P is starting!"
msgstr "I2P indul!" msgstr "I2P indul!"
#: src/net/i2p/desktopgui/ExternalTrayManager.java:38 #: src/net/i2p/desktopgui/ExternalTrayManager.java:44
#: src/net/i2p/desktopgui/ExternalTrayManager.java:72
msgid "Starting" msgid "Starting"
msgstr "indítás" msgstr "indítás"
#: src/net/i2p/desktopgui/InternalTrayManager.java:26 #: src/net/i2p/desktopgui/InternalTrayManager.java:55
#: src/net/i2p/desktopgui/InternalTrayManager.java:207
msgid "Launch I2P Browser" msgid "Launch I2P Browser"
msgstr "I2P Böngésző Indítása" msgstr "I2P Böngésző Indítása"
#: src/net/i2p/desktopgui/InternalTrayManager.java:50 #: src/net/i2p/desktopgui/InternalTrayManager.java:76
msgid "Configure desktopgui" #: src/net/i2p/desktopgui/InternalTrayManager.java:228
msgstr "Asztali Grafikus Felület Beállítása" msgid "Configure I2P System Tray"
msgstr ""
#: src/net/i2p/desktopgui/InternalTrayManager.java:67 #: src/net/i2p/desktopgui/InternalTrayManager.java:77
#: src/net/i2p/desktopgui/InternalTrayManager.java:229
msgid "Disable"
msgstr ""
#: src/net/i2p/desktopgui/InternalTrayManager.java:93
#: src/net/i2p/desktopgui/InternalTrayManager.java:245
msgid "Restart I2P" msgid "Restart I2P"
msgstr "I2P Újraindítása" msgstr "I2P Újraindítása"
#: src/net/i2p/desktopgui/InternalTrayManager.java:85 #: src/net/i2p/desktopgui/InternalTrayManager.java:110
#: src/net/i2p/desktopgui/InternalTrayManager.java:262
msgid "Stop I2P" msgid "Stop I2P"
msgstr "I2P Leállítása" msgstr "I2P Leállítása"
#: src/net/i2p/desktopgui/gui/DesktopguiConfigurationFrame.java:44 #: src/net/i2p/desktopgui/InternalTrayManager.java:126
msgid "Tray icon configuration" #: src/net/i2p/desktopgui/InternalTrayManager.java:278
msgstr "Tálcaikon beállítása" msgid "Restart I2P Immediately"
msgstr ""
#: src/net/i2p/desktopgui/gui/DesktopguiConfigurationFrame.java:47 #: src/net/i2p/desktopgui/InternalTrayManager.java:143
msgid "Should tray icon be enabled?" #: src/net/i2p/desktopgui/InternalTrayManager.java:295
msgstr "Tálcaikon engedélyezve legyen?" msgid "Stop I2P Immediately"
msgstr ""
#: src/net/i2p/desktopgui/InternalTrayManager.java:157
#: src/net/i2p/desktopgui/InternalTrayManager.java:309
msgid "Cancel I2P Shutdown"
msgstr ""
#: src/net/i2p/desktopgui/InternalTrayManager.java:363
#, java-format
msgid "Shutdown in {0}"
msgstr ""
#: src/net/i2p/desktopgui/InternalTrayManager.java:365
msgid "Shutdown imminent"
msgstr ""
#. status translations are in the console bundle
#: src/net/i2p/desktopgui/InternalTrayManager.java:370
msgid "Network"
msgstr ""
#. Windows typically has tooltips; Linux (at least Ubuntu) doesn't
#: src/net/i2p/desktopgui/TrayManager.java:63
msgid "I2P: Right-click for menu"
msgstr ""

View File

@ -0,0 +1,94 @@
# I2P
# Copyright (C) 2009 The I2P Project
# This file is distributed under the same license as the desktopgui package.
# To contribute translations, see http://www.i2p2.de/newdevelopers
#
# Translators:
# Khairul Agasta <khairuldroids@gmail.com>, 2014
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: 2016-05-25 12:34+0000\n"
"Last-Translator: zzzi2p\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"
"Content-Transfer-Encoding: 8bit\n"
"Language: id\n"
"Plural-Forms: nplurals=1; plural=0;\n"
#: src/net/i2p/desktopgui/ExternalTrayManager.java:31
#: src/net/i2p/desktopgui/ExternalTrayManager.java:59
msgid "Start I2P"
msgstr "Mulai I2P"
#: src/net/i2p/desktopgui/ExternalTrayManager.java:44
#: src/net/i2p/desktopgui/ExternalTrayManager.java:72
msgid "I2P is starting!"
msgstr "I2P sudah memulai!"
#: src/net/i2p/desktopgui/ExternalTrayManager.java:44
#: src/net/i2p/desktopgui/ExternalTrayManager.java:72
msgid "Starting"
msgstr "Memulai"
#: src/net/i2p/desktopgui/InternalTrayManager.java:55
#: src/net/i2p/desktopgui/InternalTrayManager.java:207
msgid "Launch I2P Browser"
msgstr "Luncurkan Peramban I2P"
#: src/net/i2p/desktopgui/InternalTrayManager.java:76
#: src/net/i2p/desktopgui/InternalTrayManager.java:228
msgid "Configure I2P System Tray"
msgstr ""
#: src/net/i2p/desktopgui/InternalTrayManager.java:77
#: src/net/i2p/desktopgui/InternalTrayManager.java:229
msgid "Disable"
msgstr ""
#: src/net/i2p/desktopgui/InternalTrayManager.java:93
#: src/net/i2p/desktopgui/InternalTrayManager.java:245
msgid "Restart I2P"
msgstr "Mulai ulang I2P"
#: src/net/i2p/desktopgui/InternalTrayManager.java:110
#: src/net/i2p/desktopgui/InternalTrayManager.java:262
msgid "Stop I2P"
msgstr "Hentikan I2P"
#: src/net/i2p/desktopgui/InternalTrayManager.java:126
#: src/net/i2p/desktopgui/InternalTrayManager.java:278
msgid "Restart I2P Immediately"
msgstr ""
#: src/net/i2p/desktopgui/InternalTrayManager.java:143
#: src/net/i2p/desktopgui/InternalTrayManager.java:295
msgid "Stop I2P Immediately"
msgstr ""
#: src/net/i2p/desktopgui/InternalTrayManager.java:157
#: src/net/i2p/desktopgui/InternalTrayManager.java:309
msgid "Cancel I2P Shutdown"
msgstr ""
#: src/net/i2p/desktopgui/InternalTrayManager.java:363
#, java-format
msgid "Shutdown in {0}"
msgstr ""
#: src/net/i2p/desktopgui/InternalTrayManager.java:365
msgid "Shutdown imminent"
msgstr ""
#. status translations are in the console bundle
#: src/net/i2p/desktopgui/InternalTrayManager.java:370
msgid "Network"
msgstr ""
#. Windows typically has tooltips; Linux (at least Ubuntu) doesn't
#: src/net/i2p/desktopgui/TrayManager.java:63
msgid "I2P: Right-click for menu"
msgstr ""

View File

@ -4,54 +4,93 @@
# To contribute translations, see http://www.i2p2.de/newdevelopers # To contribute translations, see http://www.i2p2.de/newdevelopers
# #
# Translators: # Translators:
# <bovas85@gmail.com>, 2012. # Leelium <bovas85@gmail.com>, 2012
# <jokjok@hotmail.it>, 2011. # mkkid <jokjok@hotmail.it>, 2011
# Sebastiano Pistore <olatusrooc@virgilio.it>, 2016
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: I2P\n" "Project-Id-Version: I2P\n"
"Report-Msgid-Bugs-To: https://trac.i2p2.de/\n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-03-03 18:29+0000\n" "POT-Creation-Date: 2016-05-25 12:29+0000\n"
"PO-Revision-Date: 2012-06-01 12:21+0000\n" "PO-Revision-Date: 2016-05-26 09:32+0000\n"
"Last-Translator: Leelium <bovas85@gmail.com>\n" "Last-Translator: Sebastiano Pistore <olatusrooc@virgilio.it>\n"
"Language-Team: Italian (http://www.transifex.net/projects/p/I2P/language/it/)\n" "Language-Team: Italian (http://www.transifex.com/otf/I2P/language/it/)\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Language: it\n" "Language: it\n"
"Plural-Forms: nplurals=2; plural=(n != 1)\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: src/net/i2p/desktopgui/ExternalTrayManager.java:23 #: src/net/i2p/desktopgui/ExternalTrayManager.java:31
#: src/net/i2p/desktopgui/ExternalTrayManager.java:59
msgid "Start I2P" msgid "Start I2P"
msgstr "Avvia I2P" msgstr "Avvia I2P"
#: src/net/i2p/desktopgui/ExternalTrayManager.java:38 #: src/net/i2p/desktopgui/ExternalTrayManager.java:44
#: src/net/i2p/desktopgui/ExternalTrayManager.java:72
msgid "I2P is starting!" msgid "I2P is starting!"
msgstr "Avvio di I2P in corso!" msgstr "Avvio di I2P in corso!"
#: src/net/i2p/desktopgui/ExternalTrayManager.java:38 #: src/net/i2p/desktopgui/ExternalTrayManager.java:44
#: src/net/i2p/desktopgui/ExternalTrayManager.java:72
msgid "Starting" msgid "Starting"
msgstr "Avvio" msgstr "Avvio"
#: src/net/i2p/desktopgui/InternalTrayManager.java:26 #: src/net/i2p/desktopgui/InternalTrayManager.java:55
#: src/net/i2p/desktopgui/InternalTrayManager.java:207
msgid "Launch I2P Browser" msgid "Launch I2P Browser"
msgstr "Avvia il Browser I2P" msgstr "Avvia il Browser I2P"
#: src/net/i2p/desktopgui/InternalTrayManager.java:50 #: src/net/i2p/desktopgui/InternalTrayManager.java:76
msgid "Configure desktopgui" #: src/net/i2p/desktopgui/InternalTrayManager.java:228
msgstr "Configura desktopgui" msgid "Configure I2P System Tray"
msgstr "Configura l'icona di I2P nella Barra dei notifica"
#: src/net/i2p/desktopgui/InternalTrayManager.java:67 #: src/net/i2p/desktopgui/InternalTrayManager.java:77
#: src/net/i2p/desktopgui/InternalTrayManager.java:229
msgid "Disable"
msgstr "Disabilita"
#: src/net/i2p/desktopgui/InternalTrayManager.java:93
#: src/net/i2p/desktopgui/InternalTrayManager.java:245
msgid "Restart I2P" msgid "Restart I2P"
msgstr "Riavvia I2P" msgstr "Riavvia I2P"
#: src/net/i2p/desktopgui/InternalTrayManager.java:85 #: src/net/i2p/desktopgui/InternalTrayManager.java:110
#: src/net/i2p/desktopgui/InternalTrayManager.java:262
msgid "Stop I2P" msgid "Stop I2P"
msgstr "Ferma I2P" msgstr "Ferma I2P"
#: src/net/i2p/desktopgui/gui/DesktopguiConfigurationFrame.java:44 #: src/net/i2p/desktopgui/InternalTrayManager.java:126
msgid "Tray icon configuration" #: src/net/i2p/desktopgui/InternalTrayManager.java:278
msgstr "Configurazione dell'icona nell'area di notifica" msgid "Restart I2P Immediately"
msgstr "Riavvia subito I2P"
#: src/net/i2p/desktopgui/gui/DesktopguiConfigurationFrame.java:47 #: src/net/i2p/desktopgui/InternalTrayManager.java:143
msgid "Should tray icon be enabled?" #: src/net/i2p/desktopgui/InternalTrayManager.java:295
msgstr "Vuoi che l'icona nelll'rea di notifica venga abilitata?" msgid "Stop I2P Immediately"
msgstr "Arresta subito I2P"
#: src/net/i2p/desktopgui/InternalTrayManager.java:157
#: src/net/i2p/desktopgui/InternalTrayManager.java:309
msgid "Cancel I2P Shutdown"
msgstr "Annulla l'arresto di I2P"
#: src/net/i2p/desktopgui/InternalTrayManager.java:363
#, java-format
msgid "Shutdown in {0}"
msgstr "Spegnimento in {0}"
#: src/net/i2p/desktopgui/InternalTrayManager.java:365
msgid "Shutdown imminent"
msgstr "Spegnimento imminente"
#. status translations are in the console bundle
#: src/net/i2p/desktopgui/InternalTrayManager.java:370
msgid "Network"
msgstr "Rete"
#. Windows typically has tooltips; Linux (at least Ubuntu) doesn't
#: src/net/i2p/desktopgui/TrayManager.java:63
msgid "I2P: Right-click for menu"
msgstr "I2P: Fai un click destro per aprire il menu"

View File

@ -4,53 +4,91 @@
# To contribute translations, see http://www.i2p2.de/newdevelopers # To contribute translations, see http://www.i2p2.de/newdevelopers
# #
# Translators: # Translators:
# plazmism <gomidori@live.jp>, 2013 # タカハシ <indexial@outlook.jp>, 2013
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: I2P\n" "Project-Id-Version: I2P\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-03-03 18:29+0000\n" "POT-Creation-Date: 2016-05-25 12:29+0000\n"
"PO-Revision-Date: 2013-11-26 10:38+0000\n" "PO-Revision-Date: 2016-05-25 12:34+0000\n"
"Last-Translator: plazmism <gomidori@live.jp>\n" "Last-Translator: zzzi2p\n"
"Language-Team: Japanese (http://www.transifex.com/projects/p/I2P/language/ja/)\n" "Language-Team: Japanese (http://www.transifex.com/otf/I2P/language/ja/)\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Language: ja\n" "Language: ja\n"
"Plural-Forms: nplurals=1; plural=0;\n" "Plural-Forms: nplurals=1; plural=0;\n"
#: src/net/i2p/desktopgui/ExternalTrayManager.java:23 #: src/net/i2p/desktopgui/ExternalTrayManager.java:31
#: src/net/i2p/desktopgui/ExternalTrayManager.java:59
msgid "Start I2P" msgid "Start I2P"
msgstr "I2P を開始" msgstr "I2P を開始"
#: src/net/i2p/desktopgui/ExternalTrayManager.java:38 #: src/net/i2p/desktopgui/ExternalTrayManager.java:44
#: src/net/i2p/desktopgui/ExternalTrayManager.java:72
msgid "I2P is starting!" msgid "I2P is starting!"
msgstr "I2P 起動中!" msgstr "I2P 起動中!"
#: src/net/i2p/desktopgui/ExternalTrayManager.java:38 #: src/net/i2p/desktopgui/ExternalTrayManager.java:44
#: src/net/i2p/desktopgui/ExternalTrayManager.java:72
msgid "Starting" msgid "Starting"
msgstr "起動中" msgstr "起動中"
#: src/net/i2p/desktopgui/InternalTrayManager.java:26 #: src/net/i2p/desktopgui/InternalTrayManager.java:55
#: src/net/i2p/desktopgui/InternalTrayManager.java:207
msgid "Launch I2P Browser" msgid "Launch I2P Browser"
msgstr "I2P ブラウザを起動" msgstr "I2P ブラウザを起動"
#: src/net/i2p/desktopgui/InternalTrayManager.java:50 #: src/net/i2p/desktopgui/InternalTrayManager.java:76
msgid "Configure desktopgui" #: src/net/i2p/desktopgui/InternalTrayManager.java:228
msgstr "desktopgui を設定" msgid "Configure I2P System Tray"
msgstr ""
#: src/net/i2p/desktopgui/InternalTrayManager.java:67 #: src/net/i2p/desktopgui/InternalTrayManager.java:77
#: src/net/i2p/desktopgui/InternalTrayManager.java:229
msgid "Disable"
msgstr ""
#: src/net/i2p/desktopgui/InternalTrayManager.java:93
#: src/net/i2p/desktopgui/InternalTrayManager.java:245
msgid "Restart I2P" msgid "Restart I2P"
msgstr "I2P を再起動" msgstr "I2P を再起動"
#: src/net/i2p/desktopgui/InternalTrayManager.java:85 #: src/net/i2p/desktopgui/InternalTrayManager.java:110
#: src/net/i2p/desktopgui/InternalTrayManager.java:262
msgid "Stop I2P" msgid "Stop I2P"
msgstr "I2P を停止" msgstr "I2P を停止"
#: src/net/i2p/desktopgui/gui/DesktopguiConfigurationFrame.java:44 #: src/net/i2p/desktopgui/InternalTrayManager.java:126
msgid "Tray icon configuration" #: src/net/i2p/desktopgui/InternalTrayManager.java:278
msgstr "トレイアイコン設定" msgid "Restart I2P Immediately"
msgstr ""
#: src/net/i2p/desktopgui/gui/DesktopguiConfigurationFrame.java:47 #: src/net/i2p/desktopgui/InternalTrayManager.java:143
msgid "Should tray icon be enabled?" #: src/net/i2p/desktopgui/InternalTrayManager.java:295
msgstr "トレイアイコンを有効にしますか?" msgid "Stop I2P Immediately"
msgstr ""
#: src/net/i2p/desktopgui/InternalTrayManager.java:157
#: src/net/i2p/desktopgui/InternalTrayManager.java:309
msgid "Cancel I2P Shutdown"
msgstr ""
#: src/net/i2p/desktopgui/InternalTrayManager.java:363
#, java-format
msgid "Shutdown in {0}"
msgstr ""
#: src/net/i2p/desktopgui/InternalTrayManager.java:365
msgid "Shutdown imminent"
msgstr ""
#. status translations are in the console bundle
#: src/net/i2p/desktopgui/InternalTrayManager.java:370
msgid "Network"
msgstr ""
#. Windows typically has tooltips; Linux (at least Ubuntu) doesn't
#: src/net/i2p/desktopgui/TrayManager.java:63
msgid "I2P: Right-click for menu"
msgstr ""

View File

@ -0,0 +1,94 @@
# I2P
# Copyright (C) 2009 The I2P Project
# This file is distributed under the same license as the desktopgui package.
# To contribute translations, see http://www.i2p2.de/newdevelopers
#
# Translators:
# Choi Yeon-Ung <kqwe1859@gmail.com>, 2014
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: 2016-05-25 12:34+0000\n"
"Last-Translator: zzzi2p\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"
"Content-Transfer-Encoding: 8bit\n"
"Language: ko\n"
"Plural-Forms: nplurals=1; plural=0;\n"
#: src/net/i2p/desktopgui/ExternalTrayManager.java:31
#: src/net/i2p/desktopgui/ExternalTrayManager.java:59
msgid "Start I2P"
msgstr "I2P 시작"
#: src/net/i2p/desktopgui/ExternalTrayManager.java:44
#: src/net/i2p/desktopgui/ExternalTrayManager.java:72
msgid "I2P is starting!"
msgstr "I2P 시작중!"
#: src/net/i2p/desktopgui/ExternalTrayManager.java:44
#: src/net/i2p/desktopgui/ExternalTrayManager.java:72
msgid "Starting"
msgstr "시작중"
#: src/net/i2p/desktopgui/InternalTrayManager.java:55
#: src/net/i2p/desktopgui/InternalTrayManager.java:207
msgid "Launch I2P Browser"
msgstr "I2P 브라우저 실행"
#: src/net/i2p/desktopgui/InternalTrayManager.java:76
#: src/net/i2p/desktopgui/InternalTrayManager.java:228
msgid "Configure I2P System Tray"
msgstr ""
#: src/net/i2p/desktopgui/InternalTrayManager.java:77
#: src/net/i2p/desktopgui/InternalTrayManager.java:229
msgid "Disable"
msgstr ""
#: src/net/i2p/desktopgui/InternalTrayManager.java:93
#: src/net/i2p/desktopgui/InternalTrayManager.java:245
msgid "Restart I2P"
msgstr "I2P 재시작"
#: src/net/i2p/desktopgui/InternalTrayManager.java:110
#: src/net/i2p/desktopgui/InternalTrayManager.java:262
msgid "Stop I2P"
msgstr "I2P 정지"
#: src/net/i2p/desktopgui/InternalTrayManager.java:126
#: src/net/i2p/desktopgui/InternalTrayManager.java:278
msgid "Restart I2P Immediately"
msgstr ""
#: src/net/i2p/desktopgui/InternalTrayManager.java:143
#: src/net/i2p/desktopgui/InternalTrayManager.java:295
msgid "Stop I2P Immediately"
msgstr ""
#: src/net/i2p/desktopgui/InternalTrayManager.java:157
#: src/net/i2p/desktopgui/InternalTrayManager.java:309
msgid "Cancel I2P Shutdown"
msgstr ""
#: src/net/i2p/desktopgui/InternalTrayManager.java:363
#, java-format
msgid "Shutdown in {0}"
msgstr ""
#: src/net/i2p/desktopgui/InternalTrayManager.java:365
msgid "Shutdown imminent"
msgstr ""
#. status translations are in the console bundle
#: src/net/i2p/desktopgui/InternalTrayManager.java:370
msgid "Network"
msgstr ""
#. Windows typically has tooltips; Linux (at least Ubuntu) doesn't
#: src/net/i2p/desktopgui/TrayManager.java:63
msgid "I2P: Right-click for menu"
msgstr ""

View File

@ -0,0 +1,94 @@
# I2P
# Copyright (C) 2009 The I2P Project
# This file is distributed under the same license as the desktopgui package.
# To contribute translations, see http://www.i2p2.de/newdevelopers
#
# Translators:
# topdog101 <topdog101@free.fr>, 2014
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: 2016-05-25 12:34+0000\n"
"Last-Translator: zzzi2p\n"
"Language-Team: Malagasy (http://www.transifex.com/otf/I2P/language/mg/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: mg\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
#: src/net/i2p/desktopgui/ExternalTrayManager.java:31
#: src/net/i2p/desktopgui/ExternalTrayManager.java:59
msgid "Start I2P"
msgstr "Velomy i I2P"
#: src/net/i2p/desktopgui/ExternalTrayManager.java:44
#: src/net/i2p/desktopgui/ExternalTrayManager.java:72
msgid "I2P is starting!"
msgstr "Manomboka ho velona i I2P!"
#: src/net/i2p/desktopgui/ExternalTrayManager.java:44
#: src/net/i2p/desktopgui/ExternalTrayManager.java:72
msgid "Starting"
msgstr "Velona"
#: src/net/i2p/desktopgui/InternalTrayManager.java:55
#: src/net/i2p/desktopgui/InternalTrayManager.java:207
msgid "Launch I2P Browser"
msgstr "Alefaso ny fijerena tranonkala I2P"
#: src/net/i2p/desktopgui/InternalTrayManager.java:76
#: src/net/i2p/desktopgui/InternalTrayManager.java:228
msgid "Configure I2P System Tray"
msgstr ""
#: src/net/i2p/desktopgui/InternalTrayManager.java:77
#: src/net/i2p/desktopgui/InternalTrayManager.java:229
msgid "Disable"
msgstr ""
#: src/net/i2p/desktopgui/InternalTrayManager.java:93
#: src/net/i2p/desktopgui/InternalTrayManager.java:245
msgid "Restart I2P"
msgstr "Avereno alefa i I2P"
#: src/net/i2p/desktopgui/InternalTrayManager.java:110
#: src/net/i2p/desktopgui/InternalTrayManager.java:262
msgid "Stop I2P"
msgstr "Ajanony i I2P"
#: src/net/i2p/desktopgui/InternalTrayManager.java:126
#: src/net/i2p/desktopgui/InternalTrayManager.java:278
msgid "Restart I2P Immediately"
msgstr ""
#: src/net/i2p/desktopgui/InternalTrayManager.java:143
#: src/net/i2p/desktopgui/InternalTrayManager.java:295
msgid "Stop I2P Immediately"
msgstr ""
#: src/net/i2p/desktopgui/InternalTrayManager.java:157
#: src/net/i2p/desktopgui/InternalTrayManager.java:309
msgid "Cancel I2P Shutdown"
msgstr ""
#: src/net/i2p/desktopgui/InternalTrayManager.java:363
#, java-format
msgid "Shutdown in {0}"
msgstr ""
#: src/net/i2p/desktopgui/InternalTrayManager.java:365
msgid "Shutdown imminent"
msgstr ""
#. status translations are in the console bundle
#: src/net/i2p/desktopgui/InternalTrayManager.java:370
msgid "Network"
msgstr ""
#. Windows typically has tooltips; Linux (at least Ubuntu) doesn't
#: src/net/i2p/desktopgui/TrayManager.java:63
msgid "I2P: Right-click for menu"
msgstr ""

View File

@ -0,0 +1,94 @@
# I2P
# Copyright (C) 2009 The I2P Project
# This file is distributed under the same license as the desktopgui package.
# To contribute translations, see http://www.i2p2.de/newdevelopers
#
# Translators:
# Allan Nordhøy <epost@anotheragency.no>, 2014
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: 2016-05-25 12:34+0000\n"
"Last-Translator: zzzi2p\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"
"Content-Transfer-Encoding: 8bit\n"
"Language: nb\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: src/net/i2p/desktopgui/ExternalTrayManager.java:31
#: src/net/i2p/desktopgui/ExternalTrayManager.java:59
msgid "Start I2P"
msgstr "Start I2P"
#: src/net/i2p/desktopgui/ExternalTrayManager.java:44
#: src/net/i2p/desktopgui/ExternalTrayManager.java:72
msgid "I2P is starting!"
msgstr "I2P starter opp!"
#: src/net/i2p/desktopgui/ExternalTrayManager.java:44
#: src/net/i2p/desktopgui/ExternalTrayManager.java:72
msgid "Starting"
msgstr "Starter opp"
#: src/net/i2p/desktopgui/InternalTrayManager.java:55
#: src/net/i2p/desktopgui/InternalTrayManager.java:207
msgid "Launch I2P Browser"
msgstr "Kjør I2P-nettleser"
#: src/net/i2p/desktopgui/InternalTrayManager.java:76
#: src/net/i2p/desktopgui/InternalTrayManager.java:228
msgid "Configure I2P System Tray"
msgstr ""
#: src/net/i2p/desktopgui/InternalTrayManager.java:77
#: src/net/i2p/desktopgui/InternalTrayManager.java:229
msgid "Disable"
msgstr ""
#: src/net/i2p/desktopgui/InternalTrayManager.java:93
#: src/net/i2p/desktopgui/InternalTrayManager.java:245
msgid "Restart I2P"
msgstr "Omstart av I2P"
#: src/net/i2p/desktopgui/InternalTrayManager.java:110
#: src/net/i2p/desktopgui/InternalTrayManager.java:262
msgid "Stop I2P"
msgstr "Stopp I2P"
#: src/net/i2p/desktopgui/InternalTrayManager.java:126
#: src/net/i2p/desktopgui/InternalTrayManager.java:278
msgid "Restart I2P Immediately"
msgstr ""
#: src/net/i2p/desktopgui/InternalTrayManager.java:143
#: src/net/i2p/desktopgui/InternalTrayManager.java:295
msgid "Stop I2P Immediately"
msgstr ""
#: src/net/i2p/desktopgui/InternalTrayManager.java:157
#: src/net/i2p/desktopgui/InternalTrayManager.java:309
msgid "Cancel I2P Shutdown"
msgstr ""
#: src/net/i2p/desktopgui/InternalTrayManager.java:363
#, java-format
msgid "Shutdown in {0}"
msgstr ""
#: src/net/i2p/desktopgui/InternalTrayManager.java:365
msgid "Shutdown imminent"
msgstr ""
#. status translations are in the console bundle
#: src/net/i2p/desktopgui/InternalTrayManager.java:370
msgid "Network"
msgstr ""
#. Windows typically has tooltips; Linux (at least Ubuntu) doesn't
#: src/net/i2p/desktopgui/TrayManager.java:63
msgid "I2P: Right-click for menu"
msgstr ""

View File

@ -2,54 +2,94 @@
# Copyright (C) 2009 The I2P Project # Copyright (C) 2009 The I2P Project
# This file is distributed under the same license as the desktopgui package. # This file is distributed under the same license as the desktopgui package.
# To contribute translations, see http://www.i2p2.de/newdevelopers # To contribute translations, see http://www.i2p2.de/newdevelopers
# foo <foo@bar>, 2009.
# #
# Translators:
# ducki2p <ducki2p@gmail.com>, 2011
# foo <foo@bar>, 2009
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: I2P\n" "Project-Id-Version: I2P\n"
"Report-Msgid-Bugs-To: http://trac.i2p2.de/\n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-02-20 11:53+0000\n" "POT-Creation-Date: 2016-05-25 12:29+0000\n"
"PO-Revision-Date: 2011-02-20 12:15+0000\n" "PO-Revision-Date: 2016-05-25 12:34+0000\n"
"Last-Translator: ducki2p <ducki2p@gmail.com>\n" "Last-Translator: zzzi2p\n"
"Language-Team: Dutch <>\n" "Language-Team: Dutch (http://www.transifex.com/otf/I2P/language/nl/)\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Language: nl\n" "Language: nl\n"
"Plural-Forms: nplurals=2; plural=(n != 1)\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: src/net/i2p/desktopgui/ExternalTrayManager.java:23 #: src/net/i2p/desktopgui/ExternalTrayManager.java:31
#: src/net/i2p/desktopgui/ExternalTrayManager.java:59
msgid "Start I2P" msgid "Start I2P"
msgstr "I2P starten" msgstr "I2P starten"
#: src/net/i2p/desktopgui/ExternalTrayManager.java:38 #: src/net/i2p/desktopgui/ExternalTrayManager.java:44
#: src/net/i2p/desktopgui/ExternalTrayManager.java:72
msgid "I2P is starting!" msgid "I2P is starting!"
msgstr "I2P is aan het starten!" msgstr "I2P is aan het starten!"
#: src/net/i2p/desktopgui/ExternalTrayManager.java:38 #: src/net/i2p/desktopgui/ExternalTrayManager.java:44
#: src/net/i2p/desktopgui/ExternalTrayManager.java:72
msgid "Starting" msgid "Starting"
msgstr "Bezig met starten" msgstr "Bezig met starten"
#: src/net/i2p/desktopgui/InternalTrayManager.java:26 #: src/net/i2p/desktopgui/InternalTrayManager.java:55
#: src/net/i2p/desktopgui/InternalTrayManager.java:207
msgid "Launch I2P Browser" msgid "Launch I2P Browser"
msgstr "Start I2P Browser" msgstr "Start I2P Browser"
#: src/net/i2p/desktopgui/InternalTrayManager.java:50 #: src/net/i2p/desktopgui/InternalTrayManager.java:76
msgid "Configure desktopgui" #: src/net/i2p/desktopgui/InternalTrayManager.java:228
msgstr "Configureer desktopgui" msgid "Configure I2P System Tray"
msgstr ""
#: src/net/i2p/desktopgui/InternalTrayManager.java:67 #: src/net/i2p/desktopgui/InternalTrayManager.java:77
#: src/net/i2p/desktopgui/InternalTrayManager.java:229
msgid "Disable"
msgstr ""
#: src/net/i2p/desktopgui/InternalTrayManager.java:93
#: src/net/i2p/desktopgui/InternalTrayManager.java:245
msgid "Restart I2P" msgid "Restart I2P"
msgstr "I2P herstarten" msgstr "I2P herstarten"
#: src/net/i2p/desktopgui/InternalTrayManager.java:85 #: src/net/i2p/desktopgui/InternalTrayManager.java:110
#: src/net/i2p/desktopgui/InternalTrayManager.java:262
msgid "Stop I2P" msgid "Stop I2P"
msgstr "I2P stoppen" msgstr "I2P stoppen"
#: src/net/i2p/desktopgui/gui/DesktopguiConfigurationFrame.java:44 #: src/net/i2p/desktopgui/InternalTrayManager.java:126
msgid "Tray icon configuration" #: src/net/i2p/desktopgui/InternalTrayManager.java:278
msgstr "Systeemvak icoon configuratie" msgid "Restart I2P Immediately"
msgstr ""
#: src/net/i2p/desktopgui/gui/DesktopguiConfigurationFrame.java:47 #: src/net/i2p/desktopgui/InternalTrayManager.java:143
msgid "Should tray icon be enabled?" #: src/net/i2p/desktopgui/InternalTrayManager.java:295
msgstr "Systeemvak icoon inschakelen?" msgid "Stop I2P Immediately"
msgstr ""
#: src/net/i2p/desktopgui/InternalTrayManager.java:157
#: src/net/i2p/desktopgui/InternalTrayManager.java:309
msgid "Cancel I2P Shutdown"
msgstr ""
#: src/net/i2p/desktopgui/InternalTrayManager.java:363
#, java-format
msgid "Shutdown in {0}"
msgstr ""
#: src/net/i2p/desktopgui/InternalTrayManager.java:365
msgid "Shutdown imminent"
msgstr ""
#. status translations are in the console bundle
#: src/net/i2p/desktopgui/InternalTrayManager.java:370
msgid "Network"
msgstr ""
#. Windows typically has tooltips; Linux (at least Ubuntu) doesn't
#: src/net/i2p/desktopgui/TrayManager.java:63
msgid "I2P: Right-click for menu"
msgstr ""

View File

@ -6,52 +6,91 @@
# Translators: # Translators:
# PolishAnon <b790979@klzlk.com>, 2011 # PolishAnon <b790979@klzlk.com>, 2011
# polacco <polacco@i2pmail.org>, 2015 # polacco <polacco@i2pmail.org>, 2015
# Verdulo :-) <cybertomek@openmailbox.org>, 2016
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: I2P\n" "Project-Id-Version: I2P\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2014-01-09 19:27+0000\n" "POT-Creation-Date: 2016-05-25 12:29+0000\n"
"PO-Revision-Date: 2015-02-17 20:54+0000\n" "PO-Revision-Date: 2016-05-25 19:49+0000\n"
"Last-Translator: polacco <polacco@i2pmail.org>\n" "Last-Translator: Verdulo :-) <cybertomek@openmailbox.org>\n"
"Language-Team: Polish (http://www.transifex.com/projects/p/I2P/language/pl/)\n" "Language-Team: Polish (http://www.transifex.com/otf/I2P/language/pl/)\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Language: pl\n" "Language: pl\n"
"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
#: src/net/i2p/desktopgui/ExternalTrayManager.java:23 #: src/net/i2p/desktopgui/ExternalTrayManager.java:31
#: src/net/i2p/desktopgui/ExternalTrayManager.java:59
msgid "Start I2P" msgid "Start I2P"
msgstr "Uruchom I2P" msgstr "Uruchom I2P"
#: src/net/i2p/desktopgui/ExternalTrayManager.java:38 #: src/net/i2p/desktopgui/ExternalTrayManager.java:44
#: src/net/i2p/desktopgui/ExternalTrayManager.java:72
msgid "I2P is starting!" msgid "I2P is starting!"
msgstr "Uruchamianie I2P!" msgstr "Uruchamianie I2P!"
#: src/net/i2p/desktopgui/ExternalTrayManager.java:38 #: src/net/i2p/desktopgui/ExternalTrayManager.java:44
#: src/net/i2p/desktopgui/ExternalTrayManager.java:72
msgid "Starting" msgid "Starting"
msgstr "Uruchamianie" msgstr "Uruchamianie"
#: src/net/i2p/desktopgui/InternalTrayManager.java:26 #: src/net/i2p/desktopgui/InternalTrayManager.java:55
#: src/net/i2p/desktopgui/InternalTrayManager.java:207
msgid "Launch I2P Browser" msgid "Launch I2P Browser"
msgstr "Uruchom przeglądarkę I2P" msgstr "Uruchom przeglądarkę I2P"
#: src/net/i2p/desktopgui/InternalTrayManager.java:50 #: src/net/i2p/desktopgui/InternalTrayManager.java:76
msgid "Configure desktopgui" #: src/net/i2p/desktopgui/InternalTrayManager.java:228
msgstr "Skonfiguruj intrefejs pulpitu (desktopgui)" msgid "Configure I2P System Tray"
msgstr "Konfiguruj I2P w zasobniku systemowym"
#: src/net/i2p/desktopgui/InternalTrayManager.java:67 #: src/net/i2p/desktopgui/InternalTrayManager.java:77
#: src/net/i2p/desktopgui/InternalTrayManager.java:229
msgid "Disable"
msgstr "Wyłącz"
#: src/net/i2p/desktopgui/InternalTrayManager.java:93
#: src/net/i2p/desktopgui/InternalTrayManager.java:245
msgid "Restart I2P" msgid "Restart I2P"
msgstr "Zrestartuj I2P" msgstr "Zrestartuj I2P"
#: src/net/i2p/desktopgui/InternalTrayManager.java:85 #: src/net/i2p/desktopgui/InternalTrayManager.java:110
#: src/net/i2p/desktopgui/InternalTrayManager.java:262
msgid "Stop I2P" msgid "Stop I2P"
msgstr "Zatrzymaj I2P" msgstr "Zatrzymaj I2P"
#: src/net/i2p/desktopgui/gui/DesktopguiConfigurationFrame.java:43 #: src/net/i2p/desktopgui/InternalTrayManager.java:126
msgid "Tray icon configuration" #: src/net/i2p/desktopgui/InternalTrayManager.java:278
msgstr "Konfiguracja ikony zasobnika" msgid "Restart I2P Immediately"
msgstr "Zrestartuj I2P natychmiast"
#: src/net/i2p/desktopgui/gui/DesktopguiConfigurationFrame.java:46 #: src/net/i2p/desktopgui/InternalTrayManager.java:143
msgid "Should tray icon be enabled?" #: src/net/i2p/desktopgui/InternalTrayManager.java:295
msgstr "Czy ikona zasobnika powinna być aktywna?" msgid "Stop I2P Immediately"
msgstr "Wyłącz I2P natychmiast"
#: src/net/i2p/desktopgui/InternalTrayManager.java:157
#: src/net/i2p/desktopgui/InternalTrayManager.java:309
msgid "Cancel I2P Shutdown"
msgstr "Anuluj zamykanie I2P"
#: src/net/i2p/desktopgui/InternalTrayManager.java:363
#, java-format
msgid "Shutdown in {0}"
msgstr "Wyłączenie za {0}"
#: src/net/i2p/desktopgui/InternalTrayManager.java:365
msgid "Shutdown imminent"
msgstr "Zaraz zamknę"
#. status translations are in the console bundle
#: src/net/i2p/desktopgui/InternalTrayManager.java:370
msgid "Network"
msgstr "Sieć"
#. Windows typically has tooltips; Linux (at least Ubuntu) doesn't
#: src/net/i2p/desktopgui/TrayManager.java:63
msgid "I2P: Right-click for menu"
msgstr "I2P: kliknij prawym aby otworzyć menu"

View File

@ -0,0 +1,96 @@
# I2P
# Copyright (C) 2009 The I2P Project
# This file is distributed under the same license as the desktopgui package.
# To contribute translations, see http://www.i2p2.de/newdevelopers
#
# Translators:
# Maria Manuela Silva, 2016
# wicked, 2013
# wicked, 2012
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: 2016-05-31 15:25+0000\n"
"Last-Translator: Maria Manuela Silva\n"
"Language-Team: Portuguese (http://www.transifex.com/otf/I2P/language/pt/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: pt\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: src/net/i2p/desktopgui/ExternalTrayManager.java:31
#: src/net/i2p/desktopgui/ExternalTrayManager.java:59
msgid "Start I2P"
msgstr "Iniciar I2P"
#: src/net/i2p/desktopgui/ExternalTrayManager.java:44
#: src/net/i2p/desktopgui/ExternalTrayManager.java:72
msgid "I2P is starting!"
msgstr "I2P está a iniciar!"
#: src/net/i2p/desktopgui/ExternalTrayManager.java:44
#: src/net/i2p/desktopgui/ExternalTrayManager.java:72
msgid "Starting"
msgstr "A Iniciar"
#: src/net/i2p/desktopgui/InternalTrayManager.java:55
#: src/net/i2p/desktopgui/InternalTrayManager.java:207
msgid "Launch I2P Browser"
msgstr "Iniciar o browser I2P"
#: src/net/i2p/desktopgui/InternalTrayManager.java:76
#: src/net/i2p/desktopgui/InternalTrayManager.java:228
msgid "Configure I2P System Tray"
msgstr "Configurar Bandeja do Sistema do I2P"
#: src/net/i2p/desktopgui/InternalTrayManager.java:77
#: src/net/i2p/desktopgui/InternalTrayManager.java:229
msgid "Disable"
msgstr "Desativar"
#: src/net/i2p/desktopgui/InternalTrayManager.java:93
#: src/net/i2p/desktopgui/InternalTrayManager.java:245
msgid "Restart I2P"
msgstr "Reiniciar o I2P"
#: src/net/i2p/desktopgui/InternalTrayManager.java:110
#: src/net/i2p/desktopgui/InternalTrayManager.java:262
msgid "Stop I2P"
msgstr "Parar o I2P"
#: src/net/i2p/desktopgui/InternalTrayManager.java:126
#: src/net/i2p/desktopgui/InternalTrayManager.java:278
msgid "Restart I2P Immediately"
msgstr "Reiniciar o I2P imediatamente"
#: src/net/i2p/desktopgui/InternalTrayManager.java:143
#: src/net/i2p/desktopgui/InternalTrayManager.java:295
msgid "Stop I2P Immediately"
msgstr "Parar o I2P de imediatamente"
#: src/net/i2p/desktopgui/InternalTrayManager.java:157
#: src/net/i2p/desktopgui/InternalTrayManager.java:309
msgid "Cancel I2P Shutdown"
msgstr "Cancelar Encerramento do I2P"
#: src/net/i2p/desktopgui/InternalTrayManager.java:363
#, java-format
msgid "Shutdown in {0}"
msgstr "Encerramento em {0}"
#: src/net/i2p/desktopgui/InternalTrayManager.java:365
msgid "Shutdown imminent"
msgstr "Encerramento eminente"
#. status translations are in the console bundle
#: src/net/i2p/desktopgui/InternalTrayManager.java:370
msgid "Network"
msgstr "Rede"
#. Windows typically has tooltips; Linux (at least Ubuntu) doesn't
#: src/net/i2p/desktopgui/TrayManager.java:63
msgid "I2P: Right-click for menu"
msgstr "I2P: Clique direito para menu"

View File

@ -6,52 +6,91 @@
# Translators: # Translators:
# testsubject67 <deborinha97@hotmail.com>, 2014 # testsubject67 <deborinha97@hotmail.com>, 2014
# blueboy, 2013 # blueboy, 2013
# blueboy, 2015
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: I2P\n" "Project-Id-Version: I2P\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2014-01-09 19:27+0000\n" "POT-Creation-Date: 2016-05-25 12:29+0000\n"
"PO-Revision-Date: 2014-07-05 17:40+0000\n" "PO-Revision-Date: 2016-05-25 12:34+0000\n"
"Last-Translator: testsubject67 <deborinha97@hotmail.com>\n" "Last-Translator: zzzi2p\n"
"Language-Team: Portuguese (Brazil) (http://www.transifex.com/projects/p/I2P/language/pt_BR/)\n" "Language-Team: Portuguese (Brazil) (http://www.transifex.com/otf/I2P/language/pt_BR/)\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Language: pt_BR\n" "Language: pt_BR\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n"
#: src/net/i2p/desktopgui/ExternalTrayManager.java:23 #: src/net/i2p/desktopgui/ExternalTrayManager.java:31
#: src/net/i2p/desktopgui/ExternalTrayManager.java:59
msgid "Start I2P" msgid "Start I2P"
msgstr "Conectar-se à I2P" msgstr "Conectar-se à I2P"
#: src/net/i2p/desktopgui/ExternalTrayManager.java:38 #: src/net/i2p/desktopgui/ExternalTrayManager.java:44
#: src/net/i2p/desktopgui/ExternalTrayManager.java:72
msgid "I2P is starting!" msgid "I2P is starting!"
msgstr "Conectando-se a I2P!" msgstr "Conectando-se a I2P!"
#: src/net/i2p/desktopgui/ExternalTrayManager.java:38 #: src/net/i2p/desktopgui/ExternalTrayManager.java:44
#: src/net/i2p/desktopgui/ExternalTrayManager.java:72
msgid "Starting" msgid "Starting"
msgstr "Conectando" msgstr "Conectando"
#: src/net/i2p/desktopgui/InternalTrayManager.java:26 #: src/net/i2p/desktopgui/InternalTrayManager.java:55
#: src/net/i2p/desktopgui/InternalTrayManager.java:207
msgid "Launch I2P Browser" msgid "Launch I2P Browser"
msgstr "Lançar o navegador I2P " msgstr "Lançar o navegador I2P "
#: src/net/i2p/desktopgui/InternalTrayManager.java:50 #: src/net/i2p/desktopgui/InternalTrayManager.java:76
msgid "Configure desktopgui" #: src/net/i2p/desktopgui/InternalTrayManager.java:228
msgstr "Configurar desktopgui" msgid "Configure I2P System Tray"
msgstr ""
#: src/net/i2p/desktopgui/InternalTrayManager.java:67 #: src/net/i2p/desktopgui/InternalTrayManager.java:77
#: src/net/i2p/desktopgui/InternalTrayManager.java:229
msgid "Disable"
msgstr ""
#: src/net/i2p/desktopgui/InternalTrayManager.java:93
#: src/net/i2p/desktopgui/InternalTrayManager.java:245
msgid "Restart I2P" msgid "Restart I2P"
msgstr "Reinicializar o roteador I2P" msgstr "Reinicializar o roteador I2P"
#: src/net/i2p/desktopgui/InternalTrayManager.java:85 #: src/net/i2p/desktopgui/InternalTrayManager.java:110
#: src/net/i2p/desktopgui/InternalTrayManager.java:262
msgid "Stop I2P" msgid "Stop I2P"
msgstr "Interromper o roteador I2P" msgstr "Interromper o roteador I2P"
#: src/net/i2p/desktopgui/gui/DesktopguiConfigurationFrame.java:43 #: src/net/i2p/desktopgui/InternalTrayManager.java:126
msgid "Tray icon configuration" #: src/net/i2p/desktopgui/InternalTrayManager.java:278
msgstr "Configuração de ícone de bandeja" msgid "Restart I2P Immediately"
msgstr ""
#: src/net/i2p/desktopgui/gui/DesktopguiConfigurationFrame.java:46 #: src/net/i2p/desktopgui/InternalTrayManager.java:143
msgid "Should tray icon be enabled?" #: src/net/i2p/desktopgui/InternalTrayManager.java:295
msgstr "Ativar ícone de bandeja?" msgid "Stop I2P Immediately"
msgstr ""
#: src/net/i2p/desktopgui/InternalTrayManager.java:157
#: src/net/i2p/desktopgui/InternalTrayManager.java:309
msgid "Cancel I2P Shutdown"
msgstr ""
#: src/net/i2p/desktopgui/InternalTrayManager.java:363
#, java-format
msgid "Shutdown in {0}"
msgstr ""
#: src/net/i2p/desktopgui/InternalTrayManager.java:365
msgid "Shutdown imminent"
msgstr ""
#. status translations are in the console bundle
#: src/net/i2p/desktopgui/InternalTrayManager.java:370
msgid "Network"
msgstr ""
#. Windows typically has tooltips; Linux (at least Ubuntu) doesn't
#: src/net/i2p/desktopgui/TrayManager.java:63
msgid "I2P: Right-click for menu"
msgstr ""

View File

@ -8,50 +8,86 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: I2P\n" "Project-Id-Version: I2P\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2014-01-09 19:03+0000\n" "POT-Creation-Date: 2016-05-25 12:29+0000\n"
"PO-Revision-Date: 2013-11-11 11:31+0000\n" "PO-Revision-Date: 2016-05-25 12:34+0000\n"
"Last-Translator: polearnik <polearnik@mail.ru>\n" "Last-Translator: zzzi2p\n"
"Language-Team: Romanian (http://www.transifex.com/projects/p/I2P/language/" "Language-Team: Romanian (http://www.transifex.com/otf/I2P/language/ro/)\n"
"ro/)\n"
"Language: ro\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?" "Language: ro\n"
"2:1));\n" "Plural-Forms: nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));\n"
#: src/net/i2p/desktopgui/ExternalTrayManager.java:23 #: src/net/i2p/desktopgui/ExternalTrayManager.java:31
#: src/net/i2p/desktopgui/ExternalTrayManager.java:59
msgid "Start I2P" msgid "Start I2P"
msgstr "Start I2P" msgstr "Start I2P"
#: src/net/i2p/desktopgui/ExternalTrayManager.java:38 #: src/net/i2p/desktopgui/ExternalTrayManager.java:44
#: src/net/i2p/desktopgui/ExternalTrayManager.java:72
msgid "I2P is starting!" msgid "I2P is starting!"
msgstr "I2P se pornește!" msgstr "I2P se pornește!"
#: src/net/i2p/desktopgui/ExternalTrayManager.java:38 #: src/net/i2p/desktopgui/ExternalTrayManager.java:44
#: src/net/i2p/desktopgui/ExternalTrayManager.java:72
msgid "Starting" msgid "Starting"
msgstr "Începere" msgstr "Începere"
#: src/net/i2p/desktopgui/InternalTrayManager.java:26 #: src/net/i2p/desktopgui/InternalTrayManager.java:55
#: src/net/i2p/desktopgui/InternalTrayManager.java:207
msgid "Launch I2P Browser" msgid "Launch I2P Browser"
msgstr "Lansare I2P Browser" msgstr "Lansare I2P Browser"
#: src/net/i2p/desktopgui/InternalTrayManager.java:50 #: src/net/i2p/desktopgui/InternalTrayManager.java:76
msgid "Configure desktopgui" #: src/net/i2p/desktopgui/InternalTrayManager.java:228
msgstr "Configurarea desktopgui" msgid "Configure I2P System Tray"
msgstr ""
#: src/net/i2p/desktopgui/InternalTrayManager.java:67 #: src/net/i2p/desktopgui/InternalTrayManager.java:77
#: src/net/i2p/desktopgui/InternalTrayManager.java:229
msgid "Disable"
msgstr ""
#: src/net/i2p/desktopgui/InternalTrayManager.java:93
#: src/net/i2p/desktopgui/InternalTrayManager.java:245
msgid "Restart I2P" msgid "Restart I2P"
msgstr "Restart I2P" msgstr "Restart I2P"
#: src/net/i2p/desktopgui/InternalTrayManager.java:85 #: src/net/i2p/desktopgui/InternalTrayManager.java:110
#: src/net/i2p/desktopgui/InternalTrayManager.java:262
msgid "Stop I2P" msgid "Stop I2P"
msgstr "Stop I2P" msgstr "Stop I2P"
#: src/net/i2p/desktopgui/gui/DesktopguiConfigurationFrame.java:43 #: src/net/i2p/desktopgui/InternalTrayManager.java:126
msgid "Tray icon configuration" #: src/net/i2p/desktopgui/InternalTrayManager.java:278
msgstr "Configurare pictogramei din bara de sistem" msgid "Restart I2P Immediately"
msgstr ""
#: src/net/i2p/desktopgui/gui/DesktopguiConfigurationFrame.java:46 #: src/net/i2p/desktopgui/InternalTrayManager.java:143
msgid "Should tray icon be enabled?" #: src/net/i2p/desktopgui/InternalTrayManager.java:295
msgstr "Ar trebui să fie activata pictograma din bara de sistem?" msgid "Stop I2P Immediately"
msgstr ""
#: src/net/i2p/desktopgui/InternalTrayManager.java:157
#: src/net/i2p/desktopgui/InternalTrayManager.java:309
msgid "Cancel I2P Shutdown"
msgstr ""
#: src/net/i2p/desktopgui/InternalTrayManager.java:363
#, java-format
msgid "Shutdown in {0}"
msgstr ""
#: src/net/i2p/desktopgui/InternalTrayManager.java:365
msgid "Shutdown imminent"
msgstr ""
#. status translations are in the console bundle
#: src/net/i2p/desktopgui/InternalTrayManager.java:370
msgid "Network"
msgstr ""
#. Windows typically has tooltips; Linux (at least Ubuntu) doesn't
#: src/net/i2p/desktopgui/TrayManager.java:63
msgid "I2P: Right-click for menu"
msgstr ""

View File

@ -6,53 +6,92 @@
# Translators: # Translators:
# ducki2p <ducki2p@gmail.com>, 2011 # ducki2p <ducki2p@gmail.com>, 2011
# foo <foo@bar>, 2009 # foo <foo@bar>, 2009
# Роман Азаренко <transifex@basicxp.ru>, 2013 # Foster Snowhill, 2013
# brianhopes <voganc-12@live.ru>, 2015
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: I2P\n" "Project-Id-Version: I2P\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-03-03 18:29+0000\n" "POT-Creation-Date: 2016-05-25 12:29+0000\n"
"PO-Revision-Date: 2013-12-04 11:46+0000\n" "PO-Revision-Date: 2016-05-25 12:34+0000\n"
"Last-Translator: Bergitte <alvina_alexandrova@mail.ru>\n" "Last-Translator: zzzi2p\n"
"Language-Team: Russian (Russia) (http://www.transifex.com/projects/p/I2P/language/ru_RU/)\n" "Language-Team: Russian (Russia) (http://www.transifex.com/otf/I2P/language/ru_RU/)\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Language: ru_RU\n" "Language: ru_RU\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" "Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n"
#: src/net/i2p/desktopgui/ExternalTrayManager.java:23 #: src/net/i2p/desktopgui/ExternalTrayManager.java:31
#: src/net/i2p/desktopgui/ExternalTrayManager.java:59
msgid "Start I2P" msgid "Start I2P"
msgstr "Запустить I2P" msgstr "Запустить I2P"
#: src/net/i2p/desktopgui/ExternalTrayManager.java:38 #: src/net/i2p/desktopgui/ExternalTrayManager.java:44
#: src/net/i2p/desktopgui/ExternalTrayManager.java:72
msgid "I2P is starting!" msgid "I2P is starting!"
msgstr "I2P запускается!" msgstr "I2P запускается!"
#: src/net/i2p/desktopgui/ExternalTrayManager.java:38 #: src/net/i2p/desktopgui/ExternalTrayManager.java:44
#: src/net/i2p/desktopgui/ExternalTrayManager.java:72
msgid "Starting" msgid "Starting"
msgstr "Запускается" msgstr "Запускается"
#: src/net/i2p/desktopgui/InternalTrayManager.java:26 #: src/net/i2p/desktopgui/InternalTrayManager.java:55
#: src/net/i2p/desktopgui/InternalTrayManager.java:207
msgid "Launch I2P Browser" msgid "Launch I2P Browser"
msgstr "Запустить браузер I2P" msgstr "Запустить браузер I2P"
#: src/net/i2p/desktopgui/InternalTrayManager.java:50 #: src/net/i2p/desktopgui/InternalTrayManager.java:76
msgid "Configure desktopgui" #: src/net/i2p/desktopgui/InternalTrayManager.java:228
msgstr "Настроить desktopgui" msgid "Configure I2P System Tray"
msgstr ""
#: src/net/i2p/desktopgui/InternalTrayManager.java:67 #: src/net/i2p/desktopgui/InternalTrayManager.java:77
#: src/net/i2p/desktopgui/InternalTrayManager.java:229
msgid "Disable"
msgstr ""
#: src/net/i2p/desktopgui/InternalTrayManager.java:93
#: src/net/i2p/desktopgui/InternalTrayManager.java:245
msgid "Restart I2P" msgid "Restart I2P"
msgstr "Перезапустить I2P" msgstr "Перезапустить I2P"
#: src/net/i2p/desktopgui/InternalTrayManager.java:85 #: src/net/i2p/desktopgui/InternalTrayManager.java:110
#: src/net/i2p/desktopgui/InternalTrayManager.java:262
msgid "Stop I2P" msgid "Stop I2P"
msgstr "Остановить I2P" msgstr "Остановить I2P"
#: src/net/i2p/desktopgui/gui/DesktopguiConfigurationFrame.java:44 #: src/net/i2p/desktopgui/InternalTrayManager.java:126
msgid "Tray icon configuration" #: src/net/i2p/desktopgui/InternalTrayManager.java:278
msgstr "Конфигурация значка в области уведомлений" msgid "Restart I2P Immediately"
msgstr ""
#: src/net/i2p/desktopgui/gui/DesktopguiConfigurationFrame.java:47 #: src/net/i2p/desktopgui/InternalTrayManager.java:143
msgid "Should tray icon be enabled?" #: src/net/i2p/desktopgui/InternalTrayManager.java:295
msgstr "Отображать ли значок в области уведомлений?" msgid "Stop I2P Immediately"
msgstr ""
#: src/net/i2p/desktopgui/InternalTrayManager.java:157
#: src/net/i2p/desktopgui/InternalTrayManager.java:309
msgid "Cancel I2P Shutdown"
msgstr ""
#: src/net/i2p/desktopgui/InternalTrayManager.java:363
#, java-format
msgid "Shutdown in {0}"
msgstr ""
#: src/net/i2p/desktopgui/InternalTrayManager.java:365
msgid "Shutdown imminent"
msgstr ""
#. status translations are in the console bundle
#: src/net/i2p/desktopgui/InternalTrayManager.java:370
msgid "Network"
msgstr ""
#. Windows typically has tooltips; Linux (at least Ubuntu) doesn't
#: src/net/i2p/desktopgui/TrayManager.java:63
msgid "I2P: Right-click for menu"
msgstr ""

View File

@ -4,54 +4,92 @@
# To contribute translations, see http://www.i2p2.de/newdevelopers # To contribute translations, see http://www.i2p2.de/newdevelopers
# #
# Translators: # Translators:
# Krantišek <jaksrn@gmail.com>, 2014 # Jakub Srna <jaksrn@gmail.com>, 2014
# Svistwarrior273 <romanbeno273@gmail.com>, 2014 # Roman 'Kaktuxista' Benji <romanbeno273@gmail.com>, 2014
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: I2P\n" "Project-Id-Version: I2P\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2014-01-09 19:27+0000\n" "POT-Creation-Date: 2016-05-25 12:29+0000\n"
"PO-Revision-Date: 2014-04-20 09:56+0000\n" "PO-Revision-Date: 2016-05-25 12:34+0000\n"
"Last-Translator: Svistwarrior273 <romanbeno273@gmail.com>\n" "Last-Translator: zzzi2p\n"
"Language-Team: Slovak (http://www.transifex.com/projects/p/I2P/language/sk/)\n" "Language-Team: Slovak (http://www.transifex.com/otf/I2P/language/sk/)\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Language: sk\n" "Language: sk\n"
"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
#: src/net/i2p/desktopgui/ExternalTrayManager.java:23 #: src/net/i2p/desktopgui/ExternalTrayManager.java:31
#: src/net/i2p/desktopgui/ExternalTrayManager.java:59
msgid "Start I2P" msgid "Start I2P"
msgstr "Spustiť I2P" msgstr "Spustiť I2P"
#: src/net/i2p/desktopgui/ExternalTrayManager.java:38 #: src/net/i2p/desktopgui/ExternalTrayManager.java:44
#: src/net/i2p/desktopgui/ExternalTrayManager.java:72
msgid "I2P is starting!" msgid "I2P is starting!"
msgstr "I2P sa spúšťa!" msgstr "I2P sa spúšťa!"
#: src/net/i2p/desktopgui/ExternalTrayManager.java:38 #: src/net/i2p/desktopgui/ExternalTrayManager.java:44
#: src/net/i2p/desktopgui/ExternalTrayManager.java:72
msgid "Starting" msgid "Starting"
msgstr "Spúšťa sa" msgstr "Spúšťa sa"
#: src/net/i2p/desktopgui/InternalTrayManager.java:26 #: src/net/i2p/desktopgui/InternalTrayManager.java:55
#: src/net/i2p/desktopgui/InternalTrayManager.java:207
msgid "Launch I2P Browser" msgid "Launch I2P Browser"
msgstr "Spustiť I2P prehliadač" msgstr "Spustiť I2P prehliadač"
#: src/net/i2p/desktopgui/InternalTrayManager.java:50 #: src/net/i2p/desktopgui/InternalTrayManager.java:76
msgid "Configure desktopgui" #: src/net/i2p/desktopgui/InternalTrayManager.java:228
msgstr "Nakonfigurovať desktopgui" msgid "Configure I2P System Tray"
msgstr ""
#: src/net/i2p/desktopgui/InternalTrayManager.java:67 #: src/net/i2p/desktopgui/InternalTrayManager.java:77
#: src/net/i2p/desktopgui/InternalTrayManager.java:229
msgid "Disable"
msgstr ""
#: src/net/i2p/desktopgui/InternalTrayManager.java:93
#: src/net/i2p/desktopgui/InternalTrayManager.java:245
msgid "Restart I2P" msgid "Restart I2P"
msgstr "Reštartovať I2P" msgstr "Reštartovať I2P"
#: src/net/i2p/desktopgui/InternalTrayManager.java:85 #: src/net/i2p/desktopgui/InternalTrayManager.java:110
#: src/net/i2p/desktopgui/InternalTrayManager.java:262
msgid "Stop I2P" msgid "Stop I2P"
msgstr "Zastaviť I2P" msgstr "Zastaviť I2P"
#: src/net/i2p/desktopgui/gui/DesktopguiConfigurationFrame.java:43 #: src/net/i2p/desktopgui/InternalTrayManager.java:126
msgid "Tray icon configuration" #: src/net/i2p/desktopgui/InternalTrayManager.java:278
msgstr "Konfigurácia ikony v lište" msgid "Restart I2P Immediately"
msgstr ""
#: src/net/i2p/desktopgui/gui/DesktopguiConfigurationFrame.java:46 #: src/net/i2p/desktopgui/InternalTrayManager.java:143
msgid "Should tray icon be enabled?" #: src/net/i2p/desktopgui/InternalTrayManager.java:295
msgstr "Mala by byť ikona v lište povolená?" msgid "Stop I2P Immediately"
msgstr ""
#: src/net/i2p/desktopgui/InternalTrayManager.java:157
#: src/net/i2p/desktopgui/InternalTrayManager.java:309
msgid "Cancel I2P Shutdown"
msgstr ""
#: src/net/i2p/desktopgui/InternalTrayManager.java:363
#, java-format
msgid "Shutdown in {0}"
msgstr ""
#: src/net/i2p/desktopgui/InternalTrayManager.java:365
msgid "Shutdown imminent"
msgstr ""
#. status translations are in the console bundle
#: src/net/i2p/desktopgui/InternalTrayManager.java:370
msgid "Network"
msgstr ""
#. Windows typically has tooltips; Linux (at least Ubuntu) doesn't
#: src/net/i2p/desktopgui/TrayManager.java:63
msgid "I2P: Right-click for menu"
msgstr ""

View File

@ -0,0 +1,94 @@
# I2P
# Copyright (C) 2009 The I2P Project
# This file is distributed under the same license as the desktopgui package.
# To contribute translations, see http://www.i2p2.de/newdevelopers
#
# Translators:
# Shpetim <shpetim@privacysolutions.no>, 2014
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: 2016-05-25 12:34+0000\n"
"Last-Translator: zzzi2p\n"
"Language-Team: Albanian (http://www.transifex.com/otf/I2P/language/sq/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: sq\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: src/net/i2p/desktopgui/ExternalTrayManager.java:31
#: src/net/i2p/desktopgui/ExternalTrayManager.java:59
msgid "Start I2P"
msgstr "Starto I2P'në"
#: src/net/i2p/desktopgui/ExternalTrayManager.java:44
#: src/net/i2p/desktopgui/ExternalTrayManager.java:72
msgid "I2P is starting!"
msgstr "I2P po starton!"
#: src/net/i2p/desktopgui/ExternalTrayManager.java:44
#: src/net/i2p/desktopgui/ExternalTrayManager.java:72
msgid "Starting"
msgstr "Po startoj"
#: src/net/i2p/desktopgui/InternalTrayManager.java:55
#: src/net/i2p/desktopgui/InternalTrayManager.java:207
msgid "Launch I2P Browser"
msgstr "Nis Browser'in e I2P'së"
#: src/net/i2p/desktopgui/InternalTrayManager.java:76
#: src/net/i2p/desktopgui/InternalTrayManager.java:228
msgid "Configure I2P System Tray"
msgstr ""
#: src/net/i2p/desktopgui/InternalTrayManager.java:77
#: src/net/i2p/desktopgui/InternalTrayManager.java:229
msgid "Disable"
msgstr ""
#: src/net/i2p/desktopgui/InternalTrayManager.java:93
#: src/net/i2p/desktopgui/InternalTrayManager.java:245
msgid "Restart I2P"
msgstr "Ristarto I2P¨në"
#: src/net/i2p/desktopgui/InternalTrayManager.java:110
#: src/net/i2p/desktopgui/InternalTrayManager.java:262
msgid "Stop I2P"
msgstr "Ndale I2P'në"
#: src/net/i2p/desktopgui/InternalTrayManager.java:126
#: src/net/i2p/desktopgui/InternalTrayManager.java:278
msgid "Restart I2P Immediately"
msgstr ""
#: src/net/i2p/desktopgui/InternalTrayManager.java:143
#: src/net/i2p/desktopgui/InternalTrayManager.java:295
msgid "Stop I2P Immediately"
msgstr ""
#: src/net/i2p/desktopgui/InternalTrayManager.java:157
#: src/net/i2p/desktopgui/InternalTrayManager.java:309
msgid "Cancel I2P Shutdown"
msgstr ""
#: src/net/i2p/desktopgui/InternalTrayManager.java:363
#, java-format
msgid "Shutdown in {0}"
msgstr ""
#: src/net/i2p/desktopgui/InternalTrayManager.java:365
msgid "Shutdown imminent"
msgstr ""
#. status translations are in the console bundle
#: src/net/i2p/desktopgui/InternalTrayManager.java:370
msgid "Network"
msgstr ""
#. Windows typically has tooltips; Linux (at least Ubuntu) doesn't
#: src/net/i2p/desktopgui/TrayManager.java:63
msgid "I2P: Right-click for menu"
msgstr ""

View File

@ -4,53 +4,91 @@
# To contribute translations, see http://www.i2p2.de/newdevelopers # To contribute translations, see http://www.i2p2.de/newdevelopers
# #
# Translators: # Translators:
# 123hund123 <M8R-ra4r1r@mailinator.com>, 2011. # 123hund123 <M8R-ra4r1r@mailinator.com>, 2011
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: I2P\n" "Project-Id-Version: I2P\n"
"Report-Msgid-Bugs-To: https://trac.i2p2.de/\n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-03-03 18:29+0000\n" "POT-Creation-Date: 2016-05-25 12:29+0000\n"
"PO-Revision-Date: 2011-03-22 15:49+0000\n" "PO-Revision-Date: 2016-05-25 12:34+0000\n"
"Last-Translator: 123hund123 <M8R-ra4r1r@mailinator.com>\n" "Last-Translator: zzzi2p\n"
"Language-Team: Swedish (Sweden) (http://www.transifex.net/projects/p/I2P/language/sv_SE/)\n" "Language-Team: Swedish (Sweden) (http://www.transifex.com/otf/I2P/language/sv_SE/)\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Language: sv_SE\n" "Language: sv_SE\n"
"Plural-Forms: nplurals=2; plural=(n != 1)\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: src/net/i2p/desktopgui/ExternalTrayManager.java:23 #: src/net/i2p/desktopgui/ExternalTrayManager.java:31
#: src/net/i2p/desktopgui/ExternalTrayManager.java:59
msgid "Start I2P" msgid "Start I2P"
msgstr "Starta I2P" msgstr "Starta I2P"
#: src/net/i2p/desktopgui/ExternalTrayManager.java:38 #: src/net/i2p/desktopgui/ExternalTrayManager.java:44
#: src/net/i2p/desktopgui/ExternalTrayManager.java:72
msgid "I2P is starting!" msgid "I2P is starting!"
msgstr "I2P startas!" msgstr "I2P startas!"
#: src/net/i2p/desktopgui/ExternalTrayManager.java:38 #: src/net/i2p/desktopgui/ExternalTrayManager.java:44
#: src/net/i2p/desktopgui/ExternalTrayManager.java:72
msgid "Starting" msgid "Starting"
msgstr "Startar" msgstr "Startar"
#: src/net/i2p/desktopgui/InternalTrayManager.java:26 #: src/net/i2p/desktopgui/InternalTrayManager.java:55
#: src/net/i2p/desktopgui/InternalTrayManager.java:207
msgid "Launch I2P Browser" msgid "Launch I2P Browser"
msgstr "Öppna I2P browser" msgstr "Öppna I2P browser"
#: src/net/i2p/desktopgui/InternalTrayManager.java:50 #: src/net/i2p/desktopgui/InternalTrayManager.java:76
msgid "Configure desktopgui" #: src/net/i2p/desktopgui/InternalTrayManager.java:228
msgstr "Konfigurera desktopgui" msgid "Configure I2P System Tray"
msgstr ""
#: src/net/i2p/desktopgui/InternalTrayManager.java:67 #: src/net/i2p/desktopgui/InternalTrayManager.java:77
#: src/net/i2p/desktopgui/InternalTrayManager.java:229
msgid "Disable"
msgstr ""
#: src/net/i2p/desktopgui/InternalTrayManager.java:93
#: src/net/i2p/desktopgui/InternalTrayManager.java:245
msgid "Restart I2P" msgid "Restart I2P"
msgstr "Starta om I2P" msgstr "Starta om I2P"
#: src/net/i2p/desktopgui/InternalTrayManager.java:85 #: src/net/i2p/desktopgui/InternalTrayManager.java:110
#: src/net/i2p/desktopgui/InternalTrayManager.java:262
msgid "Stop I2P" msgid "Stop I2P"
msgstr "Stoppar I2P" msgstr "Stoppar I2P"
#: src/net/i2p/desktopgui/gui/DesktopguiConfigurationFrame.java:44 #: src/net/i2p/desktopgui/InternalTrayManager.java:126
msgid "Tray icon configuration" #: src/net/i2p/desktopgui/InternalTrayManager.java:278
msgstr "Ikonpanelskonfiguration" msgid "Restart I2P Immediately"
msgstr ""
#: src/net/i2p/desktopgui/gui/DesktopguiConfigurationFrame.java:47 #: src/net/i2p/desktopgui/InternalTrayManager.java:143
msgid "Should tray icon be enabled?" #: src/net/i2p/desktopgui/InternalTrayManager.java:295
msgstr "Ska ikonpanelen vara aktiverad?" msgid "Stop I2P Immediately"
msgstr ""
#: src/net/i2p/desktopgui/InternalTrayManager.java:157
#: src/net/i2p/desktopgui/InternalTrayManager.java:309
msgid "Cancel I2P Shutdown"
msgstr ""
#: src/net/i2p/desktopgui/InternalTrayManager.java:363
#, java-format
msgid "Shutdown in {0}"
msgstr ""
#: src/net/i2p/desktopgui/InternalTrayManager.java:365
msgid "Shutdown imminent"
msgstr ""
#. status translations are in the console bundle
#: src/net/i2p/desktopgui/InternalTrayManager.java:370
msgid "Network"
msgstr ""
#. Windows typically has tooltips; Linux (at least Ubuntu) doesn't
#: src/net/i2p/desktopgui/TrayManager.java:63
msgid "I2P: Right-click for menu"
msgstr ""

View File

@ -4,53 +4,91 @@
# To contribute translations, see http://www.i2p2.de/newdevelopers # To contribute translations, see http://www.i2p2.de/newdevelopers
# #
# Translators: # Translators:
# Kaya Zeren <kayazeren@gmail.com>, 2013 # Kaya Zeren <kayazeren@gmail.com>, 2013,2016
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: I2P\n" "Project-Id-Version: I2P\n"
"Report-Msgid-Bugs-To: https://trac.i2p2.de/\n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-03-03 18:29+0000\n" "POT-Creation-Date: 2016-05-25 12:29+0000\n"
"PO-Revision-Date: 2013-04-26 06:07+0000\n" "PO-Revision-Date: 2016-05-26 05:38+0000\n"
"Last-Translator: Kaya Zeren <kayazeren@gmail.com>\n" "Last-Translator: Kaya Zeren <kayazeren@gmail.com>\n"
"Language-Team: Turkish (Turkey) (http://www.transifex.com/projects/p/I2P/language/tr_TR/)\n" "Language-Team: Turkish (Turkey) (http://www.transifex.com/otf/I2P/language/tr_TR/)\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Language: tr_TR\n" "Language: tr_TR\n"
"Plural-Forms: nplurals=1; plural=0;\n" "Plural-Forms: nplurals=1; plural=0;\n"
#: src/net/i2p/desktopgui/ExternalTrayManager.java:23 #: src/net/i2p/desktopgui/ExternalTrayManager.java:31
#: src/net/i2p/desktopgui/ExternalTrayManager.java:59
msgid "Start I2P" msgid "Start I2P"
msgstr "I2P başlasın" msgstr "I2P başlasın"
#: src/net/i2p/desktopgui/ExternalTrayManager.java:38 #: src/net/i2p/desktopgui/ExternalTrayManager.java:44
#: src/net/i2p/desktopgui/ExternalTrayManager.java:72
msgid "I2P is starting!" msgid "I2P is starting!"
msgstr "I2P başlatılıyor!" msgstr "I2P başlatılıyor!"
#: src/net/i2p/desktopgui/ExternalTrayManager.java:38 #: src/net/i2p/desktopgui/ExternalTrayManager.java:44
#: src/net/i2p/desktopgui/ExternalTrayManager.java:72
msgid "Starting" msgid "Starting"
msgstr "Başlatılıyor" msgstr "Başlatılıyor"
#: src/net/i2p/desktopgui/InternalTrayManager.java:26 #: src/net/i2p/desktopgui/InternalTrayManager.java:55
#: src/net/i2p/desktopgui/InternalTrayManager.java:207
msgid "Launch I2P Browser" msgid "Launch I2P Browser"
msgstr "I2P Tarayıcısınıın" msgstr "I2P Tarayıcısınıın"
#: src/net/i2p/desktopgui/InternalTrayManager.java:50 #: src/net/i2p/desktopgui/InternalTrayManager.java:76
msgid "Configure desktopgui" #: src/net/i2p/desktopgui/InternalTrayManager.java:228
msgstr "Masaüstü Arayüzünü Ayarlayın" msgid "Configure I2P System Tray"
msgstr "I2P Sistem Tepsisi Ayarları"
#: src/net/i2p/desktopgui/InternalTrayManager.java:67 #: src/net/i2p/desktopgui/InternalTrayManager.java:77
#: src/net/i2p/desktopgui/InternalTrayManager.java:229
msgid "Disable"
msgstr "Devre Dışı"
#: src/net/i2p/desktopgui/InternalTrayManager.java:93
#: src/net/i2p/desktopgui/InternalTrayManager.java:245
msgid "Restart I2P" msgid "Restart I2P"
msgstr "I2P Yeniden Başlasın" msgstr "I2P Yeniden Başlasın"
#: src/net/i2p/desktopgui/InternalTrayManager.java:85 #: src/net/i2p/desktopgui/InternalTrayManager.java:110
#: src/net/i2p/desktopgui/InternalTrayManager.java:262
msgid "Stop I2P" msgid "Stop I2P"
msgstr "I2P Durdurulsun" msgstr "I2P Durdurulsun"
#: src/net/i2p/desktopgui/gui/DesktopguiConfigurationFrame.java:44 #: src/net/i2p/desktopgui/InternalTrayManager.java:126
msgid "Tray icon configuration" #: src/net/i2p/desktopgui/InternalTrayManager.java:278
msgstr "Sistem tepsisi simgesi ayarı" msgid "Restart I2P Immediately"
msgstr "I2P Hemen Yeniden Başlatılsın"
#: src/net/i2p/desktopgui/gui/DesktopguiConfigurationFrame.java:47 #: src/net/i2p/desktopgui/InternalTrayManager.java:143
msgid "Should tray icon be enabled?" #: src/net/i2p/desktopgui/InternalTrayManager.java:295
msgstr "Sistem tepsisi simgesi kullanılsın" msgid "Stop I2P Immediately"
msgstr "I2P Hemen Durdurulsun"
#: src/net/i2p/desktopgui/InternalTrayManager.java:157
#: src/net/i2p/desktopgui/InternalTrayManager.java:309
msgid "Cancel I2P Shutdown"
msgstr "I2P Kapatmayı İptal Et"
#: src/net/i2p/desktopgui/InternalTrayManager.java:363
#, java-format
msgid "Shutdown in {0}"
msgstr "{0} içinde kapat"
#: src/net/i2p/desktopgui/InternalTrayManager.java:365
msgid "Shutdown imminent"
msgstr "Kapatılmak üzere"
#. status translations are in the console bundle
#: src/net/i2p/desktopgui/InternalTrayManager.java:370
msgid "Network"
msgstr "Ağ"
#. Windows typically has tooltips; Linux (at least Ubuntu) doesn't
#: src/net/i2p/desktopgui/TrayManager.java:63
msgid "I2P: Right-click for menu"
msgstr "I2P: Menüde sağ tık"

View File

@ -11,9 +11,9 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: I2P\n" "Project-Id-Version: I2P\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2014-01-09 19:27+0000\n" "POT-Creation-Date: 2016-05-25 12:29+0000\n"
"PO-Revision-Date: 2015-08-07 16:31+0000\n" "PO-Revision-Date: 2016-05-25 12:34+0000\n"
"Last-Translator: Denis Lysenko <gribua@gmail.com>\n" "Last-Translator: zzzi2p\n"
"Language-Team: Ukrainian (Ukraine) (http://www.transifex.com/otf/I2P/language/uk_UA/)\n" "Language-Team: Ukrainian (Ukraine) (http://www.transifex.com/otf/I2P/language/uk_UA/)\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
@ -21,38 +21,76 @@ msgstr ""
"Language: uk_UA\n" "Language: uk_UA\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
#: src/net/i2p/desktopgui/ExternalTrayManager.java:23 #: src/net/i2p/desktopgui/ExternalTrayManager.java:31
#: src/net/i2p/desktopgui/ExternalTrayManager.java:59
msgid "Start I2P" msgid "Start I2P"
msgstr "Запустити I2P" msgstr "Запустити I2P"
#: src/net/i2p/desktopgui/ExternalTrayManager.java:38 #: src/net/i2p/desktopgui/ExternalTrayManager.java:44
#: src/net/i2p/desktopgui/ExternalTrayManager.java:72
msgid "I2P is starting!" msgid "I2P is starting!"
msgstr "I2P запускається!" msgstr "I2P запускається!"
#: src/net/i2p/desktopgui/ExternalTrayManager.java:38 #: src/net/i2p/desktopgui/ExternalTrayManager.java:44
#: src/net/i2p/desktopgui/ExternalTrayManager.java:72
msgid "Starting" msgid "Starting"
msgstr "Запускається" msgstr "Запускається"
#: src/net/i2p/desktopgui/InternalTrayManager.java:26 #: src/net/i2p/desktopgui/InternalTrayManager.java:55
#: src/net/i2p/desktopgui/InternalTrayManager.java:207
msgid "Launch I2P Browser" msgid "Launch I2P Browser"
msgstr "Запустити I2P Браузер" msgstr "Запустити I2P Браузер"
#: src/net/i2p/desktopgui/InternalTrayManager.java:50 #: src/net/i2p/desktopgui/InternalTrayManager.java:76
msgid "Configure desktopgui" #: src/net/i2p/desktopgui/InternalTrayManager.java:228
msgstr "Настроїти вигляд інтерфейсу" msgid "Configure I2P System Tray"
msgstr ""
#: src/net/i2p/desktopgui/InternalTrayManager.java:67 #: src/net/i2p/desktopgui/InternalTrayManager.java:77
#: src/net/i2p/desktopgui/InternalTrayManager.java:229
msgid "Disable"
msgstr ""
#: src/net/i2p/desktopgui/InternalTrayManager.java:93
#: src/net/i2p/desktopgui/InternalTrayManager.java:245
msgid "Restart I2P" msgid "Restart I2P"
msgstr "Перезапустити I2P" msgstr "Перезапустити I2P"
#: src/net/i2p/desktopgui/InternalTrayManager.java:85 #: src/net/i2p/desktopgui/InternalTrayManager.java:110
#: src/net/i2p/desktopgui/InternalTrayManager.java:262
msgid "Stop I2P" msgid "Stop I2P"
msgstr "Зупинити I2P" msgstr "Зупинити I2P"
#: src/net/i2p/desktopgui/gui/DesktopguiConfigurationFrame.java:43 #: src/net/i2p/desktopgui/InternalTrayManager.java:126
msgid "Tray icon configuration" #: src/net/i2p/desktopgui/InternalTrayManager.java:278
msgstr "Налаштування трей-іконки" msgid "Restart I2P Immediately"
msgstr ""
#: src/net/i2p/desktopgui/gui/DesktopguiConfigurationFrame.java:46 #: src/net/i2p/desktopgui/InternalTrayManager.java:143
msgid "Should tray icon be enabled?" #: src/net/i2p/desktopgui/InternalTrayManager.java:295
msgstr "Чи повинна трей-іконка бути включена?" msgid "Stop I2P Immediately"
msgstr ""
#: src/net/i2p/desktopgui/InternalTrayManager.java:157
#: src/net/i2p/desktopgui/InternalTrayManager.java:309
msgid "Cancel I2P Shutdown"
msgstr ""
#: src/net/i2p/desktopgui/InternalTrayManager.java:363
#, java-format
msgid "Shutdown in {0}"
msgstr ""
#: src/net/i2p/desktopgui/InternalTrayManager.java:365
msgid "Shutdown imminent"
msgstr ""
#. status translations are in the console bundle
#: src/net/i2p/desktopgui/InternalTrayManager.java:370
msgid "Network"
msgstr ""
#. Windows typically has tooltips; Linux (at least Ubuntu) doesn't
#: src/net/i2p/desktopgui/TrayManager.java:63
msgid "I2P: Right-click for menu"
msgstr ""

View File

@ -3,55 +3,92 @@
# This file is distributed under the same license as the desktopgui package. # This file is distributed under the same license as the desktopgui package.
# To contribute translations, see http://www.i2p2.de/newdevelopers # To contribute translations, see http://www.i2p2.de/newdevelopers
# #
# dich_tran <tran.nathan@gmail.com>, 2011. # Translators:
# dich_tran <thnhan@gmail.com>, 2011
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: I2P\n" "Project-Id-Version: I2P\n"
"Report-Msgid-Bugs-To: https://trac.i2p2.de/\n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-03-03 18:29+0000\n" "POT-Creation-Date: 2016-05-25 12:29+0000\n"
"PO-Revision-Date: 2011-04-12 06:13+0000\n" "PO-Revision-Date: 2016-05-25 12:34+0000\n"
"Last-Translator: dich_tran <tran.nathan@gmail.com>\n" "Last-Translator: zzzi2p\n"
"Language-Team: Vietnamese (http://www.transifex.net/projects/p/I2P/team/vi/)\n" "Language-Team: Vietnamese (http://www.transifex.com/otf/I2P/language/vi/)\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Language: vi\n" "Language: vi\n"
"Plural-Forms: nplurals=1; plural=0\n" "Plural-Forms: nplurals=1; plural=0;\n"
#: src/net/i2p/desktopgui/ExternalTrayManager.java:23 #: src/net/i2p/desktopgui/ExternalTrayManager.java:31
#: src/net/i2p/desktopgui/ExternalTrayManager.java:59
msgid "Start I2P" msgid "Start I2P"
msgstr "Khởi động I2P" msgstr "Khởi động I2P"
#: src/net/i2p/desktopgui/ExternalTrayManager.java:38 #: src/net/i2p/desktopgui/ExternalTrayManager.java:44
#: src/net/i2p/desktopgui/ExternalTrayManager.java:72
msgid "I2P is starting!" msgid "I2P is starting!"
msgstr "I2P đang bắt đầu" msgstr "I2P đang bắt đầu"
#: src/net/i2p/desktopgui/ExternalTrayManager.java:38 #: src/net/i2p/desktopgui/ExternalTrayManager.java:44
#: src/net/i2p/desktopgui/ExternalTrayManager.java:72
msgid "Starting" msgid "Starting"
msgstr "Bắt đầu" msgstr "Bắt đầu"
#: src/net/i2p/desktopgui/InternalTrayManager.java:26 #: src/net/i2p/desktopgui/InternalTrayManager.java:55
#: src/net/i2p/desktopgui/InternalTrayManager.java:207
msgid "Launch I2P Browser" msgid "Launch I2P Browser"
msgstr "Kích hoạt trình duyệt I2P" msgstr "Kích hoạt trình duyệt I2P"
#: src/net/i2p/desktopgui/InternalTrayManager.java:50 #: src/net/i2p/desktopgui/InternalTrayManager.java:76
msgid "Configure desktopgui" #: src/net/i2p/desktopgui/InternalTrayManager.java:228
msgstr "Cấu hình giao diện" msgid "Configure I2P System Tray"
msgstr ""
#: src/net/i2p/desktopgui/InternalTrayManager.java:67 #: src/net/i2p/desktopgui/InternalTrayManager.java:77
#: src/net/i2p/desktopgui/InternalTrayManager.java:229
msgid "Disable"
msgstr ""
#: src/net/i2p/desktopgui/InternalTrayManager.java:93
#: src/net/i2p/desktopgui/InternalTrayManager.java:245
msgid "Restart I2P" msgid "Restart I2P"
msgstr "Khởi động lại I2P" msgstr "Khởi động lại I2P"
#: src/net/i2p/desktopgui/InternalTrayManager.java:85 #: src/net/i2p/desktopgui/InternalTrayManager.java:110
#: src/net/i2p/desktopgui/InternalTrayManager.java:262
msgid "Stop I2P" msgid "Stop I2P"
msgstr "Ngưng I2P" msgstr "Ngưng I2P"
#: src/net/i2p/desktopgui/gui/DesktopguiConfigurationFrame.java:44 #: src/net/i2p/desktopgui/InternalTrayManager.java:126
msgid "Tray icon configuration" #: src/net/i2p/desktopgui/InternalTrayManager.java:278
msgstr "Cấu hình tray icon" msgid "Restart I2P Immediately"
msgstr ""
#: src/net/i2p/desktopgui/gui/DesktopguiConfigurationFrame.java:47 #: src/net/i2p/desktopgui/InternalTrayManager.java:143
msgid "Should tray icon be enabled?" #: src/net/i2p/desktopgui/InternalTrayManager.java:295
msgstr "Cần dùng tray icon?" msgid "Stop I2P Immediately"
msgstr ""
#: src/net/i2p/desktopgui/InternalTrayManager.java:157
#: src/net/i2p/desktopgui/InternalTrayManager.java:309
msgid "Cancel I2P Shutdown"
msgstr ""
#: src/net/i2p/desktopgui/InternalTrayManager.java:363
#, java-format
msgid "Shutdown in {0}"
msgstr ""
#: src/net/i2p/desktopgui/InternalTrayManager.java:365
msgid "Shutdown imminent"
msgstr ""
#. status translations are in the console bundle
#: src/net/i2p/desktopgui/InternalTrayManager.java:370
msgid "Network"
msgstr ""
#. Windows typically has tooltips; Linux (at least Ubuntu) doesn't
#: src/net/i2p/desktopgui/TrayManager.java:63
msgid "I2P: Right-click for menu"
msgstr ""

View File

@ -3,56 +3,94 @@
# This file is distributed under the same license as the desktopgui package. # This file is distributed under the same license as the desktopgui package.
# To contribute translations, see http://www.i2p2.de/newdevelopers # To contribute translations, see http://www.i2p2.de/newdevelopers
# #
# ducki2p <ducki2p@gmail.com>, 2011. # Translators:
# walking <walking@i2pmail.org>, 2011. # ducki2p <ducki2p@gmail.com>, 2011
# walking <walking@i2pmail.org>, 2011
# Y.F Yang <yfdyh000@gmail.com>, 2016
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: I2P\n" "Project-Id-Version: I2P\n"
"Report-Msgid-Bugs-To: https://trac.i2p2.de/\n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-03-03 18:29+0000\n" "POT-Creation-Date: 2016-05-25 12:29+0000\n"
"PO-Revision-Date: 2011-03-24 09:18+0000\n" "PO-Revision-Date: 2016-05-25 14:00+0000\n"
"Last-Translator: walking <walking@i2pmail.org>\n" "Last-Translator: Y.F Yang <yfdyh000@gmail.com>\n"
"Language-Team: Chinese (China) (http://www.transifex.net/projects/p/I2P/team/zh_CN/)\n" "Language-Team: Chinese (China) (http://www.transifex.com/otf/I2P/language/zh_CN/)\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Language: zh_CN\n" "Language: zh_CN\n"
"Plural-Forms: nplurals=1; plural=0\n" "Plural-Forms: nplurals=1; plural=0;\n"
#: src/net/i2p/desktopgui/ExternalTrayManager.java:23 #: src/net/i2p/desktopgui/ExternalTrayManager.java:31
#: src/net/i2p/desktopgui/ExternalTrayManager.java:59
msgid "Start I2P" msgid "Start I2P"
msgstr "启动 I2P" msgstr "启动 I2P"
#: src/net/i2p/desktopgui/ExternalTrayManager.java:38 #: src/net/i2p/desktopgui/ExternalTrayManager.java:44
#: src/net/i2p/desktopgui/ExternalTrayManager.java:72
msgid "I2P is starting!" msgid "I2P is starting!"
msgstr "正在启动 I2P !" msgstr "正在启动 I2P !"
#: src/net/i2p/desktopgui/ExternalTrayManager.java:38 #: src/net/i2p/desktopgui/ExternalTrayManager.java:44
#: src/net/i2p/desktopgui/ExternalTrayManager.java:72
msgid "Starting" msgid "Starting"
msgstr "正在启动" msgstr "正在启动"
#: src/net/i2p/desktopgui/InternalTrayManager.java:26 #: src/net/i2p/desktopgui/InternalTrayManager.java:55
#: src/net/i2p/desktopgui/InternalTrayManager.java:207
msgid "Launch I2P Browser" msgid "Launch I2P Browser"
msgstr "正在启动I2P浏览器" msgstr "正在启动I2P浏览器"
#: src/net/i2p/desktopgui/InternalTrayManager.java:50 #: src/net/i2p/desktopgui/InternalTrayManager.java:76
msgid "Configure desktopgui" #: src/net/i2p/desktopgui/InternalTrayManager.java:228
msgstr "设置desktopgui" msgid "Configure I2P System Tray"
msgstr "配置 I2P 系统托盘"
#: src/net/i2p/desktopgui/InternalTrayManager.java:67 #: src/net/i2p/desktopgui/InternalTrayManager.java:77
#: src/net/i2p/desktopgui/InternalTrayManager.java:229
msgid "Disable"
msgstr "禁用"
#: src/net/i2p/desktopgui/InternalTrayManager.java:93
#: src/net/i2p/desktopgui/InternalTrayManager.java:245
msgid "Restart I2P" msgid "Restart I2P"
msgstr "重启 I2P" msgstr "重启 I2P"
#: src/net/i2p/desktopgui/InternalTrayManager.java:85 #: src/net/i2p/desktopgui/InternalTrayManager.java:110
#: src/net/i2p/desktopgui/InternalTrayManager.java:262
msgid "Stop I2P" msgid "Stop I2P"
msgstr "停止 I2P" msgstr "停止 I2P"
#: src/net/i2p/desktopgui/gui/DesktopguiConfigurationFrame.java:44 #: src/net/i2p/desktopgui/InternalTrayManager.java:126
msgid "Tray icon configuration" #: src/net/i2p/desktopgui/InternalTrayManager.java:278
msgstr "托盘图标配置" msgid "Restart I2P Immediately"
msgstr "立即重启 I2P"
#: src/net/i2p/desktopgui/gui/DesktopguiConfigurationFrame.java:47 #: src/net/i2p/desktopgui/InternalTrayManager.java:143
msgid "Should tray icon be enabled?" #: src/net/i2p/desktopgui/InternalTrayManager.java:295
msgstr "是否启用托盘图标?" msgid "Stop I2P Immediately"
msgstr "立即停止 I2P"
#: src/net/i2p/desktopgui/InternalTrayManager.java:157
#: src/net/i2p/desktopgui/InternalTrayManager.java:309
msgid "Cancel I2P Shutdown"
msgstr "取消 I2P 关闭"
#: src/net/i2p/desktopgui/InternalTrayManager.java:363
#, java-format
msgid "Shutdown in {0}"
msgstr "{0} 后关闭"
#: src/net/i2p/desktopgui/InternalTrayManager.java:365
msgid "Shutdown imminent"
msgstr "立即关闭"
#. status translations are in the console bundle
#: src/net/i2p/desktopgui/InternalTrayManager.java:370
msgid "Network"
msgstr "网络"
#. Windows typically has tooltips; Linux (at least Ubuntu) doesn't
#: src/net/i2p/desktopgui/TrayManager.java:63
msgid "I2P: Right-click for menu"
msgstr "I2P右击获得菜单"

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

View File

@ -6,27 +6,33 @@ import java.awt.TrayIcon;
import java.awt.event.ActionEvent; import java.awt.event.ActionEvent;
import java.awt.event.ActionListener; import java.awt.event.ActionListener;
import javax.swing.JMenuItem;
import javax.swing.JPopupMenu;
import javax.swing.SwingWorker; import javax.swing.SwingWorker;
import net.i2p.I2PAppContext;
import net.i2p.desktopgui.router.RouterManager; import net.i2p.desktopgui.router.RouterManager;
import net.i2p.util.Log;
public class ExternalTrayManager extends TrayManager { /**
* When started before the router, e.g. with
* java -cp i2p.jar:router.jar:desktopgui.jar net.i2p.desktopgui.Main
*
* No access to context, very limited abilities.
* Not fully supported.
*/
class ExternalTrayManager extends TrayManager {
private final static Log log = new Log(ExternalTrayManager.class); public ExternalTrayManager(I2PAppContext ctx, Main main, boolean useSwing) {
super(ctx, main, useSwing);
}
protected ExternalTrayManager() {}
@Override
public PopupMenu getMainMenu() { public PopupMenu getMainMenu() {
PopupMenu popup = new PopupMenu(); PopupMenu popup = new PopupMenu();
MenuItem startItem = new MenuItem(_t("Start I2P")); MenuItem startItem = new MenuItem(_t("Start I2P"));
startItem.addActionListener(new ActionListener() { startItem.addActionListener(new ActionListener() {
@Override @Override
public void actionPerformed(ActionEvent arg0) { public void actionPerformed(ActionEvent arg0) {
new SwingWorker<Object, Object>() { new SwingWorker<Object, Object>() {
@Override @Override
protected Object doInBackground() throws Exception { protected Object doInBackground() throws Exception {
RouterManager.start(); RouterManager.start();
@ -41,12 +47,44 @@ public class ExternalTrayManager extends TrayManager {
//since that risks killing the I2P process as well. //since that risks killing the I2P process as well.
tray.remove(trayIcon); tray.remove(trayIcon);
} }
}.execute(); }.execute();
} }
}); });
popup.add(startItem); popup.add(startItem);
return popup; return popup;
} }
public JPopupMenu getSwingMainMenu() {
JPopupMenu popup = new JPopupMenu();
JMenuItem startItem = new JMenuItem(_t("Start I2P"));
startItem.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
new SwingWorker<Object, Object>() {
@Override
protected Object doInBackground() throws Exception {
RouterManager.start();
return null;
}
@Override
protected void done() {
trayIcon.displayMessage(_t("Starting"), _t("I2P is starting!"), TrayIcon.MessageType.INFO);
//Hide the tray icon.
//We cannot stop the desktopgui program entirely,
//since that risks killing the I2P process as well.
tray.remove(trayIcon);
}
}.execute();
}
});
popup.add(startItem);
return popup;
}
/**
* Update the menu
* @since 0.9.26
*/
protected void updateMenu() {}
} }

View File

@ -1,35 +1,62 @@
package net.i2p.desktopgui; package net.i2p.desktopgui;
import java.awt.Desktop;
import java.awt.Desktop.Action;
import java.awt.MenuItem; import java.awt.MenuItem;
import java.awt.PopupMenu; import java.awt.PopupMenu;
import java.awt.event.ActionEvent; import java.awt.event.ActionEvent;
import java.awt.event.ActionListener; import java.awt.event.ActionListener;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import javax.swing.JPopupMenu;
import javax.swing.SwingWorker; import javax.swing.SwingWorker;
import net.i2p.desktopgui.gui.DesktopguiConfigurationFrame;
import net.i2p.data.DataHelper;
import net.i2p.desktopgui.router.RouterManager; import net.i2p.desktopgui.router.RouterManager;
import net.i2p.desktopgui.util.BrowseException; import net.i2p.desktopgui.util.BrowseException;
import net.i2p.desktopgui.util.I2PDesktop; import net.i2p.desktopgui.util.I2PDesktop;
import net.i2p.router.RouterContext;
import net.i2p.util.Log; import net.i2p.util.Log;
import net.i2p.util.PortMapper;
import net.i2p.util.Translate;
public class InternalTrayManager extends TrayManager { /**
* java -cp i2p.jar:router.jar:desktopgui.jar net.i2p.desktopgui.Main
*
* Full access to router context.
*/
class InternalTrayManager extends TrayManager {
private final static Log log = new Log(InternalTrayManager.class); private final RouterContext _context;
private final Log log;
private MenuItem _statusItem, _browserItem, _configItem, _restartItem, _stopItem,
_restartHardItem, _stopHardItem, _cancelItem;
private JMenuItem _jstatusItem, _jbrowserItem, _jconfigItem, _jrestartItem, _jstopItem,
_jrestartHardItem, _jstopHardItem, _jcancelItem;
protected InternalTrayManager() {} private static final boolean CONSOLE_ENABLED = Desktop.isDesktopSupported() &&
Desktop.getDesktop().isSupported(Action.BROWSE);
private static final String CONSOLE_BUNDLE_NAME = "net.i2p.router.web.messages";
@Override public InternalTrayManager(RouterContext ctx, Main main, boolean useSwing) {
public PopupMenu getMainMenu() { super(ctx, main, useSwing);
_context = ctx;
log = ctx.logManager().getLog(InternalTrayManager.class);
}
public synchronized PopupMenu getMainMenu() {
PopupMenu popup = new PopupMenu(); PopupMenu popup = new PopupMenu();
MenuItem browserLauncher = new MenuItem(_t("Launch I2P Browser")); final MenuItem statusItem = new MenuItem("");
browserLauncher.addActionListener(new ActionListener() {
final MenuItem browserLauncher;
if (CONSOLE_ENABLED) {
browserLauncher = new MenuItem(_t("Launch I2P Browser"));
browserLauncher.addActionListener(new ActionListener() {
@Override @Override
public void actionPerformed(ActionEvent arg0) { public void actionPerformed(ActionEvent arg0) {
new SwingWorker<Object, Object>() { new SwingWorker<Object, Object>() {
@Override @Override
protected Object doInBackground() throws Exception { protected Object doInBackground() throws Exception {
return null; return null;
@ -37,77 +64,399 @@ public class InternalTrayManager extends TrayManager {
@Override @Override
protected void done() { protected void done() {
launchBrowser();
}
}.execute();
}
});
} else {
browserLauncher = null;
}
PopupMenu desktopguiConfigurationLauncher = new PopupMenu(_t("Configure I2P System Tray"));
MenuItem configSubmenu = new MenuItem(_t("Disable"));
configSubmenu.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
new SwingWorker<Object, Object>() {
@Override
protected Object doInBackground() throws Exception {
configureDesktopgui(false);
return null;
}
}.execute();
}
});
final MenuItem restartItem;
if (_context.hasWrapper()) {
restartItem = new MenuItem(_t("Restart I2P"));
restartItem.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
new SwingWorker<Object, Object>() {
@Override
protected Object doInBackground() throws Exception {
RouterManager.restartGracefully(_context);
return null;
}
}.execute();
}
});
} else {
restartItem = null;
}
final MenuItem stopItem = new MenuItem(_t("Stop I2P"));
stopItem.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
new SwingWorker<Object, Object>() {
@Override
protected Object doInBackground() throws Exception {
RouterManager.shutDownGracefully(_context);
return null;
}
}.execute();
}
});
final MenuItem restartItem2;
if (_context.hasWrapper()) {
restartItem2 = new MenuItem(_t("Restart I2P Immediately"));
restartItem2.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
new SwingWorker<Object, Object>() {
@Override
protected Object doInBackground() throws Exception {
RouterManager.restart(_context);
return null;
}
}.execute();
}
});
} else {
restartItem2 = null;
}
final MenuItem stopItem2 = new MenuItem(_t("Stop I2P Immediately"));
stopItem2.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
new SwingWorker<Object, Object>() {
@Override
protected Object doInBackground() throws Exception {
RouterManager.shutDown(_context);
return null;
}
}.execute();
}
});
final MenuItem cancelItem = new MenuItem(_t("Cancel I2P Shutdown"));
cancelItem.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
new SwingWorker<Object, Object>() {
@Override
protected Object doInBackground() throws Exception {
RouterManager.cancelShutdown(_context);
return null;
}
}.execute();
}
});
popup.add(statusItem);
popup.addSeparator();
if (CONSOLE_ENABLED) {
popup.add(browserLauncher);
popup.addSeparator();
}
desktopguiConfigurationLauncher.add(configSubmenu);
popup.add(desktopguiConfigurationLauncher);
popup.addSeparator();
if (_context.hasWrapper())
popup.add(restartItem);
popup.add(stopItem);
if (_context.hasWrapper())
popup.add(restartItem2);
popup.add(stopItem2);
popup.add(cancelItem);
_statusItem = statusItem;
_browserItem = browserLauncher;
_configItem = desktopguiConfigurationLauncher;
_restartItem = restartItem;
_stopItem = stopItem;
_restartHardItem = restartItem2;
_stopHardItem = stopItem2;
_cancelItem = cancelItem;
return popup;
}
public synchronized JPopupMenu getSwingMainMenu() {
JPopupMenu popup = new JPopupMenu();
final JMenuItem statusItem = new JMenuItem("");
final JMenuItem browserLauncher;
if (CONSOLE_ENABLED) {
browserLauncher = new JMenuItem(_t("Launch I2P Browser"));
browserLauncher.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
new SwingWorker<Object, Object>() {
@Override
protected Object doInBackground() throws Exception {
return null;
}
@Override
protected void done() {
launchBrowser();
}
}.execute();
}
});
} else {
browserLauncher = null;
}
JMenu desktopguiConfigurationLauncher = new JMenu(_t("Configure I2P System Tray"));
JMenuItem configSubmenu = new JMenuItem(_t("Disable"));
configSubmenu.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
new SwingWorker<Object, Object>() {
@Override
protected Object doInBackground() throws Exception {
configureDesktopgui(false);
return null;
}
}.execute();
}
});
final JMenuItem restartItem;
if (_context.hasWrapper()) {
restartItem = new JMenuItem(_t("Restart I2P"));
restartItem.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
new SwingWorker<Object, Object>() {
@Override
protected Object doInBackground() throws Exception {
RouterManager.restartGracefully(_context);
return null;
}
}.execute();
}
});
} else {
restartItem = null;
}
final JMenuItem stopItem = new JMenuItem(_t("Stop I2P"));
stopItem.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
new SwingWorker<Object, Object>() {
@Override
protected Object doInBackground() throws Exception {
RouterManager.shutDownGracefully(_context);
return null;
}
}.execute();
}
});
final JMenuItem restartItem2;
if (_context.hasWrapper()) {
restartItem2 = new JMenuItem(_t("Restart I2P Immediately"));
restartItem2.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
new SwingWorker<Object, Object>() {
@Override
protected Object doInBackground() throws Exception {
RouterManager.restart(_context);
return null;
}
}.execute();
}
});
} else {
restartItem2 = null;
}
final JMenuItem stopItem2 = new JMenuItem(_t("Stop I2P Immediately"));
stopItem2.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
new SwingWorker<Object, Object>() {
@Override
protected Object doInBackground() throws Exception {
RouterManager.shutDown(_context);
return null;
}
}.execute();
}
});
final JMenuItem cancelItem = new JMenuItem(_t("Cancel I2P Shutdown"));
cancelItem.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
new SwingWorker<Object, Object>() {
@Override
protected Object doInBackground() throws Exception {
RouterManager.cancelShutdown(_context);
return null;
}
}.execute();
}
});
popup.add(statusItem);
popup.addSeparator();
if (CONSOLE_ENABLED) {
popup.add(browserLauncher);
popup.addSeparator();
}
desktopguiConfigurationLauncher.add(configSubmenu);
popup.add(desktopguiConfigurationLauncher);
popup.addSeparator();
if (_context.hasWrapper())
popup.add(restartItem);
popup.add(stopItem);
if (_context.hasWrapper())
popup.add(restartItem2);
popup.add(stopItem2);
popup.add(cancelItem);
_jstatusItem = statusItem;
_jbrowserItem = browserLauncher;
_jconfigItem = desktopguiConfigurationLauncher;
_jrestartItem = restartItem;
_jstopItem = stopItem;
_jrestartHardItem = restartItem2;
_jstopHardItem = stopItem2;
_jcancelItem = cancelItem;
return popup;
}
/**
* Update the menu
* @since 0.9.26
*/
protected synchronized void updateMenu() {
boolean x = RouterManager.isShutdownInProgress(_context);
boolean imminent = false;
String status;
if (x) {
long time = RouterManager.getShutdownTimeRemaining(_context);
if (time > 5000) {
status = _t("Shutdown in {0}", DataHelper.formatDuration2(time).replace("&nbsp;", " "));
} else {
status = _t("Shutdown imminent");
imminent = true;
}
} else {
// status translations are in the console bundle
status = _t("Network") + ": " +
Translate.getString(RouterManager.getStatus(_context), _context, CONSOLE_BUNDLE_NAME);
}
PopupMenu awt = trayIcon.getPopupMenu();
if (awt != null) {
MenuItem item = awt.getItem(0);
String oldStatus = item.getLabel();
if (!status.equals(oldStatus))
item.setLabel(status);
}
if (_browserItem != null)
_browserItem.setEnabled(!imminent);
if (_configItem != null)
_configItem.setEnabled(!imminent);
if (_restartItem != null)
_restartItem.setEnabled(!x);
if (_stopItem != null)
_stopItem.setEnabled(!x);
if (_restartHardItem != null)
_restartHardItem.setEnabled(!imminent);
if (_stopHardItem != null)
_stopHardItem.setEnabled(!imminent);
if (_cancelItem != null)
_cancelItem.setEnabled(x && !imminent);
if (_jstatusItem != null)
_jstatusItem.setText(status);
if (_jbrowserItem != null)
_jbrowserItem.setVisible(!imminent);
if (_jconfigItem != null)
_jconfigItem.setVisible(!imminent);
if (_jrestartItem != null)
_jrestartItem.setVisible(!x);
if (_jstopItem != null)
_jstopItem.setVisible(!x);
if (_jrestartHardItem != null)
_jrestartHardItem.setVisible(!imminent);
if (_jstopHardItem != null)
_jstopHardItem.setVisible(!imminent);
if (_jcancelItem != null)
_jcancelItem.setVisible(x && !imminent);
}
/**
* @since 0.9.26 from removed gui/DesktopguiConfigurationFrame
*/
private void configureDesktopgui(boolean enable) {
String property = Main.PROP_ENABLE;
String value = Boolean.toString(enable);
try { try {
I2PDesktop.browse("http://localhost:7657");
_context.router().saveConfig(property, value);
if (!enable) {
// TODO popup that explains how to re-enable in console
_main.shutdown(null);
}
} catch (Exception ex) {
log.error("Error saving config", ex);
}
}
/**
* Build the console URL with info from the port mapper,
* and launch the browser at it.
*
* Modified from I2PTunnelHTTPClientBase.
* TODO perhaps move this to a new PortMapper method.
*
* @since 0.9.26
*/
private void launchBrowser() {
String unset = "*unset*";
PortMapper pm = _context.portMapper();
String httpHost = pm.getActualHost(PortMapper.SVC_CONSOLE, unset);
String httpsHost = pm.getActualHost(PortMapper.SVC_HTTPS_CONSOLE, unset);
int httpPort = pm.getPort(PortMapper.SVC_CONSOLE, 7657);
int httpsPort = pm.getPort(PortMapper.SVC_HTTPS_CONSOLE, -1);
boolean httpsOnly = httpsPort > 0 && httpHost.equals(unset) && !httpsHost.equals(unset);
String url;
if (httpsOnly) {
url = "https://" + httpsHost + ':' + httpsPort + '/';
} else {
if (httpHost.equals(unset))
httpHost = "127.0.0.1";
url = "http://" + httpHost + ':' + httpPort + '/';
}
try {
I2PDesktop.browse(url);
} catch (BrowseException e1) { } catch (BrowseException e1) {
log.log(Log.WARN, "Failed to open browser!", e1); log.log(Log.WARN, "Failed to open browser!", e1);
} }
} }
}.execute();
}
});
MenuItem desktopguiConfigurationLauncher = new MenuItem(_t("Configure desktopgui"));
desktopguiConfigurationLauncher.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
new SwingWorker<Object, Object>() {
@Override
protected Object doInBackground() throws Exception {
new DesktopguiConfigurationFrame().setVisible(true);
return null;
}
}.execute();
}
});
MenuItem restartItem = new MenuItem(_t("Restart I2P"));
restartItem.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
new SwingWorker<Object, Object>() {
@Override
protected Object doInBackground() throws Exception {
RouterManager.restart();
return null;
}
}.execute();
}
});
MenuItem stopItem = new MenuItem(_t("Stop I2P"));
stopItem.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
new SwingWorker<Object, Object>() {
@Override
protected Object doInBackground() throws Exception {
RouterManager.shutDown();
return null;
}
}.execute();
}
});
popup.add(browserLauncher);
popup.addSeparator();
popup.add(desktopguiConfigurationLauncher);
popup.addSeparator();
popup.add(restartItem);
popup.add(stopItem);
return popup;
}
} }

View File

@ -5,91 +5,122 @@ package net.i2p.desktopgui;
*/ */
import javax.swing.SwingUtilities; import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException; import net.i2p.I2PAppContext;
import net.i2p.app.ClientAppManager;
import net.i2p.app.ClientAppState;
import static net.i2p.app.ClientAppState.*;
import net.i2p.desktopgui.router.RouterManager; import net.i2p.desktopgui.router.RouterManager;
import net.i2p.desktopgui.util.*; import net.i2p.desktopgui.util.*;
import net.i2p.router.RouterContext;
import net.i2p.router.app.RouterApp;
import net.i2p.util.Log; import net.i2p.util.Log;
import net.i2p.util.SystemVersion;
import net.i2p.util.Translate; import net.i2p.util.Translate;
import net.i2p.util.I2PProperties.I2PPropertyCallback; import net.i2p.util.I2PProperties.I2PPropertyCallback;
/** /**
* The main class of the application. * The main class of the application.
*/ */
public class Main { public class Main implements RouterApp {
///Manages the lifetime of the tray icon. private final I2PAppContext _appContext;
private TrayManager trayManager = null; private final RouterContext _context;
private final static Log log = new Log(Main.class); private final ClientAppManager _mgr;
private final Log log;
private ClientAppState _state = UNINITIALIZED;
private TrayManager _trayManager;
public static final String PROP_ENABLE = "desktopgui.enabled";
private static final String PROP_SWING = "desktopgui.swing";
/**
* @since 0.9.26
*/
public Main(RouterContext ctx, ClientAppManager mgr, String args[]) {
_appContext = _context = ctx;
_mgr = mgr;
log = _appContext.logManager().getLog(Main.class);
_state = INITIALIZED;
}
/**
* @since 0.9.26
*/
public Main() {
_appContext = I2PAppContext.getGlobalContext();
if (_appContext instanceof RouterContext)
_context = (RouterContext) _appContext;
else
_context = null;
_mgr = null;
log = _appContext.logManager().getLog(Main.class);
_state = INITIALIZED;
}
/** /**
* Start the tray icon code (loads tray icon in the tray area). * Start the tray icon code (loads tray icon in the tray area).
* @throws Exception * @throws AWTException on startup error, including systray not supported
*/ */
public void startUp() throws Exception { private synchronized void startUp() throws Exception {
trayManager = TrayManager.getInstance(); final TrayManager trayManager;
boolean useSwingDefault = !(SystemVersion.isWindows() || SystemVersion.isMac());
boolean useSwing = _appContext.getProperty(PROP_SWING, useSwingDefault);
if (_context != null)
trayManager = new InternalTrayManager(_context, this, useSwing);
else
trayManager = new ExternalTrayManager(_appContext, this, useSwing);
trayManager.startManager(); trayManager.startManager();
_trayManager = trayManager;
changeState(RUNNING);
if (_mgr != null)
_mgr.register(this);
if(RouterManager.inI2P()) { if (_context != null) {
RouterManager.getRouterContext().addPropertyCallback(new I2PPropertyCallback() { _context.addPropertyCallback(new I2PPropertyCallback() {
@Override @Override
public void propertyChanged(String arg0, String arg1) { public void propertyChanged(String arg0, String arg1) {
if(arg0.equals(Translate.PROP_LANG)) { if(arg0.equals(Translate.PROP_LANG)) {
trayManager.languageChanged(); trayManager.languageChanged();
} }
} }
}); });
} }
} }
public static void main(String[] args) { public static void main(String[] args) {
beginStartup(args); Main main = new Main();
main.beginStartup(args);
} }
/** /**
* Main method launching the application. * Main method launching the application.
*
* @param args unused
*/ */
public static void beginStartup(String[] args) { private void beginStartup(String[] args) {
try { changeState(STARTING);
String headless = System.getProperty("java.awt.headless"); String headless = System.getProperty("java.awt.headless");
boolean isHeadless = Boolean.parseBoolean(headless); boolean isHeadless = Boolean.parseBoolean(headless);
if(isHeadless) { if (isHeadless) {
log.warn("Headless environment: not starting desktopgui!"); log.warn("Headless environment: not starting desktopgui!");
changeState(START_FAILED, "Headless environment: not starting desktopgui!", null);
return; return;
} }
}
catch(Exception e) {
return;
}
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException ex) {
log.log(Log.ERROR, null, ex);
} catch (InstantiationException ex) {
log.log(Log.ERROR, null, ex);
} catch (IllegalAccessException ex) {
log.log(Log.ERROR, null, ex);
} catch (UnsupportedLookAndFeelException ex) {
log.log(Log.ERROR, null, ex);
}
ConfigurationManager.getInstance().loadArguments(args); // TODO process args with getopt if needed
final Main main = new Main(); if (_context == null)
launchForeverLoop();
main.launchForeverLoop();
//We'll be doing GUI work, so let's stay in the event dispatcher thread. //We'll be doing GUI work, so let's stay in the event dispatcher thread.
SwingUtilities.invokeLater(new Runnable() { SwingUtilities.invokeLater(new Runnable() {
@Override @Override
public void run() { public void run() {
try { try {
main.startUp(); startUp();
} } catch(Exception e) {
catch(Exception e) {
log.error("Failed while running desktopgui!", e); log.error("Failed while running desktopgui!", e);
changeState(START_FAILED, "Failed while running desktopgui!", e);
} }
} }
@ -102,7 +133,7 @@ public class Main {
* Avoids the app terminating because no Window is opened anymore. * 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 * More info: http://java.sun.com/javase/6/docs/api/java/awt/doc-files/AWTThreadIssues.html#Autoshutdown
*/ */
public void launchForeverLoop() { private static void launchForeverLoop() {
Runnable r = new Runnable() { Runnable r = new Runnable() {
public void run() { public void run() {
try { try {
@ -114,9 +145,60 @@ public class Main {
} }
} }
}; };
Thread t = new Thread(r); Thread t = new Thread(r, "DesktopGUI spinner");
t.setDaemon(false); t.setDaemon(false);
t.start(); t.start();
} }
/////// ClientApp methods
/** @since 0.9.26 */
public synchronized void startup() {
beginStartup(null);
}
/** @since 0.9.26 */
public synchronized void shutdown(String[] args) {
if (_state == STOPPED)
return;
changeState(STOPPING);
if (_trayManager != null)
_trayManager.stopManager();
changeState(STOPPED);
}
/** @since 0.9.26 */
public synchronized ClientAppState getState() {
return _state;
}
/** @since 0.9.26 */
public String getName() {
return "desktopgui";
}
/** @since 0.9.26 */
public String getDisplayName() {
return "Desktop GUI";
}
/////// end ClientApp methods
/** @since 0.9.26 */
private void changeState(ClientAppState state) {
changeState(state, null, null);
}
/** @since 0.9.26 */
private synchronized void changeState(ClientAppState state, String msg, Exception e) {
_state = state;
if (_mgr != null)
_mgr.notify(this, state, msg, e);
if (_context == null) {
if (msg != null)
System.out.println(state + ": " + msg);
if (e != null)
e.printStackTrace();
}
}
} }

View File

@ -1,65 +1,168 @@
package net.i2p.desktopgui; package net.i2p.desktopgui;
import java.awt.AWTException; import java.awt.AWTException;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Image; import java.awt.Image;
import java.awt.PopupMenu; import java.awt.PopupMenu;
import java.awt.SystemTray; import java.awt.SystemTray;
import java.awt.Toolkit; import java.awt.Toolkit;
import java.awt.TrayIcon; import java.awt.TrayIcon;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.net.URL; import java.net.URL;
import javax.swing.JFrame;
import javax.swing.JPopupMenu;
import javax.swing.event.MenuKeyEvent;
import javax.swing.event.MenuKeyListener;
import javax.swing.event.PopupMenuEvent;
import javax.swing.event.PopupMenuListener;
import net.i2p.I2PAppContext;
import net.i2p.desktopgui.i18n.DesktopguiTranslator; import net.i2p.desktopgui.i18n.DesktopguiTranslator;
import net.i2p.desktopgui.router.RouterManager; import net.i2p.util.SystemVersion;
import net.i2p.util.Log;
/** /**
* Manages the tray icon life. * Manages the tray icon life.
*/ */
public abstract class TrayManager { abstract class TrayManager {
private static TrayManager instance = null; protected final I2PAppContext _appContext;
protected final Main _main;
protected final boolean _useSwing;
///The tray area, or null if unsupported ///The tray area, or null if unsupported
protected SystemTray tray = null; protected SystemTray tray;
///Our tray icon, or null if unsupported ///Our tray icon, or null if unsupported
protected TrayIcon trayIcon = null; protected TrayIcon trayIcon;
private final static Log log = new Log(TrayManager.class);
private static final String PNG_DIR = "/desktopgui/resources/images/";
private static final String MAC_ICON = "itoopie_black_24.png";
private static final String WIN_ICON = "itoopie_white_24.png";
private static final String LIN_ICON = "logo.png";
/** /**
* Instantiate tray manager. * Instantiate tray manager.
*/ */
protected TrayManager() {} protected TrayManager(I2PAppContext ctx, Main main, boolean useSwing) {
_appContext = ctx;
protected static TrayManager getInstance() { _main = main;
if(instance == null) { _useSwing = useSwing;
boolean inI2P = RouterManager.inI2P();
if(inI2P) {
instance = new InternalTrayManager();
}
else {
instance = new ExternalTrayManager();
}
}
return instance;
} }
/** /**
* Add the tray icon to the system tray and start everything up. * Add the tray icon to the system tray and start everything up.
*/ */
protected void startManager() { public synchronized void startManager() throws AWTException {
if(SystemTray.isSupported()) { if (!SystemTray.isSupported())
throw new AWTException("SystemTray not supported");
tray = SystemTray.getSystemTray(); tray = SystemTray.getSystemTray();
trayIcon = new TrayIcon(getTrayImage(), "I2P", getMainMenu()); // Windows typically has tooltips; Linux (at least Ubuntu) doesn't
trayIcon.setImageAutoSize(true); //Resize image to fit the system tray String tooltip = SystemVersion.isWindows() ? _t("I2P: Right-click for menu") : null;
try { TrayIcon ti;
tray.add(trayIcon); if (_useSwing)
} catch (AWTException e) { ti = getSwingTrayIcon(tooltip);
log.log(Log.WARN, "Problem creating system tray icon!", e); else
ti = getAWTTrayIcon(tooltip);
ti.setImageAutoSize(true); //Resize image to fit the system tray
tray.add(ti);
trayIcon = ti;
} }
private TrayIcon getAWTTrayIcon(String tooltip) throws AWTException {
PopupMenu menu = getMainMenu();
if (!SystemVersion.isWindows())
menu.setFont(new Font("Arial", Font.BOLD, 14));
TrayIcon ti = new TrayIcon(getTrayImage(), tooltip, menu);
ti.addMouseListener(new MouseListener() {
public void mouseClicked(MouseEvent m) {}
public void mouseEntered(MouseEvent m) {}
public void mouseExited(MouseEvent m) {}
public void mousePressed(MouseEvent m) { updateMenu(); }
public void mouseReleased(MouseEvent m) { updateMenu(); }
});
return ti;
}
private TrayIcon getSwingTrayIcon(String tooltip) throws AWTException {
// A JPopupMenu by itself is hard to get rid of,
// so we hang it off a zero-size, undecorated JFrame.
// http://stackoverflow.com/questions/1498789/jpopupmenu-behavior
// http://stackoverflow.com/questions/2581314/how-do-you-hide-a-swing-popup-when-you-click-somewhere-else
final JFrame frame = new JFrame();
// http://stackoverflow.com/questions/2011601/jframe-without-frame-border-maximum-button-minimum-button-and-frame-icon
frame.setUndecorated(true);
frame.setMinimumSize(new Dimension(0, 0));
frame.setSize(0, 0);
final JPopupMenu menu = getSwingMainMenu();
menu.setFocusable(true);
frame.add(menu);
TrayIcon ti = new TrayIcon(getTrayImage(), tooltip, null);
ti.addMouseListener(new MouseListener() {
public void mouseClicked(MouseEvent e) {}
public void mouseEntered(MouseEvent e) {}
public void mouseExited(MouseEvent e) {}
public void mousePressed(MouseEvent e) { handle(e); }
public void mouseReleased(MouseEvent e) { handle(e); }
private void handle(MouseEvent e) {
//System.out.println("Button " + e.getButton() + " Frame was visible? " +
// frame.isVisible() + " menu was visible? " + menu.isVisible() +
// " trigger? " + menu.isPopupTrigger(e));
// http://stackoverflow.com/questions/17258250/changing-the-laf-of-a-popupmenu-for-a-trayicon-in-java
// menu visible check is never true
if (!frame.isVisible() /* || !menu.isVisible() */ ) {
frame.setLocation(e.getX(), e.getY());
frame.setVisible(true);
menu.show(frame, 0, 0);
}
updateMenu();
}
});
menu.addPopupMenuListener(new PopupMenuListener() {
public void popupMenuCanceled(PopupMenuEvent e) { /* frame.setVisible(false); */ }
public void popupMenuWillBecomeInvisible(PopupMenuEvent e) { frame.setVisible(false); }
public void popupMenuWillBecomeVisible(PopupMenuEvent e) {}
});
// this is to make it go away when we click elsewhere
// doesn't do anything
menu.addFocusListener(new FocusListener() {
public void focusGained(FocusEvent e) {}
public void focusLost(FocusEvent e) { frame.setVisible(false); }
});
// this is to make it go away when we hit escape
// doesn't do anything
menu.addMenuKeyListener(new MenuKeyListener() {
public void menuKeyPressed(MenuKeyEvent e) {}
public void menuKeyReleased(MenuKeyEvent e) {}
public void menuKeyTyped(MenuKeyEvent e) {
if (e.getKeyChar() == (char) 0x1b)
frame.setVisible(false);
}
});
return ti;
}
/**
* Remove the tray icon from the system tray
*
* @since 0.9.26
*/
public synchronized void stopManager() {
if (tray != null && trayIcon != null) {
tray.remove(trayIcon);
tray = null;
trayIcon = null;
} }
} }
protected void languageChanged() { public synchronized void languageChanged() {
if (trayIcon != null) {
if (!_useSwing)
trayIcon.setPopupMenu(getMainMenu()); trayIcon.setPopupMenu(getMainMenu());
// else TODO
}
} }
/** /**
@ -68,17 +171,47 @@ public abstract class TrayManager {
*/ */
protected abstract PopupMenu getMainMenu(); protected abstract PopupMenu getMainMenu();
/**
* Build a popup menu, adding callbacks to the different items.
* @return popup menu
* @since 0.9.26
*/
protected abstract JPopupMenu getSwingMainMenu();
/**
* Update the menu
* @since 0.9.26
*/
protected abstract void updateMenu();
/** /**
* Get tray icon image from the desktopgui resources in the jar file. * Get tray icon image from the desktopgui resources in the jar file.
* @return image used for the tray icon * @return image used for the tray icon
* @throws AWTException if image not found
*/ */
private Image getTrayImage() { private Image getTrayImage() throws AWTException {
URL url = getClass().getResource("/desktopgui/resources/images/logo.png"); String img;
if (SystemVersion.isWindows())
img = WIN_ICON;
else if (SystemVersion.isMac())
img = MAC_ICON;
else
img = LIN_ICON;
URL url = getClass().getResource(PNG_DIR + img);
if (url == null)
throw new AWTException("cannot load tray image " + img);
Image image = Toolkit.getDefaultToolkit().getImage(url); Image image = Toolkit.getDefaultToolkit().getImage(url);
return image; return image;
} }
protected static String _t(String s) { protected String _t(String s) {
return DesktopguiTranslator._t(s); return DesktopguiTranslator._t(_appContext, s);
}
/**
* @since 0.9.26
*/
protected String _t(String s, Object o) {
return DesktopguiTranslator._t(_appContext, s, o);
} }
} }

View File

@ -1,131 +0,0 @@
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
/*
* ConfigurationFrame.java
*
* Created on Feb 16, 2011, 8:03:14 AM
*/
package net.i2p.desktopgui.gui;
import java.util.logging.Level;
import java.util.logging.Logger;
import net.i2p.desktopgui.i18n.DesktopguiTranslator;
import net.i2p.desktopgui.router.RouterManager;
/**
*
* @author mathias
*/
public class DesktopguiConfigurationFrame extends javax.swing.JFrame {
/** Creates new form ConfigurationFrame */
public DesktopguiConfigurationFrame() {
initComponents();
}
/** This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {
desktopguiEnabled = new javax.swing.JCheckBox();
okButton = new javax.swing.JButton();
cancelButton = new javax.swing.JButton();
setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
setTitle(_t("Tray icon configuration"));
desktopguiEnabled.setSelected(true);
desktopguiEnabled.setText(_t("Should tray icon be enabled?"));
desktopguiEnabled.setActionCommand("shouldDesktopguiBeEnabled");
okButton.setText("OK");
okButton.addMouseListener(new java.awt.event.MouseAdapter() {
public void mouseReleased(java.awt.event.MouseEvent evt) {
okButtonMouseReleased(evt);
}
});
cancelButton.setText("Cancel");
cancelButton.addMouseListener(new java.awt.event.MouseAdapter() {
public void mouseReleased(java.awt.event.MouseEvent evt) {
cancelButtonMouseReleased(evt);
}
});
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(desktopguiEnabled)
.addGroup(layout.createSequentialGroup()
.addComponent(okButton)
.addGap(18, 18, 18)
.addComponent(cancelButton)))
.addContainerGap(237, Short.MAX_VALUE))
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addComponent(desktopguiEnabled)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(okButton)
.addComponent(cancelButton))
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
);
pack();
}// </editor-fold>//GEN-END:initComponents
private void cancelButtonMouseReleased(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_cancelButtonMouseReleased
System.out.println("Cancelling configuration change.");
this.dispose();
}//GEN-LAST:event_cancelButtonMouseReleased
private void okButtonMouseReleased(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_okButtonMouseReleased
configureDesktopgui();
}//GEN-LAST:event_okButtonMouseReleased
protected static String _t(String s) {
return DesktopguiTranslator._t(s);
}
private void configureDesktopgui() {
String property = "desktopgui.enabled";
String value;
if(!desktopguiEnabled.isSelected()) {
value = "false";
System.out.println("Disabling desktopgui");
}
else {
value = "true";
System.out.println("Enabling desktopgui");
}
try {
RouterManager.getRouterContext().router().saveConfig(property, value);
} catch (Exception ex) {
Logger.getLogger(DesktopguiConfigurationFrame.class.getName()).log(Level.SEVERE, null, ex);
}
System.out.println("Applying desktopgui configuration!");
this.dispose();
}
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JButton cancelButton;
private javax.swing.JCheckBox desktopguiEnabled;
private javax.swing.JButton okButton;
// End of variables declaration//GEN-END:variables
}

View File

@ -7,20 +7,11 @@ public class DesktopguiTranslator {
private static final String BUNDLE_NAME = "net.i2p.desktopgui.messages"; private static final String BUNDLE_NAME = "net.i2p.desktopgui.messages";
private static I2PAppContext ctx; public static String _t(I2PAppContext ctx, String s) {
return Translate.getString(s, ctx, BUNDLE_NAME);
private static I2PAppContext getRouterContext() {
if(ctx == null) {
ctx = I2PAppContext.getCurrentContext();
}
return ctx;
} }
public static String _t(String s) { public static String _t(I2PAppContext ctx, String s, Object o) {
return Translate.getString(s, getRouterContext(), BUNDLE_NAME); return Translate.getString(s, o, ctx, BUNDLE_NAME);
}
public static String _t(String s, Object o) {
return Translate.getString(s, o, getRouterContext(), BUNDLE_NAME);
} }
} }

View File

@ -2,43 +2,26 @@ package net.i2p.desktopgui.router;
import java.io.IOException; import java.io.IOException;
import org.tanukisoftware.wrapper.WrapperManager;
import net.i2p.I2PAppContext; import net.i2p.I2PAppContext;
import net.i2p.router.Router; import net.i2p.router.Router;
import net.i2p.router.RouterContext; import net.i2p.router.RouterContext;
//import net.i2p.router.web.ConfigServiceHandler;
import net.i2p.util.Log; import net.i2p.util.Log;
/** /**
* Handle communications with the router instance. * Handle communications with the router instance.
*
* See ConfigServiceHandler for best practices on stopping the router.
* We don't bother notifying any Wrapper instance here.
*
* @author mathias * @author mathias
* *
*/ */
public class RouterManager { public class RouterManager {
private final static Log log = new Log(RouterManager.class); /** @return non-null */
private static I2PAppContext context = I2PAppContext.getCurrentContext(); private static I2PAppContext getAppContext() {
return I2PAppContext.getGlobalContext();
public static I2PAppContext getAppContext() {
return context;
}
public static RouterContext getRouterContext() throws Exception {
if(context.isRouterContext()) {
return (RouterContext) context;
}
else {
throw new Exception("No RouterContext available!");
}
}
private static Router getRouter() {
try {
return getRouterContext().router();
} catch (Exception e) {
log.error("Failed to get router. Why did we request it if no RouterContext is available?", e);
return null;
}
} }
/** /**
@ -53,9 +36,10 @@ public class RouterManager {
//TODO: set/get PID //TODO: set/get PID
String separator = System.getProperty("file.separator"); String separator = System.getProperty("file.separator");
String location = getAppContext().getBaseDir().getAbsolutePath(); String location = getAppContext().getBaseDir().getAbsolutePath();
String[] args = new String[] { location + separator + "i2psvc", location + separator + "wrapper.config" };
Runtime.getRuntime().exec(location + separator + "i2psvc " + location + separator + "wrapper.config"); Runtime.getRuntime().exec(args);
} catch (IOException e) { } catch (IOException e) {
Log log = getAppContext().logManager().getLog(RouterManager.class);
log.log(Log.WARN, "Failed to start I2P", e); log.log(Log.WARN, "Failed to start I2P", e);
} }
} }
@ -63,34 +47,71 @@ public class RouterManager {
/** /**
* Restart the running I2P instance. * Restart the running I2P instance.
*/ */
public static void restart() { public static void restart(RouterContext ctx) {
if(inI2P()) { //if (ctx.hasWrapper())
getRouter().restart(); // ConfigServiceHandler.registerWrapperNotifier(ctx, Router.EXIT_HARD_RESTART, false);
} ctx.router().shutdownGracefully(Router.EXIT_HARD_RESTART);
} }
/** /**
* Stop the running I2P instance. * Stop the running I2P instance.
*/ */
public static void shutDown() { public static void shutDown(RouterContext ctx) {
if(inI2P()) { //if (ctx.hasWrapper())
Thread t = new Thread(new Runnable() { // ConfigServiceHandler.registerWrapperNotifier(ctx, Router.EXIT_HARD, false);
ctx.router().shutdownGracefully(Router.EXIT_HARD);
@Override
public void run() {
WrapperManager.signalStopped(Router.EXIT_HARD);
}
});
t.start();
getRouter().shutdown(Router.EXIT_HARD);
}
} }
/** /**
* Check if we are running inside I2P. * Restart the running I2P instance.
* @since 0.9.26
*/ */
public static boolean inI2P() { public static void restartGracefully(RouterContext ctx) {
return context.isRouterContext(); //if (ctx.hasWrapper())
// ConfigServiceHandler.registerWrapperNotifier(ctx, Router.EXIT_GRACEFUL_RESTART, false);
ctx.router().shutdownGracefully(Router.EXIT_GRACEFUL_RESTART);
}
/**
* Stop the running I2P instance.
* @since 0.9.26
*/
public static void shutDownGracefully(RouterContext ctx) {
//if (ctx.hasWrapper())
// ConfigServiceHandler.registerWrapperNotifier(ctx, Router.EXIT_GRACEFUL, false);
ctx.router().shutdownGracefully();
}
/**
* Cancel a graceful shutdown or restart
* @since 0.9.26
*/
public static void cancelShutdown(RouterContext ctx) {
ctx.router().cancelGracefulShutdown();
}
/**
* Is a graceful shutdown or restart in progress?
* @since 0.9.26
*/
public static boolean isShutdownInProgress(RouterContext ctx) {
return ctx.router().scheduledGracefulExitCode() > 0;
}
/**
* Get time until shutdown
* @return -1 if no shutdown in progress.
* @since 0.9.26
*/
public static long getShutdownTimeRemaining(RouterContext ctx) {
return ctx.router().getShutdownTimeRemaining();
}
/**
* Get network status, untranslated
* @since 0.9.26
*/
public static String getStatus(RouterContext ctx) {
return ctx.commSystem().getStatus().toStatusString();
} }
} }

View File

@ -1,103 +0,0 @@
package net.i2p.desktopgui.util;
import java.util.HashMap;
import java.util.Map;
/**
* Manage the configuration of desktopgui.
* @author mathias
*
*/
public class ConfigurationManager {
private static ConfigurationManager instance;
///Configurations with a String as value
private Map<String, String> stringConfigurations = new HashMap<String, String>();
///Configurations with a Boolean as value
private Map<String, Boolean> booleanConfigurations = new HashMap<String, Boolean>();
private ConfigurationManager() {}
public static ConfigurationManager getInstance() {
if(instance == null) {
instance = new ConfigurationManager();
}
return instance;
}
/**
* Collects arguments of the form --word, --word=otherword and -blah
* to determine user parameters.
* @param args Command line arguments to the application
*/
public void loadArguments(String[] args) {
for(int i=0; i<args.length; i++) {
String arg = args[i];
if(arg.startsWith("--")) {
arg = arg.substring(2);
if(arg.length() < 1) {
continue;
}
int equals = arg.indexOf('=');
if(equals != -1 && equals < arg.length() - 1) { //String configuration
loadStringConfiguration(arg, equals);
}
else { //Boolean configuration
loadBooleanConfiguration(arg);
}
}
else if(arg.startsWith("-")) { //Boolean configuration
loadBooleanConfiguration(arg);
}
}
}
/**
* Add a boolean configuration.
* @param arg The key we wish to add as a configuration.
*/
public void loadBooleanConfiguration(String arg) {
booleanConfigurations.put(arg, Boolean.TRUE);
}
/**
* Add a String configuration which consists a key and a value.
* @param arg String of the form substring1=substring2.
* @param equalsPosition Position of the '=' element.
*/
public void loadStringConfiguration(String arg, int equalsPosition) {
String key = arg.substring(0, equalsPosition);
String value = arg.substring(equalsPosition+1);
stringConfigurations.put(key, value);
}
/**
* Check if a specific boolean configuration exists.
* @param arg The key for the configuration.
* @param defaultValue If the configuration is not found, we use a default value.
* @return The value of a configuration: true if found, defaultValue if not found.
*/
public boolean getBooleanConfiguration(String arg, boolean defaultValue) {
Boolean value = booleanConfigurations.get("startWithI2P");
System.out.println(value);
if(value != null) {
return value;
}
return defaultValue;
}
/**
* Get a specific String configuration.
* @param arg The key for the configuration.
* @param defaultValue If the configuration is not found, we use a default value.
* @return The value of the configuration, or the defaultValue.
*/
public String getStringConfiguration(String arg, String defaultValue) {
String value = stringConfigurations.get(arg);
System.out.println(value);
if(value != null) {
return value;
}
return defaultValue;
}
}

View File

@ -3,12 +3,9 @@ package net.i2p.desktopgui.util;
import java.awt.Desktop; import java.awt.Desktop;
import java.awt.Desktop.Action; import java.awt.Desktop.Action;
import java.net.URI; import java.net.URI;
import net.i2p.util.Log;
public class I2PDesktop { public class I2PDesktop {
private final static Log log = new Log(I2PDesktop.class);
public static void browse(String url) throws BrowseException { public static void browse(String url) throws BrowseException {
if(Desktop.isDesktopSupported()) { if(Desktop.isDesktopSupported()) {
Desktop desktop = Desktop.getDesktop(); Desktop desktop = Desktop.getDesktop();

View File

@ -1,7 +1,12 @@
# NOTE: This I2P config file must use UTF-8 encoding # NOTE: This I2P config file must use UTF-8 encoding
# #
# If you have a 'split' directory installation, with configuration # If you have a 'split' directory installation, with configuration
# files in ~/.i2p (Linux) or %APPDATA%\I2P (Windows), be sure to # files in ~/.i2p (Linux), %APPDATA%\I2P (Windows),
# or /Users/(user)/Library/Application Support/i2p (Mac), be sure to
# edit the file in the configuration directory, NOT the install directory. # edit the file in the configuration directory, NOT the install directory.
# When running as a Linux daemon, the configuration directory is /var/lib/i2p
# and the install directory is /usr/share/i2p .
# When running as a Windows service, the configuration directory is \ProgramData\i2p
# and the install directory is \Program Files\i2p .
# #
i2psnark.dir=i2psnark i2psnark.dir=i2psnark

View File

@ -0,0 +1,26 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4">
<component name="FacetManager">
<facet type="web" name="Web">
<configuration>
<descriptors>
<deploymentDescriptor name="web.xml" url="file://$MODULE_DIR$/web.xml" />
</descriptors>
<webroots>
<root url="file://$MODULE_DIR$" relative="/WEB-INF" />
</webroots>
</configuration>
</facet>
</component>
<component name="NewModuleRootManager" inherit-compiler-output="true">
<exclude-output />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/java/src" isTestSource="false" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="library" name="jettylib" level="project" />
<orderEntry type="module" module-name="core" />
<orderEntry type="module" module-name="ministreaming" />
</component>
</module>

View File

@ -16,8 +16,11 @@
<!-- Depend on classes instead of jars where available --> <!-- Depend on classes instead of jars where available -->
<classpath> <classpath>
<pathelement location="../../../core/java/build/obj" /> <pathelement location="../../../core/java/build/obj" />
<pathelement location="../../../core/java/build/gnu-getopt.jar" />
<pathelement location="../../ministreaming/java/build/obj" /> <pathelement location="../../ministreaming/java/build/obj" />
<pathelement location="../../jetty/jettylib/javax.servlet.jar" /> <pathelement location="../../jetty/jettylib/javax.servlet.jar" />
<!-- jsp-api.jar only present for debian builds -->
<pathelement location="../../jetty/jettylib/jsp-api.jar" />
</classpath> </classpath>
</depend> </depend>
</target> </target>
@ -37,9 +40,21 @@
srcdir="./src" srcdir="./src"
debug="true" deprecation="on" source="${javac.version}" target="${javac.version}" debug="true" deprecation="on" source="${javac.version}" target="${javac.version}"
destdir="./build/obj" destdir="./build/obj"
includeAntRuntime="false" includeAntRuntime="false" >
classpath="../../../core/java/build/i2p.jar:../../jetty/jettylib/javax.servlet.jar:../../ministreaming/java/build/mstreaming.jar" >
<compilerarg line="${javac.compilerargs}" /> <compilerarg line="${javac.compilerargs}" />
<classpath>
<pathelement location="../../../core/java/build/i2p.jar" />
<!-- gnu-getopt.jar only present for debian builds -->
<pathelement location="../../../core/java/build/gnu-getopt.jar" />
<pathelement location="../../ministreaming/java/build/mstreaming.jar" />
<pathelement location="../../jetty/jettylib/javax.servlet.jar" />
<!-- jsp-api.jar only present for debian builds -->
<pathelement location="../../jetty/jettylib/jsp-api.jar" />
<!-- jetty-i2p.jar only for RunStandalone -->
<pathelement location="../../jetty/jettylib/jetty-i2p.jar" />
<!-- systray.jar only for RunStandalone -->
<pathelement location="../../systray/java/build/systray.jar" />
</classpath>
</javac> </javac>
</target> </target>
@ -60,9 +75,9 @@
<target name="jar" depends="builddep, compile, jarUpToDate, listChangedFiles" unless="jar.uptodate" > <target name="jar" depends="builddep, compile, jarUpToDate, listChangedFiles" unless="jar.uptodate" >
<!-- set if unset --> <!-- set if unset -->
<property name="workspace.changes.tr" value="" /> <property name="workspace.changes.tr" value="" />
<jar destfile="./build/i2psnark.jar" basedir="./build/obj" includes="**/*.class" excludes="**/web/* **/messages_*.class"> <jar destfile="./build/i2psnark.jar" basedir="./build/obj" includes="**/*.class" excludes="**/web/* **/messages_*.class, **/standalone/*">
<manifest> <manifest>
<attribute name="Main-Class" value="org.klomp.snark.Snark" /> <attribute name="Main-Class" value="org.klomp.snark.CommandLine" />
<attribute name="Class-Path" value="i2p.jar mstreaming.jar streaming.jar" /> <attribute name="Class-Path" value="i2p.jar mstreaming.jar streaming.jar" />
<attribute name="Implementation-Version" value="${full.version}" /> <attribute name="Implementation-Version" value="${full.version}" />
<attribute name="Built-By" value="${build.built-by}" /> <attribute name="Built-By" value="${build.built-by}" />
@ -126,6 +141,7 @@
</target> </target>
<target name="bundle" depends="compile" unless="no.bundle"> <target name="bundle" depends="compile" unless="no.bundle">
<mkdir dir="build/messages-src" />
<!-- Update the messages_*.po files. <!-- Update the messages_*.po files.
We need to supply the bat file for windows, and then change the fail property to true --> We need to supply the bat file for windows, and then change the fail property to true -->
<exec executable="sh" osfamily="unix" failifexecutionfails="true" failonerror="${require.gettext}" > <exec executable="sh" osfamily="unix" failifexecutionfails="true" failonerror="${require.gettext}" >
@ -139,6 +155,11 @@
<exec executable="sh" osfamily="windows" failifexecutionfails="false" > <exec executable="sh" osfamily="windows" failifexecutionfails="false" >
<arg value="./bundle-messages.sh" /> <arg value="./bundle-messages.sh" />
</exec> </exec>
<javac source="${javac.version}" target="${javac.version}"
includeAntRuntime="false"
srcdir="build/messages-src" destdir="build/obj">
<compilerarg line="${javac.compilerargs}" />
</javac>
</target> </target>
<target name="poupdate" depends="builddep, compile"> <target name="poupdate" depends="builddep, compile">
@ -162,29 +183,125 @@
<zipfileset dir="./dist/" prefix="i2psnark/" /> <zipfileset dir="./dist/" prefix="i2psnark/" />
</zip> </zip>
</target> </target>
<target name="standalone_prep" depends="war">
<!-- make a fat jar for standalone -->
<target name="standalone_jar" depends="war">
<!-- set if unset -->
<property name="workspace.changes.tr" value="" />
<jar destfile="build/i2psnark-standalone.jar">
<fileset dir="build/obj" includes="**/standalone/*.class" />
<zipfileset src="build/i2psnark.jar" />
<zipfileset src="../../../core/java/build/i2p.jar" />
<zipfileset src="../../jetty/jettylib/commons-logging.jar" />
<!-- without this we get a warning about 'no JSP support' but that's it
<zipfileset src="../../jetty/jettylib/jasper-runtime.jar" />
-->
<zipfileset src="../../jetty/jettylib/javax.servlet.jar" />
<zipfileset src="../../jetty/jettylib/jetty-continuation.jar" />
<zipfileset src="../../jetty/jettylib/jetty-deploy.jar" />
<zipfileset src="../../jetty/jettylib/jetty-http.jar" />
<zipfileset src="../../jetty/jettylib/jetty-i2p.jar" />
<zipfileset src="../../jetty/jettylib/jetty-io.jar" />
<zipfileset src="../../jetty/jettylib/jetty-security.jar" />
<zipfileset src="../../jetty/jettylib/jetty-servlet.jar" />
<zipfileset src="../../jetty/jettylib/jetty-util.jar" />
<zipfileset src="../../jetty/jettylib/jetty-webapp.jar" />
<zipfileset src="../../jetty/jettylib/jetty-xml.jar" />
<zipfileset src="../../jetty/jettylib/org.mortbay.jetty.jar" />
<zipfileset src="../../ministreaming/java/build/mstreaming.jar" />
<zipfileset src="../../streaming/java/build/streaming.jar" />
<zipfileset src="../../systray/java/build/systray.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... -->
<!--
<fileset dir="../../routerconsole/java/build/obj" includes="net/i2p/router/countries/*.class" />
-->
<manifest>
<attribute name="Main-Class" value="org.klomp.snark.standalone.RunStandalone"/>
<attribute name="Implementation-Version" value="${full.version}" />
<attribute name="Built-By" value="${build.built-by}" />
<attribute name="Build-Date" value="${build.timestamp}" />
<attribute name="Base-Revision" value="${workspace.version}" />
<attribute name="Workspace-Changes" value="${workspace.changes.tr}" />
<!-- this is so Jetty will report its version correctly -->
<section name="org/eclipse/jetty/server/" >
<attribute name="Implementation-Vendor" value="Eclipse.org - Jetty" />
<attribute name="Implementation-Version" value="8.1.17.v20150415" />
</section>
</manifest>
</jar>
</target>
<!-- add css, image, and js files for standalone snark to the war -->
<target name="standalone_war" depends="war">
<mkdir dir="build/standalone-resources/.resources/themes/snark" />
<copy todir="build/standalone-resources/.resources/themes/snark" >
<fileset dir="../../../installer/resources/themes/snark/" />
</copy>
<replace dir="build/standalone-resources/.resources/themes/snark"
summary="true"
token="url('/themes/"
value="url('/i2psnark/.resources/themes/" >
<include name="**/*.css" />
</replace>
<replace dir="build/standalone-resources/.resources/themes/snark"
summary="true"
token="url('../../console/images/"
value="url('/i2psnark/.resources/themes/snark/ubergine/images/" >
<include name="**/*.css" />
</replace>
<replace dir="build/standalone-resources/.resources/themes/snark"
summary="true"
token="url('../../console/dark/images/"
value="url('/i2psnark/.resources/themes/snark/ubergine/images/" >
<include name="**/*.css" />
</replace>
<replace dir="build/standalone-resources/.resources/themes/snark"
summary="true"
token="url('../../console/light/images/"
value="url('/i2psnark/.resources/themes/snark/ubergine/images/" >
<include name="**/*.css" />
</replace>
<replace dir="build/standalone-resources/.resources/themes/snark"
summary="true"
token="url('images/"
value="url('/i2psnark/.resources/themes/snark/ubergine/images/" >
<include name="**/*.css" />
</replace>
<copy todir="build/standalone-resources/.resources/themes/snark/ubergine/images" >
<!-- we really don't need all of these -->
<fileset dir="../../../installer/resources/themes/console/images/" />
</copy>
<copy file="../../../installer/resources/themes/console/dark/images/transparent.gif"
todir="build/standalone-resources/.resources/themes/snark/ubergine/images" />
<copy file="../../../installer/resources/themes/console/dark/images/header.png"
todir="build/standalone-resources/.resources/themes/snark/ubergine/images" />
<mkdir dir="build/standalone-resources/.resources/js" />
<copy file="../../routerconsole/jsp/js/ajax.js" todir="build/standalone-resources/.resources/js" />
<zip destfile="../i2psnark.war" update="true" duplicate="preserve" >
<fileset dir="build/standalone-resources" />
</zip>
</target>
<target name="standalone_prep" depends="standalone_jar, standalone_war">
<delete dir="./dist" /> <delete dir="./dist" />
<mkdir dir="./dist" /> <mkdir dir="./dist" />
<copy file="../launch-i2psnark" todir="./dist/" /> <copy file="../launch-i2psnark" todir="./dist/" />
<mkdir dir="./dist/contexts" />
<copy file="../standalone-context.xml" tofile="./dist/contexts/context.xml" />
<mkdir dir="./dist/docroot" />
<copy file="../standalone-index.html" tofile="./dist/docroot/index.html" />
<mkdir dir="./dist/webapps" /> <mkdir dir="./dist/webapps" />
<copy file="../i2psnark.war" tofile="./dist/webapps/i2psnark.war" /> <copy file="../i2psnark.war" tofile="./dist/webapps/i2psnark.war" />
<mkdir dir="./dist/lib" />
<copy file="./build/i2psnark.jar" tofile="./dist/lib/i2psnark.jar" />
<copy file="../../../core/java/build/i2p.jar" tofile="./dist/lib/i2p.jar" />
<copy file="../../jetty/jettylib/commons-el.jar" tofile="./dist/lib/commons-el.jar" />
<copy file="../../jetty/jettylib/commons-logging.jar" tofile="./dist/lib/commons-logging.jar" />
<copy file="../../jetty/jettylib/javax.servlet.jar" tofile="./dist/lib/javax.servlet.jar" />
<copy file="../../jetty/jettylib/org.mortbay.jetty.jar" tofile="./dist/lib/org.mortbay.jetty.jar" />
<copy file="../../jetty/jettylib/jasper-runtime.jar" tofile="./dist/lib/jasper-runtime.jar" />
<copy file="../../ministreaming/java/build/mstreaming.jar" tofile="./dist/lib/mstreaming.jar" />
<copy file="../../streaming/java/build/streaming.jar" tofile="./dist/lib/streaming.jar" />
<copy file="../jetty-i2psnark.xml" tofile="./dist/jetty-i2psnark.xml" /> <copy file="../jetty-i2psnark.xml" tofile="./dist/jetty-i2psnark.xml" />
<copy file="./build/i2psnark-standalone.jar" tofile="./dist/i2psnark.jar" />
<copy file="../readme-standalone.txt" tofile="./dist/readme.txt" /> <copy file="../readme-standalone.txt" tofile="./dist/readme.txt" />
<!-- temp so announces work -->
<copy file="../../../installer/resources/hosts.txt" tofile="./dist/hosts.txt" />
<copy todir="./dist/licenses" >
<fileset dir="../../../licenses" includes="LICENSE-GPLv2.txt, ABOUT-Jetty.html" />
</copy>
<mkdir dir="./dist/logs" /> <mkdir dir="./dist/logs" />
<zip destfile="i2psnark-standalone.zip">
<zipfileset dir="./dist/" prefix="i2psnark/" />
</zip>
</target> </target>
<target name="clean"> <target name="clean">

View File

@ -96,9 +96,31 @@ do
# only generate for non-source language # only generate for non-source language
echo "Generating ${CLASS}_$LG ResourceBundle..." echo "Generating ${CLASS}_$LG ResourceBundle..."
msgfmt -V | grep -q '0\.19'
if [ $? -ne 0 ]
then
# slow way
# convert to class files in build/obj # convert to class files in build/obj
msgfmt --java --statistics -r $CLASS -l $LG -d build/obj $i msgfmt --java --statistics -r $CLASS -l $LG -d build/obj $i
if [ $? -ne 0 ] if [ $? -ne 0 ]
then
echo "ERROR - msgfmt failed on ${i}, not updating translations"
# msgfmt leaves the class file there so the build would work the next time
find build -name messages_${LG}.class -exec rm -f {} \;
RC=1
break
fi
else
# fast way
# convert to java files in build/messages-src
TD=build/messages-src-tmp
TDX=$TD/org/klomp/snark/web
TD2=build/messages-src
TDY=$TD2/org/klomp/snark/web
rm -rf $TD
mkdir -p $TD $TDY
msgfmt --java --statistics --source -r $CLASS -l $LG -d $TD $i
if [ $? -ne 0 ]
then then
echo "ERROR - msgfmt failed on ${i}, not updating translations" echo "ERROR - msgfmt failed on ${i}, not updating translations"
# msgfmt leaves the class file there so the build would work the next time # msgfmt leaves the class file there so the build would work the next time
@ -106,6 +128,9 @@ do
RC=1 RC=1
break break
fi fi
mv $TDX/messages_$LG.java $TDY
rm -rf $TD
fi
fi fi
done done
rm -f $TMPFILE rm -f $TMPFILE

View File

@ -0,0 +1,45 @@
package org.klomp.snark;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import net.i2p.CoreVersion;
/**
* Simple command line access to various utilities.
* Not a public API. Subject to change.
* Apps and plugins should use specific classes.
*
* @since 0.9.26
*/
public class CommandLine extends net.i2p.util.CommandLine {
protected static final List<String> SCLASSES = Arrays.asList(new String[] {
"org.klomp.snark.MetaInfo",
//"org.klomp.snark.Snark",
//"org.klomp.snark.StaticSnark",
"org.klomp.snark.Storage",
"org.klomp.snark.bencode.BDecoder",
//"org.klomp.snark.web.RunStandalone",
});
protected CommandLine() {}
public static void main(String args[]) {
List<String> classes = new ArrayList<String>(SCLASSES.size() + CLASSES.size());
classes.addAll(SCLASSES);
classes.addAll(CLASSES);
if (args.length > 0) {
exec(args, classes);
}
usage(classes);
System.exit(1);
}
private static void usage(List<String> classes) {
System.err.println("I2PSnark version " + CoreVersion.VERSION + '\n' +
"USAGE: java -jar /path/to/i2psnark.jar command [args]");
printCommands(classes);
}
}

View File

@ -194,6 +194,7 @@ public class Peer implements Comparable<Peer>
* Compares the PeerIDs. * Compares the PeerIDs.
* @deprecated unused? * @deprecated unused?
*/ */
@Deprecated
public int compareTo(Peer p) public int compareTo(Peer p)
{ {
int rv = peerID.compareTo(p.peerID); int rv = peerID.compareTo(p.peerID);
@ -531,6 +532,7 @@ public class Peer implements Comparable<Peer>
* @deprecated deadlocks * @deprecated deadlocks
* @since 0.8.1 * @since 0.8.1
*/ */
@Deprecated
boolean isRequesting(int p) { boolean isRequesting(int p) {
PeerState s = state; PeerState s = state;
return s != null && s.isRequesting(p); return s != null && s.isRequesting(p);
@ -563,6 +565,7 @@ public class Peer implements Comparable<Peer>
* us then we start downloading from it. Has no effect when not connected. * us then we start downloading from it. Has no effect when not connected.
* @deprecated unused * @deprecated unused
*/ */
@Deprecated
public void setInteresting(boolean interest) public void setInteresting(boolean interest)
{ {
PeerState s = state; PeerState s = state;

View File

@ -196,6 +196,7 @@ public class PeerID implements Comparable<PeerID>
* Compares port, address and id. * Compares port, address and id.
* @deprecated unused? and will NPE now that address can be null? * @deprecated unused? and will NPE now that address can be null?
*/ */
@Deprecated
public int compareTo(PeerID pid) public int compareTo(PeerID pid)
{ {
int result = port - pid.port; int result = port - pid.port;

View File

@ -30,6 +30,7 @@ import net.i2p.data.DataHelper;
* *
* @deprecated unused, for command line client only, commented out in Snark.java * @deprecated unused, for command line client only, commented out in Snark.java
*/ */
@Deprecated
class PeerMonitorTask implements Runnable class PeerMonitorTask implements Runnable
{ {
final static long MONITOR_PERIOD = 10 * 1000; // Ten seconds. final static long MONITOR_PERIOD = 10 * 1000; // Ten seconds.

View File

@ -37,7 +37,10 @@ class PeerState implements DataLoader
private final Peer peer; private final Peer peer;
/** Fixme, used by Peer.disconnect() to get to the coordinator */ /** Fixme, used by Peer.disconnect() to get to the coordinator */
final PeerListener listener; final PeerListener listener;
/** Null before we have it. locking: this */
private MetaInfo metainfo; private MetaInfo metainfo;
/** Null unless needed. Contains -1 for all. locking: this */
private List<Integer> havesBeforeMetaInfo;
// Interesting and choking describes whether we are interested in or // Interesting and choking describes whether we are interested in or
// are choking the other side. // are choking the other side.
@ -49,7 +52,7 @@ class PeerState implements DataLoader
volatile boolean interested; volatile boolean interested;
volatile boolean choked = true; volatile boolean choked = true;
/** the pieces the peer has */ /** the pieces the peer has. locking: this */
BitField bitfield; BitField bitfield;
// Package local for use by Peer. // Package local for use by Peer.
@ -66,6 +69,7 @@ class PeerState implements DataLoader
private final static int MAX_PIPELINE_BYTES = 128*1024; // this is for inbound requests private final static int MAX_PIPELINE_BYTES = 128*1024; // this is for inbound requests
public final static int PARTSIZE = 16*1024; // outbound request public final static int PARTSIZE = 16*1024; // outbound request
private final static int MAX_PARTSIZE = 64*1024; // Don't let anybody request more than this private final static int MAX_PARTSIZE = 64*1024; // Don't let anybody request more than this
private static final Integer PIECE_ALL = Integer.valueOf(-1);
/** /**
* @param metainfo null if in magnet mode * @param metainfo null if in magnet mode
@ -131,24 +135,46 @@ class PeerState implements DataLoader
{ {
if (_log.shouldLog(Log.DEBUG)) if (_log.shouldLog(Log.DEBUG))
_log.debug(peer + " rcv have(" + piece + ")"); _log.debug(peer + " rcv have(" + piece + ")");
// FIXME we will lose these until we get the metainfo
if (metainfo == null)
return;
// Sanity check // Sanity check
if (piece < 0 || piece >= metainfo.getPieces()) if (piece < 0) {
{ if (_log.shouldWarn())
_log.warn("Got strange 'have: " + piece + "' message from " + peer);
return;
}
synchronized(this) {
if (metainfo == null) {
if (_log.shouldWarn())
_log.warn("Got HAVE " + piece + " before metainfo from " + peer);
if (bitfield != null) {
if (piece < bitfield.size())
bitfield.set(piece);
} else {
// note reception for later
if (havesBeforeMetaInfo == null) {
havesBeforeMetaInfo = new ArrayList<Integer>(8);
} else if (havesBeforeMetaInfo.size() > 1000) {
// don't blow up
if (_log.shouldWarn())
_log.warn("Got too many haves before metainfo from " + peer);
return;
}
havesBeforeMetaInfo.add(Integer.valueOf(piece));
}
return;
}
// Sanity check
if (piece >= metainfo.getPieces()) {
// XXX disconnect? // XXX disconnect?
if (_log.shouldLog(Log.WARN)) if (_log.shouldLog(Log.WARN))
_log.warn("Got strange 'have: " + piece + "' message from " + peer); _log.warn("Got strange 'have: " + piece + "' message from " + peer);
return; return;
} }
synchronized(this)
{
// Can happen if the other side never send a bitfield message. // Can happen if the other side never send a bitfield message.
if (bitfield == null) if (bitfield == null)
bitfield = new BitField(metainfo.getPieces()); bitfield = new BitField(metainfo.getPieces());
bitfield.set(piece); bitfield.set(piece);
} }
@ -174,6 +200,7 @@ class PeerState implements DataLoader
else else
_log.debug(peer + " rcv bitfield HAVE_NONE"); _log.debug(peer + " rcv bitfield HAVE_NONE");
} }
synchronized(this) { synchronized(this) {
if (bitfield != null) if (bitfield != null)
{ {
@ -184,17 +211,25 @@ class PeerState implements DataLoader
} }
// XXX - Check for weird bitfield and disconnect? // XXX - Check for weird bitfield and disconnect?
// FIXME will have to regenerate the bitfield after we know exactly // Will have to regenerate the bitfield after we know exactly
// how many pieces there are, as we don't know how many spare bits there are. // how many pieces there are, as we don't know how many spare bits there are.
// This happens in setMetaInfo() below.
if (metainfo == null) { if (metainfo == null) {
if (bitmap != null) { if (bitmap != null) {
bitfield = new BitField(bitmap, bitmap.length * 8); bitfield = new BitField(bitmap, bitmap.length * 8);
} else { } else {
// we can't handle this situation
if (_log.shouldLog(Log.WARN)) if (_log.shouldLog(Log.WARN))
_log.warn("have_x w/o metainfo: " + isAll); _log.warn("have_x w/o metainfo: " + isAll);
return; if (isAll) {
// note reception for later
if (havesBeforeMetaInfo == null)
havesBeforeMetaInfo = new ArrayList<Integer>(1);
else
havesBeforeMetaInfo.clear();
havesBeforeMetaInfo.add(PIECE_ALL);
} // else HAVE_NONE, ignore
} }
return;
} else { } else {
if (bitmap != null) { if (bitmap != null) {
bitfield = new BitField(bitmap, metainfo.getPieces()); bitfield = new BitField(bitmap, metainfo.getPieces());
@ -204,9 +239,8 @@ class PeerState implements DataLoader
bitfield.setAll(); bitfield.setAll();
} }
} }
} } // synch
if (metainfo == null)
return;
boolean interest = listener.gotBitField(peer, bitfield); boolean interest = listener.gotBitField(peer, bitfield);
setInteresting(interest); setInteresting(interest);
if (bitfield.complete() && !interest) { if (bitfield.complete() && !interest) {
@ -566,23 +600,44 @@ class PeerState implements DataLoader
* @param meta non-null * @param meta non-null
* @since 0.8.4 * @since 0.8.4
*/ */
public void setMetaInfo(MetaInfo meta) { public synchronized void setMetaInfo(MetaInfo meta) {
if (metainfo != null) if (metainfo != null)
return; return;
BitField oldBF = bitfield; if (bitfield != null) {
if (oldBF != null) { if (bitfield.size() != meta.getPieces())
if (oldBF.size() != meta.getPieces())
// fix bitfield, it was too big by 1-7 bits // fix bitfield, it was too big by 1-7 bits
bitfield = new BitField(oldBF.getFieldBytes(), meta.getPieces()); bitfield = new BitField(bitfield.getFieldBytes(), meta.getPieces());
// else no extra // else no extra
} else if (havesBeforeMetaInfo != null) {
// initialize it now
bitfield = new BitField(meta.getPieces());
} else { } else {
// it will be initialized later // it will be initialized later
//bitfield = new BitField(meta.getPieces()); //bitfield = new BitField(meta.getPieces());
} }
metainfo = meta; metainfo = meta;
if (bitfield != null && bitfield.count() > 0) if (bitfield != null) {
if (havesBeforeMetaInfo != null) {
// set all 'haves' we got before the metainfo in the bitfield
for (Integer i : havesBeforeMetaInfo) {
if (i.equals(PIECE_ALL)) {
bitfield.setAll();
if (_log.shouldLog(Log.WARN))
_log.warn("set have_all after rcv metainfo");
break;
}
int piece = i.intValue();
if (piece >= 0 && piece < meta.getPieces())
bitfield.set(piece);
if (_log.shouldLog(Log.WARN))
_log.warn("set have " + piece + " after rcv metainfo");
}
havesBeforeMetaInfo = null;
}
if (bitfield.count() > 0)
setInteresting(true); setInteresting(true);
} }
}
/** /**
* Unused * Unused
@ -744,6 +799,7 @@ class PeerState implements DataLoader
* @deprecated deadlocks * @deprecated deadlocks
* @since 0.8.1 * @since 0.8.1
*/ */
@Deprecated
synchronized boolean isRequesting(int piece) { synchronized boolean isRequesting(int piece) {
if (pendingRequest != null && pendingRequest.getPiece() == piece) if (pendingRequest != null && pendingRequest.getPiece() == piece)
return true; return true;

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