Compare commits

...

277 Commits

Author SHA1 Message Date
ea68f116e1 Increment build 2024-05-15 20:04:41 -04:00
3cb746594c Fix url text 2024-05-05 10:23:46 -04:00
27adae63eb Update forum URLs 2024-05-05 10:11:45 -04:00
85890d3b68 update CI files 2024-04-29 20:49:41 -04:00
96b045eb2a update CI files 2024-04-29 20:45:05 -04:00
8d00c5fa31 fix sync CI file 2024-04-29 20:28:08 -04:00
fc93a71552 Use CI to sync with gitlab 2024-04-29 18:59:34 -04:00
18e4aef4ca I2P for Android 2.5.0 2024-04-08 23:31:40 -04:00
5315e35adc I2P for Android 2.5.0 2024-04-08 23:23:24 -04:00
9ad9bc07ff Fix keystore name to produce signed build 2024-04-06 23:18:15 -04:00
bde92be29d Fix keystore path to produce signed build 2024-04-06 23:13:25 -04:00
849150ffa6 list keystore location at final step of CI so I can fix properties file 2024-04-06 23:08:51 -04:00
52dad19c7a list keystore location at final step of CI so I can fix properties file 2024-04-06 23:03:52 -04:00
e84a51097d fix base64 decode syntax 2024-04-05 16:13:54 -04:00
5289f5068a fix base64 decode syntax 2024-04-05 16:10:02 -04:00
09c7d9cfd8 fix base64 decode syntax 2024-04-05 16:06:12 -04:00
14d293fe6f Move keystore directory to runner user 2024-04-05 16:01:37 -04:00
7cd08cfd4c Assure keystore directory exists 2024-04-05 15:58:05 -04:00
aa22d83a44 fix syntax error 2024-04-05 15:10:11 -04:00
a1fd8d41b2 fix syntax error 2024-04-05 15:09:13 -04:00
9d24e68b57 remove secrets from sign.yml 2024-04-05 15:02:42 -04:00
d5e2804ea4 fix secret access to sign.yml 2024-04-05 14:58:33 -04:00
1edabd7252 fix secret access to sign.yml 2024-04-05 14:56:42 -04:00
52c1901eba fix secret access to sign.yml 2024-04-05 14:55:41 -04:00
a6f5221975 add secret access to sign.yml 2024-04-05 14:52:41 -04:00
caa57bbc3a add secret access to sign.yml 2024-04-05 14:51:34 -04:00
b28e5d741e add secret access to sign.yml 2024-04-05 14:50:20 -04:00
0f3a61390c fix typo in sign.yml 2024-04-05 14:46:58 -04:00
30a1f1d800 Create signing keys for dev-build specific builds 2024-04-05 14:41:38 -04:00
22d5d126f6 Create signing keys for dev-build specific builds 2024-04-05 14:36:18 -04:00
70e4ea810f Attempt signed CI builds(will fail right now) 2024-04-03 15:38:53 -04:00
b5c6e1489a Attempt signed CI builds(will fail right now) 2024-04-03 15:37:35 -04:00
333a1a49b1 Attempt CI builds 2024-04-03 15:26:58 -04:00
2ea93f106e unzip only tagged apk 2024-03-25 15:05:28 -04:00
d99ed0e5da Reduce timeout for release uploader 2024-03-25 14:53:34 -04:00
3881966ddb see if I can get trunk builds to work 2024-03-25 14:46:55 -04:00
9de9f46489 when a release is tagged copy over artifacts 2024-03-25 14:30:17 -04:00
149881522e specify a tag for non-trunk CI builds 2024-03-25 14:25:52 -04:00
df26d89310 attempt a trunk build too 2024-03-25 14:18:37 -04:00
707dcbbc78 create local.properties for routerjars 2024-03-25 14:08:25 -04:00
812aea9873 clone i2p.i2p in CI 2024-03-25 14:04:49 -04:00
aeb7614b62 clone i2p.i2p in CI 2024-03-25 14:00:30 -04:00
9bf9d27c5a use Java 11 in CI 2024-03-25 13:58:07 -04:00
f2cfe4cee5 start a CI build of the Android APK 2024-03-25 13:55:38 -04:00
45865ff5b9 Increment version code and upload to GPlay 2023-12-19 13:45:24 -05:00
96f9905952 Update I2P library version to 2.4.0 2023-12-19 13:44:04 -05:00
idk
41ca3fe527 tx pull 2023-07-05 18:18:32 -04:00
idk
c5468e4829 migrate transifex configs 2023-07-05 18:17:16 -04:00
idk
174bb7f827 increment version code 2023-07-05 15:51:33 -04:00
idk
3d92f32c13 update I2P library 2023-07-05 13:54:21 -04:00
idk
2fae27a3b3 bump version code 2023-04-15 05:46:17 +00:00
idk
71d38c64e0 fix version 2023-04-15 02:37:48 +00:00
idk
ddb651a602 pull in new translations 2023-03-18 04:04:56 +00:00
idk
a8ad1d8d47 update changelog 2023-03-18 04:02:13 +00:00
idk
912602bfc0 bump versioncode 2023-03-18 04:01:16 +00:00
idk
24e3358ffa check in stats page translation fix, update for release 2023-03-18 01:29:12 +00:00
idk
fcc51c429d update version code again 2023-03-04 23:09:41 +00:00
idk
de0ee87db3 bump versionCode and I2P_ANDROID_VERSION 2023-03-04 23:05:24 +00:00
idk
2102d55315 update javadoc on long copypasta section 2023-02-10 00:21:36 +00:00
idk
2f900ebe2d blocklist entries first attempt 2023-02-10 00:20:48 +00:00
idk
5c03981a61 don't overwrite subscriptions.txt TODO look into possible permissions issues obscuring the behavior of cRTFIA 2023-01-31 22:34:12 +00:00
idk
c68f0ff23a Add broadcast intent change from @RyeMantis to changelog 2023-01-23 00:36:14 +00:00
idk
b01f44ae1f enable adding base32 destinations from the addressbook interface. Allow base32 addresses which contain ports to validate 2023-01-23 00:32:26 +00:00
idk
05aeb0cf37 Merge branch 'remote-start' into 'master'
Allow third-party apps to start I2P on Android via a Bradcast Intent

Closes #39

See merge request i2p-hackers/i2p.android.base!3
2023-01-22 23:28:43 +00:00
fd8d596064 Allow third-party apps to start I2P on Android via a Bradcast Intent 2023-01-22 23:28:43 +00:00
idk
ea3fe136e4 bump versionCode for gplay release 2023-01-11 16:38:32 +00:00
idk
47f4530f6f bump version for release, add jcenter repository to app/build.gradle to resolve missing packages 2023-01-11 16:00:52 +00:00
idk
016a7a47fd check in new translations 2023-01-07 19:54:33 +00:00
idk
f8410deeba -f pull just in case, at some point translation got out-of-sync on my end and needed refreshed, probably good to be sure at release time 2022-12-11 16:25:55 +00:00
idk
7268132ddd Add tag freeze note to RELEASE_PROCESS.md 2022-12-11 02:55:40 +00:00
idk
62545f1247 Target latest SDK version, which requires updating gradle plugin. Add TODO: for maven plugin which breaks on newer versions of gradle 2022-12-09 21:32:59 +00:00
zzz
99b6992b5c Build: Disable lint which fails with a class conflict.
As recommended by idk
2022-12-09 12:56:28 -05:00
zzz
e8ebb0a569 Pull translations from tx 2022-12-06 13:45:55 -05:00
idk
3ab2c83b7b bump release version and version code 2022-11-23 14:53:47 -05:00
idk
cb46abca82 Always compile with the TARGET_SDK_VERSION even if we're compatible with lower versions 2022-11-23 14:09:28 -05:00
idk
63b345e329 Add FLAG_IMMUTABLE recent Android versions, should fix #49 but still untested 2022-11-23 13:30:36 -05:00
idk
794b8433d8 update changelog 2022-11-22 22:12:59 -05:00
idk
a7891a3674 check in version 2.0.0 2022-11-22 11:53:02 -05:00
idk
7076785ec1 add instructions for Privacy Browser 2022-11-09 01:16:17 -05:00
idk
f8eda45409 promote privacybrowser back to supported, demote non-fennec firefoxes to unsupported 2022-11-09 00:53:52 -05:00
idk
8d0f1689c1 Merge branch 'android-build-updates' into 'master'
Android build updates

See merge request idk/i2p.android.base!1
2022-10-19 01:38:22 +00:00
idk
25ef37cddf Merge branch 'master' into 'android-build-updates'
# Conflicts:
#   gradle.properties
2022-10-19 01:38:08 +00:00
idk
c5936858a2 fix Android 12 builds 2022-10-18 21:33:43 -04:00
idk
17d2e2fc93 list all browsers in prep for VPN mode 2022-10-18 20:32:43 -04:00
idk
a0e41e5171 update the changelog 2022-09-08 11:51:50 -04:00
idk
2d1244f339 update versions for F-Droid main 2022-09-04 11:23:37 -04:00
idk
9eec1d3348 checkin android build updates 2022-08-30 11:07:40 -04:00
idk
5824fd4efa update the version code 2022-08-26 22:29:07 -04:00
idk
9c87bfcb51 After un-breaking the gradle build, bump the version to 1.9.0 2022-08-26 22:27:43 -04:00
idk
0c380f2ef5 Fix backward base32 validator condition 2022-08-21 12:10:37 -04:00
idk
dafe3d0002 make base32's greater than 64 chars in length validate 2022-08-08 14:23:20 -04:00
idk
255ac60691 update changelog and fix string 2022-08-08 14:08:59 -04:00
idk
23f681dd7d start retroactively fixing the changelog which I did not update for a while. 2022-07-18 12:47:46 -04:00
idk
d6a55a122a switch back I2P_VERSION 2022-06-26 18:41:02 -04:00
idk
454937d345 checkin release update 2022-06-25 10:16:47 -04:00
idk
ec8cf76fc4 reverse changes to settings_net.xml 2022-06-24 13:34:05 -04:00
idk
6788f9a663 make speed_values an integer array 2022-06-24 01:34:40 -04:00
idk
dc96c6251f remove less-good family keys workaround 2022-06-17 03:13:30 -04:00
idk
c2bced68bb fix missing cert issue 2022-06-16 15:59:40 -04:00
idk
e21b4e5cbd fix .gitignore 2022-05-28 02:13:42 -04:00
idk
1f434d8a05 re-do the AndroidSAMSecureSession so it doesn't require me to ask permission to draw over other apps. Permission to draw over other apps gives apps the power to take screenshots, so it's a special permission on Android. 2022-05-28 02:12:23 -04:00
idk
cd12d84d47 get rid of buggy new-version check which prevents merging of new hosts files. More refactoring of interactive SAM Auth interface. 2022-05-19 18:29:31 -04:00
idk
82b92caa55 only loop for 1 minute before returning false by default 2022-05-19 15:51:56 -04:00
idk
49e4fcc49c refactor SAMSecureSession implementation 2022-05-19 15:41:48 -04:00
idk
a9abe05325 check in new turkish strings 2022-05-19 13:29:24 -04:00
idk
ea6705374f Make the SAM approver do UI stuff on the main thread 2022-04-22 00:46:31 -04:00
idk
3e28f2bf93 A do even more early logging. Certs need to be kept up to date and should be updated regardless of whether it's a new version or not 2022-04-21 17:10:57 -04:00
idk
4c881525f9 Use localized strings for interactive SAM auth 2022-04-21 12:30:34 -04:00
idk
9280c80a53 Add SAM interstitial 2022-04-20 14:11:40 -04:00
idk
e465a6d232 Check in translations 2022-04-18 14:29:54 -04:00
idk
d7f79e7b0b do much more logging in the initialization process. Account for differences in application path when seen from aab vs apk viewpoint. 2022-03-02 17:22:55 -05:00
idk
68f44b8ec1 Bump for release and tag 2022-02-22 15:27:48 -05:00
idk
0835a42fbd Replace donate references with gitlab references 2022-01-07 15:52:02 -05:00
idk
78e649dc9b Bump GPlay version 2022-01-06 20:02:04 -05:00
idk
84e73a693c Bump 1.6.1 2022-01-06 19:32:45 -05:00
idk
c0ad7dfc09 Fix zip path traversal issue(we are likely unaffected since we do not unzip arbitrary zip files, just certificates_zip. Update certificates_zip. 2022-01-06 19:31:25 -05:00
idk
dec68432bc Check in translations. Fix dockerfile. Bump I2P_VERSION. Bump versionCode. 2021-11-30 19:57:51 -05:00
idk
f93fc155ef Merge branch 'Battery-Optimization-Fix' into 'master'
Battery optimization fix

See merge request i2p-hackers/i2p.android.base!2
2021-09-05 20:19:42 +00:00
e348af340a Battery optimization fix 2021-09-05 20:19:41 +00:00
idk
aa3631ed33 Merge branch 'start-on-boot-fix' into 'master'
Fixed start on boot

See merge request i2p-hackers/i2p.android.base!1
2021-09-02 16:04:07 +00:00
idk
f2088ad1e5 bump versions and tag 2021-08-30 09:58:27 -04:00
008e9b7961 Fixed start on boot 2021-08-27 04:22:06 -07:00
idk
90a46bcc3f make sure gitignore and dockerignore are checked in 2021-08-15 14:49:54 -04:00
idk
f69f748064 Checkin release 0.9.50 2021-05-19 09:32:41 -04:00
idk
640a2e1918 Add Docker release instructions, since it takes a bunch of the toolchain-management difficulty and automates it 2021-05-07 02:00:36 -04:00
idk
8aead91700 Add GPG to docker container builds 2021-05-06 17:06:16 -04:00
idk
b18a2e6241 Dockerize the build process to save time setting up releases in the future 2021-05-04 15:02:37 -04:00
idk
09c3e6e12c Remove docker instructions until I have time to write them better 2021-05-03 21:35:28 -04:00
idk
74bf0eade2 Merge branch 'master' of 127.0.0.1:i2p-hackers/i2p.android.base 2021-05-03 21:33:40 -04:00
idk
2fa6e7f3cb Enable Docker builds 2021-05-03 21:32:53 -04:00
idk
24b741be1e Enable Docker builds 2021-05-03 21:32:02 -04:00
zzz
ac8ce6f916 Update and remove old links in welcome_html 2021-05-02 11:50:14 -04:00
idk
cd7d0ad723 Android release 2021-02-28
-----BEGIN PGP SIGNATURE-----
 
 iQFMBAABCgA2FiEEcNIGBzi++AUjrK/311wDs5teFOEFAmAugowYHGhhbmtoaWxs
 MTk1ODBAZ21haWwuY29tAAoJENdcA7ObXhThwQsIAK0A284NXvJsJ7an3CCIf1Ws
 DEYmG1fibJA3BwgSYxgFUy5bgN3tEAEvwldo8PyRq6EBxe419/Ab9awoepx1wmN+
 NtfOOTuB0kHTRKUreZNuhwYUKddNrr7o10WJgHhyj6PPGIau/4XYvTVuQ70hOoI4
 Vw809u7bk5mM4cGCAnxnsgNus7khcwzbDeYZI5CbbEClk+QcKHTDkC1sMCo9vqTo
 bbS+zIoy9G+4k6LCaiC0QL6GeLcwns2vtRfDaXgImjoDGx9TL0nm/USBwsllkkmW
 +GZAvbck43yh8DixuERHN6NncuF0EI01etgvl4H8no31tQxVU+7UsZWTkz1uyKQ=
 =tJK3
 -----END PGP SIGNATURE-----
gpgsig -----BEGIN PGP SIGNATURE-----
 
 iQFMBAABCgA2FiEEcNIGBzi++AUjrK/311wDs5teFOEFAmCFoG4YHGhhbmtoaWxs
 MTk1ODBAZ21haWwuY29tAAoJENdcA7ObXhThM08H/2+D0RCbP0/2QxYxFsf3NuZp
 UizMCnVqKCoomN1dChLs1kw00dJXAEAGtFZqzT8nbUHD8W98pljFc5j0qJ3BLQNU
 xrNHkE3KiwHU0ACZvrIPN9X1bj3uhNnziblPlpEBpMq/p3W8oKUWnLr9Zv8Gyetu
 Cpqjr/p4OaYpTUHLzp9NWltUpDDul0Mgy+lmhtUbYfNW4NtlVMAfOpNvBwFDcYGn
 FW4cP7t8nPzv4Cdzn5SD19KFCgGxHEFkWCF2uiJTiXOdi7LNsljKEgdMVNokO5Av
 zF97Cr+alLhg/GnxYeUB/Tgn4mTOBqzM4ir8EhIb+APWYowoWUossr68mgZ5aco=
 =BGmd
 -----END PGP SIGNATURE-----

Merge tag 'android-0.9.49'

Android release 2021-02-28
2021-04-25 13:01:31 -04:00
zzz
c5a0c3608d Drop .mtn-ignore 2021-04-25 07:11:49 -04:00
idk
3863c0e183 Increase version numbers for release 2021-02-18 10:05:20 -05:00
idk
69ea3d8bde remove trailing slash from gradle.properties 2021-02-10 17:25:32 -05:00
idk
7cafe6da48 add gitlab SSH and HTTP to i2ptunnel_config. Invalidate the view containing the I2P tunnel lists, in order to force them to redraw when a new tunnel is created. Closes #4 2021-02-04 12:41:03 -05:00
idk
9464b46ad0 Change the foreground service notification priorities from PRIORITY_MIN to PRIORITY_LOW. Don't check if we're restarting on Android versions greater than O since it uses the notificationChannel. Closes #5 2021-02-03 14:25:08 -05:00
idk
c230a5a101 Create the notification channel right before updating the statusbar notification. 2021-02-02 01:22:37 -05:00
idk
3d37f2ae07 use a toast for clipboard notification instead 2021-02-02 00:38:50 -05:00
idk
f88aafe292 fix the notification channel for the main status 2021-02-01 21:22:51 -05:00
idk
aa2dab1d3c Re-enable NTCP because it fixes the firewalled but inbound TCP not enabled issue 2021-01-29 16:45:07 -05:00
idk
8e85eaa2f0 SAM needs run() instead of start() to work correctly 2021-01-29 16:05:41 -05:00
zzz
6a1848caf6 Startup: Don't sleep in startup Jobs, requeue instead, to not clog the job queue 2021-01-27 09:09:52 -05:00
idk
aa36b4cb14 add facility to copy base32 URL of a tunnel by long-pressing the tunnel name 2021-01-18 11:58:48 -05:00
idk
78d4b12142 Remove nonsense comment at the end of the line which was covered up by the terminal 2021-01-11 10:46:15 -05:00
idk
c2f3a80dec Correctly fetch new SAM API preference when starting the SAM API job 2021-01-11 10:45:19 -05:00
idk
a679784aab Fix some build issues(Stemming from resources moving to wars) and add a SAM API option 2021-01-10 09:23:43 -05:00
idk
835667437b Fix some build issues(Stemming from resources moving to wars) and add a SAM API option 2021-01-10 09:20:45 -05:00
idk
f016edec7a add logo 2021-01-09 17:26:18 -05:00
1e3b517219 Bump target requirement to 29 for GPlay 2020-12-03 04:19:24 +00:00
f4e3b15fcf add new translation 'tk' 2020-12-02 22:51:06 +00:00
fc4154be67 Bump version for release 2020-12-02 22:48:07 +00:00
5bf0b18767 Add IceRaven configuration recommendation. 2020-11-11 05:28:17 +00:00
eb5ef3129b Add IceRaven configuration recommendation. 2020-11-11 05:26:05 +00:00
6e87d248c0 update changelog for 0.9.47-1 2020-10-30 12:39:27 +00:00
c9b0aff142 Add pushing mtn tags to the RELEASE-PROCESS.md so nobody confuses gitisms and mtnisms again 2020-10-30 02:44:26 +00:00
5acac0dbc4 increment version code 2020-10-29 19:38:28 +00:00
0b42a7ee64 add an example override.properties 2020-10-29 04:00:53 +00:00
c3a798ee3d add an example override.properties 2020-10-29 04:00:27 +00:00
e682369311 slightly better bootclasspath example in RELEASE-PROCESS.md 2020-10-28 21:40:28 +00:00
14b953f145 add classpath and Java Version requirements to RELEASE-PROCESS.md 2020-10-28 20:29:19 +00:00
036c807d6b Explicitly enable NTCP2 2020-10-28 02:00:52 +00:00
a41fca95df disable ntcp 2020-10-27 23:13:33 +00:00
26fdf40f25 merge of '5285d38e1dec9ca4af6fed9b10029de9c622a443'
and '890c3b02b48b2ff11946ccea164dad683aa2e8fd'
2020-10-27 20:29:03 +00:00
070af6529c Only ever pop the batter interstitial one time, no matter what, since we can't rely on the Android API to tell us the right thing 2020-10-27 20:28:41 +00:00
zzz
7ba0892351 Remove outproxy that's down 2020-10-26 17:30:52 +00:00
5b9cdb9f9f update release process again 2020-09-13 14:45:07 +00:00
zzz
b79d39a74a date format fixes 2020-09-03 15:07:09 +00:00
5fc5aed0c9 update the maven release instructions 2020-09-03 14:13:56 +00:00
aec25ab374 update build files for the release 2020-08-26 20:07:21 +00:00
zzz
9d5c495936 remove old subscription 2020-07-04 12:31:16 +00:00
4dc2bb6b01 check in new string for new foreground task 2020-06-29 23:28:18 +00:00
373e013911 fix foreground service notification issue on android 8.1 and greater 2020-06-29 20:12:32 +00:00
83bb7096a7 merge of '412007995e44aa866ff698a168742c4c330a62ef'
and '5bb8ab81cd3ab734f3c6b6d67d53eff28c5f5558'
2020-06-07 16:11:38 +00:00
cc1c4690a2 fix unchecked-in version code bump 2020-06-05 16:13:01 +00:00
69ad581235 update the changelog 2020-06-03 04:51:36 +00:00
4be227631d Bump version to 0.9.46 2020-06-03 00:20:01 +00:00
3f3f1f8e3d Catch the AndroidRuntimeException and warn if we can't change the power save permission 2020-06-02 22:40:58 +00:00
22290da1a4 merge of '01b01ebb27ab903f97975265856546c244185909'
and 'ac15ee2b1ce53342c8bfea5ccd3360220e615471'
2020-03-28 17:16:03 +00:00
7caf21d552 I2P Android 0.9.45 release commit 2020-03-08 04:51:08 +00:00
701860a525 Translations update in helper 2020-03-08 04:50:35 +00:00
7615aca89e Translations update 2020-03-08 04:50:07 +00:00
cae8ed2ae3 Remove arch x86 and mips due to google requirements 2020-03-08 04:49:49 +00:00
zzz
a523e1cb4a update default irc server list 2020-03-04 13:29:13 +00:00
5e048af9c1 Google said no. The 0.9.44 release would be based off this commit instead as it's has the current minimum target sdk. 2019-12-03 15:42:13 +00:00
77b6c4d30f Release commit for Android I2P 0.9.44 2019-12-03 15:33:29 +00:00
zzz
983a94e1c4 Update changelog after revert of:
Revision: 034402ca4ed4243122bd88857c7d306e295c9fbe
  Parent:   9f9a905cf75324471b3a8eb41da2feebf620207c
  Author:   meeh@mail.i2p
  Date:     10/27/2019 15:00:33
  Branch:   i2p.android.base
  Changelog:
  Merged two heads
2019-10-28 15:09:23 +00:00
zzz
1f79323d66 merge of '1d4693c3e133c94344da0418287d05613bfe34f5'
and 'cab71a0c3af65109945e3b7e4f927825e8e7deb4'
2019-10-28 15:05:50 +00:00
zzz
d86d3ad5ae disapproval of revision '034402ca4ed4243122bd88857c7d306e295c9fbe' 2019-10-28 15:05:37 +00:00
c41b064045 Android version 0.9.43 2019-10-27 15:01:28 +00:00
4c299ecda3 Merged two heads 2019-10-27 15:00:33 +00:00
761f427366 Translations update 2019-10-27 15:00:12 +00:00
f4c4bfe8be string improvements and remove redundancy in battery optimization fix 2019-10-12 17:49:06 +00:00
7f15a6f1e1 Inform the user of improved perfomance by excepting us from battery optimizations and prompt for permission to do so 2019-10-11 21:34:46 +00:00
zzz
5734760d58 Hide tunnel actions while TCG is starting 2019-10-11 17:12:33 +00:00
zzz
3244adfcd2 Rework fix for ticket #2629 to catch the null TCG sooner
javadocs
2019-10-11 16:52:43 +00:00
zzz
ce62b0fb97 Force logo to stopped if no router
Set logo for graceful shutdown
2019-10-11 16:25:43 +00:00
zzz
64673ee185 Change message for tunnel list when TCG not running yet 2019-10-11 16:20:06 +00:00
zzz
a36cabdcc8 Fix ISE in language dialog (ticket #2631) 2019-10-10 12:48:14 +00:00
1e8531c731 Fix for #2629, at least this is what we can do in the android end without adding new strings. 2019-10-09 20:19:24 +00:00
zzz
0935659d6d Save state to preferences in background thread (tickets #2595, #2632) 2019-10-08 15:45:34 +00:00
zzz
bef5f7e746 more README updates 2019-10-08 14:16:32 +00:00
zzz
d64e8359c1 Add dev build info to README 2019-10-08 14:11:20 +00:00
5fd77ea62d changelog reminder in RELEASE-PROCESS.md 2019-08-31 00:22:36 +00:00
8626ac2913 Changelog update 2019-08-31 00:21:05 +00:00
1258f18bc3 Android 0.9.42 2019-08-30 17:32:06 +00:00
8b677abd3c Hopefully a fix for #2598 2019-08-27 13:40:45 +00:00
f3d1e89002 Release commit for 0.9.41 2019-07-05 09:29:04 +00:00
zzz
f39c9a0fc4 changelog
one final
2019-06-30 16:00:48 +00:00
3186caa6bb use a timed task.get to avoid the issue in 2491 2019-06-30 15:43:35 +00:00
fc1259d8a8 fix gradle.properties 2019-06-21 14:22:01 +00:00
848d07331e fix the missing import 2019-06-21 03:28:33 +00:00
zzz
9794d26d0c Update client and helper lib min SDK to 14
Update helper support lib dependency version
2019-06-20 17:43:16 +00:00
76cd9c85ef merge of '668d7d7863ed98df6cac1ba0fe2d435570a36efb'
and 'adf749373c41853aa682a705dae3a5da0c52713b'
2019-06-20 16:30:22 +00:00
d4c7c480fb merge of '36107760d6d841ea86b860db02529fb4d089febc'
and '6f181c44ff5071894c19222047b2e90ad3ab4af5'
2019-06-20 16:24:54 +00:00
00aa80d104 fixed 2522, browsers may be installed while the application is running 2019-06-20 16:24:47 +00:00
zzz
20086685aa lint 2019-06-20 14:21:48 +00:00
zzz
86a8effd82 lint: This broadcast receiver declares an intent-filter for
a protected broadcast action string, which can only be sent by the system,
not third-party applications. However, the receiver's onReceive method
does not appear to call getAction to ensure that the received Intent's action string
matches the expected value, potentially making it possible
for another actor to send a spoofed intent with no action string
or a different action string and cause undesired behavior.
2019-06-20 14:13:10 +00:00
zzz
55d6e6d24e suppress lint 2019-06-20 13:52:37 +00:00
zzz
3b05046df3 Catch WindowManager$BadTokenException in WebViewClient (ticket #2390) 2019-06-20 13:03:37 +00:00
zzz
b8587cd0ab Don't store ContentResolver with a Context ref in AppCache static ref;
pass the Context to each call instead.
This may be the cause of some WebView leaks/crashes
2019-06-20 12:46:37 +00:00
zzz
61dd550040 lint: Remove NewsFetcher static ref;
Turn it into a ClientApp and register with the ClientAppManager
so NewsFragment can find it.
Let ClientAppManager start and stop it.
2019-06-19 15:06:38 +00:00
478ff63889 remove ! emphasis 2019-06-19 14:03:21 +00:00
e747619b85 merge of '0d35cf2746cae62a4bec33eaaf8f58302c3485aa'
and '327097d70c3dd5045a07be4e0367d91e3073a321'
2019-06-19 14:01:18 +00:00
zzz
f043bb3d72 lint: Bump espresso-core dependency from 2.2.2 to 3.0.2 2019-06-19 12:45:30 +00:00
zzz
98d8106f56 lint: Replace HashMap with SparseArray
finals
2019-06-19 12:37:01 +00:00
zzz
74eb0ce4f6 add lint notes 2019-06-18 19:37:12 +00:00
zzz
d79813d6d1 lint:
Consider using apply() instead; commit writes its data to persistent storage immediately,
whereas apply will handle it in the background

javadocs:
Unlike commit(), which writes its preferences out to persistent storage synchronously,
apply() commits its changes to the in-memory SharedPreferences immediately
but starts an asynchronous commit to disk and you won't be notified of any failures.
If another editor on this SharedPreferences does a regular commit() while a apply() is still outstanding,
the commit() will block until all async commits are completed as well as the commit itself.

As SharedPreferences instances are singletons within a process,
it's safe to replace any instance of commit() with apply() if you were already ignoring the return value.

You don't need to worry about Android component lifecycles and their interaction with apply() writing to disk.
The framework makes sure in-flight disk writes from apply() complete before switching states.
2019-06-18 19:25:44 +00:00
zzz
8f60c6ce9e lint: Specify locale in case conversion 2019-06-18 19:12:32 +00:00
zzz
7e0d017858 lint:
Must be one or more of: Service.START_FLAG_REDELIVERY, Service.START_FLAG_RETRY
2019-06-18 19:05:12 +00:00
zzz
8470435ee2 lint:
The WIFI_SERVICE must be looked up on the Application context or memory will leak on devices < Android N.
Try changing context to context.getApplicationContext()
2019-06-18 18:54:25 +00:00
5023d69222 This solves #2552 hopefully. 2019-06-18 18:09:03 +00:00
34c7464f5b fix inconsistency 2019-06-18 01:44:54 +00:00
2da6fe9c62 experimental browser documentation 2019-06-18 01:08:03 +00:00
1927c9e5a3 extend instructions for Firefox 2019-06-17 21:50:07 +00:00
1ace085d13 updating browser documentation 2019-06-17 20:09:31 +00:00
zzz
95e6c1f7a6 New 64 bit libjbigi (ticket #2503), update 32 bit jbigi
With GMP 6.1.2 and Android NDK r19c
From i2p.i2p/core/c/jbigi:
TARGET=android BITS=64 mbuild_all.sh
TARGET=android BITS=32 mbuild_all.sh
Both tested on phones.
Note lib/client/src/main/jniLibs/build.sh is broken
2019-06-05 18:37:19 +00:00
zzz
03bdd575a7 New translations: Add cs, da, el
Add missing translations to menu: ar, fi, gl, hu, zh_TW
2019-06-02 12:23:10 +00:00
zzz
98c5313d75 Add spacer between addresses in RI output 2019-06-02 11:41:45 +00:00
zzz
c047bdf085 Use new 0.9.41 TCG.getInstance() method for Android
so instance with stale context is not returned.
2019-06-02 11:10:04 +00:00
zzz
e113ef0002 build: Add streaming dependencies
(fixed streaming not found at runtime)
2019-06-01 18:40:26 +00:00
zzz
3e9b47307d i2ptunnel: Drop welterde IRC tunnel 2019-06-01 17:57:48 +00:00
zzz
2d864ad8b1 Don't start Addressbook and NewsFetcher until i2ptunnel starts
Changelog updates
2019-06-01 15:00:14 +00:00
zzz
5b7f9bd452 If router stops before ready, stop RunI2PTunnel job 2019-06-01 14:04:00 +00:00
zzz
3c89749f94 Set disableInterface property string like the others 2019-06-01 12:07:06 +00:00
zzz
edbd5fd7ea Don't zero-pad slider value 2019-06-01 12:05:45 +00:00
zzz
faf8bf74af add some padding to the tables 2019-06-01 00:25:38 +00:00
zzz
851e774e7a Update home page floating menu visibility when clicked, not just when page is loaded
Put our router info at the top of the list
Release process additions
2019-06-01 00:07:23 +00:00
zzz
dcea801116 UPnP: Add multicast permissions, use callback for MulticastLock (ticket #2499) 2019-05-31 21:51:12 +00:00
zzz
cb5235e6da add new outproxy 2019-05-31 21:26:32 +00:00
zzz
5c7eaf2484 remove BOB 2019-05-31 21:16:15 +00:00
764cfc91ec Instructions for development builds 2019-05-29 18:11:51 +00:00
177a2c6dc1 Required changes to gradle for development builds. 2019-05-29 17:37:48 +00:00
4dccd1dbae Clarify that the client library should always be released 2019-05-16 08:18:32 +00:00
50141eb24b release docs update 2019-05-13 20:03:34 +00:00
4dab632bc8 Release process docs update 2019-05-13 14:21:12 +00:00
350515041a I2P Android release commit for 0.9.40 2019-05-10 22:26:04 +00:00
5ba294c2c2 Updated the release docs with a lot more information. 2019-05-10 22:23:57 +00:00
a215363206 merge of '252f48089a9d496c609cf1b886d8d56c65836851'
and '2c8389bae9c93fb46e31edc66f1c292a95bf87eb'
2019-05-10 22:16:39 +00:00
4bd647c67c Translation updates. 2019-05-10 22:16:29 +00:00
zzz
b951892c05 Util: Check for NTCP2 in getNetStatus() 2019-05-02 14:29:59 +00:00
zzz
16e05e0dd8 Fix NPE in ViewPager (ticket #2488)
See code comments for references
2019-05-01 17:34:45 +00:00
5bdf119b81 merge of '67e6f911bbdcd72a5910ab653cf40eca13f08659'
and 'f846922ebab446b76ccee6c4d10f873af2d3d4ac'
2019-05-01 13:00:34 +00:00
b73b72c9c8 Fix for trac ticket #2485. 2019-05-01 12:59:56 +00:00
zzz
0bae211da5 Fix addressbook crash (ticket #2489) 2019-04-30 21:14:52 +00:00
zzz
709392e8b6 UI: Classify NTCP2 as NTCP
Don't crash on unknown transport configuration (ticket #2482)
2019-04-30 14:25:29 +00:00
zzz
80ed1e71da i2ptunnel: Possible NPE fix (ticket #2483) 2019-04-29 16:33:32 +00:00
6c0a60892f Fix for trac issue #2481. 2019-04-29 16:18:43 +00:00
zzz
7f13aa26fb i2ptunnel: more finals 2019-04-29 13:34:11 +00:00
zzz
7167a11844 i2ptunnel: finals 2019-04-29 13:28:18 +00:00
zzz
1f140bf95a Settings: Fix saving I2CP config (hopefully) 2019-04-29 12:47:21 +00:00
zzz
940b2b83a1 New translations: ar, gl, hu 2019-04-24 14:10:53 +00:00
zzz
bdbebe11c4 reduce min translate percentage 2019-04-24 14:07:07 +00:00
zzz
51ca137102 Update news URLs 2019-04-23 18:34:52 +00:00
f0ff4eeab7 Temporary fix for Javadoc errors 2019-04-22 07:35:37 +00:00
zzz
93d103e5ad Re-enable the advanced config for i2cp.disable,
so third-party apps can connect via the standard socket.
Domain sockets don't work on recent androids for 3rd party apps.
Bote can continue to use the domain socket if it's signed by the same key
and has the same ID.
2019-04-12 17:05:25 +00:00
149 changed files with 4777 additions and 1371 deletions

3
.dockerignore Normal file
View File

@ -0,0 +1,3 @@
app/pkg-temp
app/build
app/pkg-mavencentral

73
.github/workflows/ant.yml vendored Normal file
View File

@ -0,0 +1,73 @@
# Mostly copied from https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-java-with-ant
# zlatinb
name: Java CI
on: [push]
permissions:
contents: read
pages: write
id-token: write
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: GetText
run: sudo apt install gettext git
- uses: actions/checkout@v4
- name: Set up JDK 11
uses: actions/setup-java@v4
with:
java-version: '11'
distribution: 'temurin'
- name : Generate override.properties
run: |
rm -f override.properties
echo "build.built-by=GitHub Actions" >> override.properties
echo "noExe=true" >> override.properties
- name: build with Gradle
run: |
echo "i2psrc=$HOME/i2p.i2p" > routerjars/local.properties
git clone -b i2p-2.4.0 https://github.com/i2p/i2p.i2p "$HOME/i2p.i2p"
./gradlew assembleDebug
find . -name '*.apk'
- name: Upload i2p-debug-${{ github.sha }}.apk
uses: actions/upload-artifact@v4
with:
name: i2p-debug.apk
path: ./app/build/outputs/apk/free/debug/app-free-debug.apk
trunk:
runs-on: ubuntu-latest
steps:
- name: GetText
run: sudo apt install gettext git
- uses: actions/checkout@v4
- name: Set up JDK 11
uses: actions/setup-java@v4
with:
java-version: '11'
distribution: 'temurin'
- name : Generate override.properties
run: |
rm -f override.properties
echo "build.built-by=GitHub Actions" >> override.properties
echo "noExe=true" >> override.properties
grep -v I2P_ gradle.properties > gradle.properties.update
echo "I2P_VERSION=2.5.0-1" >> gradle.properties.update
echo "I2P_ANDROID_VERSION=2.5.0-1" >> gradle.properties.update
cp -v gradle.properties.update gradle.properties
- name: build with Gradle
run: |
echo "i2psrc=$HOME/i2p.i2p" > routerjars/local.properties
git clone -b master https://github.com/i2p/i2p.i2p "$HOME/i2p.i2p"
bash -c "cd $HOME/i2p.i2p && ./installer/resources/maven-dev-release.sh 1"
./gradlew assembleDebug
find . -name '*.apk'
- name: Upload i2p-debug-${{ github.sha }}.apk
uses: actions/upload-artifact@v4
with:
name: i2p-debug-trunk-${{ github.sha }}.apk
path: ./app/build/outputs/apk/free/debug/app-free-debug.apk

22
.github/workflows/github-sync.yml vendored Normal file
View File

@ -0,0 +1,22 @@
# File: .github/workflows/github-sync.yml for i2p-hackers/i2p.android.base
on:
schedule:
- cron: "*/5 * * * *"
workflow_dispatch:
jobs:
repo-sync:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
persist-credentials: false
- name: repo-sync
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
uses: repo-sync/github-sync@v2
with:
source_repo: "https://i2pgit.org/i2p-hackers/i2p.android.base"
source_branch: "master"
destination_branch: "master"
github_token: ${{ secrets.PAT }}

62
.github/workflows/release.yml vendored Normal file
View File

@ -0,0 +1,62 @@
name: Release
#on: [push]
on:
push:
# Sequence of patterns matched against refs/tags
tags:
- 'i2p-android-*.*.*' # Release i2p-firefox-1.2.3
- 'i2p-android-*.*.*-*' # Release i2p-firefox-1.2.3
jobs:
build:
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- uses: actions/checkout@v4
with:
sparse-checkout: |
CHANGELOG.md
sparse-checkout-cone-mode: false
- name: sleep 6 minutes
run: |
echo "sleeping 6 minutes to wait for artifacts"
sleep 1m
echo "sleeping 5 minutes to wait for artifacts"
sleep 1m
echo "sleeping 4 minutes to wait for artifacts"
sleep 1m
echo "sleeping 3 minutes to wait for artifacts"
sleep 1m
echo "sleeping 2 minutes to wait for artifacts"
sleep 1m
echo "sleeping 1 minutes to wait for artifacts"
sleep 1m
- name: Download artifacts
id: download-artifact
uses: dawidd6/action-download-artifact@v3
with:
skip_unpack: true
workflow: ant.yml
if_no_artifact_found: fail
# remove .zip file extension
#- run: for f in *.zip; do unzip "$f"; rm "$f"; done
- run: unzip i2p-debug.apk.zip
- run: echo "" | tee -a RELEASE.md
- run: echo "## Checksums" | tee -a RELEASE.md
- run: echo "" | tee -a RELEASE.md
- run: echo '```' | tee -a RELEASE.md
- run: sha256sum * | tee -a RELEASE.md
- run: echo '```' | tee -a RELEASE.md
- run: echo "" | tee -a RELEASE.md
- run: echo '```' | tee -a RELEASE.md
- run: file * | tee -a RELEASE.md
- run: echo '```' | tee -a RELEASE.md
- run: echo "" | tee -a RELEASE.md
- name: Upload artifacts
uses: ncipollo/release-action@v1
with:
artifacts: "*"
bodyFile: "RELEASE.md"

95
.github/workflows/sign.yml vendored Normal file
View File

@ -0,0 +1,95 @@
# Mostly copied from https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-java-with-ant
# zlatinb
name: Java Signed CI
on: [push]
permissions:
contents: read
pages: write
id-token: write
jobs:
build-signed:
runs-on: ubuntu-latest
steps:
- name: GetText
run: sudo apt install gettext git
- uses: actions/checkout@v4
- name: Set up JDK 11
uses: actions/setup-java@v4
with:
java-version: '11'
distribution: 'temurin'
- name: Generate override.properties
env:
DEV_SIGNING_KEY: ${{ secrets.DEV_SIGNING_KEY }}
DEV_PASSWORD: ${{ secrets.DEV_PASSWORD }}
run: |
rm -f override.properties
mv etc/github.gradle.properties gradle.properties
mv etc/github.signing.properties signing.properties
mkdir -p $HOME/keystores/
echo $DEV_SIGNING_KEY | base64 --decode > $HOME/keystores/android-release.keystore
echo "KEY_ALIAS=mykey" >> signing.properties
echo "KEY_PASSWORD=$DEV_PASSWORD" >> signing.properties
echo "build.built-by=GitHub Actions" >> override.properties
echo "noExe=true" >> override.properties
- name: build with Gradle
run: |
echo "i2psrc=$HOME/i2p.i2p" > routerjars/local.properties
git clone -b i2p-2.4.0 https://github.com/i2p/i2p.i2p "$HOME/i2p.i2p"
./gradlew assembleRelease
find . -name '*.apk'
ls -lah $HOME/keystores/android-release.keystore
ls -d $HOME
- name: Upload i2p-debug-${{ github.sha }}.apk
uses: actions/upload-artifact@v4
with:
name: i2p-debug.apk
path: ./app/build/outputs/apk/free/debug/app-free-debug.apk
trunk-signed:
runs-on: ubuntu-latest
steps:
- name: GetText
run: sudo apt install gettext git
- uses: actions/checkout@v4
- name: Set up JDK 11
uses: actions/setup-java@v4
with:
java-version: '11'
distribution: 'temurin'
- name: Generate override.properties
env:
DEV_SIGNING_KEY: ${{ secrets.DEV_SIGNING_KEY }}
DEV_PASSWORD: ${{ secrets.DEV_PASSWORD }}
run: |
rm -f override.properties
echo "build.built-by=GitHub Actions" >> override.properties
echo "noExe=true" >> override.properties
mv etc/github.gradle.properties gradle.properties
mv etc/github.signing.properties signing.properties
mkdir -p $HOME/keystores/
echo $DEV_SIGNING_KEY | base64 --decode > $HOME/keystores/android-release.keystore
echo "KEY_ALIAS=mykey" >> signing.properties
echo "KEY_PASSWORD=$DEV_PASSWORD" >> signing.properties
grep -v I2P_ gradle.properties > gradle.properties.update
echo "I2P_VERSION=2.5.0-1" >> gradle.properties.update
echo "I2P_ANDROID_VERSION=2.5.0-1" >> gradle.properties.update
cp -v gradle.properties.update gradle.properties
- name: build with Gradle
run: |
echo "i2psrc=$HOME/i2p.i2p" > routerjars/local.properties
git clone -b master https://github.com/i2p/i2p.i2p "$HOME/i2p.i2p"
bash -c "cd $HOME/i2p.i2p && ./installer/resources/maven-dev-release.sh 1"
./gradlew assembleRelease
find . -name '*.apk'
ls -lah $HOME/keystores/android-release.keystore
ls -d $HOME
- name: Upload i2p-debug-${{ github.sha }}.apk
uses: actions/upload-artifact@v4
with:
name: i2p-debug-trunk-${{ github.sha }}.apk
path: ./app/build/outputs/apk/free/debug/app-free-debug.apk

8
.gitignore vendored Normal file
View File

@ -0,0 +1,8 @@
etc/docker.signing.properties
signing.properties
.idea
.idea/
.gradle/
local.properties
override.properties
build

View File

@ -1,52 +0,0 @@
# Just to try and prevent some noob disasters.
# Use mtn add --no-respect-ignore foo.jar to ignore this ignore list
_jsp\.java$
\.bz2$
\.class$
\.diff$
\.exe$
\.fba$
\.gz$
\.jar$
\.out$
\.patch$
\.sig$
\.sud$
\.su2$
\.tar$
\.war$
\.zip$
^\.
^build/
^pkg-temp/
~$
/build/
/classes/
# Android-specific ignores
^lib/client/libs
^routerjars/libs
local.properties
signing.properties
#IntelliJ IDEA
^.idea
.*.iml
.*.ipr
.*.iws
#Gradle
build
# I2P-specific ignores
^app/src/main/res/drawable/i2plogo.png
^app/src/main/res/raw/blocklist_txt
^app/src/main/res/raw/hosts_txt
^app/src/main/res/raw/.*_ht
^app/src/main/res/raw/license_
^app/src/main/res/raw/certificates_zip
^app/src/main/assets/themes/console/images
^app/src/main/assets/themes/console/light/console.css
^app/src/main/assets/themes/console/light/images/header.png
^scripts/build.number
^scripts/version.properties

View File

@ -1,18 +1,18 @@
[main]
host = https://www.transifex.com
lang_map = he: iw, id: in, pt_BR: pt-rBR, ru_RU: ru, sv_SE: sv, tr_TR: tr, uk_UA: uk, yi: ji, zh_CN: zh, zh_TW: zh-rTW
host = https://www.transifex.com
lang_map = pt_BR: pt-rBR, yi: ji, zh_CN: zh, zh_TW: zh-rTW, id: in, ru_RU: ru, sv_SE: sv, tr_TR: tr, uk_UA: uk, he: iw
[I2P.android]
file_filter = app/src/main/res/values-<lang>/strings.xml
[o:otf:p:I2P:r:android]
file_filter = app/src/main/res/values-<lang>/strings.xml
source_file = app/src/main/res/values/strings.xml
source_lang = en
type = ANDROID
minimum_perc = 22
[o:otf:p:I2P:r:android_lib_helper]
file_filter = lib/helper/src/main/res/values-<lang>/strings.xml
source_file = lib/helper/src/main/res/values/strings.xml
source_lang = en
type = ANDROID
minimum_perc = 50
source_file = app/src/main/res/values/strings.xml
source_lang = en
type = ANDROID
[I2P.android_lib_helper]
file_filter = lib/helper/src/main/res/values-<lang>/strings.xml
minimum_perc = 50
source_file = lib/helper/src/main/res/values/strings.xml
source_lang = en
type = ANDROID

149
CHANGELOG
View File

@ -1,3 +1,152 @@
2.4.0
* Update I2P Library
2.3.0
* Update I2P Library
2.2.0
* Add blocklist feed support
* Fix translations on stats page
* Various bugfixes
2.1.0-1
* adds support for adding base32 addresses to the local addressbook
* adds support for destinations with ports in the string to i2ptunnel
* adds support for remote applications launching I2P, via MR#3 from @RyeMantis
2.1.0
* Upgrades router to version 2.1.0
* Adds jcenter repository back to app/ target, removes jcenter from other targets
* explicitly set android.useAndroidX
2.0.1
* Fixes gitlab#49 by applying MUTABLE or IMMUTABLE flags across all PendingIntents
2.0.0
* Updates router to version 2.0.0
* Updates gradle plugin
* Remove Firefox from supported browsers list due to lack of about:config support
* Add Privacy Browser to supported browsers list and write guide for it
1.9.1
* Switches back to mavenCentral builds
* Fixes build process for F-Droid main
* Using tag i2p.i2p:i2p-android-1.9.0
* Allow b32 and blinded b32 to validate in I2PTunnel UI
1.9.0
* Updates router to version 1.9.0
* Using tag i2p.i2p:i2p-android-1.9.0
1.8.2
* This update fixes a bug where Family Keys are incorrectly handled by the Android router, leading
to a crash.
* This update fixes a bug wherein incorrect type-checking caused a crash when using the Network
Config page for some users.
1.8.1
* This update fixes a bug where certificates were unpacked to the wrong location on new installs,
resulting in the router failing to start.
* Decouples the Android version from the I2P library version to allow for android point
releases with less pain.
1.8.0
* This release updates the underlying I2P libraries to I2P version 1.8.0
* The SAM API now operates in "Interactive Authentication" mode. Users will be prompted via
the notificationArea to approve or ignore new SAM connections initiated by external apps.
* The network config menu now features a drop-down configuration instead of a slider configuration
(since reversed)
1.7.1
* This release updates the underlying I2P libraries to I2P version 1.7.1
1.7.0
* This release updates the underlying I2P libraries to I2P version 1.7.0
* Refactor of the unzipResourceToDir function
1.6.0
* This release updates the underlying I2P libraries to I2P version 1.6.0
1.5.0
* This release updates the underlying I2P libraries to I2P version 1.5.0
0.9.50 2021-05-18
* This release updates the underlying I2P libraries to I2P version 0.9.50
0.9.48 2020-12-02
* This release updates the underlying I2P libraries to I2P version 0.9.48
* Updates to browser configuration documentation
0.9.47-1 2020-10-29
* This release fixes a number of bugs arising from a misconfigured bootclasspath
* Fix a battery-management issue arising on some phones
0.9.47 / 2020-08-26
* Notification bug-fixes on platforms >8.0
0.9.46 / 2020-06-03
* catch ActivityNotFound exception in MainActivity
0.9.45 / 2020-03-07
* No significant changes
0.9.44 / 2019-12-03
* Updated translations
* Bumped target sdk version to 28, enforced by google
0.9.43-1 / 2019-10-28
* Fix crash at startup in TCG
0.9.43 / 2019-10-27
* Save state in background thread (tickets #2595, #2632)
* Fix ISE in language dialog (ticket #2631)
* Fix NPE in create tunnel (ticket #2629)
* Update logo after router killed in background
* Fix message in tunnels tabs when tunnels not up yet
* Hide tunnel actions while TCG is starting
* Add battery permissions dialog (ticket #2607)
0.9.42 / 2019-08-28
* Possible fix for tunnel edit dialog crash (ticket #2598)
0.9.41 / 2019-07-03
* New 64 bit libjbigi (ticket #2503)
* Update 32 bit jbigi to GMP 6.1.2
* Fix for client tunnels not starting after reseed
* UPnP Fixes (ticket #2499)
* WebView crash fixes (ticket #2390)
* i2ptunnel crash fix (ticket #2552)
* i2ptunnel ANR fix (ticket #2491)
* Browser help pages improvements (tickets #2521, 2523)
* Code cleanups and fixes
* Update visibility of floating menu items
* Put our router info at top of list
* Table layout cleanups
* Fixes for threads remaining after router stop
* Remove BOB
* Remove welterde IRC tunnel
* Various lint fixes
* New translations: Add cs, da, el
* Add missing translations to menu: ar, fi, gl, hu, zh_TW
0.9.40 / 2019-05-10
* Open local I2CP socket for 3rd party apps
* Fix News URLs
* Numerous bug fixes (see trac)
0.9.39 / 2019-03-23
* Set App ID
0.9.38 / 2019-01-27
0.9.37 / 2018-10-10
0.9.36 / 2018-08-27
0.9.35 / 2018-07-03
0.9.34 / 2018-04-25
0.9.33 / 2018-02-18
* Translation updates

11
DEVELOPMENT-README.md Normal file
View File

@ -0,0 +1,11 @@
# Development Readme
## How to build development builds of the router core for android?
Check the RELEASE-PROCESS.md file for general information about how to build and to bump the version.
In your i2p.i2p codebase checkout, execute `./installer/resources/maven-dev-release.sh` with your build number as first argument.
The script locates itself and uses the same codebase as it's in, to produce the maven builds which will be locally installed.
Next, add the build number to the gradle.properties and build the android build as usual.

91
DOCKER.md Normal file
View File

@ -0,0 +1,91 @@
Docker Build Instructions
=========================
It is possible to build a container with a pre-installed environment for
correctly compiling an I2P for Android development build. Unlike the i2p.i2p
container, zero attempt has been made to optimize the size of the container,
as it contains a copy of the latest Android SDK, toolchains, and Android NDK,
which it must download. To save time, this is cached locally. It is likely to
take up to 30 GB of disk space to compile in this way, however, it is very easy
and convenient compared to the steps in RELEASE-PROCESS.md and may make
building Android reproducibly easier in the future.
Container dependencies
----------------------
- `menny/android_ndk` (third-party image) (reviewed by idk) (depends on menny/android_sdk
- `menny/android_sdk` (third-party image) (reviewed by idk) (depends on ubuntu/18.04)
- `ubuntu/18.04` (official docker container) (base container)
Build the container locally
---------------------------
Run:
docker build -t i2p.android.base .
To build the container. It will have a lot to download the first time, so it may take
a while to complete.
Run an Android build in the container
-------------------------------------
Copy the `etc/docker.signing.example.proprties` file to `etc/docker.signing.proprties`,
edit it to match your key information and rebuild the container.
Run:
docker run -it \
-u $(id -u):$(id -g) \
--name i2p.android.base \
-v $HOME/.gnupg/:/.gnupg/:ro \
-v $HOME/.i2p-plugin-keys/:/.i2p-plugin-keys/:ro \
-v /run/user/$(id -u)/:/run/user/$(id -u)/:ro \
i2p.android.base
To get the build artifacts for uploading to Maven out of the container, use:
docker cp i2p.android.base:/opt/workspace/i2p.i2p/pkg-mavencentral app/pkg-mavencentral
docker cp i2p.android.base:/opt/workspace/i2p.i2p/mavencentral-i2p.jar app/pkg-mavencentral
docker cp i2p.android.base:/opt/workspace/i2p.i2p/mavencentral-mstreaming.jar app/pkg-mavencentral
docker cp i2p.android.base:/opt/workspace/i2p.i2p/mavencentral-router.jar app/pkg-mavencentral
docker cp i2p.android.base:/opt/workspace/i2p.i2p/mavencentral-servlet-i2p.jar app/pkg-mavencentral
docker cp i2p.android.base:/opt/workspace/i2p.i2p/mavencentral-streaming.jar app/pkg-mavencentral
To get the Android build artifacts out of the container, use:
docker cp i2p.android.base:/opt/workspace/i2p.android.base/app/build/ app/build
And your android applications will appear in the `app/build` directory, in the same
place where non-container builds would go.
If you encounter a permissions error when rebuilding, delete the `app/build`,
`app/pkg-mavencentral` and `app/pkg-temp` path.
rm -rf app/pkg-temp app/build app/pkg-mavencentral
Copypasta
---------
Once you have set up builds for the first time, from then on you can update the container and
build a fresh set of Maven jars and a new I2P for Android app by copy-pasting the following
commands:
``` sh
rm -rf app/pkg-temp app/build app/pkg-mavencentral
docker build -t i2p.android.base .
docker run -it \
-u $(id -u):$(id -g) \
--name i2p.android.base \
-v $HOME/.gnupg/:/.gnupg/:ro \
-v $HOME/.i2p-plugin-keys/:/.i2p-plugin-keys/:ro \
-v /run/user/$(id -u)/:/run/user/$(id -u)/:ro \
i2p.android.base
docker cp i2p.android.base:/opt/workspace/i2p.i2p/pkg-mavencentral app/pkg-mavencentral
docker cp i2p.android.base:/opt/workspace/i2p.i2p/mavencentral-i2p.jar app/pkg-mavencentral
docker cp i2p.android.base:/opt/workspace/i2p.i2p/mavencentral-mstreaming.jar app/pkg-mavencentral
docker cp i2p.android.base:/opt/workspace/i2p.i2p/mavencentral-router.jar app/pkg-mavencentral
docker cp i2p.android.base:/opt/workspace/i2p.i2p/mavencentral-servlet-i2p.jar app/pkg-mavencentral
docker cp i2p.android.base:/opt/workspace/i2p.i2p/mavencentral-streaming.jar app/pkg-mavencentral
docker cp i2p.android.base:/opt/workspace/i2p.android.base/app/build/ app/build
```

39
Dockerfile Normal file
View File

@ -0,0 +1,39 @@
FROM menny/android_ndk
ENV VERSION=0.9.50
ENV JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64/
RUN echo 'deb http://deb.i2p2.de/ sid main' >> /etc/apt/sources.list
RUN echo 'deb-src http://deb.i2p2.de/ sid main' >> /etc/apt/sources.list
RUN echo 'deb http://archive.ubuntu.com/ubuntu trusty universe' >> /etc/apt/sources.list
RUN wget -O /etc/apt/trusted.gpg.d/i2p-debian-repo.key.asc https://geti2p.net/_static/i2p-debian-repo.key.asc
COPY etc/debian-jessie-repo.key.asc /etc/apt/trusted.gpg.d
RUN mkdir -p /opt/packages && wget -O /opt/packages/openjdk-7-jre-headless.deb http://security.debian.org/debian-security/pool/updates/main/o/openjdk-7/openjdk-7-jre-headless_7u261-2.6.22-1~deb8u1_amd64.deb
RUN apt-get update
RUN apt-get build-dep -y i2p i2p-router
RUN apt-get install -y ant openjdk-8* libxml2-utils junit4 libhamcrest-java libmockito-java libmaven-ant-tasks-java dpkg-sig maven
RUN cd /opt/packages && dpkg-sig -l openjdk-7-jre-headless.deb && dpkg -x openjdk-7-jre-headless.deb /opt/packages/openjdk-7-jre
RUN git clone https://github.com/i2p/i2p.i2p --depth=1 -b i2p-$VERSION /opt/workspace/i2p.i2p
RUN update-java-alternatives --jre-headless --set java-1.8.0-openjdk-amd64
RUN update-java-alternatives --set java-1.8.0-openjdk-amd64
RUN update-alternatives --set javac /usr/lib/jvm/java-8-openjdk-amd64/bin/javac
RUN update-alternatives --set java /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java
RUN rm /opt/java/openjdk/ -rfv
COPY . /opt/workspace/i2p.android.base
COPY etc/docker.local.ndk.properties /opt/workspace/i2p.android.base/client/local.properties
COPY etc/docker.local.router.properties /opt/workspace/i2p.android.base/routerjars/local.properties
COPY etc/docker.local.sdk.properties /opt/workspace/i2p.android.base/local.properties
COPY etc/docker.override.properties /opt/workspace/i2p.android.base/override.properties
COPY etc/docker.override.properties /opt/workspace/i2p.i2p/override.properties
COPY etc/docker.signing.properties /opt/workspace/i2p.android.base/signing.properties
WORKDIR /opt/workspace/i2p.android.base
RUN find /opt/android-sdk-linux -type d -print0 | xargs -0 chown -R 1000:1000
RUN find /opt/android-sdk-linux -type d -print0 | xargs -0 chmod -Rc o+rw
RUN find /opt/android-sdk-linux -type d -print0 | xargs -0 chmod -c 0755
RUN find /opt/workspace -type d -print0 | xargs -0 chown -R 1000:1000
RUN find /opt/workspace -type d -print0 | xargs -0 chmod -Rc o+rw
RUN find /opt/workspace -type d -print0 | xargs -0 chmod -c 0755
CMD cd /opt/workspace/i2p.i2p && \
ant -k mavenCentral; \
cp -v *.jar pkg-mavencentral/; \
cd /opt/workspace/i2p.android.base && \
./gradlew --continue dependencies || true ; \
./gradlew --continue assembleRelease; tail -f README.md

View File

@ -7,8 +7,8 @@
- Java SDK (preferably Oracle/Sun or OpenJDK) 1.6.0 or higher
- Apache Ant 1.8.0 or higher
- I2P source
- Android SDK for API 21
- Android Build Tools 21.1.2
- Android SDK for API 28 or higher
- Android Build Tools 28.0.0 or higher
- Android Support Repository
- Gradle 2.2.1
@ -67,10 +67,18 @@ systemProp.socksProxyPort=9150
```
sdk.dir=/path/to/android-studio/sdk
```
1a. For building with a local router development build:
cd ../i2p.i2p
installer/resources/maven-dev-release.sh x // x is the build number, e.g. 6
cd back here
edit gradle.properties, add the build number x to I2P_PROPERTIES=0.9.xx-x
2. `gradle assembleDebug`
3. The APK will be placed in `i2p.android.base/app/build/outputs/apk`.
3. The APK files will be placed in `i2p.android.base/app/build/outputs/apk` subdirectories.
4. Install debug build on phone in USB debugging mode
adb install app/build/outputs/apk/free/debug/app-free-debug.apk
### Building with Android Studio

View File

@ -1,25 +1,128 @@
# Release Process
1. Check out a clean copy of i2p.i2p at the correct release version.
2. Edit `routerjars/local.properties` to use the clean i2p.i2p copy.
3. Pull the latest translations with `tx pull -a` and commit them. (If you don't have the `tx` command, do `pip install transifex-client` )
4. Ensure that `signing.properties` contains the details of the release key.
5. Edit `gradle.properties` to bump the I2P version.
6. Edit `app/build.gradle` to bump the Android version number.
7. If the helper has changed since the last release, edit
`lib/helper/gradle.properties` to bump the version.
8. `./gradlew clean assembleRelease`
9. `./gradlew :lib:client:uploadArchives`
10. If the helper version was changed: `./gradlew :lib:helper:uploadArchives`
11. Check on Sonatype that everything worked, and close/release.
12. Update local fdroidserver repo
13. `cp app/build/outputs/apk/free/release/app-free-release.apk path/to/fdroid/repo/I2P-VERSION.apk`
14. Update `path/to/fdroid/metadata/net.i2p.android.txt`
15. `fdroid update`
16. Push to download server and put in place.
17. Check F-Droid repo works, and app works.
18. `mtn ci gradle.properties lib/helper/gradle.properties app/build.gradle`
19. Push free and donate builds to Google Play.
20. Tag the new release. Example `mtn tag h: android-0.9.36`
Note to all future maintainers: We have 4 channels that need to be updated in order to have a successful
Android release. Many of these channels are updated at different rates, and at times you must wait on a
third-party service to complete it's tasks before you may continue. When completing an Android release,
keep in mind that you must update 1) Maven 2) Google Play 3) f-droid.i2p.io and 4) F-Droid main
repository.
At the time of this revision, 2020/09/13, the main Android maintainer is idk. idk updates Maven, Google
Play, and f-droid.i2p.io, and nextl00p handles working with the F-Droid project to provide an I2P release
in their main repository.
NOTE: The docker container built by the Dockerfile in this repostory ensures that the Pre-requisites and
Dependencies are properly met by obtaining them from the Debian package in `oldoldstable` and pre-configuring
the override.properties that is used in the Docker container.
## Tag Freezes and Translations
1-2 weeks before the software is released, I2P Desktop will have a "Tag Freeze" which is the deadline for
translations to be checked in. **When** that time comes, someone who has Transifex privileges should use
the command: `tx push -s -R I2P.android` to push any and all changed string resources to transifex for
translation.
**>> Beginning of Docker-enabled Steps <<**
## Prerequirements
0. Update the changelog!
1. Ensure you have the deprecated maven ant tasks. ( https://maven.apache.org/ant-tasks/download.cgi )
2. It should exist at `~/.ant/lib/maven-ant-tasks-2.1.3.jar`
3. Ensure you have hamcrest-integration, hamcrest-library, hamcrest-core in the hamcrest.home directory.
4. Ensure junit 4.12 at least in junit.home, ensure the jar file is named `junit4.jar`.
5. Ensure you have the Mockito framework and accompanying documentation in your $JAVA_HOME
6. Ensure to have updated the changelog with the changes done.
7. Ensure that you are configured to build i2p.i2p with Java 8. On Debian it is easiest to set with
`update-java-alternatives --set java-1.8.0-openjdk-amd64` and picking Java 8. **TODO:** add instructions for non-Debian-based
systems.
8. Ensure that you have a Java 1.7 bootclasspath available. (See **Maven Central** step 2A.)
## Get all the dependencies ready
### Maven Central
1. Check out a clean copy of i2p.i2p at the correct release version. (Make a clean checkout)
2. Build the maven packages via `ant mavenCentral` where you end up with mavencentral-*.jar files in the
current directory.
2. **A)** I2P for Android requires a Java 1.7 bootclasspath, but the servlet jar requires Java 8. So, to do the builds:
- First set `javac.compilerargs=-bootclasspath /path/to/java/7/rt.jar:/path/to/java/7/jce.jar` in override.properties
- Build with `ant mavenCentral`
**>> End of Docker-enabled Steps for Maven <<**
3. Login to http://oss.sonatype.org for uploading the mavencentral-*.jar bundles.
4. In nexus, choose "Staging Upload" and upload all of the files with upload mode set to "Artifacts with POM".
When uploading the files to nexus, you *must* upload the pom.xml files, and all of their artifacts. For each
component, you will need to upload a *.jar, a *.jar.asc, a *sources.jar, a *sources.jar.asc, a javadoc.jar,
and a javadoc.jar.asc, and a pom.xml and a pom.xml.asc from the pkg-mavencentral directory during the "Upload
Artifacts with POM" operation. You will need to do this once for each component you upload to Nexus.
5. Under "Staging Repositories" ensure all where uploaded correctly, select them all and press "Release"
in the toolbar.
#### Example override.properties:
javac.version=1.7
javac.target=1.7
javac.source=1.8
javac.compilerargs=-bootclasspath /home/user/StudioProjects/java7bootclasspath/rt.jar:/home/user/StudioProjects/java7bootclasspath/jce.jar
javac.compilerargs7=-bootclasspath /home/user/StudioProjects/java7bootclasspath/rt.jar:/home/user/StudioProjects/java7bootclasspath/jce.jar
build.built-by=name
### Android Common Build
Using Docker: in order to use Docker to generate a new Android apk for release, you will
need to run the build twice, once for the mavenCentral jars, and once for the actual Android
app. After doing the Maven release, follow these steps in the i2p.android.base repository, and re-run
the `docker run` step described in `DOCKER.md`
1. Edit `routerjars/local.properties` to use the clean i2p.i2p copy.
2. Pull the latest translations with `tx pull -a -f` and commit them. (If you don't have the `tx` command,
do `pip install transifex-client` )
- If there are any new translations, `mtn add` them, and add them to `app/src/main/res/values/arrays.xml`
(two places, alphabetical order please)
3. Ensure that `signing.properties` contains the details of the release key. If you are using Docker, see
`DOCKER.md` to perform this step for Docker builds by editing `etc/docker.signing.properties` instead.
4. Edit `gradle.properties` to bump the I2P version.
5. Edit `app/build.gradle` to bump the Android version number.
6. Edit `CHANGELOG` to add the release and date.
7. If the helper has changed since the last release, edit
`lib/helper/gradle.properties` to bump the version.
8. `./gradlew clean assembleRelease`
### Libraries
1. `./gradlew :lib:client:uploadArchives`
2. If the helper version was changed and should be released: `./gradlew :lib:helper:uploadArchives`
3. Check on Sonatype that everything worked, and close/release.
## Release Packages
### F-Droid Guide
This guide is for f-droid.i2p.io, not for F-Droid's main repository. The repository keystore **and** the
config.py used to generate the repository are required to complete this process successfully.
1. Ensure you have the release keys, the keyfile must be placed at `~/.local/share/fdroidserver/keystore.jks`
2. If it's the first time, or you have reinstalled anything, ensure `path/to/fdroid/config.py` has correct
information.
3. Assuming you already have ran `./gradlew clean assembleRelease` from a earlier step, continue.
4. `cp app/build/outputs/apk/free/release/app-free-release.apk path/to/fdroid/repo/I2P-VERSION.apk`
5. Update `path/to/fdroid/metadata/net.i2p.android.txt` (The versions at the bottom of the file)
6. Run `fdroid update` from inside the fdroid path (install fdroid command via `pip install fdroidserver`)
7. Zip/tar the local fdroid repo and archive. `rm fdroid.tgz && tar czf fdroid.tgz archive/ repo/` from the
fdroid directory.
8. Push to download server and put in place. (via SSH for example, `scp fdroid.tgz download.i2p2.de:~/`)
9. On the server run `bin-fd/update-fdroid` and `sudo bin-fd/update-app i2p 0.9.40` (This ensures we use the
exact same apk file for the download page as in fdroid and gplay)
10. Check F-Droid repo works, and app works.
### Google Play and finishing up
1. Verify which files that are changed via `mtn ls cha`. It shouldn't be much more than those bellow this
line and possible translations (`mtn ls unk`).
2. Commit your release changes, `mtn ci gradle.properties lib/helper/gradle.properties app/build.gradle`
3. Push free and donate builds to Google Play via https://play.google.com/apps/publish/
4. Tag the new release. Example `mtn tag h: android-0.9.36`
5. Push the monotone changes. Make sure that they are there at the next git sync.
6. Update download page (version and hash, including F-Droid)

View File

@ -1,11 +1,16 @@
apply plugin: 'com.android.application'
repositories {
mavenLocal()
mavenCentral()
jcenter()
}
android {
compileSdkVersion Integer.parseInt(project.ANDROID_BUILD_SDK_VERSION as String)
compileSdkVersion Integer.parseInt(project.ANDROID_BUILD_TARGET_SDK_VERSION as String)
defaultConfig {
versionCode 4745247
versionName "$I2P_VERSION"
minSdkVersion 14
versionCode 4745283
versionName "$I2P_ANDROID_VERSION"
minSdkVersion 21
targetSdkVersion Integer.parseInt(project.ANDROID_BUILD_TARGET_SDK_VERSION as String)
// For Espresso
@ -27,15 +32,19 @@ android {
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_7
targetCompatibility JavaVersion.VERSION_1_7
coreLibraryDesugaringEnabled true
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
lintOptions {
abortOnError false
checkReleaseBuilds false
disable 'MissingDefaultResource'
}
packagingOptions {
exclude 'LICENSE.txt'
resources {
excludes += ['LICENSE.txt']
}
}
flavorDimensions 'tier'
productFlavors {
@ -52,7 +61,6 @@ android {
applicationId 'net.i2p.android.router'
}
}
buildToolsVersion '28.0.3'
}
dependencies {
@ -73,14 +81,21 @@ dependencies {
implementation 'com.inkapplications.viewpageindicator:library:2.4.4'
implementation 'com.pnikosis:materialish-progress:1.7'
implementation "net.i2p:router:$I2P_VERSION"
implementation "net.i2p:i2p:$I2P_VERSION"
implementation "net.i2p.client:mstreaming:$I2P_VERSION"
implementation "net.i2p.client:streaming:$I2P_VERSION"
implementation 'net.i2p.android.ext:floatingactionbutton:1.10.1'
implementation 'org.sufficientlysecure:html-textview:3.1'
// Testing-only dependencies
androidTestImplementation('com.android.support.test.espresso:espresso-core:2.2.2') {
androidTestImplementation('com.android.support.test.espresso:espresso-core:3.0.2') {
exclude group: 'com.android.support', module: 'support-annotations'
}
}
dependencies {
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.5'
}
project.ext.i2pbase = "../i2p.i2p"
def Properties props = new Properties()
def propFile = new File(project(':routerjars').projectDir, 'local.properties')
@ -107,7 +122,7 @@ task copyI2PResources(type: Copy) {
outputs.upToDateWhen { false }
into 'src/main/res'
into('drawable') {
from file(i2pbase + '/installer/resources/themes/console/images/i2plogo.png')
from file(i2pbase + '/apps/routerconsole/jsp/themes/console/images/i2plogo.png')
}
into('raw') {
from(i2pbase + '/installer/resources/blocklist.txt') { rename { 'blocklist_txt' } }
@ -170,15 +185,15 @@ task copyI2PAssets(type: Copy) {
outputs.upToDateWhen { false }
into 'src/main/assets/themes/console'
into('images') {
from file(i2pbase + '/installer/resources/themes/console/images/i2plogo.png')
from file(i2pbase + '/installer/resources/themes/console/images/inbound.png')
from file(i2pbase + '/installer/resources/themes/console/images/outbound.png')
from file(i2pbase + '/apps/routerconsole/jsp/themes/console/images/i2plogo.png')
from file(i2pbase + '/apps/routerconsole/jsp/themes/console/images/inbound.png')
from file(i2pbase + '/apps/routerconsole/jsp/themes/console/images/outbound.png')
}
into('light') {
from file(i2pbase + '/installer/resources/themes/console/light/console.css')
from file(i2pbase + '/apps/routerconsole/jsp/themes/console/light/console.css')
}
into('light/images') {
from file(i2pbase + '/installer/resources/themes/console/light/images/header.png')
from file(i2pbase + '/apps/routerconsole/jsp/themes/console/light/images/header.png')
}
}

View File

@ -11,6 +11,14 @@
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<!-- following two are for UPnP -->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" />
<!-- required for reliable core functionality on Android, see:
https://geti2p.net/en/docs/applications/embedding
heading: "Design for and Encourage Long Uptimes"
-->
<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />
<application
android:icon="@drawable/ic_launcher_itoopie"
@ -19,6 +27,8 @@
<service
android:name=".service.RouterService"
android:icon="@drawable/ic_launcher_itoopie"
android:enabled="true"
android:exported="true"
android:label="@string/app_name">
<intent-filter>
<action android:name="net.i2p.android.router.service.IRouterState" />
@ -27,17 +37,28 @@
<provider
android:name=".provider.CacheProvider"
android:authorities="${applicationId}.provider" />
<receiver android:name=".receiver.OnBootReceiver">
<receiver
android:name=".receiver.OnBootReceiver"
android:exported="false">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
<receiver
android:name=".receiver.RemoteStartReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="net.i2p.android.router.receiver.START_I2P" />
</intent-filter>
</receiver>
<activity
android:name="net.i2p.android.I2PActivity"
android:icon="@drawable/ic_launcher_itoopie"
android:label="@string/app_name"
android:launchMode="singleTop">
android:launchMode="singleTop"
android:exported="true">
<!-- Console filters -->
<intent-filter>
<action android:name="android.intent.action.MAIN" />
@ -47,6 +68,10 @@
<action android:name="net.i2p.android.router.START_I2P" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
<intent-filter>
<action android:name="net.i2p.android.router.service.APPROVE_SAM" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
<!-- Addressbook filters -->
<intent-filter>
@ -97,6 +122,7 @@
<activity
android:name=".web.WebActivity"
android:configChanges="orientation|keyboardHidden"
android:exported="true"
android:label="I2P Web Browser">
<!-- Disabled, this browser is not very secure
Temporarily enabled until an alternative browser is ready -->

View File

@ -31,6 +31,13 @@ public class CustomViewPager extends ViewPager {
@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
// See Nov. 20, 2013 comment at:
// https://github.com/JakeWharton/ViewPagerIndicator/pull/257
// Our ticket #2488
// prevent NPE if fake dragging and touching ViewPager
if(isFakeDragging()) return false;
return mEnabled && mFixedPage < 0 && super.onInterceptTouchEvent(event);
}

View File

@ -125,7 +125,8 @@ public class MaterialSeekBarController implements SeekBar.OnSeekBarChangeListene
}
private void setPaddedValue(int value) {
mSeekBarValue.setText(String.format("%0" + mMaxDigits +"d", value));
//mSeekBarValue.setText(String.format("%0" + mMaxDigits +"d", value));
mSeekBarValue.setText(String.format("%" + mMaxDigits +"d", value));
}

View File

@ -19,6 +19,7 @@ import net.i2p.android.router.MainFragment;
import net.i2p.android.router.R;
import net.i2p.android.router.SettingsActivity;
import net.i2p.android.router.addressbook.AddressbookContainer;
import net.i2p.android.router.service.AndroidSAMSecureSession;
import net.i2p.android.router.service.RouterService;
import net.i2p.android.router.service.State;
import net.i2p.android.router.util.Connectivity;
@ -134,6 +135,7 @@ public class I2PActivity extends I2PActivityBase implements
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
setIntent(intent);
handleIntents();
}
@ -143,17 +145,29 @@ public class I2PActivity extends I2PActivityBase implements
Intent intent = getIntent();
String action = intent.getAction();
Util.d("handleIntent: intent=" + intent.toString());
if (action == null)
return;
Util.d("handleIntent: action=" + action);
Bundle extra = intent.getExtras();
if (extra != null)
Util.d("handleIntent extra=" + extra.toString());
switch (action) {
case "net.i2p.android.router.START_I2P":
if (mViewPager.getCurrentItem() != 0)
mViewPager.setCurrentItem(0, false);
autoStart();
break;
case "net.i2p.android.router.service.APPROVE_SAM":
Util.w("Affirmed SAM Connection");
String ID = extra.getString("ID");
Util.d("SAM ID was: " + ID);
AndroidSAMSecureSession.affirmResult(ID);
break;
case Intent.ACTION_PICK:
mViewPager.setFixedPage(2, R.string.select_an_address);
break;

View File

@ -35,6 +35,7 @@ class InitActivities {
public InitActivities(Context c) {
ctx = c;
myDir = Util.getFileDir(c);
Util.i("My app directory is "+myDir);
_ourVersion = Util.getOurVersion(c);
}
@ -59,90 +60,89 @@ class InitActivities {
}
void initialize() {
Util.i("Initializing the I2P resources");
if (checkNewVersion()) {
List<Properties> lProps = Util.getPropertiesFromPreferences(ctx);
Properties props = lProps.get(0);
List<Properties> lProps = Util.getPropertiesFromPreferences(ctx);
Properties props = lProps.get(0);
props.setProperty("i2p.dir.temp", myDir + "/tmp");
props.setProperty("i2p.dir.pid", myDir + "/tmp");
// Time disabled in default router.config
// But lots of time problems on Android, not all carriers support NITZ
// and there was no NTP before 3.0. Tablets should be fine?
// Phones in airplane mode with wifi enabled still a problem.
// Deactivated phones in airplane mode definitely won't have correct time.
if (Build.VERSION.SDK_INT < 11) // Honeycomb 3.0
props.setProperty("time.disabled", "false");
mergeResourceToFile(R.raw.router_config, "router.config", props);
mergeResourceToFile(R.raw.logger_config, "logger.config", lProps.get(1));
// This is not needed for now, i2ptunnel.config only contains tunnel
// settings, which can now be configured manually. We don't want to
// overwrite the user's tunnels.
//mergeResourceToFile(R.raw.i2ptunnel_config, "i2ptunnel.config", null);
copyResourceToFileIfAbsent(R.raw.i2ptunnel_config, "i2ptunnel.config");
// FIXME this is a memory hog to merge this way
mergeResourceToFile(R.raw.hosts_txt, "hosts.txt", null);
mergeResourceToFile(R.raw.more_hosts_txt, "hosts.txt", null);
copyResourceToFile(R.raw.blocklist_txt, "blocklist.txt");
props.setProperty("i2p.dir.temp", myDir + "/tmp");
props.setProperty("i2p.dir.pid", myDir + "/tmp");
// Time disabled in default router.config
// But lots of time problems on Android, not all carriers support NITZ
// and there was no NTP before 3.0. Tablets should be fine?
// Phones in airplane mode with wifi enabled still a problem.
// Deactivated phones in airplane mode definitely won't have correct time.
if (Build.VERSION.SDK_INT < 11) // Honeycomb 3.0
props.setProperty("time.disabled", "false");
mergeResourceToFile(R.raw.router_config, "router.config", props);
mergeResourceToFile(R.raw.logger_config, "logger.config", lProps.get(1));
// This is not needed for now, i2ptunnel.config only contains tunnel
// settings, which can now be configured manually. We don't want to
// overwrite the user's tunnels.
//mergeResourceToFile(R.raw.i2ptunnel_config, "i2ptunnel.config", null);
copyResourceToFileIfAbsent(R.raw.i2ptunnel_config, "i2ptunnel.config");
// FIXME this is a memory hog to merge this way
mergeResourceToFile(R.raw.hosts_txt, "hosts.txt", null);
mergeResourceToFile(R.raw.more_hosts_txt, "hosts.txt", null);
copyResourceToFile(R.raw.blocklist_txt, "blocklist.txt");
File abDir = new File(myDir, "addressbook");
abDir.mkdir();
copyResourceToFile(R.raw.subscriptions_txt, "addressbook/subscriptions.txt");
mergeResourceToFile(R.raw.addressbook_config_txt, "addressbook/config.txt", null);
File abDir = new File(myDir, "addressbook");
abDir.mkdir();
copyResourceToFileIfAbsent(R.raw.subscriptions_txt, "addressbook/subscriptions.txt");
mergeResourceToFile(R.raw.addressbook_config_txt, "addressbook/config.txt", null);
File docsDir = new File(myDir, "docs");
docsDir.mkdir();
copyResourceToFile(R.raw.ahelper_conflict_header_ht, "docs/ahelper-conflict-header.ht");
copyResourceToFile(R.raw.ahelper_new_header_ht, "docs/ahelper-new-header.ht");
copyResourceToFile(R.raw.ahelper_notfound_header_ht, "docs/ahelper-notfound-header.ht");
copyResourceToFile(R.raw.auth_header_ht, "docs/auth-header.ht");
copyResourceToFile(R.raw.baduri_header_ht, "docs/baduri-header.ht");
copyResourceToFile(R.raw.denied_header_ht, "docs/denied-header.ht");
copyResourceToFile(R.raw.dnf_header_ht, "docs/dnf-header.ht");
copyResourceToFile(R.raw.dnfb_header_ht, "docs/dnfb-header.ht");
copyResourceToFile(R.raw.dnfh_header_ht, "docs/dnfh-header.ht");
copyResourceToFile(R.raw.dnfp_header_ht, "docs/dnfp-header.ht");
copyResourceToFile(R.raw.enc_header_ht, "docs/enc-header.ht");
copyResourceToFile(R.raw.encp_header_ht, "docs/encp-header.ht");
copyResourceToFile(R.raw.localhost_header_ht, "docs/localhost-header.ht");
copyResourceToFile(R.raw.nols_header_ht, "docs/nols-header.ht");
copyResourceToFile(R.raw.nolsp_header_ht, "docs/nolsp-header.ht");
copyResourceToFile(R.raw.noproxy_header_ht, "docs/noproxy-header.ht");
copyResourceToFile(R.raw.protocol_header_ht, "docs/protocol-header.ht");
copyResourceToFile(R.raw.reset_header_ht, "docs/reset-header.ht");
copyResourceToFile(R.raw.resetp_header_ht, "docs/resetp-header.ht");
File docsDir = new File(myDir, "docs");
docsDir.mkdir();
/*copyResourceToFile(R.raw.ahelper_conflict_header_ht, "docs/ahelper-conflict-header.ht");
copyResourceToFile(R.raw.ahelper_new_header_ht, "docs/ahelper-new-header.ht");
copyResourceToFile(R.raw.ahelper_notfound_header_ht, "docs/ahelper-notfound-header.ht");
copyResourceToFile(R.raw.auth_header_ht, "docs/auth-header.ht");
copyResourceToFile(R.raw.baduri_header_ht, "docs/baduri-header.ht");
copyResourceToFile(R.raw.denied_header_ht, "docs/denied-header.ht");
copyResourceToFile(R.raw.dnf_header_ht, "docs/dnf-header.ht");
copyResourceToFile(R.raw.dnfb_header_ht, "docs/dnfb-header.ht");
copyResourceToFile(R.raw.dnfh_header_ht, "docs/dnfh-header.ht");
copyResourceToFile(R.raw.dnfp_header_ht, "docs/dnfp-header.ht");
copyResourceToFile(R.raw.enc_header_ht, "docs/enc-header.ht");
copyResourceToFile(R.raw.encp_header_ht, "docs/encp-header.ht");
copyResourceToFile(R.raw.localhost_header_ht, "docs/localhost-header.ht");
copyResourceToFile(R.raw.nols_header_ht, "docs/nols-header.ht");
copyResourceToFile(R.raw.nolsp_header_ht, "docs/nolsp-header.ht");
copyResourceToFile(R.raw.noproxy_header_ht, "docs/noproxy-header.ht");
copyResourceToFile(R.raw.protocol_header_ht, "docs/protocol-header.ht");
copyResourceToFile(R.raw.reset_header_ht, "docs/reset-header.ht");
copyResourceToFile(R.raw.resetp_header_ht, "docs/resetp-header.ht");*/
File cssDir = new File(docsDir, "themes/console/light");
cssDir.mkdirs();
//copyResourceToFile(R.raw.console_css, "docs/themes/console/light/console.css");
//copyResourceToFile(R.raw.android_css, "docs/themes/console/light/android.css");
File cssDir = new File(docsDir, "themes/console/light");
cssDir.mkdirs();
//copyResourceToFile(R.raw.console_css, "docs/themes/console/light/console.css");
//copyResourceToFile(R.raw.android_css, "docs/themes/console/light/android.css");
File imgDir = new File(docsDir, "themes/console/images");
imgDir.mkdir();
copyResourceToFile(R.drawable.i2plogo, "docs/themes/console/images/i2plogo.png");
copyResourceToFile(R.drawable.itoopie_sm, "docs/themes/console/images/itoopie_sm.png");
//copyResourceToFile(R.drawable.outbound, "docs/themes/console/images/outbound.png");
//copyResourceToFile(R.drawable.inbound, "docs/themes/console/images/inbound.png");
File imgDir = new File(docsDir, "themes/console/images");
imgDir.mkdir();
copyResourceToFile(R.drawable.i2plogo, "docs/themes/console/images/i2plogo.png");
copyResourceToFile(R.drawable.itoopie_sm, "docs/themes/console/images/itoopie_sm.png");
//copyResourceToFile(R.drawable.outbound, "docs/themes/console/images/outbound.png");
//copyResourceToFile(R.drawable.inbound, "docs/themes/console/images/inbound.png");
File img2Dir = new File(cssDir, "images");
img2Dir.mkdir();
//copyResourceToFile(R.drawable.header, "docs/themes/console/light/images/header.png");
File img2Dir = new File(cssDir, "images");
img2Dir.mkdir();
//copyResourceToFile(R.drawable.header, "docs/themes/console/light/images/header.png");
File certDir = new File(myDir, "certificates");
certDir.mkdir();
File certificates = new File(myDir, "certificates");
File[] allcertificates = certificates.listFiles();
if ( allcertificates != null) {
for (File f : allcertificates) {
Util.d("Deleting old certificate file/dir " + f);
FileUtil.rmdir(f, false);
}
File certDir = new File(myDir, "certificates");
certDir.mkdir();
File certificates = new File(myDir, "certificates");
File[] allCertificates = certificates.listFiles();
if ( allCertificates != null) {
for (File f : allCertificates) {
Util.d("Deleting old certificate file/dir " + f);
FileUtil.rmdir(f, false);
}
unzipResourceToDir(R.raw.certificates_zip, "certificates");
//File netDBDir = new File(myDir, "netDB");
//netDBDir.mkdir();
//unzipResourceToDir(R.raw.netdb_zip, "netDB");
}
File netDBDir = new File(myDir, "netDB");
netDBDir.mkdir();
//unzipResourceToDir(R.raw.netdb_zip, "netDB");
unzipResourceToDir(R.raw.certificates_zip, "certificates");
// Set up the locations so settings can find them
System.setProperty("i2p.dir.base", myDir);
@ -178,10 +178,16 @@ class InitActivities {
out.write(buf, 0, read);
} catch (IOException ioe) {
Util.e("copyResourceToFile" + "IOE: ", ioe);
} catch (Resources.NotFoundException nfe) {
Util.e("copyResourceToFile" + "NFE: ", nfe);
} finally {
if (in != null) try { in.close(); } catch (IOException ioe) {}
if (out != null) try { out.close(); } catch (IOException ioe) {}
if (in != null) try { in.close(); } catch (IOException ioe) {
Util.e("copyResourceToFile" + "IOE in.close(): ", ioe);
}
if (out != null) try { out.close(); } catch (IOException ioe) {
Util.e("copyResourceToFile" + "IOE out.close(): ", ioe);
}
}
}
/**
@ -192,7 +198,7 @@ class InitActivities {
FileOutputStream out = null;
ZipInputStream zis = null;
Util.d("Creating files in '" + myDir + "/" + folder + "/' from resource");
Util.i("Creating files in '" + myDir + "/" + folder + "/' from resource");
try {
// Context methods
in = ctx.getResources().openRawResource(resID);
@ -200,6 +206,7 @@ class InitActivities {
ZipEntry ze;
while ((ze = zis.getNextEntry()) != null) {
out = null;
Util.i("unzipping "+ze);
try {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
@ -209,26 +216,51 @@ class InitActivities {
}
String name = ze.getName();
File f = new File(myDir + "/" + folder +"/" + name);
if (ze.isDirectory()) {
Util.d("Creating directory " + myDir + "/" + folder +"/" + name + " from resource");
String canonicalPath = f.getCanonicalPath().replace("/user/0/", "/data/");
// account for canonical path differences when using .aab bundles
if (!canonicalPath.startsWith(myDir.replace("/user/0/", "/data/"))) {
// If these don't match, there's a path-traversal possibility.
// So ignore it.
Util.e("Path mismatch bug " + canonicalPath.toString() + " " + myDir.toString());
} else if (ze.isDirectory()) {
Util.i("Creating directory " + myDir + "/" + folder +"/" + name + " from resource");
f.mkdir();
} else {
Util.d("Creating file " + myDir + "/" + folder +"/" + name + " from resource");
Util.i("Creating file " + myDir + "/" + folder +"/" + name + " from resource");
//create all the leading directories
File newFile = new File(myDir+"/"+folder+"/"+name);
newFile.getParentFile().mkdirs();
byte[] bytes = baos.toByteArray();
out = new FileOutputStream(f);
out.write(bytes);
}
} catch (IOException ioe) {
Util.e("unzipResourceToDir" + "IOE: ", ioe);
} finally {
if (out != null) { try { out.close(); } catch (IOException ioe) {} out = null; }
if (out != null) {
try {
out.close();
} catch (IOException ioe) {
Util.e("unzipResourceToDir" + "IOE: interior out.close ", ioe);
}
out = null;
}
}
}
} catch (IOException ioe) {
Util.e("unzipResourceToDir" + "IOE: ", ioe);
} catch (Resources.NotFoundException nfe) {
Util.e("unzipResourceToDir" + "NFE: ", nfe);
} finally {
if (in != null) try { in.close(); } catch (IOException ioe) {}
if (out != null) try { out.close(); } catch (IOException ioe) {}
if (zis != null) try { zis.close(); } catch (IOException ioe) {}
if (in != null) try { in.close(); } catch (IOException ioe) {
Util.e("unzipResourceToDir" + "IOE: in.close() ", ioe);
}
if (out != null) try { out.close(); } catch (IOException ioe) {
Util.e("unzipResourceToDir" + "IOE: out.close() ", ioe);
}
if (zis != null) try { zis.close(); } catch (IOException ioe) {
Util.e("unzipResourceToDir" + "IOE: zis.close() ", ioe);
}
}
}
@ -252,18 +284,31 @@ class InitActivities {
private boolean checkNewVersion() {
Properties props = new Properties();
Util.i("Checking for a new install/version");
InputStream fin = null;
try {
fin = ctx.openFileInput(CONFIG_FILE);
DataHelper.loadProps(props, fin);
} catch (IOException ioe) {
Util.d("Looks like a new install");
Util.i("Looks like a new install");
} finally {
if (fin != null) try { fin.close(); } catch (IOException ioe) {}
if (fin != null) {
try {
Util.i("fin was not null "+CONFIG_FILE);
fin.close();
} catch (IOException ioe) {
Util.i("Error loading config:", ioe);
}
}else {
Util.i("fin was null");
}
}
String oldVersion = props.getProperty(PROP_INSTALLED_VERSION);
Util.i("Old version is:"+oldVersion);
boolean newInstall = oldVersion == null;
if (newInstall)
return true;
boolean newVersion = !_ourVersion.equals(oldVersion);
if (newVersion) {

View File

@ -5,6 +5,8 @@ import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Locale;
import net.i2p.I2PAppContext;
import net.i2p.data.DataHelper;
import net.i2p.util.EepGet;
@ -83,7 +85,7 @@ public class EepGetFetcher implements EepGet.StatusListener {
int semi = rv.indexOf(";");
if (semi > 0)
rv = rv.substring(0, semi);
return rv.toLowerCase();
return rv.toLowerCase(Locale.US);
}
/**

View File

@ -1,22 +1,41 @@
package net.i2p.android.apps;
import static net.i2p.app.ClientAppState.INITIALIZED;
import static net.i2p.app.ClientAppState.RUNNING;
import static net.i2p.app.ClientAppState.STARTING;
import static net.i2p.app.ClientAppState.STOPPED;
import static net.i2p.app.ClientAppState.STOPPING;
import static net.i2p.app.ClientAppState.UNINITIALIZED;
import static net.i2p.update.UpdateType.BLOCKLIST;
import android.content.Context;
import net.i2p.android.router.NewsActivity;
import net.i2p.android.router.R;
import net.i2p.android.router.util.Notifications;
import net.i2p.app.ClientApp;
import net.i2p.app.ClientAppManager;
import net.i2p.app.ClientAppState;
import net.i2p.crypto.SU3File;
import net.i2p.data.Base64;
import net.i2p.data.DataHelper;
import net.i2p.data.Hash;
import net.i2p.router.Banlist;
import net.i2p.router.Blocklist;
import net.i2p.router.RouterContext;
import net.i2p.router.news.BlocklistEntries;
import net.i2p.router.news.NewsEntry;
import net.i2p.router.news.NewsMetadata;
import net.i2p.router.news.NewsXMLParser;
import net.i2p.util.Addresses;
import net.i2p.util.EepGet;
import net.i2p.util.FileUtil;
import net.i2p.util.I2PAppThread;
import net.i2p.util.Log;
import net.i2p.util.ReusableGZIPInputStream;
import net.i2p.util.SecureFileOutputStream;
import net.i2p.util.RFC822Date;
import net.i2p.util.ReusableGZIPInputStream;
import net.i2p.util.SecureFile;
import net.i2p.util.SecureFileOutputStream;
import java.io.BufferedWriter;
import java.io.File;
@ -27,13 +46,17 @@ import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
/**
* From router console, simplified since we don't deal with router versions
* or updates.
*
* As of 0.9.41, implements ClientApp to hang us off the ClientAppManager,
* so we can remove the static reference.
*/
public class NewsFetcher implements Runnable, EepGet.StatusListener {
public class NewsFetcher implements Runnable, EepGet.StatusListener, ClientApp {
private final Context mCtx;
private final RouterContext _context;
private final Notifications _notif;
@ -44,20 +67,22 @@ public class NewsFetcher implements Runnable, EepGet.StatusListener {
private boolean _invalidated;
private File _newsFile;
private File _tempFile;
private static NewsFetcher _instance;
private volatile boolean _isRunning = true;
private Thread _thread;
private final ClientAppManager _mgr;
private volatile ClientAppState _state = UNINITIALIZED;
public static final String APP_NAME = "NewsFetcher";
public static /*final */ NewsFetcher getInstance() {
return _instance;
}
static final String PROP_BLOCKLIST_TIME = "router.blocklistVersion";
private static final String BLOCKLIST_DIR = "docs/feed/blocklist";
private static final String BLOCKLIST_FILE = "blocklist.txt";
/**
* As of 0.9.41, returns a new one every time. Only call once.
*/
public static /* final */ synchronized NewsFetcher getInstance(
Context context, RouterContext ctx, Notifications notif) {
if (_instance != null)
return _instance;
_instance = new NewsFetcher(context, ctx, notif);
return _instance;
return new NewsFetcher(context, ctx, notif);
}
private static final String NEWS_DIR = "docs";
@ -71,18 +96,17 @@ public class NewsFetcher implements Runnable, EepGet.StatusListener {
*
* @since 0.7.14 not configurable
*/
private static final String BACKUP_NEWS_URL_SU3 = "http://avviiexdngd32ccoy4kuckvc3mkf53ycvzbz6vz75vzhv4tbpk5a.b32.i2p/news.su3";
private static final String BACKUP_NEWS_URL_SU3 = "http://dn3tvalnjz432qkqsvpfdqrwpqkw3ye4n4i2uyfr4jexvo3sp5ka.b32.i2p/news/news.su3";
private static final String PROP_LAST_CHECKED = "router.newsLastChecked";
private static final String PROP_REFRESH_FREQUENCY = "router.newsRefreshFrequency";
private static final String DEFAULT_REFRESH_FREQUENCY = 24 * 60 * 60 * 1000 + "";
private static final String PROP_NEWS_URL = "router.newsURL";
public static final String DEFAULT_NEWS_URL_SU3 = "http://echelon.i2p/news/news.su3";
public static final String DEFAULT_NEWS_URL_SU3 = "http://tc73n4kivdroccekirco7rhgxdg5f3cjvbaapabupeyzrqwv5guq.b32.i2p/news.su3";
private NewsFetcher(Context context, RouterContext ctx, Notifications notif) {
mCtx = context;
_context = ctx;
_notif = notif;
_context.addShutdownTask(new Shutdown());
_log = ctx.logManager().getLog(NewsFetcher.class);
try {
String last = ctx.getProperty(PROP_LAST_CHECKED);
@ -96,6 +120,9 @@ public class NewsFetcher implements Runnable, EepGet.StatusListener {
_newsFile = new File(newsDir, NEWS_FILE);
_tempFile = new File(_context.getTempDir(), TEMP_NEWS_FILE);
updateLastFetched();
_mgr = ctx.clientAppManager();
changeState(INITIALIZED);
_mgr.register(this);
}
private void updateLastFetched() {
@ -134,7 +161,17 @@ public class NewsFetcher implements Runnable, EepGet.StatusListener {
private static final long RUN_DELAY = 30 * 60 * 1000;
public void run() {
_thread = Thread.currentThread();
changeState(RUNNING);
try {
run2();
} finally {
_mgr.unregister(this);
changeState(STOPPED);
}
}
private void run2() {
try {
Thread.sleep(INITIAL_DELAY);
} catch (InterruptedException ie) {
@ -276,14 +313,6 @@ public class NewsFetcher implements Runnable, EepGet.StatusListener {
public void attempting(String url) {
}
private class Shutdown implements Runnable {
public void run() {
_isRunning = false;
if (_thread != null)
_thread.interrupt();
}
}
//
// SU3 handlers
//
@ -323,6 +352,11 @@ public class NewsFetcher implements Runnable, EepGet.StatusListener {
xml.delete();
NewsMetadata data = parser.getMetadata();
List<NewsEntry> entries = parser.getEntries();
BlocklistEntries ble = parser.getBlocklistEntries();
if (ble != null && ble.isVerified())
processBlocklistEntries(ble);
else
_log.info("No blocklist entries found in news feed");
String sudVersion = su3.getVersionString();
String signingKeyName = su3.getSignerString();
File to3 = new File(_context.getTempDir(), "tmp3-" + _context.random().nextInt() + ".xml");
@ -333,6 +367,104 @@ public class NewsFetcher implements Runnable, EepGet.StatusListener {
}
}
/**
* Process blocklist entries
*
* @since 0.9.57
*/
private void processBlocklistEntries(BlocklistEntries ble) {
long oldTime = _context.getProperty(PROP_BLOCKLIST_TIME, 0L);
if (ble.updated <= oldTime) {
if (_log.shouldWarn())
_log.warn("Not processing blocklist " + DataHelper.formatDate(ble.updated) +
", already have " + DataHelper.formatDate(oldTime));
return;
}
Blocklist bl = _context.blocklist();
Banlist ban = _context.banlist();
String reason = "Blocklist feed " + DataHelper.formatDate(ble.updated);
int banned = 0;
for (Iterator<String> iter = ble.entries.iterator(); iter.hasNext(); ) {
String s = iter.next();
if (s.length() == 44) {
byte[] b = Base64.decode(s);
if (b == null || b.length != Hash.HASH_LENGTH) {
iter.remove();
continue;
}
Hash h = Hash.create(b);
if (!ban.isBanlistedForever(h)) {
ban.banlistRouterForever(h, reason);
_context.commSystem().forceDisconnect(h);
}
} else {
byte[] ip = Addresses.getIP(s);
if (ip == null) {
iter.remove();
continue;
}
if (!bl.isBlocklisted(ip))
bl.add(ip);
}
if (++banned >= BlocklistEntries.MAX_ENTRIES) {
// prevent somebody from destroying the whole network
break;
}
}
for (String s : ble.removes) {
if (s.length() == 44) {
byte[] b = Base64.decode(s);
if (b == null || b.length != Hash.HASH_LENGTH)
continue;
Hash h = Hash.create(b);
if (ban.isBanlistedForever(h))
ban.unbanlistRouter(h);
} else {
byte[] ip = Addresses.getIP(s);
if (ip == null)
continue;
if (bl.isBlocklisted(ip))
bl.remove(ip);
}
}
// Save the blocks. We do not save the unblocks.
File f = new SecureFile(_context.getConfigDir(), BLOCKLIST_DIR);
f.mkdirs();
f = new File(f, BLOCKLIST_FILE);
boolean fail = false;
BufferedWriter out = null;
try {
out = new BufferedWriter(new OutputStreamWriter(new SecureFileOutputStream(f), "UTF-8"));
out.write("# ");
out.write(ble.supdated);
out.newLine();
banned = 0;
for (String s : ble.entries) {
s = s.replace(':', ';'); // IPv6
out.write(reason);
out.write(':');
out.write(s);
out.newLine();
if (++banned >= BlocklistEntries.MAX_ENTRIES)
break;
}
} catch (IOException ioe) {
_log.error("Error writing blocklist", ioe);
fail = true;
} finally {
if (out != null) try {
out.close();
} catch (IOException ioe) {}
}
if (!fail) {
f.setLastModified(ble.updated);
String upd = Long.toString(ble.updated);
_context.router().saveConfig(PROP_BLOCKLIST_TIME, upd);
}
if (_log.shouldWarn())
_log.warn("Processed " + ble.entries.size() + " blocks and " + ble.removes.size() + " unblocks from news feed");
}
/**
* Gunzip the file
*
@ -417,4 +549,69 @@ public class NewsFetcher implements Runnable, EepGet.StatusListener {
} catch (IOException ioe) {}
}
}
////// begin ClientApp interface
/**
* @since 0.9.41
*/
public synchronized void startup() {
changeState(STARTING);
_thread = new I2PAppThread(this, "NewsFetcher", true);
_thread.start();
}
/**
* @since 0.9.41
*/
public synchronized void shutdown(String[] args) {
if (_state != RUNNING)
return;
changeState(STOPPING);
_isRunning = false;
if (_thread != null)
_thread.interrupt();
changeState(STOPPED);
}
/**
* @since 0.9.41
*/
public ClientAppState getState() {
return _state;
}
/**
* @since 0.9.41
*/
public String getName() {
return APP_NAME;
}
/**
* @since 0.9.41
*/
public String getDisplayName() {
return APP_NAME;
}
////// end ClientApp interface
////// begin ClientApp helpers
/**
* @since 0.9.41
*/
private void changeState(ClientAppState state) {
changeState(state, null);
}
/**
* @since 0.9.41
*/
private synchronized void changeState(ClientAppState state, Exception e) {
_state = state;
_mgr.notify(this, state, null, e);
}
////// end ClientApp helpers
}

View File

@ -1,19 +1,26 @@
package net.i2p.android.help;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.support.annotation.NonNull;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
public class Browser implements Comparable<Browser> {
public final String packageName;
public final CharSequence label;
public final Drawable icon;
public final boolean isInstalled;
public final boolean isKnown;
public final boolean isSupported;
public final boolean isRecommended;
private boolean isInstalled;
/**
* A browser that we don't know about.
*
@ -80,4 +87,23 @@ public class Browser implements Comparable<Browser> {
} else
return 2;
}
public boolean isInstalled(Context context){
if (isInstalled) {
return true;
}
// Find all installed browsers that listen for ".i2p"
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("http://stats.i2p"));
final PackageManager pm = context.getPackageManager();
List<ResolveInfo> installedBrowsers = pm.queryIntentActivities(intent, 0);
for (ResolveInfo browser : installedBrowsers) {
if (browser.activityInfo.packageName.equals(packageName)) {
isInstalled = true;
break;
}
}
return isInstalled;
}
}

View File

@ -73,11 +73,15 @@ public class BrowserAdapter extends RecyclerView.Adapter<BrowserAdapter.ViewHold
holder.mLabel.setText(browser.label);
if (browser.isKnown) {
if (browser.isRecommended && browser.isInstalled) {
if (browser.isRecommended && browser.isInstalled(mCtx)) {
holder.mStatus.setImageDrawable(
mCtx.getResources().getDrawable(R.drawable.ic_stars_white_24dp));
holder.mStatus.setVisibility(View.VISIBLE);
} else if (browser.isSupported && !browser.isInstalled) {
} else if (browser.isSupported && browser.isInstalled(mCtx)) {
holder.mStatus.setImageDrawable(
mCtx.getResources().getDrawable(R.drawable.ic_stars_white_24dp));
holder.mStatus.setVisibility(View.INVISIBLE);
} else if (browser.isSupported && !browser.isInstalled(mCtx)) {
holder.mStatus.setImageDrawable(
mCtx.getResources().getDrawable(R.drawable.ic_shop_white_24dp));
holder.mStatus.setOnClickListener(new View.OnClickListener() {
@ -94,7 +98,7 @@ public class BrowserAdapter extends RecyclerView.Adapter<BrowserAdapter.ViewHold
}
});
holder.mStatus.setVisibility(View.VISIBLE);
} else if (!browser.isSupported) {
} else if (browser.isInstalled(mCtx) && !browser.isSupported) {
// Make the icon gray-scale to show it is unsupported
ColorMatrix matrix = new ColorMatrix();
matrix.setSaturation(0);

View File

@ -26,6 +26,8 @@ import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Set;
import java.util.List;
import java.util.Map;
@ -100,8 +102,28 @@ public class BrowserListFragment extends Fragment implements
getContext().getResources().getStringArray(R.array.supported_browsers));
supportedLabels = Arrays.asList(
getContext().getResources().getStringArray(R.array.supported_browser_labels));
unsupported = Arrays.asList(
context.getResources().getStringArray(R.array.unsupported_browsers));
unsupported = allBrowsers(context);//Arrays.asList(
//context.getResources().getStringArray(R.array.unsupported_browsers));
}
public List<String> allBrowsers(Context context){
//try {
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("http://www.google.com"));
List<ResolveInfo> browserList;
PackageManager pm = context.getPackageManager();
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
// gets all
browserList = pm.queryIntentActivities(intent, PackageManager.MATCH_ALL);
} else {
browserList = pm.queryIntentActivities(intent, 0);
}
//}catch()
List<String> finalResult = new ArrayList<String>();
for (ResolveInfo ri : browserList){
finalResult.add(ri.resolvePackageName);
}
return finalResult;
}
@Override
@ -121,8 +143,9 @@ public class BrowserListFragment extends Fragment implements
intent.setData(Uri.parse("http://stats.i2p"));
final PackageManager pm = getContext().getPackageManager();
List<ResolveInfo> installedBrowsers = pm.queryIntentActivities(intent, 0);
Set<ResolveInfo> installedBrowsers = new HashSet<>(pm.queryIntentActivities(intent, 0));
// Compare installed browsers to supported browsers
for (ResolveInfo browser : installedBrowsers) {
if (recommended.contains(browser.activityInfo.packageName)) {
browsers.add(new Browser(pm, browser, true, true));

View File

@ -81,7 +81,7 @@ public class TunnelDetailFragment extends Fragment {
try {
mGroup = TunnelControllerGroup.getInstance();
error = mGroup == null ? getResources().getString(R.string.i2ptunnel_not_initialized) : null;
controllers = mGroup.getControllers();
controllers = mGroup == null ? null : mGroup.getControllers();
} catch (IllegalArgumentException iae) {
mGroup = null;
controllers = null;

View File

@ -20,6 +20,10 @@ import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutionException;
/**
* A single tunnel.
* Stored by the TunnelEntryAdapter.
*/
public class TunnelEntry {
public static final int RUNNING = 1;
public static final int STARTING = 2;
@ -31,6 +35,7 @@ public class TunnelEntry {
private final int mId;
/**
* @param tcg non-null
* @return the new TunnelEntry, or null if there was an error.
*/
public static TunnelEntry createNewTunnel(

View File

@ -5,22 +5,31 @@ import android.os.Build;
import android.support.v4.util.Pair;
import android.support.v4.view.ViewCompat;
import android.support.v7.widget.RecyclerView;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import net.i2p.android.router.R;
import net.i2p.android.util.FragmentUtils;
import java.util.ArrayList;
import java.util.List;
/**
* Contains the List of TunnelEntries.
* There's two of these, one for client tunnels and
* one for server tunnels.
* Created by the TunnelListFragment.
*/
public class TunnelEntryAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private Context mCtx;
private boolean mClientTunnels;
private TunnelListFragment.OnTunnelSelectedListener mListener;
private FragmentUtils.TwoPaneProvider mTwoPane;
private final Context mCtx;
private final boolean mClientTunnels;
private final TunnelListFragment.OnTunnelSelectedListener mListener;
private final FragmentUtils.TwoPaneProvider mTwoPane;
private List<TunnelEntry> mTunnels;
/**
* The current activated item position. Only used on tablets.
@ -34,10 +43,10 @@ public class TunnelEntryAdapter extends RecyclerView.Adapter<RecyclerView.ViewHo
}
public static class TunnelViewHolder extends RecyclerView.ViewHolder {
public ImageView status;
public TextView name;
public TextView description;
public TextView interfacePort;
public final ImageView status;
public final TextView name;
public final TextView description;
public final TextView interfacePort;
public TunnelViewHolder(View itemView) {
super(itemView);
@ -65,6 +74,8 @@ public class TunnelEntryAdapter extends RecyclerView.Adapter<RecyclerView.ViewHo
}
public void addTunnel(TunnelEntry tunnel) {
if (mTunnels == null)
mTunnels = new ArrayList<TunnelEntry>();
boolean wasEmpty = mTunnels.isEmpty();
mTunnels.add(tunnel);
if (wasEmpty) {
@ -120,13 +131,24 @@ public class TunnelEntryAdapter extends RecyclerView.Adapter<RecyclerView.ViewHo
}
}
private void setClipboard(Context context, String text) {
if(android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.HONEYCOMB) {
android.text.ClipboardManager clipboard = (android.text.ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE);
clipboard.setText(text);
} else {
android.content.ClipboardManager clipboard = (android.content.ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE);
android.content.ClipData clip = android.content.ClipData.newPlainText("Copied Text", text);
clipboard.setPrimaryClip(clip);
}
}
// Replace the contents of a view (invoked by the layout manager)
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) {
switch (holder.getItemViewType()) {
case R.string.router_not_running:
((TextView) holder.itemView).setText(
mCtx.getString(R.string.router_not_running));
mCtx.getString(R.string.i2ptunnel_not_initialized));
break;
case R.layout.listitem_empty:
@ -155,6 +177,16 @@ public class TunnelEntryAdapter extends RecyclerView.Adapter<RecyclerView.ViewHo
tvh.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// TODO
// lint priority 8/10
// lint: Do not treat position as fixed; only use immediately and call holder.getAdapterPosition() to look it up later
// javadocs: Note that unlike ListView, RecyclerView will not call this method again
// if the position of the item changes in the data set unless the item itself is invalidated
// or the new position cannot be determined.
// For this reason, you should only use the position parameter while acquiring
// the related data item inside this method and should not keep a copy of it.
// If you need the position of an item later on (e.g. in a click listener),
// use RecyclerView.ViewHolder.getAdapterPosition() which will have the updated adapter position.
int oldPosition = mActivatedPosition;
mActivatedPosition = position;
notifyItemChanged(oldPosition);
@ -164,6 +196,19 @@ public class TunnelEntryAdapter extends RecyclerView.Adapter<RecyclerView.ViewHo
ViewCompat.getTransitionName(tvh.status));
Pair<View, String>[] pairs = new Pair[]{ statusPair};
mListener.onTunnelSelected(tunnel.getId(), pairs);
view.invalidate();
}
});
tvh.itemView.setOnLongClickListener(new View.OnLongClickListener() {
//@Override
public boolean onLongClick(View view) {
setClipboard(mCtx, tunnel.getDestHashBase32());
Toast clipboardMessage = Toast.makeText(mCtx, R.string.copied_base32_system_notification_title, Toast. LENGTH_LONG);
clipboardMessage.setGravity(Gravity.TOP, 0, 0); //optional
clipboardMessage.show();
view.invalidate();
return true;
}
});
break;
@ -171,6 +216,7 @@ public class TunnelEntryAdapter extends RecyclerView.Adapter<RecyclerView.ViewHo
default:
break;
}
}
// Return the size of the dataset (invoked by the layout manager)

View File

@ -13,10 +13,10 @@ import java.util.ArrayList;
import java.util.List;
public class TunnelEntryLoader extends AsyncTaskLoader<List<TunnelEntry>> {
private TunnelControllerGroup mGroup;
private boolean mClientTunnels;
private final TunnelControllerGroup mGroup;
private final boolean mClientTunnels;
private List<TunnelEntry> mData;
private Handler mHandler;
private final Handler mHandler;
private TunnelControllerMonitor mMonitor;
public TunnelEntryLoader(Context context, TunnelControllerGroup tcg, boolean clientTunnels) {

View File

@ -31,6 +31,12 @@ import net.i2p.i2ptunnel.TunnelControllerGroup;
import java.util.ArrayList;
import java.util.List;
/**
* The list of tunnels.
* There's two of these, one for client tunnels and
* one for server tunnels.
* Creates the TunnelEntryAdapter.
*/
public class TunnelListFragment extends Fragment implements
LoaderManager.LoaderCallbacks<List<TunnelEntry>> {
public static final String SHOW_CLIENT_TUNNELS = "show_client_tunnels";

View File

@ -33,6 +33,11 @@ import net.i2p.router.RouterContext;
import java.util.List;
/**
* The top level Fragment of the tunnels tabs.
* Creates client and server TunnelListFragments,
* the options menu, and the new tunnel wizard button.
*/
public class TunnelsContainer extends Fragment implements
FragmentUtils.TwoPaneProvider,
TunnelListFragment.OnTunnelSelectedListener,
@ -65,12 +70,11 @@ public class TunnelsContainer extends Fragment implements
setHasOptionsMenu(true);
}
private boolean showActions() {
private static boolean showActions() {
RouterContext rCtx = Util.getRouterContext();
TunnelControllerGroup tcg = TunnelControllerGroup.getInstance();
return rCtx != null && tcg != null &&
(tcg.getState() == ClientAppState.STARTING ||
tcg.getState() == ClientAppState.RUNNING);
tcg.getState() == ClientAppState.RUNNING;
}
@Override
@ -211,8 +215,17 @@ public class TunnelsContainer extends Fragment implements
if (requestCode == TUNNEL_WIZARD_REQUEST) {
if (resultCode == Activity.RESULT_OK) {
Bundle tunnelData = data.getExtras().getBundle(TUNNEL_WIZARD_DATA);
// ticket #2483
if (tunnelData == null)
return;
// TODO fetch earlier
TunnelControllerGroup tcg = TunnelControllerGroup.getInstance();
if (tcg == null) {
// router went away
Toast.makeText(getActivity().getApplicationContext(),
R.string.router_not_running, Toast.LENGTH_LONG).show();
return;
}
TunnelConfig cfg = TunnelUtil.createConfigFromWizard(getActivity(), tcg, tunnelData);
TunnelEntry tunnel = TunnelEntry.createNewTunnel(getActivity(), tcg, cfg);

View File

@ -16,6 +16,9 @@ import net.i2p.i2ptunnel.TunnelControllerGroup;
import net.i2p.i2ptunnel.ui.TunnelConfig;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.CancellationException;
import java.util.concurrent.TimeoutException;
import java.util.concurrent.TimeUnit;
public abstract class BaseTunnelPreferenceFragment extends CustomPreferenceFragment {
protected static final String ARG_TUNNEL_ID = "tunnelId";
@ -88,11 +91,15 @@ public abstract class BaseTunnelPreferenceFragment extends CustomPreferenceFragm
// TODO: There used to be a possible ANR here, because the underlying I2P code
// checks if the session is open as part of updating its config. We may need to save
// completely asynchronously (and ensure we do actually save before the app closes).
task.execute().get();
task.execute().get(2, TimeUnit.SECONDS);
} catch (InterruptedException e) {
Util.e("Interrupted while saving tunnel config", e);
} catch (ExecutionException e) {
Util.e("Error while saving tunnel config", e);
} catch (CancellationException e) {
Util.e("Cancelled while saving tunnel config", e);
} catch (TimeoutException e) {
Util.e("Timed out while savomg tunnel config", e);
}
}
}

View File

@ -15,9 +15,9 @@ import java.util.List;
* InetAddress.getByName(), which will trigger a NetworkOnMainThreadException otherwise.
*/
public class SaveTunnelTask extends AsyncTask<Void, Void, List<String>> {
TunnelControllerGroup mGroup;
int mTunnelId;
TunnelConfig mCfg;
final TunnelControllerGroup mGroup;
final int mTunnelId;
final TunnelConfig mCfg;
public SaveTunnelTask(TunnelControllerGroup group, int tunnelId, TunnelConfig cfg) {
mGroup = group;

View File

@ -11,7 +11,7 @@ package net.i2p.android.i2ptunnel.util;
* tunnel properties always exist.
*/
public abstract class TunnelLogic {
protected String mType;
protected final String mType;
public TunnelLogic(String type) {
mType = type;

View File

@ -7,6 +7,7 @@ import android.os.Bundle;
import net.i2p.I2PAppContext;
import net.i2p.android.router.R;
import net.i2p.android.router.util.Util;
import net.i2p.android.wizard.model.Page;
import net.i2p.i2ptunnel.TunnelController;
import net.i2p.i2ptunnel.TunnelControllerGroup;
@ -99,6 +100,7 @@ public class TunnelUtil extends GeneralHelper {
public static void writeTunnelToPreferences(Context ctx, TunnelControllerGroup tcg, int tunnel) {
new TunnelUtil(tcg).writeTunnelToPreferences(ctx, tunnel);
}
public void writeTunnelToPreferences(Context ctx, int tunnel) {
Resources res = ctx.getResources();
@ -122,9 +124,9 @@ public class TunnelUtil extends GeneralHelper {
}
class TunnelToPreferences extends TunnelLogic {
SharedPreferences.Editor ed;
Resources res;
int tunnel;
final SharedPreferences.Editor ed;
final Resources res;
final int tunnel;
public TunnelToPreferences(SharedPreferences.Editor ed, Resources res, int tunnel, String type) {
super(type);
@ -328,6 +330,7 @@ public class TunnelUtil extends GeneralHelper {
public static TunnelConfig createConfigFromPreferences(Context ctx, TunnelControllerGroup tcg, int tunnel) {
return new TunnelUtil(tcg).createConfigFromPreferences(ctx, tunnel);
}
public TunnelConfig createConfigFromPreferences(Context ctx, int tunnel) {
Resources res = ctx.getResources();
@ -348,11 +351,11 @@ public class TunnelUtil extends GeneralHelper {
}
class TunnelConfigFromPreferences extends TunnelLogic {
TunnelConfig cfg;
SharedPreferences prefs;
Resources res;
TunnelControllerGroup tcg;
int tunnel;
final TunnelConfig cfg;
final SharedPreferences prefs;
final Resources res;
final TunnelControllerGroup tcg;
final int tunnel;
public TunnelConfigFromPreferences(TunnelConfig cfg, SharedPreferences prefs, Resources res,
TunnelControllerGroup tcg, int tunnel, String type) {
@ -566,10 +569,17 @@ public class TunnelUtil extends GeneralHelper {
}
}
/**
* @param data non-null
*/
public static TunnelConfig createConfigFromWizard(
Context ctx, TunnelControllerGroup tcg, Bundle data) {
return new TunnelUtil(tcg).createConfigFromWizard(ctx, data);
}
/**
* @param data non-null
*/
public TunnelConfig createConfigFromWizard(Context ctx, Bundle data) {
// Get the Bundle keys
Resources res = ctx.getResources();
@ -580,21 +590,26 @@ public class TunnelUtil extends GeneralHelper {
// Update the TunnelConfig from the tunnel wizard settings
String kClientServer = res.getString(R.string.i2ptunnel_wizard_k_client_server);
String kType = res.getString(R.string.i2ptunnel_wizard_k_type);
String clientServer = data.getBundle(kClientServer).getString(Page.SIMPLE_DATA_KEY);
String typeName = data.getBundle(clientServer + ":" + kType).getString(Page.SIMPLE_DATA_KEY);
String type = getTypeFromName(typeName, ctx);
cfg.setType(type);
try {
String clientServer = data.getBundle(kClientServer).getString(Page.SIMPLE_DATA_KEY);
String typeName = data.getBundle(clientServer + ":" + kType).getString(Page.SIMPLE_DATA_KEY);
String type = getTypeFromName(typeName, ctx);
cfg.setType(type);
new TunnelConfigFromWizard(cfg, data, res, _group, type).runLogic();
} catch (NullPointerException ex) {
Util.e("Exception while trying to create config from wizard: "+ex.getMessage());
}
new TunnelConfigFromWizard(cfg, data, res, _group, type).runLogic();
return cfg;
}
class TunnelConfigFromWizard extends TunnelLogic {
TunnelConfig cfg;
Bundle data;
Resources res;
TunnelControllerGroup tcg;
final TunnelConfig cfg;
final Bundle data;
final Resources res;
final TunnelControllerGroup tcg;
public TunnelConfigFromWizard(TunnelConfig cfg, Bundle data, Resources res,
TunnelControllerGroup tcg, String type) {

View File

@ -3,12 +3,11 @@ package net.i2p.android.preferences;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v7.preference.Preference;
import android.support.v7.preference.PreferenceFragmentCompat;
import net.i2p.android.router.R;
import net.i2p.android.router.SettingsActivity;
public class AdvancedPreferenceFragment extends PreferenceFragmentCompat {
public class AdvancedPreferenceFragment extends I2PreferenceFragment {
private static final String PREFERENCE_CATEGORY_TRANSPORTS = "preference_category_transports";
private static final String PREFERENCE_CATEGORY_EXPL_TUNNELS = "preference_category_expl_tunnels";

View File

@ -1,5 +1,6 @@
package net.i2p.android.preferences;
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.SharedPreferences;
import android.os.Bundle;
@ -30,6 +31,7 @@ public class TransportsPreferenceFragment extends I2PreferenceFragment {
((SettingsActivity) getActivity()).getSupportActionBar().setTitle(R.string.settings_label_transports);
}
@SuppressLint("ApplySharedPref")
private void loadProperties() {
Context context= getActivity();
RouterContext ctx = Util.getRouterContext();

View File

@ -20,7 +20,7 @@ public class IntListPreference extends ListPreference {
getPersistedInt(0);
} catch (ClassCastException e) {
// Fix for where this preference was previously stored in a ListPreference
getSharedPreferences().edit().remove(getKey()).commit();
getSharedPreferences().edit().remove(getKey()).apply();
}
}

View File

@ -12,6 +12,7 @@ import android.view.View;
import android.view.ViewGroup;
import net.i2p.android.ext.floatingactionbutton.FloatingActionsMenu;
import net.i2p.android.ext.floatingactionbutton.FloatingActionsMenu.OnFloatingActionsMenuUpdateListener;
import net.i2p.android.router.dialog.AboutDialog;
import net.i2p.android.router.dialog.TextResourceDialog;
import net.i2p.android.router.log.LogActivity;
@ -42,6 +43,17 @@ public class ConsoleContainer extends Fragment {
}
mConsoleMenu = (FloatingActionsMenu) v.findViewById(R.id.console_action_menu);
// update visibility based on router state
mConsoleMenu.setOnFloatingActionsMenuUpdateListener(new OnFloatingActionsMenuUpdateListener() {
public void onMenuExpanded() {
// this is called after the animation starts, sadly
setMenuVisibility();
}
public void onMenuCollapsed() {
// call it here too so the expand animation isn't glitchy as often
setMenuVisibility();
}
});
mConsoleMenu.findViewById(R.id.action_news).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {

View File

@ -1,17 +1,22 @@
package net.i2p.android.router;
import android.app.Activity;
import android.content.ActivityNotFoundException;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentFilter;
import android.graphics.Typeface;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.PowerManager;
import android.preference.PreferenceManager;
import android.provider.Settings;
import android.support.v4.content.LocalBroadcastManager;
import android.support.v7.app.AlertDialog;
import android.util.AndroidRuntimeException;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
@ -23,6 +28,7 @@ import android.widget.ScrollView;
import android.widget.TableLayout;
import android.widget.TableRow;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.ToggleButton;
import net.i2p.android.I2PActivityBase;
@ -69,6 +75,7 @@ public class MainFragment extends I2PFragmentBase {
private TextView vAdvStatusText;
private static final String PREF_CONFIGURE_BROWSER = "app.dialog.configureBrowser";
private static final String PREF_CONFIGURE_BATTERY = "app.dialog.configureBattery";
private static final String PREF_FIRST_START = "app.router.firstStart";
private static final String PREF_SHOW_STATS = "i2pandroid.main.showStats";
protected static final String PROP_NEW_INSTALL = "i2p.newInstall";
@ -320,7 +327,10 @@ public class MainFragment extends I2PFragmentBase {
}
}
public void updateState(State newState) {
/**
* Changes the logo based on the state.
*/
private void updateState(State newState) {
if (newState == State.INIT ||
newState == State.STOPPED ||
newState == State.MANUAL_STOPPED ||
@ -328,13 +338,13 @@ public class MainFragment extends I2PFragmentBase {
newState == State.NETWORK_STOPPED) {
mConsoleLights.setImageResource(R.drawable.routerlogo_0);
} else if (newState == State.STARTING ||
//newState == State.GRACEFUL_SHUTDOWN || // Don't change lights for graceful
newState == State.STOPPING ||
newState == State.MANUAL_STOPPING ||
newState == State.MANUAL_QUITTING ||
newState == State.NETWORK_STOPPING) {
mConsoleLights.setImageResource(R.drawable.routerlogo_1);
} else if (newState == State.RUNNING) {
} else if (newState == State.RUNNING ||
newState == State.GRACEFUL_SHUTDOWN) {
mConsoleLights.setImageResource(R.drawable.routerlogo_2);
} else if (newState == State.ACTIVE) {
mConsoleLights.setImageResource(R.drawable.routerlogo_3);
@ -375,9 +385,9 @@ public class MainFragment extends I2PFragmentBase {
String uptime = DataHelper.formatDuration(ctx.router().getUptime());
int active = ctx.commSystem().countActivePeers();
int known = Math.max(ctx.netDb().getKnownRouters() - 1, 0);
vUptime.setText("" + uptime);
vActive.setText("" + active);
vKnown.setText("" + known);
vUptime.setText(uptime);
vActive.setText(Integer.toString(active));
vKnown.setText(Integer.toString(known));
// Load running tunnels
loadDestinations(ctx);
@ -396,20 +406,21 @@ public class MainFragment extends I2PFragmentBase {
//ctx.commSystem().getReachabilityStatus();
String status =
"Exploratory Tunnels in/out: " + inEx + " / " + outEx
+ "\nClient Tunnels in/out: " + inCl + " / " + outCl;
getString(R.string.notification_status_expl, inEx, outEx) + '\n' +
getString(R.string.notification_status_client, inCl, outCl);
// Need to see if we have the participation option set to on.
// I thought there was a router method for that? I guess not! WHY NOT?
// It would be easier if we had a number to test status.
String participate = "\nParticipation: " + tunnelStatus + " (" + part + ")";
String participate = '\n' + getString(R.string.settings_label_hiddenMode) + ": " + tunnelStatus + " (" + part + ")";
String details =
"\nMemory: " + DataHelper.formatSize(Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory())
+ "B / " + DataHelper.formatSize(Runtime.getRuntime().maxMemory()) + 'B'
+ "\nJob Lag: " + jobLag
+ "\nMsg Delay: " + msgDelay;
'\n' + getString(R.string.stats_memory) + ": " +
DataHelper.formatSize(Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory()) +
"B / " + DataHelper.formatSize(Runtime.getRuntime().maxMemory()) + 'B' +
'\n' + getString(R.string.stats_lag) + ": " + jobLag +
'\n' + getString(R.string.stats_delay) + ": " + msgDelay;
_savedStatus = status + participate + details;
vAdvStatusText.setText(_savedStatus);
@ -437,6 +448,7 @@ public class MainFragment extends I2PFragmentBase {
// network but no router context
vStatusContainer.setVisibility(View.GONE);
getActivity().findViewById(R.id.console_usage_stats).setVisibility(View.INVISIBLE);
updateState(State.STOPPED);
/**
* **
* RouterService svc = _routerService; String status = "connected? "
@ -526,8 +538,8 @@ public class MainFragment extends I2PFragmentBase {
* compare translated nicknames - put "shared clients" first in the sort
*/
private class AlphaComparator implements Comparator<Destination> {
private String xsc;
private RouterContext _ctx;
private final String xsc;
private final RouterContext _ctx;
public AlphaComparator(RouterContext ctx) {
_ctx = ctx;
@ -578,16 +590,18 @@ public class MainFragment extends I2PFragmentBase {
);
if (language == null) {
AlertDialog.Builder b = new AlertDialog.Builder(getActivity());
// avoid ISE caused by fragment detachment ticket #2631
final String languages[] = getResources().getStringArray(R.array.languages);
b.setTitle(R.string.choose_language)
.setItems(R.array.language_names, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// Save the language choice
String language = getResources().getStringArray(R.array.languages)[which];
String language = languages[which];
PreferenceManager.getDefaultSharedPreferences(getActivity())
.edit()
.putString(getString(R.string.PREF_LANGUAGE), language)
.commit();
.apply();
// Close the dialog
dialog.dismiss();
// Broadcast the change to RouterService just in case the router is running
@ -614,16 +628,62 @@ public class MainFragment extends I2PFragmentBase {
ab.setPref(PREF_CONFIGURE_BROWSER, false);
Intent hi = new Intent(getActivity(), BrowserConfigActivity.class);
startActivity(hi);
checkDialog();
}
})
.setNegativeButton(R.string.no, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int i) {
dialog.cancel();
dialog.dismiss();
ab.setPref(PREF_CONFIGURE_BROWSER, false);
checkDialog();
}
})
.show();
} else if (ab.getPref(PREF_CONFIGURE_BATTERY, true)) {
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
// only for Marshmallow and newer versions
final Intent intent = new Intent();
final Context mContext = ab.getApplicationContext();
String packageName = mContext.getPackageName();
PowerManager pm = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE);
if (!pm.isIgnoringBatteryOptimizations(packageName)) {
AlertDialog.Builder b = new AlertDialog.Builder(getActivity());
b.setTitle(R.string.configure_no_doze_title);
b.setMessage(R.string.configure_no_doze);
b.setCancelable(false);
b.setPositiveButton(R.string.yes, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int i) {
String packageName = mContext.getPackageName();
ab.setPref(PREF_CONFIGURE_BATTERY, false);
dialog.dismiss();
// Simply do not re-attempt a battery optimization after the first time,
// even if an error occurs. http://trac.i2p2.i2p/ticket/2783
intent.setAction(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
intent.setData(Uri.parse("package:" + packageName));
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
try {
mContext.startActivity(intent);
} catch (ActivityNotFoundException activityNotFound) {
ab.setPref(PREF_CONFIGURE_BATTERY, false);
} catch (AndroidRuntimeException activityNotFound) {
ab.setPref(PREF_CONFIGURE_BATTERY, false);
}
}
});
b.setNegativeButton(R.string.no, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int i) {
dialog.cancel();
ab.setPref(PREF_CONFIGURE_BATTERY, false);
}
});
b.show();
}
} else {
ab.setPref(PREF_CONFIGURE_BATTERY, false);
}
}
/*VersionDialog dialog = new VersionDialog();
String oldVersion = ((I2PActivityBase) getActivity()).getPref(PREF_INSTALLED_VERSION, "??");

View File

@ -13,6 +13,7 @@ import android.widget.TextView;
import net.i2p.android.apps.NewsFetcher;
import net.i2p.android.router.util.Util;
import net.i2p.router.RouterContext;
import java.io.ByteArrayOutputStream;
import java.io.File;
@ -33,12 +34,16 @@ public class NewsFragment extends I2PFragmentBase {
@Override
public void onResume() {
super.onResume();
NewsFetcher nf = NewsFetcher.getInstance();
if (nf != null) {
// Always update the status
TextView tv = (TextView) getActivity().findViewById(R.id.news_status);
tv.setText(nf.status().replace("&nbsp;", " "));
tv.setVisibility(View.VISIBLE);
RouterContext ctx = getRouterContext();
if (ctx != null) {
NewsFetcher nf = (NewsFetcher) ctx.clientAppManager().getRegisteredApp(NewsFetcher.APP_NAME);
if (nf != null) {
// Always update the status
// This is the news last updated/checked text at the bottom
TextView tv = (TextView) getActivity().findViewById(R.id.news_status);
tv.setText(nf.status().replace("&nbsp;", " "));
tv.setVisibility(View.VISIBLE);
}
}
// Only update the content if we need to

View File

@ -4,7 +4,7 @@ import android.content.Context;
import android.content.res.Resources;
import net.i2p.android.router.R;
import net.i2p.android.wizard.model.AbstractWizardModel;
import net.i2p.android.wizard.model.I2PB64DestinationPage;
import net.i2p.android.wizard.model.I2PDestinationPage;
import net.i2p.android.wizard.model.PageList;
import net.i2p.android.wizard.model.SingleTextFieldPage;
@ -22,7 +22,7 @@ public class AddressbookAddWizardModel extends AbstractWizardModel {
.setDescription(res.getString(R.string.addressbook_add_wizard_desc_name))
.setRequired(true),
new I2PB64DestinationPage(this, res.getString(R.string.addressbook_add_wizard_k_destination))
new I2PDestinationPage(this, res.getString(R.string.i2ptunnel_wizard_k_dest))
.setDescription(res.getString(R.string.addressbook_add_wizard_desc_destination))
.setRequired(true)
);

View File

@ -25,16 +25,16 @@ public class AboutDialog extends DialogFragment {
View view = li.inflate(R.layout.fragment_dialog_about, null);
final String currentVersion = Util.getOurVersion(getActivity());
TextView tv = (TextView)view.findViewById(R.id.about_version);
TextView tv = (TextView) view.findViewById(R.id.about_version);
tv.setText(currentVersion);
tv = (TextView)view.findViewById(R.id.url_project);
tv = (TextView) view.findViewById(R.id.url_project);
Linkify.addLinks(tv, I2Patterns.I2P_WEB_URL, "http://");
tv = (TextView)view.findViewById(R.id.url_android_bugs);
tv = (TextView) view.findViewById(R.id.url_android_bugs);
Linkify.addLinks(tv, I2Patterns.I2P_WEB_URL, "http://");
tv = (TextView)view.findViewById(R.id.url_android_volunteer);
tv = (TextView) view.findViewById(R.id.url_android_volunteer);
Linkify.addLinks(tv, I2Patterns.I2P_WEB_URL, "http://");
tv = (TextView)view.findViewById(R.id.url_donate);
tv = (TextView) view.findViewById(R.id.url_gitlab);
Linkify.addLinks(tv, I2Patterns.I2P_WEB_URL, "http://");
AlertDialog.Builder b = new AlertDialog.Builder(getActivity());

View File

@ -154,6 +154,8 @@ public class NetDbDetailFragment extends I2PFragmentBase {
String val = (String)e.getValue();
addTableRow(table, DataHelper.stripHTML(key), DataHelper.stripHTML(val));
}
// spacer
addTableRow(table, "", "");
addresses.addView(table);
}
@ -230,9 +232,11 @@ public class NetDbDetailFragment extends I2PFragmentBase {
TextView tl1, tl2;
row = new TableRow(getActivity());
// left top right bottom
row.setPadding(10, 0, 0, 0);
tl1 = new TextView(getActivity());
tl1.setPadding(0, 0, 20, 0);
tl2 = new TextView(getActivity());
tl1.setText(key);

View File

@ -5,6 +5,7 @@ import android.support.v4.content.AsyncTaskLoader;
import net.i2p.android.router.util.Util;
import net.i2p.data.Destination;
import net.i2p.data.Hash;
import net.i2p.data.LeaseSet;
import net.i2p.data.router.RouterInfo;
import net.i2p.router.RouterContext;
@ -24,14 +25,27 @@ public class NetDbEntryLoader extends AsyncTaskLoader<List<NetDbEntry>> {
mRouters = routers;
}
/** put us on top */
private static class RouterInfoComparator implements Comparator<RouterInfo> {
private final Hash _us;
public RouterInfoComparator(Hash us) {
_us = us;
}
public int compare(RouterInfo l, RouterInfo r) {
return l.getIdentity().getHash().toBase64().compareTo(r.getIdentity().getHash().toBase64());
Hash lh = l.getIdentity().getHash();
Hash rh = r.getIdentity().getHash();
if (lh.equals(_us))
return -1;
if (rh.equals(_us))
return 1;
return lh.toBase64().compareTo(rh.toBase64());
}
}
private class LeaseSetComparator implements Comparator<LeaseSet> {
private RouterContext mRContext;
private final RouterContext mRContext;
public LeaseSetComparator(RouterContext rContext) {
super();
@ -53,9 +67,9 @@ public class NetDbEntryLoader extends AsyncTaskLoader<List<NetDbEntry>> {
public List<NetDbEntry> loadInBackground() {
List<NetDbEntry> ret = new ArrayList<>();
RouterContext routerContext = Util.getRouterContext();
if (routerContext != null && routerContext.netDb().isInitialized()) {
if (routerContext != null && routerContext.netDb().isInitialized() && routerContext.routerHash() != null) {
if (mRouters) {
Set<RouterInfo> routers = new TreeSet<>(new RouterInfoComparator());
Set<RouterInfo> routers = new TreeSet<>(new RouterInfoComparator(routerContext.routerHash()));
routers.addAll(routerContext.netDb().getRouters());
for (RouterInfo ri : routers) {
NetDbEntry entry = NetDbEntry.fromRouterInfo(routerContext, ri);

View File

@ -17,7 +17,7 @@ import java.util.Set;
import java.util.TreeSet;
public class NetDbStatsLoader extends AsyncTaskLoader<List<ObjectCounter<String>>> {
private RouterContext mRContext;
private final RouterContext mRContext;
private List<ObjectCounter<String>> mData;
public NetDbStatsLoader(Context context, RouterContext rContext) {
@ -95,7 +95,7 @@ public class NetDbStatsLoader extends AsyncTaskLoader<List<ObjectCounter<String>
int rv = 0;
for (RouterAddress addr : info.getAddresses()) {
String style = addr.getTransportStyle();
if (style.equals("NTCP")) {
if (style.equals("NTCP") || style.equals("NTCP2")) {
rv |= NTCP;
} else if (style.equals("SSU")) {
if (addr.getOption("iport0") != null)
@ -108,7 +108,12 @@ public class NetDbStatsLoader extends AsyncTaskLoader<List<ObjectCounter<String>
rv |= IPV6;
}
return getContext().getString(TNAMES[rv]);
int tname = TNAMES[rv];
// remap cases with no string to "Hidden or starting up"
// so we don't crash NotFoundException
if (tname == 0)
tname = TNAMES[0];
return getContext().getString(tname);
}
@Override

View File

@ -77,6 +77,7 @@ public class NetDbSummaryTableFragment extends Fragment {
titleRow.setPadding(10, 0, 0, 0);
tl1 = new TextView(getActivity());
tl1.setPadding(0, 0, 20, 0);
tl1.setTextSize(20);
tl2 = new TextView(getActivity());
tl2.setTextSize(20);
@ -108,6 +109,7 @@ public class NetDbSummaryTableFragment extends Fragment {
row.setPadding(10, 0, 0, 0);
tl1 = new TextView(getActivity());
tl1.setPadding(0, 0, 20, 0);
tl2 = new TextView(getActivity());
tl1.setText(name);

View File

@ -2,6 +2,7 @@ package net.i2p.android.router.provider;
import android.content.ContentProvider;
import android.content.ContentValues;
import android.content.Context;
import android.content.SharedPreferences;
import android.database.Cursor;
import android.net.Uri;
@ -18,6 +19,7 @@ import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import java.util.Map;
/**
@ -153,7 +155,7 @@ public class CacheProvider extends ContentProvider {
// first seg is empty since string starts with /
String nonce = segs.length > 1 ? segs[1] : null;
String scheme = segs.length > 2 ? segs[2] : null;
String host = segs.length > 3 ? segs[3].toLowerCase() : null;
String host = segs.length > 3 ? segs[3].toLowerCase(Locale.US) : null;
String realPath = segs.length > 4 ? segs[4] : "";
String query = uri.getEncodedQuery();
if (query == null) {
@ -230,10 +232,11 @@ public class CacheProvider extends ContentProvider {
}
private ParcelFileDescriptor eepFetch(Uri uri) throws FileNotFoundException {
AppCache cache = AppCache.getInstance(getContext());
Context ctx = getContext();
AppCache cache = AppCache.getInstance(ctx);
OutputStream out;
try {
out = cache.createCacheFile(uri);
out = cache.createCacheFile(ctx, uri);
} catch (IOException ioe) {
throw new FileNotFoundException(ioe.toString());
}
@ -244,7 +247,7 @@ public class CacheProvider extends ContentProvider {
File file = cache.getCacheFile(uri);
if (file.length() > 0) {
// this call will insert it back to us (don't set as current base)
Uri content = cache.addCacheFile(uri, false);
Uri content = cache.addCacheFile(ctx, uri, false);
return ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_READ_ONLY);
} else {
Util.d("CacheProvider Sucess but no data " + uri);
@ -252,7 +255,7 @@ public class CacheProvider extends ContentProvider {
} else {
Util.d("CacheProvider Eepget fail " + uri);
}
AppCache.getInstance().removeCacheFile(uri);
cache.removeCacheFile(ctx, uri);
throw new FileNotFoundException("eepget fail");
}
@ -319,7 +322,7 @@ public class CacheProvider extends ContentProvider {
for (String key : toDelete) {
edit.remove(key);
}
edit.commit();
edit.apply();
}
}
@ -355,11 +358,10 @@ public class CacheProvider extends ContentProvider {
return _sharedPrefs.getString(pref, null);
}
/** @return success */
private boolean setPref(String pref, String val) {
private void setPref(String pref, String val) {
SharedPreferences.Editor edit = _sharedPrefs.edit();
edit.putString(pref, val);
return edit.commit();
edit.apply();
}
/** @return success */

View File

@ -15,6 +15,11 @@ public class OnBootReceiver extends BroadcastReceiver implements I2PConstants {
@Override
public void onReceive(Context context, Intent intent) {
if (!Intent.ACTION_BOOT_COMPLETED.equals(intent.getAction())) {
Util.e("spoofed BOOT_COMPLETED");
return;
}
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
boolean startOnBoot = prefs.getBoolean(PREF_START_ON_BOOT, false);
@ -22,7 +27,11 @@ public class OnBootReceiver extends BroadcastReceiver implements I2PConstants {
Intent routerService = new Intent(context, RouterService.class);
// Ticket #2404
try {
context.startService(routerService);
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O){
context.startForegroundService(routerService);
} else {
context.startService(routerService);
}
} catch (IllegalStateException ex) {
Util.e("Error: ", ex);
}

View File

@ -0,0 +1,23 @@
package net.i2p.android.router.receiver;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;
import net.i2p.android.router.service.RouterService;
import net.i2p.android.router.util.Util;
public class RemoteStartReceiver extends BroadcastReceiver {
public void onReceive(Context context, Intent intent) {
if(Util.getRouterContext() == null){
Intent rsIntent = new Intent(context, RouterService.class);
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O){
context.startForegroundService(rsIntent);
} else {
context.startService(rsIntent);
}
Toast.makeText(context, "Starting I2P Router", Toast.LENGTH_SHORT).show();
}
}
}

View File

@ -0,0 +1,147 @@
package net.i2p.android.router.service;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import net.i2p.android.I2PActivity;
import net.i2p.android.I2PActivityBase;
import net.i2p.android.router.R;
import net.i2p.android.router.util.Notifications;
import net.i2p.android.router.util.Util;
import net.i2p.router.Router;
import net.i2p.router.RouterContext;
import net.i2p.sam.*;
import net.i2p.sam.SAMException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
/**
* Implements SAMSecureSessionInterface on Android platforms using a Toast
* as the interactive channel.
*
* @since 1.8.0
*/
public class AndroidSAMSecureSession extends AppCompatActivity implements SAMSecureSessionInterface {
private static final String URI_I2P_ANDROID = "net.i2p.android";
private final Context mCtx;
private final RouterService _routerService;
private final StatusBar _statusBar;
static private Map<String, Integer> results = new HashMap<>();
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
public static void affirmResult(String clientId) {
Util.d("Affirmed result for: " + clientId);
results.put(clientId, 1);
}
public AndroidSAMSecureSession(Context ctx, RouterService rCtx, StatusBar statusBar) {
mCtx = ctx;
_routerService = rCtx;
_statusBar = statusBar;
}
private void waitForResult(String clientId) {
for (int i=0;i<60;i++) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
Util.e("SAMSecureSession Error", e);
}
Integer result = results.get(clientId);
if (result == null)
continue;
if (result != -1)
break;
Util.d("Waiting on user to approve SAM connection for: "+clientId);
}
}
private boolean isResult(String clientId) {
waitForResult(clientId);
final Integer finResult = results.get(clientId);
if (finResult == null)
return false;
_routerService.updateStatus();
if (finResult == 0) {
Util.w("SAM connection cancelled by user request");
return false;
}
if (finResult == 1) {
Util.w("SAM connection allowed by user action");
return true;
}
Util.w("SAM connection denied by timeout.");
return false;
}
private boolean checkResult(String clientId) {
Intent intent = new Intent("net.i2p.android.router.service.APPROVE_SAM", null, mCtx, I2PActivity.class );
intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setPackage(URI_I2P_ANDROID);
Bundle bundle = new Bundle();
bundle.putBoolean("approveSAMConnection", true);
bundle.putString("ID", clientId);
intent.putExtras(bundle);
PendingIntent pendingIntent;
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.S) {
pendingIntent = PendingIntent.getActivity(
mCtx, 7656,
intent,
PendingIntent.FLAG_MUTABLE,
bundle);
} else {
pendingIntent = PendingIntent.getActivity(
mCtx, 7656,
intent,
PendingIntent.FLAG_UPDATE_CURRENT,
bundle);
}
String dlgText = mCtx.getString(R.string.settings_confirm_sam) + "\n";//""</br>";
dlgText += mCtx.getString(R.string.settings_confirm_sam_id) + clientId + "\n";//""</br>";
dlgText += mCtx.getString(R.string.settings_confirm_allow_sam) + "\n";//""</br>";
dlgText += mCtx.getString(R.string.settings_confirm_deny_sam) + "\n";//""</br>";
_statusBar.replaceIntent(StatusBar.ICON_ACTIVE, dlgText, pendingIntent);
return isResult(clientId);
}
@Override
public boolean approveOrDenySecureSession(Properties i2cpProps, Properties props) throws SAMException {
String ID = props.getProperty("USER");
if (ID == null)
ID = i2cpProps.getProperty("inbound.nickname");
if (ID == null)
ID = i2cpProps.getProperty("outbound.nickname");
if (ID == null)
ID = props.getProperty("ID");
if (ID == null) {
MessageDigest messageDigest = null;
try {
messageDigest = MessageDigest.getInstance("SHA-256");
} catch (NoSuchAlgorithmException e) {
ID = "No_ID_Present";
}
if (messageDigest != null) {
String combinedProps = i2cpProps.toString() + props.toString();
messageDigest.update(combinedProps.getBytes());
ID = messageDigest.digest().toString();
}else{
ID = "No_ID_Present";
}
}
return checkResult(ID);
}
}

View File

@ -1,20 +1,30 @@
package net.i2p.android.router.service;
import android.app.Notification;
import android.content.Context;
import net.i2p.BOB.BOB;
import net.i2p.I2PAppContext;
//import net.i2p.BOB.BOB;
import net.i2p.addressbook.DaemonThread;
import android.content.Intent;
import android.os.Looper;
import android.preference.PreferenceManager;
import net.i2p.android.apps.NewsFetcher;
import net.i2p.android.router.service.AndroidSAMSecureSession;
import net.i2p.android.router.util.Notifications;
import net.i2p.android.router.util.Util;
import net.i2p.i2ptunnel.TunnelControllerGroup;
import net.i2p.router.Job;
import net.i2p.router.JobImpl;
import net.i2p.router.Router;
import net.i2p.router.RouterContext;
import net.i2p.util.I2PAppThread;
import net.i2p.sam.SAMBridge;
import net.i2p.sam.SAMSecureSessionInterface;
import java.io.File;
import java.io.IOException;
import java.util.Properties;
/**
* Load the clients we want.
@ -22,7 +32,8 @@ import java.io.IOException;
* We can't use LoadClientAppsJob (reading in clients.config) directly
* because Class.forName() needs a PathClassLoader argument -
* http://doandroids.com/blogs/2010/6/10/android-classloader-dynamic-loading-of/
* ClassLoader cl = new PathClassLoader(_apkPath, ClassLoader.getSystemClassLoader());
* ClassLoader cl = new PathClassLoader(_apkPath,
* ClassLoader.getSystemClassLoader());
*
* We can't extend LoadClientAppsJob to specify a class loader,
* even if we use it only for Class.forName() and not for
@ -37,47 +48,70 @@ import java.io.IOException;
*/
class LoadClientsJob extends JobImpl {
private Context mCtx;
private Notifications _notif;
private final Context mCtx;
private final RouterService _routerService;
private final Notifications _notif;
private DaemonThread _addressbook;
private BOB _bob;
public SAMBridge SAM_BRIDGE;
private final StatusBar _statusBar;
// private BOB _bob;
/** this is the delay to load (and start) the clients. */
private static final long LOAD_DELAY = 90*1000;
private static final long LOAD_DELAY = 60 * 1000;
public LoadClientsJob(Context ctx, RouterContext rCtx, Notifications notif, StatusBar status) {
super(rCtx);
mCtx = ctx;
_routerService = null;
_notif = notif;
getTiming().setStartAfter(getContext().clock().now() + LOAD_DELAY);
_statusBar = status;
}
public LoadClientsJob(Context ctx, RouterContext rCtx, RouterService rSvc, Notifications notif, StatusBar status) {
super(rCtx);
mCtx = ctx;
_routerService = rSvc;
_notif = notif;
getTiming().setStartAfter(getContext().clock().now() + LOAD_DELAY);
_statusBar = status;
}
public LoadClientsJob(Context ctx, RouterContext rCtx, Notifications notif) {
super(rCtx);
mCtx = ctx;
_routerService = null;
_notif = notif;
getTiming().setStartAfter(getContext().clock().now() + LOAD_DELAY);
_statusBar = null;
}
public String getName() { return "Start Clients"; }
public String getName() {
return "Start Clients";
}
public void runJob() {
Job j = new RunI2PTunnel(getContext());
getContext().jobQueue().addJob(j);
Job jtunnel = new RunI2PTunnel(getContext());
getContext().jobQueue().addJob(jtunnel);
Thread t = new I2PAppThread(new StatSummarizer(), "StatSummarizer", true);
t.setPriority(Thread.NORM_PRIORITY - 1);
t.start();
NewsFetcher fetcher = NewsFetcher.getInstance(mCtx, getContext(), _notif);
t = new I2PAppThread(fetcher, "NewsFetcher", true);
t.start();
_addressbook = new DaemonThread(new String[] {"addressbook"});
_addressbook.setName("Addressbook");
_addressbook.setDaemon(true);
_addressbook.start();
// add other clients here
_bob = new BOB(I2PAppContext.getGlobalContext(), null, new String[0]);
try {
_bob.startup();
} catch (IOException ioe) {}
// _bob = new BOB(I2PAppContext.getGlobalContext(), null, new String[0]);
// try {
// _bob.startup();
// } catch (IOException ioe) {}
boolean useSAM = PreferenceManager.getDefaultSharedPreferences(mCtx).getBoolean("i2pandroid.client.SAM", true);
Util.i("SAM API " + useSAM);
if (useSAM) {
Job jsam = new RunI2PSAM(getContext());
getContext().jobQueue().addJob(jsam);
Util.i("SAM API started successfully" + useSAM);
} else {
Util.i("SAM API disabled, not starting " + useSAM);
}
getContext().addShutdownTask(new ClientShutdownHook());
}
@ -87,15 +121,35 @@ class LoadClientsJob extends JobImpl {
super(ctx);
}
public String getName() { return "Start I2P Tunnel"; }
public String getName() {
return "Start I2P Tunnel";
}
public void runJob() {
if (!getContext().router().isRunning()) {
if (getContext().router().isAlive()) {
requeue(1000);
} else {
Util.e("Router stopped before i2ptunnel could start");
}
return;
}
Util.d("Starting i2ptunnel");
TunnelControllerGroup tcg = TunnelControllerGroup.getInstance();
TunnelControllerGroup tcg = TunnelControllerGroup.getInstance(getContext());
try {
tcg.startup();
int sz = tcg.getControllers().size();
Util.d("i2ptunnel started " + sz + " clients");
// no use starting these until i2ptunnel starts
RouterContext ctx = getContext();
NewsFetcher fetcher = NewsFetcher.getInstance(mCtx, getContext(), _notif);
ctx.routerAppManager().addAndStart(fetcher, new String[0]);
_addressbook = new DaemonThread(new String[] { "addressbook" });
_addressbook.setName("Addressbook");
_addressbook.setDaemon(true);
_addressbook.start();
} catch (IllegalArgumentException iae) {
Util.e("i2ptunnel failed to start", iae);
}
@ -103,14 +157,62 @@ class LoadClientsJob extends JobImpl {
}
}
private class RunI2PSAM extends JobImpl {
public RunI2PSAM(RouterContext ctx) {
super(ctx);
}
public String getName() {
return "Start SAM API";
}
public void runJob() {
if (!getContext().router().isRunning()) {
if (getContext().router().isAlive()) {
requeue(1000);
} else {
Util.e("Router stopped before SAM API could start");
}
return;
}
Util.d("Starting SAM");
try {
Util.i("Starting the SAM API");
Looper.prepare();
AndroidSAMSecureSession _androidSecureSession = new AndroidSAMSecureSession(mCtx, _routerService, _statusBar);
SAMSecureSessionInterface _secureSession = _androidSecureSession;
SAM_BRIDGE = new SAMBridge("127.0.0.1",
7656,
false,
SAM_PROPERTIES(),
"sam.keys",
new File("sam_config"),
_secureSession);
SAM_BRIDGE.run();
} catch (IOException e) {
Util.e(e.toString());
e.printStackTrace();
}
}
public Properties SAM_PROPERTIES() throws IOException {
Util.i("Getting the default properties");
Properties sam_properties = new Properties();
return sam_properties;
}
}
private class ClientShutdownHook implements Runnable {
public void run() {
Util.d("client shutdown hook");
// i2ptunnel registers its own hook
// StatSummarizer registers its own hook
// NewsFetcher registers its own hook
if (_bob != null)
_bob.shutdown(null);
// if (_bob != null)
// _bob.shutdown(null);
if (SAM_BRIDGE != null)
SAM_BRIDGE.shutdown(null);
if (_addressbook != null)
_addressbook.halt();
}

View File

@ -6,6 +6,7 @@ import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.SharedPreferences;
import android.os.Build;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
@ -105,7 +106,7 @@ public class RouterService extends Service {
if(lastState == State.RUNNING || lastState == State.ACTIVE) {
Intent intent = new Intent(this, RouterService.class);
intent.putExtra(EXTRA_RESTART, true);
onStartCommand(intent, 12345, 67890);
onStartCommand(intent, START_FLAG_REDELIVERY | START_FLAG_RETRY, 67890);
} else if(lastState == State.MANUAL_QUITTING || lastState == State.GRACEFUL_SHUTDOWN) {
synchronized(_stateLock) {
setState(State.MANUAL_QUITTED);
@ -168,10 +169,18 @@ public class RouterService extends Service {
}
_handler.removeCallbacks(_updater);
_handler.postDelayed(_updater, 50);
// We need to *not* check if we're restarting on Android greater than Oreo due to
// changes in how notifications work and the use of NotificationChannels.
if(!restart) {
startForeground(1337, _statusBar.getNote());
} else {
if (Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
startForeground(1337, _statusBar.getNote());
}
}
//return START_STICKY;
return START_NOT_STICKY;
}
@ -214,6 +223,7 @@ public class RouterService extends Service {
// Launch the router!
// TODO Store this somewhere instead of relying on global context?
Router r = new Router();
r.setUPnPScannerCallback(new SSDPLocker(RouterService.this));
r.runRouter();
synchronized(_stateLock) {
if(_state != State.STARTING) {
@ -226,7 +236,7 @@ public class RouterService extends Service {
throw new IllegalStateException("Router has no context?");
}
_context.router().setKillVMOnEnd(false);
Job loadJob = new LoadClientsJob(RouterService.this, _context, _notif);
Job loadJob = new LoadClientsJob(RouterService.this, _context, RouterService.this, _notif, _statusBar);
_context.jobQueue().addJob(loadJob);
_context.addShutdownTask(new ShutdownHook());
_context.addFinalShutdownTask(new FinalShutdownHook());
@ -252,6 +262,16 @@ public class RouterService extends Service {
private String _currTitle;
private boolean _hadTunnels;
public void updateStatus() {
RouterContext ctx = _context;
if(ctx != null && (_state == State.RUNNING || _state == State.ACTIVE || _state == State.GRACEFUL_SHUTDOWN)) {
Router router = ctx.router();
if(router.isAlive()) {
updateStatus(ctx);
}
}
}
private void updateStatus(RouterContext ctx) {
int active = ctx.commSystem().countActivePeers();
int known = Math.max(ctx.netDb().getKnownRouters() - 1, 0);
@ -794,12 +814,12 @@ public class RouterService extends Service {
}
/**
* @return success
* Saves state in background thread
*/
private boolean saveState() {
private void saveState() {
SharedPreferences prefs = getSharedPreferences(SHARED_PREFS, 0);
SharedPreferences.Editor edit = prefs.edit();
edit.putString(LAST_STATE, _state.toString());
return edit.commit();
edit.apply();
}
}

View File

@ -0,0 +1,33 @@
package net.i2p.android.router.service;
import android.content.Context;
import android.net.wifi.WifiManager;
import android.net.wifi.WifiManager.MulticastLock;
import net.i2p.router.transport.UPnPScannerCallback;
/**
* To lock/unlock UPnP, so it works on some phones.
* Many many phones don't require this, but do be safe...
*
* @since 0.9.41
*/
public class SSDPLocker implements UPnPScannerCallback {
private final MulticastLock lock;
public SSDPLocker(Context context) {
WifiManager wifi = (WifiManager) context.getApplicationContext().getSystemService(Context.WIFI_SERVICE);
lock = wifi.createMulticastLock("ssdp");
lock.setReferenceCounted(false);
}
public void beforeScan() {
lock.acquire();
}
public void afterScan() {
if (lock.isHeld())
lock.release();
}
}

View File

@ -1,14 +1,19 @@
package net.i2p.android.router.service;
import android.app.Notification;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.os.Build;
import android.support.v4.app.NotificationCompat;
import android.view.Gravity;
import android.widget.Toast;
import net.i2p.android.I2PActivity;
import net.i2p.android.router.R;
import net.i2p.android.router.util.Notifications;
class StatusBar {
@ -16,6 +21,9 @@ class StatusBar {
private final NotificationManager mNotificationManager;
private final NotificationCompat.Builder mNotifyBuilder;
private Notification mNotif;
private final String NOTIFICATION_CHANNEL_ID = "net.i2p.android.STARTUP_STATE_CHANNEL";
private final String channelName = "I2P Router Service";
NotificationChannel mNotificationChannel;
private static final int ID = 1337;
@ -28,39 +36,90 @@ class StatusBar {
StatusBar(Context ctx) {
mCtx = ctx;
mNotificationManager = (NotificationManager) ctx.getSystemService(
mNotificationManager = (NotificationManager) mCtx.getSystemService(
Context.NOTIFICATION_SERVICE);
assert mNotificationManager != null;
Thread.currentThread().setUncaughtExceptionHandler(
new CrashHandler(mNotificationManager));
int icon = ICON_STARTING;
// won't be shown if replace() is called
String text = ctx.getString(R.string.notification_status_starting);
String text = mCtx.getString(R.string.notification_status_starting);
mNotifyBuilder = notifyBuilder(icon, text);
}
mNotifyBuilder = new NotificationCompat.Builder(ctx)
.setContentText(text)
.setSmallIcon(icon)
.setColor(mCtx.getResources().getColor(R.color.primary_light))
.setOngoing(true)
.setOnlyAlertOnce(true);
private NotificationCompat.Builder notifyBuilder(int icon, String text) {
NotificationCompat.Builder tNotifyBuilder;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
tNotifyBuilder = new NotificationCompat.Builder(mCtx);
} else {
tNotifyBuilder = new NotificationCompat.Builder(mCtx, NOTIFICATION_CHANNEL_ID);
}
tNotifyBuilder.setContentText(text);
tNotifyBuilder.setSmallIcon(icon);
tNotifyBuilder.setColor(mCtx.getResources().getColor(R.color.primary_light));
tNotifyBuilder.setOngoing(true);
tNotifyBuilder.setPriority(NotificationManager.IMPORTANCE_LOW);
tNotifyBuilder.setCategory(Notification.CATEGORY_SERVICE);
Intent intent = new Intent(ctx, I2PActivity.class);
PendingIntent pi = this.pendingIntent();
tNotifyBuilder.setContentIntent(pi);
return tNotifyBuilder;
}
private PendingIntent pendingIntent() {
Intent intent = new Intent(mCtx, I2PActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
PendingIntent pi = PendingIntent.getActivity(ctx, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
mNotifyBuilder.setContentIntent(pi);
PendingIntent pi = null;
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.S) {
pi = PendingIntent.getActivity(mCtx,
0,
intent,
PendingIntent.FLAG_MUTABLE);
} else {
pi = PendingIntent.getActivity(mCtx,
0,
intent,
PendingIntent.FLAG_UPDATE_CURRENT);
}
return pi;
}
public void replace(int icon, int textResource) {
PendingIntent pi = pendingIntent();
mNotifyBuilder.setContentIntent(pi);
replace(icon, mCtx.getString(textResource));
}
public void replace(int icon, String title) {
PendingIntent pi = pendingIntent();
mNotifyBuilder.setContentIntent(pi);
mNotifyBuilder.setSmallIcon(icon)
.setStyle(null)
.setTicker(title);
update(title);
}
public void replaceIntent(int icon, String text, PendingIntent pi) {
mNotifyBuilder.setContentIntent(pi);
mNotifyBuilder.setPriority(NotificationCompat.PRIORITY_MAX);
mNotifyBuilder.setAutoCancel(true);
mNotifyBuilder.setStyle(new NotificationCompat.BigTextStyle().bigText(text));
mNotifyBuilder.setSmallIcon(icon).setContentText(text);
update(null, text);
}
public void replaceIntent(int icon, int textResource, PendingIntent pi) {
String text = mCtx.getString(textResource);
mNotifyBuilder.setContentIntent(pi);
mNotifyBuilder.setPriority(NotificationCompat.PRIORITY_MAX);
mNotifyBuilder.setAutoCancel(true);
mNotifyBuilder.setStyle(new NotificationCompat.BigTextStyle().bigText(text));
mNotifyBuilder.setSmallIcon(icon).setContentText(text);
update(null, text);
}
public void update(String title) {
update(title, null);
}
@ -72,8 +131,16 @@ class StatusBar {
}
public void update(String title, String text) {
mNotifyBuilder.setContentTitle(title)
.setContentText(text);
if (title != null)
mNotifyBuilder.setContentTitle(title);
if (text != null)
mNotifyBuilder.setContentText(text);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
mNotificationChannel = new NotificationChannel(NOTIFICATION_CHANNEL_ID, channelName, NotificationManager.IMPORTANCE_LOW);
mNotificationManager.createNotificationChannel(mNotificationChannel);
mNotificationChannel.setLockscreenVisibility(Notification.VISIBILITY_PRIVATE);
mNotifyBuilder.setChannelId(NOTIFICATION_CHANNEL_ID);
}
mNotif = mNotifyBuilder.build();
mNotificationManager.notify(ID, mNotif);
}

View File

@ -30,7 +30,6 @@ public class AppCache {
private static AppCache _instance;
private static File _cacheDir;
private static long _totalSize;
private static ContentResolver _resolver;
/** the LRU cache */
private final Map<Integer, Object> _cache;
@ -62,7 +61,6 @@ public class AppCache {
_cacheDir = new File(ctx.getCacheDir(), DIR_NAME);
_cacheDir.mkdir();
Util.d("AppCache cache dir " + _cacheDir);
_resolver = ctx.getContentResolver();
_cache = new LHM(MAX_FILES);
initialize();
}
@ -72,9 +70,9 @@ public class AppCache {
* addCacheFile() or removeCacheFile() after the data is written.
* @param key no fragment allowed
*/
public OutputStream createCacheFile(Uri key) throws IOException {
public OutputStream createCacheFile(Context ctx, Uri key) throws IOException {
// remove any old file so the total stays correct
removeCacheFile(key);
removeCacheFile(ctx, key);
File f = toFile(key);
f.getParentFile().mkdirs();
return new FileOutputStream(f);
@ -88,7 +86,7 @@ public class AppCache {
* @param key no fragment allowed
* @param setAsCurrentBase tell CacheProvider
*/
public Uri addCacheFile(Uri key, boolean setAsCurrentBase) {
public Uri addCacheFile(Context ctx, Uri key, boolean setAsCurrentBase) {
int hash = toHash(key);
synchronized(_cache) {
_cache.put(hash, DUMMY);
@ -96,19 +94,19 @@ public class AppCache {
// file:/// uri
//return Uri.fromFile(toFile(hash)).toString();
// content:// uri
return insertContent(key, setAsCurrentBase);
return insertContent(ctx, key, setAsCurrentBase);
}
/**
* Remove a previously written file from the cache index and disk.
* @param key no fragment allowed
*/
public void removeCacheFile(Uri key) {
public void removeCacheFile(Context ctx, Uri key) {
int hash = toHash(key);
synchronized(_cache) {
_cache.remove(hash);
}
deleteContent(key);
deleteContent(ctx, key);
}
/**
@ -118,7 +116,7 @@ public class AppCache {
*
* @param key no fragment allowed
*/
public Uri getCacheUri(Uri key) {
public Uri getCacheUri(Context ctx, Uri key) {
int hash = toHash(key);
// poke the LRU
Object present;
@ -126,7 +124,7 @@ public class AppCache {
present = _cache.get(hash);
}
if (present != null)
setAsCurrentBase(key);
setAsCurrentBase(ctx, key);
return CacheProvider.getContentUri(key);
}
@ -242,7 +240,7 @@ public class AppCache {
/**
* @return the uri inserted or null on failure
*/
private static Uri insertContent(Uri key, boolean setAsCurrentBase) {
private static Uri insertContent(Context ctx, Uri key, boolean setAsCurrentBase) {
String path = toFile(key).getAbsolutePath();
ContentValues cv = new ContentValues();
cv.put(CacheProvider.DATA, path);
@ -250,8 +248,9 @@ public class AppCache {
cv.put(CacheProvider.CURRENT_BASE, Boolean.TRUE);
Uri uri = CacheProvider.getContentUri(key);
if (uri != null) {
_resolver.insert(uri, cv);
return uri;
ContentResolver resolver = ctx.getContentResolver();
resolver.insert(uri, cv);
return uri;
}
return null;
}
@ -259,19 +258,23 @@ public class AppCache {
/**
* Set key as current base. May be content or i2p key.
*/
private static void setAsCurrentBase(Uri key) {
private static void setAsCurrentBase(Context ctx, Uri key) {
ContentValues cv = new ContentValues();
cv.put(CacheProvider.CURRENT_BASE, Boolean.TRUE);
Uri uri = CacheProvider.getContentUri(key);
if (uri != null)
_resolver.insert(uri, cv);
if (uri != null) {
ContentResolver resolver = ctx.getContentResolver();
resolver.insert(uri, cv);
}
}
/** ok for now but we will need to store key in the map and delete by integer */
private static void deleteContent(Uri key) {
private static void deleteContent(Context ctx, Uri key) {
Uri uri = CacheProvider.getContentUri(key);
if (uri != null)
_resolver.delete(uri, null, null);
if (uri != null) {
ContentResolver resolver = ctx.getContentResolver();
resolver.delete(uri, null, null);
}
}
/**

View File

@ -32,20 +32,50 @@ public class NamingServiceUtil {
String kDest = res.getString(R.string.addressbook_add_wizard_k_destination);
String hostName = data.getBundle(kHostName).getString(Page.SIMPLE_DATA_KEY);
String host = toASCII(res, hostName); // Already validated, won't throw IAE
String host;
try {
// Already validated, won't throw IAE
// ^^^ NOT TRUE ticket #2489 ^^^
host = toASCII(res, hostName);
} catch (IllegalArgumentException iae) {
Toast.makeText(ctx,
iae.getMessage(),
Toast.LENGTH_LONG).show();
return false;
}
String displayHost = host.equals(hostName) ? hostName :
hostName + " (" + host + ')';
String destB64 = data.getBundle(kDest).getString(Page.SIMPLE_DATA_KEY);
Destination dest = new Destination();
try {
dest.fromBase64(destB64);
} catch (DataFormatException e) {} // Already validated
String dest = data.getBundle(kDest).getString(Page.SIMPLE_DATA_KEY).split(":")[0];
Destination destination = new Destination();
if (dest.endsWith(".b32.i2p")) {
NamingService dns = NamingServiceUtil.getNamingService(Util.getRouterContext(),"");
destination = dns.lookup(dest);
int i = 0;
while (destination == null) {
dns = NamingServiceUtil.getNamingService(Util.getRouterContext(),"");
destination = dns.lookup(dest);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
i++;
if (i > 500){
break;
}
}
} else {
try {
destination.fromBase64(dest);
} catch (DataFormatException e) {
e.printStackTrace();
}
}
// Check if already in addressbook
Destination oldDest = ns.lookup(host);
if (oldDest != null) {
if (destB64.equals(oldDest.toBase64()))
if (destination.toBase64().equals(oldDest.toBase64()))
Toast.makeText(ctx,
"Host name " + displayHost + " is already in address book, unchanged.",
Toast.LENGTH_LONG).show();
@ -55,7 +85,7 @@ public class NamingServiceUtil {
Toast.LENGTH_LONG).show();
} else {
// Put the new host name
success = ns.put(host, dest);
success = ns.put(host, destination);
if (!success)
Toast.makeText(ctx,
"Failed to add Destination " + displayHost + " to naming service " + ns.getName(),

View File

@ -2,16 +2,20 @@ package net.i2p.android.router.util;
import net.i2p.android.router.R;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.os.Build;
import android.support.v4.app.NotificationCompat;
public class Notifications {
private final Context mCtx;
private final NotificationManager mNotificationManager;
public static final int ICON = R.drawable.ic_stat_router_active;
public Notifications(Context ctx) {
@ -25,18 +29,36 @@ public class Notifications {
}
public void notify(String title, String text, Class<?> c) {
NotificationCompat.Builder b =
new NotificationCompat.Builder(mCtx)
.setContentTitle(title)
.setContentText(text)
.setSmallIcon(ICON)
.setColor(mCtx.getResources().getColor(R.color.primary_light))
.setAutoCancel(true);
notify(title, text, "", c);
}
public void notify(String title, String text, String channel, Class<?> c) {
NotificationCompat.Builder b;
if (Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
b = new NotificationCompat.Builder(mCtx);
} else {
if (channel.equals("")){
b = new NotificationCompat.Builder(mCtx);
} else {
b = new NotificationCompat.Builder(mCtx, channel);
}
}
b.setContentTitle(title);
b.setContentText(text);
b.setSmallIcon(ICON);
b.setColor(mCtx.getResources().getColor(R.color.primary_light));
b.setAutoCancel(true);
if (c != null) {
Intent intent = new Intent(mCtx, c);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
PendingIntent pi = PendingIntent.getActivity(mCtx, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
PendingIntent pi;
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.S) {
pi = PendingIntent.getActivity(mCtx, 0, intent, PendingIntent.FLAG_MUTABLE);
} else {
pi = PendingIntent.getActivity(mCtx, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
}
b.setContentIntent(pi);
}

View File

@ -34,6 +34,7 @@ import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Properties;
@ -185,9 +186,9 @@ public abstract class Util implements I2PConstants {
toRemove.setProperty("routerconsole.lang", "");
toRemove.setProperty("routerconsole.country", "");
} else {
routerProps.setProperty("routerconsole.lang", language[0].toLowerCase());
routerProps.setProperty("routerconsole.lang", language[0].toLowerCase(Locale.US));
if (language.length == 2)
routerProps.setProperty("routerconsole.country", language[1].toUpperCase());
routerProps.setProperty("routerconsole.country", language[1].toUpperCase(Locale.US));
else
toRemove.setProperty("routerconsole.country", "");
}
@ -445,10 +446,15 @@ public abstract class Util implements I2PConstants {
case IPV4_UNKNOWN_IPV6_OK:
case IPV4_DISABLED_IPV6_OK:
case IPV4_SNAT_IPV6_OK:
RouterAddress ra = routerInfo.getTargetAddress("NTCP");
if (ra == null)
List<RouterAddress> ras = routerInfo.getTargetAddresses("NTCP", "NTCP2");
if (ras.isEmpty())
return new NetStatus(NetStatus.Level.INFO, toStatusString(ctx, status));
byte[] ip = ra.getIP();
byte[] ip = null;
for (RouterAddress ra : ras) {
ip = ra.getIP();
if (ip != null)
break;
}
if (ip == null)
return new NetStatus(NetStatus.Level.ERROR, ctx.getString(R.string.net_status_error_unresolved_tcp));
// TODO set IPv6 arg based on configuration?
@ -462,7 +468,7 @@ public abstract class Util implements I2PConstants {
case REJECT_UNSOLICITED:
case IPV4_DISABLED_IPV6_FIREWALLED:
if (routerInfo.getTargetAddress("NTCP") != null)
if (routerInfo.getTargetAddresses("NTCP", "NTCP2").isEmpty())
return new NetStatus(NetStatus.Level.WARN, ctx.getString(R.string.net_status_warn_firewalled_inbound_tcp));
// fall through...
case IPV4_FIREWALLED_IPV6_OK:
@ -483,7 +489,7 @@ public abstract class Util implements I2PConstants {
case IPV4_UNKNOWN_IPV6_FIREWALLED:
case IPV4_DISABLED_IPV6_UNKNOWN:
default:
ra = routerInfo.getTargetAddress("SSU");
RouterAddress ra = routerInfo.getTargetAddress("SSU");
if (ra == null && rCtx.router().getUptime() > 5 * 60 * 1000) {
if (rCtx.commSystem().countActivePeers() <= 0)
return new NetStatus(NetStatus.Level.ERROR, ctx.getString(R.string.net_status_error_no_active_peers));

View File

@ -28,10 +28,11 @@ import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Locale;
public class I2PWebViewClient extends WebViewClient {
private Fragment _parentFrag;
private final Fragment _parentFrag;
private BGLoad _lastTask;
/** save it here so we can dismiss it in onPageFinished() */
private ProgressDialog _lastDialog;
@ -76,7 +77,7 @@ public class I2PWebViewClient extends WebViewClient {
fail(view, "Bad URL " + url);
return true;
}
s = s.toLowerCase();
s = s.toLowerCase(Locale.US);
if (!(s.equals("http") || s.equals("https") ||
s.equals(CONTENT))) {
Util.d("Not loading URL " + url);
@ -93,7 +94,7 @@ public class I2PWebViewClient extends WebViewClient {
return true;
}
h = h.toLowerCase();
h = h.toLowerCase(Locale.US);
if (h.endsWith(".i2p")) {
if (!s.equals("http")) {
fail(view, "Bad URL " + url);
@ -211,7 +212,8 @@ public class I2PWebViewClient extends WebViewClient {
//reverse back to a i2p URI so we can delete it from the AppCache
uri = CacheProvider.getI2PUri(uri);
Util.d("clearing AppCache entry for current page " + uri);
AppCache.getInstance(view.getContext()).removeCacheFile(uri);
Context ctx = view.getContext();
AppCache.getInstance(ctx).removeCacheFile(ctx, uri);
} catch (FileNotFoundException fnfe) {
// this actually only deletes the row in the provider,
// not the actual file, but it will be overwritten in the reload.
@ -315,9 +317,10 @@ public class I2PWebViewClient extends WebViewClient {
protected Integer doInBackground(String... urls) {
final String url = urls[0];
Uri uri = Uri.parse(url);
File cacheFile = AppCache.getInstance(_ctx).getCacheFile(uri);
final AppCache cache = AppCache.getInstance(_ctx);
File cacheFile = cache.getCacheFile(uri);
if (cacheFile.exists()) {
final Uri resUri = AppCache.getInstance(_ctx).getCacheUri(uri);
final Uri resUri = cache.getCacheUri(_ctx, uri);
Util.d("Loading " + url + " from resource cache " + resUri);
_view.post(new Runnable() {
@Override
@ -335,7 +338,7 @@ public class I2PWebViewClient extends WebViewClient {
//EepGetFetcher fetcher = new EepGetFetcher(url);
OutputStream out = null;
try {
out = AppCache.getInstance(_ctx).createCacheFile(uri);
out = cache.createCacheFile(_ctx, uri);
// write error to stream
EepGetFetcher fetcher = new EepGetFetcher(url, out, true);
fetcher.addStatusListener(this);
@ -348,11 +351,11 @@ public class I2PWebViewClient extends WebViewClient {
if (success) {
// store in cache, get content URL, and load that way
// Set as current base
final Uri content = AppCache.getInstance(_ctx).addCacheFile(uri, true);
final Uri content = cache.addCacheFile(_ctx, uri, true);
if (content != null) {
Util.d("Stored cache in " + content);
} else {
AppCache.getInstance(_ctx).removeCacheFile(uri);
cache.removeCacheFile(_ctx, uri);
Util.d("cache create error");
return 0;
}
@ -391,7 +394,7 @@ public class I2PWebViewClient extends WebViewClient {
if (fis != null) try { fis.close(); } catch (IOException ioe) {}
}
}
AppCache.getInstance(_ctx).removeCacheFile(uri);
cache.removeCacheFile(_ctx, uri);
Util.d("loading error data URL: " + url);
final String finalMsg = msg;
_view.post(new Runnable() {
@ -439,8 +442,9 @@ public class I2PWebViewClient extends WebViewClient {
} else {
// nothing
}
} catch (IllegalArgumentException iae) {
} catch (RuntimeException iae) {
// throws IAE - not attached to window manager - perhaps due to screen rotation?
// Also includes android.view.WindowManager$BadTokenException extends RuntimeException
Util.e("Error while updating I2PWebViewClient dialog", iae);
}
}

View File

@ -49,19 +49,21 @@ public class WebFragment extends I2PFragmentBase {
wv.getSettings().setBuiltInZoomControls(true);
// http://stackoverflow.com/questions/2369310/webview-double-tap-zoom-not-working-on-a-motorola-droid-a855
wv.getSettings().setUseWideViewPort(true);
_uriStr = getArguments().getString(HTML_URI);
if (_uriStr != null) {
Uri uri = Uri.parse(_uriStr);
//wv.getSettings().setLoadsImagesAutomatically(true);
//wv.loadUrl(uri.toString());
// go thru the client so .i2p will work too
_wvClient.shouldOverrideUrlLoading(wv, uri.toString());
} else {
wv.getSettings().setLoadsImagesAutomatically(false);
int id = getArguments().getInt(HTML_RESOURCE_ID, 0);
// no default, so restart should keep previous view
if (id != 0)
loadResource(wv, id);
if (getArguments() != null) {
_uriStr = getArguments().getString(HTML_URI);
if (_uriStr != null) {
Uri uri = Uri.parse(_uriStr);
//wv.getSettings().setLoadsImagesAutomatically(true);
//wv.loadUrl(uri.toString());
// go thru the client so .i2p will work too
_wvClient.shouldOverrideUrlLoading(wv, uri.toString());
} else {
wv.getSettings().setLoadsImagesAutomatically(false);
int id = getArguments().getInt(HTML_RESOURCE_ID, 0);
// no default, so restart should keep previous view
if (id != 0)
loadResource(wv, id);
}
}
return v;
}

View File

@ -7,6 +7,8 @@ import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import java.util.Locale;
import com.eowise.recyclerview.stickyheaders.StickyHeadersAdapter;
import net.i2p.android.router.R;
@ -49,7 +51,7 @@ public class AlphanumericHeaderAdapter implements StickyHeadersAdapter<Alphanume
@Override
public void onBindViewHolder(ViewHolder headerViewHolder, int position) {
String sortString = mAdapter.getSortString(position).toUpperCase();
String sortString = mAdapter.getSortString(position).toUpperCase(Locale.getDefault());
if (sortString.isEmpty())
headerViewHolder.itemView.setVisibility(View.GONE);
else {
@ -63,7 +65,7 @@ public class AlphanumericHeaderAdapter implements StickyHeadersAdapter<Alphanume
@Override
public long getHeaderId(int position) {
String sortString = mAdapter.getSortString(position).toUpperCase();
String sortString = mAdapter.getSortString(position).toUpperCase(Locale.getDefault());
if (sortString.isEmpty())
return Integer.MAX_VALUE;

View File

@ -3,19 +3,17 @@ package net.i2p.android.util;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.util.SparseArray;
import android.view.ViewGroup;
import java.util.HashMap;
import java.util.Map;
public abstract class MemoryFragmentPagerAdapter extends FragmentPagerAdapter {
private FragmentManager mFragmentManager;
private Map<Integer, String> mFragmentTags;
private final FragmentManager mFragmentManager;
private final SparseArray<String> mFragmentTags;
public MemoryFragmentPagerAdapter(FragmentManager fm) {
super(fm);
mFragmentManager = fm;
mFragmentTags = new HashMap<>();
mFragmentTags = new SparseArray<>();
}
@Override

View File

@ -30,10 +30,10 @@ import java.util.List;
* To create an actual wizard model, extend this class and implement {@link #onNewRootPageList()}.
*/
public abstract class AbstractWizardModel implements ModelCallbacks {
protected Context mContext;
protected final Context mContext;
private List<ModelCallbacks> mListeners = new ArrayList<ModelCallbacks>();
private PageList mRootPageList;
private final List<ModelCallbacks> mListeners = new ArrayList<ModelCallbacks>();
private final PageList mRootPageList;
public AbstractWizardModel(Context context) {
mContext = context;

View File

@ -1,47 +0,0 @@
package net.i2p.android.wizard.model;
import android.support.v4.app.Fragment;
import net.i2p.android.wizard.ui.I2PB64DestinationFragment;
import net.i2p.data.DataFormatException;
import net.i2p.data.Destination;
/**
* A page asking for an I2P Destination.
* This must be the B64 representation of a Destination.
*/
public class I2PB64DestinationPage extends SingleTextFieldPage {
private String mFeedback;
public I2PB64DestinationPage(ModelCallbacks callbacks, String title) {
super(callbacks, title);
}
@Override
public Fragment createFragment() {
return I2PB64DestinationFragment.create(getKey());
}
@Override
public boolean isValid() {
String data = mData.getString(SIMPLE_DATA_KEY);
try {
new Destination().fromBase64(data);
} catch (DataFormatException dfe) {
mFeedback = "Invalid B64";
return false;
}
mFeedback = "";
return true;
}
@Override
public boolean showFeedback() {
return true;
}
@Override
public String getFeedback() {
return mFeedback;
}
}

View File

@ -4,9 +4,12 @@ import java.util.Locale;
import android.support.v4.app.Fragment;
import net.i2p.I2PAppContext;
import net.i2p.android.wizard.ui.I2PDestinationFragment;
import net.i2p.client.naming.NamingService;
import net.i2p.data.DataFormatException;
import net.i2p.data.Destination;
import net.i2p.client.naming.DummyNamingService;
/**
* A page asking for an I2P Destination.
@ -27,12 +30,20 @@ public class I2PDestinationPage extends SingleTextFieldPage {
@Override
public boolean isValid() {
String data = mData.getString(SIMPLE_DATA_KEY);
String data = mData.getString(SIMPLE_DATA_KEY).split(":")[0];
if (data.toLowerCase(Locale.US).endsWith(".b32.i2p")) { /* B32 */
if (data.length() != BASE32_HASH_LENGTH + 8) {
mFeedback = "Invalid B32";
return false;
if (data.length() == BASE32_HASH_LENGTH){
mFeedback = "";
return true;
}
if (data.length() >= BASE32_HASH_LENGTH + 8) {
if (data.length() <= BASE32_HASH_LENGTH + 12) {
mFeedback = "";
return true;
}
}
mFeedback = "Invalid B32";
return false;
} else if (data.endsWith(".i2p")) { /* Domain */
// Valid
} else if (data.length() >= 516) { /* B64 */

View File

@ -1,208 +0,0 @@
/*
* Copyright 2013 str4d
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package net.i2p.android.wizard.ui;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.os.ParcelFileDescriptor;
import android.support.v4.app.Fragment;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.inputmethod.InputMethodManager;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import net.i2p.android.router.R;
import net.i2p.android.router.util.Util;
import net.i2p.android.wizard.model.Page;
import net.i2p.android.wizard.model.SingleTextFieldPage;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
public class I2PB64DestinationFragment extends Fragment {
static final int REQUEST_DESTINATION_FILE = 1;
private static final String ARG_KEY = "key";
private PageFragmentCallbacks mCallbacks;
private SingleTextFieldPage mPage;
protected TextView mFieldView;
private TextView mFeedbackView;
public static I2PB64DestinationFragment create(String key) {
Bundle args = new Bundle();
args.putString(ARG_KEY, key);
I2PB64DestinationFragment fragment = new I2PB64DestinationFragment();
fragment.setArguments(args);
return fragment;
}
public I2PB64DestinationFragment() {
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Bundle args = getArguments();
String mKey = args.getString(ARG_KEY);
mPage = (SingleTextFieldPage) mCallbacks.onGetPage(mKey);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_wizard_page_single_text_field_picker, container, false);
((TextView) rootView.findViewById(android.R.id.title)).setText(mPage.getTitle());
((TextView) rootView.findViewById(R.id.wizard_text_field_desc)).setText(mPage.getDesc());
Button b = (Button) rootView.findViewById(R.id.wizard_text_field_pick);
b.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
Intent i = new Intent(Intent.ACTION_GET_CONTENT);
i.setType("text/plain");
i.addCategory(Intent.CATEGORY_OPENABLE);
try {
startActivityForResult(
Intent.createChooser(i,"Select B64 file"),
REQUEST_DESTINATION_FILE);
} catch (android.content.ActivityNotFoundException ex) {
Toast.makeText(getActivity(), "Please install a File Manager.",
Toast.LENGTH_SHORT).show();
}
}
});
mFieldView = ((TextView) rootView.findViewById(R.id.wizard_text_field));
mFieldView.setHint(mPage.getTitle());
if (mPage.getData().getString(Page.SIMPLE_DATA_KEY) != null)
mFieldView.setText(mPage.getData().getString(Page.SIMPLE_DATA_KEY));
else if (mPage.getDefault() != null) {
mFieldView.setText(mPage.getDefault());
mPage.getData().putString(Page.SIMPLE_DATA_KEY, mPage.getDefault());
}
mFeedbackView = (TextView) rootView.findViewById(R.id.wizard_text_field_feedback);
return rootView;
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
if (!(activity instanceof PageFragmentCallbacks)) {
throw new ClassCastException("Activity must implement PageFragmentCallbacks");
}
mCallbacks = (PageFragmentCallbacks) activity;
}
@Override
public void onDetach() {
super.onDetach();
mCallbacks = null;
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
mFieldView.addTextChangedListener(new TextWatcher() {
public void beforeTextChanged(CharSequence charSequence, int i, int i1,
int i2) {
}
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
public void afterTextChanged(Editable editable) {
mPage.getData().putString(Page.SIMPLE_DATA_KEY,
(editable != null) ? editable.toString() : null);
mPage.notifyDataChanged();
if (mPage.showFeedback()) {
mFeedbackView.setText(mPage.getFeedback());
}
}
});
}
@Override
public void setMenuVisibility(boolean menuVisible) {
super.setMenuVisibility(menuVisible);
// In a future update to the support library, this should override setUserVisibleHint
// instead of setMenuVisibility.
if (mFieldView != null) {
InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(
Context.INPUT_METHOD_SERVICE);
if (!menuVisible) {
imm.hideSoftInputFromWindow(getView().getWindowToken(), 0);
}
}
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_DESTINATION_FILE) {
if (resultCode == Activity.RESULT_OK) {
Uri result = data.getData();
BufferedReader br = null;
try {
ParcelFileDescriptor pfd = getActivity().getContentResolver().openFileDescriptor(result, "r");
br = new BufferedReader(
new InputStreamReader(
new ParcelFileDescriptor.AutoCloseInputStream(pfd)));
try {
mFieldView.setText(br.readLine());
} catch (IOException ioe) {
Util.e("Failed to read B64 file", ioe);
Toast.makeText(getActivity(), "Failed to read B64 file.",
Toast.LENGTH_SHORT).show();
}
} catch (FileNotFoundException fnfe) {
Util.e("Could not find B64 file", fnfe);
Toast.makeText(getActivity(), "Could not find B64 file.",
Toast.LENGTH_SHORT).show();
} catch (SecurityException se) {
Util.e("Could not open B64 file", se);
Toast.makeText(getActivity(), "Could not open B64 file.",
Toast.LENGTH_SHORT).show();
} finally {
if (br != null)
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
}

View File

@ -64,13 +64,13 @@
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="@string/about_donate" />
android:text="@string/about_gitlab" />
<TextView
android:id="@+id/url_donate"
android:id="@+id/url_gitlab"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="@string/url_donate" />
android:text="@string/url_gitlab" />
</LinearLayout>

View File

@ -0,0 +1,17 @@
<html>
<head></head>
<body>
<h2>Privacy Brower has native I2P support!</h2>
<p>Make sure your I2P router is started before launching Privacy Browser</p>
<p>Privacy Browser supports both I2P and Orbot (Tor), but not at the same time.</p>
<h2>How to configure Privacy Browser:</h2>
<ol>
<li>Open the main menu and tap “Settings”</li>
<li>Select "Disable Javascript"(Recommended)</li>
<li>Select "Enable Incognito Mode"(Optional)</li>
<li>Tap the "Proxy" menu item and select "I2P" from the submenu</li>
<li>Exit the settings menu.</li>
</ol>
<a href="https://eyedeekay.github.io/Configuring-Privacy-Browser-for-I2P-on-Android/">A detailed guide with screenshots to is available online</a>
</body>
</html>

View File

@ -11,7 +11,7 @@
</ul>
<h2>Using clients with pre-configured tunnels</h2>
<p>The app starts an HTTP proxy tunnel at localhost port 4444 and IRC client tunnels at localhost ports 6668 - 6672. The IRC clients are "shared clients" on the same tunnels. Once you see the tunnel icon turn green on the main console (several minutes after startup), you should be able to connect.</p>
<p>The app starts an HTTP proxy tunnel at 127.0.0.1 port 4444 and IRC client tunnels at 127.0.0.1 ports 6668 - 6672. The IRC clients are "shared clients" on the same tunnels. Once you see the tunnel icon turn green on the main console (several minutes after startup), you should be able to connect.</p>
<h2>What does the clock icon on a yellow background mean?</h2>
<p>When a tunnel's indicator is yellow with a clock icon, the tunnel is in standby mode. This means that I2P has not built the tunnel yet, but will do so automatically when you start using it. This helps to minimize resource use and conserve battery life.</p>

View File

@ -1,11 +1,11 @@
<html>
<head></head>
<body>
<h2>How to configure Orweb:</h2>
<ol>
<li>Open Orweb's settings menu.</li>
<li>Change the "Proxy Port" to <code>4444</code>.</li>
<li>Exit Orweb using the back button, then open it again.</li>
</ol>
<h2>Sorry, this browser is unsupported</h2>
<ul>
<li>OrFox has been deprecated by the Guardian Project in favor of Tor
Browser for Android. It is no longer supported.
</li>
</ul>
</body>
</html>
</html>

View File

@ -1,17 +1,11 @@
<html>
<head></head>
<body>
<h2>How to configure Orfox:</h2>
<ol>
<li>Install the ProxyMob add-on. Click <a
href="https://guardianproject.info/downloads/proxymob.xpi">HERE</a>, and choose to open
the URL in Firefox.
<h2>Sorry, this browser is unsupported</h2>
<ul>
<li>OrFox has been deprecated by the Guardian Project in favor of Tor
Browser for Android. It is no longer supported.
</li>
<li>In the main Firefox menu, click "Tools", then "Add-ons".</li>
<li>Click on "Proxy Mobile".</li>
<li>Change the value of "HTTP Proxy Port" to <code>4444</code>.</li>
<li>Change the value of "HTTPS Proxy Port" to <code>4444</code>.</li>
<li>You can now browse I2P eepsites!</li>
</ol>
</ul>
</body>
</html>
</html>

View File

@ -0,0 +1,13 @@
<html>
<head></head>
<body>
<h2>How to configure IceRaven for Android:</h2>
<h3>Configuration via Webextension</h3>
<ol>
<li>Open IceRaven and click the main menu. Scroll to the top, and tap the "Add-Ons" submenu.</li>
<li>Tap on the "Add-Ons Manager" option.</li>
<li>Find the "I2P Proxy for Android and Other" extension in the Add-Ons collection and tap on the <code>+</code> symbol</li>
<li>You can now browse I2P Sites!</li>
</ol>
</body>
</html>

View File

@ -9,8 +9,8 @@
<p>With this app installed, other apps that are designed for I2P will use it automatically.</p>
<h2>Pre-configured HTTP proxy</h2>
<p>The app starts an HTTP proxy at localhost port 4444. To use it, configure your browser's HTTP proxy setting to use localhost:4444.</p>
<p>The app starts an HTTP proxy at 127.0.0.1 port 4444. To use it, configure your browser's HTTP proxy setting to use 127.0.0.1:4444.</p>
<p>The HTTP proxy is tested with the "Orweb" app. It should also work with Firefox 4 Mobile and the ProxyMob Firefox plugin, if you have at least 512 MB of RAM.</p>
<p>See the "Browser configuration" help page for more info.</p>
</body>
</html>
</html>

View File

@ -0,0 +1,34 @@
<html>
<head></head>
<body>
<h2>How to configure GNU IceCat:</h2>
<ol>
<li>Click <a href="about:config?filter=network.proxy">HERE</a>, and choose to open the URL in IceCatMobile.</li>
<li>Change the value of "network.proxy.type" to <code>1</code>.</li>
<li>Change the value of "network.proxy.http" to <code>127.0.0.1</code>.</li>
<li>Change the value of "network.proxy.http_port" to <code>4444</code>.</li>
<li>Change the value of "network.proxy.ssl" to <code>127.0.0.1</code>.</li>
<li>Change the value of "network.proxy.ssl_port" to <code>4444</code>.</li>
<li>Change the value of "media.peerconnection.ice.proxy_only" to <code>true</code>.</li>
<li>You may also wish to install plugins to help manage your browser's
default javascript settings, such as NoScript and/or uMatrix, and use
Private Browsing to manage your browser's cache.
</li>
<li>You can now browse I2P eepsites!</li>
</ol>
<h3>Alternate Configuration(Requires Root!)</h3>
<ol>
<li>Install <a href="https://github.com/v1nc/user.js-updater">user.js-updater</a></li>
<li>Select IceCatMobile from the list of browsers</li>
<li>Paste the following URL where it says "type custom user.js url" <a href="https://github.com/eyedeekay/firefox.profile.i2p/raw/master/firefox.profile.i2p/user.js">https://github.com/eyedeekay/firefox.profile.i2p/raw/master/firefox.profile.i2p/user.js</a></li>
<li>Tap "Update"</li>
<li>You can now browse I2P eepsites!</li>
</ol>
<h3>Rootless Configuration via Webextension</h3>
<ol>
<li>Open this link in GNU IceCat and get the WebExtension from <a href="https://github.com/eyedeekay/i2psetproxy.js/releases">Github</a></li>
<li>Click through the "Blocked Extension" warning</li>
<li>You can now browse I2P eepsites!</li>
</ol>
</body>
</html>

View File

@ -0,0 +1,34 @@
<html>
<head></head>
<body>
<h2>How to configure Fennec Firefox:</h2>
<ol>
<li>Click <a href="about:config?filter=proxy">HERE</a>, and choose to open the URL in Fennec.</li>
<li>Change the value of "network.proxy.type" to <code>1</code>.</li>
<li>Change the value of "network.proxy.http" to <code>127.0.0.1</code>.</li>
<li>Change the value of "network.proxy.http_port" to <code>4444</code>.</li>
<li>Change the value of "network.proxy.ssl" to <code>127.0.0.1</code>.</li>
<li>Change the value of "network.proxy.ssl_port" to <code>4444</code>.</li>
<li>Change the value of "media.peerconnection.ice.proxy_only" to <code>true</code>.</li>
<li>You may also wish to install plugins to help manage your browser's
default javascript settings, such as NoScript and/or uMatrix, and use
Private Browsing to manage your browser's cache.
</li>
<li>You can now browse I2P eepsites!</li>
</ol>
<h3>Alternate Configuration(Requires Root!)</h3>
<ol>
<li>Install <a href="https://github.com/v1nc/user.js-updater">user.js-updater</a></li>
<li>Select Fennec from the list of browsers</li>
<li>Paste the following URL where it says "type custom user.js url" <a href="https://github.com/eyedeekay/firefox.profile.i2p/raw/master/firefox.profile.i2p/user.js">https://github.com/eyedeekay/firefox.profile.i2p/raw/master/firefox.profile.i2p/user.js</a></li>
<li>Tap "Update"</li>
<li>You can now browse I2P eepsites!</li>
</ol>
<h3>Rootless Configuration via Webextension</h3>
<ol>
<li>Open this link in Fennec and get the WebExtension from <a href="https://github.com/eyedeekay/i2psetproxy.js/releases">Github</a></li>
<li>Click through the "Blocked Extension" warning</li>
<li>You can now browse I2P eepsites!</li>
</ol>
</body>
</html>

View File

@ -3,12 +3,31 @@
<body>
<h2>How to configure Firefox:</h2>
<ol>
<li>Click <a href="about:config?filter=network.proxy">HERE</a>, and choose to open the URL in Firefox.</li>
<li>Click <a href="about:config?filter=proxy">HERE</a>, and choose to open the URL in Firefox.</li>
<li>Change the value of "network.proxy.type" to <code>1</code>.</li>
<li>Change the value of "network.proxy.http" to <code>127.0.0.1</code>.</li>
<li>Change the value of "network.proxy.http_port" to <code>4444</code>.</li>
<li>Change the value of "network.proxy.ssl" to <code>127.0.0.1</code>.</li>
<li>Change the value of "network.proxy.ssl_port" to <code>4444</code>.</li>
<li>Change the value of "media.peerconnection.ice.proxy_only" to <code>true</code>.</li>
<li>You may also wish to install plugins to help manage your browser's
default javascript settings, such as NoScript and/or uMatrix, and use
Private Browsing to manage your browser's cache.
</li>
<li>You can now browse I2P eepsites!</li>
</ol>
<h3>Alternate Configuration(Requires Root!)</h3>
<ol>
<li>Install <a href="https://github.com/v1nc/user.js-updater">user.js-updater</a></li>
<li>Select Firefox from the list of browsers</li>
<li>Paste the following URL where it says "type custom user.js url" <a href="https://github.com/eyedeekay/firefox.profile.i2p/raw/master/firefox.profile.i2p/user.js">https://github.com/eyedeekay/firefox.profile.i2p/raw/master/firefox.profile.i2p/user.js</a></li>
<li>Tap "Update"</li>
<li>You can now browse I2P eepsites!</li>
</ol>
<h3>Rootless Configuration via Webextension</h3>
<ol>
<li>Open this link in Firefox and get the WebExtension from <a href="https://github.com/eyedeekay/i2psetproxy.js/releases">Github</a></li>
<li>Click through the "Blocked Extension" warning</li>
<li>You can now browse I2P eepsites!</li>
</ol>
</body>

View File

@ -4,6 +4,6 @@
<h2>This browser is unknown</h2>
<p>We have not tested this browser with I2P, so we don't know anything about it.</p>
<p>But if this browser supports proxies, it will work with I2P.</p>
<p>Configure this browser's HTTP and HTTPS proxy settings to use <code>localhost:4444</code>.</p>
<p>Configure this browser's HTTP and HTTPS proxy settings to use <code>127.0.0.1:4444</code>.</p>
</body>
</html>
</html>

View File

@ -33,7 +33,7 @@ tunnel.1.type=ircclient
tunnel.1.sharedClient=true
tunnel.1.interface=127.0.0.1
tunnel.1.listenPort=6668
tunnel.1.targetDestination=irc.dg.i2p:6667,irc.postman.i2p:6667,irc.echelon.i2p:6667
tunnel.1.targetDestination=irc.postman.i2p:6667,irc.echelon.i2p:6667
tunnel.1.i2cpHost=127.0.0.1
tunnel.1.i2cpPort=7654
tunnel.1.option.inbound.nickname=shared clients
@ -101,27 +101,55 @@ tunnel.3.option.outbound.lengthVariance=0
tunnel.3.option.outbound.priority=15
tunnel.3.startOnLoad=true
# irc
tunnel.4.name=IRC welterde
tunnel.4.description=IRC tunnel to welterde's network
tunnel.4.type=ircclient
tunnel.4.sharedClient=true
tunnel.4.interface=127.0.0.1
tunnel.4.listenPort=6669
tunnel.4.targetDestination=irc.welterde.i2p
tunnel.4.i2cpHost=127.0.0.1
tunnel.4.i2cpPort=7654
tunnel.4.option.inbound.nickname=shared clients
tunnel.4.option.outbound.nickname=shared clients
tunnel.4.option.i2cp.delayOpen=true
tunnel.4.option.i2cp.reduceIdleTime=600000
tunnel.4.option.i2cp.reduceOnIdle=true
tunnel.4.option.i2cp.reduceQuantity=1
tunnel.4.option.i2p.streaming.connectDelay=1000
tunnel.4.option.i2p.streaming.maxWindowSize=16
tunnel.4.option.inbound.length=2
tunnel.4.option.inbound.lengthVariance=0
tunnel.4.option.outbound.length=2
tunnel.4.option.outbound.lengthVariance=0
tunnel.4.option.outbound.priority=15
tunnel.4.startOnLoad=true
# I2P Git Repositories SSH Access
tunnel.6.description=I2P Git Repositories SSH Access
tunnel.6.interface=127.0.0.1
tunnel.6.listenPort=7670
tunnel.6.name=gitssh.idk.i2p
tunnel.6.option.i2cp.closeIdleTime=1800000
tunnel.6.option.i2cp.closeOnIdle=false
tunnel.6.option.i2cp.delayOpen=true
tunnel.6.option.i2cp.destination.sigType=7
tunnel.6.option.i2cp.newDestOnResume=false
tunnel.6.option.i2cp.reduceIdleTime=1200000
tunnel.6.option.i2cp.reduceOnIdle=true
tunnel.6.option.i2cp.reduceQuantity=1
tunnel.6.option.inbound.backupQuantity=1
tunnel.6.option.inbound.length=3
tunnel.6.option.inbound.nickname=gitssh.idk.i2p
tunnel.6.option.inbound.quantity=3
tunnel.6.option.outbound.backupQuantity=1
tunnel.6.option.outbound.length=3
tunnel.6.option.outbound.nickname=gitssh.idk.i2p
tunnel.6.option.outbound.quantity=3
tunnel.6.sharedClient=false
tunnel.6.startOnLoad=false
tunnel.6.targetDestination=gitssh.idk.i2p
tunnel.6.type=client
# I2P Git Repositories HTTP Access(Android only)
# Disabled by default, useful for Android gitlab clients like labcoat
tunnel.7.description=I2P Git Repositories HTTP Access(Android Only)
tunnel.7.interface=127.0.0.1
tunnel.7.listenPort=7671
tunnel.7.name=git.idk.i2p
tunnel.7.option.i2cp.closeIdleTime=1800000
tunnel.7.option.i2cp.closeOnIdle=false
tunnel.7.option.i2cp.delayOpen=true
tunnel.7.option.i2cp.destination.sigType=7
tunnel.7.option.i2cp.newDestOnResume=false
tunnel.7.option.i2cp.reduceIdleTime=1200000
tunnel.7.option.i2cp.reduceOnIdle=true
tunnel.7.option.i2cp.reduceQuantity=1
tunnel.7.option.inbound.backupQuantity=1
tunnel.7.option.inbound.length=3
tunnel.7.option.inbound.nickname=git.idk.i2p
tunnel.7.option.inbound.quantity=3
tunnel.7.option.outbound.backupQuantity=1
tunnel.7.option.outbound.length=3
tunnel.7.option.outbound.nickname=git.idk.i2p
tunnel.7.option.outbound.quantity=3
tunnel.7.sharedClient=false
tunnel.7.startOnLoad=false
tunnel.7.targetDestination=ssh.idk.i2p
tunnel.7.type=client

View File

@ -53,6 +53,10 @@ i2np.bandwidth.outboundKBytesPerSecond=50
i2np.ntcp.enable=true
i2np.ntcp.maxConnections=32
#
# NTCP2
#
i2np.ntcp2.enable=true
#
# UDP
#
i2np.udp.enable=true

View File

@ -1,3 +1,2 @@
http://i2p-projekt.i2p/hosts.txt
http://i2host.i2p/cgi-bin/i2hostetag
http://stats.i2p/cgi-bin/newhosts.txt

View File

@ -36,9 +36,8 @@ services. You can also access the normal web anonymously via I2P's built-in web
proxy (outproxy). <a href="https://geti2p.net/en/about/browser-config"
target="_blank">Configure your browser</a> to use the HTTP proxy at
<code>127.0.0.1 port 4444</code>, then browse to an eepsite or a normal,
unencrypted <code>http://</code> address. For a pre-configured browser, you may
wish to try <a href="http://echelon.i2p/i2pfox/">I2PFox</a>, a custom build of
Firefox security hardened and tailored especially for I2P. If you wish to
unencrypted <code>http://</code> address.
If you wish to
disable or change outproxy access to the normal internet, remove or modify the
outproxy entry for <code>false.i2p</code> under the <i>Outproxies</i> option in
the <a href="/i2ptunnel/edit?tunnel=0" target="_blank">I2P HTTP Proxy Tunnel
@ -80,13 +79,12 @@ target="_blank">geti2p.net</a>. If you want to know
more about how I2P works or how you can participate, this is your first port of
call!</li>
<li class="tidylist"><b>I2P Community Forums</b><br><a
href="http://forum.i2p/" target="_blank">forum.i2p</a>: A secure
href="http://i2pforum.i2p/" target="_blank">i2pforum.i2p</a>: A secure
and anonymous online forum community where developers
and users alike discuss problems and ideas relating to I2P and associated
topics, and <a href="http://zzz.i2p/" target="_blank">zzz's developer
forums</a> for both end users and developers.</li>
topics.</li>
<li class="tidylist"><b>I2P Anonymous Pastebin</b><br><a
href="http://pastethis.i2p/" target="_blank">pastethis.i2p</a>: Secure and
href="http://paste.idk.i2p/" target="_blank">paste.idk.i2p</a>: Secure and
anonymous paste service allowing anonymous text and text-based code
sharing over I2P.</li>
<li class="tidylist"><b>Echelon's I2P Resources</b><br><a
@ -95,14 +93,6 @@ href="http://echelon.i2p/" target="_blank">echelon.i2p</a>: I2P software
including a <a href="http://echelon.i2p/I2Pguide/index.html"
target="_blank">beginner's guide</a> and pre-release developer builds of I2P
for the adventurous to try.</li>
<li class="tidylist"><b>Ugha's Wiki</b><br><a href="http://ugha.i2p/"
target="_blank">ugha.i2p</a>: An open wiki that anyone can edit with plenty of
information about I2P, help for beginners, additional links into the network,
and more.</li>
<li class="tidylist"><b>I2P-to-Freenet Proxy</b><br><a
href="http://fproxy.tino.i2p/" target="_blank">fproxy.tino.i2p</a>:
Peer into the world of the <a href="http://freenetproject.org/"
target="_blank">Freenet</a> network with Tino's I2P-to-Freenet proxy.</li>
<li class="tidylist"><b>The Planet (on I2P)</b><br><a
href="http://planet.i2p/" target="_blank">planet.i2p</a>: An RSS aggregator
site that takes news and events from around I2P and publishes them all in one
@ -149,32 +139,24 @@ discussion forum</a>,
<a href="irc://127.0.0.1:6668/i2p-help">#i2p-help</a>, <a
href="irc://127.0.0.1:6668/i2p">#i2p</a> or <a
href="irc://127.0.0.1:6668/i2p-chat">#i2p-chat</a> on I2P's internal IRC
network (<code>irc.postman.i2p</code> or <code>irc.freshcoffee.i2p</code>).
network (<code>irc.postman.i2p</code> or <code>irc.echelon.i2p</code>).
These channels are also available outside of I2P's encrypted, anonymous network
via <a href="irc://irc.freenode.net/i2p">Freenode IRC</a>.
</li>
<li class="tidylist"><b>Reporting Bugs</b><br>If you'd like to report a bug,
please file a ticket on <a href="http://trac.i2p2.i2p/"
target="_blank">trac.i2p2.i2p</a>. For developer-related discussions, please
visit <a href="http://zzz.i2p/" target="_blank">zzz's developer forums</a> or
please file a ticket on <a href="http://git.idk.i2p/"
target="_blank">git.idk.i2p</a>. For developer-related discussions, please
visit <a href="http://i2pforum.i2p/" target="_blank">I2P's developer forums</a> or
come and visit the <a href="irc://127.0.0.1:6668/i2p-dev">developer channel</a>
on I2P's IRC network. Developers can browse source at <a
href="http://stats.i2p/cgi-bin/viewmtn/" target="_blank">zzz's mtn repository
viewer</a>, <a href="http://i2host.i2p/cgi-bin/view/branch/changes/i2p.i2p"
target="_blank">Sponge's instance</a>, or via <a
href="http://trac.i2p2.i2p/browser" target="_blank">trac.i2p2.i2p</a>. We
primarily use <a href="http://i2p-projekt.i2p/monotone.html"
target="_blank">monotone</a> to manage our source code.
href="git.idk.i2p/i2p-hackers/i2p.i2p/-/commits/master" target="_blank">git.idk.i2p</a> or
<a href="https://github.com/i2p/i2p.i2p" target="_blank">GitHub</a>.
</li>
<li class="tidylist"><b>Get Involved!</b><br>I2P is developed and maintained
mostly through unfunded, voluntary participation by community members. We're
happy to accept <a href="http://i2p-projekt.i2p/donate.html"
target="_blank">donations</a>, which go into essential hosting and
administrative costs. We have <a href="http://i2p-projekt.i2p/bounties.html"
target="_blank">cash bounties</a> for aspects of I2P for developers looking for
incentives to participate, and we're always looking for more <a
mostly through unfunded, voluntary participation by community members. We're
always looking for more <a
href="http://i2p-projekt.i2p/newdevelopers.html" target="_blank">Java coders</a>,
<a href="http://i2p-projekt.i2p/newtranslators.html"
target="_blank">translators</a>, promoters and users to help I2P grow. The
@ -188,6 +170,6 @@ page</a> on the website.
</ul>
<div class="topness"><a href="#top">[Return to Top]</a></div>
<div class="footnote"><hr>Document updated: June 2011</div>
<div class="footnote"><hr>Document updated: May 2021</div>
</div>
</body></html>

View File

@ -0,0 +1,128 @@
<?xml version='1.0' encoding='UTF-8'?>
<resources>
<string name="app_name">I2P</string>
<string name="desc_i2p_logo">شعار I2P</string>
<string name="choose_language">اختر اللغة</string>
<string name="welcome_new_version">نسخة جديدة مثبتة. يرجى قراءة ملاحظات الإصدار. الإصدار:</string>
<string name="label_tunnels">نفق</string>
<string name="label_status">الحالة</string>
<string name="label_console">وحدة التحكم</string>
<string name="label_addresses">عناوين</string>
<string name="label_addressbook">دفتر العناوين</string>
<string name="label_i2ptunnel_client">أنفاق العميل</string>
<string name="label_i2ptunnel_server">أنفاق الخادم</string>
<string name="label_logs">السجلات</string>
<string name="label_error_logs">سجلات الأخطاء</string>
<string name="label_news">الأخبار</string>
<string name="label_peers_status">المستخدمين</string>
<string name="label_release_notes">ملاحظات الإصدار</string>
<string name="label_licenses">الرخص</string>
<string name="label_browse">تصفح</string>
<string name="label_graphs">رسم بياني</string>
<string name="button_router_off">اضغط لفترة طويلة لبدء I2P</string>
<string name="button_router_on">I2P يعمل (اضغط لفترة طويلة لإيقافه)</string>
<string name="button_router_graceful">سيتم إغلاق I2P في %s</string>
<string name="button_shutdown_now">اضغط لفترة طويلة لوقفه الآن</string>
<string name="button_cancel_graceful">اضغط لفترة طويلة لإلغاء إيقاف التشغيل</string>
<string name="no_internet">لا يوجد اتصال متاح بالإنترنت </string>
<string name="hidden">مختفي</string>
<string name="testing">جاري التجريب</string>
<string name="firewalled">ممنوع من الجدار الناري</string>
<!--Parameter is a time, e.g. 32s or 2m-->
<string name="uptime">مدة الاشتغال</string>
<!--Character to indicate a client tunnel. Usually first letter of the word "client".-->
<string name="char_client_tunnel">C</string>
<!--Character to indicate a server tunnel. Usually first letter of the word "server".-->
<string name="char_server_tunnel">S</string>
<string name="download">تحميل</string>
<string name="upload">رفع</string>
<string name="first_start_title">تهانينا على تثبيتِ I2P!</string>
<string name="first_start_read">أثناء انتظارك، فضلا اطلع على ملاحظات الإصدار والصفحة الرئيسية</string>
<string name="action_search">بحث</string>
<string name="action_add">إضافة</string>
<string name="action_edit">تحرير</string>
<string name="action_delete">حذف</string>
<string name="action_reload">إعادة تحميل</string>
<string name="action_refresh">تحديث</string>
<string name="stats_not_ready">مدير الإحصاءات غير جاهز حاليا. يرجى المحاولة لاحقا</string>
<string name="routers">الموجه</string>
<string name="countries">بلدان</string>
<string name="country">البلد</string>
<string name="transport">نقل</string>
<string name="version">إصدار</string>
<string name="count">عدد</string>
<string name="tname_0">مختفي</string>
<string name="menu_settings">الإعدادات</string>
<string name="settings_enable">تفعيل</string>
<string name="settings_label_bandwidth">سرعة الاتصال</string>
<string name="settings_label_network">الشبكة</string>
<string name="settings_label_hiddenMode">المشاركة</string>
<string name="settings_label_logging">تسجيل</string>
<string name="settings_label_default_log_level">نوع السجل</string>
<string name="settings_label_appearance">المظهر</string>
<string name="settings_label_language">اللغة</string>
<string name="settings_default">افتراضي</string>
<string name="settings_label_advanced">متقدم</string>
<string name="settings_label_transports">نقل</string>
<string name="settings_label_expl_length">الطول</string>
<string name="settings_summ_expl_lengthVariance">نسبة %s</string>
<string name="settings_label_expl_quantity">الكمية</string>
<string name="settings_label_expl_backupQuantity">قدر نسخ الاحتياط</string>
<string name="menu_about">حول</string>
<string name="about_version">الإصدار:</string>
<string name="about_project">مركز المشروع:</string>
<string name="menu_help">المساعدة</string>
<string name="general">عام</string>
<string name="addressbook_add_wizard_k_name">الاسم</string>
<string name="addressbook_add_wizard_k_destination">اتجاه</string>
<string name="i2ptunnel_type_client">مستخدم عادي</string>
<string name="i2ptunnel_type_httpclient">HTTP client</string>
<string name="i2ptunnel_type_ircclient">IRC برنامج</string>
<string name="i2ptunnel_type_server">خادم عادي</string>
<string name="i2ptunnel_type_httpserver">HTTP خادم</string>
<string name="i2ptunnel_type_sockstunnel">SOCKS 4/4a/5 بروكسي</string>
<string name="i2ptunnel_type_socksirctunnel">SOCKS IRC بروكسي دردشة</string>
<string name="i2ptunnel_type_connectclient">اتصال/SSL/HTTPS بروكسي</string>
<string name="i2ptunnel_type_ircserver">IRC خادم</string>
<string name="i2ptunnel_new_tunnel">نفق جديد</string>
<string name="i2ptunnel_msg_config_saved">تم حفظ الإعدادات</string>
<string name="i2ptunnel_msg_config_save_failed">فشل حفظ الإعدادات</string>
<string name="i2ptunnel_msg_tunnel_starting">ابدأ النفق</string>
<string name="i2ptunnel_msg_tunnel_stopping">توقيف النفق</string>
<string name="i2ptunnel_wizard_k_client_server">المستخدم أو الخادم</string>
<string name="i2ptunnel_wizard_k_name">الاسم</string>
<string name="i2ptunnel_wizard_k_desc">وصف</string>
<string name="i2ptunnel_wizard_k_dest">اتجاه</string>
<string name="i2ptunnel_wizard_k_outproxies">بروكسي خارجي</string>
<string name="i2ptunnel_wizard_k_auto_start">تشغيل آلي</string>
<string name="next">التالي</string>
<string name="prev">السابق</string>
<string name="finish">رفع</string>
<string name="review">مراجعة</string>
<string name="enabled">مفعل</string>
<string name="i2ptunnel_view_target">الهدف</string>
<string name="i2ptunnel_view_autostart">تشغيل آلي</string>
<string name="name">الاسم</string>
<string name="description">وصف</string>
<string name="auto_start">تشغيل آلي</string>
<string name="outproxies">بروكسي خارجي</string>
<string name="irc">IRC</string>
<string name="use_ssl">استعمل SSL</string>
<string name="profile">بروفايل</string>
<string name="access_control">سيطرة الوصول</string>
<string name="disabled">معطل</string>
<string name="whitelist">قائمة بيضاء</string>
<string name="blacklist">قائمة سوداء</string>
<string name="unlimited">غير محدود</string>
<string name="tunnel_summ_delay_open">عطل النفق حتى الحاجة اليه</string>
<string name="tunnel_summ_reduce_quantity">قلل قدر الأنفاق عند الانتظار</string>
<string name="num_minutes">%sدقائق </string>
<string name="close_tunnels">قفل النفق عند الانتظار</string>
<string name="http_client">HTTP client</string>
<string name="username">اسم المستخدم</string>
<string name="password">كلمة السر</string>
<string name="other">أخرى</string>
<string name="custom_options">خيارات خاصة</string>
<string name="all">الكل</string>
<string name="no_messages">لا رسائل</string>
</resources>

View File

@ -145,7 +145,6 @@
<string name="settings_label_transports">Nəqliyyatlar</string>
<string name="settings_label_maxConns">Maksimum əlaqələr</string>
<string name="settings_label_i2cp">I2CP interfeysi</string>
<string name="settings_desc_i2cp">7654 portunda dinlə</string>
<string name="settings_label_exploratory_pool">Axtarış hovuzu</string>
<string name="settings_desc_exploratory_pool">Tunel parametrləri</string>
<string name="settings_label_expl_inbound">Daxil olan tunellər</string>
@ -170,7 +169,6 @@
<string name="about_bugs">Xətalar və dəstək:</string>
<string name="about_helpwanted">Yardıma ehtiyac var!</string>
<string name="about_volunteer">Proqramı yaxşılaşdırmaq istəyirsiniz? Android forumunda könüllü:</string>
<string name="about_donate">İnkişaf və sınaq üçün daha çox Android qurğusunun alınmasına pul və ya bitkoyn bağışlamaq istəyirsiniz? Keç:</string>
<string name="menu_help">Kömək</string>
<string name="general">Əsas</string>
<string name="label_router">İctimai ünvanlar</string>
@ -231,7 +229,6 @@
<string name="enabled">Aktivdir</string>
<string name="i2ptunnel_wizard_desc_name"> Tunel siyahısında müəyyənləşdirilməsi üçün tunel adı.</string>
<string name="i2ptunnel_wizard_desc_desc">Tunelin təsviri. Bu, istəkdən asılıdır və tamamilə informativdir.</string>
<string name="i2ptunnel_wizard_desc_dest">Bu müştəri tunelinə bağlanacaq xidmətin İ2P hədəfinə yazın. Bu, tam əsaslı 64 hədəf açarı və ya ünvan kitabından bir İ2P hostun adı ola bilər. </string>
<string name="i2ptunnel_wizard_desc_outproxies">Bu növ tunel (HTTP və ya SOCKS) üçün hər hansı bir outproxies bilirsinizsə, onları doldurun. Proksiləri vergül vasitəsilə ayırın. </string>
<string name="i2ptunnel_wizard_desc_target_host">Bu, xidmətinizin işlədiyi IP-dir, adətən eyni alətdə olduğundan 127.0.0.1 avtomatik olaraq doldurulur.</string>
<string name="i2ptunnel_wizard_desc_target_port">Bu, xidmət əlaqələrini qəbul edən portdur.</string>

View File

@ -132,7 +132,6 @@
<string name="settings_label_transports">Transports</string>
<string name="settings_label_maxConns">Màx. connexions</string>
<string name="settings_label_i2cp">Interfície I2CP</string>
<string name="settings_desc_i2cp">Escoltar el port 7654</string>
<string name="settings_label_exploratory_pool">Piscina exploratòria</string>
<string name="settings_desc_exploratory_pool">Paràmetres del túnel</string>
<string name="settings_label_expl_inbound">Túnels d\'entrada</string>
@ -214,8 +213,10 @@
<string name="http_client">Client HTTP</string>
<string name="username">Nom d\'usuari</string>
<string name="password">Contrasenya</string>
<string name="other">Altres</string>
<string name="signature_type">Tipus de signatura</string>
<string name="custom_options">Opcions personalitzades</string>
<string name="all">Tots</string>
<string name="no_messages">Sense missatges</string>
<string name="copy_logs">Copia registres</string>
<string name="i2p_android_error_logs">Registres d\'error d\'I2P Android</string>

View File

@ -0,0 +1,128 @@
<?xml version='1.0' encoding='UTF-8'?>
<resources>
<string name="app_name">I2P</string>
<string name="desc_i2p_logo">I2P logo</string>
<string name="welcome_new_install">Vítejte v I2P! Tato aplikace je ALPHA software a neposkytuje silnou anonymitu. Prosím přečtěte si poznámky k verzi a informace o licenci.</string>
<string name="welcome_new_version">Nová verze aktualizována. Prosím přečtěte si poznámky k verzi. Verze:</string>
<string name="label_tunnels">Tunely</string>
<string name="label_status">Status</string>
<string name="label_addresses">Adresy</string>
<string name="label_addressbook">Adresář</string>
<string name="label_i2ptunnel_client">Tunely klienta</string>
<string name="label_i2ptunnel_server">Tunely serveru</string>
<string name="label_logs">Záznamy</string>
<string name="label_error_logs">Záznamy chyb</string>
<string name="label_news">Novinky</string>
<string name="label_peers_status">Peery</string>
<string name="label_release_notes">Poznámky k verzi</string>
<string name="label_licenses">Licence</string>
<string name="label_browse">Procházet</string>
<string name="label_graphs">Grafy</string>
<string name="button_router_off">Dlouze stiskněte pro spuštění I2P</string>
<string name="button_router_on">I2P běží (dlouze stiskněte pro zastavení)</string>
<string name="hidden">Skryté</string>
<string name="testing">Testování</string>
<string name="firewalled">Firewalled</string>
<string name="symmetric_nat">Symetrický NAT</string>
<!--Parameter is a time, e.g. 32s or 2m-->
<string name="uptime">Dostupnost</string>
<!--Character to indicate a client tunnel. Usually first letter of the word "client".-->
<string name="char_client_tunnel">C</string>
<!--Character to indicate a server tunnel. Usually first letter of the word "server".-->
<string name="char_server_tunnel">B</string>
<string name="download">Stáhnout</string>
<string name="upload">Nahrát</string>
<string name="first_start_title">Gratulujeme k nainstalování I2P!</string>
<string name="first_start_welcome"><b>Vítejte v I2P\'</b>Prosíme<b>buďte trpěliví</b> dokud I2P nenastartuje a najde peery.</string>
<string name="first_start_read">Během čekání si prosím přečtěte poznámky k verzi a úvodní stránku.</string>
<string name="first_start_faq">Jakmile budete mít klientské tunely, prosíme <b>podívejte se</b> na naše FAQ:</string>
<string name="first_start_faq_nonanon">Nebo použijte neanonymní link pokud nechcete čekat na tunely:</string>
<string name="first_start_irc">Nasměrujte svého IRC klienta na <b>localhost:6668</b> a pozdravte nás na:</string>
<string name="action_search">Hledat</string>
<string name="action_add">Přidat</string>
<string name="action_edit">Editovat</string>
<string name="action_delete">Smazat</string>
<string name="action_i2ptunnel_start">Zapnout tunel</string>
<string name="action_i2ptunnel_stop">Vypnout tunel</string>
<string name="action_i2ptunnel_start_all">Zapnout všechny tunely</string>
<string name="action_i2ptunnel_stop_all">Vypnout všechny tunely</string>
<string name="action_i2ptunnel_restart_all">Restartovat všechny tunely</string>
<string name="action_reload">Načíst znovu</string>
<string name="action_refresh">Obnovit</string>
<string name="hint_search_addressbook">Prohledat adresář</string>
<string name="action_reload_subscriptions">Znovu načíst odběry</string>
<string name="router_not_running">Tento router nepracuje</string>
<string name="stats_not_ready">Manažer statistik ještě není připraven. Zkuste to prosím později.</string>
<string name="no_graphs_configured">Žádné grafy nebyly konfigurovány. Můžete si vybrat převod statistik do grafů v menu nastavení. Jakékoliv změny se projeví po 60 sekundách.</string>
<string name="configure_graphs">Konfigurovat grafy</string>
<string name="country">Země</string>
<string name="version">Verze</string>
<string name="count">Počet</string>
<string name="netdb_routers_empty">Žádné routery ve vaší NetDB</string>
<string name="netdb_leases_empty">Žádné LeaseSets ve vaší NetDB</string>
<string name="menu_settings">Nastavení</string>
<string name="settings_enable">Zapnout</string>
<string name="settings_label_bandwidth">Šířka pásma</string>
<string name="settings_label_network">Síť</string>
<string name="settings_label_hiddenMode">Participace</string>
<string name="settings_dialog_sharePercent">Procento šířky pásma ke sdílení</string>
<string name="settings_label_logging">Logování</string>
<string name="settings_label_appearance">Podoba</string>
<string name="settings_label_language">Jazyk</string>
<string name="settings_default">Výchozí</string>
<string name="settings_label_advanced">Pokročilé</string>
<string name="settings_label_expl_length">Délka</string>
<string name="settings_summ_expl_lengthVariance">%s</string>
<string name="menu_about">O programu</string>
<string name="about_version">Version:</string>
<string name="menu_help">Pomoc</string>
<string name="general">Hlavní</string>
<string name="addressbook_add_wizard_k_name">Jméno</string>
<string name="addressbook_add_wizard_k_destination">Cíl</string>
<string name="i2ptunnel_type_client">Standardní klient</string>
<string name="i2ptunnel_type_httpclient">Klient pro HTTP</string>
<string name="i2ptunnel_type_ircclient">Klient pro IRC</string>
<string name="i2ptunnel_type_server">Standardní server</string>
<string name="i2ptunnel_type_httpserver">HTTP server</string>
<string name="i2ptunnel_type_sockstunnel">SOCKS 4/4a/5 proxy</string>
<string name="i2ptunnel_type_socksirctunnel">SOCKS IRC proxy</string>
<string name="i2ptunnel_type_connectclient">CONNECT/SSL/HTTPS proxy</string>
<string name="i2ptunnel_type_ircserver">IRC server</string>
<string name="i2ptunnel_type_streamrclient">Streamr klient</string>
<string name="i2ptunnel_type_streamrserver">Streamr server</string>
<string name="i2ptunnel_type_httpbidirserver">HTTP bidir</string>
<string name="i2ptunnel_new_tunnel">Nový tunel</string>
<string name="i2ptunnel_msg_config_saved">Změny nastavení byly uloženy</string>
<string name="i2ptunnel_msg_config_save_failed">Nepodařilo se uložit nastavení</string>
<string name="i2ptunnel_msg_tunnel_starting">Startuji tunel</string>
<string name="i2ptunnel_msg_tunnel_stopping">Zastavuji tunel</string>
<string name="i2ptunnel_wizard_k_name">Jméno</string>
<string name="i2ptunnel_wizard_k_desc">Popis</string>
<string name="i2ptunnel_wizard_k_dest">Cíl</string>
<string name="i2ptunnel_wizard_k_outproxies">Výstupní proxy (Outproxies)</string>
<string name="next">Další</string>
<string name="prev">Předchozí</string>
<string name="finish">Předložit</string>
<string name="review">Revidovat</string>
<string name="enabled">Povoleno</string>
<string name="i2ptunnel_view_target">Cíl</string>
<string name="name">Jméno</string>
<string name="description">Popis</string>
<string name="outproxies">Výstupní proxy (Outproxies)</string>
<string name="use_ssl">Použít SSL</string>
<string name="profile">Profil</string>
<string name="access_control">Řízení přístupu</string>
<string name="disabled">Vypnuto</string>
<string name="whitelist">Seznam povolených (whitelist)</string>
<string name="blacklist">Seznam zakázaných (blacklist)</string>
<string name="tunnel_summ_delay_open">Zpozdit otevření tunelu dokud není vyžadováno</string>
<string name="tunnel_summ_reduce_quantity">Snížit kvantitu při nečinnosti</string>
<string name="close_tunnels">Zavřít tunely při nečinnosti</string>
<string name="http_client">Klient pro HTTP</string>
<string name="username">Uživatelské jméno</string>
<string name="password">Heslo</string>
<string name="other">Další</string>
<string name="custom_options">Vlastní možnosti</string>
<string name="all">Vše</string>
<string name="no_messages">Žádné zprávy</string>
</resources>

View File

@ -0,0 +1,95 @@
<?xml version='1.0' encoding='UTF-8'?>
<resources>
<string name="label_tunnels">Tunneler</string>
<string name="label_status">Status</string>
<string name="label_addressbook">Adressebog</string>
<string name="label_logs">Logs</string>
<string name="label_news">Nyheder</string>
<string name="label_peers_status">Peers</string>
<string name="label_release_notes">Udgivelsesnoter</string>
<string name="label_browse">Brows</string>
<string name="label_graphs">Grafer</string>
<string name="hidden">Gemt</string>
<string name="testing">Tester</string>
<string name="firewalled">Firewalled</string>
<string name="symmetric_nat">Symmetric NAT</string>
<!--Parameter is a time, e.g. 32s or 2m-->
<string name="uptime">Oppetid</string>
<!--Character to indicate a client tunnel. Usually first letter of the word "client".-->
<string name="char_client_tunnel">C</string>
<!--Character to indicate a server tunnel. Usually first letter of the word "server".-->
<string name="char_server_tunnel">S</string>
<string name="download">Hente</string>
<string name="upload">Upload</string>
<string name="action_search">Søg</string>
<string name="action_add">Tilføje</string>
<string name="action_edit">Ændre</string>
<string name="action_delete">Slet</string>
<string name="action_reload">Genindlæs</string>
<string name="action_refresh">Genopfrisk</string>
<string name="statistics">Statistik</string>
<string name="routers">Routere</string>
<string name="leasesets">LeaseSets</string>
<string name="country">Land</string>
<string name="transport">Transport</string>
<string name="version">Version</string>
<string name="count">Antal</string>
<string name="tname_0">Gemt eller under opstart</string>
<string name="menu_settings">Indstillinger</string>
<string name="settings_enable">Aktiver</string>
<string name="settings_label_bandwidth">Båndbredde</string>
<string name="settings_label_network">Netværk</string>
<string name="settings_label_logging">Logning</string>
<string name="settings_label_default_log_level">Standard log niveau</string>
<string name="settings_label_appearance">Udseende</string>
<string name="settings_label_language">Sprog</string>
<string name="settings_default">Standard</string>
<string name="settings_label_advanced">Avanceret</string>
<string name="settings_label_transports">Transporter</string>
<string name="settings_label_expl_length">Længde</string>
<string name="settings_label_expl_quantity">Mængde</string>
<string name="settings_label_expl_backupQuantity">Reserve mængde</string>
<string name="menu_about">Om</string>
<string name="about_version">Version:</string>
<string name="menu_help">Hjælp</string>
<string name="general">Genarelt </string>
<string name="addressbook_add_wizard_k_name">Navn</string>
<string name="addressbook_add_wizard_k_destination">Destination</string>
<string name="i2ptunnel_type_client">Standard klient</string>
<string name="i2ptunnel_type_httpclient">HTTP klient</string>
<string name="i2ptunnel_type_ircclient">Klient for IRC</string>
<string name="i2ptunnel_type_server">Standard server</string>
<string name="i2ptunnel_type_httpserver">HTTP server</string>
<string name="i2ptunnel_type_sockstunnel">SOCKS 4/4a/5 proxy</string>
<string name="i2ptunnel_type_socksirctunnel">SOCKS IRC proxy</string>
<string name="i2ptunnel_type_connectclient">CONNECT/SSL/HTTPS proxy</string>
<string name="i2ptunnel_type_ircserver">Server for IRC</string>
<string name="i2ptunnel_type_streamrclient">Klient for Streamr</string>
<string name="i2ptunnel_type_streamrserver">Server for Streamr</string>
<string name="i2ptunnel_type_httpbidirserver">HTTP bidir</string>
<string name="i2ptunnel_new_tunnel">Ny Tunnel</string>
<string name="i2ptunnel_msg_config_saved">Konfiguration ændringer gemt</string>
<string name="i2ptunnel_msg_config_save_failed">Det mislykkedes at gemme konfigurationen</string>
<string name="i2ptunnel_msg_tunnel_starting">Starter tunnel</string>
<string name="i2ptunnel_msg_tunnel_stopping">Stopper tunnel</string>
<string name="i2ptunnel_wizard_k_name">Navn</string>
<string name="i2ptunnel_wizard_k_desc">Beskrivelse</string>
<string name="i2ptunnel_wizard_k_dest">Destination</string>
<string name="next">Næste</string>
<string name="prev">Foregående</string>
<string name="finish">Indsend</string>
<string name="review">Gennemgå</string>
<string name="enabled">Aktiveret</string>
<string name="i2ptunnel_view_target">Mål</string>
<string name="name">Navn</string>
<string name="description">Beskrivelse</string>
<string name="use_ssl">Brug SSL</string>
<string name="profile">Profil</string>
<string name="access_control">Adgangskontrol</string>
<string name="disabled">Deaktiveret</string>
<string name="http_client">HTTP klient</string>
<string name="username">Brugernavn</string>
<string name="password">Adgangskode</string>
<string name="other">Andet</string>
<string name="all">Alle</string>
</resources>

View File

@ -10,7 +10,7 @@
<string name="label_console">Konsole</string>
<string name="label_addresses">Adressen</string>
<string name="label_addressbook">Adressbuch</string>
<string name="label_i2ptunnel_client">Client Tunnel</string>
<string name="label_i2ptunnel_client">Clienttunnel</string>
<string name="label_i2ptunnel_server">Servertunnel</string>
<string name="label_logs">Statusberichte</string>
<string name="label_error_logs">Fehlerprotokolle</string>
@ -30,7 +30,7 @@
<string name="testing">Im Test</string>
<string name="firewalled">Durch Firewall geschützt</string>
<string name="symmetric_nat">Symmetrisches NAT</string>
<string name="net_status_error_i2cp">Klientenmanager I2CP Fehler - bitte Fehlerberichte überprüfen</string>
<string name="net_status_error_i2cp">Clientmanager I2CP Fehler - bitte Fehlerberichte überprüfen</string>
<!--Parameter is a time, e.g. 32s or 2m-->
<string name="net_status_error_skew">Zeitabweichung von %s</string>
<string name="net_status_error_unresolved_tcp">Nicht aufgelöste TCP-Adresse</string>
@ -42,7 +42,7 @@
<string name="net_status_error_no_active_peers">Keine aktiven Teilnehmer - überprüfen Sie die Netzwerkverbindung und Firewall</string>
<string name="net_status_error_udp_disabled_tcp_not_set">UDP deaktiviert und eingehender TCP-Host/Port nicht festgelegt</string>
<string name="net_status_warn_firewalled_udp_disabled">Mit Firewall und deaktiviertem UDP</string>
<string name="shared_clients">Mehrere Klienten</string>
<string name="shared_clients">Mehrere Clients</string>
<string name="uptime">Betriebszeit</string>
<string name="active_peers">Aktive Teilnehmer</string>
<string name="known_peers">Bekannte Teilnehmer</string>
@ -55,12 +55,14 @@
<string name="upload">Hochladen</string>
<string name="configure_browser_title">Browser konfigurieren?</string>
<string name="configure_browser_for_i2p">Möchten Sie einen Browser zum Betrachten von I2P-Seiten einrichten? (Sie können dieses auch später noch im Hilfe-Menü erledigen).</string>
<string name="configure_no_doze_title">Batterie Optimierung managen?</string>
<string name="configure_no_doze">I2P funktioniert am besten, wenn es dauerhaft läuft. Um Android davon abzuhalten, I2P zu schließen, um Energie zu sparen, solltest du es zur Ausnahmeliste der Energiesparfunktionen hinzufügen. Dies sollte die Zuverlässigkeit des Programms \n\nKeep I2P massgeblich verbessern (empfohlen).</string>
<string name="first_start_title">Herzlichen Glückwunsch, Sie haben I2P installiert!</string>
<string name="first_start_welcome"><b>Willkommen im I2P</b> Bitte <b>haben Sie Geduld</b>, während I2P startet und Teilnehmer findet.</string>
<string name="first_start_read">Lesen Sie bitte die Veröffentlichungshinweise und die Startseite während Sie warten.</string>
<string name="first_start_faq">Sobald Sie Kliententunnels haben, <b>lesen</b> Sie bitte unsere FAQ:</string>
<string name="first_start_faq_nonanon">Oder verwenden Sie unsere nicht-anonymen Links, wenn Sie nicht auf die Tunnel warten wollen.</string>
<string name="first_start_irc">Verbinden Sie Ihren IRC-Klienten mit <b>localhost:6668</b> und schauen Sie bei uns vorbei:</string>
<string name="first_start_faq">Sobald Sie Clienttunnel haben, <b>lesen</b> Sie bitte unsere FAQ:</string>
<string name="first_start_faq_nonanon">Oder verwenden Sie unseren nicht-anonymen Link, wenn Sie nicht auf die Tunnel warten wollen:</string>
<string name="first_start_irc">Verbinden Sie Ihren IRC-Client mit <b>localhost:6668</b> und schauen Sie bei uns vorbei:</string>
<string name="action_search">Suche</string>
<string name="action_add">Hinzufügen</string>
<string name="action_edit">Bearbeiten</string>
@ -102,8 +104,8 @@
<string name="notification_status_waiting">I2P wartet auf eine Netzwerkverbindung</string>
<string name="notification_status_starting_after_waiting">Netzwerk verbunden, I2P wird gestartet</string>
<string name="notification_status_running">I2P läuft</string>
<string name="notification_status_client_ready">Client-Tunnel sind bereit</string>
<string name="notification_status_client_down">Client-Tunnel sind außer Betrieb</string>
<string name="notification_status_client_ready">Clienttunnel sind bereit</string>
<string name="notification_status_client_down">Clienttunnel sind außer Betrieb</string>
<string name="notification_status_graceful">I2P wird in %s gestoppt</string>
<string name="notification_status_stopping">I2P wird gestoppt</string>
<string name="notification_status_stopping_after_net">Netzwerk getrennt, I2P wird gestoppt</string>
@ -112,13 +114,16 @@
<string name="notification_status_bw">Bandbreite: %1$sB/s eingehend / %2$sB/s ausgehend</string>
<string name="notification_status_peers">Teilnehmer: %1$d aktiv, %2$d bekannt</string>
<string name="notification_status_expl">Erkundungstunnel: %1$d/%2$d</string>
<string name="notification_status_client">Kliententunnel: %1$d/%2$d</string>
<string name="notification_status_client">Clienttunnel: %1$d/%2$d</string>
<string name="stats_delay">Nachrichtenverzögerung</string>
<string name="copied_base32_system_notification_title">Base32 in die Zwischenablage kopiert</string>
<string name="copied_base32_system_notification_body">Die Adresse Ihres I2P-Tunnels wurde in die Zwischenablage kopiert.</string>
<string name="menu_settings">Einstellungen</string>
<string name="settings_enable">Erlauben</string>
<string name="settings_desc_subscriptions">Abonnements-URLs</string>
<string name="settings_label_bandwidth_net">Bandbreite und Netzwerk</string>
<string name="settings_label_startOnBoot">Beim booten I2P starten</string>
<string name="settings_desc_startOnBoot">Automatisch zu I2P verbinden wenn dieses Android Gerät startet</string>
<string name="settings_label_startOnBoot">Beim Booten I2P starten</string>
<string name="settings_desc_startOnBoot">Automatisch zu I2P verbinden wenn dieses Android-Gerät startet</string>
<string name="settings_label_bandwidth">Bandbreite</string>
<string name="settings_label_bw_inbound">Eingehende Übertragungsgeschwindigkeit</string>
<string name="settings_desc_bw_inbound">Maximale eingehende Übertragungsgeschwindigkeit</string>
@ -145,7 +150,13 @@
<string name="settings_label_transports">Übertragungen</string>
<string name="settings_label_maxConns">Max. Verbindungen</string>
<string name="settings_label_i2cp">I2CP-Benutzeroberfläche</string>
<string name="settings_desc_i2cp">Auf Port 7654 lauschen</string>
<string name="settings_desc_i2cp">Apps von Drittanbietern die Erstellung von Tunneln über I2CP erlauben (erfordert einen Neustart des Routers)</string>
<string name="settings_label_sam">SAM-Schnittstelle</string>
<string name="settings_desc_sam">Apps von Drittanbietern die Erstellung von Tunneln mit SAM erlauben (erfordert einen Neustart des Routers)</string>
<string name="settings_confirm_sam">Eine Anwendung versucht, eine SAM-Verbindung herzustellen.</string>
<string name="settings_confirm_sam_id">Verbindungsname/-kennung:</string>
<string name="settings_confirm_allow_sam">Zum Erlauben antippen</string>
<string name="settings_confirm_deny_sam">Zum Verweigern ignorieren</string>
<string name="settings_label_exploratory_pool">Satz an Erkundungstunneln</string>
<string name="settings_desc_exploratory_pool">Tunnelparameter</string>
<string name="settings_label_expl_inbound">Eingehende Tunnel</string>
@ -170,7 +181,6 @@
<string name="about_bugs">Fehlermeldungen und Unterstützung:</string>
<string name="about_helpwanted">Unterstützer gesucht!!</string>
<string name="about_volunteer">Sie wollen mithelfen, die App besser zu machen? Dann schauen Sie in das Android-Forum:</string>
<string name="about_donate">Sie wollen Geld oder Bitcoins spenden, damit wir mehr Android-Geräte zum Entwickeln und Testen kaufen können? Gehen Sie auf:</string>
<string name="menu_help">Hilfe</string>
<string name="general">Allgemein</string>
<string name="label_router">Öffentliche Adressen</string>
@ -186,22 +196,22 @@
<string name="nsu_iae_cannot_end_with">Hostnamen dürfen nicht auf \"%s\" enden</string>
<string name="nsu_iae_cannot_contain">Hostnamen dürfen kein \"%s\" beinhalten</string>
<string name="nsu_iae_requires_conversion">Hostname \"%s\" muss nach ASCII konvertiert werden, aber die Konvertierungsbibliothek ist in deiner Android-Version nicht verfügbar.</string>
<string name="i2ptunnel_type_client">Standardklient</string>
<string name="i2ptunnel_type_httpclient">HTTP-Klient</string>
<string name="i2ptunnel_type_ircclient">IRC-Klient</string>
<string name="i2ptunnel_type_client">Standardclient</string>
<string name="i2ptunnel_type_httpclient">HTTP-Client</string>
<string name="i2ptunnel_type_ircclient">IRC-Client</string>
<string name="i2ptunnel_type_server">Standard-Server</string>
<string name="i2ptunnel_type_httpserver">HTTP-Server</string>
<string name="i2ptunnel_type_sockstunnel">SOCKS-4/4a/5-Proxy</string>
<string name="i2ptunnel_type_socksirctunnel">SOCKS IRC-Proxy</string>
<string name="i2ptunnel_type_connectclient">CONNECT/SSL/HTTPS-Proxy</string>
<string name="i2ptunnel_type_ircserver">IRC-Server</string>
<string name="i2ptunnel_type_streamrclient">Streamr-Klient</string>
<string name="i2ptunnel_type_streamrclient">Streamr-Client</string>
<string name="i2ptunnel_type_streamrserver">Streamr-Server</string>
<string name="i2ptunnel_type_httpbidirserver">HTTP bidirektional</string>
<string name="install_recommended_app">Empfohlene App installieren?</string>
<string name="app_needed_for_this_tunnel_type">Sie müssen eine App installieren, um diesen Tunnel nutzen zu können. Möchten Sie die empfohlene App installieren?</string>
<string name="i2ptunnel_not_initialized">Tunnel sind noch nicht initialisiert. Bitte laden Sie die Seite in zwei Minuten erneut.</string>
<string name="no_configured_client_tunnels">Keine konfigurierten Client-Tunnel.</string>
<string name="no_configured_client_tunnels">Keine konfigurierten Clienttunnel.</string>
<string name="no_configured_server_tunnels">Keine konfigurierten Server-Tunnel.</string>
<string name="i2ptunnel_new_tunnel">Neuer Tunnel</string>
<string name="i2ptunnel_msg_config_saved">Änderungen gespeichert</string>
@ -211,8 +221,8 @@
<string name="i2ptunnel_delete_confirm_message">Tunnel löschen?</string>
<string name="i2ptunnel_delete_confirm_button">Tunnel löschen</string>
<string name="i2ptunnel_no_tunnel_details">Tunneldetails konnten nicht geladen werden</string>
<string name="i2ptunnel_wizard_k_client_server">Klient oder Server</string>
<string name="i2ptunnel_wizard_v_client">Kliententunnel</string>
<string name="i2ptunnel_wizard_k_client_server">Client oder Server</string>
<string name="i2ptunnel_wizard_v_client">Clienttunnel</string>
<string name="i2ptunnel_wizard_v_server">Servertunnel</string>
<string name="i2ptunnel_wizard_k_type">Tunneltyp</string>
<string name="i2ptunnel_wizard_k_name">Name</string>
@ -231,12 +241,11 @@
<string name="enabled">Aktiviert</string>
<string name="i2ptunnel_wizard_desc_name">Der Name des Tunnels zur Erkennung in der Tunnelliste.</string>
<string name="i2ptunnel_wizard_desc_desc">Eine optionale, aber für Sie aussagekräftige Beschreibung des Tunnels.</string>
<string name="i2ptunnel_wizard_desc_dest">Tragen Sie das I2P Ziel des Dienstes ein, zu welchem sich dieser Klient-Tunnel verbinden soll. Dies kann ein kompletter Base 64 Ziel-Schlüssel oder ein I2P Hostname von Ihrem Adressbuch sein.</string>
<string name="i2ptunnel_wizard_desc_outproxies">Falls Sie Ausgangsproxies für diese Tunnelart kennen (entweder HTTP oder SOCKS), geben Sie sie hier ein. Trennen Sie mehrere Proxies mit Kommas.</string>
<string name="i2ptunnel_wizard_desc_target_host">Das ist die IP, unter der der Dienst erreichbar ist. Normalerweise ist er auf der gleichen Maschine, also wird 127.0.0.1 automatisch ausgefüllt.</string>
<string name="i2ptunnel_wizard_desc_target_port">Dies ist der Port, unter dem der Dienst erreichbar ist.</string>
<string name="i2ptunnel_wizard_desc_reachable_on">Dies legt fest, welche Computer oder Smartphones den Tunnel erreichen können.</string>
<string name="i2ptunnel_wizard_desc_binding_port">Dies ist der Port, über den der Klient den Tunnel lokal erreichen kann. Das ist auch der Klient-Port des bidirektionalen HTTP-Server-Tunnels.</string>
<string name="i2ptunnel_wizard_desc_binding_port">Dies ist der Port, auf dem der Client auf den Tunnel lokal zugreifen kann. Das ist auch der Client-Port des bidirektionalen HTTP-Servertunnels.</string>
<string name="i2ptunnel_wizard_desc_auto_start">Soll der Tunnel automatisch mit dem Router starten?</string>
<string name="i2ptunnel_wizard_submit_confirm_message">Tunnel erstellen?</string>
<string name="i2ptunnel_wizard_submit_confirm_button">Tunnel erstellen</string>
@ -250,8 +259,8 @@
<string name="auto_start">Automatischer Start</string>
<string name="tunnel_summ_auto_start">Tunnel mit dem Router starten.</string>
<string name="tunnel_cat_ports">Lokale Ports</string>
<string name="shared_client">Gemeinsamer Klient</string>
<string name="tunnel_summ_shared_client">Benutzt die selbe Destiantion und Tunnel wie andere geteilte Klienten </string>
<string name="shared_client">Gemeinsamer Client</string>
<string name="tunnel_summ_shared_client">Benutzt dasselbe Ziel und denselben Tunnel wie andere geteilte Clients</string>
<string name="target_destination">Zielort</string>
<string name="persistent_key">Persistenter Schlüssel</string>
<string name="persistent_key_conflict_title">Neue Schlüssel beim erneuten Öffnen deaktivieren?</string>
@ -259,13 +268,13 @@
<string name="tunnel_summ_persistent_key">Ziel des Tunnels bei einem Neustart beibehalten</string>
<string name="reachable_on">Erreichbarkeit ein</string>
<string name="listen_port">Lauschport</string>
<string name="client_ssl">Klient-SSL</string>
<string name="tunnel_summ_client_ssl">Klienten müssen SSL zum Verbinden verwenden</string>
<string name="client_ssl">Client-SSL</string>
<string name="tunnel_summ_client_ssl">Clients müssen mit SSL verbinden</string>
<string name="outproxies">Ausgangsproxies</string>
<string name="ssl_outproxies">SSL-Ausgangsproxies</string>
<string name="irc">IRC</string>
<string name="enable_dcc">DCC aktivieren</string>
<string name="tunnel_summ_enable_dcc">IRC-Klienten die Verwendung von DCC erlauben</string>
<string name="tunnel_summ_enable_dcc">IRC-Clients die Verwendung von DCC erlauben</string>
<string name="website_domain_name">Webseiten-Domainname</string>
<string name="target_host">Zielhost</string>
<string name="target_port">Zielport</string>
@ -289,7 +298,7 @@
<string name="tunnel_summ_unique_local">Verwenden Sie eindeutige localhost-IPs für jeden Client</string>
<string name="multihome">Multihome</string>
<string name="tunnel_summ_multihome">Aktiviere Optimierungen fürs Multihoming</string>
<string name="client_connection_limits">Klient-Verbindungsbegrenzungen</string>
<string name="client_connection_limits">Client-Verbindungsbegrenzungen</string>
<string name="connections_per_minute">Verbindungen pro Minute</string>
<string name="connections_per_hour">Verbindungen pro Stunde</string>
<string name="connections_per_day">Verbindungen pro Tag</string>
@ -306,7 +315,7 @@
<string name="post_limits">POST-Begrenzungen</string>
<string name="limit_period">Zeitabschnitt begrenzen</string>
<string name="client_posts_per_period">Client-POSTs pro Zeitabschnitt</string>
<string name="client_ban_length">Länge der Bannzeit für Klienten</string>
<string name="client_ban_length">Länge der Bannzeit für Clients</string>
<string name="total_posts_per_period">Gesamte POSTs pro Zeitabschnitt</string>
<string name="total_ban_length">Totale Bannzeit</string>
<string name="power_saving">Energie sparen</string>
@ -321,7 +330,7 @@
<string name="new_keys_on_reopen">Neue Schlüssel beim erneuten Öffnen</string>
<string name="new_keys_on_reopen_conflict_title">Permanente Schlüssel deaktivieren?</string>
<string name="new_keys_on_reopen_conflict_msg">Sie können die Funktion \"Neue Schlüssel beim Start des Tunnels\" nicht nutzen während \"dauerhafter Schlüssel\" aktiviert ist. Möchten Sie \"dauerhafter Schlüssel\" deaktivieren?</string>
<string name="http_client">HTTP-Klient</string>
<string name="http_client">HTTP-Client</string>
<string name="tunnel_summ_user_agent">\"Benutzer-Agent\"-Kopfzeile durchleiten</string>
<string name="tunnel_summ_referer">\"Referer\"-Kopfzeile durchleiten</string>
<string name="tunnel_summ_accept">\"Accept-*\"-Kopfzeilen durchleiten</string>
@ -356,4 +365,5 @@
<string name="label_browser_configuration">Browserkonfiguration</string>
<string name="no_market_app">Keine angebotene App gefunden, bitte manuell installieren.</string>
<string name="unset">Deaktivieren</string>
<string name="running_background">I2P läuft im Hintergrund</string>
</resources>

View File

@ -0,0 +1,102 @@
<?xml version='1.0' encoding='UTF-8'?>
<resources>
<string name="app_name">I2P</string>
<string name="desc_i2p_logo">I2P λογότυπο</string>
<string name="choose_language">Επιλογή Γλώσσας</string>
<string name="label_tunnels">Τούνελ</string>
<string name="label_status">Κατάσταση</string>
<string name="label_console">Κονσόλα</string>
<string name="label_addresses">Διεύθυνσεις</string>
<string name="label_addressbook">Βιβλίο Διεθύνσεων</string>
<string name="label_logs">Εγγραφές</string>
<string name="label_error_logs">Λάθη Εγγραφών</string>
<string name="label_news">Νέα</string>
<string name="label_peers_status">Ομότιμοι</string>
<string name="label_release_notes">Σημειώσεις έκδοσης</string>
<string name="label_licenses">Αδειες</string>
<string name="label_browse">Περιήγηση</string>
<string name="label_graphs">Γραφήματα</string>
<string name="hidden">κρυμμένο</string>
<string name="testing">Δοκιμάζει</string>
<string name="symmetric_nat">Συμμετρικό NAT</string>
<!--Parameter is a time, e.g. 32s or 2m-->
<string name="net_status_info_disconnected">Αποσυνδέθηκε-ελένξετε την σύνδεση Δικτύου</string>
<string name="uptime">Χρόνος λειτουργίας δικτύου</string>
<!--Character to indicate a client tunnel. Usually first letter of the word "client".-->
<string name="char_client_tunnel">C</string>
<!--Character to indicate a server tunnel. Usually first letter of the word "server".-->
<string name="char_server_tunnel">S</string>
<string name="download">Κατέβασμα</string>
<string name="upload">Ανέβασμα</string>
<string name="first_start_title">Συνχαριτήρια για την εγκατάσταση του I2P!</string>
<string name="action_search">Αναζήτηση</string>
<string name="action_add">Προσθήκη</string>
<string name="action_edit">Επεξεργασία</string>
<string name="action_delete">Διαγραφή</string>
<string name="action_i2ptunnel_start">Εκκίνηση τούνελ</string>
<string name="action_i2ptunnel_stop">Σταματημα τούνελ</string>
<string name="action_i2ptunnel_start_all">Εκκίνηση όλων των τούνελ</string>
<string name="action_i2ptunnel_stop_all">Σταματημα όλων των τούνελ</string>
<string name="action_i2ptunnel_restart_all">Επανεκκίνηση όλων των τούνελ</string>
<string name="action_reload">Επαναφόρτωση</string>
<string name="action_refresh">Ανανέωση</string>
<string name="hint_search_addressbook">Αναζήτηση βιβλίου διευθήνσεων</string>
<string name="news_updated">Νέα ανανεώθηκαν</string>
<string name="router_not_running">Ο ρούτερ δέν τρέχει.</string>
<string name="select_an_address">Επιλέξτε μια διεύθυνση.</string>
<string name="statistics">Στατιστικά</string>
<string name="routers">Δρομολογητές</string>
<string name="countries">Χώρες</string>
<string name="country">Χώρα</string>
<string name="transport">Transport</string>
<string name="versions">Εκδόσεις</string>
<string name="version">Εκδοση</string>
<string name="count">Υπολογισμός</string>
<string name="tname_0">Κρυμμένο κατά την εκκίνηση</string>
<string name="menu_settings">Ρυθμίσεις</string>
<string name="settings_enable">Ενεργοποίηση </string>
<string name="settings_label_bandwidth">Εύρος Ζώνης</string>
<string name="settings_label_network">Δίκτυο</string>
<string name="settings_label_hiddenMode">Συμμετοχή</string>
<string name="settings_label_logging">Συνδέεται </string>
<string name="settings_label_appearance">Εμφάνιση</string>
<string name="settings_label_language">Γλώσσα</string>
<string name="settings_default">Εξ\'ορισμού</string>
<string name="settings_label_advanced">Προχωρημένα</string>
<string name="settings_label_expl_length">Μήκος</string>
<string name="settings_summ_expl_lengthVariance">%s</string>
<string name="settings_label_expl_quantity">Ποσότητα</string>
<string name="menu_about">Σχετικά με</string>
<string name="about_version">Έκδοση</string>
<string name="about_project">Project Home:</string>
<string name="menu_help">Βοήθεια</string>
<string name="general">Γενικά</string>
<string name="addressbook_add_wizard_k_name">Όνομα</string>
<string name="addressbook_add_wizard_k_destination">Προορισμός</string>
<string name="addressbook_add_wizard_desc_name">Το όνομα</string>
<string name="i2ptunnel_type_httpserver">Διακομιστής HTTP</string>
<string name="i2ptunnel_new_tunnel">Νέο Τούνελ</string>
<string name="i2ptunnel_wizard_k_name">Όνομα</string>
<string name="i2ptunnel_wizard_k_desc">Περιγραφή</string>
<string name="i2ptunnel_wizard_k_dest">Προορισμός</string>
<string name="next">Επόμενο</string>
<string name="prev">Προηγούμενο</string>
<string name="finish">Υποβολή</string>
<string name="review">Ανασκόπηση</string>
<string name="enabled">Ενεργοποιημένο</string>
<string name="i2ptunnel_view_target">Στόχος</string>
<string name="name">Όνομα</string>
<string name="description">Περιγραφή</string>
<string name="use_ssl">Χρήση SSL</string>
<string name="profile">Προφίλ</string>
<string name="access_control">Έλεγχος πρόσβασης</string>
<string name="disabled">Απενεργοποιημένο</string>
<string name="whitelist">Λίστα Επιτρεπόμενων</string>
<string name="unlimited">Απεριόριστο</string>
<string name="username">Όνομα χρήστη</string>
<string name="password">Κωδικός</string>
<string name="other">Άλλ</string>
<string name="all">Όλοι</string>
<string name="no_messages">Κανένα μήνυμα</string>
<string name="logs_copied_to_clipboard">Τα αρχεία καταγραφής αντιγράφηκαν στο πρόχειρο</string>
</resources>

View File

@ -55,6 +55,8 @@
<string name="upload">Subida</string>
<string name="configure_browser_title">¿Configurar navegador?</string>
<string name="configure_browser_for_i2p">¿Desea configurar un navegador para ver sitios I2P? (también puede hacer esto más tarde desde el menú de ayuda).</string>
<string name="configure_no_doze_title">¿Gestionar las Optimizaciones de la Batería?</string>
<string name="configure_no_doze">I2P funciona mejor si sigue funcionando. Para evitar que Android cierre I2P cuando intente ahorrar energía, puede agregarlo a la lista de excepciones de batería. Esto mejorará sustancialmente la fiabilidad de la aplicación. (recomendado)</string>
<string name="first_start_title">¡Felicidades por conseguir instalar I2P!</string>
<string name="first_start_welcome"><b>¡Bienvenido a I2P!</b> Por favor, <b>tenga paciencia</b> mientras I2P se inicia y busca pares (peers).</string>
<string name="first_start_read">Mientras espera, por favor, lea las notas de la versión y la página de bienvenida.</string>
@ -113,6 +115,11 @@
<string name="notification_status_peers">Pares: %1$d activos, %2$d conocidos</string>
<string name="notification_status_expl">Túneles exploratorios: %1$d/%2$d</string>
<string name="notification_status_client">Túneles de cliente: %1$d/%2$d</string>
<string name="stats_memory">Memoria usada/max</string>
<string name="stats_lag">Demora de tareas</string>
<string name="stats_delay">Demora de mensajes</string>
<string name="copied_base32_system_notification_title">Base32 copiado al portapapeles</string>
<string name="copied_base32_system_notification_body">La dirección de su túnel I2P se ha copiado en el portapapeles.</string>
<string name="menu_settings">Configuración</string>
<string name="settings_enable">Activar</string>
<string name="settings_desc_subscriptions">URLs de suscripción</string>
@ -145,7 +152,13 @@
<string name="settings_label_transports">Transportes</string>
<string name="settings_label_maxConns">Conexiones máximas</string>
<string name="settings_label_i2cp">Interfaz de I2CP</string>
<string name="settings_desc_i2cp">Escuchar el puerto 7654</string>
<string name="settings_desc_i2cp">Permitir que las aplicaciones de terceros creen túneles usando I2CP (requiere el reinicio del enrutador)</string>
<string name="settings_label_sam">Interfaz SAM</string>
<string name="settings_desc_sam">Permitir que las aplicaciones de terceros creen túneles usando SAM (requiere el reinicio del enrutador)</string>
<string name="settings_confirm_sam">Una aplicación está intentando establecer una conexión SAM.</string>
<string name="settings_confirm_sam_id">Nombre de conexión/ID:</string>
<string name="settings_confirm_allow_sam">Toca para permitir</string>
<string name="settings_confirm_deny_sam">Ignorar para negar</string>
<string name="settings_label_exploratory_pool">Grupo exploratorio</string>
<string name="settings_desc_exploratory_pool">Parámetros de túneles</string>
<string name="settings_label_expl_inbound">Túneles de entrada</string>
@ -170,7 +183,7 @@
<string name="about_bugs">Fallos y soporte:</string>
<string name="about_helpwanted">¡Buscamos ayuda!</string>
<string name="about_volunteer">¿Quiere ayudar a hacer mejor la aplicación? Ofrézcase voluntario en el foro de Android:</string>
<string name="about_donate">¿Quiere donar dinero o bitcoins para la compra de más dispositivos Android para el desarrollo y puesta a prueba? Vaya a:</string>
<string name="about_gitlab">¿Quiere sugerir una función o corregir un error? haga una solicitud de fusión en Android Gitlab:</string>
<string name="menu_help">Ayuda</string>
<string name="general">General</string>
<string name="label_router">Direcciones públicas</string>
@ -231,7 +244,7 @@
<string name="enabled">Habilitado</string>
<string name="i2ptunnel_wizard_desc_name">El nombre del túnel, para su identificación en la lista de túneles.</string>
<string name="i2ptunnel_wizard_desc_desc">Una descripción del túnel. Esto es opcional y puramente informativo.</string>
<string name="i2ptunnel_wizard_desc_dest">Escriba el destino I2P del servicio al que este túnel de cliente debe conectarse. Este podría ser la clave base 64 completa del destino I2P, o un nombre de nodo I2P de su libreta de direcciones.</string>
<string name="i2ptunnel_wizard_desc_dest">Especifique aquí la dirección .i2p o destino (hostname.i2p, b32 o b64) del túnel.</string>
<string name="i2ptunnel_wizard_desc_outproxies">Si sabe de cualquier proxy de salida para este tipo de túnel (bien HTTP o SOCKS), introdúzcalo. Separe los proxys con comas.</string>
<string name="i2ptunnel_wizard_desc_target_host">Esta es la IP sobre la que su servicio está ejecutándose, como este normalmente está en la misma máquina, se autorellena con 127.0.0.1</string>
<string name="i2ptunnel_wizard_desc_target_port">Este es el puerto sobre el que el servicio está aceptando conexiones.</string>
@ -341,10 +354,12 @@
<string name="no_error_messages">No hay mensajes de error</string>
<plurals name="log_error_messages">
<item quantity="one">Un mensaje de error</item>
<item quantity="many">%d mensajes de error, los más recientes primero</item>
<item quantity="other">%d mensajes de error, los más recientes primero</item>
</plurals>
<plurals name="log_messages">
<item quantity="one">Un mensaje</item>
<item quantity="many">%d mensajes, los más recientes primero</item>
<item quantity="other">%d mensajes, los más recientes primero</item>
</plurals>
<string name="log_entry">Entrada de registro (log)</string>
@ -356,4 +371,5 @@
<string name="label_browser_configuration">Configuración del navegador</string>
<string name="no_market_app">No se encontró la aplicación en Android market, por favor, instálela manualmente</string>
<string name="unset">No configurado</string>
<string name="running_background">I2P se ejecuta en segundo plano</string>
</resources>

View File

@ -0,0 +1,227 @@
<?xml version='1.0' encoding='UTF-8'?>
<resources>
<string name="app_name">I2P</string>
<string name="desc_i2p_logo">لوگو I2P</string>
<string name="choose_language">انتخاب زبان</string>
<string name="welcome_new_install">به I2P خوش آمدید! این اپلیکیشن برنامه ی ALPHA است و نامحسوسی را بطور کامل پیاده نمیکند.
لطفا توضیحات انتشار و توضیحات گواهینامه را مطالعه کنید.</string>
<string name="welcome_new_version">نسخه جدید نصب شد. لطفا توضیحات انتشار را مطالعه کنید. نسخه :</string>
<string name="label_tunnels">تونل ها</string>
<string name="label_status">وضعیت</string>
<string name="label_console">کنسول</string>
<string name="label_addresses">آدرسها</string>
<string name="label_addressbook">دفتر آدرس ها</string>
<string name="label_i2ptunnel_client">تونل های کاربر</string>
<string name="label_i2ptunnel_server">تونل های سرور</string>
<string name="label_logs">گزارش ها</string>
<string name="label_error_logs">گزارش خطاها</string>
<string name="label_news">اخبار</string>
<string name="label_peers_status">همتایان</string>
<string name="label_release_notes">توضیحات انتشار</string>
<string name="label_licenses">گواهینامه ها</string>
<string name="label_browse">جستجو</string>
<string name="label_graphs">گراف ها</string>
<string name="button_router_off">لمس طولانی برای اجرای I2P</string>
<string name="button_router_on">I2P در حال اجرا است (لمس طولانی برای توقف)</string>
<string name="button_router_graceful">I2P در %s خاموش خواهد شد</string>
<string name="no_internet">هیچ اتصال اینترنتی موجود نمی باشد</string>
<string name="hidden">پنهان</string>
<string name="testing">در حال تست</string>
<string name="symmetric_nat">NAT همگام</string>
<!--Parameter is a time, e.g. 32s or 2m-->
<string name="net_status_error_unresolved_tcp">آدرس های TCP حل نشده</string>
<string name="net_status_error_private_tcp">آدرس TCP خصوصی</string>
<string name="shared_clients">کلاینت های به اشتراک گذاشته شده</string>
<string name="active_peers">همتایان فعال</string>
<string name="known_peers">همتایان شناخته شده</string>
<!--Character to indicate a client tunnel. Usually first letter of the word "client".-->
<string name="char_client_tunnel">C</string>
<!--Character to indicate a server tunnel. Usually first letter of the word "server".-->
<string name="char_server_tunnel">S</string>
<string name="download">بارگذاری</string>
<string name="upload">آپلود</string>
<string name="configure_browser_title">پیکربندی مرورگر؟</string>
<string name="first_start_title">تبریک بابت نصب I2P!</string>
<string name="action_search">جستجو</string>
<string name="action_add">اضافه کردن</string>
<string name="action_edit">ویرایش </string>
<string name="action_delete">پاک کردن</string>
<string name="action_i2ptunnel_start">شروع تونل</string>
<string name="action_i2ptunnel_stop">توقف تونل</string>
<string name="action_i2ptunnel_start_all">شروع تمام تونل ها</string>
<string name="action_i2ptunnel_stop_all">توقف تمام تونل ها</string>
<string name="action_i2ptunnel_restart_all">راه اندازی مجدد تمام تونل ها</string>
<string name="action_reload">بارگذاری مجدد</string>
<string name="action_refresh">تازه کردن</string>
<string name="hint_search_addressbook">جستجو دفتر آدرس ها</string>
<string name="action_reload_subscriptions">بارگذاری مجدد اشتراک ها</string>
<string name="news_last_updated">اخبار آخرین بار %s پیش به روز رسانی شد</string>
<string name="news_last_checked">اخبار آخرین بار %s پیش بررسی شد</string>
<string name="news_updated">اخبار به روز رسانی شد</string>
<string name="view_news">برای دیدن آخرین اخبار I2P کلیک کنید</string>
<string name="router_not_running">روتر در حال اجرا نیست.</string>
<string name="router_shutting_down">روتر در حال خاموش شدن است.</string>
<string name="select_an_address">یک آدرس انتخاب کنید.</string>
<string name="configure_graphs">پیکربندی گراف ها</string>
<string name="graphs_not_ready">گراف ها هنوز آماده نیستند. لطفا بعدا تلاش کنید.</string>
<string name="statistics">آمار</string>
<string name="routers">روترها</string>
<string name="countries">کشورها</string>
<string name="country">کشور</string>
<string name="transport">انتقال</string>
<string name="versions">نسخه ها</string>
<string name="version">نسخه</string>
<string name="count">شمارش</string>
<string name="notification_status_starting">I2P در حال شروع می باشد</string>
<string name="notification_status_restarting">I2P در حال راه اندازی مجدد است</string>
<string name="notification_status_starting_after_waiting">شبکه اتصال یافت، I2P در حال آغاز است</string>
<string name="notification_status_running">I2P در حال اجراست</string>
<string name="notification_status_client_ready">تونل های کلاینت آماده می باشند</string>
<string name="notification_status_graceful">توقف سازی I2P در %s</string>
<string name="notification_status_stopping">در حال توقف I2P</string>
<string name="notification_status_stopping_after_net">اتصال شبکه قطع شد، در حال توقف سازی I2P</string>
<string name="notification_status_shutdown_cancelled">خاموش کردن لغو شد</string>
<string name="notification_status_shutting_down">I2P در حال خاموش شدن است</string>
<string name="notification_status_peers">همتایان: %1$d فعال، %2$d شناخته شده</string>
<string name="notification_status_client">تونل های کلاینت: %1$d/%2$d</string>
<string name="menu_settings">تنظیمات</string>
<string name="settings_enable">فعّال</string>
<string name="settings_desc_subscriptions">آدرس های اینترنتی اشتراک</string>
<string name="settings_label_bandwidth_net">پهنای باند و شبکه</string>
<string name="settings_label_startOnBoot">شروع I2P در هنگام بوت</string>
<string name="settings_label_bandwidth">پهنای باند</string>
<string name="settings_label_bw_inbound">سرعت ورودی</string>
<string name="settings_label_bw_outbound">سرعت خروجی</string>
<string name="settings_label_network">شبکه</string>
<string name="settings_label_hiddenMode">مشارکت</string>
<string name="settings_desc_hiddenMode">خاموش کردن حالت پنهان</string>
<string name="settings_label_sharePercent">اشتراک گذاری درصد</string>
<string name="settings_desc_upnp">باز کردن درگاه های دیوار آتشین به صورت خودکار</string>
<string name="settings_label_logging">ثبت وقایع</string>
<string name="settings_label_appearance">ظاهر</string>
<string name="settings_label_language">زبان</string>
<string name="settings_default">پیش فرض</string>
<string name="settings_label_advanced">پیشرفته </string>
<string name="settings_label_showStats">آمار های روتر</string>
<string name="settings_summ_showStats">نمایش آمار های پیشرفته در کنسول اصلی</string>
<string name="settings_label_transports">انتقال ها</string>
<string name="settings_label_maxConns">اتصالات بیشینه</string>
<string name="settings_label_i2cp">رابط I2CP</string>
<string name="settings_desc_exploratory_pool">پارامتر های تونل</string>
<string name="settings_label_expl_length">طول</string>
<string name="settings_summ_expl_length">%s واسطه</string>
<string name="settings_summ_expl_lengthVariance">%s</string>
<string name="settings_label_expl_quantity">تعداد</string>
<string name="settings_summ_expl_quantity">%s تونل</string>
<string name="settings_summ_expl_backupQuantity">%s تونل</string>
<string name="menu_about">درباره</string>
<string name="about_version">نسخه:</string>
<string name="about_project">خانه پروژه:</string>
<string name="about_bugs">باگ ها و پشتیبانی:</string>
<string name="about_helpwanted">نیاز به کمک داریم!</string>
<string name="about_volunteer">آیا میخواهید کمک کنید تا برنامه را بهبود ببخشید؟ روی انجمن اندروید داوطلب شوید:</string>
<string name="menu_help">راهنمایی</string>
<string name="general">عمومی</string>
<string name="label_router">آدرس های عمومی</string>
<string name="label_private">آدرس های خصوصی</string>
<string name="addressbook_is_empty">دفتر آدرس ها خالی می باشد</string>
<string name="addressbook_search_header">%s یافت شد</string>
<string name="addressbook_add_wizard_k_name">نام</string>
<string name="addressbook_add_wizard_k_destination">مقصد</string>
<string name="addressbook_add_wizard_desc_name">نام</string>
<string name="nsu_iae_cannot_contain">نام میزبان نمی تواند حاوی \"%s\" باشد</string>
<string name="i2ptunnel_type_client">کلاینت استاندارد</string>
<string name="i2ptunnel_type_httpclient">کلاینت HTTP</string>
<string name="i2ptunnel_type_ircclient">کلاینت IRC</string>
<string name="i2ptunnel_type_server">سرور استاندارد</string>
<string name="i2ptunnel_type_httpserver">سرور HTTP</string>
<string name="i2ptunnel_type_ircserver">سرور IRC</string>
<string name="i2ptunnel_type_streamrclient">کلاینت Streamr</string>
<string name="i2ptunnel_type_streamrserver">سرور Streamr</string>
<string name="install_recommended_app">نصب برنامه پیشنهاد شده؟</string>
<string name="i2ptunnel_not_initialized">تونل ها فعلا مقداردهی اولیه نشده اند، لطفا در 2 دقیقه دیگر بارگذاری مجدد کنید.</string>
<string name="i2ptunnel_new_tunnel">تونل جدید</string>
<string name="i2ptunnel_msg_config_saved">تغییرات پیکربندی ذخیره شد</string>
<string name="i2ptunnel_msg_config_save_failed">ناموفقیت در ذخیره سازی پیکربندی</string>
<string name="i2ptunnel_msg_tunnel_starting">شروع تونل</string>
<string name="i2ptunnel_msg_tunnel_stopping">توقف تونل</string>
<string name="i2ptunnel_delete_confirm_message">حذف تونل؟</string>
<string name="i2ptunnel_delete_confirm_button">حذف تونل</string>
<string name="i2ptunnel_wizard_k_client_server">کلاینت یا سرور</string>
<string name="i2ptunnel_wizard_v_client">تونل کلاینت</string>
<string name="i2ptunnel_wizard_v_server">تونل سرور</string>
<string name="i2ptunnel_wizard_k_type">نوع تونل</string>
<string name="i2ptunnel_wizard_k_name">نام</string>
<string name="i2ptunnel_wizard_k_desc">شرح</string>
<string name="i2ptunnel_wizard_k_dest">مقصد</string>
<string name="i2ptunnel_wizard_k_target_host">میزبان هدف</string>
<string name="i2ptunnel_wizard_k_target_port">درگاه هدف</string>
<string name="i2ptunnel_wizard_k_reachable_on">قابل دسترس روی</string>
<string name="i2ptunnel_wizard_k_auto_start">شروع خودکار</string>
<string name="next">بعدی</string>
<string name="prev">قبلی</string>
<string name="finish">ثبت کردن</string>
<string name="review">مرور کنید.</string>
<string name="enabled">فعال است</string>
<string name="i2ptunnel_wizard_submit_confirm_message">ایجاد تونل؟</string>
<string name="i2ptunnel_wizard_submit_confirm_button">ایجاد تونل</string>
<string name="i2ptunnel_view_target">هدف</string>
<string name="i2ptunnel_view_access_point">نقطه دسترسی</string>
<string name="i2ptunnel_view_autostart">شروع-خودکار</string>
<string name="address_copied_to_clipboard">آدرس به کلیپ بورد کپی شد</string>
<string name="edit_tunnel">ویرایش تونل</string>
<string name="name">نام</string>
<string name="description">شرح</string>
<string name="auto_start">شروع-خودکار</string>
<string name="tunnel_summ_auto_start">شروع تونل در هنگام شروع روتر.</string>
<string name="tunnel_cat_ports">پورت های محلی</string>
<string name="shared_client">کلاینت به اشتراک گذاشته شده</string>
<string name="target_destination">مقصد هدف</string>
<string name="persistent_key">کلید مداوم</string>
<string name="reachable_on">قابل دسترس روی</string>
<string name="listen_port">پورت شنود</string>
<string name="client_ssl">SSL کلاینت</string>
<string name="tunnel_summ_client_ssl">کلاینت ها باید از SSL برای اتصال استفاده کنند</string>
<string name="irc">IRC</string>
<string name="enable_dcc">فعال سازی DCC</string>
<string name="tunnel_summ_enable_dcc">اجازه به کلاینت های IRC برای استفاده از DCC</string>
<string name="website_domain_name">نام دامنه وبسایت</string>
<string name="target_host">میزبان هدف</string>
<string name="target_port">درگاه هدف</string>
<string name="use_ssl">از SSL استفاده کن</string>
<string name="tunnel_summ_use_ssl">استفاده از SSL برای اتصال به هدف</string>
<string name="tunnel_parameters">پارامتر های تونل</string>
<string name="profile">پروفایل</string>
<string name="access_control">کنترل دسترسی</string>
<string name="restricted_access">دسترسی محدود</string>
<string name="disabled">غیر فعال شد</string>
<string name="whitelist">لیست سفید</string>
<string name="blacklist">لیست سیاه</string>
<string name="access_list">لیست دسترسی</string>
<string name="unique_local">محل یکتا</string>
<string name="client_connection_limits">محدودیت های اتصال کلاینت</string>
<string name="connections_per_minute">اتصال ها در دقیقه</string>
<string name="connections_per_hour">اتصال ها در ساعت</string>
<string name="connections_per_day">اتصال ها در روز</string>
<string name="num_per_minute">%s در دقیقه</string>
<string name="num_per_hour">%s در ساعت</string>
<string name="num_per_day">%s در روز</string>
<string name="unlimited">نامحدود</string>
<string name="post_limits">محدودیت های POST</string>
<string name="limit_period">دوره محدودیت</string>
<string name="reduce_quantity">کاهش تعداد</string>
<string name="num_minutes">%s دقیقه</string>
<string name="new_keys_on_reopen_conflict_title">غیرفعال سازی کلید های مداوم؟</string>
<string name="http_client">کلاینت HTTP</string>
<string name="jump_url_list">پرش لیست آدرس اینترنتی</string>
<string name="proxy_auth">احراز هویت پراکسی</string>
<string name="username">نام کاربری</string>
<string name="password">رمز عبور</string>
<string name="other">دیگر</string>
<string name="signature_type">نوع امضا</string>
<string name="custom_options">گزینه های سفارشی</string>
<string name="all">همه</string>
<string name="no_messages">هیچ پیام</string>
<string name="no_error_messages">هیچ پیام خطا</string>
<string name="label_browser_configuration">پیکربندی مرورگر</string>
</resources>

View File

@ -67,13 +67,18 @@
<string name="action_reload">Lataa uudelleen</string>
<string name="action_refresh">Virkistä</string>
<string name="hint_search_addressbook">Etsi osoitekirja</string>
<string name="action_reload_subscriptions">Lataa tilaukset uudelleen</string>
<string name="news_last_updated">Uutisdt päivitetty viimeksi %s sitten</string>
<string name="news_last_checked">Uutiset viimeksi tarkistettu %s sitten</string>
<string name="news_updated">Uutiset päivitetty</string>
<string name="view_news">Napauta viimeisimpien I2P-uutisten katselemiseksi</string>
<string name="router_not_running">Reititin ei ole käynnissä.</string>
<string name="router_shutting_down">Reititin sulkeutuu.</string>
<string name="stats_not_ready">Tilastointihallinta ei ole vielä valmis. Yritä myöhemmin uudelleen.</string>
<string name="select_an_address">Valitse osoite.</string>
<string name="no_graphs_configured">Yhtään graafista esitystä ei ole asetettu. Voit valita graafisen esityksen tilastot asetukset-valikosta. Kaikki muutokset tulevat voimaan 60 sekunnin jälkeen.</string>
<string name="configure_graphs">Aseta graafisia esityksiä</string>
<string name="graphs_not_ready">Graafiset esitykset eivät ole vielä valmiina. Yritä myöhemmin uudelleen.</string>
<string name="statistics">Tilastot</string>
<string name="routers">Reitittimet</string>
<string name="countries">Maat</string>
@ -82,6 +87,7 @@
<string name="versions">Versiot</string>
<string name="version">Versio</string>
<string name="count">Lukumäärä</string>
<string name="netdb_routers_empty">Sinun NetDB-verkossa ei ole reitittimiä.</string>
<string name="notification_status_starting">I2P on käynnistymässä</string>
<string name="notification_status_restarting">I2P on käynnistymässä uudelleen</string>
<string name="notification_status_waiting">I2P odottaa verkkoyhteyttä</string>
@ -109,8 +115,14 @@
<string name="settings_label_bw_outbound">Lähtönopeus</string>
<string name="settings_desc_bw_outbound">Enimmäislähtönopeus</string>
<string name="settings_label_network">Verkko</string>
<string name="settings_label_hiddenMode">Osallistuminen</string>
<string name="settings_desc_hiddenMode">Käännä piilotila pois päältä</string>
<string name="settings_label_maxPartTunnels">Niiden tunneleiden enimmäismäärä, joihin osallistutaan</string>
<string name="settings_desc_maxPartTunnels">Niiden tunneleiden enimmäismäärä, joihin osallistutaan (oletus=20)</string>
<string name="settings_dialog_maxPartTunnels">Niiden tunneleiden enimmäismäärä, joihin osallistutaan</string>
<string name="settings_label_sharePercent">Jakoprosentti</string>
<string name="settings_desc_sharePercent">Jaettavan kaistanleveyden prosenttiosuus (oletus=80)</string>
<string name="settings_dialog_sharePercent">Jaettavan kaistanleveyden prosenttiosuus</string>
<string name="settings_desc_upnp">Avaa palomuuriportit automaattisesti</string>
<string name="settings_label_logging">Lokit</string>
<string name="settings_label_default_log_level">Oletus loggaustaso</string>
@ -119,10 +131,10 @@
<string name="settings_default">Oletus</string>
<string name="settings_label_advanced">Lisätietoja</string>
<string name="settings_label_showStats">Reititintilastot</string>
<string name="settings_summ_showStats">Näytä lisätilastoja pääkonsoli-ikkunassa</string>
<string name="settings_label_transports">Siirrot</string>
<string name="settings_label_maxConns">Yhteyksien enimmäismäärä</string>
<string name="settings_label_i2cp">I2CP-käyttöliittymä</string>
<string name="settings_desc_i2cp">Kuuntele portissa 7654</string>
<string name="settings_desc_exploratory_pool">Tunneliparametrit</string>
<string name="settings_label_expl_inbound">Tulotunnelit</string>
<string name="settings_label_expl_outbound">Lähtötunnelit</string>
@ -160,6 +172,7 @@
<string name="i2ptunnel_type_streamrserver">Streamr-palvelin</string>
<string name="i2ptunnel_type_httpbidirserver">HTTP bidir</string>
<string name="install_recommended_app">Asennetaanko suositeltu sovellus?</string>
<string name="app_needed_for_this_tunnel_type">Sinun on asennettava sovellus tämän tunnelin käyttämiseksi. Haluaisitko asentaa suositellun sovelluksen?</string>
<string name="i2ptunnel_not_initialized">Tunneleita ei ole vielä alustettu, lataa uudelleen kahdessa minuutissa.</string>
<string name="i2ptunnel_new_tunnel">Uusi tunneli</string>
<string name="i2ptunnel_msg_tunnel_starting">Käynnistetään tunneli</string>
@ -199,6 +212,7 @@
<string name="use_ssl">Käytä SSL:ää</string>
<string name="tunnel_parameters">Tunneliparametrit</string>
<string name="profile">Profiili</string>
<string name="access_control">Käyttöoikeuksien hallinta</string>
<string name="disabled">Otettu pois käytöstä</string>
<string name="whitelist">Valkoinen lista</string>
<string name="blacklist">Musta lista</string>

View File

@ -1,10 +1,10 @@
<?xml version='1.0' encoding='UTF-8'?>
<resources>
<string name="app_name">I2P</string>
<string name="desc_i2p_logo">Logo I2P</string>
<string name="desc_i2p_logo">Logo dI2P</string>
<string name="choose_language">Choisir la langue</string>
<string name="welcome_new_install">Bienvenue sur I2P ! Cette appli est un logiciel en version ALPHA de développement et noffre pas un niveau danonymat élevé. Veuillez lire les notes de mise à jour et les informations de licence.</string>
<string name="welcome_new_version">La nouvelle version est installée. Veuillez lire les notes de mise à jour. Version :</string>
<string name="welcome_new_install">Bienvenue sur I2P! Cette appli est un logiciel en version ALPHA et noffre pas un niveau danonymat élevé. Veuillez lire les notes de mise à jour et les informations de licence.</string>
<string name="welcome_new_version">La nouvelle version est installée. Veuillez lire les notes de mise à jour. Version :</string>
<string name="label_tunnels">Tunnels</string>
<string name="label_status">État</string>
<string name="label_console">Console</string>
@ -25,23 +25,23 @@
<string name="button_router_graceful">I2P se fermera dans %s</string>
<string name="button_shutdown_now">Appuyer longuement pour arrêter maintenant</string>
<string name="button_cancel_graceful">Appuyer longuement pour annuler la fermeture</string>
<string name="no_internet">Aucune connexion Internet nest disponible</string>
<string name="hidden">Caché</string>
<string name="testing">En test</string>
<string name="firewalled">Derrière un pare-feu</string>
<string name="symmetric_nat">Traduction dadresses réseau symétrique</string>
<string name="net_status_error_i2cp">Erreur I2CP du gestionnaire de clients - Vérifier les journaux</string>
<string name="no_internet">Aucune connexion à Internet nest disponible</string>
<string name="hidden">caché</string>
<string name="testing">en test</string>
<string name="firewalled">derrière un pare-feu</string>
<string name="symmetric_nat">traduction dadresses réseau symétrique</string>
<string name="net_status_error_i2cp">Erreur I2CP du gestionnaire de clients Vérifier les journaux</string>
<!--Parameter is a time, e.g. 32s or 2m-->
<string name="net_status_error_skew">Décalage dhorloge de %s</string>
<string name="net_status_error_unresolved_tcp">Adresse TCP non résolue</string>
<string name="net_status_error_private_tcp">Adresse TCP privée</string>
<string name="net_status_warn_firewalled_inbound_tcp">Derrière un pare-feu avec le TCP entrant activé</string>
<string name="net_status_warn_firewalled_floodfill">Derrière un pare-feu et remplissage par diffusion</string>
<string name="net_status_info_disconnected">Déconnecté - Vérifier la connexion réseau</string>
<string name="net_status_error_udp_port">Le port UDP est utilisé - Le changer dans les paramètres et redémarrer</string>
<string name="net_status_error_no_active_peers">Aucun pair actif - Vérifier la connexion au réseau et le pare-feu</string>
<string name="net_status_warn_firewalled_inbound_tcp">derrière un pare-feu avec le TCP entrant activé</string>
<string name="net_status_warn_firewalled_floodfill">derrière un pare-feu et remplissage par diffusion</string>
<string name="net_status_info_disconnected">Déconnecté Vérifiez la connexion réseau</string>
<string name="net_status_error_udp_port">Le port UDP est utilisé — Changez-le dans les paramètres et redémarrer</string>
<string name="net_status_error_no_active_peers">Aucun pair actif Vérifiez la connexion au réseau et le pare-feu</string>
<string name="net_status_error_udp_disabled_tcp_not_set">LUDP est désactivé et les port et hôte TCP entrants ne sont pas définis</string>
<string name="net_status_warn_firewalled_udp_disabled">Derrière un pare-feu avec UDP désactivé</string>
<string name="net_status_warn_firewalled_udp_disabled">derrière un pare-feu avec UDP désactivé</string>
<string name="shared_clients">Clients partagés</string>
<string name="uptime">Durée dactivité</string>
<string name="active_peers">Pairs actifs</string>
@ -53,14 +53,16 @@
<string name="no_tunnels_running">Aucun tunnel nest encore en fonction.</string>
<string name="download">Téléchargement</string>
<string name="upload">Téléversement</string>
<string name="configure_browser_title">Configurer le navigateur ?</string>
<string name="configure_browser_for_i2p">Souhaitez-vous configurer un navigateur pour visualiser les sites I2P ? (vous pouvez aussi le faire plus tard grâce au menu daide)</string>
<string name="first_start_title">Félicitations pour votre installation dI2P !</string>
<string name="first_start_welcome"><b>Bienvenue sur I2P !</b> Veuillez <b>patienter</b> pendant quI2P samorce et trouve des pairs.</string>
<string name="configure_browser_title">Configurer le navigateur?</string>
<string name="configure_browser_for_i2p">Voulez-vous configurer un navigateur pour visualiser les sites I2P? (Vous pouvez aussi le faire plus tard grâce au menu daide.)</string>
<string name="configure_no_doze_title">Gérer les optimisations de la pile?</string>
<string name="configure_no_doze">I2P fonctionne mieux sil fonctionne en permanence. Pour empêcher quAndroid ferme I2P quand il essaie déconomiser lénergie, vous pouvez ajouter I2P à la liste dexception de la pile. La fiabilité de lappli sen trouvera grandement améliorée.\n\nGarder I2P en fonction en arrière-plan? (recommandé)</string>
<string name="first_start_title">Félicitations pour votre installation dI2P!</string>
<string name="first_start_welcome"><b>Bienvenue sur I2P!</b> Veuillez <b>patienter</b> pendant quI2P samorce et trouve des pairs.</string>
<string name="first_start_read">Pendant que vous patientez, veuillez consulter les notes de mise à jour et la page daccueil.</string>
<string name="first_start_faq">Une fois que vous aurez des tunnels client, veuillez <b>consulter</b> notre FAQ :</string>
<string name="first_start_faq_nonanon">Ou utilisez ce lien non anonyme si vous ne voulez pas attendre les tunnels :</string>
<string name="first_start_irc">Dirigez votre client IRC vers <b>localhost:6668</b> et dites-nous bonjour sur :</string>
<string name="first_start_faq">Une fois que vous aurez des tunnels client, veuillez <b>consulter</b> notre FAQ :</string>
<string name="first_start_faq_nonanon">Ou utilisez ce lien non anonyme si vous ne voulez pas attendre les tunnels :</string>
<string name="first_start_irc">Dirigez votre client IRC vers <b>localhost:6668</b> et dites-nous bonjour sur :</string>
<string name="action_search">Recherche</string>
<string name="action_add">Ajouter</string>
<string name="action_edit">Modifier</string>
@ -80,11 +82,11 @@
<string name="view_news">Toucher pour voir les dernières nouvelles dI2P</string>
<string name="router_not_running">Le routeur ne fonctionne pas.</string>
<string name="router_shutting_down">Le routeur séteint.</string>
<string name="stats_not_ready">Le gestionnaire de statistiques nest pas encore prêt. Ressayer ultérieurement.</string>
<string name="stats_not_ready">Le gestionnaire de statistiques nest pas encore prêt. Réessayer plus tard.</string>
<string name="select_an_address">Sélectionner une adresse.</string>
<string name="no_graphs_configured">Aucun graphique na été configuré. Vous pouvez choisir les statistiques à graphiquer dans le menu des paramètres. Tout changement prendra effet après 60 secondes.</string>
<string name="configure_graphs">Configurer les graphiques</string>
<string name="graphs_not_ready">Les graphiques ne sont pas encore prêts. Ressayer ultérieurement.</string>
<string name="graphs_not_ready">Les graphiques ne sont pas encore prêts. Réessayer plus tard.</string>
<string name="statistics">Statistiques</string>
<string name="routers">Routeurs</string>
<string name="leasesets">Jeux de baux</string>
@ -109,10 +111,14 @@
<string name="notification_status_stopping_after_net">Le réseau est déconnecté, arrêt dI2P</string>
<string name="notification_status_shutdown_cancelled">La fermeture a été annulée</string>
<string name="notification_status_shutting_down">I2P est en cours de fermeture</string>
<string name="notification_status_bw">Bande passante : %1$sBps aval / %2$sBps amont</string>
<string name="notification_status_peers">Pairs : %1$d actifs, %2$d connus</string>
<string name="notification_status_expl">Tunnels exploratoires : %1$d/%2$d</string>
<string name="notification_status_client">Tunnels client : %1$d/%2$d</string>
<string name="notification_status_bw">Bande passante : %1$sBps aval / %2$sBps amont</string>
<string name="notification_status_peers">Pairs : %1$d actifs, %2$d connus</string>
<string name="notification_status_expl">Tunnels exploratoires : %1$d/%2$d</string>
<string name="notification_status_client">Tunnels client : %1$d/%2$d</string>
<string name="stats_memory">Mémoire utilisée/max</string>
<string name="stats_delay">Délai de message</string>
<string name="copied_base32_system_notification_title">Base 32 copié au presse-papier</string>
<string name="copied_base32_system_notification_body">L\'adresse de votre tunnel I2P a été copiée au presse-papier.</string>
<string name="menu_settings">Paramètres</string>
<string name="settings_enable">Activer</string>
<string name="settings_desc_subscriptions">URL dabonnement</string>
@ -124,7 +130,7 @@
<string name="settings_desc_bw_inbound">Vitesse entrante maximale</string>
<string name="settings_label_bw_outbound">Vitesse sortante</string>
<string name="settings_desc_bw_outbound">Vitesse sortante maximale</string>
<string name="settings_label_network">Réseau</string>
<string name="settings_label_network">Réseau </string>
<string name="settings_label_hiddenMode">Participation</string>
<string name="settings_desc_hiddenMode">Désactiver le mode caché</string>
<string name="settings_label_maxPartTunnels">Maximum de tunnels participants</string>
@ -139,13 +145,19 @@
<string name="settings_label_appearance">Apparence</string>
<string name="settings_label_language">Langue</string>
<string name="settings_default">Valeur par défaut</string>
<string name="settings_label_advanced">Évolué</string>
<string name="settings_label_advanced">Avancé</string>
<string name="settings_label_showStats">Statistiques du routeur</string>
<string name="settings_summ_showStats">Afficher les statistiques évoluées dans la console principale</string>
<string name="settings_label_transports">Transports</string>
<string name="settings_label_maxConns">Maximum de connexions</string>
<string name="settings_label_i2cp">Interface dI2CP</string>
<string name="settings_desc_i2cp">Écouter sur le port 7654</string>
<string name="settings_desc_i2cp">Autorise les applications tiers à créer des tunnels en utilisant I2CP (requiert un redémarrage du routeur)</string>
<string name="settings_label_sam">Interface SAM</string>
<string name="settings_desc_sam">Autorise les applis tiers à créer des tunnels en utilisant SAM (requiert un redémarrage du routeur)</string>
<string name="settings_confirm_sam">Une application essaye d\'engager une connexion SAM.</string>
<string name="settings_confirm_sam_id">Connexion Nom/ID :</string>
<string name="settings_confirm_allow_sam">Appuyez pour autoriser</string>
<string name="settings_confirm_deny_sam">Ignorez pour refuser</string>
<string name="settings_label_exploratory_pool">Réserve exploratoire</string>
<string name="settings_desc_exploratory_pool">Paramètres des tunnels</string>
<string name="settings_label_expl_inbound">Tunnels entrants</string>
@ -165,12 +177,12 @@
<string name="settings_need_transport_enabled">Au moins un transport doit être activé</string>
<string name="settings_router_restart_required">Veuillez redémarrer I2P afin dappliquer les changements</string>
<string name="menu_about">À propos</string>
<string name="about_version">Version :</string>
<string name="about_project">Page daccueil du projet :</string>
<string name="about_bugs">Bogues et assistance :</string>
<string name="about_helpwanted">Aide recherchée !</string>
<string name="about_volunteer">Vous souhaitez aider à améliorer lappli ? Portez-vous volontaire sur le forum Android :</string>
<string name="about_donate">Vous souhaitez faire un don dargent ou en bitcoin pour acheter plus dappareils Android pour le développement et les tests ? Rendez-vous sur :</string>
<string name="about_version">Version :</string>
<string name="about_project">Page daccueil du projet :</string>
<string name="about_bugs">Bogues et assistance :</string>
<string name="about_helpwanted">Aide recherchée!</string>
<string name="about_volunteer">Voulez-vous aider à améliorer lappli? Portez-vous volontaire sur le forum Android :</string>
<string name="about_gitlab">Avez vous envie de suggérer une fonctionnalité ou corriger un bug ? faites une requête sur le Gitlab Android :</string>
<string name="menu_help">Aide</string>
<string name="general">Général</string>
<string name="label_router">Adresses publiques</string>
@ -181,11 +193,11 @@
<string name="addressbook_add_wizard_k_destination">Destination</string>
<string name="addressbook_add_wizard_desc_name">Le nom</string>
<string name="addressbook_add_wizard_desc_destination">Coller ici le Base64 de la destination. Si avez un gestionnaire de fichiers dinstallé, vous pouvez chercher un fichier texte contenant le Base64.</string>
<string name="nsu_iae_illegal_char">Le nom dhôte « %1$s » contient le caractère illégal %2$s</string>
<string name="nsu_iae_cannot_start_with">Le nom dhôte ne peut pas commencer par « %s »</string>
<string name="nsu_iae_cannot_end_with">Le nom dhôte ne peut pas se terminer par « %s »</string>
<string name="nsu_iae_cannot_contain">Le nom dhôte ne peut pas contenir « %s »</string>
<string name="nsu_iae_requires_conversion">Le nom dhôte « %s » exige une conversion en ASCII, mais la bibliothèque de conversion nest pas proposée dans cette version dAndroid</string>
<string name="nsu_iae_illegal_char">Le nom dhôte « %1$s » contient le caractère illégal %2$s</string>
<string name="nsu_iae_cannot_start_with">Le nom dhôte ne peut pas commencer par « %s »</string>
<string name="nsu_iae_cannot_end_with">Le nom dhôte ne peut pas se terminer par « %s »</string>
<string name="nsu_iae_cannot_contain">Le nom dhôte ne peut pas contenir « %s »</string>
<string name="nsu_iae_requires_conversion">Le nom dhôte « %s » exige une conversion en ASCII, mais la bibliothèque de conversion nest pas proposée dans cette version dAndroid</string>
<string name="i2ptunnel_type_client">Client normal</string>
<string name="i2ptunnel_type_httpclient">Client HTTP</string>
<string name="i2ptunnel_type_ircclient">Client IRC</string>
@ -198,8 +210,8 @@
<string name="i2ptunnel_type_streamrclient">Client Streamr</string>
<string name="i2ptunnel_type_streamrserver">Serveur Streamr</string>
<string name="i2ptunnel_type_httpbidirserver">Bidir HTTP</string>
<string name="install_recommended_app">Installer lappli recommandée ?</string>
<string name="app_needed_for_this_tunnel_type">Vous devez installer une appli pour utiliser ce tunnel. Souhaitez-vous installer lappli recommandée ?</string>
<string name="install_recommended_app">Installer lappli recommandée?</string>
<string name="app_needed_for_this_tunnel_type">Vous devez installer une appli pour utiliser ce tunnel. Voulez-vous installer lappli recommandée?</string>
<string name="i2ptunnel_not_initialized">Les tunnels ne sont pas encore initialisés, veuillez recharger dans deux minutes.</string>
<string name="no_configured_client_tunnels">Aucun tunnel client nest configuré.</string>
<string name="no_configured_server_tunnels">Aucun tunnel serveur nest configuré.</string>
@ -208,7 +220,7 @@
<string name="i2ptunnel_msg_config_save_failed">Échec denregistrement de la configuration</string>
<string name="i2ptunnel_msg_tunnel_starting">Démarrage du tunnel</string>
<string name="i2ptunnel_msg_tunnel_stopping">Arrêt du tunnel</string>
<string name="i2ptunnel_delete_confirm_message">Supprimer le tunnel ?</string>
<string name="i2ptunnel_delete_confirm_message">Supprimer le tunnel?</string>
<string name="i2ptunnel_delete_confirm_button">Suppression du tunnel</string>
<string name="i2ptunnel_no_tunnel_details">Impossible de charger les détails du tunnel</string>
<string name="i2ptunnel_wizard_k_client_server">Client ou serveur</string>
@ -227,18 +239,18 @@
<string name="next">Suivant</string>
<string name="prev">Précédent</string>
<string name="finish">Envoyer</string>
<string name="review">Évaluer</string>
<string name="review">Révision</string>
<string name="enabled">Activé</string>
<string name="i2ptunnel_wizard_desc_name">Le nom du tunnel, pour identification dans la liste des tunnels.</string>
<string name="i2ptunnel_wizard_desc_desc">Une description du tunnel. Ceci est facultatif et purement informatif.</string>
<string name="i2ptunnel_wizard_desc_dest">Saisir la destination I2P du service auquel ce tunnel client devrait se connecter. Cela pourrait être la clé de destination entière en Base64 ou un nom dhôte I2P de votre carnet dadresses.</string>
<string name="i2ptunnel_wizard_desc_dest">Spécifiez l\'adresse ou destination .i2p (hostname.i2p, b32 ou B64) du tunnel ici.</string>
<string name="i2ptunnel_wizard_desc_outproxies">Si vous connaissez des mandataire sortants pour ce type de tunnel (soit HTTP ou SOCKS), ajoutez-les en les séparant par des virgules.</string>
<string name="i2ptunnel_wizard_desc_target_host">LIP sur laquelle votre service fonctionne, habituellement sur la même machine, donc 127.0.0.1 est préremplie.</string>
<string name="i2ptunnel_wizard_desc_target_port">Le port sur lequel le service accepte des connexions.</string>
<string name="i2ptunnel_wizard_desc_reachable_on">Cela limite quels ordinateurs ou téléphones intelligents peuvent accéder à ce tunnel.</string>
<string name="i2ptunnel_wizard_desc_binding_port">Le port par lequel lon accédera localement au tunnel client. Cest aussi le port client pour le tunnel serveur HTTP bidir.</string>
<string name="i2ptunnel_wizard_desc_auto_start">Le tunnel devrait-il démarrer automatiquement quand le routeur démarre ?</string>
<string name="i2ptunnel_wizard_submit_confirm_message">Créer un tunnel ?</string>
<string name="i2ptunnel_wizard_desc_auto_start">Le tunnel devrait-il démarrer automatiquement quand le routeur démarre?</string>
<string name="i2ptunnel_wizard_submit_confirm_message">Créer un tunnel?</string>
<string name="i2ptunnel_wizard_submit_confirm_button">Créer un tunnel</string>
<string name="i2ptunnel_view_target">Cible</string>
<string name="i2ptunnel_view_access_point">Point daccès</string>
@ -254,8 +266,8 @@
<string name="tunnel_summ_shared_client">Utiliser la même destination et les mêmes tunnels que les autres clients partagés</string>
<string name="target_destination">Destination cible</string>
<string name="persistent_key">Clé persistante</string>
<string name="persistent_key_conflict_title">Désactiver les nouvelles clés lors dune réouverture ?</string>
<string name="persistent_key_conflict_msg">Vous ne pouvez pas activer les clés persistantes alors que le tunnel est configuré pour générer de nouvelles clés lors dune réouverture. Voulez-vous désactiver les nouvelles clés lors dune réouverture ?</string>
<string name="persistent_key_conflict_title">Désactiver les nouvelles clés à la réouverture?</string>
<string name="persistent_key_conflict_msg">Vous ne pouvez pas activer les clés persistantes alors que le tunnel est configuré pour générer de nouvelles clés à la réouverture. Voulez-vous désactiver les nouvelles clés à la réouverture?</string>
<string name="tunnel_summ_persistent_key">Garder la destination de ce tunnel quand il redémarre</string>
<string name="reachable_on">Accessible sur</string>
<string name="listen_port">Port découte</string>
@ -277,7 +289,7 @@
<string name="profile_interactive">Connexion interactive</string>
<string name="delay_connect">Retarder la connexion</string>
<string name="tunnel_summ_delay_connect">Activer les connexions pour requêtes et réponses</string>
<string name="access_control">Contrôle des accès</string>
<string name="access_control">Contrôle de laccès</string>
<string name="restricted_access">Accès restreint</string>
<string name="disabled">Désactivé</string>
<string name="whitelist">Liste blanche</string>
@ -319,13 +331,13 @@
<string name="reduced_tunnel_quantity">La quantité de tunnels a été réduite</string>
<string name="close_tunnels">Fermer les tunnels quand ils sont inactifs</string>
<string name="new_keys_on_reopen">Nouvelles clés lors dune réouverture</string>
<string name="new_keys_on_reopen_conflict_title">Désactiver les clés persistantes ?</string>
<string name="new_keys_on_reopen_conflict_msg">Vous ne pouvez pas activer la génération de nouvelles clés lors dune réouverture alors que le tunnel est configuré pour utiliser des clés persistantes. Voulez-vous désactiver les clés persistantes ?</string>
<string name="new_keys_on_reopen_conflict_title">Désactiver les clés persistantes?</string>
<string name="new_keys_on_reopen_conflict_msg">Vous ne pouvez pas activer la génération de nouvelles clés à la réouverture alors que le tunnel est configuré pour avoir des clés persistantes. Voulez-vous désactiver les clés persistantes?</string>
<string name="http_client">Client HTTP</string>
<string name="tunnel_summ_user_agent">Passer len-tête « agent utilisateur »</string>
<string name="tunnel_summ_referer">Passer len-tête Référent</string>
<string name="tunnel_summ_accept">Passer len-tête « Accept-* »</string>
<string name="tunnel_summ_allow_ssl">Autoriser SSL vers des adresses I2P</string>
<string name="tunnel_summ_user_agent">Passer len-tête « agent utilisateur »</string>
<string name="tunnel_summ_referer">Passer len-tête « Référent »</string>
<string name="tunnel_summ_accept">Passer len-tête « Accept-* »</string>
<string name="tunnel_summ_allow_ssl">Permettre SSL vers des adresses I2P</string>
<string name="jump_url_list">Liste dURL de saut</string>
<string name="proxy_auth">Autorisation du mandataire</string>
<string name="tunnel_summ_proxy_auth">Exiger une authentification pour utiliser ce mandataire</string>
@ -341,10 +353,12 @@
<string name="no_error_messages">Aucun message derreur</string>
<plurals name="log_error_messages">
<item quantity="one">Un message derreur</item>
<item quantity="many">%d messages derreur, les plus récents en premier</item>
<item quantity="other">%d messages derreur, les plus récents en premier</item>
</plurals>
<plurals name="log_messages">
<item quantity="one">Un message</item>
<item quantity="many">%d messages, les plus récents en premier</item>
<item quantity="other">%d messages, les plus récents en premier</item>
</plurals>
<string name="log_entry">Entrée de journal</string>
@ -356,4 +370,5 @@
<string name="label_browser_configuration">Configuration du navigateur</string>
<string name="no_market_app">Aucune logithèque trouvée, veuillez installer manuellement.</string>
<string name="unset">Non défini</string>
<string name="running_background">I2P s\'exécute en arrière-plan</string>
</resources>

View File

@ -0,0 +1,117 @@
<?xml version='1.0' encoding='UTF-8'?>
<resources>
<string name="app_name">I2P</string>
<string name="desc_i2p_logo">Logo de I2P</string>
<string name="choose_language">Escolle a lingua</string>
<string name="welcome_new_install">Benvido/a a I2P! Ista app é software ALPHA e non fornece un anonimato forte. Por favor le as notas da publicación e a información da licenza.</string>
<string name="welcome_new_version">Nova versión instalada. Por favor le as notas da edición. Versión: </string>
<string name="label_tunnels">Túneles</string>
<string name="label_status">Estado</string>
<string name="label_console">Consola</string>
<string name="label_addresses">Enderezos</string>
<string name="label_addressbook">Axenda de Enderezos</string>
<string name="label_i2ptunnel_client">Túneles de Cliente</string>
<string name="label_i2ptunnel_server">Túneles de Servidor</string>
<string name="label_logs">Rexistros (Logs)</string>
<string name="label_error_logs">Rexistros (Logs) de Erros</string>
<string name="label_news">Noticias</string>
<string name="label_peers_status">Pares</string>
<string name="label_release_notes">Notas da edición</string>
<string name="label_licenses">Licencias</string>
<string name="label_browse">Navegar</string>
<string name="label_graphs">Gráficas</string>
<string name="button_router_off">Pulsación longa para iniciar I2P</string>
<string name="button_router_on">I2P está en marcha (pulsación longa para deter)</string>
<string name="button_router_graceful">I2P hase deter en %s</string>
<string name="button_shutdown_now">Pulsación longa para deter agora</string>
<string name="button_cancel_graceful">Pulsación longa para cancelar o apagado</string>
<string name="no_internet">Non hai conexión a Internet dispoñible</string>
<string name="hidden">Oculto</string>
<string name="testing">A probar...</string>
<string name="firewalled">Detrás dunha devasa</string>
<string name="symmetric_nat">NAT simétrico</string>
<string name="net_status_error_i2cp">Erro do xestor de cliente I2CP - Revisa os logues</string>
<!--Parameter is a time, e.g. 32s or 2m-->
<string name="net_status_error_skew">Desfase do reloxo en %s</string>
<string name="net_status_error_unresolved_tcp">Enderezo TCP non resolto</string>
<string name="net_status_error_private_tcp">Enderezo TCP privado</string>
<string name="net_status_warn_firewalled_inbound_tcp">Detrás dunha devasa con TCP entrante habilitado</string>
<string name="net_status_warn_firewalled_floodfill">Detrás dunha devasa e </string>
<string name="net_status_info_disconnected">Desconectado - Comprobar conexión á rede</string>
<string name="net_status_error_udp_port">Porto UDP en uso - cambiao na configuración e reinicia</string>
<string name="net_status_error_no_active_peers">Non hay pares activos - comproba a túa conexión á rede e o teu cortafogos</string>
<string name="shared_clients">Clientes compartidos</string>
<string name="active_peers">Pares activos</string>
<string name="known_peers">Pares coñecidos</string>
<!--Character to indicate a client tunnel. Usually first letter of the word "client".-->
<string name="char_client_tunnel">C</string>
<!--Character to indicate a server tunnel. Usually first letter of the word "server".-->
<string name="char_server_tunnel">S</string>
<string name="no_tunnels_running">Aínda non hai túneles en marcha.</string>
<string name="download">Descargar</string>
<string name="upload">Cargar</string>
<string name="configure_browser_title">Configurar o navegador?</string>
<string name="first_start_title">Parabéns por instalares I2P!</string>
<string name="first_start_read">Mentres agardas por favor le as notas do lanzamento</string>
<string name="first_start_faq_nonanon">Ou usa ista ligazón non anónima se non queres agardar polos túneles:</string>
<string name="action_search">Buscar</string>
<string name="action_add">Engadir</string>
<string name="action_edit">Editar</string>
<string name="action_delete">Borrar</string>
<string name="action_i2ptunnel_start">Inicia-lo túnel</string>
<string name="action_i2ptunnel_stop">Dete-lo túnel</string>
<string name="action_i2ptunnel_start_all">Iniciar tódolos túneles</string>
<string name="action_i2ptunnel_stop_all">Deter tódolos túneles</string>
<string name="action_i2ptunnel_restart_all">Reiniciar tódolos túneles</string>
<string name="action_reload">Recargar</string>
<string name="action_refresh">Refrescar</string>
<string name="hint_search_addressbook">Buscar na axenda de enderezos</string>
<string name="action_reload_subscriptions">Recargar subscripcións</string>
<string name="news_last_updated">Novas actualizadas fai %s</string>
<string name="news_last_checked">Novas comprobadas fai %s</string>
<string name="news_updated">Novas actualizadas</string>
<string name="view_news">Preme para ver al últimas novas de I2P</string>
<string name="statistics">Estadísticas</string>
<string name="countries">Países</string>
<string name="country">País</string>
<string name="versions">Versións</string>
<string name="version">Versión</string>
<string name="notification_status_starting">I2P está a se iniciar</string>
<string name="notification_status_restarting">I2P está a se reiniciar</string>
<string name="notification_status_running">I2P está en funcionamento</string>
<string name="notification_status_client_ready">Os túneles de cliente están preparados</string>
<string name="menu_settings">Opcións</string>
<string name="settings_enable">Activar</string>
<string name="settings_label_bandwidth_net">Rede e ancho de banda</string>
<string name="settings_label_startOnBoot">Lanzar I2P no inicio</string>
<string name="settings_label_bw_inbound">Velocidade entrante</string>
<string name="settings_label_network">Rede</string>
<string name="settings_label_appearance">Aparencia</string>
<string name="settings_label_language">Idioma</string>
<string name="settings_default">Predeterminado</string>
<string name="settings_label_advanced">Avanzadas</string>
<string name="settings_summ_expl_lengthVariance">%s</string>
<string name="menu_about">Acerca de</string>
<string name="about_version">Versión:</string>
<string name="menu_help">Axuda</string>
<string name="general">Xeral</string>
<string name="addressbook_add_wizard_k_name">Nome</string>
<string name="addressbook_add_wizard_k_destination">Destino</string>
<string name="i2ptunnel_new_tunnel">Novo Túnel</string>
<string name="i2ptunnel_msg_tunnel_starting">Iniciando o túnel</string>
<string name="i2ptunnel_msg_tunnel_stopping">Detendo o túnel</string>
<string name="i2ptunnel_wizard_k_name">Nome</string>
<string name="i2ptunnel_wizard_k_desc">Descrición</string>
<string name="i2ptunnel_wizard_k_dest">Destino</string>
<string name="next">Seguinte</string>
<string name="finish">Enviar</string>
<string name="review">Revisión</string>
<string name="enabled">Activado</string>
<string name="i2ptunnel_view_target">Destino</string>
<string name="name">Nome</string>
<string name="description">Descrición</string>
<string name="disabled">Desactivado</string>
<string name="username">Nome de usuario</string>
<string name="password">Contrasinal</string>
<string name="other">Outra</string>
</resources>

View File

@ -0,0 +1,260 @@
<?xml version='1.0' encoding='UTF-8'?>
<resources>
<string name="app_name">I2P</string>
<string name="desc_i2p_logo">I2P logo</string>
<string name="choose_language">Nyelv választása</string>
<string name="welcome_new_install">Üdvözöl az I2P! Ez az alkalmazás egy ALPHA szoftver és nem nyújt erős anonimitást. Kérlek olvasd el a verziókövetési jegyzetet és a licencinformációt.</string>
<string name="welcome_new_version">Új verzió telepítve. Kérlek olvasd el a verziókövetési jegyzetet. Verzió:</string>
<string name="label_tunnels">Alagutak</string>
<string name="label_status">Állapot</string>
<string name="label_console">Konzol</string>
<string name="label_addresses">Címek</string>
<string name="label_addressbook">Címjegyzék</string>
<string name="label_i2ptunnel_client">Kliens alagutak</string>
<string name="label_i2ptunnel_server">Kiszolgáló alagutak</string>
<string name="label_logs">Napló</string>
<string name="label_error_logs">Hibanapló</string>
<string name="label_news">Hírek</string>
<string name="label_peers_status">Peer-ek</string>
<string name="label_release_notes">Verziókövetési jegyzet</string>
<string name="label_licenses">Licencek</string>
<string name="label_browse">Tallóz</string>
<string name="label_graphs">Grafikonok</string>
<string name="button_router_off">Hosszan nyomja le az I2P elindításához</string>
<string name="button_router_on">I2P fut (hosszan nyomja le a megállításhoz)</string>
<string name="button_router_graceful">Az I2P bezárul %s másodpercen belül</string>
<string name="button_shutdown_now">Hosszan nyomja le az azonnali megállításhoz</string>
<string name="button_cancel_graceful">Hosszan nyomja le a bezárás megszakításához</string>
<string name="no_internet">Nincs internet kapcsolat</string>
<string name="hidden">Rejtett</string>
<string name="testing">Tesztelés</string>
<string name="firewalled">Tűzfal mögött</string>
<string name="symmetric_nat">Szimmetrikus NAT</string>
<string name="net_status_error_i2cp">Kliens kezelő I2CP hiba - ellenőrizze a naplót</string>
<!--Parameter is a time, e.g. 32s or 2m-->
<string name="net_status_error_skew">Óra pontatlansága: %s</string>
<string name="net_status_error_unresolved_tcp">Feloldhatatlan TCP cím</string>
<string name="net_status_error_private_tcp">Privát TCP cím</string>
<string name="net_status_warn_firewalled_inbound_tcp">Tűzfal mögött és bejövő TCP engedélyezve</string>
<string name="net_status_warn_firewalled_floodfill">Tűzfal mögött és floodfill</string>
<string name="net_status_info_disconnected">Szétkapcsolva - ellenőrizze a hálózati kapcsolatot</string>
<string name="net_status_error_udp_port">UDP port már használatban - változtassa meg a beállításokban és indítsa újra</string>
<string name="net_status_error_no_active_peers">Nincsenek aktív peerek - ellenőrizze a hálózati kapcsolatot és a tűzfalat</string>
<string name="net_status_error_udp_disabled_tcp_not_set">UDP letiltva és a bejövő TCP hoszt/port nincs beállítva</string>
<string name="net_status_warn_firewalled_udp_disabled">Tűzfal mögött letiltott UDP-vel</string>
<string name="shared_clients">Megosztott kliensek</string>
<string name="uptime">Indítás óta eltelt idő</string>
<string name="active_peers">Aktív peerek</string>
<string name="known_peers">Ismert peerek</string>
<!--Character to indicate a client tunnel. Usually first letter of the word "client".-->
<string name="char_client_tunnel">M</string>
<!--Character to indicate a server tunnel. Usually first letter of the word "server".-->
<string name="char_server_tunnel">S</string>
<string name="no_tunnels_running">Még nem futnak alagutak.</string>
<string name="download">Letöltés</string>
<string name="upload">Feltöltés</string>
<string name="configure_browser_title">Böngésző beállítása?</string>
<string name="configure_browser_for_i2p">Szeretné beállítani a böngészőt az I2P oldalak megjelenítéséhez? (Ezt később is megteheti a “Segítség” menüből.)</string>
<string name="configure_no_doze_title">Hírek frissítve</string>
<string name="first_start_title">Gratulálunk az I2P telepítéséhez!</string>
<string name="first_start_welcome"><b>Üdvözli az I2P!</b> Kérem <b>legyen türelemmel</b> amíg az I2P elindul és peer-eket talál.</string>
<string name="first_start_read">Amíg várakozik, kérjük olvassa el a kiadási megjegyzéseket és az üdvözlőlapot.</string>
<string name="first_start_faq">Kérjük, hogy miután már vannak kliens-alagútjai <b>tekintse meg</b> a GYIK-et is:</string>
<string name="first_start_faq_nonanon">Vagy használja ezt a nem-anonim hivatkozást ha nem akar várakozni az alagutakra:</string>
<string name="action_search">Keresés</string>
<string name="action_add">Hozzáadás</string>
<string name="action_edit">Szerkesztés</string>
<string name="action_delete">Törlés</string>
<string name="action_i2ptunnel_start">Alagút elindítása</string>
<string name="action_i2ptunnel_stop">Alagút leállítása</string>
<string name="action_i2ptunnel_start_all">Összes alagút elindítása</string>
<string name="action_i2ptunnel_stop_all">Összes alagút leállítása</string>
<string name="action_i2ptunnel_restart_all">Összes alagút újraindítása</string>
<string name="action_reload">Újratöltés</string>
<string name="action_refresh">Frissítés</string>
<string name="hint_search_addressbook">Keresés a címjegyzékben</string>
<string name="action_reload_subscriptions">Feliratkozások újratöltése</string>
<string name="news_updated">Hírek Frissítve</string>
<string name="router_not_running">A router nem fut.</string>
<string name="router_shutting_down">A router bezárása folyamatban.</string>
<string name="stats_not_ready">A statisztikakezelő még nincs kész. Próbáld újra később.</string>
<string name="select_an_address">Válassz egy címet.</string>
<string name="configure_graphs">Grafikonok beállítása</string>
<string name="statistics">Statisztikák</string>
<string name="routers">Routerek</string>
<string name="leasesets">Úticél Kapcsolódási Információ (LeaseSet)</string>
<string name="countries">Ország</string>
<string name="country">Ország</string>
<string name="transport">Szállítás</string>
<string name="versions">Verziók</string>
<string name="version">Verzió</string>
<string name="count">Mennyiség</string>
<string name="tname_0">Rejtett vagy indul</string>
<string name="netdb_routers_empty">Nincsenek router-ek a NetDB-dben.</string>
<string name="notification_status_starting">az I2P indul</string>
<string name="notification_status_restarting">Az I2P újraindul</string>
<string name="notification_status_waiting">Az I2P hálózati kapcsolatra vár</string>
<string name="notification_status_starting_after_waiting">Hálózat csatlakoztatva, az I2P indul</string>
<string name="notification_status_running">Az I2P fut</string>
<string name="notification_status_client_ready">Kliens alagutak készen állnak</string>
<string name="notification_status_client_down">Kliens alagutak leálltak</string>
<string name="notification_status_graceful">I2P megállítása %s másodperc múlva</string>
<string name="notification_status_stopping">I2P megállítása</string>
<string name="notification_status_stopping_after_net">Hálózat szétkapcsolva, I2P megáll</string>
<string name="notification_status_shutdown_cancelled">Bezárás megszakítva</string>
<string name="notification_status_shutting_down">Az I2P bezárás alatt</string>
<string name="notification_status_bw">Sávszélesség: %1$sBps le / %2$sBps fel</string>
<string name="notification_status_peers">Peer-ek: %1$d aktív, %2$d ismert</string>
<string name="notification_status_expl">Felderítő alagutak: %1$d/%2$d</string>
<string name="notification_status_client">Kliens alagutak: %1$d/%2$d</string>
<string name="menu_settings">Beállítások</string>
<string name="settings_enable">Engedélyezés</string>
<string name="settings_label_bandwidth_net">Sávszélesség és hálózat</string>
<string name="settings_label_startOnBoot">Az I2P indítása Rendszerindításkor</string>
<string name="settings_desc_startOnBoot">Automatikus csatlakozás az I2P-hez, mikor az Android eszközöd elindul</string>
<string name="settings_label_bandwidth">Sávszélesség</string>
<string name="settings_label_bw_inbound">Bejövő sebesség</string>
<string name="settings_desc_bw_inbound">Maximális bejövő sebesség</string>
<string name="settings_label_bw_outbound">Kimenő sebesség</string>
<string name="settings_desc_bw_outbound">Maximális kimenő sebesség</string>
<string name="settings_label_network">Hálózat</string>
<string name="settings_desc_hiddenMode">Rejtett mód kikapcsolása</string>
<string name="settings_label_maxPartTunnels">Maximális résztvevő alagutak</string>
<string name="settings_desc_maxPartTunnels">Alagutak maximális száma amiben részt vesz (alapértelmezés=20)</string>
<string name="settings_dialog_maxPartTunnels">Alagutak maximális száma amiben részt vesz</string>
<string name="settings_desc_upnp">Tűzfal portok automatikus nyitása</string>
<string name="settings_label_logging">Naplózás</string>
<string name="settings_label_default_log_level">Alapértelmezett naplózási szint</string>
<string name="settings_label_appearance">Megjelenés</string>
<string name="settings_label_language">Nyelv</string>
<string name="settings_default">Alapértelmezett</string>
<string name="settings_label_advanced">Haladó</string>
<string name="settings_label_showStats">Router statisztika</string>
<string name="settings_label_transports">Átvitel</string>
<string name="settings_label_maxConns">Max kapcsolatok</string>
<string name="settings_label_i2cp">I2CP felület</string>
<string name="settings_desc_exploratory_pool">Alagút paraméterei</string>
<string name="settings_label_expl_inbound">Bejövő alagutak</string>
<string name="settings_label_expl_outbound">Kimenő alagutak</string>
<string name="settings_label_expl_length">Hossz</string>
<string name="settings_label_expl_quantity">Mennyiség</string>
<string name="settings_summ_expl_quantity">%s alagút</string>
<string name="settings_desc_expl_quantity">Mennyi alagút</string>
<string name="settings_label_expl_backupQuantity">Mentési mennyiség</string>
<string name="settings_summ_expl_backupQuantity">%s alagút</string>
<string name="settings_desc_expl_backupQuantity">Mennyi tartalék alagút</string>
<string name="menu_about">Névjegy</string>
<string name="about_version">Verzió:</string>
<string name="about_project">A projekt honlapja:</string>
<string name="about_bugs">Hibaelhárítás és Támogatás:</string>
<string name="about_helpwanted">Segítséget Kérünk!</string>
<string name="menu_help">Segítség</string>
<string name="general">Általános</string>
<string name="label_router">Nyilvános cmek</string>
<string name="label_private">Privát címek</string>
<string name="addressbook_is_empty">Címjegyzék üres</string>
<string name="addressbook_search_header">%s találat</string>
<string name="addressbook_add_wizard_k_name">Név</string>
<string name="addressbook_add_wizard_k_destination">Célállomás</string>
<string name="addressbook_add_wizard_desc_name">A név</string>
<string name="i2ptunnel_type_client">Normál kliens</string>
<string name="i2ptunnel_type_httpclient">HTTP kliens</string>
<string name="i2ptunnel_type_ircclient">IRC kliens</string>
<string name="i2ptunnel_type_server">Normál szerver</string>
<string name="i2ptunnel_type_httpserver">HTTP szerver</string>
<string name="i2ptunnel_type_sockstunnel">SOCKS 4/4a/5 proxy</string>
<string name="i2ptunnel_type_socksirctunnel">SOCKS IRC proxy</string>
<string name="i2ptunnel_type_connectclient">CONNECT/SSL/HTTPS proxy</string>
<string name="i2ptunnel_type_ircserver">IRC szerver</string>
<string name="i2ptunnel_type_streamrclient">Streamr kliens</string>
<string name="i2ptunnel_type_streamrserver">Streamr szerver</string>
<string name="i2ptunnel_type_httpbidirserver">HTTP bidir</string>
<string name="install_recommended_app">Ajánlott alkalmazás telepítése?</string>
<string name="app_needed_for_this_tunnel_type">Fel kell telepítenie egy alkalmazást az alagút használatához. Szeretné feltelepíteni az ajánlott alkalmazást?</string>
<string name="i2ptunnel_not_initialized">Az alagutak még nem lettek előkészítve, próbálja meg két perc múlva újra betölteni.</string>
<string name="no_configured_client_tunnels">Nincsenek konfigurált kliens alagutak.</string>
<string name="no_configured_server_tunnels">Nincsenek konfigurált kiszolgáló alagutak.</string>
<string name="i2ptunnel_new_tunnel">Új Alagút</string>
<string name="i2ptunnel_msg_config_saved">A változtatás a beállításokon mentésre kerül</string>
<string name="i2ptunnel_msg_config_save_failed">Beállítások mentése sikertelen</string>
<string name="i2ptunnel_msg_tunnel_starting">Alagút indítása</string>
<string name="i2ptunnel_msg_tunnel_stopping">Alagút leállítása</string>
<string name="i2ptunnel_delete_confirm_message">Törli az alagutat?</string>
<string name="i2ptunnel_delete_confirm_button">Alagút törlése</string>
<string name="i2ptunnel_no_tunnel_details">Alagút részleteit nem lehet betölteni</string>
<string name="i2ptunnel_wizard_k_client_server">Kliens vagy Szerver</string>
<string name="i2ptunnel_wizard_v_client">Kliens alagút</string>
<string name="i2ptunnel_wizard_v_server">Kiszolgáló alagút</string>
<string name="i2ptunnel_wizard_k_type">Alagút típusa</string>
<string name="i2ptunnel_wizard_k_name">Név</string>
<string name="i2ptunnel_wizard_k_desc">Leírás</string>
<string name="i2ptunnel_wizard_k_dest">Célállomás</string>
<string name="i2ptunnel_wizard_k_outproxies">Kimenő proxyk</string>
<string name="i2ptunnel_wizard_k_target_port">Célport</string>
<string name="i2ptunnel_wizard_k_reachable_on">Elérhető itt:</string>
<string name="i2ptunnel_wizard_k_auto_start">Automatikus indítás</string>
<string name="next">Következő</string>
<string name="prev">Előző</string>
<string name="finish">Elküld</string>
<string name="enabled">Engedélyezve</string>
<string name="i2ptunnel_wizard_desc_name">Az alagút neve, az alagutak listáján való azonosítás érdekében.</string>
<string name="i2ptunnel_wizard_desc_desc">Az alagút leírása. Opcionális és csupán csak tájékoztató jellegű.</string>
<string name="i2ptunnel_wizard_desc_outproxies">Ha tud bármilyen kimenő proxy-t ezen típusú alagúthoz (legyen az akár HTTP vagy SOCKS), akkor írja be ide. A proxy-kat vesszővel választhatja el.</string>
<string name="i2ptunnel_wizard_desc_target_host">Ez az IP, melyen a szolgáltatásod fut, ez rendszerint ugyanazon a gépen van, így a 127.0.0.1 automatikusan beírásra kerül.</string>
<string name="i2ptunnel_wizard_desc_target_port">Ez a port, melyen a szolgáltatás csatlakozásokat fogad.</string>
<string name="i2ptunnel_wizard_desc_reachable_on">Ez korlátozza mely számítógépek vagy okostelefonok érhetik el ezt az alagutat.</string>
<string name="i2ptunnel_wizard_desc_binding_port">Ez az a port amin a kliens alagút helyileg elérhető. Továbbá ez a kliens portja a HTTP bidir kiszolgáló alagútnak.</string>
<string name="i2ptunnel_wizard_desc_auto_start">Az alagút is automatikusan elinduljon amikor a router elindul?</string>
<string name="i2ptunnel_wizard_submit_confirm_message">Létrehozza az alagutat?</string>
<string name="i2ptunnel_wizard_submit_confirm_button">Alagút létrehozása</string>
<string name="i2ptunnel_view_target">Cél</string>
<string name="i2ptunnel_view_autostart">Automatikus indítás</string>
<string name="address_copied_to_clipboard">Cím másolva a vágólapra</string>
<string name="edit_tunnel">Alagút szerkesztése</string>
<string name="name">Név</string>
<string name="description">Leírás</string>
<string name="auto_start">Automatikus indítás</string>
<string name="tunnel_summ_auto_start">A router indulásakor az alagút is induljon el.</string>
<string name="tunnel_cat_ports">Helyi portok</string>
<string name="shared_client">Megosztott kliens</string>
<string name="tunnel_summ_shared_client">Használja ugyanazt a Célállomást és alagutakat mint a többi megosztott kliens</string>
<string name="persistent_key_conflict_msg">Nem engedélyezheti az állandó kulcsokat amíg az alagút arra van konfigurálva hogy készítsen új kulcsokat újranyitáskor. Le akarja tiltani az új kulcsok készítését újranyitáskor?</string>
<string name="tunnel_summ_persistent_key">Tartsa meg ennek az alagútnak a Célállomását amikor újraindul</string>
<string name="reachable_on">Elérhető itt:</string>
<string name="listen_port">Figyelő port</string>
<string name="client_ssl">Kliens SSL</string>
<string name="tunnel_summ_client_ssl">Klienseknek a kapcsolódáshoz SSL használata kötelező</string>
<string name="outproxies">Kimenő proxyk</string>
<string name="ssl_outproxies">SSL kimenő proxyk</string>
<string name="irc">IRC</string>
<string name="enable_dcc">DCC Engedélyezése</string>
<string name="tunnel_summ_enable_dcc">IRC klienseknek DCC használatának engedélyezése</string>
<string name="target_port">Célport</string>
<string name="use_ssl">SSL használata</string>
<string name="tunnel_summ_use_ssl">SSL használata célhoz való kapcsolódáshoz</string>
<string name="tunnel_parameters">Alagút paraméterei</string>
<string name="profile">Profil</string>
<string name="delay_connect">Csatlakozás késleltetése</string>
<string name="access_control">Hozzáférés kezelése</string>
<string name="restricted_access">Korlátozott elérés</string>
<string name="disabled">Tiltva</string>
<string name="whitelist">Engedélyezett-Lista</string>
<string name="blacklist">Tiltott-Lista</string>
<string name="access_list">Elérési lista</string>
<string name="reject_inproxies">Bejövő proxyk elutasítása</string>
<string name="post_limits">POST korlát</string>
<string name="tunnel_summ_delay_open">Az alagút nyitás késleltetése szükségessé válásig</string>
<string name="tunnel_summ_reduce_quantity">Alagutak mennyiségének csökkentése üres állapotban</string>
<string name="reduced_tunnel_quantity">Csökkentett alagút mennyiség</string>
<string name="close_tunnels">Alagutak bezárása üresjárat esetén</string>
<string name="new_keys_on_reopen_conflict_msg">Nem engedélyezheti az új kulcsok készítését újranyitáskor amíg az alagút állandó kulcsok használatára van konfigurálva. Le akarja tiltani az állandó kulcsokat?</string>
<string name="http_client">HTTP kliens</string>
<string name="tunnel_summ_allow_ssl">SSL engedélyezése I2P címekhez</string>
<string name="username">Felhasználónév</string>
<string name="password">Jelszó</string>
<string name="other">Egyéb</string>
<string name="signature_type">Aláírás Típusa</string>
<string name="custom_options">Egyéni beállítások</string>
<string name="all">Összes</string>
<string name="no_messages">Nincs üzenet</string>
</resources>

View File

@ -145,7 +145,6 @@
<string name="settings_label_transports">Transport</string>
<string name="settings_label_maxConns">Maks sambungan</string>
<string name="settings_label_i2cp">I2CP antarmuka</string>
<string name="settings_desc_i2cp">Mendengarkan port 7654</string>
<string name="settings_label_exploratory_pool">Pool eksplorasi</string>
<string name="settings_desc_exploratory_pool">Parameter saluran</string>
<string name="settings_label_expl_inbound">Saluran inbound</string>
@ -170,7 +169,6 @@
<string name="about_bugs">Bugs dan Dukungan:</string>
<string name="about_helpwanted">Dibutuhkan Bantuan!</string>
<string name="about_volunteer">Ingin membantu membuat aplikasi lebih baik? Jadilah relawan di forum Android:</string>
<string name="about_donate">Ingin memberikan donasi uang atau bitcoin agar kami dapat membeli lebih banyak perangkat Android untuk pengembangan dan pengujian? Pergi ke:</string>
<string name="menu_help">Bantuan</string>
<string name="general">Umum</string>
<string name="label_router">Alamat publik</string>
@ -231,7 +229,6 @@
<string name="enabled">Diaktifkan</string>
<string name="i2ptunnel_wizard_desc_name">Nama saluran, untuk identifikasi dalam daftar saluran.</string>
<string name="i2ptunnel_wizard_desc_desc">Deskripsi saluran. Ini opsional dan murni informatif.</string>
<string name="i2ptunnel_wizard_desc_dest">Ketik destinasi I2P service yang harus terhubung dengan client tunnel ini. Destinasi ini bisa berbentuk 64 bit destination key atau nama I2P host yang berada di buku alamat anda.</string>
<string name="i2ptunnel_wizard_desc_outproxies">Jika Anda tahu berbagai outproxy untuk jenis saluran ini (baik HTTP ataupun SOCKS), isikan mereka. Pisahkan proxy ganda dengan koma.</string>
<string name="i2ptunnel_wizard_desc_target_host">Ini adalah IP yang padanya berjalan layanan Anda, ini umumnya pada mesin yang sama, jadi 127.0.0.1 diisikan secara otomatis.</string>
<string name="i2ptunnel_wizard_desc_target_port">Ini adalah port yang padanya menerima koneksi layanan.</string>

View File

@ -145,7 +145,6 @@
<string name="settings_label_transports">Trasporti</string>
<string name="settings_label_maxConns">Limite connessioni</string>
<string name="settings_label_i2cp">Interfaccia I2CP</string>
<string name="settings_desc_i2cp">Ascolta sulla porta 7654</string>
<string name="settings_label_exploratory_pool">Esplorazione pool</string>
<string name="settings_desc_exploratory_pool">Parametri tunnel</string>
<string name="settings_label_expl_inbound">Tunnel in ingresso</string>
@ -170,7 +169,6 @@
<string name="about_bugs">Bug e supporto:</string>
<string name="about_helpwanted">Abbiamo bisogno di te!</string>
<string name="about_volunteer">Vuoi aiutarci a creare un\'app migliore? Offriti volontario sul forum di Android:</string>
<string name="about_donate">Vuoi donare al progetto denaro o bitcoin per comprare dispositivi Android, su cui effettuare sviluppo e test dell\'app? Vai qui:</string>
<string name="menu_help">Aiuto</string>
<string name="general">Generale</string>
<string name="label_router">Indirizzi pubblici</string>
@ -230,7 +228,6 @@
<string name="enabled">Abilita</string>
<string name="i2ptunnel_wizard_desc_name">Il nome del tunnel, per identificarlo nell\'elenco dei tunnel.</string>
<string name="i2ptunnel_wizard_desc_desc">Una descrizione del tunnel. È un attributo opzionale a puro titolo informativo.</string>
<string name="i2ptunnel_wizard_desc_dest">Scrivi la destinazione I2P del servizio a cui questo client tunnel dovrebbe connettersi. Questa potrebbe essere la chiave base 64 di destinazione, o un hostname I2P della tua rubrica.</string>
<string name="i2ptunnel_wizard_desc_outproxies">Se conosci qualche proxy di uscita per questo tipo di tunnel (HTTP oppure SOCKS), inseriscilo. Per inserire più proxy, separa i valori usando le virgole.</string>
<string name="i2ptunnel_wizard_desc_target_host">Questo è l\'indirizzo IP sul quale è in funzione il servizio, che generalmente risiede sulla stessa macchina: pertanto si assume il valore 127.0.0.1.</string>
<string name="i2ptunnel_wizard_desc_target_port">Questa è la porta per la quale il servizio accetta connessioni.</string>
@ -340,10 +337,12 @@
<string name="no_error_messages">Nessun messaggio di errore</string>
<plurals name="log_error_messages">
<item quantity="one">Un messaggio di errore</item>
<item quantity="many">%d messaggi di errore, più recenti per primi</item>
<item quantity="other">%d messaggi di errore, più recenti per primi</item>
</plurals>
<plurals name="log_messages">
<item quantity="one">Un messaggio</item>
<item quantity="many">%d messaggi, più recenti per primi</item>
<item quantity="other">%d messaggi, più recenti per primi</item>
</plurals>
<string name="log_entry">Record di log</string>

View File

@ -2,10 +2,12 @@
<resources>
<string name="app_name">I2P</string>
<string name="desc_i2p_logo">I2P ロゴ</string>
<string name="choose_language">言語を選択</string>
<string name="welcome_new_install">I2P へようこそ!このアプリはアルファ版のソフトウェアであり、強い匿名性を提供いたしません。リリース・ノート及びライセンス情報をご覧ください。</string>
<string name="welcome_new_version">新しいバージョンがインストールされました。リリース・ノートをご覧ください。バージョン:</string>
<string name="label_tunnels">トンネル</string>
<string name="label_status">ステータス</string>
<string name="label_status">状態</string>
<string name="label_console">コンソール</string>
<string name="label_addresses">アドレス</string>
<string name="label_addressbook">アドレス帳</string>
<string name="label_i2ptunnel_client">クライアントトンネル</string>
@ -19,25 +21,46 @@
<string name="label_browse">ブラウズ</string>
<string name="label_graphs">グラフ</string>
<string name="button_router_off">長押しして I2P を起動</string>
<string name="button_router_on">I2P を起動中 (長押しで止)</string>
<string name="button_router_on">I2Pは稼働中 (長押しで止)</string>
<string name="button_router_graceful">I2Pは%sでシャットダウン</string>
<string name="button_shutdown_now">長押しで今すぐ停止</string>
<string name="button_cancel_graceful">長押ししてシャットダウンをキャンセル</string>
<string name="no_internet">インターネット接続は利用不可能</string>
<string name="hidden">非表示</string>
<string name="testing">テスト中</string>
<string name="firewalled">警告-ファイアーウォールされ、高速</string>
<string name="firewalled">ファイアーウォールされ</string>
<string name="symmetric_nat">対称型NAT</string>
<string name="net_status_error_i2cp">クライアントマネージャ I2CP エラー- ログをご確認ください</string>
<!--Parameter is a time, e.g. 32s or 2m-->
<string name="net_status_error_skew">%sのクロックスキュー</string>
<string name="net_status_error_unresolved_tcp">未解決の TCP アドレス</string>
<string name="net_status_error_private_tcp">プライベートな TCP アドレス</string>
<string name="net_status_warn_firewalled_inbound_tcp">着信 TCP が有効となり、ファイアーウォールされています</string>
<string name="net_status_warn_firewalled_floodfill">ファイアーウォールに防がれ、 Floodfill</string>
<string name="net_status_info_disconnected">切断されました - ネットワーク接続を確認してください</string>
<string name="net_status_error_udp_port">UDPポートが使用中 - 設定を変更して再起動してください</string>
<string name="net_status_error_no_active_peers">アクティブなピアなし - ネットワークの接続およびファイアーウォールを確認してください</string>
<string name="net_status_error_udp_disabled_tcp_not_set">UDP が無効化され、着信 TCP のホスト/ポートが設定されていません</string>
<string name="net_status_warn_firewalled_udp_disabled">UDP が無効化され、ファイアウォールされています</string>
<string name="shared_clients">共有クライアント</string>
<string name="uptime">稼働時間</string>
<string name="active_peers">アクティブなピア</string>
<string name="known_peers">既知のピア</string>
<!--Character to indicate a client tunnel. Usually first letter of the word "client".-->
<string name="char_client_tunnel">C</string>
<!--Character to indicate a server tunnel. Usually first letter of the word "server".-->
<string name="char_server_tunnel">S</string>
<string name="no_tunnels_running">まだトンネルは起動していません。</string>
<string name="download">ダウンロード</string>
<string name="upload">アップロード</string>
<string name="configure_browser_title">ブラウザの設定をしますか?</string>
<string name="configure_browser_for_i2p">I2Pサイトを見るためにブラウザを設定しますか(あとでヘルプメニューからも設定できます)</string>
<string name="configure_no_doze_title">電池最適化を管理?</string>
<string name="configure_no_doze">I2Pは稼働し続けていれば最もよく動作します。Androidが電気の節約を試みたときにI2Pを終了しないようにするため、電池例外の一覧にI2Pを追加できます。これにより、アプリケーションの信頼性が大幅に上昇します。\n\nI2Pをバックグラウンドで稼働し続けますか推奨</string>
<string name="first_start_title">I2P のインストールおめでとうございます!</string>
<string name="first_start_welcome"><b>I2P へようこそ!</b> I2P が立ち上がり、ピアを見つけるまで<b>我慢してください</b></string>
<string name="first_start_read">待っている間、リリースノートとウェルカムページをお読みください。</string>
<string name="first_start_faq">クライアントトンネルを得たら、以下の FAQ <b>ご確認ください</b>:</string>
<string name="first_start_faq">クライアントトンネルを得たら、以下のよくある質問<b>ご確認ください</b>:</string>
<string name="first_start_faq_nonanon">あるいは、トンネルを待ちたくないなら、この非匿名リンクを使用してください:</string>
<string name="first_start_irc">IRC クライアントを <b>localhost:6668</b> に合わせて、私たちに一言挨拶してください:</string>
<string name="action_search">検索</string>
@ -51,31 +74,56 @@
<string name="action_i2ptunnel_restart_all">全てのトンネルを再開始</string>
<string name="action_reload">再読み込み</string>
<string name="action_refresh">更新</string>
<string name="hint_search_addressbook">アドレスブックを検索</string>
<string name="hint_search_addressbook">アドレスを検索</string>
<string name="action_reload_subscriptions">購読を再読込</string>
<string name="news_last_updated">ニュースは%s前に最終更新</string>
<string name="news_last_checked">ニュースは%s前に最終確認</string>
<string name="news_updated">ニュース更新</string>
<string name="view_news">タッチして最終のI2Pのニュースを表示</string>
<string name="router_not_running">ルーターが起動していません。</string>
<string name="router_shutting_down">ルーターはシャットダウン中です。</string>
<string name="stats_not_ready">統計マネージャーはまだ準備出来ていません。後でやり直してください。</string>
<string name="select_an_address">アドレスを選択</string>
<string name="no_graphs_configured">グラフは設定されていません。設定でどの統計をグラフにするか選択できます。すべての変更は60秒後に有効になります</string>
<string name="configure_graphs">グラフ設定</string>
<string name="graphs_not_ready">グラフの準備ができていません。後でやり直してください。</string>
<string name="statistics">統計</string>
<string name="routers">ルーター</string>
<string name="leasesets">リースセット</string>
<string name="countries"></string>
<string name="country"></string>
<string name="transport">トランスポート</string>
<string name="versions">バージョン</string>
<string name="version">バージョン</string>
<string name="count">カウント</string>
<string name="tname_0">隠すか起動中</string>
<string name="netdb_routers_empty">NetDB にルーターがありません。</string>
<string name="netdb_leases_empty">NetDB にリースセットがありません。</string>
<string name="notification_status_starting">I2P は起動中</string>
<string name="notification_status_restarting">I2P は再起動中</string>
<string name="notification_status_waiting">I2Pはネットワーク接続を待機しています</string>
<string name="notification_status_starting_after_waiting">ネットワーク接続済み、I2Pは起動中</string>
<string name="notification_status_running">I2P は稼働中</string>
<string name="notification_status_client_ready">クライアントトンネルは準備完了</string>
<string name="notification_status_client_down">クライアントトンネルは落ちます</string>
<string name="notification_status_graceful">%sでI2Pを停止</string>
<string name="notification_status_stopping">I2Pを停止中</string>
<string name="notification_status_stopping_after_net">ネットワーク切断、I2Pを停止中</string>
<string name="notification_status_shutdown_cancelled">シャットダウンをキャンセルしました</string>
<string name="notification_status_shutting_down">I2Pはシャットダウン中です。</string>
<string name="notification_status_bw">帯域幅: %1$sBps 下方向 / %2$sBps 上方向</string>
<string name="notification_status_peers">ピア: %1$d アクティブ、 %2$d 既知</string>
<string name="notification_status_expl">予備トンネル: %1$d/%2$d</string>
<string name="notification_status_expl">調査トンネル: %1$d/%2$d</string>
<string name="notification_status_client">クライアントトンネル: %1$d/%2$d</string>
<string name="stats_memory">メモリ 使用/最大</string>
<string name="copied_base32_system_notification_title">Base32をクリップボードにコピー</string>
<string name="copied_base32_system_notification_body">あなたのI2Pトンネルのアドレスはクリップボードにコピーされました。</string>
<string name="menu_settings">設定</string>
<string name="settings_enable">有効</string>
<string name="settings_desc_subscriptions">URL を登録</string>
<string name="settings_label_bandwidth_net">帯域幅とネットワーク</string>
<string name="settings_label_startOnBoot">デバイスの起動時にI2Pも起動</string>
<string name="settings_desc_startOnBoot">デバイスの起動時に自動でI2Pに接続</string>
<string name="settings_label_startOnBoot">端末の起動時にI2Pも起動</string>
<string name="settings_desc_startOnBoot">Android端末の起動時に自動でI2Pに接続</string>
<string name="settings_label_bandwidth">帯域幅</string>
<string name="settings_label_bw_inbound">受信速度</string>
<string name="settings_desc_bw_inbound">最大受信速度</string>
@ -83,7 +131,7 @@
<string name="settings_desc_bw_outbound">最大送信速度</string>
<string name="settings_label_network">ネットワーク</string>
<string name="settings_label_hiddenMode">参加</string>
<string name="settings_desc_hiddenMode">ヒドゥン・モードを切る</string>
<string name="settings_desc_hiddenMode">秘匿モードを切る</string>
<string name="settings_label_maxPartTunnels">最大参加トンネル数</string>
<string name="settings_desc_maxPartTunnels">参加するトンネルの最大数 (既定=20)</string>
<string name="settings_dialog_maxPartTunnels">参加するトンネルの最大数</string>
@ -92,7 +140,7 @@
<string name="settings_dialog_sharePercent">共有する帯域幅の割合</string>
<string name="settings_desc_upnp">自動的にファイアーウォールのポートを開く</string>
<string name="settings_label_logging">ロギング</string>
<string name="settings_label_default_log_level">デフォルトのログ水準</string>
<string name="settings_label_default_log_level">規定のログ水準</string>
<string name="settings_label_appearance">外観</string>
<string name="settings_label_language">言語</string>
<string name="settings_default">デフォルト</string>
@ -102,8 +150,14 @@
<string name="settings_label_transports">トランスポート</string>
<string name="settings_label_maxConns">最大接続数</string>
<string name="settings_label_i2cp">I2CP インターフェース</string>
<string name="settings_desc_i2cp">7654番ポートでリッスン</string>
<string name="settings_label_exploratory_pool">予備プール</string>
<string name="settings_desc_i2cp">サードパーティのアプリがI2CPを使用するトンネルを作成することを許可ルーターの再起動が必要</string>
<string name="settings_label_sam">SAMインターフェース</string>
<string name="settings_desc_sam">サードパーティのアプリがSAMを使用するトンネルを作成することを許可ルーターの再起動が必要</string>
<string name="settings_confirm_sam">アプリケーションはSAM接続を作成することを試行中。</string>
<string name="settings_confirm_sam_id">接続 名/ID:</string>
<string name="settings_confirm_allow_sam">タップして許可</string>
<string name="settings_confirm_deny_sam">無視して拒否</string>
<string name="settings_label_exploratory_pool">調査のプール</string>
<string name="settings_desc_exploratory_pool">トンネルパラーメーター</string>
<string name="settings_label_expl_inbound">受信トンネル</string>
<string name="settings_label_expl_outbound">送信トンネル</string>
@ -126,10 +180,13 @@
<string name="about_project">プロジェクトホーム:</string>
<string name="about_bugs">バグとサポート:</string>
<string name="about_helpwanted">人手募集中!</string>
<string name="about_volunteer">アプリの改善を手伝いたいですか? Android フォーラム上でボランティア:</string>
<string name="about_donate">開発や試験用にさらに Android デバイスを購入するために、お金や Bitcoin を寄付していただけますか? こちらです:</string>
<string name="about_volunteer">アプリの改善を手伝いたいですか? Android フォーラム上で助力:</string>
<string name="about_gitlab">機能またはバグ修正の提案を行いますか Android Gitlab上でMerge要求を作成してください:</string>
<string name="menu_help">ヘルプ</string>
<string name="general">一般</string>
<string name="label_router">公開アドレス</string>
<string name="label_private">非公開アドレス</string>
<string name="addressbook_is_empty">アドレス帳は空です</string>
<string name="addressbook_search_header">%s 検出</string>
<string name="addressbook_add_wizard_k_name">名前</string>
<string name="addressbook_add_wizard_k_destination">宛先</string>
@ -154,7 +211,9 @@
<string name="i2ptunnel_type_httpbidirserver">HTTP 双方向</string>
<string name="install_recommended_app">推奨アプリをインストールしますか?</string>
<string name="app_needed_for_this_tunnel_type">このトンネルを使用するには推奨アプリをインストールする必要があります。インストールしますか?</string>
<string name="i2ptunnel_not_initialized">トンネルはまだ初期化されていません、2分後に再読み込みしてください。</string>
<string name="i2ptunnel_not_initialized">トンネルはまだ初期化されていませんので、2分後に再読み込みしてください。</string>
<string name="no_configured_client_tunnels">設定されていないクライアントンネル。</string>
<string name="no_configured_server_tunnels">設定されていないサーバートンネル。</string>
<string name="i2ptunnel_new_tunnel">新規トンネル</string>
<string name="i2ptunnel_msg_config_saved">構成の変更が保存されました</string>
<string name="i2ptunnel_msg_config_save_failed">構成の保存に失敗しました</string>
@ -162,10 +221,11 @@
<string name="i2ptunnel_msg_tunnel_stopping">トンネルを停止中</string>
<string name="i2ptunnel_delete_confirm_message">トンネルを削除しますか?</string>
<string name="i2ptunnel_delete_confirm_button">トンネルを削除</string>
<string name="i2ptunnel_no_tunnel_details">トンネルの詳細を読み込めませんでした</string>
<string name="i2ptunnel_wizard_k_client_server">クライアントあるいはサーバー</string>
<string name="i2ptunnel_wizard_v_client">クライアントトンネル</string>
<string name="i2ptunnel_wizard_v_server">サーバートンネル</string>
<string name="i2ptunnel_wizard_k_type">トンネルタイプ</string>
<string name="i2ptunnel_wizard_k_type">トンネルの種類</string>
<string name="i2ptunnel_wizard_k_name">名前</string>
<string name="i2ptunnel_wizard_k_desc">説明</string>
<string name="i2ptunnel_wizard_k_dest">宛先</string>
@ -182,7 +242,8 @@
<string name="enabled">有効</string>
<string name="i2ptunnel_wizard_desc_name">トンネルリストでの識別用に、トンネルの名前。</string>
<string name="i2ptunnel_wizard_desc_desc">トンネルの説明。これは任意であり、単なる参考です。</string>
<string name="i2ptunnel_wizard_desc_outproxies">のタイプのトンネル用 HTTP か SOCKS のいずれか) のアウトプロキシを知っているなら、それらを入力してください。カンマで複数のプロキシを分割できます。</string>
<string name="i2ptunnel_wizard_desc_dest">こでは、トンネルの .i2p アドレスまたは宛先(ホスト名.i2p、b32 または b64を指定します。</string>
<string name="i2ptunnel_wizard_desc_outproxies">この種類のトンネル用 HTTP か SOCKS のいずれか) のアウトプロキシを知っているなら、それらを入力してください。カンマで複数のプロキシを分割できます。</string>
<string name="i2ptunnel_wizard_desc_target_host">これは、サービスが起動している IPです。通常同一のマシン上なので、 127.0.0.1 が自動で入力されます。</string>
<string name="i2ptunnel_wizard_desc_target_port">これはサービスが接続を受け入れているポートです。</string>
<string name="i2ptunnel_wizard_desc_reachable_on">これはどのコンピューターまたはスマートフォンがトンネルにアクセスできるかを制限するものです。</string>
@ -191,7 +252,9 @@
<string name="i2ptunnel_wizard_submit_confirm_message">トンネルを作成しますか?</string>
<string name="i2ptunnel_wizard_submit_confirm_button">トンネルを作成</string>
<string name="i2ptunnel_view_target">ターゲット</string>
<string name="i2ptunnel_view_access_point">アクセスポイント</string>
<string name="i2ptunnel_view_autostart">自動開始</string>
<string name="address_copied_to_clipboard">アドレスはクリップボードにコピーされました</string>
<string name="edit_tunnel">トンネルを編集</string>
<string name="name">名前</string>
<string name="description">説明</string>
@ -199,8 +262,12 @@
<string name="tunnel_summ_auto_start">ルーター起動時にトンネルを開始</string>
<string name="tunnel_cat_ports">ローカルポート</string>
<string name="shared_client">共有クライアント</string>
<string name="target_destination">範囲</string>
<string name="persistent_key">永続的なキー</string>
<string name="tunnel_summ_shared_client">他の共有クライアントと同じ宛先を使う</string>
<string name="target_destination">対象の宛先</string>
<string name="persistent_key">永続的な鍵</string>
<string name="persistent_key_conflict_title">新しい鍵の再開放を無効にしますか?</string>
<string name="persistent_key_conflict_msg">再開放で新しい鍵を生成するようトンネルを設定している間に永続鍵を有効にできません。新しい鍵の再開放を無効にしますか?</string>
<string name="tunnel_summ_persistent_key">再起動時にこのトンネルの宛先を維持する</string>
<string name="reachable_on">到達可能</string>
<string name="listen_port">着信ポート</string>
<string name="client_ssl">クライアントSSL</string>
@ -210,22 +277,27 @@
<string name="irc">IRC</string>
<string name="enable_dcc">DCC有効</string>
<string name="tunnel_summ_enable_dcc">DCCを使用しているクライアントにIRCを許可</string>
<string name="website_domain_name">ウェブサイトドメイン・ネーム</string>
<string name="website_domain_name">ウェブサイトドメイン</string>
<string name="target_host">ターゲットホスト</string>
<string name="target_port">ターゲットポート</string>
<string name="use_ssl">SSLを使用</string>
<string name="tunnel_summ_use_ssl">ターゲットに接続するためにSSLを使用</string>
<string name="tunnel_parameters">トンネル調節</string>
<string name="profile">プロファイル</string>
<string name="profile_bulk">バルク接続(ダウンロード/ウェブサイト/BT</string>
<string name="profile_interactive">双方向接続</string>
<string name="delay_connect">接続延滞</string>
<string name="access_control">アクセスコントロール</string>
<string name="tunnel_summ_delay_connect">要求/応答 接続用を有効</string>
<string name="access_control">アクセス制御</string>
<string name="restricted_access">許可されたアクセス</string>
<string name="disabled">無効</string>
<string name="whitelist">ホワイトリスト</string>
<string name="blacklist">ブラックリスト</string>
<string name="access_list">アクセスリスト</string>
<string name="tunnel_summ_reject_inproxies">I2Pユーザー飲みに接続を許可</string>
<string name="reject_inproxies">インプロキシを拒否する</string>
<string name="tunnel_summ_reject_inproxies">I2Pユーザーのみに接続を許可</string>
<string name="unique_local">ユニークローカル</string>
<string name="tunnel_summ_unique_local">クライアントごとに固有のローカルホストIPを使用</string>
<string name="multihome">マルチホーム</string>
<string name="tunnel_summ_multihome">マルチホーム最適化を有効</string>
<string name="client_connection_limits">接続数制限</string>
@ -243,29 +315,55 @@
<string name="unlimited">無制限</string>
<string name="set_zero_for_unlimited">0=無制限</string>
<string name="post_limits">投稿制限</string>
<string name="power_saving">パワーセーブ</string>
<string name="tunnel_summ_delay_open">要求されるまでトンネルのオープンを遅らせる</string>
<string name="limit_period">制限期間</string>
<string name="client_posts_per_period">期間当たりのクライアントのPOST数</string>
<string name="client_ban_length">クライアントの禁止の長さ</string>
<string name="total_posts_per_period">期間当たりの合計POST数</string>
<string name="total_ban_length">禁止の長さの合計</string>
<string name="power_saving">出力温存</string>
<string name="delay_open">開放を遅れさせる</string>
<string name="tunnel_summ_delay_open">要求されるまでトンネルの開放を遅らせる</string>
<string name="reduce_quantity">数を減らす</string>
<string name="tunnel_summ_reduce_quantity">アイドル時トンネルの数を減らす</string>
<string name="idle_time">アイドル時間</string>
<string name="num_minutes">%s /分</string>
<string name="reduced_tunnel_quantity">減らしたトンネルの数量</string>
<string name="close_tunnels">アイドル時トンネルを閉じる</string>
<string name="new_keys_on_reopen">再開放で新しい鍵にする</string>
<string name="new_keys_on_reopen_conflict_title">持続的な鍵を無効化する?</string>
<string name="new_keys_on_reopen_conflict_msg">トンネルが永続鍵を持つよう設定している間に新しい鍵の再解放を有効にできません。永続鍵を無効にしますか?</string>
<string name="http_client">HTTPクライアント</string>
<string name="tunnel_summ_user_agent">\'User-Agent\'ヘッダーを通す</string>
<string name="tunnel_summ_referer">\'リファラー\'ヘッダーを通す</string>
<string name="tunnel_summ_accept">\'Accept-*\'ヘッダーを通す</string>
<string name="tunnel_summ_allow_ssl">I2PアドレスにSSLを使用可能にする</string>
<string name="jump_url_list">ジャンプURLリスト</string>
<string name="proxy_auth">プロキシ認証</string>
<string name="tunnel_summ_proxy_auth">このプロキシを使用するにはログインが必要です</string>
<string name="username">ユーザーネーム</string>
<string name="username">ユーザー</string>
<string name="password">パスワード</string>
<string name="outproxy_auth">外部プロキシ認証</string>
<string name="tunnel_summ_outproxy_auth">ログインにはアウトプロキシが必要です</string>
<string name="other">その他</string>
<string name="signature_type">署名形式</string>
<string name="custom_options">カスタムオプション</string>
<string name="all">すべて</string>
<string name="no_messages">本文がありません</string>
<string name="no_messages">本文なし</string>
<string name="no_error_messages">エラーメッセージなし</string>
<plurals name="log_error_messages">
<item quantity="other">%d エラーメッセージ、新しい順</item>
</plurals>
<plurals name="log_messages">
<item quantity="other">%dメッセージ、新しい順</item>
</plurals>
<string name="log_entry">ログ項目</string>
<string name="copy_logs">ログをコピー</string>
<string name="i2p_android_error_logs">I2PAndroidエラーログ</string>
<string name="i2p_android_logs">I2PAndroidログ</string>
<string name="error_logs_copied_to_clipboard">エラーログはクリップボードにコピーされました</string>
<string name="logs_copied_to_clipboard">ログはクリップボードにコピーされました</string>
<string name="label_browser_configuration">ブラウザ設定</string>
<string name="no_market_app">マーケットのアプリが見つかりませんでした。手動でインストールしてください。</string>
<string name="unset">解除</string>
<string name="running_background">I2Pはバックグラウンドで稼働中</string>
</resources>

View File

@ -145,7 +145,6 @@
<string name="settings_label_transports">트랜스포트</string>
<string name="settings_label_maxConns">최대 접속 수</string>
<string name="settings_label_i2cp">I2CP 인터페이스</string>
<string name="settings_desc_i2cp">7654 포트로 수신</string>
<string name="settings_label_exploratory_pool">예비 풀</string>
<string name="settings_desc_exploratory_pool">터널 파라미터</string>
<string name="settings_label_expl_inbound">수신 터널</string>
@ -170,7 +169,6 @@
<string name="about_bugs">버그와 지원:</string>
<string name="about_helpwanted">도움이 필요합니다!</string>
<string name="about_volunteer">이 앱을 개선시키고 싶나요? 안드로이드 포럼에서 기여하세요:</string>
<string name="about_donate">돈이나 비트코인 기부로 개발과 테스팅에 필요한 안드로이드 기기 구입을 돕고 싶나요? 참조하세요:</string>
<string name="menu_help">도움말</string>
<string name="general">일반</string>
<string name="label_router">공공 주소들</string>
@ -230,7 +228,6 @@
<string name="enabled">활성화됨</string>
<string name="i2ptunnel_wizard_desc_name">터널 리스트에서 구별하기 위한 터널의 이름</string>
<string name="i2ptunnel_wizard_desc_desc">터널의 설명. 선택적이고 단순 정보용.</string>
<string name="i2ptunnel_wizard_desc_dest">클라이언트 터널이 접속하야 하는 I2P 서비스 도착점 입력. 전체 Base 64 도착점 키나 사용자의 주소록에 있는 I2P 호스트 이름 사용 가능.</string>
<string name="i2ptunnel_wizard_desc_outproxies">만약 이 터널 종류의 나가는 프록시를 안다면 (HTTP 또는 SOCKS), 입력. 여러 프록시들을 콤마로 구별.</string>
<string name="i2ptunnel_wizard_desc_target_host">서비스가 작동중인 IP, 대부분의 경우 같은 기기이기 때문에 127.0.0.1이 자동 입력됨.</string>
<string name="i2ptunnel_wizard_desc_target_port">서비스가 접속을 받아들일 포트.</string>

View File

@ -145,7 +145,6 @@
<string name="settings_label_transports">Overføringer</string>
<string name="settings_label_maxConns">Maks. tilknytninger</string>
<string name="settings_label_i2cp">I2CP-grensesnitt</string>
<string name="settings_desc_i2cp">Lytt til port 7654</string>
<string name="settings_label_exploratory_pool">Utforsknings-grunnlag</string>
<string name="settings_desc_exploratory_pool">Tunnel-dimensjoner</string>
<string name="settings_label_expl_inbound">Innkommende tunneler</string>
@ -170,7 +169,6 @@
<string name="about_bugs">Feil og brukerstøtte:</string>
<string name="about_helpwanted">Hjelp ønskes!</string>
<string name="about_volunteer">Vil du gjøre dette programmet bedre? Meld deg som frivillig på Android-forumet:</string>
<string name="about_donate">Vil du donere penger eller bitcoin øremerket flere Android-enheter til utvikling og testformål? Gå til:</string>
<string name="menu_help">Hjelp</string>
<string name="general">Generelt</string>
<string name="label_router">Offentlige adresser</string>
@ -231,7 +229,6 @@
<string name="enabled">Påskrudd</string>
<string name="i2ptunnel_wizard_desc_name">Tunnel-navn, for identifikasjon i tunnel-listen.</string>
<string name="i2ptunnel_wizard_desc_desc">Beskrivelse av tunnelen. Dette er valgfritt, og bare til informasjon.</string>
<string name="i2ptunnel_wizard_desc_dest">Skriv inn I2P-målet og tjenesten som denne klienttunnelen skal koble til. Dette bør være hele base-64 -målnøkkelen, eller et I2P-vertsnavn fra adresseboka di.</string>
<string name="i2ptunnel_wizard_desc_outproxies">Hvis du vet om noen utgående mellomtjenere for denne typen tunnel (enten HTTP eller SOCKS), fyll dem inn. Oppgis flere mellomtjenere må de deles med komma.</string>
<string name="i2ptunnel_wizard_desc_target_host">Dette er IP-en din tjeneste kjører på, dette er vanligvis den samme maskinen, så 127.0.0.1 er ferdigutfylt. </string>
<string name="i2ptunnel_wizard_desc_target_port">Dette er porten tjenesten godtar tilkoblinger på.</string>

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