summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorParménides GV <parmegv@sdf.org>2014-06-16 14:13:57 +0200
committerParménides GV <parmegv@sdf.org>2014-06-16 14:13:57 +0200
commit482c378c2ff3a37a76ed5788cf4eaef30a63d517 (patch)
tree868b4bca345e9710a2a3d665b475959b63c607c5
parent69b10487fcd63dfe1e94fa97c9f3fd9b035646b4 (diff)
parente2793ff1ad97a373993fd8628a514c772d6d5434 (diff)
Merge branch 'develop'
-rw-r--r--app/misc/build-native.bat22
-rwxr-xr-xapp/misc/build-native.sh54
-rwxr-xr-xapp/misc/fetchtranslations.sh38
-rwxr-xr-xapp/misc/genFAQ.py118
-rwxr-xr-xapp/misc/prepareovpn3.sh3
-rwxr-xr-xapp/ovpnlibs/assets/minivpn.mipsbin5164 -> 0 bytes
-rwxr-xr-xapp/ovpnlibs/assets/nopievpn.armeabi (renamed from app/ovpnlibs/assets/minivpn.armeabi)bin5216 -> 5248 bytes
-rwxr-xr-xapp/ovpnlibs/assets/nopievpn.armeabi-v7a (renamed from app/ovpnlibs/assets/minivpn.armeabi-v7a)bin5228 -> 5256 bytes
-rwxr-xr-xapp/ovpnlibs/assets/nopievpn.mipsbin0 -> 5244 bytes
-rwxr-xr-xapp/ovpnlibs/assets/nopievpn.x86 (renamed from app/ovpnlibs/assets/minivpn.x86)bin5268 -> 5264 bytes
-rwxr-xr-xapp/ovpnlibs/assets/pievpn.armeabibin0 -> 5248 bytes
-rwxr-xr-xapp/ovpnlibs/assets/pievpn.armeabi-v7abin0 -> 5256 bytes
-rwxr-xr-xapp/ovpnlibs/assets/pievpn.mipsbin0 -> 5180 bytes
-rwxr-xr-xapp/ovpnlibs/assets/pievpn.x86bin0 -> 5264 bytes
-rw-r--r--app/src/main/java/de/blinkt/openvpn/VpnProfile.java62
-rw-r--r--app/src/main/java/de/blinkt/openvpn/core/ConfigParser.java2
-rw-r--r--app/src/main/java/de/blinkt/openvpn/core/OpenVPNThread.java28
-rw-r--r--app/src/main/java/de/blinkt/openvpn/core/OpenVpnService.java16
-rw-r--r--app/src/main/java/de/blinkt/openvpn/core/VPNLaunchHelper.java15
-rwxr-xr-xapp/src/main/res/values-et/strings-icsopenvpn.xml5
-rwxr-xr-xapp/src/main/res/values-fr/strings-icsopenvpn.xml4
-rwxr-xr-xapp/src/main/res/values-it/strings-icsopenvpn.xml1
-rwxr-xr-xapp/src/main/res/values-ru/strings-icsopenvpn.xml56
-rwxr-xr-xapp/src/main/res/values-tr/strings-icsopenvpn.xml4
-rwxr-xr-xapp/src/main/res/values-uk/strings-icsopenvpn.xml18
-rwxr-xr-xapp/src/main/res/values-zh-rCN/strings-icsopenvpn.xml57
-rw-r--r--app/src/main/res/values/untranslatable.xml133
-rw-r--r--ics-openvpn-stripped/main/src/main/java/de/blinkt/openvpn/VpnProfile.java62
-rw-r--r--ics-openvpn-stripped/main/src/main/java/de/blinkt/openvpn/core/ConfigParser.java2
-rw-r--r--ics-openvpn-stripped/main/src/main/java/de/blinkt/openvpn/core/OpenVPNThread.java28
-rw-r--r--ics-openvpn-stripped/main/src/main/java/de/blinkt/openvpn/core/OpenVpnService.java18
-rw-r--r--ics-openvpn-stripped/main/src/main/java/de/blinkt/openvpn/core/VPNLaunchHelper.java15
-rw-r--r--ics-openvpn-stripped/main/src/main/res/menu/logmenu.xml74
-rwxr-xr-xics-openvpn-stripped/main/src/main/res/values-et/strings.xml5
-rwxr-xr-xics-openvpn-stripped/main/src/main/res/values-fr/strings.xml4
-rwxr-xr-xics-openvpn-stripped/main/src/main/res/values-it/strings.xml1
-rwxr-xr-xics-openvpn-stripped/main/src/main/res/values-ru/strings.xml56
-rwxr-xr-xics-openvpn-stripped/main/src/main/res/values-tr/strings.xml4
-rwxr-xr-xics-openvpn-stripped/main/src/main/res/values-uk/strings.xml18
-rwxr-xr-xics-openvpn-stripped/main/src/main/res/values-zh-rCN/strings.xml57
40 files changed, 792 insertions, 188 deletions
diff --git a/app/misc/build-native.bat b/app/misc/build-native.bat
new file mode 100644
index 00000000..73a19a00
--- /dev/null
+++ b/app/misc/build-native.bat
@@ -0,0 +1,22 @@
+
+@echo on
+echo Currently broken, feel free to fix and send me a patch, see .sh file
+exit 1
+
+call ndk-build APP_API=all -j 8
+
+
+cd libs
+mkdir ..\assets
+mkdir ..\build\
+
+for /D %%f in (*) do (
+ copy %%f\minivpn ..\assets\minivpn.%%f
+ del %%f\libcrypto.so
+ del %%f\libssl.so
+
+ mkdir ..\build\native-libs\%%f\
+ copy %%f\*.so ..\build\native-libs\%%f\
+)
+
+cd ..
diff --git a/app/misc/build-native.sh b/app/misc/build-native.sh
new file mode 100755
index 00000000..f27384cd
--- /dev/null
+++ b/app/misc/build-native.sh
@@ -0,0 +1,54 @@
+#!/bin/bash
+
+# Exit on errors
+set -e
+
+# Generate git config if the openvpn directory is checked out from git
+if [ -d openvpn/.git ]; then
+ GIT=git
+ cd openvpn
+ CONFIGURE_GIT_CHFILES=$($GIT diff-files --name-status -r --ignore-submodules --quiet -- || echo "+")
+ CONFIGURE_GIT_UNCOMMITTED=$($GIT diff-index --cached --quiet --ignore-submodules HEAD || echo "*")
+ CONFIGURE_GIT_REVISION=$($GIT rev-parse --symbolic-full-name HEAD | cut -d/ -f3)-$($GIT rev-parse --short=16 HEAD)
+ echo "#define CONFIGURE_GIT_REVISION \"${CONFIGURE_GIT_REVISION}\"" > config-version.h.tmp; \
+ echo "#define CONFIGURE_GIT_FLAGS \"${CONFIGURE_GIT_CHFILES}${CONFIGURE_GIT_UNCOMMITTED}\"" >> config-version.h.tmp
+
+ if ! [ -f config-version.h ] || ! cmp -s config-version.h.tmp config-version.h; then \
+ echo "replacing config-version.h"
+ mv config-version.h.tmp config-version.h
+ else
+ rm -f config-version.h.tmp
+ fi
+ cd ..
+fi
+
+if [ "x$1" = "x" ]; then
+ ndk-build APP_API=all -j 8
+else
+ ndk-build $@
+fi
+
+if [ $? = 0 ]; then
+ rm -rf ovpnlibs/
+
+ cd libs
+ mkdir -p ../ovpnlibs/assets
+ for i in *
+ do
+ cp -v $i/nopievpn ../ovpnlibs/assets/nopievpn.$i
+ cp -v $i/pievpn ../ovpnlibs/assets/pievpn.$i
+ done
+ # Removed compiled openssl libs, will use platform so libs
+ # Reduces size of apk
+ #
+ rm -v */libcrypto.so */libssl.so
+
+ for arch in *
+ do
+ builddir=../ovpnlibs/jniLibs/$arch
+ mkdir -p $builddir
+ cp -v $arch/*.so $builddir
+ done
+else
+ exit $?
+fi
diff --git a/app/misc/fetchtranslations.sh b/app/misc/fetchtranslations.sh
new file mode 100755
index 00000000..d92c24b5
--- /dev/null
+++ b/app/misc/fetchtranslations.sh
@@ -0,0 +1,38 @@
+#! /bin/sh
+
+
+if [ "$ICSCROWDAPIKEY" != "" ]
+then
+ echo "Generating new translation archives"
+ fetch -q -1 -o - http://api.crowdin.net/api/project/ics-openvpn/export?key=$ICSCROWDAPIKEY
+fi
+
+echo "Fetch translation archive"
+fetch -q http://crowdin.net/download/project/ics-openvpn.zip
+
+langtoinclude="ca cs de es et fr id it ja ko no nl pl ro ru sv tr uk"
+
+for lang in $langtoinclude
+do
+ tar -xvf ics-openvpn.zip -C src/main res/values-$lang/
+done
+
+# Chinese language require zh-CN and zh-TW
+
+for lang in zh-CN zh-TW id
+do
+ if [ $lang = "zh-CN" ] ; then
+ rlang="zh-rCN"
+ elif [ $lang = "zh-TW" ] ; then
+ rlang="zh-rTW"
+ elif [ $lang = "id" ] ; then
+ rlang="id"
+ fi
+
+ echo "Fetch archive for $lang"
+ fetch http://crowdin.net/download/project/ics-openvpn/$lang.zip
+ tar -xv -C src/main/res/values-$rlang/ --strip-components 3 -f $lang.zip
+ rm $lang.zip
+done
+
+rm -v ics-openvpn.zip
diff --git a/app/misc/genFAQ.py b/app/misc/genFAQ.py
new file mode 100755
index 00000000..b1506420
--- /dev/null
+++ b/app/misc/genFAQ.py
@@ -0,0 +1,118 @@
+#!/usr/bin/env python
+# Quick and dirty script to generate googlecode wiki pages
+
+import codecs
+import xml.dom.minidom as dom
+import os.path
+
+faqpath = "/Users/arne/oss/ics-openvpn.wiki"
+
+header="""
+<wiki:comment>
+This page is autogenerated. Do not edit
+</wiki:comment>
+
+= Frequently aksed questions =
+"""
+
+def getString(strid,lang):
+ ostr=""
+ if strid in strres[lang]:
+ ostr=strres[lang][strid]
+ else:
+ ostr=strres["default"][strid]
+
+ ostr = ostr.replace("&lt;","<")
+ ostr = ostr.replace("&gt;",">")
+ ostr = ostr.replace("\\\"","\"")
+ ostr = ostr.replace("\\'","'")
+ ostr = ostr.replace("\\n","<p>")
+ return ostr
+
+def genPage(faqdom,lang):
+ out =""
+
+ #out+="#summary %s\n" % getString("faq_summary",lang)
+ out+= header
+
+ for xmld in faqdom.firstChild.childNodes:
+ for xmle in xmld.childNodes:
+ if xmle.nodeName == "TextView":
+ style = xmle.getAttribute("style")
+
+ textstyle = None
+ if style == "@style/faqhead":
+ textstyle = "== %s ==\n"
+ elif style == "@style/faqitem":
+ textstyle = "%s\n"
+
+ atext = xmle.getAttribute("android:text")
+ aid = xmle.getAttribute("android:id")
+ if atext:
+ atextid = atext.replace("@string/","")
+ else:
+ atextid = aid.replace("@+id/","")
+
+ out += textstyle % getString(atextid,lang)
+
+ return out
+
+
+strres={}
+
+def loadstrres(filename,lang):
+ xmlstr = dom.parse(filename)
+ strres[lang]={}
+ for xmld in xmlstr.childNodes:
+ for xmle in xmld.childNodes:
+ if xmle.nodeName == "string":
+ strname= xmle.getAttribute("name")
+ strdata = xmle.firstChild.data
+ strres[lang][strname]=strdata
+
+
+def main():
+
+ loadstrres("src/main/res/values/strings.xml","default")
+
+ faqdom = dom.parse("src/main/res/layout/faq.xml")
+ faq= genPage(faqdom,"default")
+
+ open(faqpath + "/FAQ.wiki","w").write(faq)
+
+ for directory in os.listdir("src/main/res"):
+ if directory.startswith("values-") and directory.find("-sw")==-1:
+ lang = directory.split("-",1)[1]
+ print lang
+ loadstrres("src/main/res/values-%s/strings.xml" % lang,lang)
+
+ langdir= "%s/%s" %(faqpath,lang)
+ if lang=="zh-rCN":
+ langdir= "%s/%s" %(faqpath,"zh-Hans")
+ elif lang=="zh-rTW":
+ langdir= "%s/%s" %(faqpath,"zh-Hant")
+
+
+ if not os.path.exists(langdir):
+ os.mkdir(langdir)
+
+ faq= genPage(faqdom,lang)
+ open("%s/FAQ.wiki" % langdir,"w").write(faq.encode("utf-8"))
+
+ checkFormatString(lang)
+
+def checkFormatString(lang):
+ for strid in strres["default"]:
+ ostr = getString(strid,"default")
+ tstr = getString(strid,lang)
+
+
+ for f in ["%s", "%d", "%f"] + ["%%%d$s" % d for d in range(0,10)] + ["%%%d$d" % d for d in range(0,10)]:
+ ino = ostr.find(f)==-1
+ int = tstr.find(f)==-1
+
+ if ino != int:
+ print "Mismatch",strid,f,ostr,tstr
+
+if __name__=="__main__":
+ main()
diff --git a/app/misc/prepareovpn3.sh b/app/misc/prepareovpn3.sh
new file mode 100755
index 00000000..15982727
--- /dev/null
+++ b/app/misc/prepareovpn3.sh
@@ -0,0 +1,3 @@
+export O3=$PWD/openvpn3
+mkdir -p src/ovpn3/java/net/openvpn/ovpn3
+swig -outdir src/ovpn3/java/net/openvpn/ovpn3/ -c++ -java -package net.openvpn.ovpn3 -I$O3/client -I$O3 $O3/javacli/ovpncli.i \ No newline at end of file
diff --git a/app/ovpnlibs/assets/minivpn.mips b/app/ovpnlibs/assets/minivpn.mips
deleted file mode 100755
index 7f2ae3c6..00000000
--- a/app/ovpnlibs/assets/minivpn.mips
+++ /dev/null
Binary files differ
diff --git a/app/ovpnlibs/assets/minivpn.armeabi b/app/ovpnlibs/assets/nopievpn.armeabi
index 5c1865b1..908dceab 100755
--- a/app/ovpnlibs/assets/minivpn.armeabi
+++ b/app/ovpnlibs/assets/nopievpn.armeabi
Binary files differ
diff --git a/app/ovpnlibs/assets/minivpn.armeabi-v7a b/app/ovpnlibs/assets/nopievpn.armeabi-v7a
index cb506b63..bba1ea22 100755
--- a/app/ovpnlibs/assets/minivpn.armeabi-v7a
+++ b/app/ovpnlibs/assets/nopievpn.armeabi-v7a
Binary files differ
diff --git a/app/ovpnlibs/assets/nopievpn.mips b/app/ovpnlibs/assets/nopievpn.mips
new file mode 100755
index 00000000..af510053
--- /dev/null
+++ b/app/ovpnlibs/assets/nopievpn.mips
Binary files differ
diff --git a/app/ovpnlibs/assets/minivpn.x86 b/app/ovpnlibs/assets/nopievpn.x86
index a80bb27a..8a4b7d13 100755
--- a/app/ovpnlibs/assets/minivpn.x86
+++ b/app/ovpnlibs/assets/nopievpn.x86
Binary files differ
diff --git a/app/ovpnlibs/assets/pievpn.armeabi b/app/ovpnlibs/assets/pievpn.armeabi
new file mode 100755
index 00000000..8849f862
--- /dev/null
+++ b/app/ovpnlibs/assets/pievpn.armeabi
Binary files differ
diff --git a/app/ovpnlibs/assets/pievpn.armeabi-v7a b/app/ovpnlibs/assets/pievpn.armeabi-v7a
new file mode 100755
index 00000000..fce4d077
--- /dev/null
+++ b/app/ovpnlibs/assets/pievpn.armeabi-v7a
Binary files differ
diff --git a/app/ovpnlibs/assets/pievpn.mips b/app/ovpnlibs/assets/pievpn.mips
new file mode 100755
index 00000000..e7eaf435
--- /dev/null
+++ b/app/ovpnlibs/assets/pievpn.mips
Binary files differ
diff --git a/app/ovpnlibs/assets/pievpn.x86 b/app/ovpnlibs/assets/pievpn.x86
new file mode 100755
index 00000000..df9b45eb
--- /dev/null
+++ b/app/ovpnlibs/assets/pievpn.x86
Binary files differ
diff --git a/app/src/main/java/de/blinkt/openvpn/VpnProfile.java b/app/src/main/java/de/blinkt/openvpn/VpnProfile.java
index 93d0d386..d21a085f 100644
--- a/app/src/main/java/de/blinkt/openvpn/VpnProfile.java
+++ b/app/src/main/java/de/blinkt/openvpn/VpnProfile.java
@@ -4,8 +4,8 @@ import se.leap.bitmaskclient.R;
import se.leap.bitmaskclient.R;
-import se.leap.bitmaskclient.Dashboard;
import se.leap.bitmaskclient.EIP;
+import se.leap.bitmaskclient.Dashboard;
import se.leap.bitmaskclient.Provider;
import android.content.Context;
@@ -20,18 +20,16 @@ import android.security.KeyChain;
import android.security.KeyChainException;
import android.util.Base64;
-import de.blinkt.openvpn.core.NativeUtils;
-import de.blinkt.openvpn.core.VpnStatus;
-import de.blinkt.openvpn.core.OpenVpnService;
-import de.blinkt.openvpn.core.X509Utils;
import org.spongycastle.util.io.pem.PemObject;
import org.spongycastle.util.io.pem.PemWriter;
-import javax.crypto.BadPaddingException;
-import javax.crypto.Cipher;
-import javax.crypto.IllegalBlockSizeException;
-import javax.crypto.NoSuchPaddingException;
-import java.io.*;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileReader;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.Serializable;
+import java.io.StringWriter;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.security.InvalidKeyException;
@@ -45,6 +43,16 @@ import java.util.Locale;
import java.util.UUID;
import java.util.Vector;
+import javax.crypto.BadPaddingException;
+import javax.crypto.Cipher;
+import javax.crypto.IllegalBlockSizeException;
+import javax.crypto.NoSuchPaddingException;
+
+import de.blinkt.openvpn.core.NativeUtils;
+import de.blinkt.openvpn.core.OpenVpnService;
+import de.blinkt.openvpn.core.VpnStatus;
+import de.blinkt.openvpn.core.X509Utils;
+
public class VpnProfile implements Serializable {
// Note that this class cannot be moved to core where it belongs since
// the profile loading depends on it being here
@@ -56,7 +64,9 @@ public class VpnProfile implements Serializable {
public static final String EXTRA_PROFILEUUID = "de.blinkt.openvpn.profileUUID";
public static final String INLINE_TAG = "[[INLINE]]";
public static final String DISPLAYNAME_TAG = "[[NAME]]";
- public static final String MINIVPN = "miniopenvpn";
+ private static final String MININONPIEVPN = "nopievpn";
+ private static final String MINIPIEVPN = "pievpn";
+
private static final long serialVersionUID = 7085688938959334563L;
private static final String OVPNCONFIGFILE = "android.conf";
public static final int MAXLOGLEVEL = 4;
@@ -146,6 +156,14 @@ public class VpnProfile implements Serializable {
mProfileVersion = CURRENT_PROFILE_VERSION;
}
+ public static String getMiniVPNExecutableName()
+ {
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN)
+ return VpnProfile.MINIPIEVPN;
+ else
+ return VpnProfile.MININONPIEVPN;
+ }
+
public static String openVpnEscape(String unescaped) {
if (unescaped == null)
return null;
@@ -260,22 +278,16 @@ public class VpnProfile implements Serializable {
cfg += " tcp-client\n";
- android.util.Log.d("vpnprofile", Integer.toString(mAuthenticationType));
switch (mAuthenticationType) {
case VpnProfile.TYPE_USERPASS_CERTIFICATES:
cfg += "auth-user-pass\n";
- case VpnProfile.TYPE_CERTIFICATES:
- // Ca
- // cfg += insertFileData("ca", mCaFilename);
-
- // // Client Cert + Key
- // cfg += insertFileData("key", mClientKeyFilename);
- // cfg += insertFileData("cert", mClientCertFilename);
+ case VpnProfile.TYPE_CERTIFICATES:
// FIXME This is all we need...The whole switch statement can go...
SharedPreferences preferences = context.getSharedPreferences(Dashboard.SHARED_PREFERENCES, context.MODE_PRIVATE);
cfg+="<ca>\n"+preferences.getString(Provider.CA_CERT, "")+"\n</ca>\n";
cfg+="<key>\n"+preferences.getString(EIP.PRIVATE_KEY, "")+"\n</key>\n";
cfg+="<cert>\n"+preferences.getString(EIP.CERTIFICATE, "")+"\n</cert>\n";
+
break;
case VpnProfile.TYPE_USERPASS_PKCS12:
cfg += "auth-user-pass\n";
@@ -551,7 +563,7 @@ public class VpnProfile implements Serializable {
// Add fixed paramenters
//args.add("/data/data/de.blinkt.openvpn/lib/openvpn");
- args.add(cacheDir.getAbsolutePath() + "/" + VpnProfile.MINIVPN);
+ args.add(cacheDir.getAbsolutePath() + "/" + getMiniVPNExecutableName());
args.add("--config");
args.add(cacheDir.getAbsolutePath() + "/" + OVPNCONFIGFILE);
@@ -560,14 +572,16 @@ public class VpnProfile implements Serializable {
return args.toArray(new String[args.size()]);
}
+
+
public Intent prepareIntent(Context context) {
String prefix = context.getPackageName();
Intent intent = new Intent(context, OpenVpnService.class);
if (mAuthenticationType == VpnProfile.TYPE_KEYSTORE || mAuthenticationType == VpnProfile.TYPE_USERPASS_KEYSTORE) {
- // if (getKeyStoreCertificates(context) == null)
- // return null;
+ if (getKeyStoreCertificates(context) == null)
+ return null;
}
intent.putExtra(prefix + ".ARGV", buildOpenvpnArgv(context.getCacheDir()));
@@ -736,8 +750,8 @@ public class VpnProfile implements Serializable {
//! Return an error if somethign is wrong
public int checkProfile(Context context) {
if (mAuthenticationType == TYPE_KEYSTORE || mAuthenticationType == TYPE_USERPASS_KEYSTORE) {
- // if (mAlias == null)
- // return R.string.no_keystore_cert_selected;
+ if (mAlias == null)
+ return R.string.no_keystore_cert_selected;
}
if (!mUsePull || mAuthenticationType == TYPE_STATICKEYS) {
diff --git a/app/src/main/java/de/blinkt/openvpn/core/ConfigParser.java b/app/src/main/java/de/blinkt/openvpn/core/ConfigParser.java
index 32e5cabb..4fbbe165 100644
--- a/app/src/main/java/de/blinkt/openvpn/core/ConfigParser.java
+++ b/app/src/main/java/de/blinkt/openvpn/core/ConfigParser.java
@@ -33,7 +33,7 @@ public class ConfigParser {
public void setDefinition(HashMap<String,Vector<Vector<String>>> args) {
options = args;
}
-
+
public void parseConfig(Reader reader) throws IOException, ConfigParseError {
diff --git a/app/src/main/java/de/blinkt/openvpn/core/OpenVPNThread.java b/app/src/main/java/de/blinkt/openvpn/core/OpenVPNThread.java
index 67c24884..0de54ed7 100644
--- a/app/src/main/java/de/blinkt/openvpn/core/OpenVPNThread.java
+++ b/app/src/main/java/de/blinkt/openvpn/core/OpenVPNThread.java
@@ -1,18 +1,28 @@
package de.blinkt.openvpn.core;
import android.util.Log;
-import se.leap.bitmaskclient.R;
-import de.blinkt.openvpn.VpnProfile;
-import de.blinkt.openvpn.core.VpnStatus.ConnectionStatus;
-import de.blinkt.openvpn.core.VpnStatus.LogItem;
-import java.io.*;
+import java.io.BufferedReader;
+import java.io.BufferedWriter;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
import java.text.SimpleDateFormat;
-import java.util.*;
+import java.util.Collections;
+import java.util.Date;
+import java.util.LinkedList;
+import java.util.Locale;
+import java.util.Map;
import java.util.Map.Entry;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
+import se.leap.bitmaskclient.R;
+import de.blinkt.openvpn.VpnProfile;
+import de.blinkt.openvpn.core.VpnStatus.ConnectionStatus;
+import de.blinkt.openvpn.core.VpnStatus.LogItem;
+
public class OpenVPNThread implements Runnable {
private static final String DUMP_PATH_STRING = "Dump path: ";
private static final String TAG = "OpenVPN";
@@ -158,16 +168,16 @@ public class OpenVPNThread implements Runnable {
private String genLibraryPath(String[] argv, ProcessBuilder pb) {
// Hack until I find a good way to get the real library path
- String applibpath = argv[0].replace("/cache/" + VpnProfile.MINIVPN , "/lib");
+ String applibpath = argv[0].replace("/cache/" + VpnProfile.getMiniVPNExecutableName() , "/lib");
String lbpath = pb.environment().get("LD_LIBRARY_PATH");
if(lbpath==null)
lbpath = applibpath;
else
- lbpath = lbpath + ":" + applibpath;
+ lbpath = applibpath + ":" + lbpath;
if (!applibpath.equals(mNativeDir)) {
- lbpath = lbpath + ":" + mNativeDir;
+ lbpath = mNativeDir + ":" + lbpath;
}
return lbpath;
}
diff --git a/app/src/main/java/de/blinkt/openvpn/core/OpenVpnService.java b/app/src/main/java/de/blinkt/openvpn/core/OpenVpnService.java
index 010cc4f0..b5bba5d4 100644
--- a/app/src/main/java/de/blinkt/openvpn/core/OpenVpnService.java
+++ b/app/src/main/java/de/blinkt/openvpn/core/OpenVpnService.java
@@ -79,7 +79,6 @@ public class OpenVpnService extends VpnService implements StateListener, Callbac
else
return false;
}
-
// From: http://stackoverflow.com/questions/3758606/how-to-convert-byte-size-into-human-readable-format-in-java
public static String humanReadableByteCount(long bytes, boolean mbit) {
if (mbit)
@@ -748,12 +747,17 @@ public class OpenVpnService extends VpnService implements StateListener, Callbac
public String getTunReopenStatus() {
String currentConfiguration = getTunConfigString();
- if (currentConfiguration.equals(mLastTunCfg))
+ if (currentConfiguration.equals(mLastTunCfg)) {
return "NOACTION";
- else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT)
- return "OPEN_AFTER_CLOSE";
- else
- return "OPEN_BEFORE_CLOSE";
+ } else {
+ String release = Build.VERSION.RELEASE;
+ if (Build.VERSION.SDK_INT == Build.VERSION_CODES.KITKAT && !release.startsWith("4.4.3")
+ && !release.startsWith("4.4.4") && !release.startsWith("4.4.5"))
+ // There will be probably no 4.4.4 or 4.4.5 version, so don't waste effort to do parsing here
+ return "OPEN_AFTER_CLOSE";
+ else
+ return "OPEN_BEFORE_CLOSE";
+ }
}
public class LocalBinder extends Binder {
diff --git a/app/src/main/java/de/blinkt/openvpn/core/VPNLaunchHelper.java b/app/src/main/java/de/blinkt/openvpn/core/VPNLaunchHelper.java
index 55fcb0ba..57a94ee7 100644
--- a/app/src/main/java/de/blinkt/openvpn/core/VPNLaunchHelper.java
+++ b/app/src/main/java/de/blinkt/openvpn/core/VPNLaunchHelper.java
@@ -1,19 +1,20 @@
package de.blinkt.openvpn.core;
+import android.content.Context;
+import android.content.Intent;
+import android.os.Build;
+
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
-import android.content.Context;
-import android.content.Intent;
-import android.os.Build;
import se.leap.bitmaskclient.R;
import de.blinkt.openvpn.VpnProfile;
public class VPNLaunchHelper {
static private boolean writeMiniVPN(Context context) {
- File mvpnout = new File(context.getCacheDir(),VpnProfile.MINIVPN);
+ File mvpnout = new File(context.getCacheDir(),VpnProfile.getMiniVPNExecutableName());
if (mvpnout.exists() && mvpnout.canExecute())
return true;
@@ -23,12 +24,12 @@ public class VPNLaunchHelper {
InputStream mvpn;
try {
- mvpn = context.getAssets().open("minivpn." + Build.CPU_ABI);
+ mvpn = context.getAssets().open(VpnProfile.getMiniVPNExecutableName() + "." + Build.CPU_ABI);
}
catch (IOException errabi) {
VpnStatus.logInfo("Failed getting assets for archicture " + Build.CPU_ABI);
e2=errabi;
- mvpn = context.getAssets().open("minivpn." + Build.CPU_ABI2);
+ mvpn = context.getAssets().open(VpnProfile.getMiniVPNExecutableName() + "." + Build.CPU_ABI2);
}
@@ -45,7 +46,7 @@ public class VPNLaunchHelper {
fout.close();
if(!mvpnout.setExecutable(true)) {
- VpnStatus.logError("Failed to set minivpn executable");
+ VpnStatus.logError("Failed to make OpenVPN executable");
return false;
}
diff --git a/app/src/main/res/values-et/strings-icsopenvpn.xml b/app/src/main/res/values-et/strings-icsopenvpn.xml
index f8e219f3..478483ec 100755
--- a/app/src/main/res/values-et/strings-icsopenvpn.xml
+++ b/app/src/main/res/values-et/strings-icsopenvpn.xml
@@ -215,6 +215,7 @@
<string name="vpn_import_hint">Kasuta olemasoleva (.ovpn või .conf) profiili importimiseks sdcard pealt &lt;img src=\"ic_menu_archive\"/&gt; ikooni.</string>
<string name="faq_hint">Kindlasti vaata KKK\'d. See sisaldab ka alustamise lühijuhendit.</string>
<string name="faq_routing_title">Marsruutimine ja võrguliidese konfigureerimine</string>
+ <string name="faq_routing">Marsruutimine ja liidese konfigureerimine ei toimu traditsiooniliste ifconfig/route käskude abil, vaid kasutades VPNService API\'t. Selle tulemuseks on teistest operatsioonisüsteemidest erinev marsruutimiskonfiguratsioon. VPN tunneli konfiguratsioon koosneb IP aadressist ja selle liidese kaudu suunatavatest võrkudest. Täpsemalt, pole vaja ei VPN partneri ega lüüsi aadressi. Erilised marsruudid VPN serverini jõudmiseks (näiteks redirect-gateway poolt lisatud) pole samuti vajalikud. Selle tulemusena ignoreerib rakendus konfiguratsiooni importimisel neid seadeid. Rakendus tagab VPNService API abil selle, et ühendus VPN serveriga ei toimu läbi VPN tunneli. Toetatud on ainult VPN tunneli kaudu suunatud võrkude määratlemine. Rakendus üritab avastada võrgud mida ei tohiks suunata üle tunneli (näiteks route x.x.x.x y.y.y.y net_gateway) ja arvutab marsruudid mis välistavad eelmainitud marsruudid, jäljendades teiste platvormide toimimist. Logiaknas kuvatakse peale ühenduse loomist kehtivat VPNService konfiguratsiooni.</string>
<string name="persisttun_summary">Ära taasta otseühendust kui OpenVPN on taasühendumas.</string>
<string name="persistent_tun_title">Katkematu tun</string>
<string name="openvpn_log">OpenVPN Logi</string>
@@ -314,4 +315,8 @@
<string name="blocklocal_summary">Kohaliku liidese külge ühendatud võrkude ühendusi ei suunata üle VPN\'i. Selle valiku keelamisel suunatakse ka kohaliku võrgu andmeliiklus VPN\'i.</string>
<string name="blocklocal_title">Keela VPN kohalike võrkude jaoks</string>
<string name="userpw_file">Kasutajanimede/Paroolide fail</string>
+ <string name="imported_from_file">[Imporditud: %s]</string>
+ <string name="files_missing_hint">Mõningaid faile ei leitud. Palun valige importimiseks profiili failid:</string>
+ <string name="openvpn_is_no_free_vpn">Selle rakenduse kasutamiseks vajate OpenVPN toega VPN teenusepakkujat/VPN lüüsi (mida sageli pakub teie tööandja). Lisainfo saamiseks OpenVPN kohta ja oma isikliku OpenVPN serveri seadistamise kohta tutvuge veebilehega http://community.openvpn.net/ .</string>
+ <string name="import_log">Impordi logi:</string>
</resources>
diff --git a/app/src/main/res/values-fr/strings-icsopenvpn.xml b/app/src/main/res/values-fr/strings-icsopenvpn.xml
index e84f8cb8..34512801 100755
--- a/app/src/main/res/values-fr/strings-icsopenvpn.xml
+++ b/app/src/main/res/values-fr/strings-icsopenvpn.xml
@@ -315,4 +315,8 @@ Sur certaines images, cette notification joue un son.\nAndroid à introduit ces
<string name="blocklocal_summary">Les réseaux directement connectés aux interfaces locales ne seront pas routés via le VPN. Décochez cette option pour rediriger tout le trafic local vers le VPN.</string>
<string name="blocklocal_title">Ne pas utilisé le VPN pour les réseaux locaux</string>
<string name="userpw_file">Fichier Nom d\'utilisateur/Mot de passe</string>
+ <string name="imported_from_file">[Importé de : %s]</string>
+ <string name="files_missing_hint">Certains fichiers sont introuvables. Sélectionner les fichiers pour importer le profil :</string>
+ <string name="openvpn_is_no_free_vpn">Pour utiliser cette application, vous avez besoin d\'un fournisseur/passerelle VPN qui soutient OpenVPN (souvent fourni par votre employeur). Vérifier ici http://community.openvpn.net/ pour plus d\'informations sur OpenVPN et comment configurer votre propre serveur OpenVPN.</string>
+ <string name="import_log">Journal d\'importation :</string>
</resources>
diff --git a/app/src/main/res/values-it/strings-icsopenvpn.xml b/app/src/main/res/values-it/strings-icsopenvpn.xml
index aaa18afa..61d09818 100755
--- a/app/src/main/res/values-it/strings-icsopenvpn.xml
+++ b/app/src/main/res/values-it/strings-icsopenvpn.xml
@@ -84,6 +84,7 @@
<string name="default_route_summary">Reindirizza tutto il traffico sulla VPN</string>
<string name="use_default_title">Utilizza il Routing di default</string>
<string name="custom_route_message">Inserisci instradamenti personalizzati. Usare il formato CIDR. \"10.0.0.0/8 2002::/16\" reindirizza le reti 10.0.0.0/8 e 2002::/16 sulla VPN.</string>
+ <string name="custom_route_message_excluded">Itinerari che dovrebbero non essere instradati su VPN. Utilizzare la stessa sintassi per quanto riguarda le rotte incluse.</string>
<string name="custom_routes_title">Routing personalizzati</string>
<string name="log_verbosity_level">Livello di dettaglio del registro</string>
<string name="float_summary">Permette pacchetti autenticati da qualsiasi IP (consente che l\'IP del server possa cambiare)</string>
diff --git a/app/src/main/res/values-ru/strings-icsopenvpn.xml b/app/src/main/res/values-ru/strings-icsopenvpn.xml
index 292ddf46..999df70b 100755
--- a/app/src/main/res/values-ru/strings-icsopenvpn.xml
+++ b/app/src/main/res/values-ru/strings-icsopenvpn.xml
@@ -6,7 +6,7 @@
<string name="address">Адрес сервера:</string>
<string name="port">Порт сервера:</string>
<string name="location">Расположение</string>
- <string name="cant_read_folder">Не могу прочитать директорию</string>
+ <string name="cant_read_folder">Не удается прочитать каталог</string>
<string name="select">Выбрать</string>
<string name="cancel">Отмена</string>
<string name="no_data">Нет данных</string>
@@ -26,7 +26,7 @@
<string name="file_select">Выбрать&#8230;</string>
<string name="file_nothing_selected">Вы должны выбрать файл</string>
<string name="useTLSAuth">Использовать аутентификацию TLS</string>
- <string name="tls_direction">TLS Direction</string>
+ <string name="tls_direction">Направление проверки TLS</string>
<string name="ipv6_dialog_tile">Введите адрес/маску подсети IPv6 в формате CIDR (например 2000:dd::23/64)</string>
<string name="ipv4_dialog_title">Введите адрес/маску подсети IPv4 в формате CIDR (например 1.2.3.4/24)</string>
<string name="ipv4_address">Адрес IPv4</string>
@@ -37,14 +37,14 @@
<string name="static_keys_info">Для конфигурации с статичными сертификатами будут использоваться ключи TLS</string>
<string name="configure_the_vpn">Настройка VPN-туннеля</string>
<string name="menu_add_profile">Добавить конфигурацию</string>
- <string name="add_profile_name_prompt">Введите имя новой конфигурации</string>
- <string name="duplicate_profile_name">Пожалуйста, введите уникальное имя профиля</string>
- <string name="profilename">Имя конфигурации</string>
+ <string name="add_profile_name_prompt">Введите название новой конфигурации</string>
+ <string name="duplicate_profile_name">Пожалуйста, введите уникальное название конфигурации</string>
+ <string name="profilename">Название конфигурации</string>
<string name="no_keystore_cert_selected">Необходимо выбрать сертификат пользователя</string>
<string name="no_error_found">Ошибок не найдено</string>
<string name="config_error_found">Ошибка в конфигурации</string>
- <string name="ipv4_format_error">Невозможно прочесть IPv4 адрес</string>
- <string name="custom_route_format_error">Невозможно примениить пользовательские маршруты</string>
+ <string name="ipv4_format_error">Невозможно распознать IPv4 адрес</string>
+ <string name="custom_route_format_error">Невозможно распознать пользовательские маршруты</string>
<string name="pw_query_hint">(оставьте пустым для запроса по требованию)</string>
<string name="vpn_shortcut">Ярлык OpenVPN</string>
<string name="vpn_launch_title">Подключиться к VPN</string>
@@ -61,7 +61,7 @@
<string name="cancel_connection_query">Отключение активных VPN/Отмена попыток подключения?</string>
<string name="remove_vpn">Удалить VPN</string>
<string name="check_remote_tlscert">Проверяет, использует ли сервер сертификаты TLS (--remote-cert-tls server)</string>
- <string name="check_remote_tlscert_title">Ожидать сертификата TLS от сервера</string>
+ <string name="check_remote_tlscert_title">Ожидать TLS сертификат от сервера</string>
<string name="remote_tlscn_check_summary">Проверка DN объекта удаленного сертификата</string>
<string name="remote_tlscn_check_title">Проверка имени хоста сертификата</string>
<string name="enter_tlscn_dialog">Переключатель способа проверки DN сертификата (e.g. C=DE, L=Paderborn, OU=Avian IP Carriers, CN=openvpn.blinkt.de)\n\nВозможные значения: полный DN, RDN (для примера openvpn.blinkt.de) или только преффикс RDN для проверки.\n\nПри использовании преффикса RDN, например \"Server\", значения будут \"Server-1\", \"Server-2\" и т.д.\n\nПри пустом текстовом поле проверка будет проводиться по имени хоста.\n\nДля подробностей смотрите руководство для OpenVPN 2.3.1+, раздел —verify-x509-name</string>
@@ -73,7 +73,7 @@
<string name="use_pull">Запрашивать параметры</string>
<string name="dns">DNS</string>
<string name="override_dns">Переопределить параметры DNS от сервера</string>
- <string name="dns_override_summary">Использовать ваши DNS</string>
+ <string name="dns_override_summary">Использовать свой DNS сервер</string>
<string name="searchdomain">Домен поиска</string>
<string name="dns1_summary">DNS-сервер для использования.</string>
<string name="dns_server">DNS-сервер</string>
@@ -84,20 +84,25 @@
<string name="default_route_summary">Перенаправляет весь трафик через VPN</string>
<string name="use_default_title">Использовать маршрут по-умолчанию</string>
<string name="custom_route_message">Введите пользовательские маршруты. Только введите адрес назначения в формате CIDR. \"10.0.0.0/8 2002::/16\" будет использовано для 10.0.0.0/8 и 2002::/16 сетей через VPN.</string>
+ <string name="custom_route_message_excluded">Маршруты которые не следует направлять через VPN. Используйте тот-же синтаксис как и в случае с другими маршрутами.</string>
<string name="custom_routes_title">Пользовательские маршруты</string>
+ <string name="custom_routes_title_excluded">Исключенные сети</string>
<string name="log_verbosity_level">Уровень детализации лога</string>
<string name="float_summary">Разрешить пакеты аутентификации с любого IP-адреса</string>
<string name="float_title">Разрешать \"плавающие\" сервера</string>
<string name="custom_options_title">Пользовательские параметры</string>
<string name="edit_vpn">Редактирование параметров VPN</string>
- <string name="remove_vpn_query">Удаление профиля VPN %s?</string>
- <string name="tun_error_helpful">На некторых костомных сборках права на /dev/tun могут быть неверными или tun-модуль может быть не включен. Для прошивки CM9 можете попробовать исправить владельца прямо из настроек программы</string>
- <string name="tun_open_error">Открытие интерфейса tun окончилось неудачей</string>
+ <string name="remove_vpn_query">Удалить VPN профиль %s?</string>
+ <string name="tun_error_helpful">На некоторых кастомных сборках права на /dev/tun могут быть неверными или tun-модуль может быть не включен. Для прошивки CM9 можете попробовать исправить владельца прямо из настроек программы</string>
+ <string name="tun_open_error">Не удается открыть tun интерфейс</string>
<string name="error">"Ошибка: "</string>
<string name="clear">Очистить</string>
<string name="last_openvpn_tun_config">Открытие tun-интерфейса:</string>
<string name="local_ip_info">Адрес IPv4: %1$s/%2$d IPv6: %3$s MTU: %4$d</string>
<string name="dns_server_info">DNS-сервер: %1$s, Домен: %2$s</string>
+ <string name="routes_info_incl">Маршруты: %1$s %2$s</string>
+ <string name="routes_info_excl">Исключенные маршруты: %1$s %2$s</string>
+ <string name="routes_debug">Подключенные маршруты сервиса VPN: %1$s %2$s</string>
<string name="ip_not_cidr">Получена информация интерфейса %1$s и %2$s, второй адрес является удалённым адресом канала. Используется сетевая маска /32 для локального IP адреса. Режим, установленный OpenVPN: \"%3$s\".</string>
<string name="route_not_cidr">Невозможно использовать выражения %1$s и %2$s как маршрут по стандарту CIDR. используется /32 как маска подсети.</string>
<string name="route_not_netip">Маршрут исправлен с %1$s/%2$s на %3$s/%2$s</string>
@@ -105,7 +110,7 @@
<string name="version_info">%1$s %2$s</string>
<string name="send_logfile">Отправить файл журнала</string>
<string name="send">Отправить</string>
- <string name="ics_openvpn_log_file">ICS OpenVPN файла лога</string>
+ <string name="ics_openvpn_log_file">ICS OpenVPN лог файл</string>
<string name="copied_entry">Скопировать лог в буфер обмена</string>
<string name="tap_mode">Режим TAP</string>
<string name="faq_tap_mode">Режим TAP невозможен на устройствах без root-а. Поэтому это приложение не поддерживает TAP</string>
@@ -120,7 +125,7 @@
<string name="encryption">Шифрование</string>
<string name="cipher_dialog_title">Укажите метод шифрования</string>
<string name="chipher_dialog_message">Укажите алгоритм шифрования, используемый OpenVPN. Оставьте пустым, чтобы использовать шифрование по-умолчанию.</string>
- <string name="auth_dialog_message">Введите the authentication digest для OpenVPN. Оставьте пустым для использования значения по-умолчанию.</string>
+ <string name="auth_dialog_message">Введите дайджест аутентификацию используемую в OpenVPN. Оставьте пустым для использования значения по-умолчанию.</string>
<string name="settings_auth">Авторизация/шифрование</string>
<string name="file_explorer_tab">Обзор файлов</string>
<string name="inline_file_tab">Встроенный файл</string>
@@ -136,7 +141,7 @@
<string name="import_could_not_open">Не удалось найти файл %1$s, указанный в файле конфигурации</string>
<string name="importing_config">Импорт файла конфигурации из исходного %1$s</string>
<string name="import_warning_custom_options">Ваша конфигурация имел несколько параметров, которые не входят в параметры стандартной конфигурации. Эти параметры были вынесены в пользовательскую конфигурацию. Пользовательская конфигурация отображается ниже:</string>
- <string name="import_done">Файла конфигурации успешно прочитан.</string>
+ <string name="import_done">Файл конфигурации успешно прочитан.</string>
<string name="nobind_summary">Не привязываться к локальному адресу и порту</string>
<string name="no_bind">Не использовать привязки</string>
<string name="import_configuration_file">Импорт файла конфигурации</string>
@@ -164,7 +169,7 @@
<string name="generated_config_summary">Показать сгенерированный файл конфигурации OpenVPN</string>
<string name="edit_profile_title">Правка \"%s\"</string>
<string name="building_configration">Создание конфигурации&#8230;</string>
- <string name="netchange_summary">Включение этого параметра заставит переподключиться, если состояние сети изменения (WIFI с мобильного)</string>
+ <string name="netchange_summary">Включение этого параметра заставит переподключаться, если состояние интернет соединения (WIFI) изменится</string>
<string name="netchange">Переподключение при изменении сети</string>
<string name="netstatus">Статус сети: %s</string>
<string name="extracahint">Сертификат CA обычно возвращается из хранилища Android Keystore. Укажите отдельный сертификат, если у вас возникли ошибки при проверке сертификата.</string>
@@ -273,23 +278,40 @@
<string name="clearappsdialog">Очистить список авторизованных внешних приложений?\nСписок разрешенных приложений:\n\n%s</string>
<string name="screenoff_summary">VPN-соединение приостанавливается, если экран выключен или объем данных меньше 64kb за 60сек. Если включена опция \"Удержание соединения\", VPN-соединение будет постоянно активным. Без этого параметра оно будет приостанавливаться при этих условиях..</string>
<string name="screenoff_title">Приостановить VPN-соединение при выключенном экране</string>
- <string name="screenoff_pause">Приостановка соединения при выключенном экране: меньше, чем %1$s за %2$sс</string>
+ <string name="screenoff_pause">Приостановка соединения при выключенном экране: меньше, чем %1$s in %2$ss</string>
<string name="screen_nopersistenttun">Внимание: постоянный tun не включен для этого VPN. Трафик будет проходить через обычный доступ в Интернет, когда экран выключен.</string>
<string name="save_password">Сохранить пароль</string>
<string name="pauseVPN">Приостановить VPN</string>
<string name="resumevpn">Продолжить VPN</string>
<string name="state_userpause">VPN приостановлен по запросу пользователя</string>
<string name="state_screenoff">VPN приостановлен - выкл. экран</string>
+ <string name="device_specific">Хак для данного устройства</string>
<string name="cannotparsecert">Не удается отобразить сведения о сертификате</string>
<string name="appbehaviour">Поведение приложения</string>
<string name="vpnbehaviour">Поведение VPN</string>
<string name="allow_vpn_changes">Разрешить изменение VPN-профилей</string>
<string name="hwkeychain">Аппаратное хранилище ключей:</string>
<string name="faq_vpndialog43_title">Окно подтверждения VPN для Android 4.3 и позже</string>
+ <string name="donatePlayStore">Также Вы можете выразить благодарность в виде пожертвования на Play Store:</string>
<string name="thanks_for_donation">Спасибо за пожертвование %s!</string>
<string name="logCleared">Журнал очищен.</string>
<string name="show_password">Показать пароль</string>
+ <string name="keyChainAccessError">ошибка при доступе к хранилищу ключей: %s</string>
+ <string name="timestamp_short">Кратко</string>
+ <string name="timestamp_iso">ISO</string>
+ <string name="timestamps">Время</string>
+ <string name="timestamps_none">Нет</string>
<string name="uploaded_data">Выгружено</string>
<string name="downloaded_data">Загружено</string>
<string name="vpn_status">Статус VPN</string>
+ <string name="logview_options">Посмотреть настройки</string>
+ <string name="unhandled_exception">Неопознання ошибка: %1$s\n\n%2$s</string>
+ <string name="unhandled_exception_context">%3$s: %1$s\n\n%2$s</string>
+ <string name="faq_system_dialog_xposed">Если на Вашем устройстве установлены Рут права, Вы можете установить &lt;a href=\"http://xposed.info/\"&gt;Xposed framework&lt;/a&gt; и &lt;a href=\"http://repo.xposed.info/module/de.blinkt.vpndialogxposed\"&gt;модуль автоматического подтверждения диалога подключения VPN&lt;/a&gt; на свой страх и риск</string>
+ <string name="blocklocal_summary">Сети напрямую доступные через локальный интерфейс не будут маршрутизированы через VPN. Отключите эту опцию чтобы направить трафик через VPN.</string>
+ <string name="blocklocal_title">Не использовать VPN для локальных адресов</string>
+ <string name="imported_from_file">[Импортировано из: %s]</string>
+ <string name="files_missing_hint">Некоторые файлы не найдены. Выберите файлы для импорта в профиль:</string>
+ <string name="openvpn_is_no_free_vpn">Для использования данного приложения Вам необходим VPN провайдер/шлюз поддерживающий OpenVPN. Для получения информации по настройке собственного OpenVPN сервера: http://community.openvpn.net/</string>
+ <string name="import_log">Лог импорта:</string>
</resources>
diff --git a/app/src/main/res/values-tr/strings-icsopenvpn.xml b/app/src/main/res/values-tr/strings-icsopenvpn.xml
index 903c358a..26ac47ad 100755
--- a/app/src/main/res/values-tr/strings-icsopenvpn.xml
+++ b/app/src/main/res/values-tr/strings-icsopenvpn.xml
@@ -13,7 +13,7 @@
<string name="useLZO">LZO sıkıştırma</string>
<string name="client_no_certificate">Sertifika yok</string>
<string name="client_certificate_title">İstemci sertifikası</string>
- <string name="client_key_title">İstemci sertifika anahtarı</string>
+ <string name="client_key_title">İstemci Sertifika Anahtarı</string>
<string name="client_pkcs12_title">PCKCS12 Dosyası</string>
<string name="ca_title">CA Sertifikası</string>
<string name="no_certificate">Bir sertifika seçmelisiniz</string>
@@ -307,4 +307,6 @@
<string name="unhandled_exception">Kural dışı durum: %1$s\n\n%2$s</string>
<string name="unhandled_exception_context">%3$s: %1$s\n\n%2$s</string>
<string name="full_licenses">Lisanslar</string>
+ <string name="blocklocal_title">Yerel ağlar için Bypass VPN</string>
+ <string name="userpw_file">Kullanıcı adı / Şifre dosyası</string>
</resources>
diff --git a/app/src/main/res/values-uk/strings-icsopenvpn.xml b/app/src/main/res/values-uk/strings-icsopenvpn.xml
index 173ae0d4..97a1e9a4 100755
--- a/app/src/main/res/values-uk/strings-icsopenvpn.xml
+++ b/app/src/main/res/values-uk/strings-icsopenvpn.xml
@@ -85,6 +85,7 @@
<string name="use_default_title">Використовувати типовий маршрут</string>
<string name="custom_route_message"> Введіть користувацькі маршрути. Тільки введіть адресу призначення в форматі CIDR. \"10.0.0.0/8 2002::/16\" буде використано для 10.0.0.0/8 і 2002::/16 мереж через VPN.</string>
<string name="custom_routes_title">Власні маршрути</string>
+ <string name="custom_routes_title_excluded">Виключені Мережі</string>
<string name="log_verbosity_level">Рівень деталізації журналу</string>
<string name="float_summary">Дозволити пакети аутентифікації з будь-якої IP-адреси</string>
<string name="float_title">Дозволити \"плаваючий\" сервер</string>
@@ -98,6 +99,9 @@
<string name="last_openvpn_tun_config">Відкриття tun інтерфейсу:</string>
<string name="local_ip_info">Адреса IPv4: %1$s/%2$d IPv6: %3$s MTU: %4$d</string>
<string name="dns_server_info">DNS-сервер: %1$s, Домен: %2$s</string>
+ <string name="routes_info_incl">Маршрути: %1$s %2$s</string>
+ <string name="routes_info_excl">Виключені маршрути : %1$s %2$s</string>
+ <string name="routes_debug">Встановлені маршрути VpnService: %1$s %2$s</string>
<string name="ip_not_cidr">Отримано інформацію інтерфейсу %1$s і %2$s, друга адреса є віддаленою адресою каналу. Використовується мережева маска /32 для локальної IP-адреси. Режим, встановлений OpenVPN: \"%3$s\".</string>
<string name="route_not_cidr">Неможливо використовувати вирази %1$s і %2$s як маршрут за стандартом CIDR. використовується /32 як маска підмережі.</string>
<string name="route_not_netip">Виправлено маршрут з %1$s/%2$s на %3$s/%2$s</string>
@@ -273,4 +277,18 @@
<string name="screenoff_pause">Призупинення зв\'язку в екрані вимкненого стану: менше %1$s у %2$sс.</string>
<string name="screen_nopersistenttun">Попередження: Постійний тут не увімкнений для цього VPN. Трафік буде використовувати звичайне інтернет-з\'єднання, коли екран вимкнений.</string>
<string name="save_password">Зберегти пароль</string>
+ <string name="pauseVPN">Призупинити VPN</string>
+ <string name="resumevpn">Відновити VPN</string>
+ <string name="cannotparsecert">Неможливо відобразити інформацію про сертифікат</string>
+ <string name="vpnbehaviour">Поведінка VPN</string>
+ <string name="allow_vpn_changes">Дозволити зміни в профілі VPN</string>
+ <string name="permission_icon_app">Іконка додатка намагається використовувати OpenVPN для Android</string>
+ <string name="thanks_for_donation">Дякуємо за пожертвування %s!</string>
+ <string name="logCleared">Журнал очищено.</string>
+ <string name="show_password">Показати пароль</string>
+ <string name="timestamp_iso">ISO</string>
+ <string name="timestamps">Часові позначки</string>
+ <string name="full_licenses">Повні ліцензії</string>
+ <string name="imported_from_file">[Імпортовано з: %s]</string>
+ <string name="import_log">Журнал імпорту :</string>
</resources>
diff --git a/app/src/main/res/values-zh-rCN/strings-icsopenvpn.xml b/app/src/main/res/values-zh-rCN/strings-icsopenvpn.xml
index 0ffb5d6b..e49a2240 100755
--- a/app/src/main/res/values-zh-rCN/strings-icsopenvpn.xml
+++ b/app/src/main/res/values-zh-rCN/strings-icsopenvpn.xml
@@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<!--Generated by crowdin.net-->
+<!-- Generated by crowdin.net -->
<resources>
<string name="address">服务器地址:</string>
@@ -59,8 +60,8 @@
<string name="title_cancel">取消确认</string>
<string name="cancel_connection_query">断开已连接的 VPN / 取消连接尝试?</string>
<string name="remove_vpn">删除 VPN</string>
- <string name="check_remote_tlscert">检查服务器是否使用 TLS 服务器证书</string>
- <string name="check_remote_tlscert_title">除了 TLS 服务器</string>
+ <string name="check_remote_tlscert">检查服务器是否使用了 TLS服务器端扩展 (--remote-cert-tlsserver server)</string>
+ <string name="check_remote_tlscert_title">需要 TLS 服务器证书</string>
<string name="remote_tlscn_check_summary">检查远程服务器证书的 DN 属性</string>
<string name="remote_tlscn_check_title">证书主机名检查</string>
<string name="enter_tlscn_dialog">勾选此项将验证远程证书的 DN 属性(例:C=DE, L=Paderborn, OU=Avian IP Carriers, CN=openvpn.blinkt.de)\n\n输入完整的 DN 或者 RDN 以便进行验证。\n\nRDN前缀 \"Server\" 可以匹配 \"Server-1\" 以及 \"SERVER-2\"\n\n若留空则将仅验证 RDN 而不验证主机名。\n\n有关更多信息请查看 OpenVPN 2.3.1+ 参考手册的 --verify-x509-name 小节</string>
@@ -84,6 +85,7 @@
<string name="use_default_title">使用默认路由</string>
<string name="custom_route_message">输入自定义路由。输入 CIDR 格式地址。</string>
<string name="custom_routes_title">自定义路由</string>
+ <string name="custom_routes_title_excluded">just</string>
<string name="log_verbosity_level">日志详细级别</string>
<string name="float_summary">允许来自任何 IP 的认证数据包</string>
<string name="float_title">允许浮服务器</string>
@@ -97,6 +99,8 @@
<string name="last_openvpn_tun_config">正在打开 tun 设备:</string>
<string name="local_ip_info">本地 IPv4: %1$s/%2$d IPv6: %3$s MTU: %4$d</string>
<string name="dns_server_info">DNS 服务器: %1$s, 域名: %2$s</string>
+ <string name="routes_info_excl">排除的路由: %1$s %2$s</string>
+ <string name="routes_debug">China</string>
<string name="ip_not_cidr">已获得接口信息 %1$s 以及 %2$s,将第二个地址作为远程地址。使用 /32 作为本地掩码。OpenVPN 给出的模式是 \"%3$s\"。</string>
<string name="route_not_cidr">无法将 %1$s 和 %2$s 作为 CIDR 形式的路由,将使用 /32 的子网掩码。</string>
<string name="route_not_netip">纠正路由 %1$s/%2$s 为 %3$s/%2$s</string>
@@ -114,11 +118,11 @@
<string name="copying_log_entries">复制日志条目</string>
<string name="faq_copying">若要复制单条日志请在相应条目上轻按即可。若要复制/发送全部日志请使用发送日志功能。如果该功能在界面中没有显示,请使用设备原生的菜单按钮。</string>
<string name="faq_shortcut">启动快捷方式</string>
- <string name="faq_howto_shortcut">您可以在主屏幕上放置一个 OpenVPN 的快捷方式。这取决于您的主屏幕管理程序,可能是快捷方式,也可能是一个小挂件。</string>
+ <string name="faq_howto_shortcut">你可以在桌面上放置一个启动 OpenVPN 的图标。如果你的桌面程序支持,你可以在桌面上放置 OpenVPN 的启动图标,或者是 OpenVPN 的桌面挂件</string>
<string name="no_vpn_support_image">很遗憾,您目前的系统不支持 VPN 服务接口</string>
<string name="encryption">加密</string>
<string name="cipher_dialog_title">输入加密方法</string>
- <string name="chipher_dialog_message">请输入 OpenVPN 使用的加密算法。留空为默认。</string>
+ <string name="chipher_dialog_message">输入 OpenVPN 所使用的加密密码算法。留空以使用默认算法。</string>
<string name="auth_dialog_message">输入 OpenVPN 使用的认证摘要。留空则使用默认的摘要。</string>
<string name="settings_auth">认证/加密</string>
<string name="file_explorer_tab">文件浏览器</string>
@@ -134,7 +138,7 @@
<string name="add_profile">添加配置文件</string>
<string name="import_could_not_open">无法找到导入配置文件参考的文件: %1$s</string>
<string name="importing_config">从 %1$s 中导入配置文件</string>
- <string name="import_warning_custom_options">您的配置中有几个选项无法解析。这些选项是您自定义添加的。如下所示:</string>
+ <string name="import_warning_custom_options">您的配置文件中有几个配置项无法在配置菜单中查看和修改,这些配置项将会当成自定义配置选项。下面是自定义的配置选项:</string>
<string name="import_done">读取配置文件完成</string>
<string name="nobind_summary">不关联到本地地址和端口</string>
<string name="no_bind">无本地绑定</string>
@@ -150,7 +154,8 @@
<string name="converted_profile">已导入配置文件</string>
<string name="converted_profile_i">已导入配置文件 %d</string>
<string name="broken_images">图像已损坏</string>
- <string name="broken_images_faq">&lt;p&gt;HTC 的官方固件存在问题,它无法将网络流量转发到隧道接口上(参见(英文网页): &lt;a href=\"http://code.google.com/p/ics-openvpn/issues/detail?id=18\"&gt;Issue 18&lt;/a&gt; )&lt;/p&gt;&lt;p&gt;SONY 的 Xperia arc S 机型和 Xperia Ray 机型的固件上没有包含完整的 Android VPN 服务,其他 Sony 手机的固件可能也存在此问题。(参见(英文网页): &lt;a href=\"http://code.google.com/p/ics-openvpn/issues/detail?id=29\"&gt;Issue 29&lt;/a&gt;)&lt;/p&gt;&lt;p&gt;在一些民间爱好者制作的固件上,可能缺少 /dev/tun 设备,或者 /dev/tun 的权限不正确。一些 CM9 固件需要设置 /dev/tun 的文件属主。.&lt;/p&gt;&lt;p&gt;重点是,如果你的固件存在问题,请向厂商或者固件制作者报告,如果报告问题的人足够多,就能引起厂商或者固件制作者的注意,他们就会去修复这些问题。&lt;/p&gt;</string>
+ <string name="broken_images_faq">&lt;p&gt;HTC官方固件可能存在异常的路由问题并会导致数据流不通过隧道传输(详见BUG追踪&lt;a href=\"http://code.google.com/p/ics-openvpn/issues/detail?id=18\"&gt;Issue 18&lt;/a&gt;)。&lt;/p&gt;&lt;p&gt;据报导,旧版的SONY Xperia Arc S和Xperia Ray的官方固件完全不包含VPNService(详见BUG追踪&lt;a href=\"http://code.google.com/p/ics-openvpn/issues/detail?id=29\"&gt;Issue 29&lt;/a&gt;)。&lt;/p&gt;&lt;p&gt;在自制固件中,tun
+模块可能会有缺失,或是未被设置正确的权限。部分CM9固件需要启用“特定设备HACKS”项下的“修复/dev/tun的权限”的选项。&lt;/p&gt;&lt;p&gt;最重要的是:若您的设备的固件存在问题,请直接向您的设备供应商反馈。越多人向供应商反映问题,问题越有可能得到解决。&lt;/p&gt;</string>
<string name="pkcs12_file_encryption_key">PKCS12 文件加密密钥</string>
<string name="private_key_password">私钥密码</string>
<string name="password">密码</string>
@@ -183,8 +188,9 @@
<string name="obscure">其他 OpenVPN 设置,一般不需要修改。</string>
<string name="advanced">高级设置</string>
<string name="export_config_title">ICS Openvpn 配置</string>
- <string name="warn_no_dns">没有正在使用的 DNS 服务器。域名解析可能无法工作。请考虑设置自定义 DNS 服务器</string>
+ <string name="warn_no_dns">没有使用 DNS 服务器,无法解析域名,请考虑设置一个 DNS 服务器。请注意,即使你没有设置 DNS 服务器,你为移动网络以及 Wi-Fi 设置的代理服务器配置也是有效的。</string>
<string name="dns_add_error">无法添加 DNS 服务器 \"%1$s\",%2$s 拒绝了您的操作。</string>
+ <string name="ip_add_error">无法配置 IP 地址 %1$s,被系统拒绝:%2$s</string>
<string name="faq_howto">&lt;p&gt;获取你的 VPN 配置文件,可以是在电脑上正在使用的 OpenVPN 客户端配置文件,也可以向你的 VPN 服务商索取配置文件。&lt;/p&gt;&lt;p&gt;如果配置文件只有一个,可以把配置文件发到你自己的邮箱然后从手机上下载。如果配置文件有很多个,可以将它们复制到存储卡内。&lt;/p&gt;&lt;p&gt;从邮件中下载附件,或者在 VPN 列表中点击文件夹图标来导入配置文件。&lt;/p&gt;&lt;p&gt;如果提示找不到文件,那就将缺失的文件复制到存储卡内。&lt;/p&gt;&lt;p&gt;点击保存,将配置文件保存到你的 VPN 列表中。&lt;/p&gt;&lt;p&gt;在 VPN 列表中点击 VPN 的连接的名字,就可以连接到 VPN 了。&lt;/p&gt;&lt;p&gt;如果发生错误,可以看日志窗口中的日志,然后设法解决问题。&lt;/p&gt; </string>
<string name="faq_howto_title">快速入门</string>
<string name="setting_loadtun_summary">尝试在连接之前加载 tun.ko 内核模块。需要 root 权限。</string>
@@ -209,13 +215,11 @@
<string name="vpn_import_hint">使用 &lt;img src=\"ic_menu_archive\"/&gt; 图标导入存储卡中已有的配置文件(.ovpn 或 .conf)。</string>
<string name="faq_hint">请确保阅读常见问题解答。这是一个快速向导。</string>
<string name="faq_routing_title">路由/接口配置</string>
- <string name="faq_routing">路由表不是使用传统的 ifconfig 或 route 命令来设置的,而是通过 Android 的 VPN 服务的接口来进行设置的,所以路由的设置方法和在其他系统上的有些不同。设置中只需要包含通过隧道设备的 IP 地址以及网络,节点 IP 地址以及网关地址都不需要,指定通往 VPN 服务器的路由信息也不需要。OpenVPN for Android 会忽略配置文件中的这些设置。Android 的 VPN 服务接口保证了通往 VPN 服务器的流量不会被转发到隧道设备上。VPN 支持将通往特定网络的流量转发到隧道上,但不支持不要将通往指定网络的流量转发到隧道接口上(例:route x.x.x.x y.y.y.y net_gateway)。在日志窗口中的“显示连接信息”菜单内可以查看到当前由 Android 的 VPN 服务提供的网络配置信息。</string>
<string name="persisttun_summary">当 OpenVPN 重连时,也一直使用 VPN 连接。</string>
<string name="persistent_tun_title">保持 tun 通道</string>
<string name="openvpn_log">OpenVPN 日志</string>
<string name="import_config">导入 OpenVPN 配置文件</string>
<string name="battery_consumption_title">电池消耗</string>
- <string name="baterry_consumption">在我的测试中,发现最能消耗电量的是 OpenVPN 的 keepalive 包。大多数 OpenVPN 服务器都在配置文件中使用了“keepalive 10 60”这样的选项,这会导致 OpenVPN 服务器和客户端每隔 10 秒就相互向对方发送一个数据包。&lt;p&gt;虽然这些包很小,几乎不会消耗多少流量,但是频繁地发送这些包会导致手机的无线模块长时间处于活跃状态,并消耗大量的电能。(请参见(英文网页): &lt;a href=\"http://developer.android.com/training/efficient-downloads/efficient-network-access.html#RadioStateMachine\"&gt;)&lt;p&gt; keepalive 选项无法在客户端进行修改,只能在服务器上进行修改。&lt;p&gt;令人郁闷的是,如果发送 keepalive 的频率小于 60 秒,某些 NAT 网关可能会关闭 UDP 连接(我测试得到的结果是 60 秒)。使用 TCP 模式虽然可以将 keepalive 的频率设成很大,但是会造成 TCP over TCP 问题。(请参见(英文网页):&lt;a href=\"http://sites.inka.de/bigred/devel/tcp-tcp.html\"&gt;)(TCP over TCP 问题指的是由于 TCP 协议的机制,在 TCP 协议上再次封装一个 TCP 协议时,如果上层 TCP 链路的速度比下层 TCP 协议的链路速度快,就会造成大量 TCP 重传,从而导致网络拥塞,对用户来说就是网络变成龟速 ——译者注)</string>
<string name="faq_tethering">Android 网络分享和便携式热点功能(通过 WiFi, USB 或蓝牙)无法与本程序所使用的 VPN 服务接口一同工作。详情请见 &lt;a href=\"http://code.google.com/p/ics-openvpn/issues/detail?id=34\"&gt;issue #34&lt;/a&gt;</string>
<string name="vpn_tethering_title">VPN 和中继</string>
<string name="connection_retries">连接重试次数</string>
@@ -266,9 +270,42 @@
<string name="tls_remote_deprecated">tls-remote(不再使用)</string>
<string name="help_translate">你可以通过访问 http://crowdin.net/project/ics-openvpn/invite 来帮助翻译</string>
<string name="prompt">%1$s 正在试图控制 %2$s</string>
- <string name="remote_warning">如果继续,你将允许该应用完全控制 OpenVPN for Android,并拦截所有网络流量。<b>除非你信任该应用,否则请不要继续。</b>如果该应用是恶意应用,你需要自行承担所有的后果。</string>
<string name="remote_trust">我信任此应用。</string>
<string name="no_external_app_allowed">没有允许使用外部 API 的应用</string>
<string name="allowed_apps">已授权的应用:%s</string>
<string name="clearappsdialog">清除已授权的应用列表?\n当前已授权的应用:\n\n%s</string>
+ <string name="screenoff_summary">当屏幕关闭且 60 秒内传输数据量小于 64kB 时暂停 VPN。当启用“持久性 Tun”选项时,暂停 VPN 将使设备处于无网络连接的状态。未启用“持久性 Tun”时,设备将没有 VPN 连接保护。</string>
+ <string name="screenoff_title">屏幕关闭后暂停 VPN 连接</string>
+ <string name="screenoff_pause">屏幕关闭时暂停连接:若在%2$s秒内少于%1$s</string>
+ <string name="screen_nopersistenttun">警告:该 VPN 没有启用“持久化 tun 设备”,当屏幕关闭时,网络流量将不走 VPN 隧道,而是走 Wi-Fi 或者移动网络。</string>
+ <string name="save_password">保存密码</string>
+ <string name="pauseVPN">暂停 VPN</string>
+ <string name="resumevpn">继续 VPN</string>
+ <string name="state_userpause">按用户要求暂停 VPN</string>
+ <string name="state_screenoff">VPN 暂停 - 屏幕关闭</string>
+ <string name="device_specific">针对特定设备的处理</string>
+ <string name="cannotparsecert">无法显示证书信息</string>
+ <string name="appbehaviour">应用程序行为</string>
+ <string name="vpnbehaviour">VPN 行为</string>
+ <string name="allow_vpn_changes">允许更改 VPN 配置</string>
+ <string name="hwkeychain">硬件密钥库:</string>
+ <string name="thanks_for_donation">感谢捐赠 %s!</string>
+ <string name="logCleared">日志已清除。</string>
+ <string name="show_password">显示密码</string>
+ <string name="keyChainAccessError">钥匙串访问错误: %s</string>
+ <string name="timestamp_short">短</string>
+ <string name="timestamp_iso">ISO</string>
+ <string name="timestamps">时间戳</string>
+ <string name="timestamps_none">无</string>
+ <string name="uploaded_data">上传</string>
+ <string name="downloaded_data">下载</string>
+ <string name="vpn_status">VPN 状态</string>
+ <string name="logview_options">查看选项</string>
+ <string name="unhandled_exception">未处理的异常: %1$s\n\n%2$s</string>
+ <string name="unhandled_exception_context">%3$s: %1$s\n\n%2$s</string>
+ <string name="faq_system_dialog_xposed">如果您的 Android 设备已经 root,您可以自担风险安装&lt;a href=\"http://xposed.info/\"&gt;Xposed 框架&lt;/a&gt; 和 &lt;a href=\"http://repo.xposed.info/module/de.blinkt.vpndialogxposed\"&gt;VPN 对话框确认模块&lt;/a&gt;</string>
+ <string name="full_licenses">完整授权</string>
+ <string name="blocklocal_title">对本地地址绕过 VPN</string>
+ <string name="userpw_file">用户名/密码文件</string>
+ <string name="import_log">导入日志:</string>
</resources>
diff --git a/app/src/main/res/values/untranslatable.xml b/app/src/main/res/values/untranslatable.xml
index 40513029..50e598ac 100644
--- a/app/src/main/res/values/untranslatable.xml
+++ b/app/src/main/res/values/untranslatable.xml
@@ -644,4 +644,137 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
</resources> \ No newline at end of file
diff --git a/ics-openvpn-stripped/main/src/main/java/de/blinkt/openvpn/VpnProfile.java b/ics-openvpn-stripped/main/src/main/java/de/blinkt/openvpn/VpnProfile.java
index bdfa51c3..9eed03f1 100644
--- a/ics-openvpn-stripped/main/src/main/java/de/blinkt/openvpn/VpnProfile.java
+++ b/ics-openvpn-stripped/main/src/main/java/de/blinkt/openvpn/VpnProfile.java
@@ -2,8 +2,8 @@ package de.blinkt.openvpn;
import se.leap.bitmaskclient.R;
-import se.leap.bitmaskclient.Dashboard;
import se.leap.bitmaskclient.EIP;
+import se.leap.bitmaskclient.Dashboard;
import se.leap.bitmaskclient.Provider;
import android.content.Context;
@@ -18,18 +18,16 @@ import android.security.KeyChain;
import android.security.KeyChainException;
import android.util.Base64;
-import de.blinkt.openvpn.core.NativeUtils;
-import de.blinkt.openvpn.core.VpnStatus;
-import de.blinkt.openvpn.core.OpenVpnService;
-import de.blinkt.openvpn.core.X509Utils;
import org.spongycastle.util.io.pem.PemObject;
import org.spongycastle.util.io.pem.PemWriter;
-import javax.crypto.BadPaddingException;
-import javax.crypto.Cipher;
-import javax.crypto.IllegalBlockSizeException;
-import javax.crypto.NoSuchPaddingException;
-import java.io.*;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileReader;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.Serializable;
+import java.io.StringWriter;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.security.InvalidKeyException;
@@ -43,6 +41,16 @@ import java.util.Locale;
import java.util.UUID;
import java.util.Vector;
+import javax.crypto.BadPaddingException;
+import javax.crypto.Cipher;
+import javax.crypto.IllegalBlockSizeException;
+import javax.crypto.NoSuchPaddingException;
+
+import de.blinkt.openvpn.core.NativeUtils;
+import de.blinkt.openvpn.core.OpenVpnService;
+import de.blinkt.openvpn.core.VpnStatus;
+import de.blinkt.openvpn.core.X509Utils;
+
public class VpnProfile implements Serializable {
// Note that this class cannot be moved to core where it belongs since
// the profile loading depends on it being here
@@ -54,7 +62,9 @@ public class VpnProfile implements Serializable {
public static final String EXTRA_PROFILEUUID = "de.blinkt.openvpn.profileUUID";
public static final String INLINE_TAG = "[[INLINE]]";
public static final String DISPLAYNAME_TAG = "[[NAME]]";
- public static final String MINIVPN = "miniopenvpn";
+ private static final String MININONPIEVPN = "nopievpn";
+ private static final String MINIPIEVPN = "pievpn";
+
private static final long serialVersionUID = 7085688938959334563L;
private static final String OVPNCONFIGFILE = "android.conf";
public static final int MAXLOGLEVEL = 4;
@@ -144,6 +154,14 @@ public class VpnProfile implements Serializable {
mProfileVersion = CURRENT_PROFILE_VERSION;
}
+ public static String getMiniVPNExecutableName()
+ {
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN)
+ return VpnProfile.MINIPIEVPN;
+ else
+ return VpnProfile.MININONPIEVPN;
+ }
+
public static String openVpnEscape(String unescaped) {
if (unescaped == null)
return null;
@@ -258,22 +276,16 @@ public class VpnProfile implements Serializable {
cfg += " tcp-client\n";
- android.util.Log.d("vpnprofile", Integer.toString(mAuthenticationType));
switch (mAuthenticationType) {
case VpnProfile.TYPE_USERPASS_CERTIFICATES:
cfg += "auth-user-pass\n";
- case VpnProfile.TYPE_CERTIFICATES:
- // Ca
- // cfg += insertFileData("ca", mCaFilename);
-
- // // Client Cert + Key
- // cfg += insertFileData("key", mClientKeyFilename);
- // cfg += insertFileData("cert", mClientCertFilename);
+ case VpnProfile.TYPE_CERTIFICATES:
// FIXME This is all we need...The whole switch statement can go...
SharedPreferences preferences = context.getSharedPreferences(Dashboard.SHARED_PREFERENCES, context.MODE_PRIVATE);
cfg+="<ca>\n"+preferences.getString(Provider.CA_CERT, "")+"\n</ca>\n";
cfg+="<key>\n"+preferences.getString(EIP.PRIVATE_KEY, "")+"\n</key>\n";
cfg+="<cert>\n"+preferences.getString(EIP.CERTIFICATE, "")+"\n</cert>\n";
+
break;
case VpnProfile.TYPE_USERPASS_PKCS12:
cfg += "auth-user-pass\n";
@@ -549,7 +561,7 @@ public class VpnProfile implements Serializable {
// Add fixed paramenters
//args.add("/data/data/de.blinkt.openvpn/lib/openvpn");
- args.add(cacheDir.getAbsolutePath() + "/" + VpnProfile.MINIVPN);
+ args.add(cacheDir.getAbsolutePath() + "/" + getMiniVPNExecutableName());
args.add("--config");
args.add(cacheDir.getAbsolutePath() + "/" + OVPNCONFIGFILE);
@@ -558,14 +570,16 @@ public class VpnProfile implements Serializable {
return args.toArray(new String[args.size()]);
}
+
+
public Intent prepareIntent(Context context) {
String prefix = context.getPackageName();
Intent intent = new Intent(context, OpenVpnService.class);
if (mAuthenticationType == VpnProfile.TYPE_KEYSTORE || mAuthenticationType == VpnProfile.TYPE_USERPASS_KEYSTORE) {
- // if (getKeyStoreCertificates(context) == null)
- // return null;
+ if (getKeyStoreCertificates(context) == null)
+ return null;
}
intent.putExtra(prefix + ".ARGV", buildOpenvpnArgv(context.getCacheDir()));
@@ -734,8 +748,8 @@ public class VpnProfile implements Serializable {
//! Return an error if somethign is wrong
public int checkProfile(Context context) {
if (mAuthenticationType == TYPE_KEYSTORE || mAuthenticationType == TYPE_USERPASS_KEYSTORE) {
- // if (mAlias == null)
- // return R.string.no_keystore_cert_selected;
+ if (mAlias == null)
+ return R.string.no_keystore_cert_selected;
}
if (!mUsePull || mAuthenticationType == TYPE_STATICKEYS) {
diff --git a/ics-openvpn-stripped/main/src/main/java/de/blinkt/openvpn/core/ConfigParser.java b/ics-openvpn-stripped/main/src/main/java/de/blinkt/openvpn/core/ConfigParser.java
index 32e5cabb..4fbbe165 100644
--- a/ics-openvpn-stripped/main/src/main/java/de/blinkt/openvpn/core/ConfigParser.java
+++ b/ics-openvpn-stripped/main/src/main/java/de/blinkt/openvpn/core/ConfigParser.java
@@ -33,7 +33,7 @@ public class ConfigParser {
public void setDefinition(HashMap<String,Vector<Vector<String>>> args) {
options = args;
}
-
+
public void parseConfig(Reader reader) throws IOException, ConfigParseError {
diff --git a/ics-openvpn-stripped/main/src/main/java/de/blinkt/openvpn/core/OpenVPNThread.java b/ics-openvpn-stripped/main/src/main/java/de/blinkt/openvpn/core/OpenVPNThread.java
index 67c24884..0de54ed7 100644
--- a/ics-openvpn-stripped/main/src/main/java/de/blinkt/openvpn/core/OpenVPNThread.java
+++ b/ics-openvpn-stripped/main/src/main/java/de/blinkt/openvpn/core/OpenVPNThread.java
@@ -1,18 +1,28 @@
package de.blinkt.openvpn.core;
import android.util.Log;
-import se.leap.bitmaskclient.R;
-import de.blinkt.openvpn.VpnProfile;
-import de.blinkt.openvpn.core.VpnStatus.ConnectionStatus;
-import de.blinkt.openvpn.core.VpnStatus.LogItem;
-import java.io.*;
+import java.io.BufferedReader;
+import java.io.BufferedWriter;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
import java.text.SimpleDateFormat;
-import java.util.*;
+import java.util.Collections;
+import java.util.Date;
+import java.util.LinkedList;
+import java.util.Locale;
+import java.util.Map;
import java.util.Map.Entry;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
+import se.leap.bitmaskclient.R;
+import de.blinkt.openvpn.VpnProfile;
+import de.blinkt.openvpn.core.VpnStatus.ConnectionStatus;
+import de.blinkt.openvpn.core.VpnStatus.LogItem;
+
public class OpenVPNThread implements Runnable {
private static final String DUMP_PATH_STRING = "Dump path: ";
private static final String TAG = "OpenVPN";
@@ -158,16 +168,16 @@ public class OpenVPNThread implements Runnable {
private String genLibraryPath(String[] argv, ProcessBuilder pb) {
// Hack until I find a good way to get the real library path
- String applibpath = argv[0].replace("/cache/" + VpnProfile.MINIVPN , "/lib");
+ String applibpath = argv[0].replace("/cache/" + VpnProfile.getMiniVPNExecutableName() , "/lib");
String lbpath = pb.environment().get("LD_LIBRARY_PATH");
if(lbpath==null)
lbpath = applibpath;
else
- lbpath = lbpath + ":" + applibpath;
+ lbpath = applibpath + ":" + lbpath;
if (!applibpath.equals(mNativeDir)) {
- lbpath = lbpath + ":" + mNativeDir;
+ lbpath = mNativeDir + ":" + lbpath;
}
return lbpath;
}
diff --git a/ics-openvpn-stripped/main/src/main/java/de/blinkt/openvpn/core/OpenVpnService.java b/ics-openvpn-stripped/main/src/main/java/de/blinkt/openvpn/core/OpenVpnService.java
index d7bb827e..b5bba5d4 100644
--- a/ics-openvpn-stripped/main/src/main/java/de/blinkt/openvpn/core/OpenVpnService.java
+++ b/ics-openvpn-stripped/main/src/main/java/de/blinkt/openvpn/core/OpenVpnService.java
@@ -79,7 +79,6 @@ public class OpenVpnService extends VpnService implements StateListener, Callbac
else
return false;
}
-
// From: http://stackoverflow.com/questions/3758606/how-to-convert-byte-size-into-human-readable-format-in-java
public static String humanReadableByteCount(long bytes, boolean mbit) {
if (mbit)
@@ -244,7 +243,7 @@ public class OpenVpnService extends VpnService implements StateListener, Callbac
PendingIntent getLogPendingIntent() {
// Let the configure Button show the Log
- Intent intent = new Intent(getBaseContext(), LogWindow.class);
+ Intent intent = new Intent(getBaseContext(), se.leap.bitmaskclient.Dashboard.class);
intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
PendingIntent startLW = PendingIntent.getActivity(this, 0, intent, 0);
intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
@@ -748,12 +747,17 @@ public class OpenVpnService extends VpnService implements StateListener, Callbac
public String getTunReopenStatus() {
String currentConfiguration = getTunConfigString();
- if (currentConfiguration.equals(mLastTunCfg))
+ if (currentConfiguration.equals(mLastTunCfg)) {
return "NOACTION";
- else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT)
- return "OPEN_AFTER_CLOSE";
- else
- return "OPEN_BEFORE_CLOSE";
+ } else {
+ String release = Build.VERSION.RELEASE;
+ if (Build.VERSION.SDK_INT == Build.VERSION_CODES.KITKAT && !release.startsWith("4.4.3")
+ && !release.startsWith("4.4.4") && !release.startsWith("4.4.5"))
+ // There will be probably no 4.4.4 or 4.4.5 version, so don't waste effort to do parsing here
+ return "OPEN_AFTER_CLOSE";
+ else
+ return "OPEN_BEFORE_CLOSE";
+ }
}
public class LocalBinder extends Binder {
diff --git a/ics-openvpn-stripped/main/src/main/java/de/blinkt/openvpn/core/VPNLaunchHelper.java b/ics-openvpn-stripped/main/src/main/java/de/blinkt/openvpn/core/VPNLaunchHelper.java
index 55fcb0ba..57a94ee7 100644
--- a/ics-openvpn-stripped/main/src/main/java/de/blinkt/openvpn/core/VPNLaunchHelper.java
+++ b/ics-openvpn-stripped/main/src/main/java/de/blinkt/openvpn/core/VPNLaunchHelper.java
@@ -1,19 +1,20 @@
package de.blinkt.openvpn.core;
+import android.content.Context;
+import android.content.Intent;
+import android.os.Build;
+
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
-import android.content.Context;
-import android.content.Intent;
-import android.os.Build;
import se.leap.bitmaskclient.R;
import de.blinkt.openvpn.VpnProfile;
public class VPNLaunchHelper {
static private boolean writeMiniVPN(Context context) {
- File mvpnout = new File(context.getCacheDir(),VpnProfile.MINIVPN);
+ File mvpnout = new File(context.getCacheDir(),VpnProfile.getMiniVPNExecutableName());
if (mvpnout.exists() && mvpnout.canExecute())
return true;
@@ -23,12 +24,12 @@ public class VPNLaunchHelper {
InputStream mvpn;
try {
- mvpn = context.getAssets().open("minivpn." + Build.CPU_ABI);
+ mvpn = context.getAssets().open(VpnProfile.getMiniVPNExecutableName() + "." + Build.CPU_ABI);
}
catch (IOException errabi) {
VpnStatus.logInfo("Failed getting assets for archicture " + Build.CPU_ABI);
e2=errabi;
- mvpn = context.getAssets().open("minivpn." + Build.CPU_ABI2);
+ mvpn = context.getAssets().open(VpnProfile.getMiniVPNExecutableName() + "." + Build.CPU_ABI2);
}
@@ -45,7 +46,7 @@ public class VPNLaunchHelper {
fout.close();
if(!mvpnout.setExecutable(true)) {
- VpnStatus.logError("Failed to set minivpn executable");
+ VpnStatus.logError("Failed to make OpenVPN executable");
return false;
}
diff --git a/ics-openvpn-stripped/main/src/main/res/menu/logmenu.xml b/ics-openvpn-stripped/main/src/main/res/menu/logmenu.xml
index 04592a26..c498eefc 100644
--- a/ics-openvpn-stripped/main/src/main/res/menu/logmenu.xml
+++ b/ics-openvpn-stripped/main/src/main/res/menu/logmenu.xml
@@ -1,38 +1,38 @@
-<?xml version="1.0" encoding="utf-8"?>
-<menu xmlns:android="http://schemas.android.com/apk/res/android">
-
-
- <item
- android:id="@+id/toggle_time"
- android:alphabeticShortcut="t"
- android:icon="@android:drawable/ic_menu_view"
- android:showAsAction="withText|ifRoom"
- android:title="@string/logview_options" />
-
- <item
- android:id="@+id/clearlog"
- android:icon="@android:drawable/ic_menu_delete"
- android:showAsAction="ifRoom|withText"
- android:title="@string/clear_log"
- android:titleCondensed="@string/clear"/>
- <item
- android:id="@+id/send"
- android:icon="@android:drawable/ic_menu_share"
- android:showAsAction="ifRoom|withText"
- android:title="@string/send_logfile"
- android:titleCondensed="@string/send"/>
-
- <item
- android:id="@+id/cancel"
- android:icon="@android:drawable/ic_menu_close_clear_cancel"
- android:showAsAction="ifRoom|withText"
- android:title="@string/cancel_connection_long"
- android:titleCondensed="@string/cancel_connection"/>
- <item
- android:id="@+id/edit_vpn"
- android:alphabeticShortcut="e"
- android:icon="@android:drawable/ic_menu_edit"
- android:showAsAction="withText|ifRoom"
- android:title="@string/edit_vpn"/>
-
+<?xml version="1.0" encoding="utf-8"?>
+<menu xmlns:android="http://schemas.android.com/apk/res/android">
+
+
+ <item
+ android:id="@+id/toggle_time"
+ android:alphabeticShortcut="t"
+ android:icon="@android:drawable/ic_menu_view"
+ android:showAsAction="withText|ifRoom"
+ android:title="@string/logview_options" />
+
+ <item
+ android:id="@+id/clearlog"
+ android:icon="@android:drawable/ic_menu_delete"
+ android:showAsAction="ifRoom|withText"
+ android:title="@string/clear_log"
+ android:titleCondensed="@string/clear"/>
+ <item
+ android:id="@+id/send"
+ android:icon="@android:drawable/ic_menu_share"
+ android:showAsAction="ifRoom|withText"
+ android:title="@string/send_logfile"
+ android:titleCondensed="@string/send"/>
+
+ <item
+ android:id="@+id/cancel"
+ android:icon="@android:drawable/ic_menu_close_clear_cancel"
+ android:showAsAction="ifRoom|withText"
+ android:title="@string/cancel_connection_long"
+ android:titleCondensed="@string/cancel_connection"/>
+ <item
+ android:id="@+id/edit_vpn"
+ android:alphabeticShortcut="e"
+ android:icon="@android:drawable/ic_menu_edit"
+ android:showAsAction="withText|ifRoom"
+ android:title="@string/edit_vpn"/>
+
</menu> \ No newline at end of file
diff --git a/ics-openvpn-stripped/main/src/main/res/values-et/strings.xml b/ics-openvpn-stripped/main/src/main/res/values-et/strings.xml
index 61f8556c..45d1c8db 100755
--- a/ics-openvpn-stripped/main/src/main/res/values-et/strings.xml
+++ b/ics-openvpn-stripped/main/src/main/res/values-et/strings.xml
@@ -215,6 +215,7 @@
<string name="vpn_import_hint">Kasuta olemasoleva (.ovpn või .conf) profiili importimiseks sdcard pealt &lt;img src=\"ic_menu_archive\"/&gt; ikooni.</string>
<string name="faq_hint">Kindlasti vaata KKK\'d. See sisaldab ka alustamise lühijuhendit.</string>
<string name="faq_routing_title">Marsruutimine ja võrguliidese konfigureerimine</string>
+ <string name="faq_routing">Marsruutimine ja liidese konfigureerimine ei toimu traditsiooniliste ifconfig/route käskude abil, vaid kasutades VPNService API\'t. Selle tulemuseks on teistest operatsioonisüsteemidest erinev marsruutimiskonfiguratsioon. VPN tunneli konfiguratsioon koosneb IP aadressist ja selle liidese kaudu suunatavatest võrkudest. Täpsemalt, pole vaja ei VPN partneri ega lüüsi aadressi. Erilised marsruudid VPN serverini jõudmiseks (näiteks redirect-gateway poolt lisatud) pole samuti vajalikud. Selle tulemusena ignoreerib rakendus konfiguratsiooni importimisel neid seadeid. Rakendus tagab VPNService API abil selle, et ühendus VPN serveriga ei toimu läbi VPN tunneli. Toetatud on ainult VPN tunneli kaudu suunatud võrkude määratlemine. Rakendus üritab avastada võrgud mida ei tohiks suunata üle tunneli (näiteks route x.x.x.x y.y.y.y net_gateway) ja arvutab marsruudid mis välistavad eelmainitud marsruudid, jäljendades teiste platvormide toimimist. Logiaknas kuvatakse peale ühenduse loomist kehtivat VPNService konfiguratsiooni.</string>
<string name="persisttun_summary">Ära taasta otseühendust kui OpenVPN on taasühendumas.</string>
<string name="persistent_tun_title">Katkematu tun</string>
<string name="openvpn_log">OpenVPN Logi</string>
@@ -314,4 +315,8 @@
<string name="blocklocal_summary">Kohaliku liidese külge ühendatud võrkude ühendusi ei suunata üle VPN\'i. Selle valiku keelamisel suunatakse ka kohaliku võrgu andmeliiklus VPN\'i.</string>
<string name="blocklocal_title">Keela VPN kohalike võrkude jaoks</string>
<string name="userpw_file">Kasutajanimede/Paroolide fail</string>
+ <string name="imported_from_file">[Imporditud: %s]</string>
+ <string name="files_missing_hint">Mõningaid faile ei leitud. Palun valige importimiseks profiili failid:</string>
+ <string name="openvpn_is_no_free_vpn">Selle rakenduse kasutamiseks vajate OpenVPN toega VPN teenusepakkujat/VPN lüüsi (mida sageli pakub teie tööandja). Lisainfo saamiseks OpenVPN kohta ja oma isikliku OpenVPN serveri seadistamise kohta tutvuge veebilehega http://community.openvpn.net/ .</string>
+ <string name="import_log">Impordi logi:</string>
</resources>
diff --git a/ics-openvpn-stripped/main/src/main/res/values-fr/strings.xml b/ics-openvpn-stripped/main/src/main/res/values-fr/strings.xml
index 140ac977..8479d591 100755
--- a/ics-openvpn-stripped/main/src/main/res/values-fr/strings.xml
+++ b/ics-openvpn-stripped/main/src/main/res/values-fr/strings.xml
@@ -315,4 +315,8 @@ Sur certaines images, cette notification joue un son.\nAndroid à introduit ces
<string name="blocklocal_summary">Les réseaux directement connectés aux interfaces locales ne seront pas routés via le VPN. Décochez cette option pour rediriger tout le trafic local vers le VPN.</string>
<string name="blocklocal_title">Ne pas utilisé le VPN pour les réseaux locaux</string>
<string name="userpw_file">Fichier Nom d\'utilisateur/Mot de passe</string>
+ <string name="imported_from_file">[Importé de : %s]</string>
+ <string name="files_missing_hint">Certains fichiers sont introuvables. Sélectionner les fichiers pour importer le profil :</string>
+ <string name="openvpn_is_no_free_vpn">Pour utiliser cette application, vous avez besoin d\'un fournisseur/passerelle VPN qui soutient OpenVPN (souvent fourni par votre employeur). Vérifier ici http://community.openvpn.net/ pour plus d\'informations sur OpenVPN et comment configurer votre propre serveur OpenVPN.</string>
+ <string name="import_log">Journal d\'importation :</string>
</resources>
diff --git a/ics-openvpn-stripped/main/src/main/res/values-it/strings.xml b/ics-openvpn-stripped/main/src/main/res/values-it/strings.xml
index b35fa480..e21c10bd 100755
--- a/ics-openvpn-stripped/main/src/main/res/values-it/strings.xml
+++ b/ics-openvpn-stripped/main/src/main/res/values-it/strings.xml
@@ -84,6 +84,7 @@
<string name="default_route_summary">Reindirizza tutto il traffico sulla VPN</string>
<string name="use_default_title">Utilizza il Routing di default</string>
<string name="custom_route_message">Inserisci instradamenti personalizzati. Usare il formato CIDR. \"10.0.0.0/8 2002::/16\" reindirizza le reti 10.0.0.0/8 e 2002::/16 sulla VPN.</string>
+ <string name="custom_route_message_excluded">Itinerari che dovrebbero non essere instradati su VPN. Utilizzare la stessa sintassi per quanto riguarda le rotte incluse.</string>
<string name="custom_routes_title">Routing personalizzati</string>
<string name="log_verbosity_level">Livello di dettaglio del registro</string>
<string name="float_summary">Permette pacchetti autenticati da qualsiasi IP (consente che l\'IP del server possa cambiare)</string>
diff --git a/ics-openvpn-stripped/main/src/main/res/values-ru/strings.xml b/ics-openvpn-stripped/main/src/main/res/values-ru/strings.xml
index 9cc95a5a..6747bcab 100755
--- a/ics-openvpn-stripped/main/src/main/res/values-ru/strings.xml
+++ b/ics-openvpn-stripped/main/src/main/res/values-ru/strings.xml
@@ -6,7 +6,7 @@
<string name="address">Адрес сервера:</string>
<string name="port">Порт сервера:</string>
<string name="location">Расположение</string>
- <string name="cant_read_folder">Не могу прочитать директорию</string>
+ <string name="cant_read_folder">Не удается прочитать каталог</string>
<string name="select">Выбрать</string>
<string name="cancel">Отмена</string>
<string name="no_data">Нет данных</string>
@@ -26,7 +26,7 @@
<string name="file_select">Выбрать&#8230;</string>
<string name="file_nothing_selected">Вы должны выбрать файл</string>
<string name="useTLSAuth">Использовать аутентификацию TLS</string>
- <string name="tls_direction">TLS Direction</string>
+ <string name="tls_direction">Направление проверки TLS</string>
<string name="ipv6_dialog_tile">Введите адрес/маску подсети IPv6 в формате CIDR (например 2000:dd::23/64)</string>
<string name="ipv4_dialog_title">Введите адрес/маску подсети IPv4 в формате CIDR (например 1.2.3.4/24)</string>
<string name="ipv4_address">Адрес IPv4</string>
@@ -37,14 +37,14 @@
<string name="static_keys_info">Для конфигурации с статичными сертификатами будут использоваться ключи TLS</string>
<string name="configure_the_vpn">Настройка VPN-туннеля</string>
<string name="menu_add_profile">Добавить конфигурацию</string>
- <string name="add_profile_name_prompt">Введите имя новой конфигурации</string>
- <string name="duplicate_profile_name">Пожалуйста, введите уникальное имя профиля</string>
- <string name="profilename">Имя конфигурации</string>
+ <string name="add_profile_name_prompt">Введите название новой конфигурации</string>
+ <string name="duplicate_profile_name">Пожалуйста, введите уникальное название конфигурации</string>
+ <string name="profilename">Название конфигурации</string>
<string name="no_keystore_cert_selected">Необходимо выбрать сертификат пользователя</string>
<string name="no_error_found">Ошибок не найдено</string>
<string name="config_error_found">Ошибка в конфигурации</string>
- <string name="ipv4_format_error">Невозможно прочесть IPv4 адрес</string>
- <string name="custom_route_format_error">Невозможно примениить пользовательские маршруты</string>
+ <string name="ipv4_format_error">Невозможно распознать IPv4 адрес</string>
+ <string name="custom_route_format_error">Невозможно распознать пользовательские маршруты</string>
<string name="pw_query_hint">(оставьте пустым для запроса по требованию)</string>
<string name="vpn_shortcut">Ярлык OpenVPN</string>
<string name="vpn_launch_title">Подключиться к VPN</string>
@@ -61,7 +61,7 @@
<string name="cancel_connection_query">Отключение активных VPN/Отмена попыток подключения?</string>
<string name="remove_vpn">Удалить VPN</string>
<string name="check_remote_tlscert">Проверяет, использует ли сервер сертификаты TLS (--remote-cert-tls server)</string>
- <string name="check_remote_tlscert_title">Ожидать сертификата TLS от сервера</string>
+ <string name="check_remote_tlscert_title">Ожидать TLS сертификат от сервера</string>
<string name="remote_tlscn_check_summary">Проверка DN объекта удаленного сертификата</string>
<string name="remote_tlscn_check_title">Проверка имени хоста сертификата</string>
<string name="enter_tlscn_dialog">Переключатель способа проверки DN сертификата (e.g. C=DE, L=Paderborn, OU=Avian IP Carriers, CN=openvpn.blinkt.de)\n\nВозможные значения: полный DN, RDN (для примера openvpn.blinkt.de) или только преффикс RDN для проверки.\n\nПри использовании преффикса RDN, например \"Server\", значения будут \"Server-1\", \"Server-2\" и т.д.\n\nПри пустом текстовом поле проверка будет проводиться по имени хоста.\n\nДля подробностей смотрите руководство для OpenVPN 2.3.1+, раздел —verify-x509-name</string>
@@ -73,7 +73,7 @@
<string name="use_pull">Запрашивать параметры</string>
<string name="dns">DNS</string>
<string name="override_dns">Переопределить параметры DNS от сервера</string>
- <string name="dns_override_summary">Использовать ваши DNS</string>
+ <string name="dns_override_summary">Использовать свой DNS сервер</string>
<string name="searchdomain">Домен поиска</string>
<string name="dns1_summary">DNS-сервер для использования.</string>
<string name="dns_server">DNS-сервер</string>
@@ -84,20 +84,25 @@
<string name="default_route_summary">Перенаправляет весь трафик через VPN</string>
<string name="use_default_title">Использовать маршрут по-умолчанию</string>
<string name="custom_route_message">Введите пользовательские маршруты. Только введите адрес назначения в формате CIDR. \"10.0.0.0/8 2002::/16\" будет использовано для 10.0.0.0/8 и 2002::/16 сетей через VPN.</string>
+ <string name="custom_route_message_excluded">Маршруты которые не следует направлять через VPN. Используйте тот-же синтаксис как и в случае с другими маршрутами.</string>
<string name="custom_routes_title">Пользовательские маршруты</string>
+ <string name="custom_routes_title_excluded">Исключенные сети</string>
<string name="log_verbosity_level">Уровень детализации лога</string>
<string name="float_summary">Разрешить пакеты аутентификации с любого IP-адреса</string>
<string name="float_title">Разрешать \"плавающие\" сервера</string>
<string name="custom_options_title">Пользовательские параметры</string>
<string name="edit_vpn">Редактирование параметров VPN</string>
- <string name="remove_vpn_query">Удаление профиля VPN %s?</string>
- <string name="tun_error_helpful">На некторых костомных сборках права на /dev/tun могут быть неверными или tun-модуль может быть не включен. Для прошивки CM9 можете попробовать исправить владельца прямо из настроек программы</string>
- <string name="tun_open_error">Открытие интерфейса tun окончилось неудачей</string>
+ <string name="remove_vpn_query">Удалить VPN профиль %s?</string>
+ <string name="tun_error_helpful">На некоторых кастомных сборках права на /dev/tun могут быть неверными или tun-модуль может быть не включен. Для прошивки CM9 можете попробовать исправить владельца прямо из настроек программы</string>
+ <string name="tun_open_error">Не удается открыть tun интерфейс</string>
<string name="error">"Ошибка: "</string>
<string name="clear">Очистить</string>
<string name="last_openvpn_tun_config">Открытие tun-интерфейса:</string>
<string name="local_ip_info">Адрес IPv4: %1$s/%2$d IPv6: %3$s MTU: %4$d</string>
<string name="dns_server_info">DNS-сервер: %1$s, Домен: %2$s</string>
+ <string name="routes_info_incl">Маршруты: %1$s %2$s</string>
+ <string name="routes_info_excl">Исключенные маршруты: %1$s %2$s</string>
+ <string name="routes_debug">Подключенные маршруты сервиса VPN: %1$s %2$s</string>
<string name="ip_not_cidr">Получена информация интерфейса %1$s и %2$s, второй адрес является удалённым адресом канала. Используется сетевая маска /32 для локального IP адреса. Режим, установленный OpenVPN: \"%3$s\".</string>
<string name="route_not_cidr">Невозможно использовать выражения %1$s и %2$s как маршрут по стандарту CIDR. используется /32 как маска подсети.</string>
<string name="route_not_netip">Маршрут исправлен с %1$s/%2$s на %3$s/%2$s</string>
@@ -105,7 +110,7 @@
<string name="version_info">%1$s %2$s</string>
<string name="send_logfile">Отправить файл журнала</string>
<string name="send">Отправить</string>
- <string name="ics_openvpn_log_file">ICS OpenVPN файла лога</string>
+ <string name="ics_openvpn_log_file">ICS OpenVPN лог файл</string>
<string name="copied_entry">Скопировать лог в буфер обмена</string>
<string name="tap_mode">Режим TAP</string>
<string name="faq_tap_mode">Режим TAP невозможен на устройствах без root-а. Поэтому это приложение не поддерживает TAP</string>
@@ -120,7 +125,7 @@
<string name="encryption">Шифрование</string>
<string name="cipher_dialog_title">Укажите метод шифрования</string>
<string name="chipher_dialog_message">Укажите алгоритм шифрования, используемый OpenVPN. Оставьте пустым, чтобы использовать шифрование по-умолчанию.</string>
- <string name="auth_dialog_message">Введите the authentication digest для OpenVPN. Оставьте пустым для использования значения по-умолчанию.</string>
+ <string name="auth_dialog_message">Введите дайджест аутентификацию используемую в OpenVPN. Оставьте пустым для использования значения по-умолчанию.</string>
<string name="settings_auth">Авторизация/шифрование</string>
<string name="file_explorer_tab">Обзор файлов</string>
<string name="inline_file_tab">Встроенный файл</string>
@@ -136,7 +141,7 @@
<string name="import_could_not_open">Не удалось найти файл %1$s, указанный в файле конфигурации</string>
<string name="importing_config">Импорт файла конфигурации из исходного %1$s</string>
<string name="import_warning_custom_options">Ваша конфигурация имел несколько параметров, которые не входят в параметры стандартной конфигурации. Эти параметры были вынесены в пользовательскую конфигурацию. Пользовательская конфигурация отображается ниже:</string>
- <string name="import_done">Файла конфигурации успешно прочитан.</string>
+ <string name="import_done">Файл конфигурации успешно прочитан.</string>
<string name="nobind_summary">Не привязываться к локальному адресу и порту</string>
<string name="no_bind">Не использовать привязки</string>
<string name="import_configuration_file">Импорт файла конфигурации</string>
@@ -164,7 +169,7 @@
<string name="generated_config_summary">Показать сгенерированный файл конфигурации OpenVPN</string>
<string name="edit_profile_title">Правка \"%s\"</string>
<string name="building_configration">Создание конфигурации&#8230;</string>
- <string name="netchange_summary">Включение этого параметра заставит переподключиться, если состояние сети изменения (WIFI с мобильного)</string>
+ <string name="netchange_summary">Включение этого параметра заставит переподключаться, если состояние интернет соединения (WIFI) изменится</string>
<string name="netchange">Переподключение при изменении сети</string>
<string name="netstatus">Статус сети: %s</string>
<string name="extracahint">Сертификат CA обычно возвращается из хранилища Android Keystore. Укажите отдельный сертификат, если у вас возникли ошибки при проверке сертификата.</string>
@@ -273,23 +278,40 @@
<string name="clearappsdialog">Очистить список авторизованных внешних приложений?\nСписок разрешенных приложений:\n\n%s</string>
<string name="screenoff_summary">VPN-соединение приостанавливается, если экран выключен или объем данных меньше 64kb за 60сек. Если включена опция \"Удержание соединения\", VPN-соединение будет постоянно активным. Без этого параметра оно будет приостанавливаться при этих условиях..</string>
<string name="screenoff_title">Приостановить VPN-соединение при выключенном экране</string>
- <string name="screenoff_pause">Приостановка соединения при выключенном экране: меньше, чем %1$s за %2$sс</string>
+ <string name="screenoff_pause">Приостановка соединения при выключенном экране: меньше, чем %1$s in %2$ss</string>
<string name="screen_nopersistenttun">Внимание: постоянный tun не включен для этого VPN. Трафик будет проходить через обычный доступ в Интернет, когда экран выключен.</string>
<string name="save_password">Сохранить пароль</string>
<string name="pauseVPN">Приостановить VPN</string>
<string name="resumevpn">Продолжить VPN</string>
<string name="state_userpause">VPN приостановлен по запросу пользователя</string>
<string name="state_screenoff">VPN приостановлен - выкл. экран</string>
+ <string name="device_specific">Хак для данного устройства</string>
<string name="cannotparsecert">Не удается отобразить сведения о сертификате</string>
<string name="appbehaviour">Поведение приложения</string>
<string name="vpnbehaviour">Поведение VPN</string>
<string name="allow_vpn_changes">Разрешить изменение VPN-профилей</string>
<string name="hwkeychain">Аппаратное хранилище ключей:</string>
<string name="faq_vpndialog43_title">Окно подтверждения VPN для Android 4.3 и позже</string>
+ <string name="donatePlayStore">Также Вы можете выразить благодарность в виде пожертвования на Play Store:</string>
<string name="thanks_for_donation">Спасибо за пожертвование %s!</string>
<string name="logCleared">Журнал очищен.</string>
<string name="show_password">Показать пароль</string>
+ <string name="keyChainAccessError">ошибка при доступе к хранилищу ключей: %s</string>
+ <string name="timestamp_short">Кратко</string>
+ <string name="timestamp_iso">ISO</string>
+ <string name="timestamps">Время</string>
+ <string name="timestamps_none">Нет</string>
<string name="uploaded_data">Выгружено</string>
<string name="downloaded_data">Загружено</string>
<string name="vpn_status">Статус VPN</string>
+ <string name="logview_options">Посмотреть настройки</string>
+ <string name="unhandled_exception">Неопознання ошибка: %1$s\n\n%2$s</string>
+ <string name="unhandled_exception_context">%3$s: %1$s\n\n%2$s</string>
+ <string name="faq_system_dialog_xposed">Если на Вашем устройстве установлены Рут права, Вы можете установить &lt;a href=\"http://xposed.info/\"&gt;Xposed framework&lt;/a&gt; и &lt;a href=\"http://repo.xposed.info/module/de.blinkt.vpndialogxposed\"&gt;модуль автоматического подтверждения диалога подключения VPN&lt;/a&gt; на свой страх и риск</string>
+ <string name="blocklocal_summary">Сети напрямую доступные через локальный интерфейс не будут маршрутизированы через VPN. Отключите эту опцию чтобы направить трафик через VPN.</string>
+ <string name="blocklocal_title">Не использовать VPN для локальных адресов</string>
+ <string name="imported_from_file">[Импортировано из: %s]</string>
+ <string name="files_missing_hint">Некоторые файлы не найдены. Выберите файлы для импорта в профиль:</string>
+ <string name="openvpn_is_no_free_vpn">Для использования данного приложения Вам необходим VPN провайдер/шлюз поддерживающий OpenVPN. Для получения информации по настройке собственного OpenVPN сервера: http://community.openvpn.net/</string>
+ <string name="import_log">Лог импорта:</string>
</resources>
diff --git a/ics-openvpn-stripped/main/src/main/res/values-tr/strings.xml b/ics-openvpn-stripped/main/src/main/res/values-tr/strings.xml
index 85f1740f..aef446d1 100755
--- a/ics-openvpn-stripped/main/src/main/res/values-tr/strings.xml
+++ b/ics-openvpn-stripped/main/src/main/res/values-tr/strings.xml
@@ -13,7 +13,7 @@
<string name="useLZO">LZO sıkıştırma</string>
<string name="client_no_certificate">Sertifika yok</string>
<string name="client_certificate_title">İstemci sertifikası</string>
- <string name="client_key_title">İstemci sertifika anahtarı</string>
+ <string name="client_key_title">İstemci Sertifika Anahtarı</string>
<string name="client_pkcs12_title">PCKCS12 Dosyası</string>
<string name="ca_title">CA Sertifikası</string>
<string name="no_certificate">Bir sertifika seçmelisiniz</string>
@@ -307,4 +307,6 @@
<string name="unhandled_exception">Kural dışı durum: %1$s\n\n%2$s</string>
<string name="unhandled_exception_context">%3$s: %1$s\n\n%2$s</string>
<string name="full_licenses">Lisanslar</string>
+ <string name="blocklocal_title">Yerel ağlar için Bypass VPN</string>
+ <string name="userpw_file">Kullanıcı adı / Şifre dosyası</string>
</resources>
diff --git a/ics-openvpn-stripped/main/src/main/res/values-uk/strings.xml b/ics-openvpn-stripped/main/src/main/res/values-uk/strings.xml
index 3418ece1..b826005e 100755
--- a/ics-openvpn-stripped/main/src/main/res/values-uk/strings.xml
+++ b/ics-openvpn-stripped/main/src/main/res/values-uk/strings.xml
@@ -85,6 +85,7 @@
<string name="use_default_title">Використовувати типовий маршрут</string>
<string name="custom_route_message"> Введіть користувацькі маршрути. Тільки введіть адресу призначення в форматі CIDR. \"10.0.0.0/8 2002::/16\" буде використано для 10.0.0.0/8 і 2002::/16 мереж через VPN.</string>
<string name="custom_routes_title">Власні маршрути</string>
+ <string name="custom_routes_title_excluded">Виключені Мережі</string>
<string name="log_verbosity_level">Рівень деталізації журналу</string>
<string name="float_summary">Дозволити пакети аутентифікації з будь-якої IP-адреси</string>
<string name="float_title">Дозволити \"плаваючий\" сервер</string>
@@ -98,6 +99,9 @@
<string name="last_openvpn_tun_config">Відкриття tun інтерфейсу:</string>
<string name="local_ip_info">Адреса IPv4: %1$s/%2$d IPv6: %3$s MTU: %4$d</string>
<string name="dns_server_info">DNS-сервер: %1$s, Домен: %2$s</string>
+ <string name="routes_info_incl">Маршрути: %1$s %2$s</string>
+ <string name="routes_info_excl">Виключені маршрути : %1$s %2$s</string>
+ <string name="routes_debug">Встановлені маршрути VpnService: %1$s %2$s</string>
<string name="ip_not_cidr">Отримано інформацію інтерфейсу %1$s і %2$s, друга адреса є віддаленою адресою каналу. Використовується мережева маска /32 для локальної IP-адреси. Режим, встановлений OpenVPN: \"%3$s\".</string>
<string name="route_not_cidr">Неможливо використовувати вирази %1$s і %2$s як маршрут за стандартом CIDR. використовується /32 як маска підмережі.</string>
<string name="route_not_netip">Виправлено маршрут з %1$s/%2$s на %3$s/%2$s</string>
@@ -273,4 +277,18 @@
<string name="screenoff_pause">Призупинення зв\'язку в екрані вимкненого стану: менше %1$s у %2$sс.</string>
<string name="screen_nopersistenttun">Попередження: Постійний тут не увімкнений для цього VPN. Трафік буде використовувати звичайне інтернет-з\'єднання, коли екран вимкнений.</string>
<string name="save_password">Зберегти пароль</string>
+ <string name="pauseVPN">Призупинити VPN</string>
+ <string name="resumevpn">Відновити VPN</string>
+ <string name="cannotparsecert">Неможливо відобразити інформацію про сертифікат</string>
+ <string name="vpnbehaviour">Поведінка VPN</string>
+ <string name="allow_vpn_changes">Дозволити зміни в профілі VPN</string>
+ <string name="permission_icon_app">Іконка додатка намагається використовувати OpenVPN для Android</string>
+ <string name="thanks_for_donation">Дякуємо за пожертвування %s!</string>
+ <string name="logCleared">Журнал очищено.</string>
+ <string name="show_password">Показати пароль</string>
+ <string name="timestamp_iso">ISO</string>
+ <string name="timestamps">Часові позначки</string>
+ <string name="full_licenses">Повні ліцензії</string>
+ <string name="imported_from_file">[Імпортовано з: %s]</string>
+ <string name="import_log">Журнал імпорту :</string>
</resources>
diff --git a/ics-openvpn-stripped/main/src/main/res/values-zh-rCN/strings.xml b/ics-openvpn-stripped/main/src/main/res/values-zh-rCN/strings.xml
index a2fb95ce..1126d3b2 100755
--- a/ics-openvpn-stripped/main/src/main/res/values-zh-rCN/strings.xml
+++ b/ics-openvpn-stripped/main/src/main/res/values-zh-rCN/strings.xml
@@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<!--Generated by crowdin.net-->
+<!-- Generated by crowdin.net -->
<resources>
<string name="app">OpenVPN for Android</string>
<string name="address">服务器地址:</string>
@@ -59,8 +60,8 @@
<string name="title_cancel">取消确认</string>
<string name="cancel_connection_query">断开已连接的 VPN / 取消连接尝试?</string>
<string name="remove_vpn">删除 VPN</string>
- <string name="check_remote_tlscert">检查服务器是否使用 TLS 服务器证书</string>
- <string name="check_remote_tlscert_title">除了 TLS 服务器</string>
+ <string name="check_remote_tlscert">检查服务器是否使用了 TLS服务器端扩展 (--remote-cert-tlsserver server)</string>
+ <string name="check_remote_tlscert_title">需要 TLS 服务器证书</string>
<string name="remote_tlscn_check_summary">检查远程服务器证书的 DN 属性</string>
<string name="remote_tlscn_check_title">证书主机名检查</string>
<string name="enter_tlscn_dialog">勾选此项将验证远程证书的 DN 属性(例:C=DE, L=Paderborn, OU=Avian IP Carriers, CN=openvpn.blinkt.de)\n\n输入完整的 DN 或者 RDN 以便进行验证。\n\nRDN前缀 \"Server\" 可以匹配 \"Server-1\" 以及 \"SERVER-2\"\n\n若留空则将仅验证 RDN 而不验证主机名。\n\n有关更多信息请查看 OpenVPN 2.3.1+ 参考手册的 --verify-x509-name 小节</string>
@@ -84,6 +85,7 @@
<string name="use_default_title">使用默认路由</string>
<string name="custom_route_message">输入自定义路由。输入 CIDR 格式地址。</string>
<string name="custom_routes_title">自定义路由</string>
+ <string name="custom_routes_title_excluded">just</string>
<string name="log_verbosity_level">日志详细级别</string>
<string name="float_summary">允许来自任何 IP 的认证数据包</string>
<string name="float_title">允许浮服务器</string>
@@ -97,6 +99,8 @@
<string name="last_openvpn_tun_config">正在打开 tun 设备:</string>
<string name="local_ip_info">本地 IPv4: %1$s/%2$d IPv6: %3$s MTU: %4$d</string>
<string name="dns_server_info">DNS 服务器: %1$s, 域名: %2$s</string>
+ <string name="routes_info_excl">排除的路由: %1$s %2$s</string>
+ <string name="routes_debug">China</string>
<string name="ip_not_cidr">已获得接口信息 %1$s 以及 %2$s,将第二个地址作为远程地址。使用 /32 作为本地掩码。OpenVPN 给出的模式是 \"%3$s\"。</string>
<string name="route_not_cidr">无法将 %1$s 和 %2$s 作为 CIDR 形式的路由,将使用 /32 的子网掩码。</string>
<string name="route_not_netip">纠正路由 %1$s/%2$s 为 %3$s/%2$s</string>
@@ -114,11 +118,11 @@
<string name="copying_log_entries">复制日志条目</string>
<string name="faq_copying">若要复制单条日志请在相应条目上轻按即可。若要复制/发送全部日志请使用发送日志功能。如果该功能在界面中没有显示,请使用设备原生的菜单按钮。</string>
<string name="faq_shortcut">启动快捷方式</string>
- <string name="faq_howto_shortcut">您可以在主屏幕上放置一个 OpenVPN 的快捷方式。这取决于您的主屏幕管理程序,可能是快捷方式,也可能是一个小挂件。</string>
+ <string name="faq_howto_shortcut">你可以在桌面上放置一个启动 OpenVPN 的图标。如果你的桌面程序支持,你可以在桌面上放置 OpenVPN 的启动图标,或者是 OpenVPN 的桌面挂件</string>
<string name="no_vpn_support_image">很遗憾,您目前的系统不支持 VPN 服务接口</string>
<string name="encryption">加密</string>
<string name="cipher_dialog_title">输入加密方法</string>
- <string name="chipher_dialog_message">请输入 OpenVPN 使用的加密算法。留空为默认。</string>
+ <string name="chipher_dialog_message">输入 OpenVPN 所使用的加密密码算法。留空以使用默认算法。</string>
<string name="auth_dialog_message">输入 OpenVPN 使用的认证摘要。留空则使用默认的摘要。</string>
<string name="settings_auth">认证/加密</string>
<string name="file_explorer_tab">文件浏览器</string>
@@ -134,7 +138,7 @@
<string name="add_profile">添加配置文件</string>
<string name="import_could_not_open">无法找到导入配置文件参考的文件: %1$s</string>
<string name="importing_config">从 %1$s 中导入配置文件</string>
- <string name="import_warning_custom_options">您的配置中有几个选项无法解析。这些选项是您自定义添加的。如下所示:</string>
+ <string name="import_warning_custom_options">您的配置文件中有几个配置项无法在配置菜单中查看和修改,这些配置项将会当成自定义配置选项。下面是自定义的配置选项:</string>
<string name="import_done">读取配置文件完成</string>
<string name="nobind_summary">不关联到本地地址和端口</string>
<string name="no_bind">无本地绑定</string>
@@ -150,7 +154,8 @@
<string name="converted_profile">已导入配置文件</string>
<string name="converted_profile_i">已导入配置文件 %d</string>
<string name="broken_images">图像已损坏</string>
- <string name="broken_images_faq">&lt;p&gt;HTC 的官方固件存在问题,它无法将网络流量转发到隧道接口上(参见(英文网页): &lt;a href=\"http://code.google.com/p/ics-openvpn/issues/detail?id=18\"&gt;Issue 18&lt;/a&gt; )&lt;/p&gt;&lt;p&gt;SONY 的 Xperia arc S 机型和 Xperia Ray 机型的固件上没有包含完整的 Android VPN 服务,其他 Sony 手机的固件可能也存在此问题。(参见(英文网页): &lt;a href=\"http://code.google.com/p/ics-openvpn/issues/detail?id=29\"&gt;Issue 29&lt;/a&gt;)&lt;/p&gt;&lt;p&gt;在一些民间爱好者制作的固件上,可能缺少 /dev/tun 设备,或者 /dev/tun 的权限不正确。一些 CM9 固件需要设置 /dev/tun 的文件属主。.&lt;/p&gt;&lt;p&gt;重点是,如果你的固件存在问题,请向厂商或者固件制作者报告,如果报告问题的人足够多,就能引起厂商或者固件制作者的注意,他们就会去修复这些问题。&lt;/p&gt;</string>
+ <string name="broken_images_faq">&lt;p&gt;HTC官方固件可能存在异常的路由问题并会导致数据流不通过隧道传输(详见BUG追踪&lt;a href=\"http://code.google.com/p/ics-openvpn/issues/detail?id=18\"&gt;Issue 18&lt;/a&gt;)。&lt;/p&gt;&lt;p&gt;据报导,旧版的SONY Xperia Arc S和Xperia Ray的官方固件完全不包含VPNService(详见BUG追踪&lt;a href=\"http://code.google.com/p/ics-openvpn/issues/detail?id=29\"&gt;Issue 29&lt;/a&gt;)。&lt;/p&gt;&lt;p&gt;在自制固件中,tun
+模块可能会有缺失,或是未被设置正确的权限。部分CM9固件需要启用“特定设备HACKS”项下的“修复/dev/tun的权限”的选项。&lt;/p&gt;&lt;p&gt;最重要的是:若您的设备的固件存在问题,请直接向您的设备供应商反馈。越多人向供应商反映问题,问题越有可能得到解决。&lt;/p&gt;</string>
<string name="pkcs12_file_encryption_key">PKCS12 文件加密密钥</string>
<string name="private_key_password">私钥密码</string>
<string name="password">密码</string>
@@ -183,8 +188,9 @@
<string name="obscure">其他 OpenVPN 设置,一般不需要修改。</string>
<string name="advanced">高级设置</string>
<string name="export_config_title">ICS Openvpn 配置</string>
- <string name="warn_no_dns">没有正在使用的 DNS 服务器。域名解析可能无法工作。请考虑设置自定义 DNS 服务器</string>
+ <string name="warn_no_dns">没有使用 DNS 服务器,无法解析域名,请考虑设置一个 DNS 服务器。请注意,即使你没有设置 DNS 服务器,你为移动网络以及 Wi-Fi 设置的代理服务器配置也是有效的。</string>
<string name="dns_add_error">无法添加 DNS 服务器 \"%1$s\",%2$s 拒绝了您的操作。</string>
+ <string name="ip_add_error">无法配置 IP 地址 %1$s,被系统拒绝:%2$s</string>
<string name="faq_howto">&lt;p&gt;获取你的 VPN 配置文件,可以是在电脑上正在使用的 OpenVPN 客户端配置文件,也可以向你的 VPN 服务商索取配置文件。&lt;/p&gt;&lt;p&gt;如果配置文件只有一个,可以把配置文件发到你自己的邮箱然后从手机上下载。如果配置文件有很多个,可以将它们复制到存储卡内。&lt;/p&gt;&lt;p&gt;从邮件中下载附件,或者在 VPN 列表中点击文件夹图标来导入配置文件。&lt;/p&gt;&lt;p&gt;如果提示找不到文件,那就将缺失的文件复制到存储卡内。&lt;/p&gt;&lt;p&gt;点击保存,将配置文件保存到你的 VPN 列表中。&lt;/p&gt;&lt;p&gt;在 VPN 列表中点击 VPN 的连接的名字,就可以连接到 VPN 了。&lt;/p&gt;&lt;p&gt;如果发生错误,可以看日志窗口中的日志,然后设法解决问题。&lt;/p&gt; </string>
<string name="faq_howto_title">快速入门</string>
<string name="setting_loadtun_summary">尝试在连接之前加载 tun.ko 内核模块。需要 root 权限。</string>
@@ -209,13 +215,11 @@
<string name="vpn_import_hint">使用 &lt;img src=\"ic_menu_archive\"/&gt; 图标导入存储卡中已有的配置文件(.ovpn 或 .conf)。</string>
<string name="faq_hint">请确保阅读常见问题解答。这是一个快速向导。</string>
<string name="faq_routing_title">路由/接口配置</string>
- <string name="faq_routing">路由表不是使用传统的 ifconfig 或 route 命令来设置的,而是通过 Android 的 VPN 服务的接口来进行设置的,所以路由的设置方法和在其他系统上的有些不同。设置中只需要包含通过隧道设备的 IP 地址以及网络,节点 IP 地址以及网关地址都不需要,指定通往 VPN 服务器的路由信息也不需要。OpenVPN for Android 会忽略配置文件中的这些设置。Android 的 VPN 服务接口保证了通往 VPN 服务器的流量不会被转发到隧道设备上。VPN 支持将通往特定网络的流量转发到隧道上,但不支持不要将通往指定网络的流量转发到隧道接口上(例:route x.x.x.x y.y.y.y net_gateway)。在日志窗口中的“显示连接信息”菜单内可以查看到当前由 Android 的 VPN 服务提供的网络配置信息。</string>
<string name="persisttun_summary">当 OpenVPN 重连时,也一直使用 VPN 连接。</string>
<string name="persistent_tun_title">保持 tun 通道</string>
<string name="openvpn_log">OpenVPN 日志</string>
<string name="import_config">导入 OpenVPN 配置文件</string>
<string name="battery_consumption_title">电池消耗</string>
- <string name="baterry_consumption">在我的测试中,发现最能消耗电量的是 OpenVPN 的 keepalive 包。大多数 OpenVPN 服务器都在配置文件中使用了“keepalive 10 60”这样的选项,这会导致 OpenVPN 服务器和客户端每隔 10 秒就相互向对方发送一个数据包。&lt;p&gt;虽然这些包很小,几乎不会消耗多少流量,但是频繁地发送这些包会导致手机的无线模块长时间处于活跃状态,并消耗大量的电能。(请参见(英文网页): &lt;a href=\"http://developer.android.com/training/efficient-downloads/efficient-network-access.html#RadioStateMachine\"&gt;)&lt;p&gt; keepalive 选项无法在客户端进行修改,只能在服务器上进行修改。&lt;p&gt;令人郁闷的是,如果发送 keepalive 的频率小于 60 秒,某些 NAT 网关可能会关闭 UDP 连接(我测试得到的结果是 60 秒)。使用 TCP 模式虽然可以将 keepalive 的频率设成很大,但是会造成 TCP over TCP 问题。(请参见(英文网页):&lt;a href=\"http://sites.inka.de/bigred/devel/tcp-tcp.html\"&gt;)(TCP over TCP 问题指的是由于 TCP 协议的机制,在 TCP 协议上再次封装一个 TCP 协议时,如果上层 TCP 链路的速度比下层 TCP 协议的链路速度快,就会造成大量 TCP 重传,从而导致网络拥塞,对用户来说就是网络变成龟速 ——译者注)</string>
<string name="faq_tethering">Android 网络分享和便携式热点功能(通过 WiFi, USB 或蓝牙)无法与本程序所使用的 VPN 服务接口一同工作。详情请见 &lt;a href=\"http://code.google.com/p/ics-openvpn/issues/detail?id=34\"&gt;issue #34&lt;/a&gt;</string>
<string name="vpn_tethering_title">VPN 和中继</string>
<string name="connection_retries">连接重试次数</string>
@@ -266,9 +270,42 @@
<string name="tls_remote_deprecated">tls-remote(不再使用)</string>
<string name="help_translate">你可以通过访问 http://crowdin.net/project/ics-openvpn/invite 来帮助翻译</string>
<string name="prompt">%1$s 正在试图控制 %2$s</string>
- <string name="remote_warning">如果继续,你将允许该应用完全控制 OpenVPN for Android,并拦截所有网络流量。<b>除非你信任该应用,否则请不要继续。</b>如果该应用是恶意应用,你需要自行承担所有的后果。</string>
<string name="remote_trust">我信任此应用。</string>
<string name="no_external_app_allowed">没有允许使用外部 API 的应用</string>
<string name="allowed_apps">已授权的应用:%s</string>
<string name="clearappsdialog">清除已授权的应用列表?\n当前已授权的应用:\n\n%s</string>
+ <string name="screenoff_summary">当屏幕关闭且 60 秒内传输数据量小于 64kB 时暂停 VPN。当启用“持久性 Tun”选项时,暂停 VPN 将使设备处于无网络连接的状态。未启用“持久性 Tun”时,设备将没有 VPN 连接保护。</string>
+ <string name="screenoff_title">屏幕关闭后暂停 VPN 连接</string>
+ <string name="screenoff_pause">屏幕关闭时暂停连接:若在%2$s秒内少于%1$s</string>
+ <string name="screen_nopersistenttun">警告:该 VPN 没有启用“持久化 tun 设备”,当屏幕关闭时,网络流量将不走 VPN 隧道,而是走 Wi-Fi 或者移动网络。</string>
+ <string name="save_password">保存密码</string>
+ <string name="pauseVPN">暂停 VPN</string>
+ <string name="resumevpn">继续 VPN</string>
+ <string name="state_userpause">按用户要求暂停 VPN</string>
+ <string name="state_screenoff">VPN 暂停 - 屏幕关闭</string>
+ <string name="device_specific">针对特定设备的处理</string>
+ <string name="cannotparsecert">无法显示证书信息</string>
+ <string name="appbehaviour">应用程序行为</string>
+ <string name="vpnbehaviour">VPN 行为</string>
+ <string name="allow_vpn_changes">允许更改 VPN 配置</string>
+ <string name="hwkeychain">硬件密钥库:</string>
+ <string name="thanks_for_donation">感谢捐赠 %s!</string>
+ <string name="logCleared">日志已清除。</string>
+ <string name="show_password">显示密码</string>
+ <string name="keyChainAccessError">钥匙串访问错误: %s</string>
+ <string name="timestamp_short">短</string>
+ <string name="timestamp_iso">ISO</string>
+ <string name="timestamps">时间戳</string>
+ <string name="timestamps_none">无</string>
+ <string name="uploaded_data">上传</string>
+ <string name="downloaded_data">下载</string>
+ <string name="vpn_status">VPN 状态</string>
+ <string name="logview_options">查看选项</string>
+ <string name="unhandled_exception">未处理的异常: %1$s\n\n%2$s</string>
+ <string name="unhandled_exception_context">%3$s: %1$s\n\n%2$s</string>
+ <string name="faq_system_dialog_xposed">如果您的 Android 设备已经 root,您可以自担风险安装&lt;a href=\"http://xposed.info/\"&gt;Xposed 框架&lt;/a&gt; 和 &lt;a href=\"http://repo.xposed.info/module/de.blinkt.vpndialogxposed\"&gt;VPN 对话框确认模块&lt;/a&gt;</string>
+ <string name="full_licenses">完整授权</string>
+ <string name="blocklocal_title">对本地地址绕过 VPN</string>
+ <string name="userpw_file">用户名/密码文件</string>
+ <string name="import_log">导入日志:</string>
</resources>