Compare commits
65 Commits
android-2.
...
i2p-androi
Author | SHA1 | Date | |
---|---|---|---|
b39ee68c2f | |||
3cb746594c | |||
27adae63eb | |||
85890d3b68 | |||
96b045eb2a | |||
8d00c5fa31 | |||
fc93a71552 | |||
18e4aef4ca | |||
5315e35adc | |||
9ad9bc07ff | |||
bde92be29d | |||
849150ffa6 | |||
52dad19c7a | |||
e84a51097d | |||
5289f5068a | |||
09c7d9cfd8 | |||
14d293fe6f | |||
7cd08cfd4c | |||
aa22d83a44 | |||
a1fd8d41b2 | |||
9d24e68b57 | |||
d5e2804ea4 | |||
1edabd7252 | |||
52c1901eba | |||
a6f5221975 | |||
caa57bbc3a | |||
b28e5d741e | |||
0f3a61390c | |||
30a1f1d800 | |||
22d5d126f6 | |||
70e4ea810f | |||
b5c6e1489a | |||
333a1a49b1 | |||
2ea93f106e | |||
d99ed0e5da | |||
3881966ddb | |||
9de9f46489 | |||
149881522e | |||
df26d89310 | |||
707dcbbc78 | |||
812aea9873 | |||
aeb7614b62 | |||
9bf9d27c5a | |||
f2cfe4cee5 | |||
45865ff5b9 | |||
96f9905952 | |||
41ca3fe527 | |||
c5468e4829 | |||
174bb7f827 | |||
3d92f32c13 | |||
2fae27a3b3 | |||
71d38c64e0 | |||
ddb651a602 | |||
a8ad1d8d47 | |||
912602bfc0 | |||
24e3358ffa | |||
fcc51c429d | |||
de0ee87db3 | |||
2102d55315 | |||
2f900ebe2d | |||
5c03981a61 | |||
c68f0ff23a | |||
b01f44ae1f | |||
05aeb0cf37 | |||
fd8d596064 |
73
.github/workflows/ant.yml
vendored
Normal file
73
.github/workflows/ant.yml
vendored
Normal 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
22
.github/workflows/github-sync.yml
vendored
Normal 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
62
.github/workflows/release.yml
vendored
Normal 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
95
.github/workflows/sign.yml
vendored
Normal 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
|
24
.tx/config
24
.tx/config
@ -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
|
||||
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
|
||||
[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 = lib/helper/src/main/res/values/strings.xml
|
||||
source_lang = en
|
||||
type = ANDROID
|
||||
|
||||
|
16
CHANGELOG
16
CHANGELOG
@ -1,3 +1,19 @@
|
||||
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
|
||||
|
@ -33,7 +33,7 @@ translation.
|
||||
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-8-openjdk-amd64` and picking Java 8. **TODO:** add instructions for non-Debian-based
|
||||
`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.)
|
||||
|
||||
|
@ -8,7 +8,7 @@ repositories {
|
||||
android {
|
||||
compileSdkVersion Integer.parseInt(project.ANDROID_BUILD_TARGET_SDK_VERSION as String)
|
||||
defaultConfig {
|
||||
versionCode 4745274
|
||||
versionCode 4745282
|
||||
versionName "$I2P_ANDROID_VERSION"
|
||||
minSdkVersion 21
|
||||
targetSdkVersion Integer.parseInt(project.ANDROID_BUILD_TARGET_SDK_VERSION as String)
|
||||
|
@ -44,6 +44,14 @@
|
||||
<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"
|
||||
|
@ -88,7 +88,7 @@ class InitActivities {
|
||||
|
||||
File abDir = new File(myDir, "addressbook");
|
||||
abDir.mkdir();
|
||||
copyResourceToFile(R.raw.subscriptions_txt, "addressbook/subscriptions.txt");
|
||||
copyResourceToFileIfAbsent(R.raw.subscriptions_txt, "addressbook/subscriptions.txt");
|
||||
mergeResourceToFile(R.raw.addressbook_config_txt, "addressbook/config.txt", null);
|
||||
|
||||
File docsDir = new File(myDir, "docs");
|
||||
|
@ -1,5 +1,13 @@
|
||||
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;
|
||||
@ -8,20 +16,26 @@ import net.i2p.android.router.util.Notifications;
|
||||
import net.i2p.app.ClientApp;
|
||||
import net.i2p.app.ClientAppManager;
|
||||
import net.i2p.app.ClientAppState;
|
||||
import static 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;
|
||||
@ -32,6 +46,7 @@ import java.io.OutputStream;
|
||||
import java.io.OutputStreamWriter;
|
||||
import java.io.Writer;
|
||||
import java.util.Date;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
@ -58,6 +73,10 @@ public class NewsFetcher implements Runnable, EepGet.StatusListener, ClientApp {
|
||||
private volatile ClientAppState _state = UNINITIALIZED;
|
||||
public static final String APP_NAME = "NewsFetcher";
|
||||
|
||||
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.
|
||||
*/
|
||||
@ -333,6 +352,11 @@ public class NewsFetcher implements Runnable, EepGet.StatusListener, ClientApp {
|
||||
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");
|
||||
@ -343,6 +367,104 @@ public class NewsFetcher implements Runnable, EepGet.StatusListener, ClientApp {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 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
|
||||
*
|
||||
|
@ -406,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);
|
||||
@ -661,7 +662,7 @@ public class MainFragment extends I2PFragmentBase {
|
||||
// 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.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
||||
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
||||
try {
|
||||
mContext.startActivity(intent);
|
||||
} catch (ActivityNotFoundException activityNotFound) {
|
||||
|
@ -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)
|
||||
);
|
||||
|
@ -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();
|
||||
}
|
||||
}
|
||||
}
|
@ -46,16 +46,36 @@ public class NamingServiceUtil {
|
||||
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();
|
||||
@ -65,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(),
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
@ -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,18 @@ 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 || data.length() >= BASE32_HASH_LENGTH + 12) {
|
||||
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 */
|
||||
|
@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -82,8 +82,7 @@ call!</li>
|
||||
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://paste.idk.i2p/" target="_blank">paste.idk.i2p</a>: Secure and
|
||||
anonymous paste service allowing anonymous text and text-based code
|
||||
@ -148,7 +147,7 @@ via <a href="irc://irc.freenode.net/i2p">Freenode IRC</a>.
|
||||
<li class="tidylist"><b>Reporting Bugs</b><br>If you'd like to report a bug,
|
||||
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://zzz.i2p/" target="_blank">zzz's developer forums</a> or
|
||||
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="git.idk.i2p/i2p-hackers/i2p.i2p/-/commits/master" target="_blank">git.idk.i2p</a> or
|
||||
|
@ -46,6 +46,7 @@
|
||||
<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>
|
||||
@ -105,6 +106,7 @@
|
||||
<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>
|
||||
|
@ -25,6 +25,7 @@
|
||||
<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".-->
|
||||
@ -65,6 +66,7 @@
|
||||
<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>
|
||||
|
@ -84,6 +84,7 @@
|
||||
<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>
|
||||
|
@ -115,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>
|
||||
@ -147,6 +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">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>
|
||||
@ -171,6 +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_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,6 +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">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>
|
||||
@ -357,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>
|
||||
|
@ -21,7 +21,7 @@
|
||||
<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>
|
||||
@ -55,8 +55,8 @@
|
||||
<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="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>
|
||||
@ -116,12 +116,14 @@
|
||||
<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>
|
||||
@ -148,6 +150,7 @@
|
||||
<string name="settings_label_transports">トランスポート</string>
|
||||
<string name="settings_label_maxConns">最大接続数</string>
|
||||
<string name="settings_label_i2cp">I2CP インターフェース</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>
|
||||
@ -177,12 +180,12 @@
|
||||
<string name="about_project">プロジェクトホーム:</string>
|
||||
<string name="about_bugs">バグとサポート:</string>
|
||||
<string name="about_helpwanted">人手募集中!</string>
|
||||
<string name="about_volunteer">アプリの改善を手伝いたいですか? Android フォーラム上でボランティア:</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="label_private">非公開アドレス</string>
|
||||
<string name="addressbook_is_empty">アドレス帳は空です</string>
|
||||
<string name="addressbook_search_header">%s 検出</string>
|
||||
<string name="addressbook_add_wizard_k_name">名前</string>
|
||||
@ -261,9 +264,9 @@
|
||||
<string name="shared_client">共有クライアント</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="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>
|
||||
@ -317,18 +320,18 @@
|
||||
<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="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="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>
|
||||
@ -345,7 +348,7 @@
|
||||
<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>
|
||||
|
@ -115,6 +115,11 @@
|
||||
<string name="notification_status_peers">Pares: %1$d ativos, %2$d conhecidos</string>
|
||||
<string name="notification_status_expl">Túneis exploratórios: %1$d/%2$d</string>
|
||||
<string name="notification_status_client">Túneis cliente: %1$d/%2$d</string>
|
||||
<string name="stats_memory">Memória usada/max</string>
|
||||
<string name="stats_lag">Atraso no trabalho</string>
|
||||
<string name="stats_delay">Atraso de mensagem</string>
|
||||
<string name="copied_base32_system_notification_title">Base32 copiado para a área de transferência</string>
|
||||
<string name="copied_base32_system_notification_body">O endereço do túnel I2P foi copiado para a área de transferência.</string>
|
||||
<string name="menu_settings">Especificações</string>
|
||||
<string name="settings_enable">Ativar</string>
|
||||
<string name="settings_desc_subscriptions">URLs para inscrição</string>
|
||||
@ -147,6 +152,13 @@
|
||||
<string name="settings_label_transports">Transportes</string>
|
||||
<string name="settings_label_maxConns">Número máximo de conexões</string>
|
||||
<string name="settings_label_i2cp">Interface do I2CP</string>
|
||||
<string name="settings_desc_i2cp">Permitir que aplicativos de terceiros criem túneis usando I2CP (requer a reinicialização do roteador)</string>
|
||||
<string name="settings_label_sam">Interface SAM</string>
|
||||
<string name="settings_desc_sam">Permitir que aplicativos de terceiros criem túneis usando SAM (requer a reinicialização do roteador)</string>
|
||||
<string name="settings_confirm_sam">Um aplicativo está tentando fazer uma conexão SAM.</string>
|
||||
<string name="settings_confirm_sam_id">Nome/ID da conexão:</string>
|
||||
<string name="settings_confirm_allow_sam">Toque para permitir</string>
|
||||
<string name="settings_confirm_deny_sam">Ignorar para negar</string>
|
||||
<string name="settings_label_exploratory_pool">Reservatório exploratório</string>
|
||||
<string name="settings_desc_exploratory_pool">Parâmetros do túnel</string>
|
||||
<string name="settings_label_expl_inbound">Túneis entrantes</string>
|
||||
@ -171,6 +183,7 @@
|
||||
<string name="about_bugs">Falhas e Suporte:</string>
|
||||
<string name="about_helpwanted">Procura-se ajuda!</string>
|
||||
<string name="about_volunteer">Quer ajudar a tornar o aplicativo melhor? Seja voluntário no fórum Android:</string>
|
||||
<string name="about_gitlab">Quer sugerir um recurso ou corrigir um bug? faça uma solicitação de mesclagem no Gitlab do Android:</string>
|
||||
<string name="menu_help">Ajuda</string>
|
||||
<string name="general">Geral</string>
|
||||
<string name="label_router">Endereços públicos</string>
|
||||
@ -231,6 +244,7 @@
|
||||
<string name="enabled">Ativado</string>
|
||||
<string name="i2ptunnel_wizard_desc_name">O nome do túnel, para identificação na lista de túneis.</string>
|
||||
<string name="i2ptunnel_wizard_desc_desc">Uma descrição do túnel. Isso é opcional e puramente informativo.</string>
|
||||
<string name="i2ptunnel_wizard_desc_dest">Especifique o endereço .i2p ou o destino (hostname.i2p, b32 ou b64) do túnel aqui.</string>
|
||||
<string name="i2ptunnel_wizard_desc_outproxies">Se você souber de algum proxies de saída para este tipo de túnel (seja HTTP ou SOCKS), digite-os. Separe os múltiplos proxies com vírgulas.</string>
|
||||
<string name="i2ptunnel_wizard_desc_target_host">Esse é o IP no qual o serviço está rodando, isto está geralmente na mesma maquina então 127.0.0.1 é autopreenchido.</string>
|
||||
<string name="i2ptunnel_wizard_desc_target_port">Essa é a porta pela qual o serviço está aceitando conexões.</string>
|
||||
@ -357,4 +371,5 @@
|
||||
<string name="label_browser_configuration">Configuração do navegador</string>
|
||||
<string name="no_market_app">Nenhum aplicativo de mercado encontrado, por favor, instale manualmente</string>
|
||||
<string name="unset">Desligado</string>
|
||||
<string name="running_background">I2P está sendo executado em segundo plano</string>
|
||||
</resources>
|
||||
|
@ -115,6 +115,11 @@
|
||||
<string name="notification_status_peers">Nós: %1$d ativos, %2$d conhecidos</string>
|
||||
<string name="notification_status_expl">Túneis exploratórios: %1$d/%2$d</string>
|
||||
<string name="notification_status_client">Túneis de cliente: %1$d/%2$d</string>
|
||||
<string name="stats_memory">Memória usada/max</string>
|
||||
<string name="stats_lag">Atraso no trabalho</string>
|
||||
<string name="stats_delay">Atraso de mensagem</string>
|
||||
<string name="copied_base32_system_notification_title">Base32 copiado para a área de transferência</string>
|
||||
<string name="copied_base32_system_notification_body">O endereço do túnel I2P foi copiado para a área de transferência.</string>
|
||||
<string name="menu_settings">Configurações</string>
|
||||
<string name="settings_enable">Ativar</string>
|
||||
<string name="settings_desc_subscriptions">URLs de Subscrição</string>
|
||||
@ -147,6 +152,13 @@
|
||||
<string name="settings_label_transports">Transportes</string>
|
||||
<string name="settings_label_maxConns">Nr. máx. de ligações</string>
|
||||
<string name="settings_label_i2cp">Interface I2CP</string>
|
||||
<string name="settings_desc_i2cp">Permitir que aplicativos de terceiros criem túneis usando I2CP (requer a reinicialização do roteador)</string>
|
||||
<string name="settings_label_sam">Interface SAM</string>
|
||||
<string name="settings_desc_sam">Permitir que aplicativos de terceiros criem túneis usando SAM (requer a reinicialização do roteador)</string>
|
||||
<string name="settings_confirm_sam">Um aplicativo está tentando fazer uma conexão SAM.</string>
|
||||
<string name="settings_confirm_sam_id">Nome/ID da conexão:</string>
|
||||
<string name="settings_confirm_allow_sam">Toque para permitir</string>
|
||||
<string name="settings_confirm_deny_sam">Ignorar para negar</string>
|
||||
<string name="settings_label_exploratory_pool">Poço exploratório</string>
|
||||
<string name="settings_desc_exploratory_pool">Parâmetros dos túneis</string>
|
||||
<string name="settings_label_expl_inbound">Túneis de entrada</string>
|
||||
@ -171,6 +183,7 @@
|
||||
<string name="about_bugs">Erros e Suporte</string>
|
||||
<string name="about_helpwanted">Preciso de Ajuda!</string>
|
||||
<string name="about_volunteer">Queres tornar a aplicação melhor? Voluntariar-te no fórum do Android </string>
|
||||
<string name="about_gitlab">Quer sugerir um recurso ou corrigir um bug? faça uma solicitação de mesclagem no Gitlab do Android:</string>
|
||||
<string name="menu_help">Ajuda</string>
|
||||
<string name="general">Geral</string>
|
||||
<string name="label_router">Endereços públicos</string>
|
||||
@ -231,6 +244,7 @@
|
||||
<string name="enabled">Ativado</string>
|
||||
<string name="i2ptunnel_wizard_desc_name">O nome do túnel, para identificação na lista de túneis.</string>
|
||||
<string name="i2ptunnel_wizard_desc_desc">A descrição do túnel. Este elemento é opcional e puramente informativo.</string>
|
||||
<string name="i2ptunnel_wizard_desc_dest">Especifique o endereço .i2p ou o destino (hostname.i2p, b32 ou b64) do túnel aqui.</string>
|
||||
<string name="i2ptunnel_wizard_desc_outproxies">Pode aqui introduzir proxies de saída para este tipo de túnel (HTTP ou SOCKS). Separe as proxies com vírgulas.</string>
|
||||
<string name="i2ptunnel_wizard_desc_target_host">Este é o endereço IP no qual o seu serviço I2P está a correr. Normalmente corresponde à mesma máquina, portanto é automaticamente preenchido com 127.0.0.1.</string>
|
||||
<string name="i2ptunnel_wizard_desc_target_port">Este é a porta na qual o seu serviço aceita ligações.</string>
|
||||
@ -357,4 +371,5 @@
|
||||
<string name="label_browser_configuration">Configuração do navegador</string>
|
||||
<string name="no_market_app">Nenhum aplicativo de mercado encontrado, por favor, instale manualmente</string>
|
||||
<string name="unset">Desselecionar</string>
|
||||
<string name="running_background">I2P está sendo executado em segundo plano</string>
|
||||
</resources>
|
||||
|
@ -197,4 +197,5 @@
|
||||
<string name="other">Ďalší</string>
|
||||
<string name="custom_options">Vlastné nastavenia</string>
|
||||
<string name="all">Všetko</string>
|
||||
<string name="no_messages">Žiadne správy</string>
|
||||
</resources>
|
||||
|
@ -31,6 +31,7 @@
|
||||
<string name="action_delete">Fshije</string>
|
||||
<string name="action_reload">Ringarkoje</string>
|
||||
<string name="action_refresh">Rifreskoje</string>
|
||||
<string name="statistics">Statistika</string>
|
||||
<string name="country">Vendi</string>
|
||||
<string name="version">Version</string>
|
||||
<string name="count">Numër</string>
|
||||
|
@ -9,14 +9,14 @@
|
||||
<string name="label_status">Durum</string>
|
||||
<string name="label_console">Pano</string>
|
||||
<string name="label_addresses">Adresler</string>
|
||||
<string name="label_addressbook">Adres Defteri</string>
|
||||
<string name="label_addressbook">Adres defteri</string>
|
||||
<string name="label_i2ptunnel_client">İstemci tünelleri</string>
|
||||
<string name="label_i2ptunnel_server">Sunucu tünelleri</string>
|
||||
<string name="label_logs">Günlükler</string>
|
||||
<string name="label_error_logs">Hata Günlükleri</string>
|
||||
<string name="label_error_logs">Hata günlükleri</string>
|
||||
<string name="label_news">Haberler</string>
|
||||
<string name="label_peers_status">Eşler</string>
|
||||
<string name="label_release_notes">Yayım Notları</string>
|
||||
<string name="label_release_notes">Yayım notları</string>
|
||||
<string name="label_licenses">Lisanslar</string>
|
||||
<string name="label_browse">Göz at</string>
|
||||
<string name="label_graphs">Çizelgeler</string>
|
||||
@ -30,15 +30,15 @@
|
||||
<string name="testing">Sınanıyor</string>
|
||||
<string name="firewalled">Güvenlik duvarlı</string>
|
||||
<string name="symmetric_nat">Simetrik NAT</string>
|
||||
<string name="net_status_error_i2cp">İstemci yöneticisi I2CP hatası - günlüklere bakın</string>
|
||||
<string name="net_status_error_i2cp">İstemci yöneticisi I2CP hatası. Günlüklere bakın</string>
|
||||
<!--Parameter is a time, e.g. 32s or 2m-->
|
||||
<string name="net_status_error_skew">%s saat sapması</string>
|
||||
<string name="net_status_error_unresolved_tcp">Çözümlenmemiş TCP adresi</string>
|
||||
<string name="net_status_error_private_tcp">Kişisel TCP adresi</string>
|
||||
<string name="net_status_warn_firewalled_inbound_tcp">Geliş TCP bağlantısı güvenlik duvarı etkinleştirilmiş </string>
|
||||
<string name="net_status_warn_firewalled_floodfill">Güvenlik duvarı arkasında otomatik doldurma</string>
|
||||
<string name="net_status_info_disconnected">Bağlantı kesildi - ağ bağlantısını denetleyin</string>
|
||||
<string name="net_status_error_udp_port">UDP bağlantı noktası kullanılıyor - ayarları değiştirip yeniden başlatın</string>
|
||||
<string name="net_status_info_disconnected">Bağlantı kesildi. Ağ bağlantısını denetleyin</string>
|
||||
<string name="net_status_error_udp_port">UDP bağlantı noktası kullanılıyor. Ayarları değiştirip yeniden başlatın</string>
|
||||
<string name="net_status_error_no_active_peers">Etkin eş yok, ağ bağlantısını ve güvenlik duvarını denetleyin</string>
|
||||
<string name="net_status_error_udp_disabled_tcp_not_set">UDP devre dışı ve Geliş TCP bağlantısı sunucu/bağlantı noktası ayarlanmamış</string>
|
||||
<string name="net_status_warn_firewalled_udp_disabled">Güvenlik duvarı ve UDP devre dışı</string>
|
||||
@ -58,9 +58,9 @@
|
||||
<string name="configure_no_doze_title">Pil kullanımı yönetilsin mi?</string>
|
||||
<string name="configure_no_doze">I2P için en iyi durum sürekli çalışmasıdır. I2P uygulamasının Android üzerinde pili korumak için kapatılmasını engellemek için uygulamayı pil kullanımı istisnası listesine ekleyebilirsiniz. Bu durumda uygulamanın güvenirliği önemli ölçüde artacaktır.\n\nI2P arka planda çalışır durumda tutulsun mu (önerilir)?</string>
|
||||
<string name="first_start_title">Tebrikler, I2P kuruldu!</string>
|
||||
<string name="first_start_welcome"><b>I2P uygulamasına hoş geldiniz</b> Lütfen I2P yüklenip eşleri bulana kadar <b>sabırlı olun</b>.</string>
|
||||
<string name="first_start_welcome"><b>I2P uygulamasına hoş geldiniz</b> Lütfen I2P açılıp eşleri bulana kadar <b>sabırlı olun</b>.</string>
|
||||
<string name="first_start_read">Beklerken, lütfen sürüm notları ve hoş geldiniz sayfalarını okuyun.</string>
|
||||
<string name="first_start_faq">İstemci tünelleri bulunduğunda, lütfen Sık Sorulan Sorular bölümüne <b>bakın</b>:</string>
|
||||
<string name="first_start_faq">İstemci tünelleri bulunduğunda, lütfen sık sorulan sorular bölümüne <b>bakın</b>:</string>
|
||||
<string name="first_start_faq_nonanon">Ya da tünelleri beklemek istemiyorsanız anonim olmayan şu bağlantıyı kullanın:</string>
|
||||
<string name="first_start_irc">IRC istemcinizi <b>localhost:6668</b> adresine yönlendirip şuradan bize merhaba deyin:</string>
|
||||
<string name="action_search">Arama</string>
|
||||
@ -72,13 +72,13 @@
|
||||
<string name="action_i2ptunnel_start_all">Tüm tünelleri aç</string>
|
||||
<string name="action_i2ptunnel_stop_all">Tüm tünelleri kapat</string>
|
||||
<string name="action_i2ptunnel_restart_all">Tüm tünelleri yeniden aç</string>
|
||||
<string name="action_reload">Yeniden Yükle</string>
|
||||
<string name="action_reload">Yeniden yükle</string>
|
||||
<string name="action_refresh">Yenile</string>
|
||||
<string name="hint_search_addressbook">Adres defterinde arama</string>
|
||||
<string name="action_reload_subscriptions">Abonelikleri yeniden yükle</string>
|
||||
<string name="news_last_updated">Haberler en son %s önce güncellendi</string>
|
||||
<string name="news_last_checked">Haberler en son %s önce denetlendi</string>
|
||||
<string name="news_updated">Haberler Güncellendi</string>
|
||||
<string name="news_updated">Haberler güncellendi</string>
|
||||
<string name="view_news">I2P yeniliklerini görmek için dokunun</string>
|
||||
<string name="router_not_running">Yöneltici çalışmıyor.</string>
|
||||
<string name="router_shutting_down">Yöneltici kapatılıyor.</string>
|
||||
@ -97,8 +97,8 @@
|
||||
<string name="version">Sürüm</string>
|
||||
<string name="count">Sayı</string>
|
||||
<string name="tname_0">Gizli ya da başlatılıyor</string>
|
||||
<string name="netdb_routers_empty">\"Ağ veritabanınızda\" (NetDB) bir yöneltici bulunamadı.</string>
|
||||
<string name="netdb_leases_empty">\"Ağ veritabanınızda\" (NetDB) bir \"Kiralama kümesi\" (LeaseSet) bulunamadı.</string>
|
||||
<string name="netdb_routers_empty">\"Ağ veri tabanınızda\" (NetDB) bir yöneltici bulunamadı.</string>
|
||||
<string name="netdb_leases_empty">\"Ağ veri tabanınızda\" (NetDB) bir \"Kiralama kümesi\" (LeaseSet) bulunamadı.</string>
|
||||
<string name="notification_status_starting">I2P başlatılıyor</string>
|
||||
<string name="notification_status_restarting">I2P yeniden başlatılıyor</string>
|
||||
<string name="notification_status_waiting">I2P bir ağ bağlantısının kurulmasını bekliyor</string>
|
||||
@ -122,9 +122,9 @@
|
||||
<string name="copied_base32_system_notification_body">I2P tünelinizin adresi panoya kopyalandı.</string>
|
||||
<string name="menu_settings">Ayarlar</string>
|
||||
<string name="settings_enable">Etkinleştir</string>
|
||||
<string name="settings_desc_subscriptions">Abonelik İnternet Adresleri</string>
|
||||
<string name="settings_desc_subscriptions">Abonelik adresleri</string>
|
||||
<string name="settings_label_bandwidth_net">Bant genişliği ve ağ</string>
|
||||
<string name="settings_label_startOnBoot">I2P Açılışta Başlatılsın</string>
|
||||
<string name="settings_label_startOnBoot">I2P açılışta başlatılsın</string>
|
||||
<string name="settings_desc_startOnBoot">Android aygıtınız başlatıldığında I2P kendiliğinden bağlanır</string>
|
||||
<string name="settings_label_bandwidth">Bant genişliği</string>
|
||||
<string name="settings_label_bw_inbound">Geliş bağlantısı hızı</string>
|
||||
@ -151,9 +151,9 @@
|
||||
<string name="settings_summ_showStats">Ana panoda ayrıntılı istatistikler görüntülensin</string>
|
||||
<string name="settings_label_transports">Taşıyıcılar</string>
|
||||
<string name="settings_label_maxConns">En fazla bağlantı</string>
|
||||
<string name="settings_label_i2cp">I2CP Arabirimi</string>
|
||||
<string name="settings_label_i2cp">I2CP arabirimi</string>
|
||||
<string name="settings_desc_i2cp">Üçüncü taraf uygulamalar I2CP ile tüneller oluşturabilsin (yöneltici yeniden başlatılmalıdır)</string>
|
||||
<string name="settings_label_sam">SAM arayüzü</string>
|
||||
<string name="settings_label_sam">SAM arabirimi</string>
|
||||
<string name="settings_desc_sam">Üçüncü taraf uygulamalar SAM ile tüneller oluşturabilsin (yöneltici yeniden başlatılmalıdır)</string>
|
||||
<string name="settings_confirm_sam">Bir uygulama bir SAM bağlantısı kurmaya çalışıyor.</string>
|
||||
<string name="settings_confirm_sam_id">Bağlantı adı/kodu:</string>
|
||||
@ -179,9 +179,9 @@
|
||||
<string name="settings_router_restart_required">Değişikliklerin etkili olması için I2P yeniden başlatılmalı</string>
|
||||
<string name="menu_about">Hakkında</string>
|
||||
<string name="about_version">Sürüm:</string>
|
||||
<string name="about_project">Proje Web Sitesi:</string>
|
||||
<string name="about_bugs">Hatalar ve Destek</string>
|
||||
<string name="about_helpwanted">Yardımınız Gerekli!</string>
|
||||
<string name="about_project">Proje sitesi:</string>
|
||||
<string name="about_bugs">Hatalar ve destek</string>
|
||||
<string name="about_helpwanted">Yardımınız gerekli!</string>
|
||||
<string name="about_volunteer">Uygulamayı daha iyi duruma getirmek için yardımcı olmak ister misiniz? Android forumunda gönüllü olun:</string>
|
||||
<string name="about_gitlab">Bir öneride bulunmak ya da hata bildirmek mi istiyorsunuz? Android GitLab üzerinden bir birleştirme isteği yapın:</string>
|
||||
<string name="menu_help">Yardım</string>
|
||||
@ -213,10 +213,10 @@
|
||||
<string name="i2ptunnel_type_httpbidirserver">HTTP bidir</string>
|
||||
<string name="install_recommended_app">Önerilen uygulama kurulsun mu?</string>
|
||||
<string name="app_needed_for_this_tunnel_type">Bu tüneli kullanmak için bir uygulama kurmalısınız. Önerilen uygulamayı kurmak ister misiniz?</string>
|
||||
<string name="i2ptunnel_not_initialized">Tüneller henüz hazır değil, lütfen iki dakika sonra yeniden yükleyin.</string>
|
||||
<string name="i2ptunnel_not_initialized">Tüneller henüz hazır değil. Lütfen iki dakika sonra yeniden yükleyin.</string>
|
||||
<string name="no_configured_client_tunnels">Henüz ayarlanmış bir istemci tüneli yok.</string>
|
||||
<string name="no_configured_server_tunnels">Henüz ayarlanmış bir sunucu tüneli yok.</string>
|
||||
<string name="i2ptunnel_new_tunnel">Yeni Tünel</string>
|
||||
<string name="i2ptunnel_new_tunnel">Yeni tünel</string>
|
||||
<string name="i2ptunnel_msg_config_saved">Yapılandırma değişiklikleri kaydedildi</string>
|
||||
<string name="i2ptunnel_msg_config_save_failed">Yapılandırma kaydedilemedi</string>
|
||||
<string name="i2ptunnel_msg_tunnel_starting">Tünel açılıyor</string>
|
||||
@ -224,7 +224,7 @@
|
||||
<string name="i2ptunnel_delete_confirm_message">Tüneli sil</string>
|
||||
<string name="i2ptunnel_delete_confirm_button">Tüneli sil</string>
|
||||
<string name="i2ptunnel_no_tunnel_details">Tünel ayrıntıları yüklenemedi</string>
|
||||
<string name="i2ptunnel_wizard_k_client_server">İstemci ya da Sunucu</string>
|
||||
<string name="i2ptunnel_wizard_k_client_server">İstemci ya da sunucu</string>
|
||||
<string name="i2ptunnel_wizard_v_client">İstemci tüneli</string>
|
||||
<string name="i2ptunnel_wizard_v_server">Sunucu tüneli</string>
|
||||
<string name="i2ptunnel_wizard_k_type">Tünel türü</string>
|
||||
@ -240,7 +240,7 @@
|
||||
<string name="next">Sonraki</string>
|
||||
<string name="prev">Önceki</string>
|
||||
<string name="finish">Gönder</string>
|
||||
<string name="review">Gözden Geçir</string>
|
||||
<string name="review">Gözden geçir</string>
|
||||
<string name="enabled">Etkin</string>
|
||||
<string name="i2ptunnel_wizard_desc_name">Tünel listesinde görüntülenecek tünel adı.</string>
|
||||
<string name="i2ptunnel_wizard_desc_desc">İsteğe bağlı olarak yazılabilecek tünel açıklaması.</string>
|
||||
@ -272,21 +272,21 @@
|
||||
<string name="tunnel_summ_persistent_key">Yeniden başlatıldığında bu tünelin hedefi korunsun</string>
|
||||
<string name="reachable_on">Şuradan erişilebilir</string>
|
||||
<string name="listen_port">Dinlenecek bağlantı noktası</string>
|
||||
<string name="client_ssl">SSL İstemci</string>
|
||||
<string name="client_ssl">İstemcide SSL</string>
|
||||
<string name="tunnel_summ_client_ssl">İstemci yalnızca SSL üzerinden bağlanabilir</string>
|
||||
<string name="outproxies">Çıkış vekil sunucuları</string>
|
||||
<string name="ssl_outproxies">SSL çıkış vekil sunucuları</string>
|
||||
<string name="irc">IRC</string>
|
||||
<string name="enable_dcc">DCC Kullanılsın</string>
|
||||
<string name="enable_dcc">DCC kullanılsın</string>
|
||||
<string name="tunnel_summ_enable_dcc">IRC istemcileri DCC kullanabilsin</string>
|
||||
<string name="website_domain_name">Web sitesinin etki alanı</string>
|
||||
<string name="website_domain_name">Sitenin etki alanı</string>
|
||||
<string name="target_host">Hedef sunucu</string>
|
||||
<string name="target_port">Hedef bağlantı noktası</string>
|
||||
<string name="use_ssl">SSL Kullanılsın</string>
|
||||
<string name="use_ssl">SSL kullanılsın</string>
|
||||
<string name="tunnel_summ_use_ssl">Hedefe bağlanmak için SSL kullanılsın</string>
|
||||
<string name="tunnel_parameters">Tünel parametreleri</string>
|
||||
<string name="profile">Profil</string>
|
||||
<string name="profile_bulk">Toplu bağlantı (indirme/web siteleri/BT)</string>
|
||||
<string name="profile_bulk">Toplu bağlantı (indirmeler/siteler/BT)</string>
|
||||
<string name="profile_interactive">Etkileşimli bağlantı</string>
|
||||
<string name="delay_connect">Bağlantı gecikmesi</string>
|
||||
<string name="tunnel_summ_delay_connect">Bağlantı yanıtları için etkinleştirin</string>
|
||||
@ -335,14 +335,14 @@
|
||||
<string name="new_keys_on_reopen_conflict_title">Sürekli anahtarlar kullanılamasın</string>
|
||||
<string name="new_keys_on_reopen_conflict_msg">Tünel yeniden açıldığında yeni anahtarlar oluşturuluyorsa sürekli anahtarlar kullanılamaz. Sürekli anahtarlar devre dışı bırakılsın mı?</string>
|
||||
<string name="http_client">HTTP istemcisi</string>
|
||||
<string name="tunnel_summ_user_agent">\'User-Agent\' üstbilgisi geçirilsin</string>
|
||||
<string name="tunnel_summ_referer">\'Referer\' üstbilgisi geçirilsin</string>
|
||||
<string name="tunnel_summ_accept">\'Accept-*\' üstbilgisi geçirilsin</string>
|
||||
<string name="tunnel_summ_user_agent">\'User-Agent\' üst bilgisi geçirilsin</string>
|
||||
<string name="tunnel_summ_referer">\'Referer\' üst bilgisi geçirilsin</string>
|
||||
<string name="tunnel_summ_accept">\'Accept-*\' üst bilgisi geçirilsin</string>
|
||||
<string name="tunnel_summ_allow_ssl">I2P adreslerinde SSL kullanılabilsin</string>
|
||||
<string name="jump_url_list">Sıçrama adresi listesi</string>
|
||||
<string name="proxy_auth">Vekil sunucu kimlik doğrulaması</string>
|
||||
<string name="tunnel_summ_proxy_auth">Bu vekil sunucuda oturum açmak için kimlik doğrulaması istensin</string>
|
||||
<string name="username">Kullanıcı Adı</string>
|
||||
<string name="username">Kullanıcı adı</string>
|
||||
<string name="password">Parola</string>
|
||||
<string name="outproxy_auth">Çıkış vekil sunucusu kimlik doğrulaması</string>
|
||||
<string name="tunnel_summ_outproxy_auth">Çıkış vekil sunucusu için oturum açılması gerekiyor</string>
|
||||
@ -360,14 +360,14 @@
|
||||
<item quantity="one">%d ileti, yeniden eskiye</item>
|
||||
<item quantity="other">%d ileti, yeniden eskiye</item>
|
||||
</plurals>
|
||||
<string name="log_entry">Günlük Kaydı</string>
|
||||
<string name="log_entry">Günlük kaydı</string>
|
||||
<string name="copy_logs">Günlükleri kopyala</string>
|
||||
<string name="i2p_android_error_logs">I2P Android Hata Günlükleri</string>
|
||||
<string name="i2p_android_logs">I2P Android Günlükleri</string>
|
||||
<string name="i2p_android_error_logs">I2P Android hata günlükleri</string>
|
||||
<string name="i2p_android_logs">I2P Android günlükleri</string>
|
||||
<string name="error_logs_copied_to_clipboard">Hata günlükleri panoya kopyalandı</string>
|
||||
<string name="logs_copied_to_clipboard">Günlükler panoya kopyalandı</string>
|
||||
<string name="label_browser_configuration">Tarayıcı yapılandırması</string>
|
||||
<string name="no_market_app">Herhangi bir mağaza uygulaması bulunamadı, lütfen el ile kurun</string>
|
||||
<string name="unset">Ayarı Kaldır</string>
|
||||
<string name="unset">Ayarı kaldır</string>
|
||||
<string name="running_background">I2P arka planda çalışıyor</string>
|
||||
</resources>
|
||||
|
@ -28,6 +28,7 @@
|
||||
<string name="action_reload">Tải lại</string>
|
||||
<string name="action_refresh">Nạp lại</string>
|
||||
<string name="statistics">Thống kê</string>
|
||||
<string name="countries">Quốc Gia</string>
|
||||
<string name="country">Quốc gia</string>
|
||||
<string name="version">Phiên bản</string>
|
||||
<string name="count">Số lượng</string>
|
||||
|
@ -352,6 +352,12 @@
|
||||
<string name="all">全部</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">I2P Android 错误日志</string>
|
||||
|
@ -150,6 +150,10 @@
|
||||
<string name="notification_status_expl">Exploratory tunnels: %1$d/%2$d</string>
|
||||
<string name="notification_status_client">Client tunnels: %1$d/%2$d</string>
|
||||
|
||||
<string name="stats_memory">Memory used/max</string>
|
||||
<string name="stats_lag">Job Lag</string>
|
||||
<string name="stats_delay">Message Delay</string>
|
||||
|
||||
<string name="copied_base32_system_notification_title">Base32 copied to clipboard</string>
|
||||
<string name="copied_base32_system_notification_body">The address of your I2P tunnel has been copied to the clipboard.</string>
|
||||
|
||||
@ -217,7 +221,7 @@
|
||||
<string name="about_project">Project Home:</string>
|
||||
<string name="url_project" translatable="false">https://geti2p.net | http://i2p-projekt.i2p</string>
|
||||
<string name="about_bugs">Bugs and Support:</string>
|
||||
<string name="url_android_forum" translatable="false">http://zzz.i2p/forums/17</string>
|
||||
<string name="url_android_forum" translatable="false">http://i2pforum.i2p</string>
|
||||
<string name="about_helpwanted">Help Wanted!</string>
|
||||
<string name="about_volunteer">Want to help make the app better? Volunteer on the Android forum:</string>
|
||||
<string name="about_gitlab">Want to suggest a feature or fix a bug? make a Merge Request on the Android Gitlab:</string>
|
||||
|
23
etc/github.gradle.properties
Normal file
23
etc/github.gradle.properties
Normal file
@ -0,0 +1,23 @@
|
||||
|
||||
GROUP=net.i2p.android
|
||||
|
||||
org.gradle.jvmargs=-Xmx1536M
|
||||
|
||||
POM_URL=https://github.com/i2p/i2p.android.base
|
||||
POM_SCM_URL=https://github.com/i2p/i2p.android.base
|
||||
POM_SCM_CONNECTION=scm:git:git@github.com:i2p/i2p.android.base.git
|
||||
POM_SCM_DEV_CONNECTION=scm:git:git@github.com:i2p/i2p.android.base.git
|
||||
POM_LICENCE_NAME=The Apache Software License, Version 2.0
|
||||
POM_LICENCE_URL=http://www.apache.org/licenses/LICENSE-2.0.txt
|
||||
POM_LICENCE_DIST=repo
|
||||
POM_DEVELOPER_ID=github-ci
|
||||
POM_DEVELOPER_NAME=github-ci
|
||||
POM_DEVELOPER_EMAIL=hankhill19580@gmail.com
|
||||
|
||||
ANDROID_BUILD_TARGET_SDK_VERSION=33
|
||||
ANDROID_BUILD_SDK_VERSION=33
|
||||
|
||||
I2P_VERSION=2.4.0
|
||||
I2P_ANDROID_VERSION=2.4.0
|
||||
android.disableAutomaticComponentCreation=true
|
||||
android.useAndroidX=true
|
2
etc/github.signing.properties
Normal file
2
etc/github.signing.properties
Normal file
@ -0,0 +1,2 @@
|
||||
STORE_FILE=/home/runner/keystores/android-release.keystore
|
||||
KEY_ALIAS=mykey
|
@ -17,7 +17,7 @@ POM_DEVELOPER_EMAIL=hankhill19580@gmail.com
|
||||
ANDROID_BUILD_TARGET_SDK_VERSION=33
|
||||
ANDROID_BUILD_SDK_VERSION=33
|
||||
|
||||
I2P_VERSION=2.1.0
|
||||
I2P_ANDROID_VERSION=2.1.0
|
||||
I2P_VERSION=2.5.1
|
||||
I2P_ANDROID_VERSION=2.5.1
|
||||
android.disableAutomaticComponentCreation=true
|
||||
android.useAndroidX=true
|
@ -1,9 +0,0 @@
|
||||
<?xml version='1.0' encoding='UTF-8'?>
|
||||
<resources>
|
||||
<string name="yes">Sí</string>
|
||||
<string name="no">No</string>
|
||||
<string name="install_i2p_android">¿Instalar I2P Android?</string>
|
||||
<string name="you_must_have_i2p_android">Ha de tener I2P Android instalado y ejecutándose. ¿Le gustaría instalarlo?</string>
|
||||
<string name="start_i2p_android">¿Iniciar I2P Android?</string>
|
||||
<string name="would_you_like_to_start_i2p_android">Parece que I2P Android no se está ejecutando. ¿Desea ejecutarlo?</string>
|
||||
</resources>
|
Reference in New Issue
Block a user