summaryrefslogtreecommitdiff
path: root/app
diff options
context:
space:
mode:
Diffstat (limited to 'app')
-rw-r--r--app/build.gradle2
l---------app/snappy1
-rw-r--r--app/src/main/java/de/blinkt/openvpn/LaunchVPN.java11
-rw-r--r--app/src/main/java/de/blinkt/openvpn/VpnProfile.java148
-rw-r--r--app/src/main/java/de/blinkt/openvpn/activities/DisconnectVPN.java2
-rw-r--r--app/src/main/java/de/blinkt/openvpn/activities/LogWindow.java4
-rw-r--r--app/src/main/java/de/blinkt/openvpn/core/CIDRIP.java2
-rw-r--r--app/src/main/java/de/blinkt/openvpn/core/ConfigParser.java54
-rw-r--r--app/src/main/java/de/blinkt/openvpn/core/Connection.java7
-rw-r--r--app/src/main/java/de/blinkt/openvpn/core/DeviceStateReceiver.java83
-rw-r--r--app/src/main/java/de/blinkt/openvpn/core/ICSOpenVPNApplication.java4
-rw-r--r--app/src/main/java/de/blinkt/openvpn/core/LollipopDeviceStateListener.java2
-rw-r--r--app/src/main/java/de/blinkt/openvpn/core/NativeUtils.java25
-rw-r--r--app/src/main/java/de/blinkt/openvpn/core/NetworkSpace.java32
-rw-r--r--app/src/main/java/de/blinkt/openvpn/core/OpenVPNManagement.java10
-rw-r--r--app/src/main/java/de/blinkt/openvpn/core/OpenVPNService.java108
-rw-r--r--app/src/main/java/de/blinkt/openvpn/core/OpenVPNThread.java2
-rw-r--r--app/src/main/java/de/blinkt/openvpn/core/OpenVpnManagementThread.java251
-rw-r--r--app/src/main/java/de/blinkt/openvpn/core/PRNGFixes.java2
-rw-r--r--app/src/main/java/de/blinkt/openvpn/core/ProfileManager.java7
-rw-r--r--app/src/main/java/de/blinkt/openvpn/core/ProxyDetection.java2
-rw-r--r--app/src/main/java/de/blinkt/openvpn/core/VPNLaunchHelper.java29
-rw-r--r--app/src/main/java/de/blinkt/openvpn/core/VpnStatus.java161
-rw-r--r--app/src/main/java/de/blinkt/openvpn/core/X509Utils.java71
-rw-r--r--app/src/main/java/de/blinkt/openvpn/fragments/LogFragment.java505
-rw-r--r--app/src/main/java/de/blinkt/openvpn/views/SeekBarTicks.java7
-rw-r--r--app/src/main/res/drawable-hdpi/ic_close_white_24dp.pngbin324 -> 221 bytes
-rw-r--r--app/src/main/res/drawable-mdpi/ic_close_white_24dp.pngbin279 -> 175 bytes
-rw-r--r--app/src/main/res/drawable-xhdpi/ic_close_white_24dp.pngbin402 -> 257 bytes
-rw-r--r--app/src/main/res/drawable-xxhdpi/ic_close_white_24dp.pngbin492 -> 347 bytes
-rw-r--r--app/src/main/res/drawable-xxxhdpi/ic_close_white_24dp.pngbin662 -> 436 bytes
-rw-r--r--app/src/main/res/drawable/white_rect.xml2
-rw-r--r--app/src/main/res/layout-sw600dp-port/log_fragment.xml2
-rw-r--r--app/src/main/res/layout-sw600dp/log_fragment.xml2
-rw-r--r--app/src/main/res/layout/log_fragment.xml2
-rw-r--r--app/src/main/res/layout/log_silders.xml9
-rw-r--r--app/src/main/res/layout/log_window.xml2
-rw-r--r--app/src/main/res/layout/vpnstatus.xml2
-rw-r--r--app/src/main/res/menu/logmenu.xml13
-rwxr-xr-xapp/src/main/res/values-cs/strings-icsopenvpn.xml2
-rwxr-xr-xapp/src/main/res/values-de/strings-icsopenvpn.xml30
-rwxr-xr-xapp/src/main/res/values-es/strings-icsopenvpn.xml4
-rwxr-xr-xapp/src/main/res/values-et/strings-icsopenvpn.xml25
-rwxr-xr-xapp/src/main/res/values-fr/strings-icsopenvpn.xml5
-rwxr-xr-xapp/src/main/res/values-hu/strings-icsopenvpn.xml28
-rwxr-xr-xapp/src/main/res/values-in/strings-icsopenvpn.xml135
-rwxr-xr-xapp/src/main/res/values-it/strings-icsopenvpn.xml3
-rwxr-xr-xapp/src/main/res/values-ja/strings-icsopenvpn.xml116
-rwxr-xr-xapp/src/main/res/values-ko/strings-icsopenvpn.xml17
-rwxr-xr-xapp/src/main/res/values-nl/strings-icsopenvpn.xml10
-rwxr-xr-xapp/src/main/res/values-no/strings-icsopenvpn.xml1
-rwxr-xr-xapp/src/main/res/values-pl/strings-icsopenvpn.xml179
-rwxr-xr-xapp/src/main/res/values-ro/strings-icsopenvpn.xml2
-rwxr-xr-xapp/src/main/res/values-ru/strings-icsopenvpn.xml53
-rwxr-xr-xapp/src/main/res/values-sv/strings-icsopenvpn.xml4
-rw-r--r--app/src/main/res/values-sw600dp/dimens.xml2
-rw-r--r--app/src/main/res/values-sw600dp/styles.xml2
-rwxr-xr-xapp/src/main/res/values-tr/strings-icsopenvpn.xml27
-rwxr-xr-xapp/src/main/res/values-uk/strings-icsopenvpn.xml13
-rw-r--r--app/src/main/res/values-v21/colours.xml2
-rw-r--r--app/src/main/res/values-v21/refs.xml15
-rw-r--r--app/src/main/res/values-v21/styles.xml19
-rwxr-xr-xapp/src/main/res/values-vi/strings-icsopenvpn.xml25
-rwxr-xr-xapp/src/main/res/values-zh-rCN/strings-icsopenvpn.xml12
-rwxr-xr-xapp/src/main/res/values-zh-rTW/strings-icsopenvpn.xml239
-rw-r--r--app/src/main/res/values/colours.xml2
-rw-r--r--app/src/main/res/values/dimens.xml2
-rw-r--r--app/src/main/res/values/refs.xml14
-rwxr-xr-xapp/src/main/res/values/strings-icsopenvpn.xml35
-rw-r--r--app/src/main/res/values/styles.xml16
70 files changed, 1758 insertions, 847 deletions
diff --git a/app/build.gradle b/app/build.gradle
index c6718303..f65f99fd 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -55,6 +55,7 @@ dependencies {
compile 'com.google.code.gson:gson:2.3.1'
compile 'org.thoughtcrime.ssl.pinning:AndroidPinning:1.0.0'
compile 'mbanje.kurt:fabbutton:1.1.4'
+ compile 'com.android.support:support-annotations:23.1.1'
}
def processFileInplace(file, Closure processText) {
@@ -81,6 +82,7 @@ task copyIcsOpenVPNClasses( type: Copy ) {
include '**/dimens.xml'
include '**/logmenu.xml'
include '**/core/**.java'
+ include '**/activities/BaseActivity.java'
includeEmptyDirs = false
diff --git a/app/snappy b/app/snappy
deleted file mode 120000
index c44d7d0f..00000000
--- a/app/snappy
+++ /dev/null
@@ -1 +0,0 @@
-../ics-openvpn/main/snappy \ No newline at end of file
diff --git a/app/src/main/java/de/blinkt/openvpn/LaunchVPN.java b/app/src/main/java/de/blinkt/openvpn/LaunchVPN.java
index 90216a70..721e8991 100644
--- a/app/src/main/java/de/blinkt/openvpn/LaunchVPN.java
+++ b/app/src/main/java/de/blinkt/openvpn/LaunchVPN.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012-2014 Arne Schwabe
+ * Copyright (c) 2012-2016 Arne Schwabe
* Distributed under the GNU GPL v2 with additional terms. For full terms see the file doc/LICENSE.txt
*/
@@ -20,6 +20,7 @@ import android.preference.PreferenceManager;
import android.text.InputType;
import android.text.TextUtils;
import android.text.method.PasswordTransformationMethod;
+import android.util.Log;
import android.view.View;
import android.widget.CheckBox;
import android.widget.CompoundButton;
@@ -63,6 +64,8 @@ public class LaunchVPN extends Activity {
public static final String EXTRA_KEY = "de.blinkt.openvpn.shortcutProfileUUID";
public static final String EXTRA_NAME = "de.blinkt.openvpn.shortcutProfileName";
public static final String EXTRA_HIDELOG = "de.blinkt.openvpn.showNoLogWindow";
+ public static final String CLEARLOG = "clearlogconnect";
+
private static final int START_VPN_PROFILE= 70;
@@ -93,6 +96,10 @@ public class LaunchVPN extends Activity {
if(Intent.ACTION_MAIN.equals(action)) {
+ // Check if we need to clear the log
+ if (PreferenceManager.getDefaultSharedPreferences(this).getBoolean(CLEARLOG, true))
+ VpnStatus.clearLog();
+
// we got called to be the starting point, most likely a shortcut
String shortcutUUID = intent.getStringExtra( EXTRA_KEY);
String shortcutName = intent.getStringExtra( EXTRA_NAME);
@@ -115,7 +122,7 @@ public class LaunchVPN extends Activity {
}
}
-
+
@Override
protected void onActivityResult (int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
diff --git a/app/src/main/java/de/blinkt/openvpn/VpnProfile.java b/app/src/main/java/de/blinkt/openvpn/VpnProfile.java
index 43e1b57c..dbe4b440 100644
--- a/app/src/main/java/de/blinkt/openvpn/VpnProfile.java
+++ b/app/src/main/java/de/blinkt/openvpn/VpnProfile.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012-2014 Arne Schwabe
+ * Copyright (c) 2012-2016 Arne Schwabe
* Distributed under the GNU GPL v2 with additional terms. For full terms see the file doc/LICENSE.txt
*/
@@ -18,6 +18,7 @@ import android.os.Build;
import android.preference.PreferenceManager;
import android.security.KeyChain;
import android.security.KeyChainException;
+import android.support.annotation.NonNull;
import android.text.TextUtils;
import android.util.Base64;
@@ -71,7 +72,7 @@ public class VpnProfile implements Serializable, Cloneable {
private static final long serialVersionUID = 7085688938959334563L;
public static final int MAXLOGLEVEL = 4;
- public static final int CURRENT_PROFILE_VERSION = 5;
+ public static final int CURRENT_PROFILE_VERSION = 6;
public static final int DEFAULT_MSSFIX_SIZE = 1450;
public static String DEFAULT_DNS1 = "8.8.8.8";
public static String DEFAULT_DNS2 = "8.8.4.4";
@@ -152,7 +153,7 @@ public class VpnProfile implements Serializable, Cloneable {
public int mMssFix =0; // -1 is default,
public Connection[] mConnections = new Connection[0];
public boolean mRemoteRandom=false;
- public HashSet<String> mAllowedAppsVpn = new HashSet<String>();
+ public HashSet<String> mAllowedAppsVpn = new HashSet<>();
public boolean mAllowedAppsVpnAreDisallowed = true;
public String mProfileCreator;
@@ -160,8 +161,7 @@ public class VpnProfile implements Serializable, Cloneable {
public String mServerName = "openvpn.blinkt.de";
public String mServerPort = "1194";
public boolean mUseUdp = true;
-
-
+ public boolean mPushPeerInfo=false;
public VpnProfile(String name) {
mUuid = UUID.randomUUID();
@@ -197,6 +197,7 @@ public class VpnProfile implements Serializable, Cloneable {
mCheckRemoteCN = false;
mPersistTun = false;
mAllowLocalLAN = true;
+ mPushPeerInfo =false;
mMssFix = 0;
}
@@ -222,10 +223,16 @@ public class VpnProfile implements Serializable, Cloneable {
mAllowedAppsVpnAreDisallowed=true;
}
if (mAllowedAppsVpn==null)
- mAllowedAppsVpn = new HashSet<String>();
+ mAllowedAppsVpn = new HashSet<>();
if (mConnections ==null)
mConnections = new Connection[0];
+ if (mProfileVersion < 6) {
+ if (TextUtils.isEmpty(mProfileCreator))
+ mUserEditable=true;
+ }
+
+
mProfileVersion= CURRENT_PROFILE_VERSION;
}
@@ -260,8 +267,12 @@ public class VpnProfile implements Serializable, Cloneable {
cfg += "management-query-passwords\n";
cfg += "management-hold\n\n";
- if (!configForOvpn3)
+ if (!configForOvpn3) {
cfg += String.format("setenv IV_GUI_VER %s \n", openVpnEscape(getVersionEnvString(context)));
+ String versionString = String.format("%d %s %s %s %s %s", Build.VERSION.SDK_INT, Build.VERSION.RELEASE,
+ NativeUtils.getNativeAPI(), Build.BRAND, Build.BOARD, Build.MODEL);
+ cfg += String.format("setenv IV_PLAT_VER %s\n", openVpnEscape(versionString)) ;
+ }
cfg += "machine-readable-output\n";
@@ -432,9 +443,9 @@ public class VpnProfile implements Serializable, Cloneable {
}
if (mMssFix !=0){
- if (mMssFix!=1450)
- cfg+=String.format("mssfix %d\n", mMssFix, Locale.US);
- else
+ if (mMssFix!=1450) {
+ cfg += String.format("mssfix %d\n", mMssFix, Locale.US);
+ } else
cfg+="mssfix\n";
}
@@ -495,6 +506,9 @@ public class VpnProfile implements Serializable, Cloneable {
cfg += "preresolve\n";
}
+ if (mPushPeerInfo)
+ cfg+="push-peer-info\n";
+
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
boolean usesystemproxy = prefs.getBoolean("usesystemproxy", true);
if (usesystemproxy) {
@@ -541,7 +555,7 @@ public class VpnProfile implements Serializable, Cloneable {
}
//! Put inline data inline and other data as normal escaped filename
- private String insertFileData(String cfgentry, String filedata) {
+ public static String insertFileData(String cfgentry, String filedata) {
if (filedata == null) {
// TODO: generate good error
return String.format("%s %s\n", cfgentry, "missing");
@@ -553,8 +567,9 @@ public class VpnProfile implements Serializable, Cloneable {
}
}
+ @NonNull
private Collection<String> getCustomRoutes(String routes) {
- Vector<String> cidrRoutes = new Vector<String>();
+ Vector<String> cidrRoutes = new Vector<>();
if (routes == null) {
// No routes set, return empty vector
return cidrRoutes;
@@ -563,7 +578,7 @@ public class VpnProfile implements Serializable, Cloneable {
if (!route.equals("")) {
String cidrroute = cidrToIPAndNetmask(route);
if (cidrroute == null)
- return null;
+ return cidrRoutes;
cidrRoutes.add(cidrroute);
}
@@ -573,7 +588,7 @@ public class VpnProfile implements Serializable, Cloneable {
}
private Collection<String> getCustomRoutesv6(String routes) {
- Vector<String> cidrRoutes = new Vector<String>();
+ Vector<String> cidrRoutes = new Vector<>();
if (routes == null) {
// No routes set, return empty vector
return cidrRoutes;
@@ -606,8 +621,8 @@ public class VpnProfile implements Serializable, Cloneable {
return null;
- long nm = 0xffffffffl;
- nm = (nm << (32 - len)) & 0xffffffffl;
+ long nm = 0xffffffffL;
+ nm = (nm << (32 - len)) & 0xffffffffL;
String netmask = String.format(Locale.ENGLISH, "%d.%d.%d.%d", (nm & 0xff000000) >> 24, (nm & 0xff0000) >> 16, (nm & 0xff00) >> 8, nm & 0xff);
return parts[0] + " " + netmask;
@@ -708,7 +723,7 @@ public class VpnProfile implements Serializable, Cloneable {
public VpnProfile copy(String name) {
try {
- VpnProfile copy = (VpnProfile) clone();
+ VpnProfile copy = clone();
copy.mName = name;
return copy;
@@ -726,17 +741,14 @@ public class VpnProfile implements Serializable, Cloneable {
}
synchronized String[] getKeyStoreCertificates(Context context,int tries) {
- PrivateKey privateKey = null;
- X509Certificate[] caChain;
- Exception exp;
try {
- privateKey = KeyChain.getPrivateKey(context, mAlias);
+ PrivateKey privateKey = KeyChain.getPrivateKey(context, mAlias);
mPrivateKey = privateKey;
String keystoreChain = null;
- caChain = KeyChain.getCertificateChain(context, mAlias);
+ X509Certificate[] caChain = KeyChain.getCertificateChain(context, mAlias);
if(caChain == null)
throw new NoCertReturnedException("No certificate returned from Keystore");
@@ -758,11 +770,12 @@ public class VpnProfile implements Serializable, Cloneable {
String caout = null;
if (!TextUtils.isEmpty(mCaFilename)) {
try {
- Certificate cacert = X509Utils.getCertificateFromFile(mCaFilename);
+ Certificate[] cacerts = X509Utils.getCertificatesFromFile(mCaFilename);
StringWriter caoutWriter = new StringWriter();
PemWriter pw = new PemWriter(caoutWriter);
- pw.writeObject(new PemObject("CERTIFICATE", cacert.getEncoded()));
+ for (Certificate cert: cacerts)
+ pw.writeObject(new PemObject("CERTIFICATE", cert.getEncoded()));
pw.close();
caout= caoutWriter.toString();
@@ -796,20 +809,19 @@ public class VpnProfile implements Serializable, Cloneable {
}
return new String[]{ca, extra, user};
- } catch (InterruptedException e) {
- exp=e;
- } catch (FileNotFoundException e) {
- exp=e;
- } catch (CertificateException e) {
- exp=e;
- } catch (IOException e) {
- exp=e;
- } catch (KeyChainException e) {
- exp=e;
- } catch (NoCertReturnedException e) {
- exp =e;
- } catch (IllegalArgumentException e) {
- exp =e;
+ } catch (InterruptedException | IOException | KeyChainException | NoCertReturnedException | IllegalArgumentException
+ | CertificateException e) {
+ e.printStackTrace();
+ VpnStatus.logError(R.string.keyChainAccessError, e.getLocalizedMessage());
+
+ VpnStatus.logError(R.string.keychain_access);
+ if (Build.VERSION.SDK_INT == Build.VERSION_CODES.JELLY_BEAN) {
+ if (!mAlias.matches("^[a-zA-Z0-9]$")) {
+ VpnStatus.logError(R.string.jelly_keystore_alphanumeric_bug);
+ }
+ }
+ return null;
+
} catch (AssertionError e) {
if (tries ==0)
return null;
@@ -822,19 +834,9 @@ public class VpnProfile implements Serializable, Cloneable {
return getKeyStoreCertificates(context, tries-1);
}
- exp.printStackTrace();
- VpnStatus.logError(R.string.keyChainAccessError, exp.getLocalizedMessage());
-
- VpnStatus.logError(R.string.keychain_access);
- if (Build.VERSION.SDK_INT == Build.VERSION_CODES.JELLY_BEAN) {
- if (!mAlias.matches("^[a-zA-Z0-9]$")) {
- VpnStatus.logError(R.string.jelly_keystore_alphanumeric_bug);
- }
- }
- return null;
}
- //! Return an error if somethign is wrong
+ //! Return an error if something is wrong
public int checkProfile(Context context) {
if (mAuthenticationType == TYPE_KEYSTORE || mAuthenticationType == TYPE_USERPASS_KEYSTORE) {
if (mAlias == null)
@@ -845,8 +847,14 @@ public class VpnProfile implements Serializable, Cloneable {
if (mIPv4Address == null || cidrToIPAndNetmask(mIPv4Address) == null)
return R.string.ipv4_format_error;
}
- if (!mUseDefaultRoute && (getCustomRoutes(mCustomRoutes) == null || getCustomRoutes(mExcludedRoutes) ==null))
- return R.string.custom_route_format_error;
+ if (!mUseDefaultRoute) {
+ if (!TextUtils.isEmpty(mCustomRoutes) && getCustomRoutes(mCustomRoutes).size() == 0 )
+ return R.string.custom_route_format_error;
+
+ if (!TextUtils.isEmpty(mExcludedRoutes) && getCustomRoutes(mExcludedRoutes).size() == 0 )
+ return R.string.custom_route_format_error;
+
+ }
boolean noRemoteEnabled = true;
for (Connection c : mConnections)
@@ -980,7 +988,6 @@ public class VpnProfile implements Serializable, Cloneable {
public String getSignedData(String b64data) {
PrivateKey privkey = getKeystoreKey();
- Exception err;
byte[] data = Base64.decode(b64data, Base64.DEFAULT);
@@ -1004,26 +1011,14 @@ public class VpnProfile implements Serializable, Cloneable {
byte[] signed_bytes = rsaSigner.doFinal(data);
return Base64.encodeToString(signed_bytes, Base64.NO_WRAP);
- } catch (NoSuchAlgorithmException e) {
- err = e;
- } catch (InvalidKeyException e) {
- err = e;
- } catch (NoSuchPaddingException e) {
- err = e;
- } catch (IllegalBlockSizeException e) {
- err = e;
- } catch (BadPaddingException e) {
- err = e;
+ } catch (NoSuchAlgorithmException | InvalidKeyException | IllegalBlockSizeException
+ | BadPaddingException | NoSuchPaddingException e) {
+ VpnStatus.logError(R.string.error_rsa_sign, e.getClass().toString(), e.getLocalizedMessage());
+ return null;
}
-
- VpnStatus.logError(R.string.error_rsa_sign, err.getClass().toString(), err.getLocalizedMessage());
-
- return null;
-
}
private String processSignJellyBeans(PrivateKey privkey, byte[] data) {
- Exception err;
try {
Method getKey = privkey.getClass().getSuperclass().getDeclaredMethod("getOpenSSLKey");
getKey.setAccessible(true);
@@ -1044,21 +1039,10 @@ public class VpnProfile implements Serializable, Cloneable {
byte[] signed_bytes = NativeUtils.rsasign(data, pkey);
return Base64.encodeToString(signed_bytes, Base64.NO_WRAP);
- } catch (NoSuchMethodException e) {
- err = e;
- } catch (IllegalArgumentException e) {
- err = e;
- } catch (IllegalAccessException e) {
- err = e;
- } catch (InvocationTargetException e) {
- err = e;
- } catch (InvalidKeyException e) {
- err = e;
+ } catch (NoSuchMethodException | InvalidKeyException | InvocationTargetException | IllegalAccessException | IllegalArgumentException e) {
+ VpnStatus.logError(R.string.error_rsa_sign, e.getClass().toString(), e.getLocalizedMessage());
+ return null;
}
- VpnStatus.logError(R.string.error_rsa_sign, err.getClass().toString(), err.getLocalizedMessage());
-
- return null;
-
}
diff --git a/app/src/main/java/de/blinkt/openvpn/activities/DisconnectVPN.java b/app/src/main/java/de/blinkt/openvpn/activities/DisconnectVPN.java
index dfd815e4..f55de486 100644
--- a/app/src/main/java/de/blinkt/openvpn/activities/DisconnectVPN.java
+++ b/app/src/main/java/de/blinkt/openvpn/activities/DisconnectVPN.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012-2014 Arne Schwabe
+ * Copyright (c) 2012-2016 Arne Schwabe
* Distributed under the GNU GPL v2 with additional terms. For full terms see the file doc/LICENSE.txt
*/
diff --git a/app/src/main/java/de/blinkt/openvpn/activities/LogWindow.java b/app/src/main/java/de/blinkt/openvpn/activities/LogWindow.java
index 45f09c8e..130084f5 100644
--- a/app/src/main/java/de/blinkt/openvpn/activities/LogWindow.java
+++ b/app/src/main/java/de/blinkt/openvpn/activities/LogWindow.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012-2014 Arne Schwabe
+ * Copyright (c) 2012-2016 Arne Schwabe
* Distributed under the GNU GPL v2 with additional terms. For full terms see the file doc/LICENSE.txt
*/
@@ -15,7 +15,7 @@ import de.blinkt.openvpn.fragments.LogFragment;
/**
* Created by arne on 13.10.13.
*/
-public class LogWindow extends Activity {
+public class LogWindow extends BaseActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
diff --git a/app/src/main/java/de/blinkt/openvpn/core/CIDRIP.java b/app/src/main/java/de/blinkt/openvpn/core/CIDRIP.java
index 94ed8a0b..07f2152f 100644
--- a/app/src/main/java/de/blinkt/openvpn/core/CIDRIP.java
+++ b/app/src/main/java/de/blinkt/openvpn/core/CIDRIP.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012-2014 Arne Schwabe
+ * Copyright (c) 2012-2016 Arne Schwabe
* Distributed under the GNU GPL v2 with additional terms. For full terms see the file doc/LICENSE.txt
*/
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 232c454b..80a15c54 100644
--- a/app/src/main/java/de/blinkt/openvpn/core/ConfigParser.java
+++ b/app/src/main/java/de/blinkt/openvpn/core/ConfigParser.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012-2014 Arne Schwabe
+ * Copyright (c) 2012-2016 Arne Schwabe
* Distributed under the GNU GPL v2 with additional terms. For full terms see the file doc/LICENSE.txt
*/
@@ -37,6 +37,8 @@ public class ConfigParser {
public void parseConfig(Reader reader) throws IOException, ConfigParseError {
+ HashMap<String, String> optionAliases = new HashMap<>();
+ optionAliases.put("server-poll-timeout", "timeout-connect");
BufferedReader br = new BufferedReader(reader);
@@ -48,9 +50,15 @@ public class ConfigParser {
if (line == null)
break;
- if (lineno == 1 && (line.startsWith("PK\003\004")
- || (line.startsWith("PK\007\008"))))
- throw new ConfigParseError("Input looks like a ZIP Archive. Import is only possible for OpenVPN config files (.ovpn/.conf)");
+ if (lineno == 1) {
+ if ((line.startsWith("PK\003\004")
+ || (line.startsWith("PK\007\008")))) {
+ throw new ConfigParseError("Input looks like a ZIP Archive. Import is only possible for OpenVPN config files (.ovpn/.conf)");
+ }
+ if (line.startsWith("\uFEFF")) {
+ line = line.substring(1);
+ }
+ }
// Check for OpenVPN Access Server Meta information
if (line.startsWith("# OVPN_ACCESS_SERVER_")) {
@@ -70,6 +78,9 @@ public class ConfigParser {
checkinlinefile(args, br);
String optionname = args.get(0);
+ if (optionAliases.get(optionname)!=null)
+ optionname = optionAliases.get(optionname);
+
if (!options.containsKey(optionname)) {
options.put(optionname, new Vector<Vector<String>>());
}
@@ -137,7 +148,7 @@ public class ConfigParser {
}
- public class ConfigParseError extends Exception {
+ public static class ConfigParseError extends Exception {
private static final long serialVersionUID = -60L;
public ConfigParseError(String msg) {
@@ -388,6 +399,10 @@ public class ConfigParser {
np.mCustomRoutesv6 = customIPv6Routes;
}
+ Vector<String> routeNoPull = getOption("route-nopull", 1, 1);
+ if (routeNoPull!=null)
+ np.mRoutenopull=true;
+
// Also recognize tls-auth [inline] direction ...
Vector<Vector<String>> tlsauthoptions = getAllOption("tls-auth", 1, 2);
if (tlsauthoptions != null) {
@@ -567,6 +582,9 @@ public class ConfigParser {
if (getOption("persist-tun", 0, 0) != null)
np.mPersistTun = true;
+ if (getOption("push-peer-info", 0, 0) != null)
+ np.mPushPeerInfo = true;
+
Vector<String> connectretry = getOption("connect-retry", 1, 1);
if (connectretry != null)
np.mConnectRetry = connectretry.get(1);
@@ -709,8 +727,18 @@ public class ConfigParser {
conn.mUseUdp = isUdpProto(proto.get(1));
}
+ Vector<String> connectTimeout = getOption("connect-timeout", 1, 1);
+ if (connectTimeout != null) {
+ try {
+ conn.mConnectTimeout = Integer.parseInt(connectTimeout.get(1));
+ } catch (NumberFormatException nfe) {
+ throw new ConfigParseError(String.format("Argument to connect-timeout (%s) must to be an integer: %s",
+ connectTimeout.get(1), nfe.getLocalizedMessage()));
+
+ }
+ }
- // Parse remote config
+ // Parse remote config
Vector<Vector<String>> remotes = getAllOption("remote", 1, 3);
@@ -838,13 +866,21 @@ public class ConfigParser {
return false;
}
+ //! Generate options for custom options
private String getOptionStrings(Vector<Vector<String>> option) {
String custom = "";
for (Vector<String> optionsline : option) {
if (!ignoreThisOption(optionsline)) {
- for (String arg : optionsline)
- custom += VpnProfile.openVpnEscape(arg) + " ";
- custom += "\n";
+ // Check if option had been inlined and inline again
+ if (optionsline.size() == 2 && "extra-certs".equals(optionsline.get(0)) ) {
+ custom += VpnProfile.insertFileData(optionsline.get(0), optionsline.get(1));
+
+
+ } else {
+ for (String arg : optionsline)
+ custom += VpnProfile.openVpnEscape(arg) + " ";
+ custom += "\n";
+ }
}
}
return custom;
diff --git a/app/src/main/java/de/blinkt/openvpn/core/Connection.java b/app/src/main/java/de/blinkt/openvpn/core/Connection.java
index b10664ce..3455450b 100644
--- a/app/src/main/java/de/blinkt/openvpn/core/Connection.java
+++ b/app/src/main/java/de/blinkt/openvpn/core/Connection.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012-2014 Arne Schwabe
+ * Copyright (c) 2012-2016 Arne Schwabe
* Distributed under the GNU GPL v2 with additional terms. For full terms see the file doc/LICENSE.txt
*/
@@ -16,6 +16,7 @@ public class Connection implements Serializable, Cloneable {
public String mCustomConfiguration="";
public boolean mUseCustomConfig=false;
public boolean mEnabled=true;
+ public int mConnectTimeout = 0;
private static final long serialVersionUID = 92031902903829089L;
@@ -33,6 +34,10 @@ public class Connection implements Serializable, Cloneable {
else
cfg += " tcp-client\n";
+ if (mConnectTimeout!=0)
+ cfg += String.format(" connect-timeout %d\n" , mConnectTimeout);
+
+
if (!TextUtils.isEmpty(mCustomConfiguration) && mUseCustomConfig) {
cfg += mCustomConfiguration;
cfg += "\n";
diff --git a/app/src/main/java/de/blinkt/openvpn/core/DeviceStateReceiver.java b/app/src/main/java/de/blinkt/openvpn/core/DeviceStateReceiver.java
index 4ccf5472..40684af3 100644
--- a/app/src/main/java/de/blinkt/openvpn/core/DeviceStateReceiver.java
+++ b/app/src/main/java/de/blinkt/openvpn/core/DeviceStateReceiver.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012-2014 Arne Schwabe
+ * Copyright (c) 2012-2016 Arne Schwabe
* Distributed under the GNU GPL v2 with additional terms. For full terms see the file doc/LICENSE.txt
*/
@@ -12,15 +12,19 @@ import android.content.SharedPreferences;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.net.NetworkInfo.State;
+import android.os.Handler;
import android.preference.PreferenceManager;
+
import se.leap.bitmaskclient.R;
import de.blinkt.openvpn.core.VpnStatus.ByteCountListener;
import java.util.LinkedList;
+import java.util.Objects;
import static de.blinkt.openvpn.core.OpenVPNManagement.pauseReason;
-public class DeviceStateReceiver extends BroadcastReceiver implements ByteCountListener {
+public class DeviceStateReceiver extends BroadcastReceiver implements ByteCountListener, OpenVPNManagement.PausedStateCallback {
+ private final Handler mDisconnectHandler;
private int lastNetwork = -1;
private OpenVPNManagement mManagement;
@@ -29,12 +33,36 @@ public class DeviceStateReceiver extends BroadcastReceiver implements ByteCountL
// Data traffic limit in bytes
private final long TRAFFIC_LIMIT = 64 * 1024;
+ // Time to wait after network disconnect to pause the VPN
+ private final int DISCONNECT_WAIT = 20;
+
connectState network = connectState.DISCONNECTED;
connectState screen = connectState.SHOULDBECONNECTED;
connectState userpause = connectState.SHOULDBECONNECTED;
private String lastStateMsg = null;
+ private java.lang.Runnable mDelayDisconnectRunnable = new Runnable() {
+ @Override
+ public void run() {
+ if (!(network == connectState.PENDINGDISCONNECT))
+ return;
+
+ network = connectState.DISCONNECTED;
+
+ // Set screen state to be disconnected if disconnect pending
+ if (screen == connectState.PENDINGDISCONNECT)
+ screen = connectState.DISCONNECTED;
+
+ mManagement.pause(getPauseReason());
+ }
+ };
+ private NetworkInfo lastConnectedNetwork;
+
+ @Override
+ public boolean shouldBeRunning() {
+ return shouldBeConnected();
+ }
enum connectState {
SHOULDBECONNECTED,
@@ -54,6 +82,7 @@ public class DeviceStateReceiver extends BroadcastReceiver implements ByteCountL
LinkedList<Datapoint> trafficdata = new LinkedList<DeviceStateReceiver.Datapoint>();
+
@Override
public void updateByteCount(long in, long out, long diffIn, long diffOut) {
if (screen != connectState.PENDINGDISCONNECT)
@@ -99,6 +128,8 @@ public class DeviceStateReceiver extends BroadcastReceiver implements ByteCountL
public DeviceStateReceiver(OpenVPNManagement magnagement) {
super();
mManagement = magnagement;
+ mManagement.setPauseCallback(this);
+ mDisconnectHandler = new Handler();
}
@@ -113,7 +144,7 @@ public class DeviceStateReceiver extends BroadcastReceiver implements ByteCountL
boolean screenOffPause = prefs.getBoolean("screenoff", false);
if (screenOffPause) {
- if (ProfileManager.getLastConnectedVpn()!=null && !ProfileManager.getLastConnectedVpn().mPersistTun)
+ if (ProfileManager.getLastConnectedVpn() != null && !ProfileManager.getLastConnectedVpn().mPersistTun)
VpnStatus.logError(R.string.screen_nopersistenttun);
screen = connectState.PENDINGDISCONNECT;
@@ -126,6 +157,8 @@ public class DeviceStateReceiver extends BroadcastReceiver implements ByteCountL
boolean connected = shouldBeConnected();
screen = connectState.SHOULDBECONNECTED;
+ /* We should connect now, cancel any outstanding disconnect timer */
+ mDisconnectHandler.removeCallbacks(mDelayDisconnectRunnable);
/* should be connected has changed because the screen is on now, connect the VPN */
if (shouldBeConnected() != connected)
mManagement.resume();
@@ -140,6 +173,10 @@ public class DeviceStateReceiver extends BroadcastReceiver implements ByteCountL
private void fillTrafficData() {
trafficdata.add(new Datapoint(System.currentTimeMillis(), TRAFFIC_LIMIT));
}
+ public static boolean equalsObj(Object a, Object b) {
+ return (a == null) ? (b == null) : a.equals(b);
+ }
+
public void networkStateChange(Context context) {
@@ -175,34 +212,49 @@ public class DeviceStateReceiver extends BroadcastReceiver implements ByteCountL
if (networkInfo != null && networkInfo.getState() == State.CONNECTED) {
int newnet = networkInfo.getType();
+
+ boolean pendingDisconnect = (network == connectState.PENDINGDISCONNECT);
network = connectState.SHOULDBECONNECTED;
- if (lastNetwork != newnet) {
+ boolean sameNetwork;
+ if (lastConnectedNetwork == null
+ || lastConnectedNetwork.getType() != networkInfo.getType()
+ || !equalsObj(lastConnectedNetwork.getExtraInfo(), networkInfo.getExtraInfo())
+ )
+ sameNetwork = false;
+ else
+ sameNetwork = true;
+
+ /* Same network, connection still 'established' */
+ if (pendingDisconnect && sameNetwork) {
+ mDisconnectHandler.removeCallbacks(mDelayDisconnectRunnable);
+ // Reprotect the sockets just be sure
+ mManagement.networkChange(true);
+ } else {
+ /* Different network or connection not established anymore */
+
if (screen == connectState.PENDINGDISCONNECT)
screen = connectState.DISCONNECTED;
if (shouldBeConnected()) {
- if (lastNetwork == -1) {
- mManagement.resume();
- } else {
- mManagement.networkChange();
+ mDisconnectHandler.removeCallbacks(mDelayDisconnectRunnable);
- }
+ if (pendingDisconnect || !sameNetwork)
+ mManagement.networkChange(sameNetwork);
+ else
+ mManagement.resume();
}
lastNetwork = newnet;
+ lastConnectedNetwork = networkInfo;
}
} else if (networkInfo == null) {
// Not connected, stop openvpn, set last connected network to no network
lastNetwork = -1;
if (sendusr1) {
- network = connectState.DISCONNECTED;
-
- // Set screen state to be disconnected if disconnect pending
- if (screen == connectState.PENDINGDISCONNECT)
- screen = connectState.DISCONNECTED;
+ network = connectState.PENDINGDISCONNECT;
+ mDisconnectHandler.postDelayed(mDelayDisconnectRunnable, DISCONNECT_WAIT * 1000);
- mManagement.pause(getPauseReason());
}
}
@@ -213,6 +265,7 @@ public class DeviceStateReceiver extends BroadcastReceiver implements ByteCountL
}
+
public boolean isUserPaused() {
return userpause == connectState.DISCONNECTED;
}
diff --git a/app/src/main/java/de/blinkt/openvpn/core/ICSOpenVPNApplication.java b/app/src/main/java/de/blinkt/openvpn/core/ICSOpenVPNApplication.java
index 6e9e63c5..db3ae751 100644
--- a/app/src/main/java/de/blinkt/openvpn/core/ICSOpenVPNApplication.java
+++ b/app/src/main/java/de/blinkt/openvpn/core/ICSOpenVPNApplication.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012-2014 Arne Schwabe
+ * Copyright (c) 2012-2016 Arne Schwabe
* Distributed under the GNU GPL v2 with additional terms. For full terms see the file doc/LICENSE.txt
*/
@@ -37,5 +37,7 @@ public class ICSOpenVPNApplication extends Application {
if (BuildConfig.DEBUG) {
//ACRA.init(this);
}
+
+ VpnStatus.initLogCache(getApplicationContext().getCacheDir());
}
}
diff --git a/app/src/main/java/de/blinkt/openvpn/core/LollipopDeviceStateListener.java b/app/src/main/java/de/blinkt/openvpn/core/LollipopDeviceStateListener.java
index 440458e4..04e4e8b4 100644
--- a/app/src/main/java/de/blinkt/openvpn/core/LollipopDeviceStateListener.java
+++ b/app/src/main/java/de/blinkt/openvpn/core/LollipopDeviceStateListener.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012-2014 Arne Schwabe
+ * Copyright (c) 2012-2016 Arne Schwabe
* Distributed under the GNU GPL v2 with additional terms. For full terms see the file doc/LICENSE.txt
*/
diff --git a/app/src/main/java/de/blinkt/openvpn/core/NativeUtils.java b/app/src/main/java/de/blinkt/openvpn/core/NativeUtils.java
index f67b7730..ea003d41 100644
--- a/app/src/main/java/de/blinkt/openvpn/core/NativeUtils.java
+++ b/app/src/main/java/de/blinkt/openvpn/core/NativeUtils.java
@@ -1,19 +1,26 @@
/*
- * Copyright (c) 2012-2014 Arne Schwabe
+ * Copyright (c) 2012-2016 Arne Schwabe
* Distributed under the GNU GPL v2 with additional terms. For full terms see the file doc/LICENSE.txt
*/
package de.blinkt.openvpn.core;
+import android.os.Build;
+
import java.security.InvalidKeyException;
public class NativeUtils {
- public static native byte[] rsasign(byte[] input,int pkey) throws InvalidKeyException;
- public static native String[] getIfconfig() throws IllegalArgumentException;
- static native void jniclose(int fdint);
-
- static {
- System.loadLibrary("stlport_shared");
- System.loadLibrary("opvpnutil");
- }
+ public static native byte[] rsasign(byte[] input, int pkey) throws InvalidKeyException;
+
+ public static native String[] getIfconfig() throws IllegalArgumentException;
+
+ static native void jniclose(int fdint);
+
+ public static native String getNativeAPI();
+
+ static {
+ System.loadLibrary("opvpnutil");
+ if (Build.VERSION.SDK_INT == Build.VERSION_CODES.JELLY_BEAN)
+ System.loadLibrary("jbcrypto");
+ }
}
diff --git a/app/src/main/java/de/blinkt/openvpn/core/NetworkSpace.java b/app/src/main/java/de/blinkt/openvpn/core/NetworkSpace.java
index c86f9e44..eb6d4d42 100644
--- a/app/src/main/java/de/blinkt/openvpn/core/NetworkSpace.java
+++ b/app/src/main/java/de/blinkt/openvpn/core/NetworkSpace.java
@@ -1,28 +1,28 @@
/*
- * Copyright (c) 2012-2014 Arne Schwabe
+ * Copyright (c) 2012-2016 Arne Schwabe
* Distributed under the GNU GPL v2 with additional terms. For full terms see the file doc/LICENSE.txt
*/
package de.blinkt.openvpn.core;
import android.os.Build;
+import android.support.annotation.NonNull;
import android.text.TextUtils;
import junit.framework.Assert;
-import org.jetbrains.annotations.NotNull;
-
import java.math.BigInteger;
import java.net.Inet6Address;
-import java.util.*;
+import java.util.Collection;
+import java.util.Locale;
+import java.util.PriorityQueue;
+import java.util.TreeSet;
+import java.util.Vector;
import se.leap.bitmaskclient.BuildConfig;
public class NetworkSpace {
-
-
-
static class ipAddress implements Comparable<ipAddress> {
private BigInteger netAddress;
public int networkMask;
@@ -38,7 +38,7 @@ public class NetworkSpace {
* 2. smaller networks are returned as smaller
*/
@Override
- public int compareTo(@NotNull ipAddress another) {
+ public int compareTo(@NonNull ipAddress another) {
int comp = getFirstAddress().compareTo(another.getFirstAddress());
if (comp != 0)
return comp;
@@ -159,16 +159,20 @@ public class NetworkSpace {
String getIPv6Address() {
if (BuildConfig.DEBUG) Assert.assertTrue (!isV4);
BigInteger r = netAddress;
- if (r.compareTo(BigInteger.ZERO)==0 && networkMask==0)
- return "::";
Vector<String> parts = new Vector<String>();
- while (r.compareTo(BigInteger.ZERO) == 1) {
- parts.add(0, String.format(Locale.US, "%x", r.mod(BigInteger.valueOf(0x10000)).longValue()));
+ while (r.compareTo(BigInteger.ZERO) == 1 || parts.size() <3) {
+ long part = r.mod(BigInteger.valueOf(0x10000)).longValue();
+ if (part!=0)
+ parts.add(0, String.format(Locale.US, "%x", part));
+ else
+ parts.add(0, "");
r = r.shiftRight(16);
}
-
- return TextUtils.join(":", parts);
+ String ipv6str = TextUtils.join(":", parts);
+ while (ipv6str.contains(":::"))
+ ipv6str = ipv6str.replace(":::", "::");
+ return ipv6str;
}
public boolean containsNet(ipAddress network) {
diff --git a/app/src/main/java/de/blinkt/openvpn/core/OpenVPNManagement.java b/app/src/main/java/de/blinkt/openvpn/core/OpenVPNManagement.java
index 1f28c77d..2771fa6a 100644
--- a/app/src/main/java/de/blinkt/openvpn/core/OpenVPNManagement.java
+++ b/app/src/main/java/de/blinkt/openvpn/core/OpenVPNManagement.java
@@ -1,11 +1,15 @@
/*
- * Copyright (c) 2012-2014 Arne Schwabe
+ * Copyright (c) 2012-2016 Arne Schwabe
* Distributed under the GNU GPL v2 with additional terms. For full terms see the file doc/LICENSE.txt
*/
package de.blinkt.openvpn.core;
public interface OpenVPNManagement {
+ interface PausedStateCallback {
+ boolean shouldBeRunning();
+ }
+
enum pauseReason {
noNetwork,
userPause,
@@ -25,5 +29,7 @@ public interface OpenVPNManagement {
/*
* Rebind the interface
*/
- void networkChange();
+ void networkChange(boolean sameNetwork);
+
+ void setPauseCallback(PausedStateCallback callback);
}
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 f9cb9a86..17be29b0 100644
--- a/app/src/main/java/de/blinkt/openvpn/core/OpenVPNService.java
+++ b/app/src/main/java/de/blinkt/openvpn/core/OpenVPNService.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012-2014 Arne Schwabe
+ * Copyright (c) 2012-2016 Arne Schwabe
* Distributed under the GNU GPL v2 with additional terms. For full terms see the file doc/LICENSE.txt
*/
@@ -10,15 +10,18 @@ import android.annotation.TargetApi;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
+import android.app.UiModeManager;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
+import android.content.res.Configuration;
import android.net.ConnectivityManager;
import android.net.VpnService;
import android.os.Binder;
import android.os.Build;
+import android.os.Handler;
import android.os.Handler.Callback;
import android.os.IBinder;
import android.os.Message;
@@ -27,6 +30,7 @@ import android.preference.PreferenceManager;
import android.system.OsConstants;
import android.text.TextUtils;
import android.util.Log;
+import android.widget.Toast;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
@@ -81,6 +85,8 @@ public class OpenVPNService extends VpnService implements StateListener, Callbac
private String mLastTunCfg;
private String mRemoteGW;
private final Object mProcessLock = new Object();
+ private Handler guiHandler;
+ private Toast mlastToast;
// 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) {
@@ -109,6 +115,7 @@ public class OpenVPNService extends VpnService implements StateListener, Callbac
@Override
public void onRevoke() {
+ VpnStatus.logInfo(R.string.permission_revoked);
mManagement.stopVPN();
endVpnService();
}
@@ -135,7 +142,7 @@ public class OpenVPNService extends VpnService implements StateListener, Callbac
}
}
- private void showNotification(String msg, String tickerText, boolean lowpriority, long when, ConnectionStatus status) {
+ private void showNotification(final String msg, String tickerText, boolean lowpriority, long when, ConnectionStatus status) {
String ns = Context.NOTIFICATION_SERVICE;
NotificationManager mNotificationManager = (NotificationManager) getSystemService(ns);
@@ -164,6 +171,9 @@ public class OpenVPNService extends VpnService implements StateListener, Callbac
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN)
jbNotificationExtras(lowpriority, nbuilder);
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
+ lpNotificationExtras(nbuilder);
+
if (tickerText != null && !tickerText.equals(""))
nbuilder.setTicker(tickerText);
@@ -173,6 +183,33 @@ public class OpenVPNService extends VpnService implements StateListener, Callbac
mNotificationManager.notify(OPENVPN_STATUS, notification);
//startForeground(OPENVPN_STATUS, notification);
+
+ // Check if running on a TV
+ if(runningOnAndroidTV() && !lowpriority)
+ guiHandler.post(new Runnable() {
+
+ @Override
+ public void run() {
+
+ if (mlastToast!=null)
+ mlastToast.cancel();
+ String toastText = String.format(Locale.getDefault(), "%s - %s", mProfile.mName, msg);
+ mlastToast = Toast.makeText(getBaseContext(), toastText, Toast.LENGTH_SHORT);
+ mlastToast.show();
+ }
+ });
+ }
+
+ @TargetApi(Build.VERSION_CODES.LOLLIPOP)
+ private void lpNotificationExtras(Notification.Builder nbuilder) {
+ nbuilder.setCategory(Notification.CATEGORY_SERVICE);
+ nbuilder.setLocalOnly(true);
+
+ }
+
+ private boolean runningOnAndroidTV() {
+ UiModeManager uiModeManager = (UiModeManager) getSystemService(UI_MODE_SERVICE);
+ return uiModeManager.getCurrentModeType() == Configuration.UI_MODE_TYPE_TELEVISION;
}
private int getIconByConnectionStatus(ConnectionStatus level) {
@@ -215,20 +252,20 @@ public class OpenVPNService extends VpnService implements StateListener, Callbac
disconnectVPN.setAction(DISCONNECT_VPN);
PendingIntent disconnectPendingIntent = PendingIntent.getActivity(this, 0, disconnectVPN, 0);
- nbuilder.addAction(android.R.drawable.ic_menu_close_clear_cancel,
+ nbuilder.addAction(R.drawable.ic_menu_close_clear_cancel,
getString(R.string.cancel_connection), disconnectPendingIntent);
Intent pauseVPN = new Intent(this, OpenVPNService.class);
if (mDeviceStateReceiver == null || !mDeviceStateReceiver.isUserPaused()) {
pauseVPN.setAction(PAUSE_VPN);
PendingIntent pauseVPNPending = PendingIntent.getService(this, 0, pauseVPN, 0);
- nbuilder.addAction(android.R.drawable.ic_media_pause,
+ nbuilder.addAction(R.drawable.ic_menu_pause,
getString(R.string.pauseVPN), pauseVPNPending);
} else {
pauseVPN.setAction(RESUME_VPN);
PendingIntent resumeVPNPending = PendingIntent.getService(this, 0, pauseVPN, 0);
- nbuilder.addAction(android.R.drawable.ic_media_play,
+ nbuilder.addAction(R.drawable.ic_menu_play,
getString(R.string.resumevpn), resumeVPNPending);
}
@@ -297,6 +334,9 @@ public class OpenVPNService extends VpnService implements StateListener, Callbac
VpnStatus.addStateListener(this);
VpnStatus.addByteCountListener(this);
+ guiHandler = new Handler(getMainLooper());
+
+
if (intent != null && PAUSE_VPN.equals(intent.getAction())) {
if (mDeviceStateReceiver != null)
mDeviceStateReceiver.userPause(true);
@@ -454,6 +494,7 @@ public class OpenVPNService extends VpnService implements StateListener, Callbac
}
// Just in case unregister for state
VpnStatus.removeStateListener(this);
+ VpnStatus.flushLog();
}
@@ -536,6 +577,26 @@ public class OpenVPNService extends VpnService implements StateListener, Callbac
Collection<ipAddress> positiveIPv4Routes = mRoutes.getPositiveIPList();
Collection<ipAddress> positiveIPv6Routes = mRoutesv6.getPositiveIPList();
+ if ("samsung".equals(Build.BRAND) && Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && mDnslist.size() >= 1) {
+ // Check if the first DNS Server is in the VPN range
+ try {
+ ipAddress dnsServer = new ipAddress(new CIDRIP(mDnslist.get(0), 32), true);
+ boolean dnsIncluded=false;
+ for (ipAddress net : positiveIPv4Routes) {
+ if (net.containsNet(dnsServer)) {
+ dnsIncluded = true;
+ }
+ }
+ if (!dnsIncluded) {
+ String samsungwarning = String.format("Warning Samsung Android 5.0+ devices ignore DNS servers outside the VPN range. To enable DNS resolution a route to your DNS Server (%s) has been added.", mDnslist.get(0));
+ VpnStatus.logWarning(samsungwarning);
+ positiveIPv4Routes.add(dnsServer);
+ }
+ } catch (Exception e) {
+ VpnStatus.logError("Error parsing DNS Server IP: " + mDnslist.get(0));
+ }
+ }
+
ipAddress multicastRange = new ipAddress(new CIDRIP("224.0.0.0", 3), true);
for (NetworkSpace.ipAddress route : positiveIPv4Routes) {
@@ -558,24 +619,7 @@ public class OpenVPNService extends VpnService implements StateListener, Callbac
}
}
- if ("samsung".equals(Build.BRAND) && Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && mDnslist.size() >= 1) {
- // Check if the first DNS Server is in the VPN range
- try {
- ipAddress dnsServer = new ipAddress(new CIDRIP(mDnslist.get(0), 32), true);
- boolean dnsIncluded=false;
- for (ipAddress net : positiveIPv4Routes) {
- if (net.containsNet(dnsServer)) {
- dnsIncluded = true;
- }
- }
- if (!dnsIncluded) {
- String samsungwarning = String.format("Warning Samsung Android 5.0+ devices ignore DNS servers outside the VPN range. To enable DNS add a custom route to your DNS Server (%s) or change to a DNS inside your VPN range", mDnslist.get(0));
- VpnStatus.logWarning(samsungwarning);
- }
- } catch (Exception e) {
- VpnStatus.logError("Error parsing DNS Server IP: " + mDnslist.get(0));
- }
- }
+
if (mDomain != null)
@@ -672,12 +716,14 @@ public class OpenVPNService extends VpnService implements StateListener, Callbac
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
private void setAllowedVpnPackages(Builder builder) {
+ boolean atLeastOneAllowedApp=false;
for (String pkg : mProfile.mAllowedAppsVpn) {
try {
if (mProfile.mAllowedAppsVpnAreDisallowed) {
builder.addDisallowedApplication(pkg);
} else {
builder.addAllowedApplication(pkg);
+ atLeastOneAllowedApp = true;
}
} catch (PackageManager.NameNotFoundException e) {
mProfile.mAllowedAppsVpn.remove(pkg);
@@ -685,6 +731,15 @@ public class OpenVPNService extends VpnService implements StateListener, Callbac
}
}
+ if (!mProfile.mAllowedAppsVpnAreDisallowed && !atLeastOneAllowedApp) {
+ VpnStatus.logDebug(R.string.no_allowed_app, getPackageName());
+ try {
+ builder.addAllowedApplication(getPackageName());
+ } catch (PackageManager.NameNotFoundException e) {
+ VpnStatus.logError("This should not happen: " + e.getLocalizedMessage());
+ }
+ }
+
if (mProfile.mAllowedAppsVpnAreDisallowed) {
VpnStatus.logDebug(R.string.disallowed_vpn_apps_info, TextUtils.join(", ", mProfile.mAllowedAppsVpn));
} else {
@@ -839,7 +894,9 @@ public class OpenVPNService extends VpnService implements StateListener, Callbac
} else if (level == LEVEL_CONNECTED) {
mDisplayBytecount = true;
mConnecttime = System.currentTimeMillis();
- lowpriority = true;
+ if (!runningOnAndroidTV())
+ lowpriority = true;
+
String ns = Context.NOTIFICATION_SERVICE;
NotificationManager mNotificationManager = (NotificationManager) getSystemService(ns);
mNotificationManager.cancel(OPENVPN_STATUS);
@@ -852,7 +909,8 @@ public class OpenVPNService extends VpnService implements StateListener, Callbac
// CONNECTED
// Does not work :(
String msg = getString(resid);
- // showNotification(msg + " " + logmessage, msg, lowpriority, 0, level);
+ // showNotification(VpnStatus.getLastCleanLogMessage(this),
+ // msg, lowpriority, 0, level);
}
}
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 d856feb7..10bc9e87 100644
--- a/app/src/main/java/de/blinkt/openvpn/core/OpenVPNThread.java
+++ b/app/src/main/java/de/blinkt/openvpn/core/OpenVPNThread.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012-2014 Arne Schwabe
+ * Copyright (c) 2012-2016 Arne Schwabe
* Distributed under the GNU GPL v2 with additional terms. For full terms see the file doc/LICENSE.txt
*/
diff --git a/app/src/main/java/de/blinkt/openvpn/core/OpenVpnManagementThread.java b/app/src/main/java/de/blinkt/openvpn/core/OpenVpnManagementThread.java
index 1c3b3362..4c550f47 100644
--- a/app/src/main/java/de/blinkt/openvpn/core/OpenVpnManagementThread.java
+++ b/app/src/main/java/de/blinkt/openvpn/core/OpenVpnManagementThread.java
@@ -1,23 +1,20 @@
/*
- * Copyright (c) 2012-2014 Arne Schwabe
+ * Copyright (c) 2012-2016 Arne Schwabe
* Distributed under the GNU GPL v2 with additional terms. For full terms see the file doc/LICENSE.txt
*/
package de.blinkt.openvpn.core;
import android.content.Context;
-import android.content.SharedPreferences;
import android.net.LocalServerSocket;
import android.net.LocalSocket;
import android.net.LocalSocketAddress;
import android.os.ParcelFileDescriptor;
-import android.preference.PreferenceManager;
+import android.support.annotation.NonNull;
import android.util.Log;
import junit.framework.Assert;
-import org.jetbrains.annotations.NotNull;
-
import java.io.FileDescriptor;
import java.io.IOException;
import java.io.InputStream;
@@ -42,30 +39,23 @@ public class OpenVpnManagementThread implements Runnable, OpenVPNManagement {
private LocalSocket mSocket;
private VpnProfile mProfile;
private OpenVPNService mOpenVPNService;
- private LinkedList<FileDescriptor> mFDList = new LinkedList<FileDescriptor>();
+ private LinkedList<FileDescriptor> mFDList = new LinkedList<>();
private LocalServerSocket mServerSocket;
- private boolean mReleaseHold = true;
private boolean mWaitingForRelease = false;
private long mLastHoldRelease = 0;
- private static final Vector<OpenVpnManagementThread> active = new Vector<OpenVpnManagementThread>();
+ private static final Vector<OpenVpnManagementThread> active = new Vector<>();
private LocalSocket mServerSocketLocal;
private pauseReason lastPauseReason = pauseReason.noNetwork;
+ private PausedStateCallback mPauseCallback;
public OpenVpnManagementThread(VpnProfile profile, OpenVPNService openVpnService) {
mProfile = profile;
mOpenVPNService = openVpnService;
-
-
- SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(openVpnService);
- boolean managemeNetworkState = prefs.getBoolean("netchangereconnect", true);
- if (managemeNetworkState)
- mReleaseHold = false;
-
}
- public boolean openManagementInterface(@NotNull Context c) {
+ public boolean openManagementInterface(@NonNull Context c) {
// Could take a while to open connection
int tries = 8;
@@ -74,7 +64,7 @@ public class OpenVpnManagementThread implements Runnable, OpenVPNManagement {
mServerSocketLocal = new LocalSocket();
- while (tries > 0 && !mServerSocketLocal.isConnected()) {
+ while (tries > 0 && !mServerSocketLocal.isBound()) {
try {
mServerSocketLocal.bind(new LocalSocketAddress(socketName,
LocalSocketAddress.Namespace.FILESYSTEM));
@@ -82,7 +72,7 @@ public class OpenVpnManagementThread implements Runnable, OpenVPNManagement {
// wait 300 ms before retrying
try {
Thread.sleep(300);
- } catch (InterruptedException e1) {
+ } catch (InterruptedException ignored) {
}
}
@@ -167,7 +157,6 @@ public class OpenVpnManagementThread implements Runnable, OpenVPNManagement {
//! Hack O Rama 2000!
private void protectFileDescriptor(FileDescriptor fd) {
- Exception exp;
try {
Method getInt = FileDescriptor.class.getDeclaredMethod("getInt$");
int fdint = (Integer) getInt.invoke(fd);
@@ -183,20 +172,12 @@ public class OpenVpnManagementThread implements Runnable, OpenVPNManagement {
//pfd.close();
NativeUtils.jniclose(fdint);
return;
- } catch (NoSuchMethodException e) {
- exp = e;
- } catch (IllegalArgumentException e) {
- exp = e;
- } catch (IllegalAccessException e) {
- exp = e;
- } catch (InvocationTargetException e) {
- exp = e;
- } catch (NullPointerException e) {
- exp = e;
+ } catch (NoSuchMethodException | IllegalArgumentException | InvocationTargetException | IllegalAccessException | NullPointerException e) {
+ VpnStatus.logException("Failed to retrieve fd from socket (" + fd + ")", e);
}
Log.d("Openvpn", "Failed to retrieve fd from socket: " + fd);
- VpnStatus.logException("Failed to retrieve fd from socket (" + fd + ")", exp);
+
}
private String processInput(String pendingInput) {
@@ -225,31 +206,41 @@ public class OpenVpnManagementThread implements Runnable, OpenVPNManagement {
String argument = parts[1];
- if (cmd.equals("INFO")) {
+ switch (cmd) {
+ case "INFO":
/* Ignore greeting from management */
- return;
- } else if (cmd.equals("PASSWORD")) {
- processPWCommand(argument);
- } else if (cmd.equals("HOLD")) {
- handleHold();
- } else if (cmd.equals("NEED-OK")) {
- processNeedCommand(argument);
- } else if (cmd.equals("BYTECOUNT")) {
- processByteCount(argument);
- } else if (cmd.equals("STATE")) {
- processState(argument);
- } else if (cmd.equals("PROXY")) {
- processProxyCMD(argument);
- } else if (cmd.equals("LOG")) {
- processLogMessage(argument);
- } else if (cmd.equals("RSA_SIGN")) {
- processSignCommand(argument);
- } else {
- VpnStatus.logWarning("MGMT: Got unrecognized command" + command);
- Log.i(TAG, "Got unrecognized command" + command);
+ return;
+ case "PASSWORD":
+ processPWCommand(argument);
+ break;
+ case "HOLD":
+ handleHold();
+ break;
+ case "NEED-OK":
+ processNeedCommand(argument);
+ break;
+ case "BYTECOUNT":
+ processByteCount(argument);
+ break;
+ case "STATE":
+ processState(argument);
+ break;
+ case "PROXY":
+ processProxyCMD(argument);
+ break;
+ case "LOG":
+ processLogMessage(argument);
+ break;
+ case "RSA_SIGN":
+ processSignCommand(argument);
+ break;
+ default:
+ VpnStatus.logWarning("MGMT: Got unrecognized command" + command);
+ Log.i(TAG, "Got unrecognized command" + command);
+ break;
}
} else if (command.startsWith("SUCCESS:")) {
- /* Ignore this kind of message too */
+ /* Ignore this kind of message too */
return;
} else if (command.startsWith("PROTECTFD: ")) {
FileDescriptor fdtoprotect = mFDList.pollFirst();
@@ -278,16 +269,22 @@ public class OpenVpnManagementThread implements Runnable, OpenVPNManagement {
Log.d("OpenVPN", argument);
VpnStatus.LogLevel level;
- if (args[1].equals("I")) {
- level = VpnStatus.LogLevel.INFO;
- } else if (args[1].equals("W")) {
- level = VpnStatus.LogLevel.WARNING;
- } else if (args[1].equals("D")) {
- level = VpnStatus.LogLevel.VERBOSE;
- } else if (args[1].equals("F")) {
- level = VpnStatus.LogLevel.ERROR;
- } else {
- level = VpnStatus.LogLevel.INFO;
+ switch (args[1]) {
+ case "I":
+ level = VpnStatus.LogLevel.INFO;
+ break;
+ case "W":
+ level = VpnStatus.LogLevel.WARNING;
+ break;
+ case "D":
+ level = VpnStatus.LogLevel.VERBOSE;
+ break;
+ case "F":
+ level = VpnStatus.LogLevel.ERROR;
+ break;
+ default:
+ level = VpnStatus.LogLevel.INFO;
+ break;
}
int ovpnlevel = Integer.parseInt(args[2]) & 0x0F;
@@ -299,8 +296,15 @@ public class OpenVpnManagementThread implements Runnable, OpenVPNManagement {
VpnStatus.logMessageOpenVPN(level, ovpnlevel, msg);
}
+ boolean shouldBeRunning() {
+ if (mPauseCallback == null)
+ return false;
+ else
+ return mPauseCallback.shouldBeRunning();
+ }
+
private void handleHold() {
- if (mReleaseHold) {
+ if (shouldBeRunning()) {
releaseHoldCmd();
} else {
mWaitingForRelease = true;
@@ -327,11 +331,10 @@ public class OpenVpnManagementThread implements Runnable, OpenVPNManagement {
//managmentCommand("log on all\n");
}
+
public void releaseHold() {
- mReleaseHold = true;
if (mWaitingForRelease)
releaseHoldCmd();
-
}
private void processProxyCMD(String argument) {
@@ -391,15 +394,19 @@ public class OpenVpnManagementThread implements Runnable, OpenVPNManagement {
String status = "ok";
- if (needed.equals("PROTECTFD")) {
- FileDescriptor fdtoprotect = mFDList.pollFirst();
- protectFileDescriptor(fdtoprotect);
- } else if (needed.equals("DNSSERVER")) {
- mOpenVPNService.addDNS(extra);
- } else if (needed.equals("DNSDOMAIN")) {
- mOpenVPNService.setDomain(extra);
- } else if (needed.equals("ROUTE")) {
- String[] routeparts = extra.split(" ");
+ switch (needed) {
+ case "PROTECTFD":
+ FileDescriptor fdtoprotect = mFDList.pollFirst();
+ protectFileDescriptor(fdtoprotect);
+ break;
+ case "DNSSERVER":
+ mOpenVPNService.addDNS(extra);
+ break;
+ case "DNSDOMAIN":
+ mOpenVPNService.setDomain(extra);
+ break;
+ case "ROUTE": {
+ String[] routeparts = extra.split(" ");
/*
buf_printf (&out, "%s %s %s dev %s", network, netmask, gateway, rgi->iface);
@@ -407,38 +414,46 @@ public class OpenVpnManagementThread implements Runnable, OpenVPNManagement {
buf_printf (&out, "%s %s %s", network, netmask, gateway);
*/
- if (routeparts.length == 5) {
- if (BuildConfig.DEBUG) Assert.assertEquals("dev", routeparts[3]);
- mOpenVPNService.addRoute(routeparts[0], routeparts[1], routeparts[2], routeparts[4]);
- } else if (routeparts.length >= 3) {
- mOpenVPNService.addRoute(routeparts[0], routeparts[1], routeparts[2], null);
- } else {
- VpnStatus.logError("Unrecognized ROUTE cmd:" + Arrays.toString(routeparts) + " | " + argument);
+ if (routeparts.length == 5) {
+ if (BuildConfig.DEBUG) Assert.assertEquals("dev", routeparts[3]);
+ mOpenVPNService.addRoute(routeparts[0], routeparts[1], routeparts[2], routeparts[4]);
+ } else if (routeparts.length >= 3) {
+ mOpenVPNService.addRoute(routeparts[0], routeparts[1], routeparts[2], null);
+ } else {
+ VpnStatus.logError("Unrecognized ROUTE cmd:" + Arrays.toString(routeparts) + " | " + argument);
+ }
+
+ break;
}
+ case "ROUTE6": {
+ String[] routeparts = extra.split(" ");
+ mOpenVPNService.addRoutev6(routeparts[0], routeparts[1]);
+ break;
+ }
+ case "IFCONFIG":
+ String[] ifconfigparts = extra.split(" ");
+ int mtu = Integer.parseInt(ifconfigparts[2]);
+ mOpenVPNService.setLocalIP(ifconfigparts[0], ifconfigparts[1], mtu, ifconfigparts[3]);
+ break;
+ case "IFCONFIG6":
+ mOpenVPNService.setLocalIPv6(extra);
+
+ break;
+ case "PERSIST_TUN_ACTION":
+ // check if tun cfg stayed the same
+ status = mOpenVPNService.getTunReopenStatus();
+ break;
+ case "OPENTUN":
+ if (sendTunFD(needed, extra))
+ return;
+ else
+ status = "cancel";
+ // This not nice or anything but setFileDescriptors accepts only FilDescriptor class :(
- } else if (needed.equals("ROUTE6")) {
- String[] routeparts = extra.split(" ");
- mOpenVPNService.addRoutev6(routeparts[0], routeparts[1]);
- } else if (needed.equals("IFCONFIG")) {
- String[] ifconfigparts = extra.split(" ");
- int mtu = Integer.parseInt(ifconfigparts[2]);
- mOpenVPNService.setLocalIP(ifconfigparts[0], ifconfigparts[1], mtu, ifconfigparts[3]);
- } else if (needed.equals("IFCONFIG6")) {
- mOpenVPNService.setLocalIPv6(extra);
-
- } else if (needed.equals("PERSIST_TUN_ACTION")) {
- // check if tun cfg stayed the same
- status = mOpenVPNService.getTunReopenStatus();
- } else if (needed.equals("OPENTUN")) {
- if (sendTunFD(needed, extra))
+ break;
+ default:
+ Log.e(TAG, "Unkown needok command " + argument);
return;
- else
- status = "cancel";
- // This not nice or anything but setFileDescriptors accepts only FilDescriptor class :(
-
- } else {
- Log.e(TAG, "Unkown needok command " + argument);
- return;
}
String cmd = String.format("needok '%s' %s\n", needed, status);
@@ -446,7 +461,6 @@ public class OpenVpnManagementThread implements Runnable, OpenVPNManagement {
}
private boolean sendTunFD(String needed, String extra) {
- Exception exp;
if (!extra.equals("tun")) {
// We only support tun
VpnStatus.logError(String.format("Device type %s requested, but only tun is possible with the Android API, sorry!", extra));
@@ -480,18 +494,10 @@ public class OpenVpnManagementThread implements Runnable, OpenVPNManagement {
pfd.close();
return true;
- } catch (NoSuchMethodException e) {
- exp = e;
- } catch (IllegalArgumentException e) {
- exp = e;
- } catch (IllegalAccessException e) {
- exp = e;
- } catch (InvocationTargetException e) {
- exp = e;
- } catch (IOException e) {
- exp = e;
+ } catch (NoSuchMethodException | IllegalArgumentException | InvocationTargetException |
+ IOException | IllegalAccessException exp) {
+ VpnStatus.logException("Could not send fd over socket", exp);
}
- VpnStatus.logException("Could not send fd over socket", exp);
return false;
}
@@ -559,14 +565,21 @@ public class OpenVpnManagementThread implements Runnable, OpenVPNManagement {
}
@Override
- public void networkChange() {
- if (!mWaitingForRelease)
+ public void networkChange(boolean samenetwork) {
+ if (mWaitingForRelease)
+ releaseHold();
+ else if (samenetwork)
+ managmentCommand("network-change samenetwork\n");
+ else
managmentCommand("network-change\n");
}
- public void signalusr1() {
- mReleaseHold = false;
+ @Override
+ public void setPauseCallback(PausedStateCallback callback) {
+ mPauseCallback = callback;
+ }
+ public void signalusr1() {
if (!mWaitingForRelease)
managmentCommand("signal SIGUSR1\n");
else
diff --git a/app/src/main/java/de/blinkt/openvpn/core/PRNGFixes.java b/app/src/main/java/de/blinkt/openvpn/core/PRNGFixes.java
index a788426a..49a7eaa9 100644
--- a/app/src/main/java/de/blinkt/openvpn/core/PRNGFixes.java
+++ b/app/src/main/java/de/blinkt/openvpn/core/PRNGFixes.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012-2014 Arne Schwabe
+ * Copyright (c) 2012-2016 Arne Schwabe
* Distributed under the GNU GPL v2 with additional terms. For full terms see the file doc/LICENSE.txt
*/
diff --git a/app/src/main/java/de/blinkt/openvpn/core/ProfileManager.java b/app/src/main/java/de/blinkt/openvpn/core/ProfileManager.java
index 086cdb44..4f9c219b 100644
--- a/app/src/main/java/de/blinkt/openvpn/core/ProfileManager.java
+++ b/app/src/main/java/de/blinkt/openvpn/core/ProfileManager.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012-2014 Arne Schwabe
+ * Copyright (c) 2012-2016 Arne Schwabe
* Distributed under the GNU GPL v2 with additional terms. For full terms see the file doc/LICENSE.txt
*/
@@ -128,6 +128,11 @@ public class ProfileManager {
ProfileManager.tmpprofile = tmp;
}
+ public static boolean isTempProfile()
+ {
+ return mLastConnectedVpn == tmpprofile;
+ }
+
public void saveProfile(Context context, VpnProfile profile) {
ObjectOutputStream vpnfile;
diff --git a/app/src/main/java/de/blinkt/openvpn/core/ProxyDetection.java b/app/src/main/java/de/blinkt/openvpn/core/ProxyDetection.java
index 6e2abb13..34fb69f8 100644
--- a/app/src/main/java/de/blinkt/openvpn/core/ProxyDetection.java
+++ b/app/src/main/java/de/blinkt/openvpn/core/ProxyDetection.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012-2014 Arne Schwabe
+ * Copyright (c) 2012-2016 Arne Schwabe
* Distributed under the GNU GPL v2 with additional terms. For full terms see the file doc/LICENSE.txt
*/
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 47cb633c..f2cf8cec 100644
--- a/app/src/main/java/de/blinkt/openvpn/core/VPNLaunchHelper.java
+++ b/app/src/main/java/de/blinkt/openvpn/core/VPNLaunchHelper.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012-2014 Arne Schwabe
+ * Copyright (c) 2012-2016 Arne Schwabe
* Distributed under the GNU GPL v2 with additional terms. For full terms see the file doc/LICENSE.txt
*/
@@ -14,14 +14,15 @@ import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
+import java.util.Arrays;
import java.util.Vector;
import se.leap.bitmaskclient.R;
import de.blinkt.openvpn.VpnProfile;
public class VPNLaunchHelper {
- private static final String MININONPIEVPN = "nopievpn";
- private static final String MINIPIEVPN = "pievpn";
+ private static final String MININONPIEVPN = "nopie_openvpn";
+ private static final String MINIPIEVPN = "pie_openvpn";
private static final String OVPNCONFIGFILE = "android.conf";
@@ -29,15 +30,22 @@ public class VPNLaunchHelper {
static private String writeMiniVPN(Context context) {
String[] abis;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
- abis = getSupportedAbisLollipop();
+ abis = getSupportedABIsLollipop();
else
+ //noinspection deprecation
abis = new String[]{Build.CPU_ABI, Build.CPU_ABI2};
+ String nativeAPI = NativeUtils.getNativeAPI();
+ if (!nativeAPI.equals(abis[0])) {
+ VpnStatus.logWarning(R.string.abi_mismatch, Arrays.toString(abis), nativeAPI);
+ abis = new String[] {nativeAPI};
+ }
+
for (String abi: abis) {
- File mvpnout = new File(context.getCacheDir(), getMiniVPNExecutableName() + "." + abi);
- if ((mvpnout.exists() && mvpnout.canExecute()) || writeMiniVPNBinary(context, abi, mvpnout)) {
- return mvpnout.getPath();
+ File vpnExecutable = new File(context.getCacheDir(), getMiniVPNExecutableName() + "." + abi);
+ if ((vpnExecutable.exists() && vpnExecutable.canExecute()) || writeMiniVPNBinary(context, abi, vpnExecutable)) {
+ return vpnExecutable.getPath();
}
}
@@ -45,7 +53,7 @@ public class VPNLaunchHelper {
}
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
- private static String[] getSupportedAbisLollipop() {
+ private static String[] getSupportedABIsLollipop() {
return Build.SUPPORTED_ABIS;
}
@@ -118,12 +126,13 @@ public class VPNLaunchHelper {
public static void startOpenVpn(VpnProfile startprofile, Context context) {
- if(writeMiniVPN(context)==null) {
+ VpnStatus.logInfo(R.string.building_configration);
+ VpnStatus.updateStateString("VPN_GENERATE_CONFIG", "", R.string.building_configration, VpnStatus.ConnectionStatus.LEVEL_START);
+ if(writeMiniVPN(context)==null) {
VpnStatus.logError("Error writing minivpn binary");
return;
}
- VpnStatus.logInfo(R.string.building_configration);
Intent startVPN = startprofile.prepareStartService(context);
if(startVPN!=null)
diff --git a/app/src/main/java/de/blinkt/openvpn/core/VpnStatus.java b/app/src/main/java/de/blinkt/openvpn/core/VpnStatus.java
index 62a60643..3ac1595c 100644
--- a/app/src/main/java/de/blinkt/openvpn/core/VpnStatus.java
+++ b/app/src/main/java/de/blinkt/openvpn/core/VpnStatus.java
@@ -1,18 +1,19 @@
/*
- * Copyright (c) 2012-2014 Arne Schwabe
+ * Copyright (c) 2012-2016 Arne Schwabe
* Distributed under the GNU GPL v2 with additional terms. For full terms see the file doc/LICENSE.txt
*/
package de.blinkt.openvpn.core;
import android.annotation.SuppressLint;
-import android.app.Activity;
import android.content.Context;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.content.pm.Signature;
import android.os.Build;
+import android.os.HandlerThread;
+import android.os.Message;
import android.os.Parcel;
import android.os.Parcelable;
import android.text.TextUtils;
@@ -74,6 +75,58 @@ public class VpnStatus {
private static final int MAXLOGENTRIES = 1000;
+
+ public static String getLastCleanLogMessage(Context c) {
+ String message = mLaststatemsg;
+ switch (mLastLevel) {
+ case LEVEL_CONNECTED:
+ String[] parts = mLaststatemsg.split(",");
+ /*
+ (a) the integer unix date/time,
+ (b) the state name,
+ 0 (c) optional descriptive string (used mostly on RECONNECTING
+ and EXITING to show the reason for the disconnect),
+
+ 1 (d) optional TUN/TAP local IPv4 address
+ 2 (e) optional address of remote server,
+ 3 (f) optional port of remote server,
+ 4 (g) optional local address,
+ 5 (h) optional local port, and
+ 6 (i) optional TUN/TAP local IPv6 address.
+*/
+ // Return only the assigned IP addresses in the UI
+ if (parts.length >= 7)
+ message = String.format(Locale.US, "%s %s", parts[1], parts[6]);
+ break;
+ }
+
+ while (message.endsWith(","))
+ message = message.substring(0, message.length() - 1);
+
+ String status = mLaststate;
+ if (status.equals("NOPROCESS"))
+ return message;
+
+ String prefix = c.getString(mLastStateresid);
+ if (mLastStateresid == R.string.unknown_state)
+ message = status + message;
+ if (message.length() > 0)
+ prefix += ": ";
+
+ return prefix + message;
+
+ }
+
+ public static void initLogCache(File cacheDir) {
+ Message m = mLogFileHandler.obtainMessage(LogFileHandler.LOG_INIT, cacheDir);
+ mLogFileHandler.sendMessage(m);
+
+ }
+
+ public static void flushLog() {
+ mLogFileHandler.sendEmptyMessage(LogFileHandler.FLUSH_TO_DISK);
+ }
+
public enum ConnectionStatus {
LEVEL_CONNECTED,
LEVEL_VPNPAUSED,
@@ -81,6 +134,7 @@ public class VpnStatus {
LEVEL_CONNECTING_NO_SERVER_REPLY_YET,
LEVEL_NONETWORK,
LEVEL_NOTCONNECTED,
+ LEVEL_START,
LEVEL_AUTH_FAILED,
LEVEL_WAITING_FOR_USER_INPUT,
UNKNOWN_LEVEL
@@ -128,18 +182,24 @@ public class VpnStatus {
private static ConnectionStatus mLastLevel = ConnectionStatus.LEVEL_NOTCONNECTED;
+ private static final LogFileHandler mLogFileHandler;
+
static {
logbuffer = new LinkedList<>();
logListener = new Vector<>();
stateListener = new Vector<>();
byteCountListener = new Vector<>();
+
+ HandlerThread mHandlerThread = new HandlerThread("LogFileWriter", Thread.MIN_PRIORITY);
+ mHandlerThread.start();
+ mLogFileHandler = new LogFileHandler(mHandlerThread.getLooper());
+
logInformation();
+
}
public static class LogItem implements Parcelable {
-
-
private Object[] mArgs = null;
private String mMessage = null;
private int mRessourceId;
@@ -261,6 +321,7 @@ public class VpnStatus {
String version = "error getting version";
try {
+ @SuppressLint("PackageManagerGetSignatures")
Signature raw = c.getPackageManager().getPackageInfo(c.getPackageName(), PackageManager.GET_SIGNATURES).signatures[0];
CertificateFactory cf = CertificateFactory.getInstance("X.509");
X509Certificate cert = (X509Certificate) cf.generateCertificate(new ByteArrayInputStream(raw.toByteArray()));
@@ -287,11 +348,11 @@ public class VpnStatus {
NoSuchAlgorithmException ignored) {
}
- Object[] argsext = Arrays.copyOf(mArgs, mArgs.length + 2);
+ Object[] argsext = Arrays.copyOf(mArgs, mArgs.length);
argsext[argsext.length - 1] = apksign;
argsext[argsext.length - 2] = version;
- return c.getString(R.string.mobile_info_extended, argsext);
+ return c.getString(R.string.mobile_info, argsext);
}
@@ -310,12 +371,6 @@ public class VpnStatus {
}
}
- public void saveLogToDisk(Context c) {
-
- File logOut = new File(c.getCacheDir(), "log.xml");
-
- }
-
public interface LogListener {
void newLog(LogItem logItem);
}
@@ -336,10 +391,12 @@ public class VpnStatus {
public synchronized static void clearLog() {
logbuffer.clear();
logInformation();
+ mLogFileHandler.sendEmptyMessage(LogFileHandler.TRIM_LOG_FILE);
}
private static void logInformation() {
- logInfo(R.string.mobile_info, Build.MODEL, Build.BOARD, Build.BRAND, Build.VERSION.SDK_INT);
+ logInfo(R.string.mobile_info, Build.MODEL, Build.BOARD, Build.BRAND, Build.VERSION.SDK_INT,
+ NativeUtils.getNativeAPI(), Build.VERSION.RELEASE, Build.ID, Build.FINGERPRINT, "", "");
}
public synchronized static void addLogListener(LogListener ll) {
@@ -369,32 +426,34 @@ public class VpnStatus {
}
private static int getLocalizedState(String state) {
- if (state.equals("CONNECTING"))
- return R.string.state_connecting;
- else if (state.equals("WAIT"))
- return R.string.state_wait;
- else if (state.equals("AUTH"))
- return R.string.state_auth;
- else if (state.equals("GET_CONFIG"))
- return R.string.state_get_config;
- else if (state.equals("ASSIGN_IP"))
- return R.string.state_assign_ip;
- else if (state.equals("ADD_ROUTES"))
- return R.string.state_add_routes;
- else if (state.equals("CONNECTED"))
- return R.string.state_connected;
- else if (state.equals("DISCONNECTED"))
- return R.string.state_disconnected;
- else if (state.equals("RECONNECTING"))
- return R.string.state_reconnecting;
- else if (state.equals("EXITING"))
- return R.string.state_exiting;
- else if (state.equals("RESOLVE"))
- return R.string.state_resolve;
- else if (state.equals("TCP_CONNECT"))
- return R.string.state_tcp_connect;
- else
- return R.string.unknown_state;
+ switch (state) {
+ case "CONNECTING":
+ return R.string.state_connecting;
+ case "WAIT":
+ return R.string.state_wait;
+ case "AUTH":
+ return R.string.state_auth;
+ case "GET_CONFIG":
+ return R.string.state_get_config;
+ case "ASSIGN_IP":
+ return R.string.state_assign_ip;
+ case "ADD_ROUTES":
+ return R.string.state_add_routes;
+ case "CONNECTED":
+ return R.string.state_connected;
+ case "DISCONNECTED":
+ return R.string.state_disconnected;
+ case "RECONNECTING":
+ return R.string.state_reconnecting;
+ case "EXITING":
+ return R.string.state_exiting;
+ case "RESOLVE":
+ return R.string.state_resolve;
+ case "TCP_CONNECT":
+ return R.string.state_tcp_connect;
+ default:
+ return R.string.unknown_state;
+ }
}
@@ -496,17 +555,33 @@ public class VpnStatus {
newLogItem(new LogItem(LogLevel.DEBUG, resourceId, args));
}
+ private static void newLogItem(LogItem logItem) {
+ newLogItem(logItem, false);
+ }
+
+
+ synchronized static void newLogItem(LogItem logItem, boolean cachedLine) {
+ if (cachedLine) {
+ logbuffer.addFirst(logItem);
+ } else {
+ logbuffer.addLast(logItem);
+ Message m = mLogFileHandler.obtainMessage(LogFileHandler.LOG_MESSAGE, logItem);
+ mLogFileHandler.sendMessage(m);
+ }
+
+ if (logbuffer.size() > MAXLOGENTRIES + MAXLOGENTRIES / 2) {
+ while (logbuffer.size() > MAXLOGENTRIES)
+ logbuffer.removeFirst();
+ mLogFileHandler.sendMessage(mLogFileHandler.obtainMessage(LogFileHandler.TRIM_LOG_FILE));
+ }
- private synchronized static void newLogItem(LogItem logItem) {
- logbuffer.addLast(logItem);
- if (logbuffer.size() > MAXLOGENTRIES)
- logbuffer.removeFirst();
for (LogListener ll : logListener) {
ll.newLog(logItem);
}
}
+
public static void logError(String msg) {
newLogItem(new LogItem(LogLevel.ERROR, msg));
diff --git a/app/src/main/java/de/blinkt/openvpn/core/X509Utils.java b/app/src/main/java/de/blinkt/openvpn/core/X509Utils.java
index 0786967b..4048f0e0 100644
--- a/app/src/main/java/de/blinkt/openvpn/core/X509Utils.java
+++ b/app/src/main/java/de/blinkt/openvpn/core/X509Utils.java
@@ -1,11 +1,12 @@
/*
- * Copyright (c) 2012-2014 Arne Schwabe
+ * Copyright (c) 2012-2016 Arne Schwabe
* Distributed under the GNU GPL v2 with additional terms. For full terms see the file doc/LICENSE.txt
*/
package de.blinkt.openvpn.core;
import android.content.Context;
+import android.content.res.Resources;
import android.text.TextUtils;
import se.leap.bitmaskclient.R;
@@ -20,30 +21,39 @@ import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.security.cert.Certificate;
import java.security.cert.CertificateException;
+import java.security.cert.CertificateExpiredException;
import java.security.cert.CertificateFactory;
+import java.security.cert.CertificateNotYetValidException;
import java.security.cert.X509Certificate;
+import java.util.ArrayList;
+import java.util.Date;
import java.util.Hashtable;
+import java.util.Vector;
public class X509Utils {
- public static Certificate getCertificateFromFile(String certfilename) throws FileNotFoundException, CertificateException {
+ public static Certificate[] getCertificatesFromFile(String certfilename) throws FileNotFoundException, CertificateException {
CertificateFactory certFact = CertificateFactory.getInstance("X.509");
- InputStream inStream;
-
+ Vector<Certificate> certificates = new Vector<>();
if(VpnProfile.isEmbedded(certfilename)) {
- // The java certifcate reader is ... kind of stupid
- // It does NOT ignore chars before the --BEGIN ...
int subIndex = certfilename.indexOf("-----BEGIN CERTIFICATE-----");
- subIndex = Math.max(0,subIndex);
- inStream = new ByteArrayInputStream(certfilename.substring(subIndex).getBytes());
+ do {
+ // The java certifcate reader is ... kind of stupid
+ // It does NOT ignore chars before the --BEGIN ...
+ subIndex = Math.max(0, subIndex);
+ InputStream inStream = new ByteArrayInputStream(certfilename.substring(subIndex).getBytes());
+ certificates.add(certFact.generateCertificate(inStream));
+ subIndex = certfilename.indexOf("-----BEGIN CERTIFICATE-----", subIndex+1);
+ } while (subIndex > 0);
+ return certificates.toArray(new Certificate[certificates.size()]);
} else {
- inStream = new FileInputStream(certfilename);
+ InputStream inStream = new FileInputStream(certfilename);
+ return new Certificate[] {certFact.generateCertificate(inStream)};
}
- return certFact.generateCertificate(inStream);
}
public static PemObject readPemObjectFromFile (String keyfilename) throws IOException {
@@ -67,9 +77,10 @@ public class X509Utils {
public static String getCertificateFriendlyName (Context c, String filename) {
if(!TextUtils.isEmpty(filename)) {
try {
- X509Certificate cert = (X509Certificate) getCertificateFromFile(filename);
-
- return getCertificateFriendlyName(cert);
+ X509Certificate cert = (X509Certificate) getCertificatesFromFile(filename)[0];
+ String friendlycn = getCertificateFriendlyName(cert);
+ friendlycn = getCertificateValidityString(cert, c.getResources()) + friendlycn;
+ return friendlycn;
} catch (Exception e) {
VpnStatus.logError("Could not read certificate" + e.getLocalizedMessage());
@@ -78,6 +89,40 @@ public class X509Utils {
return c.getString(R.string.cannotparsecert);
}
+ public static String getCertificateValidityString(X509Certificate cert, Resources res) {
+ try {
+ cert.checkValidity();
+ } catch (CertificateExpiredException ce) {
+ return "EXPIRED: ";
+ } catch (CertificateNotYetValidException cny) {
+ return "NOT YET VALID: ";
+ }
+
+ Date certNotAfter = cert.getNotAfter();
+ Date now = new Date();
+ long timeLeft = certNotAfter.getTime() - now.getTime(); // Time left in ms
+
+ // More than 72h left, display days
+ // More than 3 months display months
+ if (timeLeft > 90l* 24 * 3600 * 1000) {
+ long months = getMonthsDifference(now, certNotAfter);
+ return res.getString(R.string.months_left, months);
+ } else if (timeLeft > 72 * 3600 * 1000) {
+ long days = timeLeft / (24 * 3600 * 1000);
+ return res.getString(R.string.days_left, days);
+ } else {
+ long hours = timeLeft / (3600 * 1000);
+
+ return res.getString(R.string.hours_left, hours);
+ }
+ }
+
+ public static int getMonthsDifference(Date date1, Date date2) {
+ int m1 = date1.getYear() * 12 + date1.getMonth();
+ int m2 = date2.getYear() * 12 + date2.getMonth();
+ return m2 - m1 + 1;
+ }
+
public static String getCertificateFriendlyName(X509Certificate cert) {
X500Principal principal = cert.getSubjectX500Principal();
byte[] encodedSubject = principal.getEncoded();
diff --git a/app/src/main/java/de/blinkt/openvpn/fragments/LogFragment.java b/app/src/main/java/de/blinkt/openvpn/fragments/LogFragment.java
index 2a75c15e..f75e459e 100644
--- a/app/src/main/java/de/blinkt/openvpn/fragments/LogFragment.java
+++ b/app/src/main/java/de/blinkt/openvpn/fragments/LogFragment.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012-2014 Arne Schwabe
+ * Copyright (c) 2012-2016 Arne Schwabe
* Distributed under the GNU GPL v2 with additional terms. For full terms see the file doc/LICENSE.txt
*/
@@ -22,6 +22,9 @@ import android.os.Bundle;
import android.os.Handler;
import android.os.Handler.Callback;
import android.os.Message;
+import android.preference.Preference;
+import android.preference.PreferenceManager;
+import android.support.annotation.Nullable;
import android.text.SpannableString;
import android.text.format.DateFormat;
import android.text.style.ImageSpan;
@@ -33,6 +36,8 @@ import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemLongClickListener;
+import android.widget.CheckBox;
+import android.widget.CompoundButton;
import android.widget.LinearLayout;
import android.widget.ListAdapter;
import android.widget.ListView;
@@ -41,8 +46,6 @@ import android.widget.SeekBar;
import android.widget.TextView;
import android.widget.Toast;
-import org.jetbrains.annotations.Nullable;
-
import java.text.SimpleDateFormat;
import java.util.Collections;
import java.util.Date;
@@ -67,11 +70,12 @@ import static de.blinkt.openvpn.core.OpenVPNService.humanReadableByteCount;
import se.leap.bitmaskclient.Dashboard;
public class LogFragment extends ListFragment implements StateListener, SeekBar.OnSeekBarChangeListener, RadioGroup.OnCheckedChangeListener, VpnStatus.ByteCountListener {
- private static final String LOGTIMEFORMAT = "logtimeformat";
- private static final int START_VPN_CONFIG = 0;
+ private static final String LOGTIMEFORMAT = "logtimeformat";
+ private static final int START_VPN_CONFIG = 0;
private static final String VERBOSITYLEVEL = "verbositylevel";
+
private SeekBar mLogLevelSlider;
private LinearLayout mOptionsLayout;
private RadioGroup mTimeRadioGroup;
@@ -79,10 +83,11 @@ public class LogFragment extends ListFragment implements StateListener, SeekBar.
private TextView mDownStatus;
private TextView mConnectStatus;
private boolean mShowOptionsLayout;
+ private CheckBox mClearLogCheckBox;
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
- ladapter.setLogLevel(progress+1);
+ ladapter.setLogLevel(progress + 1);
}
@Override
@@ -134,7 +139,7 @@ public class LogFragment extends ListFragment implements StateListener, SeekBar.
private static final int MESSAGE_NEWLOG = 0;
- private static final int MESSAGE_CLEARLOG = 1;
+ private static final int MESSAGE_CLEARLOG = 1;
private static final int MESSAGE_NEWTS = 2;
private static final int MESSAGE_NEWLOGLEVEL = 3;
@@ -144,110 +149,109 @@ public class LogFragment extends ListFragment implements StateListener, SeekBar.
public static final int TIME_FORMAT_ISO = 2;
private static final int MAX_STORED_LOG_ENTRIES = 1000;
- private Vector<LogItem> allEntries=new Vector<LogItem>();
+ private Vector<LogItem> allEntries = new Vector<>();
- private Vector<LogItem> currentLevelEntries=new Vector<LogItem>();
+ private Vector<LogItem> currentLevelEntries = new Vector<LogItem>();
- private Handler mHandler;
+ private Handler mHandler;
- private Vector<DataSetObserver> observers=new Vector<DataSetObserver>();
+ private Vector<DataSetObserver> observers = new Vector<DataSetObserver>();
- private int mTimeFormat=0;
- private int mLogLevel=3;
+ private int mTimeFormat = 0;
+ private int mLogLevel = 3;
public LogWindowListAdapter() {
- initLogBuffer();
- if (mHandler == null) {
- mHandler = new Handler(this);
- }
-
- VpnStatus.addLogListener(this);
- }
+ initLogBuffer();
+ if (mHandler == null) {
+ mHandler = new Handler(this);
+ }
+ VpnStatus.addLogListener(this);
+ }
- private void initLogBuffer() {
- allEntries.clear();
+ private void initLogBuffer() {
+ allEntries.clear();
Collections.addAll(allEntries, VpnStatus.getlogbuffer());
initCurrentMessages();
- }
-
- String getLogStr() {
- String str = "";
- for(LogItem entry:allEntries) {
- str+=getTime(entry, TIME_FORMAT_ISO) + entry.getString(getActivity()) + '\n';
- }
- return str;
- }
-
-
- private void shareLog() {
- Intent shareIntent = new Intent(Intent.ACTION_SEND);
- shareIntent.putExtra(Intent.EXTRA_TEXT, getLogStr());
- shareIntent.putExtra(Intent.EXTRA_SUBJECT, getString(R.string.ics_openvpn_log_file));
- shareIntent.setType("text/plain");
- startActivity(Intent.createChooser(shareIntent, "Send Logfile"));
- }
-
- @Override
- public void registerDataSetObserver(DataSetObserver observer) {
- observers.add(observer);
-
- }
-
- @Override
- public void unregisterDataSetObserver(DataSetObserver observer) {
- observers.remove(observer);
- }
-
- @Override
- public int getCount() {
- return currentLevelEntries.size();
- }
-
- @Override
- public Object getItem(int position) {
- return currentLevelEntries.get(position);
- }
-
- @Override
- public long getItemId(int position) {
- return ((Object)currentLevelEntries.get(position)).hashCode();
- }
-
- @Override
- public boolean hasStableIds() {
- return true;
- }
-
- @Override
- public View getView(int position, View convertView, ViewGroup parent) {
- TextView v;
- if(convertView==null)
- v = new TextView(getActivity());
- else
- v = (TextView) convertView;
-
- LogItem le = currentLevelEntries.get(position);
- String msg = le.getString(getActivity());
+ }
+
+ String getLogStr() {
+ String str = "";
+ for (LogItem entry : allEntries) {
+ str += getTime(entry, TIME_FORMAT_ISO) + entry.getString(getActivity()) + '\n';
+ }
+ return str;
+ }
+
+
+ private void shareLog() {
+ Intent shareIntent = new Intent(Intent.ACTION_SEND);
+ shareIntent.putExtra(Intent.EXTRA_TEXT, getLogStr());
+ shareIntent.putExtra(Intent.EXTRA_SUBJECT, getString(R.string.ics_openvpn_log_file));
+ shareIntent.setType("text/plain");
+ startActivity(Intent.createChooser(shareIntent, "Send Logfile"));
+ }
+
+ @Override
+ public void registerDataSetObserver(DataSetObserver observer) {
+ observers.add(observer);
+
+ }
+
+ @Override
+ public void unregisterDataSetObserver(DataSetObserver observer) {
+ observers.remove(observer);
+ }
+
+ @Override
+ public int getCount() {
+ return currentLevelEntries.size();
+ }
+
+ @Override
+ public Object getItem(int position) {
+ return currentLevelEntries.get(position);
+ }
+
+ @Override
+ public long getItemId(int position) {
+ return ((Object) currentLevelEntries.get(position)).hashCode();
+ }
+
+ @Override
+ public boolean hasStableIds() {
+ return true;
+ }
+
+ @Override
+ public View getView(int position, View convertView, ViewGroup parent) {
+ TextView v;
+ if (convertView == null)
+ v = new TextView(getActivity());
+ else
+ v = (TextView) convertView;
+
+ LogItem le = currentLevelEntries.get(position);
+ String msg = le.getString(getActivity());
String time = getTime(le, mTimeFormat);
- msg = time + msg;
+ msg = time + msg;
int spanStart = time.length();
SpannableString t = new SpannableString(msg);
//t.setSpan(getSpanImage(le,(int)v.getTextSize()),spanStart,spanStart+1, Spanned.SPAN_INCLUSIVE_INCLUSIVE);
- v.setText(t);
- return v;
- }
+ v.setText(t);
+ return v;
+ }
private String getTime(LogItem le, int time) {
if (time != TIME_FORMAT_NONE) {
Date d = new Date(le.getLogtime());
java.text.DateFormat timeformat;
- if (time== TIME_FORMAT_ISO)
+ if (time == TIME_FORMAT_ISO)
timeformat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault());
else
timeformat = DateFormat.getTimeFormat(getActivity());
@@ -289,49 +293,49 @@ public class LogFragment extends ListFragment implements StateListener, SeekBar.
}
@Override
- public int getItemViewType(int position) {
- return 0;
- }
-
- @Override
- public int getViewTypeCount() {
- return 1;
- }
-
- @Override
- public boolean isEmpty() {
- return currentLevelEntries.isEmpty();
-
- }
-
- @Override
- public boolean areAllItemsEnabled() {
- return true;
- }
-
- @Override
- public boolean isEnabled(int position) {
- return true;
- }
-
- @Override
- public void newLog(LogItem logMessage) {
- Message msg = Message.obtain();
- assert (msg!=null);
- msg.what=MESSAGE_NEWLOG;
- Bundle bundle=new Bundle();
- bundle.putParcelable("logmessage", logMessage);
- msg.setData(bundle);
- mHandler.sendMessage(msg);
- }
-
- @Override
- public boolean handleMessage(Message msg) {
- // We have been called
- if(msg.what==MESSAGE_NEWLOG) {
-
- LogItem logMessage = msg.getData().getParcelable("logmessage");
- if(addLogMessage(logMessage))
+ public int getItemViewType(int position) {
+ return 0;
+ }
+
+ @Override
+ public int getViewTypeCount() {
+ return 1;
+ }
+
+ @Override
+ public boolean isEmpty() {
+ return currentLevelEntries.isEmpty();
+
+ }
+
+ @Override
+ public boolean areAllItemsEnabled() {
+ return true;
+ }
+
+ @Override
+ public boolean isEnabled(int position) {
+ return true;
+ }
+
+ @Override
+ public void newLog(LogItem logMessage) {
+ Message msg = Message.obtain();
+ assert (msg != null);
+ msg.what = MESSAGE_NEWLOG;
+ Bundle bundle = new Bundle();
+ bundle.putParcelable("logmessage", logMessage);
+ msg.setData(bundle);
+ mHandler.sendMessage(msg);
+ }
+
+ @Override
+ public boolean handleMessage(Message msg) {
+ // We have been called
+ if (msg.what == MESSAGE_NEWLOG) {
+
+ LogItem logMessage = msg.getData().getParcelable("logmessage");
+ if (addLogMessage(logMessage))
for (DataSetObserver observer : observers) {
observer.onChanged();
}
@@ -340,25 +344,25 @@ public class LogFragment extends ListFragment implements StateListener, SeekBar.
observer.onInvalidated();
}
initLogBuffer();
- } else if (msg.what == MESSAGE_NEWTS) {
- for (DataSetObserver observer : observers) {
- observer.onInvalidated();
- }
- } else if (msg.what == MESSAGE_NEWLOGLEVEL) {
+ } else if (msg.what == MESSAGE_NEWTS) {
+ for (DataSetObserver observer : observers) {
+ observer.onInvalidated();
+ }
+ } else if (msg.what == MESSAGE_NEWLOGLEVEL) {
initCurrentMessages();
- for (DataSetObserver observer: observers) {
+ for (DataSetObserver observer : observers) {
observer.onChanged();
}
}
- return true;
- }
+ return true;
+ }
private void initCurrentMessages() {
currentLevelEntries.clear();
- for(LogItem li: allEntries) {
+ for (LogItem li : allEntries) {
if (li.getVerbosityLevel() <= mLogLevel ||
mLogLevel == VpnProfile.MAXLOGLEVEL)
currentLevelEntries.add(li);
@@ -366,7 +370,6 @@ public class LogFragment extends ListFragment implements StateListener, SeekBar.
}
/**
- *
* @param logmessage
* @return True if the current entries have changed
*/
@@ -376,7 +379,7 @@ public class LogFragment extends ListFragment implements StateListener, SeekBar.
if (allEntries.size() > MAX_STORED_LOG_ENTRIES) {
Vector<LogItem> oldAllEntries = allEntries;
allEntries = new Vector<LogItem>(allEntries.size());
- for (int i=50;i<oldAllEntries.size();i++) {
+ for (int i = 50; i < oldAllEntries.size(); i++) {
allEntries.add(oldAllEntries.elementAt(i));
}
initCurrentMessages();
@@ -392,85 +395,81 @@ public class LogFragment extends ListFragment implements StateListener, SeekBar.
}
void clearLog() {
- // Actually is probably called from GUI Thread as result of the user
- // pressing a button. But better safe than sorry
- VpnStatus.clearLog();
- VpnStatus.logInfo(R.string.logCleared);
- mHandler.sendEmptyMessage(MESSAGE_CLEARLOG);
- }
-
+ // Actually is probably called from GUI Thread as result of the user
+ // pressing a button. But better safe than sorry
+ VpnStatus.clearLog();
+ VpnStatus.logInfo(R.string.logCleared);
+ mHandler.sendEmptyMessage(MESSAGE_CLEARLOG);
+ }
- public void setTimeFormat(int newTimeFormat) {
- mTimeFormat= newTimeFormat;
- mHandler.sendEmptyMessage(MESSAGE_NEWTS);
- }
+ public void setTimeFormat(int newTimeFormat) {
+ mTimeFormat = newTimeFormat;
+ mHandler.sendEmptyMessage(MESSAGE_NEWTS);
+ }
public void setLogLevel(int logLevel) {
mLogLevel = logLevel;
mHandler.sendEmptyMessage(MESSAGE_NEWLOGLEVEL);
}
-
- }
-
-
- private LogWindowListAdapter ladapter;
- private TextView mSpeedView;
+ }
+ private LogWindowListAdapter ladapter;
+ private TextView mSpeedView;
@Override
- public boolean onOptionsItemSelected(MenuItem item) {
- if(item.getItemId()==R.id.clearlog) {
- ladapter.clearLog();
- return true;
- } else if(item.getItemId()==R.id.cancel){
- Intent intent = new Intent(getActivity(),DisconnectVPN.class);
+ public boolean onOptionsItemSelected(MenuItem item) {
+ if (item.getItemId() == R.id.clearlog) {
+ ladapter.clearLog();
+ return true;
+ } else if (item.getItemId() == R.id.cancel) {
+ Intent intent = new Intent(getActivity(), DisconnectVPN.class);
startActivity(intent);
return true;
- } else if(item.getItemId()==R.id.send) {
- ladapter.shareLog();
- } else if(item.getItemId()==R.id.edit_vpn) {
- VpnProfile lastConnectedprofile = ProfileManager.getLastConnectedVpn();
-
- if(lastConnectedprofile!=null) {
- Intent vprefintent = new Intent(getActivity(),Dashboard.class)
- .putExtra(VpnProfile.EXTRA_PROFILEUUID,lastConnectedprofile.getUUIDString());
- startActivityForResult(vprefintent,START_VPN_CONFIG);
- } else {
- Toast.makeText(getActivity(), R.string.log_no_last_vpn, Toast.LENGTH_LONG).show();
- }
- } else if(item.getItemId() == R.id.toggle_time) {
- showHideOptionsPanel();
- } else if(item.getItemId() == android.R.id.home) {
- // This is called when the Home (Up) button is pressed
- // in the Action Bar.
- Intent parentActivityIntent = new Intent(getActivity(), Dashboard.class);
- parentActivityIntent.addFlags(
- Intent.FLAG_ACTIVITY_CLEAR_TOP |
- Intent.FLAG_ACTIVITY_NEW_TASK);
- startActivity(parentActivityIntent);
- getActivity().finish();
- return true;
-
- }
- return super.onOptionsItemSelected(item);
-
- }
+ } else if (item.getItemId() == R.id.send) {
+ ladapter.shareLog();
+ } else if (item.getItemId() == R.id.edit_vpn) {
+ VpnProfile lastConnectedprofile = ProfileManager.getLastConnectedVpn();
+
+ if (lastConnectedprofile != null) {
+ Intent vprefintent = new Intent(getActivity(), Dashboard.class)
+ .putExtra(VpnProfile.EXTRA_PROFILEUUID, lastConnectedprofile.getUUIDString());
+ startActivityForResult(vprefintent, START_VPN_CONFIG);
+ } else {
+ Toast.makeText(getActivity(), R.string.log_no_last_vpn, Toast.LENGTH_LONG).show();
+ }
+ } else if (item.getItemId() == R.id.toggle_time) {
+ showHideOptionsPanel();
+ } else if (item.getItemId() == android.R.id.home) {
+ // This is called when the Home (Up) button is pressed
+ // in the Action Bar.
+ Intent parentActivityIntent = new Intent(getActivity(), Dashboard.class);
+ parentActivityIntent.addFlags(
+ Intent.FLAG_ACTIVITY_CLEAR_TOP |
+ Intent.FLAG_ACTIVITY_NEW_TASK);
+ startActivity(parentActivityIntent);
+ getActivity().finish();
+ return true;
+
+ }
+ return super.onOptionsItemSelected(item);
+
+ }
private void showHideOptionsPanel() {
boolean optionsVisible = (mOptionsLayout.getVisibility() != View.GONE);
ObjectAnimator anim;
if (optionsVisible) {
- anim = ObjectAnimator.ofFloat(mOptionsLayout,"alpha",1.0f, 0f);
+ anim = ObjectAnimator.ofFloat(mOptionsLayout, "alpha", 1.0f, 0f);
anim.addListener(collapseListener);
} else {
mOptionsLayout.setVisibility(View.VISIBLE);
- anim = ObjectAnimator.ofFloat(mOptionsLayout,"alpha", 0f, 1.0f);
+ anim = ObjectAnimator.ofFloat(mOptionsLayout, "alpha", 0f, 1.0f);
//anim = new TranslateAnimation(0.0f, 0.0f, mOptionsLayout.getHeight(), 0.0f);
}
@@ -493,16 +492,16 @@ public class LogFragment extends ListFragment implements StateListener, SeekBar.
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
- inflater.inflate(R.menu.logmenu, menu);
+ inflater.inflate(R.menu.logmenu, menu);
if (getResources().getBoolean(R.bool.logSildersAlwaysVisible))
menu.removeItem(R.id.toggle_time);
- }
+ }
- @Override
+ @Override
public void onResume() {
- super.onResume();
- VpnStatus.addStateListener(this);
+ super.onResume();
+ VpnStatus.addStateListener(this);
VpnStatus.addByteCountListener(this);
Intent intent = new Intent(getActivity(), OpenVPNService.class);
intent.setAction(OpenVPNService.START_SERVICE);
@@ -512,45 +511,45 @@ public class LogFragment extends ListFragment implements StateListener, SeekBar.
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
- if (requestCode == START_VPN_CONFIG && resultCode== Activity.RESULT_OK) {
- String configuredVPN = data.getStringExtra(VpnProfile.EXTRA_PROFILEUUID);
+ if (requestCode == START_VPN_CONFIG && resultCode == Activity.RESULT_OK) {
+ String configuredVPN = data.getStringExtra(VpnProfile.EXTRA_PROFILEUUID);
- final VpnProfile profile = ProfileManager.get(getActivity(),configuredVPN);
- ProfileManager.getInstance(getActivity()).saveProfile(getActivity(), profile);
- // Name could be modified, reset List adapter
+ final VpnProfile profile = ProfileManager.get(getActivity(), configuredVPN);
+ ProfileManager.getInstance(getActivity()).saveProfile(getActivity(), profile);
+ // Name could be modified, reset List adapter
- AlertDialog.Builder dialog = new AlertDialog.Builder(getActivity());
- dialog.setTitle(R.string.configuration_changed);
- dialog.setMessage(R.string.restart_vpn_after_change);
+ AlertDialog.Builder dialog = new AlertDialog.Builder(getActivity());
+ dialog.setTitle(R.string.configuration_changed);
+ dialog.setMessage(R.string.restart_vpn_after_change);
- dialog.setPositiveButton(R.string.restart,
- new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which) {
- Intent intent = new Intent(getActivity(), LaunchVPN.class);
- intent.putExtra(LaunchVPN.EXTRA_KEY, profile.getUUIDString());
- intent.setAction(Intent.ACTION_MAIN);
- startActivity(intent);
- }
+ dialog.setPositiveButton(R.string.restart,
+ new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ Intent intent = new Intent(getActivity(), LaunchVPN.class);
+ intent.putExtra(LaunchVPN.EXTRA_KEY, profile.getUUIDString());
+ intent.setAction(Intent.ACTION_MAIN);
+ startActivity(intent);
+ }
- });
- dialog.setNegativeButton(R.string.ignore, null);
- dialog.create().show();
- }
- super.onActivityResult(requestCode, resultCode, data);
- }
+ });
+ dialog.setNegativeButton(R.string.ignore, null);
+ dialog.create().show();
+ }
+ super.onActivityResult(requestCode, resultCode, data);
+ }
@Override
public void onStop() {
- super.onStop();
- VpnStatus.removeStateListener(this);
+ super.onStop();
+ VpnStatus.removeStateListener(this);
VpnStatus.removeByteCountListener(this);
getActivity().getPreferences(0).edit().putInt(LOGTIMEFORMAT, ladapter.mTimeFormat)
- .putInt(VERBOSITYLEVEL, ladapter.mLogLevel).apply();
+ .putInt(VERBOSITYLEVEL, ladapter.mLogLevel).apply();
}
@@ -567,7 +566,7 @@ public class LogFragment extends ListFragment implements StateListener, SeekBar.
int position, long id) {
ClipboardManager clipboard = (ClipboardManager)
getActivity().getSystemService(Context.CLIPBOARD_SERVICE);
- ClipData clip = ClipData.newPlainText("Log Entry",((TextView) view).getText());
+ ClipData clip = ClipData.newPlainText("Log Entry", ((TextView) view).getText());
clipboard.setPrimaryClip(clip);
Toast.makeText(getActivity(), R.string.copied_entry, Toast.LENGTH_SHORT).show();
return true;
@@ -583,8 +582,8 @@ public class LogFragment extends ListFragment implements StateListener, SeekBar.
setHasOptionsMenu(true);
ladapter = new LogWindowListAdapter();
- ladapter.mTimeFormat = getActivity().getPreferences(0).getInt(LOGTIMEFORMAT, 0);
- int logLevel = getActivity().getPreferences(0).getInt(VERBOSITYLEVEL, 0);
+ ladapter.mTimeFormat = getActivity().getPreferences(0).getInt(LOGTIMEFORMAT, 1);
+ int logLevel = getActivity().getPreferences(0).getInt(VERBOSITYLEVEL, 1);
ladapter.setLogLevel(logLevel);
setListAdapter(ladapter);
@@ -592,7 +591,7 @@ public class LogFragment extends ListFragment implements StateListener, SeekBar.
mTimeRadioGroup = (RadioGroup) v.findViewById(R.id.timeFormatRadioGroup);
mTimeRadioGroup.setOnCheckedChangeListener(this);
- if(ladapter.mTimeFormat== LogWindowListAdapter.TIME_FORMAT_ISO) {
+ if (ladapter.mTimeFormat == LogWindowListAdapter.TIME_FORMAT_ISO) {
mTimeRadioGroup.check(R.id.radioISO);
} else if (ladapter.mTimeFormat == LogWindowListAdapter.TIME_FORMAT_NONE) {
mTimeRadioGroup.check(R.id.radioNone);
@@ -600,16 +599,25 @@ public class LogFragment extends ListFragment implements StateListener, SeekBar.
mTimeRadioGroup.check(R.id.radioShort);
}
+ mClearLogCheckBox = (CheckBox) v.findViewById(R.id.clearlogconnect);
+ mClearLogCheckBox.setChecked(PreferenceManager.getDefaultSharedPreferences(getActivity()).getBoolean(LaunchVPN.CLEARLOG, true));
+ mClearLogCheckBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
+ @Override
+ public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
+ PreferenceManager.getDefaultSharedPreferences(getActivity()).edit().putBoolean(LaunchVPN.CLEARLOG, isChecked).apply();
+ }
+ });
+
mSpeedView = (TextView) v.findViewById(R.id.speed);
mOptionsLayout = (LinearLayout) v.findViewById(R.id.logOptionsLayout);
mLogLevelSlider = (SeekBar) v.findViewById(R.id.LogLevelSlider);
- mLogLevelSlider.setMax(VpnProfile.MAXLOGLEVEL-1);
- mLogLevelSlider.setProgress(logLevel-1);
+ mLogLevelSlider.setMax(VpnProfile.MAXLOGLEVEL - 1);
+ mLogLevelSlider.setProgress(logLevel - 1);
mLogLevelSlider.setOnSeekBarChangeListener(this);
- if(getResources().getBoolean(R.bool.logSildersAlwaysVisible))
+ if (getResources().getBoolean(R.bool.logSildersAlwaysVisible))
mOptionsLayout.setVisibility(View.VISIBLE);
mUpStatus = (TextView) v.findViewById(R.id.speedUp);
@@ -623,16 +631,16 @@ public class LogFragment extends ListFragment implements StateListener, SeekBar.
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
- if(getResources().getBoolean(R.bool.logSildersAlwaysVisible)) {
- mShowOptionsLayout=true;
- if (mOptionsLayout!= null)
+ if (getResources().getBoolean(R.bool.logSildersAlwaysVisible)) {
+ mShowOptionsLayout = true;
+ if (mOptionsLayout != null)
mOptionsLayout.setVisibility(View.VISIBLE);
}
}
@Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
//getActionBar().setDisplayHomeAsUpEnabled(true);
@@ -642,19 +650,16 @@ public class LogFragment extends ListFragment implements StateListener, SeekBar.
@Override
public void updateState(final String status, final String logMessage, final int resId, final ConnectionStatus level) {
if (isAdded()) {
+ final String cleanLogMessage = VpnStatus.getLastCleanLogMessage(getActivity());
+
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
if (isAdded()) {
- String prefix = getString(resId) + ":";
- if (status.equals("BYTECOUNT") || status.equals("NOPROCESS"))
- prefix = "";
- if (resId == R.string.unknown_state)
- prefix += status;
- if (mSpeedView != null)
- mSpeedView.setText(prefix + logMessage);
-
+ if (mSpeedView != null) {
+ mSpeedView.setText(cleanLogMessage);
+ }
if (mConnectStatus != null)
mConnectStatus.setText(getString(resId));
}
@@ -664,10 +669,10 @@ public class LogFragment extends ListFragment implements StateListener, SeekBar.
}
- @Override
+ @Override
public void onDestroy() {
- VpnStatus.removeLogListener(ladapter);
- super.onDestroy();
- }
+ VpnStatus.removeLogListener(ladapter);
+ super.onDestroy();
+ }
}
diff --git a/app/src/main/java/de/blinkt/openvpn/views/SeekBarTicks.java b/app/src/main/java/de/blinkt/openvpn/views/SeekBarTicks.java
index 82378b00..347ce708 100644
--- a/app/src/main/java/de/blinkt/openvpn/views/SeekBarTicks.java
+++ b/app/src/main/java/de/blinkt/openvpn/views/SeekBarTicks.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012-2014 Arne Schwabe
+ * Copyright (c) 2012-2016 Arne Schwabe
* Distributed under the GNU GPL v2 with additional terms. For full terms see the file doc/LICENSE.txt
*/
@@ -42,10 +42,9 @@ public class SeekBarTicks extends SeekBar {
TypedArray a = context.obtainStyledAttributes(attrs,
new int[] { android.R.attr.secondaryProgress }, defStyle, 0);
-
- int tickColor = a.getColor(0, android.R.color.black);
mTickPaint = new Paint();
- mTickPaint.setColor( context.getResources().getColor(tickColor));
+ //noinspection deprecation
+ mTickPaint.setColor( context.getResources().getColor(android.R.color.black));
a.recycle();
}
diff --git a/app/src/main/res/drawable-hdpi/ic_close_white_24dp.png b/app/src/main/res/drawable-hdpi/ic_close_white_24dp.png
index 0fd15563..ceb1a1ee 100644
--- a/app/src/main/res/drawable-hdpi/ic_close_white_24dp.png
+++ b/app/src/main/res/drawable-hdpi/ic_close_white_24dp.png
Binary files differ
diff --git a/app/src/main/res/drawable-mdpi/ic_close_white_24dp.png b/app/src/main/res/drawable-mdpi/ic_close_white_24dp.png
index e80681ae..af7f8288 100644
--- a/app/src/main/res/drawable-mdpi/ic_close_white_24dp.png
+++ b/app/src/main/res/drawable-mdpi/ic_close_white_24dp.png
Binary files differ
diff --git a/app/src/main/res/drawable-xhdpi/ic_close_white_24dp.png b/app/src/main/res/drawable-xhdpi/ic_close_white_24dp.png
index 76e07f09..b7c7ffd0 100644
--- a/app/src/main/res/drawable-xhdpi/ic_close_white_24dp.png
+++ b/app/src/main/res/drawable-xhdpi/ic_close_white_24dp.png
Binary files differ
diff --git a/app/src/main/res/drawable-xxhdpi/ic_close_white_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_close_white_24dp.png
index 0eb9d8b0..6b717e0d 100644
--- a/app/src/main/res/drawable-xxhdpi/ic_close_white_24dp.png
+++ b/app/src/main/res/drawable-xxhdpi/ic_close_white_24dp.png
Binary files differ
diff --git a/app/src/main/res/drawable-xxxhdpi/ic_close_white_24dp.png b/app/src/main/res/drawable-xxxhdpi/ic_close_white_24dp.png
index 7b2a480a..39641921 100644
--- a/app/src/main/res/drawable-xxxhdpi/ic_close_white_24dp.png
+++ b/app/src/main/res/drawable-xxxhdpi/ic_close_white_24dp.png
Binary files differ
diff --git a/app/src/main/res/drawable/white_rect.xml b/app/src/main/res/drawable/white_rect.xml
index 5ead4b9b..36df6913 100644
--- a/app/src/main/res/drawable/white_rect.xml
+++ b/app/src/main/res/drawable/white_rect.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
- ~ Copyright (c) 2012-2014 Arne Schwabe
+ ~ Copyright (c) 2012-2016 Arne Schwabe
~ Distributed under the GNU GPL v2 with additional terms. For full terms see the file doc/LICENSE.txt
-->
diff --git a/app/src/main/res/layout-sw600dp-port/log_fragment.xml b/app/src/main/res/layout-sw600dp-port/log_fragment.xml
index 1fb9fa54..7a4b60fe 100644
--- a/app/src/main/res/layout-sw600dp-port/log_fragment.xml
+++ b/app/src/main/res/layout-sw600dp-port/log_fragment.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
- ~ Copyright (c) 2012-2014 Arne Schwabe
+ ~ Copyright (c) 2012-2016 Arne Schwabe
~ Distributed under the GNU GPL v2 with additional terms. For full terms see the file doc/LICENSE.txt
-->
diff --git a/app/src/main/res/layout-sw600dp/log_fragment.xml b/app/src/main/res/layout-sw600dp/log_fragment.xml
index 0bd3f991..26f63df4 100644
--- a/app/src/main/res/layout-sw600dp/log_fragment.xml
+++ b/app/src/main/res/layout-sw600dp/log_fragment.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
- ~ Copyright (c) 2012-2014 Arne Schwabe
+ ~ Copyright (c) 2012-2016 Arne Schwabe
~ Distributed under the GNU GPL v2 with additional terms. For full terms see the file doc/LICENSE.txt
-->
diff --git a/app/src/main/res/layout/log_fragment.xml b/app/src/main/res/layout/log_fragment.xml
index 491882a9..ab070117 100644
--- a/app/src/main/res/layout/log_fragment.xml
+++ b/app/src/main/res/layout/log_fragment.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
- ~ Copyright (c) 2012-2014 Arne Schwabe
+ ~ Copyright (c) 2012-2016 Arne Schwabe
~ Distributed under the GNU GPL v2 with additional terms. For full terms see the file doc/LICENSE.txt
-->
diff --git a/app/src/main/res/layout/log_silders.xml b/app/src/main/res/layout/log_silders.xml
index 152407f9..4196e243 100644
--- a/app/src/main/res/layout/log_silders.xml
+++ b/app/src/main/res/layout/log_silders.xml
@@ -2,7 +2,7 @@
<!--
- ~ Copyright (c) 2012-2014 Arne Schwabe
+ ~ Copyright (c) 2012-2016 Arne Schwabe
~ Distributed under the GNU GPL v2 with additional terms. For full terms see the file doc/LICENSE.txt
-->
@@ -63,4 +63,11 @@
</RadioGroup>
+
+ <CheckBox
+ tools:checked="true"
+ android:id="@+id/clearlogconnect"
+ android:text="@string/clear_log_on_connect"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content" />
</LinearLayout> \ No newline at end of file
diff --git a/app/src/main/res/layout/log_window.xml b/app/src/main/res/layout/log_window.xml
index fcc7aa7a..7c25dcfa 100644
--- a/app/src/main/res/layout/log_window.xml
+++ b/app/src/main/res/layout/log_window.xml
@@ -1,5 +1,5 @@
<!--
- ~ Copyright (c) 2012-2014 Arne Schwabe
+ ~ Copyright (c) 2012-2016 Arne Schwabe
~ Distributed under the GNU GPL v2 with additional terms. For full terms see the file doc/LICENSE.txt
-->
diff --git a/app/src/main/res/layout/vpnstatus.xml b/app/src/main/res/layout/vpnstatus.xml
index 2d77bbab..b304ad10 100644
--- a/app/src/main/res/layout/vpnstatus.xml
+++ b/app/src/main/res/layout/vpnstatus.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
- ~ Copyright (c) 2012-2014 Arne Schwabe
+ ~ Copyright (c) 2012-2016 Arne Schwabe
~ Distributed under the GNU GPL v2 with additional terms. For full terms see the file doc/LICENSE.txt
-->
diff --git a/app/src/main/res/menu/logmenu.xml b/app/src/main/res/menu/logmenu.xml
index 2df53141..890d1c2e 100644
--- a/app/src/main/res/menu/logmenu.xml
+++ b/app/src/main/res/menu/logmenu.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
- ~ Copyright (c) 2012-2014 Arne Schwabe
+ ~ Copyright (c) 2012-2016 Arne Schwabe
~ Distributed under the GNU GPL v2 with additional terms. For full terms see the file doc/LICENSE.txt
-->
@@ -11,34 +11,33 @@
android:id="@+id/toggle_time"
android:alphabeticShortcut="t"
android:icon="@drawable/ic_menu_view"
- android:showAsAction="withText|ifRoom"
+ android:showAsAction="ifRoom"
android:title="@string/logview_options" />
<item
android:id="@+id/clearlog"
android:icon="@drawable/ic_menu_delete"
- android:showAsAction="ifRoom|withText"
+ android:showAsAction="ifRoom"
android:title="@string/clear_log"
android:titleCondensed="@string/clear"/>
<item
android:id="@+id/send"
android:icon="@drawable/ic_menu_share"
- android:showAsAction="ifRoom|withText"
+ android:showAsAction="ifRoom"
android:title="@string/send_logfile"
android:titleCondensed="@string/send"/>
<item
android:id="@+id/cancel"
android:icon="@drawable/ic_menu_close_clear_cancel"
- android:showAsAction="ifRoom|withText"
+ android:showAsAction="ifRoom"
android:title="@string/cancel_connection_long"
android:titleCondensed="@string/cancel_connection"/>
<item
android:id="@+id/edit_vpn"
android:alphabeticShortcut="e"
android:icon="@drawable/ic_menu_edit"
- android:showAsAction="withText|ifRoom"
+ android:showAsAction="ifRoom"
android:title="@string/edit_vpn"
android:visible="false"/>
-
</menu>
diff --git a/app/src/main/res/values-cs/strings-icsopenvpn.xml b/app/src/main/res/values-cs/strings-icsopenvpn.xml
index 12837f13..c2b47b77 100755
--- a/app/src/main/res/values-cs/strings-icsopenvpn.xml
+++ b/app/src/main/res/values-cs/strings-icsopenvpn.xml
@@ -180,7 +180,6 @@
<string name="keychain_nocacert">Žádný CA certifikát nebyl získán z úložiště, autentikace pravděpodobně selže.</string>
<string name="show_log_summary">Zobrazit okno s logem při připojování. okno lze vždy otevřít z notifikace.</string>
<string name="show_log_window">Zobrazit okno s logem</string>
- <string name="mobile_info">Spuštěno na %1$s (%2$s) %3$s, Android API %4$d</string>
<string name="error_rsa_sign">Chyba při podepisování klíčem %1$s: %2$s</string>
<string name="faq_system_dialogs">VPN varování při připojování oznamující o možnosti přesměrování veškerého provozu je vynuceno systémem, aby se zabránilo zneužití VPNService API.\nNotifikace (symbol s klíčem) je také vynucena systémem, aby signalizovala odchozí VPN spojení. Na některých systémech přehrává notifikace i zvuk.\nAndroid zavedl tyto dialogy pro tvoji osobní bezpečnost a ujistil se, že nejdou obejít. (Někdu to bohužel zahrnuje i zvuk notifikace.)</string>
<string name="faq_system_dialogs_title">Varování při připojení a zvuková notifikace</string>
@@ -260,7 +259,6 @@
<string name="encryption_cipher">Šifrovací algoritmus</string>
<string name="packet_auth">Ověřování paketů</string>
<string name="auth_dialog_title">Zadej způsob ověřování paketů</string>
- <string name="mobile_info_extended">Běží na %1$s (%2$s) %3$s, Android API %4$d, verze %5$s, %6$s</string>
<string name="built_by">sestaveno od %s</string>
<string name="debug_build">ladící verze</string>
<string name="official_build">oficiální verze</string>
diff --git a/app/src/main/res/values-de/strings-icsopenvpn.xml b/app/src/main/res/values-de/strings-icsopenvpn.xml
index bb22c373..c1b3f10a 100755
--- a/app/src/main/res/values-de/strings-icsopenvpn.xml
+++ b/app/src/main/res/values-de/strings-icsopenvpn.xml
@@ -149,7 +149,7 @@
<string name="no_bind">Kein lokales Binden</string>
<string name="import_configuration_file">Importiere Konfigurationsdatei</string>
<string name="faq_security_title">Bemerkungen zur Sicherheit</string>
- <string name="faq_security">Da OpenVPN sicherheitsrelevant ist, sind einige Worte zur Sicherheit der Anwendung angebracht. Alle Daten, die sich auf der SD Karte befinden sind als absolut unsicher anzusehen. Jede Anwendung kann diese lesen. (Diese Anwendung braucht zum Beispiel keine SD Karten Berechtigung). Die restlichen Konfiguration dieser Anwendung kann nur von der Anwendung selbst gelesen werden. Wenn die Option genutzt wird, dass die Zertifikate und Schlüssel eingebettet werden, werden diese im VPN Profil gespeichert. Die VPN Profile sind nur von der Anwendung selbst lesbar. (Vergessen Sie nicht die ursprünglichen Zertifikate/Schlüssel von der SD Karte zu löschen). Die Daten die Anwendung selbst speichert sind unverschlüsselt. Es besteht die Möglichkeit diese mittels \"rooten\" des Telefons/Tablets oder anderen Schwachstellend diese Daten auszulesen. Gespeicherte Passwörter werden auch im Klartext gespeichert. Es wird dringend empfohlen die Zertifikate in dem Android Keystore zu speichern.\"</string>
+ <string name="faq_security">Da OpenVPN sicherheitsrelevant ist, sind einige Worte zur Sicherheit der Anwendung angebracht. Alle Daten, die sich auf der SD Karte befinden sind als absolut unsicher anzusehen. Jede Anwendung kann diese lesen. (Diese Anwendung braucht zum Beispiel keine SD Karten Berechtigung). Die restlichen Konfiguration dieser Anwendung kann nur von der Anwendung selbst gelesen werden. Wenn die Option genutzt wird, dass die Zertifikate und Schlüssel eingebettet werden, werden diese im VPN Profil gespeichert. Die VPN Profile sind nur von der Anwendung selbst lesbar. (Vergessen Sie nicht die ursprünglichen Zertifikate/Schlüssel von der SD Karte zu löschen). Die Daten die Anwendung selbst speichert sind unverschlüsselt. Es besteht die Möglichkeit diese mittels \"rooten\" des Telefons/Tablets oder anderen Schwachstellen diese Daten auszulesen. Gespeicherte Passwörter werden auch im Klartext gespeichert. Es wird dringend empfohlen die Zertifikate in dem Android Keystore zu speichern.\"</string>
<string name="import_vpn">Importieren</string>
<string name="broken_image_cert_title">Fehler beim Anzeigen des Zertifikatsauswahlbildschirmes</string>
<string name="broken_image_cert">Android hat einen Fehler beim Anzeigen des Zertifikat Dialog gemeldet. Dies sollte nie passieren, da dies ein Standard Feature von Android 4.0+ ist. Eventuell ist Unterstützung von Zertifikaten in Ihrer Firmware fehlerhaft</string>
@@ -180,7 +180,7 @@
<string name="keychain_nocacert">Beim Abfragen des Android KeyStore wurde kein CA Zertifikat zurückgegeben. Überprüfen des Serverzertifikat wird wahrscheinlich fehlschlagen. Geben Sie manuell ein CA Zertifikat an.</string>
<string name="show_log_summary">Zeigt das Status Log, wenn ein VPN verbunden wird. Das Status log kann immer über die Benachrichtigung aufgerufen werden.</string>
<string name="show_log_window">Zeige Log</string>
- <string name="mobile_info">Modell %1$s (%2$s) %3$s, Android API %4$d</string>
+ <string name="mobile_info">%10$s %9$s läuft auf %3$s %1$s (%2$s), Android %6$s (%7$s) API %4$d, ABI %5$s, (%8$s)</string>
<string name="error_rsa_sign">Fehler beim Zugriff auf den Android Keystore %1$s: %2$s</string>
<string name="faq_system_dialogs">Die Meldung, dass OpenVPN versucht eine VPN-Verbindung aufzubauen und dabei den gesamten Netzwerkverkehr abhören kann, wird vom Android System selbst erzeugt. Diese wird vom System erzwungen, damit keine Anwendung vom Benutzer unbemerkt eine VPN Verbindung aufbauen kann\Die VPN Benachrichtigung (Das Schlüssel Symbol) wird genauso vom Android System angezeigt um eine bestehende VPN anzuzeigen.\nDiese beiden Features wurden in Android für die Sicherheit des Nutzers implementiert und können nicht umgangen werden. (Auf machen Telefon/Tablets wird die Benachrichtigung leider mit einem Ton signalisiert.)</string>
<string name="faq_system_dialogs_title">Warnung beim Verbinden und Benachrichtigungston</string>
@@ -260,7 +260,6 @@
<string name="encryption_cipher">Verschlüsselungsalgorithmus</string>
<string name="packet_auth">Packetauthentifizierung</string>
<string name="auth_dialog_title">Geben Sie den Authentifizierungsalgorithmus an</string>
- <string name="mobile_info_extended">Modell %1$s (%2$s) %3$s, Android API %4$d, version %5$s, %6$s</string>
<string name="built_by">compiliert von %s</string>
<string name="debug_build">Testversion</string>
<string name="official_build">offizielle Version</string>
@@ -350,7 +349,7 @@
<string name="duplicate_vpn">VPN Profil duplizieren</string>
<string name="duplicate_profile_title">VPN Profil duplizieren: %s</string>
<string name="show_log">Log anzeigen</string>
- <string name="faq_android_clients">Es gibt es mehrere OpenVPN-Clients für Android. Die am häufigsten genutzten sind OpenVPN für Android (dieser Client), OpenVPN Connect und OpenVPN Settings. &lt;p&gt; Die Clients in zwei Gruppen eingeteilt werden können: OpenVPN für Android und OpenVPN Connect verwenden die offizielle VPNService-API (Android 4.0+) und erfordern keine Rootrechte und OpenVPN-Settings, das Rootrechte benötigt. &lt; p &gt; OpenVPN für Android ist ein von Arne Schwabe entwickelter Open-Source-Client. Es richtet sich an fortgeschrittene Benutzer und bietet viele erweiterete Einstellungen sowie die Möglichkeit, Profile aus Dateien zu importieren und das konfigurieren und ändern von Profilen innerhalb der App. Der Client basiert auf der Community-Version von OpenVPN 2.x und kann als semioffizieller Client der community angesehen werden. &lt;p&gt; OpenVPN Connect ist ein Closed-Source-Client, der von OpenVPN Technologies, Inc. entwickelt wird. Der Client ist für die normale Verwendung und auf den durchschnittlichen Benutzer ausgerichtet werden und ermöglicht den Import von OpenVPN-Profilen ohne diese innerhalb der App ändern zu können. Dieser Client basiert auf der OpenVPN C++ Neuimplementierung des OpenVPN-Protokolls (Diese war erforderlich, damit OpenVPN Technologies, Inc, eine iOS-app von OpenVPN veröffentlichen onnte). Dieser Client ist auch der offizielle Client von OpenVPN Technologies, Inc. &lt; p&gt; OpenVPN Settings ist der älteste von den Clients und auch eine Benutzeroberfläche für das Open-Source OpenVPN. Im Gegensatz zu OpenVPN für Android es erfordert es Rootrechte und verwendet nicht die VPNService-API; benötigt aber auch nicht Android 4.0+</string>
+ <string name="faq_android_clients">Es gibt es mehrere OpenVPN-Clients für Android. Die am häufigsten genutzten sind OpenVPN für Android (dieser Client), OpenVPN Connect und OpenVPN Settings. &lt;p&gt; Die Clients in zwei Gruppen eingeteilt werden können: OpenVPN für Android und OpenVPN Connect verwenden die offizielle VPNService-API (Android 4.0+) und erfordern keine Rootrechte und OpenVPN-Settings, das Rootrechte benötigt. &lt; p &gt; OpenVPN für Android ist ein von Arne Schwabe entwickelter Open-Source-Client. Es richtet sich an fortgeschrittene Benutzer und bietet viele erweiterete Einstellungen sowie die Möglichkeit, Profile aus Dateien zu importieren und das konfigurieren und ändern von Profilen innerhalb der App. Der Client basiert auf der Community-Version von OpenVPN 2.x und kann als semioffizieller Client der community angesehen werden. &lt;p&gt; OpenVPN Connect ist ein Closed-Source-Client, der von OpenVPN Technologies, Inc. entwickelt wird. Der Client ist für die normale Verwendung und auf den durchschnittlichen Benutzer ausgerichtet werden und ermöglicht den Import von OpenVPN-Profilen ohne diese innerhalb der App ändern zu können. Dieser Client basiert auf der OpenVPN C++ Neuimplementierung des OpenVPN-Protokolls (Diese war erforderlich, damit OpenVPN Technologies, Inc, eine iOS-app von OpenVPN veröffentlichen onnte). Dieser Client ist auch der offizielle Client von OpenVPN Technologies, Inc. &lt; p&gt; OpenVPN Settings ist der älteste von den Clients und auch eine Benutzeroberfläche für das Open-Source OpenVPN. Im Gegensatz zu OpenVPN für Android es erfordert es Rootrechte und verwendet nicht die VPNService-API; benötigt aber auch nicht Android 4.0 +</string>
<string name="faq_androids_clients_title">Unterschiede zwischen Android OpenVPN Apps</string>
<string name="ignore_multicast_route">Ignoriere Multicastroute: %s</string>
<string name="ab_only_cidr">Android unterstützt nur CIDR Routen. Da Routen, die nicht CIDR sind, fast nie verwendet werden, wird OpenVPN für Android eine /32 Route für nicht konforme Routen verwenden und eine Warnung ausgegeben.</string>
@@ -359,6 +358,7 @@
<string name="ab_proxy">Android wird ihre Proxy-Einstellungen für die WLan-Verbindung beibehalten wenn keine DNS-Servereinstellungen vorhanden sind. OpenVPN für Android gibt einen entsprechenden Warnhinweis in der Log-Datei aus.<p> Wenn eine VPN-Verbindung einen DNS-Server vorgibt kann kein Proxy genutzt werden. Es gibt keine API um einen Proxy-Server für eine VPN-Verbindung zu nutzen.</p></string>
<string name="ab_lollipop_reinstall">Ihre VPN-Anwendung funktioniert möglicherweise nicht mehr wenn diese erst de- und später neu installiert wird. Für Details siehe #80074</string>
<string name="ab_not_route_to_vpn">Die konfigurierte Klient-IP-Adresse und die IP-Adressen in die Netzwerkmaske sind nicht in das VPN geroutet. OpenVPN umgeht diesen Fehler, indem eine Route hinzugefügt wird, die zu der Client-IP-Adresse und deren Netzmaske passt.</string>
+ <string name="ab_persist_tun">Beim Öffnen eines neuen VPN devices (tun) während eines bereits geöffnet ist (für persist-tun Unterstützung) führt zum Absturz des VPN Dienstes auf Android, der nur durch einen Neustart behoben werden kann. OpenVPN für Android versucht deshalb dieses erneute Öffnen zu vermeiden. Wenn ein erneutes Öffnen zwingend notwendig ist, wird erst das alte Device geschlossen before ein neues geöffnet wird. Dies kann dazu führen, dass teilweise Pakete unverschlüsselt über die normal Internetverbindung gesendet werden. Auch mit diesem Workaround stürzt teilweise der VPN Dienst ab und erfordert einen Neustart des Gerätes.</string>
<string name="ab_secondary_users">VPN funktioniert überhaupt nicht für die Sekundärnutzer.</string>
<string name="ab_kitkat_reconnect">Mehrere Benutzer berichten, dass die mobile Verbindung/Mobile Datenverbindung häufig getrennt wird, wenn ein VPN aktiv. Das Verhalten scheint nur einige Anbieter/Mobilgerät-Kombination beeinflussen und bisher konnte weder Ursache noch Lösung für den Bug identifiziert werden.</string>
<string name="ab_vpn_reachability_44">Nur Ziele, die ohne VPN erreichbar sind, sind auch mit VPN erreichbar. IPv6 VPNs funktionieren überhaupt nicht.</string>
@@ -373,4 +373,26 @@
<string name="custom_connection_options_warng">Definieren Sie benutzerdefinierte verbindungsspezifische Optionen. Seien Sie vorsichtig!</string>
<string name="custom_connection_options">Benutzerdefinierte Optionen</string>
<string name="remove_connection_entry">Verbindung entfernen</string>
+ <string name="ab_kitkat_reconnect_title">Sporadische Verlust der Verbindung mit dem Mobilfunknetz</string>
+ <string name="ab_vpn_reachability_44_title">Entfernte Netzwerkresourcen nicht erreichbar</string>
+ <string name="ab_persist_tun_title">Persistenter tun Modus</string>
+ <string name="version_and_later">%s und neuer</string>
+ <string name="tls_cipher_alert_title">Verbindung schlägt mit \"SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure\" fehl</string>
+ <string name="tls_cipher_alert">OpenVPN für die Android Versionen ab 0.6.29 (März 2015) verwenden einen sicheren Default für die zulässigen TLS Chiffren (\"DEFAULT:!EXP:!PSK:!SRP:!kRSA\"). Leider hat Weglassen der weniger sicheren Verschlüsselungschiffren und Exportchfriffen, vor allem aber der Wegfall der Cipher Suites, die keine Unterstützung für Perfect-Forward-Secrecy (Diffie-Hellman) einige Probleme verursacht. In der Regel sind dies gut gemeinte, aber schlecht ausgeführte Versuche, die TLS Sicherheit durch eine händische Wahl zu verbessern oder bei einigen eingebetteten Betriebssysteme mit abgespeckten OpenSSL (z.B. MikroTik).\n Um dieses Problem lösen das Problem, setzen Sie die TLS-Verschlüsselung Einstellungen auf dem Server auf einen sinnvollen Standardwert wie z.B. tls-cipher \"DEFAULT: EXP: PSK: SRP: KRSA\". Als Workaround für Problem auf dem Client, fügen Sie die benutzerdefinierte Option tls-cipher DEFAULT dem VPN Profil hinzu um die weniger sicheren Chiffren wieder zuzulassen.</string>
+ <string name="message_no_user_edit">Dieses Profil wurde von einer externen Anwendung (%s) hinzugefügt und als nicht vom Benutzer bearbeitbar markiert.</string>
+ <string name="crl_file">Zertifikatsperrliste</string>
+ <string name="service_restarted">Neustarten von OpenVPN Service (App vermutlich abgestürzt oder wegen Speicherdruck beendet)</string>
+ <string name="import_config_error">Importieren der Config ergab einen Fehler, kann diese nicht speichern</string>
+ <string name="Search">Suche</string>
+ <string name="lastdumpdate">(Letzten Dump ist %1$d:%2$dh alt (%3$s))</string>
+ <string name="clear_log_on_connect">Protokoll bei neuer Verbindung leeren</string>
+ <string name="connect_timeout">Verbindungstimeout</string>
+ <string name="no_allowed_app">Keine erlaubte App hinzgefügt. Füge die App selbst (%s) hinzu um wenigsten eine App in der Liste der nicht erlaubten Anwendungen zu haben</string>
+ <string name="query_permissions_sdcard">OpenVPN für Android kann versuchen, die fehlende(n) Datei(en) auf der SD-Karte automatisch zu finden. Tippen Sie auf diese Meldung um die Berechtigungsanfrage zu starten.</string>
+ <string name="protocol">Protokoll</string>
+ <string name="enabled_connection_entry">Aktiviert</string>
+ <string name="abi_mismatch">Bevorzugte native ABI Reihenfolge dieses Gerätes (%1$s) und die installierten nativen Bibliotheken (%2$s) unterscheiden sich</string>
+ <string name="months_left">Noch %d Monate gültig</string>
+ <string name="days_left">Noch %d Tage gültig</string>
+ <string name="hours_left">Noch %d Stunden gültig</string>
</resources>
diff --git a/app/src/main/res/values-es/strings-icsopenvpn.xml b/app/src/main/res/values-es/strings-icsopenvpn.xml
index f7ce4bf0..203e51dc 100755
--- a/app/src/main/res/values-es/strings-icsopenvpn.xml
+++ b/app/src/main/res/values-es/strings-icsopenvpn.xml
@@ -181,7 +181,6 @@ hacia/de Móvil)</string>
<string name="keychain_nocacert">No se obtuvo ningún certificado de CA al leer el almacén de claves de Android. La autenticación probablemente fallará.</string>
<string name="show_log_summary">Muestra la ventana de registro el conectarse. La ventana de registro siempre puede accederse desde el estado de la notificación.</string>
<string name="show_log_window">Mostrar ventana de registro</string>
- <string name="mobile_info">Ejecutándose en %1$s (%2$s) %3$s, API de Android %4$d</string>
<string name="error_rsa_sign">Error al firmar con la llave del almacén de llaves de Android %1$s: %2$s</string>
<string name="faq_system_dialogs">El aviso de conectividad VPN que esta aplicación puede interceptar todo el trafico esta impuesta por el sistema para evitar abusos de la API VPNService.\nLa notificación de conectividad (El símbolo de llave) también esta impuesta por el sistema Android para notificar una conexión VPN en curso. En algunas imágenes, esta notificación también emite un sonido.\nAndroid ha introducido estos diálogos de sistema para su seguridad e se ha asegurado que no pueden ser evitados. (En algunas imágenes, esto incluye la notificación sonora)</string>
<string name="faq_system_dialogs_title">Advertencia de conexión y sonido de notificación</string>
@@ -261,7 +260,6 @@ hacia/de Móvil)</string>
<string name="encryption_cipher">Algoritmo de encriptación</string>
<string name="packet_auth">Autenticación de paquetes</string>
<string name="auth_dialog_title">Introduzca método de autenticación de paquetes</string>
- <string name="mobile_info_extended">Corriendo sobre %1$s (%2$s) %3$s, API Android %4$d, versión %5$s, %6$s</string>
<string name="built_by">compilado por %s</string>
<string name="debug_build">versión de depuración</string>
<string name="official_build">versión oficial</string>
@@ -351,7 +349,7 @@ hacia/de Móvil)</string>
<string name="duplicate_vpn">Duplicar perfil VPN</string>
<string name="duplicate_profile_title">Duplicando Perfil: %s</string>
<string name="show_log">Mostrar registro</string>
- <string name="faq_android_clients">Existen múltiples clientes OpenVPN para Android. Los más comunes son OpenVPN para Android (este cliente), OpenVPN Connect y Configuración de OpenVPN&lt;p&gt;Los clientes se pueden agrupar en dos grupos:. OpenVPN para Android y OpenVPN Conectar utilizar la API VPNService oficial (Android 4.0+) y requieren ninguna raíz y Configuración de OpenVPN que utiliza la raíz.&lt;p&gt;OpenVPN para Android es un cliente de código abierto y desarrollado por Arne Schwabe. Está dirigido a los usuarios más avanzados y ofrece muchas opciones y la posibilidad de importar los perfiles de los archivos y configurar perfiles / cambio dentro de la aplicación. El cliente se basa en la versión de la comunidad de OpenVPN. Se basa en el código fuente 2.x OpenVPN. Este cliente puede ser visto como el semi oficialmente cliente de la comunidad.&lt;p&gt;OpenVPN Connect es cliente de código abierto no que es desarrollado por OpenVPN Technologies, Inc. El cliente tiene sangría para ser cliente de uso general y moree dirigido al usuario medio y permite la importación de perfiles de OpenVPN. Este cliente se basa en la reimplementación OpenVPN C ++ del protocolo OpenVPN (Esto fue necesario para permitir Tecnologías OpenVPN, Inc para publicar una aplicación para iOS OpenVPN). Este cliente es el cliente oficial de las tecnologías deO penVPN&lt;p&gt; OpenVPN Ajustes es el más antiguo de los clientes y también una interfaz de usuario para el software libre OpenVPN. En contraste con OpenVPN para Android requiere raíz y no utiliza el API VPNService. No depende de Android 4.0+</string>
+ <string name="faq_android_clients">Existen múltiples clientes OpenVPN para Android. Los más comunes son OpenVPN para Android (este cliente), OpenVPN Connect y Configuración de OpenVPN&lt;p&gt;Los clientes se pueden agrupar en dos grupos:. OpenVPN para Android y OpenVPN Conectar utilizar la API VPNService oficial (Android 4.0+) y requieren ninguna raíz y Configuración de OpenVPN que utiliza la raíz.&lt;p&gt;OpenVPN para Android es un cliente de código abierto y desarrollado por Arne Schwabe. Está dirigido a los usuarios más avanzados y ofrece muchas opciones y la posibilidad de importar los perfiles de los archivos y configurar perfiles / cambio dentro de la aplicación. El cliente se basa en la versión de la comunidad de OpenVPN. Se basa en el código fuente 2.x OpenVPN. Este cliente puede ser visto como el semi oficialmente cliente de la comunidad.&lt;p&gt;OpenVPN Connect es cliente de código abierto no que es desarrollado por OpenVPN Technologies, Inc. El cliente tiene sangría para ser cliente de uso general y moree dirigido al usuario medio y permite la importación de perfiles de OpenVPN. Este cliente se basa en la reimplementación OpenVPN C ++ del protocolo OpenVPN (Esto fue necesario para permitir Tecnologías OpenVPN, Inc para publicar una aplicación para iOS OpenVPN). Este cliente es el cliente oficial de las tecnologías de OpenVPN&lt;p&gt; OpenVPN Ajustes es el más antiguo de los clientes y también una interfaz de usuario para el software libre OpenVPN. En contraste con OpenVPN para Android requiere raíz y no utiliza el API VPNService. No depende de Android 4.0+</string>
<string name="faq_androids_clients_title">Differences between the OpenVPN Android clients</string>
<string name="ignore_multicast_route">Haciendo caso omiso de ruta multidifusión: %s</string>
<string name="ab_only_cidr">Android sólo admite rutas CIDR a la VPN. Desde rutas no CIDR casi nunca se usan, OpenVPN para Android utilizará un / 32 para las rutas que no son CIDR y emitir una advertencia.</string>
diff --git a/app/src/main/res/values-et/strings-icsopenvpn.xml b/app/src/main/res/values-et/strings-icsopenvpn.xml
index a132ed7a..dcc134bf 100755
--- a/app/src/main/res/values-et/strings-icsopenvpn.xml
+++ b/app/src/main/res/values-et/strings-icsopenvpn.xml
@@ -180,7 +180,7 @@
<string name="keychain_nocacert">Androidi võtmehoidlast lugemine ei andnud ühtegi CA sertifikaati. Suure tõenäosusega autentimine ebaõnnestub.</string>
<string name="show_log_summary">Näitab ühendumisel logiakent. Logiakna saab alati ette manada VPN teatisealast.</string>
<string name="show_log_window">Näita logiakent</string>
- <string name="mobile_info">Töötamas %1$s (%2$s) %3$s peal, Android API %4$d</string>
+ <string name="mobile_info">%10$s %9$s töötab seadmel %3$s %1$s (%2$s), Android %6$s (%7$s) API %4$d, ABI %5$s, (%8$s)</string>
<string name="error_rsa_sign">Viga allkirjastamisel Androidi võtmehoidla võtmega %1$s: %2$s</string>
<string name="faq_system_dialogs">VPN ühendumisel ilmub ekraanile hoiatus et see programm võib pealt kuulata kogu võrguliiklust. Tegemist on VPNService API süsteemse hoiatusega et hoida ära väärkasutust.\nVPN ühenduse teatis (Võtme sümbol) on samuti VPNService API poolt kuvatav aktiivse VPN ühenduse indikaator. Mõne süsteemitarkvara puhul võib see indikaator anda märku ka heliga.\nNeed teatised on Androidi süsteemile lisatud teie turvalisuse tagamiseks ja samuti on välistatud nende kasutamisest mööda minemine. (Kahjuks tähendab see seda et mõne süsteemitarkvara puhul kaasneb ühendusega alati ka heliteade)</string>
<string name="faq_system_dialogs_title">Hoiatused ja helimärguanded ühenduse loomisel</string>
@@ -260,7 +260,6 @@
<string name="encryption_cipher">Krüptošiffer</string>
<string name="packet_auth">Pakettide autentimine</string>
<string name="auth_dialog_title">Sisestage pakettide autentimismeetod</string>
- <string name="mobile_info_extended">Töötab seadmel %1$s (%2$s) %3$s, Android API %4$d, versioon %5$s, %6$s</string>
<string name="built_by">Kompileerija: %s</string>
<string name="debug_build">Silumisversioon</string>
<string name="official_build">Ametlik versioon</string>
@@ -374,4 +373,26 @@
<string name="custom_connection_options_warng">Seadista kohandatavad ühendusespetsiifilised valikud. Kasuta ettevaatlikult</string>
<string name="custom_connection_options">Kohandatavad valikud</string>
<string name="remove_connection_entry">Eemalda ühenduse kirje</string>
+ <string name="ab_kitkat_reconnect_title">Pistelised mobiilivõrgu katkestused</string>
+ <string name="ab_vpn_reachability_44_title">Kaugvõrgud on väljaspool ulatust</string>
+ <string name="ab_persist_tun_title">Püsiv tun režiim</string>
+ <string name="version_and_later">%s ja hilisem</string>
+ <string name="tls_cipher_alert_title">Ühendused nurjuvad teatega SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure</string>
+ <string name="tls_cipher_alert">Uuemad OpenVPN for Android versioonid (0.6.29/Märts 2015) kasutavad turvalisemat vaikešifrikoplekti (tls-cipher \"DEFAULT:!EXP:!PSK:!SRP:!kRSA\"). Paraku tekitab nõrgemate šifri- ning eksportšifrikomplektide vältimine, eriti nende šifrikomplektide mis ei toeta Täiuslikku Edastussaladust (Diffie-Hellman), mõningaid probleeme. Probleemid esinevad tavaliselt heade kavatsustega, kuid viletsa teostusega TLS tugevdamise katsetel, valides serveris tls-šifri mõnede kärbitud SSL algoritmiga põim-operatsioonisüsteemidel (n.n. MkroTik).\nProbleemi lahendamiseks seadke serveri tls-šifri parameetrid mõistlikule vaikeväärtusele nagu \"DEFAULT:!EXP:!PSK:!SRP:!kRSA\". Kliendipoolseks lahenduseks lisage Androidi klientseadme tls-šifri kohandatud parameetriks DEFAULT.</string>
+ <string name="message_no_user_edit">Selle profiili lisas väline programm (%s) ning see on tähistatud kui kasutajale muudetamatu.</string>
+ <string name="crl_file">Sertifikaadi tühistusnimekiri</string>
+ <string name="service_restarted">OpenVPN teenuse taaskäivitamine (Programm jooksis tõenäoliselt kokku või suleti mälusurve tõttu)</string>
+ <string name="import_config_error">Seadistuse importimine lõppes veaga, salvestamine ebaõnnestus</string>
+ <string name="Search">Otsing</string>
+ <string name="lastdumpdate">(Viimne tõmmis on %1$d:%2$dh vana (%3$s))</string>
+ <string name="clear_log_on_connect">Järgmisel ühendumisel tühjenda logi</string>
+ <string name="connect_timeout">Ühenduse ajalõpp</string>
+ <string name="no_allowed_app">Lisati lubamatu programm. Lisame ennast (%s) et lubatud programmide seas oleks vähemalt üks ja ei lubataks kõiki programme</string>
+ <string name="query_permissions_sdcard">OpenVPN for Android võib üritada leida automaatselt sd-kaardi puuduvad failid. Koputa seda teadet et algatada õiguste tellimine.</string>
+ <string name="protocol">Protokoll</string>
+ <string name="enabled_connection_entry">Lubatud</string>
+ <string name="abi_mismatch">Selle seadme eelistatud ABI eelisjärjekord (%1$s) ja seadme kaasnevate teekide teatatud ABI (%2$s) ei ühildu</string>
+ <string name="months_left">Jäänud on %d kuud</string>
+ <string name="days_left">jäänud on %d päeva</string>
+ <string name="hours_left">Jäänud on %d tundi</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 d5ab917c..3e9b416c 100755
--- a/app/src/main/res/values-fr/strings-icsopenvpn.xml
+++ b/app/src/main/res/values-fr/strings-icsopenvpn.xml
@@ -180,7 +180,6 @@
<string name="keychain_nocacert">"Aucun certificat CA renvoyée lors de la lecture depuis le gestionnaire de clés. L\'authentification échouera probablement."</string>
<string name="show_log_summary">"Affiche la fenêtre de log à la connexion. Cette fenêtre peut toujours être consultée à partir de la notification d\'état."</string>
<string name="show_log_window">"Afficher la fenêtre de log"</string>
- <string name="mobile_info">"Fonctionnant sur %1$s (%2$s) %3$s , Android API %4$d"</string>
<string name="error_rsa_sign">"Erreur de signature de la clé %1$s : %2$s par le gestionnaire d\'Android"</string>
<string name="faq_system_dialogs">\"L\'avertissement de connexion au VPN qui vous informe que cette application peut intercepter tout le trafic est imposé par le système pour éviter les abus de l\'API du service VPN.\nLa notification de connexion au VPN (Le symbole qui ressemble à une clé) est aussi imposé par le système Android pour signaler une connexion VPN en cours de fonctionnement.
Sur certaines images, cette notification joue un son.\nAndroid à introduit ces dialogues système pour votre propre sécurité et à fait en sorte d\'être impossible à contourner. (Cela peut inclure en plus une notification sonore pour certaines images)\"</string>
@@ -261,7 +260,6 @@ Sur certaines images, cette notification joue un son.\nAndroid à introduit ces
<string name="encryption_cipher">Chiffrement de cryptage</string>
<string name="packet_auth">Authentification des paquets</string>
<string name="auth_dialog_title">Méthode d\'authentification des paquets</string>
- <string name="mobile_info_extended">Environnement: %1$s (%2$s) %3$s, Android API %4$d, version %5$s, %6$s</string>
<string name="built_by">compilé par %s</string>
<string name="debug_build">version de debug</string>
<string name="official_build">version officielle</string>
@@ -317,7 +315,7 @@ Sur certaines images, cette notification joue un son.\nAndroid à introduit ces
<string name="faq_system_dialog_xposed">Si vous avez \"rooté\" votre Android vous pouvez installer &lt;a href=\"http://xposed.info/\"&gt;Xposed framework&lt;/a&gt; et &lt;a href=\"http://repo.xposed.info/module/de.blinkt.vpndialogxposed\"&gt;le module de confirmation VPN&lt;/a&gt; à vos risques et périls\"</string>
<string name="full_licenses">Licences complètes</string>
<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 utiliser le VPN pour les réseaux locaux</string>
+ <string name="blocklocal_title">Bypass 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>
@@ -350,4 +348,5 @@ Sur certaines images, cette notification joue un son.\nAndroid à introduit ces
<string name="no_remote_defined">No remote defined</string>
<string name="duplicate_vpn">Dupliquer le profil VPN</string>
<string name="duplicate_profile_title">Duplicating profile: %s</string>
+ <string name="show_log">Afficher le journal</string>
</resources>
diff --git a/app/src/main/res/values-hu/strings-icsopenvpn.xml b/app/src/main/res/values-hu/strings-icsopenvpn.xml
index 5be8bbc4..fcdf3f23 100755
--- a/app/src/main/res/values-hu/strings-icsopenvpn.xml
+++ b/app/src/main/res/values-hu/strings-icsopenvpn.xml
@@ -60,7 +60,7 @@
<string name="cancel_connection">Szétkapcsolás</string>
<string name="cancel_connection_long">VPN kapcsolat szétkapcsolása</string>
<string name="clear_log">napló törlése</string>
- <string name="title_cancel">jóváhagyás törlése</string>
+ <string name="title_cancel">Megszakítás jóváhagyása</string>
<string name="cancel_connection_query">VPN kapcsolat/kapcsolódás megszakítása?</string>
<string name="remove_vpn">VPN kapcsolat eltávolítása</string>
<string name="check_remote_tlscert">Ellenőrzi, hogy a kiszolgáló használ-e tanúsitványt TLS Server kiterjesztéssel (--remote-cert-tls server)</string>
@@ -111,7 +111,7 @@
<string name="route_not_netip">Az %1$s/%2$s útvonal javítva: %3$s/%2$s</string>
<string name="keychain_access">Nem sikerült hozzáférni az Android Keychain Tanúsivànyokhoz. Ezt egy firmware frissítés vagy az alkalmazás/beállításainak visszaállítása okozhatja. Kérem szerkessze meg a VPN-t, és újra válassza ki a tanúsítványokat az alapvető beállításoknál, hogy visszaálljanak a tanúsítványok hozzáférési jogai.</string>
<string name="version_info">%1$s %2$s</string>
- <string name="send_logfile">naplófájl küldése</string>
+ <string name="send_logfile">Naplófájl küldése</string>
<string name="send">küld</string>
<string name="ics_openvpn_log_file">ICS OpenVPN naplófájl</string>
<string name="copied_entry">Naplóbejegyzés másolva a vágólapra</string>
@@ -178,7 +178,6 @@
<string name="keychain_nocacert">Nem jött vissza CA tanúsítvány az Android keystore olvasása során. A hitelesítés valószínűleg sikertelen lesz.</string>
<string name="show_log_summary">Napló ablak mutatása a csatlakozás alatt. A napló ablak mindig elérető a rolóról is.</string>
<string name="show_log_window">Naplózási ablak mutatása</string>
- <string name="mobile_info">%1$s (%2$s) %3$s, Android API %4$d</string>
<string name="error_rsa_sign">Hiba az Android keystore %1$s: %2$s kulccsal való belépéskor</string>
<string name="faq_system_dialogs_title">Kapcsolat figyelmeztetés és értesítés hang</string>
<string name="translationby">A magyar fordítást készítette Juhász Sándor &lt;msc@digitaltrip.hu&gt;</string>
@@ -251,7 +250,6 @@
<string name="encryption_cipher">Titkosítás</string>
<string name="packet_auth">Csomag hitelesítés</string>
<string name="auth_dialog_title">Adja meg a csomaghitelesítési metódust</string>
- <string name="mobile_info_extended">%1$s (%2$s) %3$s, Android API %4$d, %5$s, %6$s verzió</string>
<string name="built_by">%s fordítóval</string>
<string name="debug_build">hibakeresési fordítás</string>
<string name="official_build">hivatalos build</string>
@@ -274,6 +272,8 @@
<string name="screenoff_pause">Kapcsolat szüneteltetése a képernyő kikapcsolt állapotában: kevesebb mint %1$s %2$ss alatt</string>
<string name="screen_nopersistenttun">Figyelmeztetés: Megmaradó tun nem engedélyezett ehhez a VPN-hez. A forgalom a normál internetcsatlakozáson megy amikor a képernyő ki van kapcsolva.</string>
<string name="save_password">Jelszó mentése</string>
+ <string name="logCleared">Napló törölve.</string>
+ <string name="show_password">Jelszó mutatása</string>
<string name="timestamp_short">Rövid</string>
<string name="timestamp_iso">ISO</string>
<string name="timestamps">Időbélyegzők</string>
@@ -284,4 +284,24 @@
<string name="logview_options">Nézet beállításai</string>
<string name="unhandled_exception">Nem kezelt kivétel: %1$s\n\n%2$s</string>
<string name="full_licenses">Teljes engedélyek</string>
+ <string name="userpw_file">Felhasználónév/Jelszó fájl</string>
+ <string name="imported_from_file">[Innen importálva: %s]</string>
+ <string name="files_missing_hint">Néhány fájl nem található. Kérlek válaszd ki a fájlokat a profil importálásához:</string>
+ <string name="import_log">Importálási napló:</string>
+ <string name="loading">Betöltés&#8230;</string>
+ <string name="allowed_vpn_apps_info">Engedélyezett VPN programok: %1$s</string>
+ <string name="disallowed_vpn_apps_info">Letiltott VPN programok: %1$s</string>
+ <string name="app_no_longer_exists">%s csomag már nincs telepítve, eltávolítás a program engedélyező/letiltó listáról</string>
+ <string name="keep">Megtartás</string>
+ <string name="delete">Törlés</string>
+ <string name="server_list">Szerver lista</string>
+ <string name="show_log">Napló mutatása</string>
+ <string name="custom_connection_options">Egyéni beállítások</string>
+ <string name="version_and_later">%s és később</string>
+ <string name="Search">Keresés</string>
+ <string name="protocol">Protokoll</string>
+ <string name="enabled_connection_entry">Engedélyezett</string>
+ <string name="months_left">%d hónap van hátra</string>
+ <string name="days_left">%d nap van hátra</string>
+ <string name="hours_left">%d óra van hátra</string>
</resources>
diff --git a/app/src/main/res/values-in/strings-icsopenvpn.xml b/app/src/main/res/values-in/strings-icsopenvpn.xml
index 07331433..07415d29 100755
--- a/app/src/main/res/values-in/strings-icsopenvpn.xml
+++ b/app/src/main/res/values-in/strings-icsopenvpn.xml
@@ -7,9 +7,9 @@
<resources>
<string name="address">Alamat Server:</string>
- <string name="port">Port server:</string>
+ <string name="port">Server Port:</string>
<string name="location">Lokasi</string>
- <string name="cant_read_folder">Gagal membaca direktori</string>
+ <string name="cant_read_folder">Gagal membaca direktori:</string>
<string name="select">Pilih</string>
<string name="cancel">Batal</string>
<string name="no_data">Tak ada data</string>
@@ -20,33 +20,33 @@
<string name="client_pkcs12_title">Berkas PKCS12</string>
<string name="ca_title">Sertifikat CA</string>
<string name="no_certificate">Anda harus memilih sertifikat</string>
- <string name="copyright_guicode">Kode program dan perekam masalah tersedia di</string>
- <string name="copyright_others">Aplikasi memakai komponen berikut; lihat kode program untuk lebih jelas mengenai lisensi</string>
- <string name="about">Tentang…</string>
+ <string name="copyright_guicode">Kode sumber dan pelacak masalah tersedia di http://code.google.com/p/ics-openvpn/</string>
+ <string name="copyright_others">Program ini menggunakan komponen-komponen berikut ini; lihat kode sumber penjelasan lengkap mengenai lisensi</string>
+ <string name="about">Tentang</string>
<string name="vpn_list_title">Profil</string>
- <string name="vpn_type">Tipe</string>
+ <string name="vpn_type">Jenis</string>
<string name="pkcs12pwquery">Password PKCS12</string>
<string name="file_select">Pilih&#8230;</string>
- <string name="file_nothing_selected">Anda harus memilih berkas (file)</string>
- <string name="useTLSAuth">Pakai otentikasi TLS</string>
+ <string name="file_nothing_selected">Anda harus memilih setidaknya satu berkas</string>
+ <string name="useTLSAuth">Gunakan Autentikasi TLS</string>
<string name="tls_direction">Pengarah TLS</string>
- <string name="ipv6_dialog_tile">Masukkan IPv6 Address/Netmask dalam format CIDR (contoh: 2000:dd::23/64)</string>
+ <string name="ipv6_dialog_tile">Masukkan Alamat IPv6/Netmask dalam Format CIDR (contoh: 2000:dd::23/64)</string>
<string name="ipv4_dialog_title">Masukkan IPv4 Address/Netmask dalam format CIDR (contoh: 1.2.3.4/24)</string>
<string name="ipv4_address">Alamat IPv4</string>
<string name="ipv6_address">Alamat IPv6</string>
- <string name="custom_option_warning">Masukan seting openvpn. Gunakan dengan hati-hati. Harap dicatat, TUN yanng terkait seting OpenVPN tidak didukung oleh VPNsettings. Jika anda berpikir ada hal penting belum tersedia, hubungi pembuatnya</string>
+ <string name="custom_option_warning">Masukan pengaturan kustom OpenVPN. Harap gunakan dengan hati-hati. Perlu dicatat bahwa pengaturan yang terkait dengan TUN OpenVPN tidak didukung oleh disain VPNSettings. Jika anda fikir ada hal penting yang belum tersedia segera hubungi pembuatnya</string>
<string name="auth_username">Nama Penguna</string>
- <string name="auth_pwquery">Password</string>
- <string name="static_keys_info">Untuk konfigurasi statis, kunci otentifikasi TLS akan digunakan sebagai kunci konfigurasi statis</string>
+ <string name="auth_pwquery">Kata Sandi</string>
+ <string name="static_keys_info">Untuk pengaturan tetap, kunci otentifikasi TLS akan digunakan sebagai kunci statis</string>
<string name="configure_the_vpn">Konfigurasi VPN</string>
<string name="menu_add_profile">Tambah Profil</string>
<string name="add_profile_name_prompt">Masukkan nama profil yang baru</string>
- <string name="duplicate_profile_name">Silakan masukan UPN (Unique Profile Name)</string>
+ <string name="duplicate_profile_name">Silakan masukan nama profil yang berbeda</string>
<string name="profilename">Nama profil</string>
<string name="no_keystore_cert_selected">Anda harus memilih sertifikat pengguna</string>
<string name="no_error_found">Tidak ada kesalahan</string>
<string name="config_error_found">Konfigurasi Salah</string>
- <string name="ipv4_format_error">Gagal menganalisa alamat IPV4</string>
+ <string name="ipv4_format_error">Kesalahan penulisan alamat IPV4</string>
<string name="custom_route_format_error">Gagal menganalisa rute buatan</string>
<string name="pw_query_hint">(biarkan kosong untuk antrian permintaan)</string>
<string name="vpn_shortcut">Jalan Pintas OpenVPN</string>
@@ -55,7 +55,7 @@
<string name="random_host_prefix">Acak awalan Host </string>
<string name="random_host_summary">Tambah 6 karakter acak di depan nama host</string>
<string name="custom_config_title">Aktifkan pilihan buatan</string>
- <string name="custom_config_summary">Tentukan seting buatan. Gunakan hati-hati</string>
+ <string name="custom_config_summary">Tentukan seting buatan. Gunakan hati-hati!</string>
<string name="route_rejected">Rute ditolak Android</string>
<string name="cancel_connection">Putus</string>
<string name="cancel_connection_long">Memutuskan sambungan VPN</string>
@@ -77,7 +77,7 @@
<string name="dns">DNS</string>
<string name="override_dns">Menimpa pengaturan DNS oleh Server</string>
<string name="dns_override_summary">Gunakan server DNS pribadi</string>
- <string name="searchdomain">Cari domain</string>
+ <string name="searchdomain">cari domain</string>
<string name="dns1_summary">Server DNS yang akan digunakan</string>
<string name="dns_server">Server DNS</string>
<string name="secondary_dns_message">Server DNS sekunder digunakan jika Server DNS yang normal tidak dapat dicapai.</string>
@@ -100,22 +100,24 @@
<string name="tun_open_error">Gagal membuka layanan antarmuka TUN</string>
<string name="error">"Kesalahan: "</string>
<string name="clear">Bersihkan</string>
- <string name="last_openvpn_tun_config">Membuka interface tun :</string>
- <string name="local_ip_info">IPv4 lokal : %1$s/%2$d IPv6: %3$s MTU: %4$d</string>
+ <string name="last_openvpn_tun_config">Membuka interface tun:</string>
+ <string name="local_ip_info">IPv4 lokal: %1$s/%2$d IPv6: %3$s MTU: %4$d</string>
<string name="dns_server_info">DNS Server: %1$s, Domain: %2$s</string>
<string name="routes_info_incl">Rute: %1$s %2$s</string>
+ <string name="routes_info_excl">Rute terkecualikan: %1$s %2$s</string>
+ <string name="routes_debug">Rute LayananVpn telah terpasang: %1$s %2$s</string>
<string name="ip_not_cidr">Memilki informasi antarmuka %1$s dan %2$s, asumsi alamat kedua adalah alamat remote. Menggunakan netmask /32 untuk IP lokal. Mode yang diberikan oleh OpenVPN adalah \"%3$s\".</string>
<string name="route_not_cidr">Tidak masuk akal membuat %1$s dan %2$s sebagai rute IP dengan netmask CIDR, Gunakan /32 sebagai netmask.</string>
- <string name="route_not_netip">rute yang diperbaiki %1$s/%2$s hingga %3$s/%2$s</string>
+ <string name="route_not_netip">Rute yang diperbaiki %1$s/%2$s hingga %3$s/%2$s</string>
<string name="keychain_access">Tidak dapat mengakses sertifikat Keychain Android. Dapat disebabkan karena upgrade firmware atau pengembalian backup pengaturan app. Mohon ubah VPN, dan pilih ulang sertifikat berbasis pengaturan dasar agar izin mengakses sertifikat dapat dibuat ulang.</string>
<string name="version_info">%1$s %2$s</string>
<string name="send_logfile">Kirim berkas catatan</string>
<string name="send">Kirim</string>
<string name="ics_openvpn_log_file">Berkas catatan ICS OpenVPN</string>
<string name="copied_entry">Salin catatan masuk ke clipboard</string>
- <string name="tap_mode">Mode TAP</string>
+ <string name="tap_mode">Mode Tap</string>
<string name="faq_tap_mode">Mode TAP tidak diijinkan tanpa VPN API non admin/root. Karena itu aplikasi ini tidak dapat memberikan dukungan mode TAP</string>
- <string name="tap_faq2">Lagi ? Becanda ? mode TAP benar-benar tidak didukung dan mengirim email menanyakan apakah akan ada dukungan TAP, tidak akan membantu</string>
+ <string name="tap_faq2">Lagi? Becanda? mode Tap benar-benar tidak didukung dan mengirim email menanyakan apakah akan ada dukungan Tap, tidak akan membantu.</string>
<string name="tap_faq3">Untuk ketiga kalinya? Sebenarnya, seseorang bisa menulis emulator TAP berdasarkan tun yang akan menambahkan lapisan2 informasi pengiriman dan lapisan2 informasi penerimaan. Tapi emulator TAP ini juga harus menerapkan ARP dan mungkin klien DHCP. Saya tidak tau apakah ada yang bekerja ke arah ini. Hubungi saya jika Anda ingin memulai menulis kode2 emulator TAP ini.</string>
<string name="faq">FAQ</string>
<string name="copying_log_entries">Menyalin catatan</string>
@@ -138,11 +140,11 @@
<string name="menu_import_short">Ambil</string>
<string name="import_content_resolve_error">Tidak dapat membaca profil yang akan diambil</string>
<string name="error_reading_config_file">Kesalahan membaca berkas konfigurasi</string>
- <string name="add_profile">Tambah Profil</string>
+ <string name="add_profile">tambah Profil</string>
<string name="import_could_not_open">Tidak dapat menemukan berkas %1$s yang disebut dalam berkas konfigurasi</string>
<string name="importing_config">Mengambil berkas konfigurasi dari sumber %1$s</string>
<string name="import_warning_custom_options">Konfigurasi Anda memiliki beberapa pilihan konfigurasi yang tidak dipetakan ke konfigurasi UI. Pilihan ini ditambahkan sebagai opsi konfigurasi kustom. Konfigurasi kustom ditampilkan di bawah ini:</string>
- <string name="import_done">Berkas konfigurasi selesai dibaca</string>
+ <string name="import_done">Berkas konfigurasi selesai dibaca.</string>
<string name="nobind_summary">Jangan kaitkan ke alamat dan port lokal</string>
<string name="no_bind">Tidak ada ikatan lokal</string>
<string name="import_configuration_file">Ambil berkas konfigurasi</string>
@@ -178,7 +180,7 @@
<string name="keychain_nocacert">Tidak ada sertifikat CA yang didapat saat membaca dari Android Keystore. Otentifikasi mungkin gagal</string>
<string name="show_log_summary">Tampilkan jendela catatan saat terkoneksi. Jendela catatan juga dapat diakses melalui status notifikasi</string>
<string name="show_log_window">Tampilkan jendela catatan</string>
- <string name="mobile_info">Berjalan di %1$s (%2$s) %3$s, Android API %4$d</string>
+ <string name="mobile_info">%10$s %9$s berjalan pada %3$s %1$s (%2$s), Android %6$s (%7$s) API %4$d, ABI %5$s, (%8$s)</string>
<string name="error_rsa_sign">Kesalahan masuk dengan kunci Android keystore %1$s: %2$s</string>
<string name="faq_system_dialogs">Peringatan sambungan VPN yang memberitahukan Anda bahwa aplikasi ini dapat mencegat semua lalu lintas dikeluarkan oleh sistem untuk mencegah penyalahgunaan dari sambungan VPNService API.\nPemberitahuan sambungan VPN (simbol kunci) juga dikeluarkan oleh sistem Android untuk memberitahu VPN yang sedang berlangsung. Pada beberapa gambar pemberitahuan ini memainkan suara. \nAndroid memperkenalkan sistem dialog ini untuk keselamatan Anda sendiri dan memastikan bahwa mereka tidak membuat masalah. (Pada beberapa gambar sayangnya ini termasuk peringatan suara)</string>
<string name="faq_system_dialogs_title">Peringatan sambungan dan pemberitahuan melalui suara</string>
@@ -191,6 +193,7 @@
<string name="export_config_title">Konfigurasi ICS Openvpn</string>
<string name="warn_no_dns">Tidak DNS server yang digunakan. Name Resolution mungkin akan gagal bekerja. Pertimbangkan pengaturan server DNS. Harap dicatat Android akan terus memakai pengaturan proxy untuk koneksi mobile/wifi saat tidak ada server DNS diatur.</string>
<string name="dns_add_error">Tak bisa menambahkan Server DNS \"%1$s\", ditolak oleh sistem: %2$s</string>
+ <string name="ip_add_error">Tidak bisa mengkonfigurasi IP Address \"%1$s\", ditolak oleh sistem: %2$s</string>
<string name="faq_howto">&lt;p&gt; Ambil konfigurasi yang dapat berjalan (diuji pada komputer Anda atau download dari penyedia/organisasi) &lt;/p&gt; &lt;p&gt; Satu file(berkas) saja tanpa tambahan berkas pem/pks12. Anda dapat kirim imel berkas dan membuka lampirannya. Jika Anda memiliki beberapa berkas, salin ke sd-card &lt;/p&gt; &lt;p&gt; klik pada lampiran imel atau gunakan ikon folder dalam daftar vpn untuk mengimpor berkas konfigurasi &lt;/p&gt; &lt;p&gt; jika ada berkas yang kurang, salin file hilang ke sd-card. &lt;/p&gt; &lt;p&gt; klik pada simbol Simpan untuk menambahkan VPN yang diimpor ke daftar VPN &lt;/p&gt; &lt;p &gt; Connect VPN dengan mengklik nama VPN &lt;/p&gt; &lt;p&gt; jika ada kesalahan atau peringatan di catatan, coba pahami peringatannya dan coba untuk memperbaikinya &lt;/p&gt; </string>
<string name="faq_howto_title">Mulai Cepat</string>
<string name="setting_loadtun_summary">Coba pakai tun.ko kernel sebelum mencoba koneksi. Membutuhkan perangkat yang sudah diroot. Google: android superuser</string>
@@ -215,6 +218,7 @@
<string name="vpn_import_hint">Gunakan ikon &lt; img src = \"ic_menu_archive\" / &gt; untuk mengimpor profil (.ovpn atau .conf) yang ada dari sdcard Anda.</string>
<string name="faq_hint">Pastikan untuk juga memeriksa FAQ. Ada petunjuk untuk memudahkan anda.</string>
<string name="faq_routing_title">Konfigurasi rute\antarmuka</string>
+ <string name="faq_routing">Konfigurasi Routing dan antarmuka tidak dilakukan melalui perintah ifconfig/rute tradisional tetapi dengan menggunakan VPNService API. Ini hasil dalam konfigurasi perutean berbeda daripada pada OS lain. \nThe konfigurasi VPN terowongan terdiri dari alamat IP dan jaringan yang harus dialihkan melalui antarmuka ini. Terutama, tidak ada rekan mitra alamat atau alamat gateway adalah diperlukan atau diperlukan. Khusus rute untuk mencapai VPN Server (misalnya ditambahkan dengan menggunakan redirect-gateway) tidak diperlukan baik. Aplikasi akibatnya akan mengabaikan pengaturan ini ketika mengimpor konfigurasi. App menjamin dengan VPNService API bahwa koneksi ke server tidak diarahkan melalui VPN terowongan. \nThe VPNService API tidak memungkinkan menentukan jaringan yang tidak dapat diteruskan melalui VPN. Sebagai solusi app mencoba untuk mendeteksi jaringan yang tidak dapat diteruskan melalui terowongan (misalnya rute x.x.x.x y.y.y.y net_gateway) dan menghitung seperangkat rute yang mengecualikan ini rute untuk meniru perilaku platform lainnya. Jendela log menunjukkan konfigurasi VPNService berdasarkan membangun koneksi. \nBehind adegan: Android 4,4 + menggunakan kebijakan routing. Menggunakan rute ifconfig tidak akan menunjukkan rute yang diinstal. Alih-alih menggunakan aturan ip, iptables -t mangle -L</string>
<string name="persisttun_summary">Jangan kembali ke status tidak ada koneksi VPN ketika OpenVPN mencoba terhubung kembali.</string>
<string name="persistent_tun_title">Paksa mode TUN</string>
<string name="openvpn_log">Catatan OpenVPN</string>
@@ -256,7 +260,6 @@
<string name="encryption_cipher">Enkripsi sandi</string>
<string name="packet_auth">Otentikasi paket</string>
<string name="auth_dialog_title">Masukkan metode otentikasi paket</string>
- <string name="mobile_info_extended">Berjalan pada Android API %4$d, versi %5$s %1$s (%2$s) %3$s, %6$s</string>
<string name="built_by">dibangun oleh %s</string>
<string name="debug_build">Pengembangan debug</string>
<string name="official_build">Build Resmi</string>
@@ -271,6 +274,7 @@
<string name="tls_remote_deprecated">TLS-remote (DEPRECATED)</string>
<string name="help_translate">Anda dapat membantu menerjemahkan dengan mengunjungi http://crowdin.net/project/ics-openvpn/invite</string>
<string name="prompt">%1$s berusaha mengendalikan %2$s</string>
+ <string name="remote_warning">Dengan melanjutkan, Anda memberi izin aplikasi untuk sepenuhnya mengontrol OpenVPN untuk Android dan untuk mencegat semua lalu lintas jaringan. <b>Jangan terima kecuali Anda mempercayai aplikasi.</b> Jika tidak, data Anda beresiko diambil oleh perangkat lunak jahat.\"</string>
<string name="remote_trust">Saya percaya aplikasi ini.</string>
<string name="no_external_app_allowed">App tidak diizinkan untuk menggunakan API eksternal</string>
<string name="allowed_apps">apps yang diijinkan : %s</string>
@@ -288,4 +292,85 @@
<string name="cannotparsecert">Tidak dapat menampilkan informasi sertifikat</string>
<string name="appbehaviour">Prilaku Aplikasi</string>
<string name="vpnbehaviour">Prilaku VPN</string>
+ <string name="allow_vpn_changes">Memungkinkan perubahan Profil VPN</string>
+ <string name="hwkeychain">Hardware Keystore:</string>
+ <string name="permission_icon_app">Ikon aplikasi mencoba menggunakan OpenVPN untuk Android</string>
+ <string name="faq_vpndialog43">"Dimulai dengan Android 4.3 konfirmasi VPN dijaga terhadap\" overlay apps \". Hal ini menyebabkan dialog tidak bereaksi menyentuh input. Jika Anda memiliki sebuah aplikasi yang menggunakan lapisan itu dapat menyebabkan perilaku ini. Jika Anda menemukan kontak aplikasi menyinggung penulis app. Masalah ini mempengaruhi semua aplikasi VPN di Android 4.3 dan kemudian. Lihat juga &lt;a href=\"https://github.com/schwabe/ics-openvpn/issues/185\"&gt; Issue 185 &lt;a&gt; untuk rincian tambahan "</string>
+ <string name="faq_vpndialog43_title">VPN Konfirmasi Dialog</string>
+ <string name="donatePlayStore">Atau Anda dapat mengirimkan saya donasi dengan Play Store:</string>
+ <string name="thanks_for_donation">Terima kasih untuk menyumbangkan %s!</string>
+ <string name="logCleared">Log dibersihkan.</string>
+ <string name="show_password">Tampilkan sandi</string>
+ <string name="keyChainAccessError">Keychain Akses error: %s</string>
+ <string name="timestamp_short">Pendek</string>
+ <string name="timestamp_iso">ISO</string>
+ <string name="timestamps">Cap waktu</string>
+ <string name="timestamps_none">Tak satupun</string>
+ <string name="uploaded_data">Upload</string>
+ <string name="downloaded_data">Unduh</string>
+ <string name="vpn_status">Vpn Status</string>
+ <string name="logview_options">Lihat pilihan</string>
+ <string name="unhandled_exception">Tertangani pengecualian: %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">Jika Anda telah berakar perangkat Android Anda Anda dapat menginstal <a href="http://xposed.info/"> Xposed kerangka </a> dan <a href = "http://repo.xposed.info/ modul / de.blinkt.vpndialogxposed "> VPN Dialog mengkonfirmasi modul </a> risiko Anda sendiri\"</string>
+ <string name="full_licenses">Lisensi penuh</string>
+ <string name="blocklocal_summary">Jaringan langsung terhubung ke antarmuka lokal tidak akan diarahkan melalui VPN. Tidak memilih opsi ini akan mengarahkan semua lalu lintas menjorok untuk jaringan lokal ke VPN.</string>
+ <string name="blocklocal_title">Bypass VPN for local networks</string>
+ <string name="userpw_file">Username Password File /</string>
+ <string name="imported_from_file">[Impor dari: %s]</string>
+ <string name="files_missing_hint">Beberapa file tidak dapat ditemukan. Silakan pilih file untuk mengimpor profil:</string>
+ <string name="openvpn_is_no_free_vpn">Untuk menggunakan aplikasi ini Anda membutuhkan penyedia VPN / gateway VPN mendukung OpenVPN (sering disediakan oleh majikan Anda). Periksa http://community.openvpn.net/ untuk informasi lebih lanjut tentang OpenVPN dan cara men-setup OpenVPN server Anda sendiri.</string>
+ <string name="import_log">Log impor:</string>
+ <string name="ip_looks_like_subnet">Vpn topologi \"%3$s\" ditentukan tapi ifconfig %1$s %2$s terlihat lebih seperti alamat IP dengan mask jaringan. Dengan asumsi \"subnet\" topologi.</string>
+ <string name="mssfix_invalid_value">Nilai menimpa MSS telah menjadi bulat antara 0 dan 9000</string>
+ <string name="mssfix_value_dialog">Mengumumkan kepada sesi TCP berjalan di atas terowongan bahwa mereka harus membatasi kirim ukuran paket mereka seperti bahwa setelah OpenVPN telah dikemas mereka, sehingga UDP ukuran paket yang OpenVPN mengirim ke rekan-nya tidak akan melebihi jumlah ini byte. (default adalah 1450)</string>
+ <string name="mssfix_checkbox">Mengganti nilai MSS TCP muatan</string>
+ <string name="mssfix_dialogtitle">Mengatur muatan MSS TCP</string>
+ <string name="client_behaviour">Perilaku klien</string>
+ <string name="clear_external_apps">Menghapus aplikasi eksternal diizinkan</string>
+ <string name="loading">Memuat&#8230;</string>
+ <string name="allowed_vpn_apps_info">Yang diizinkan aplikasi VPN: %1$s</string>
+ <string name="disallowed_vpn_apps_info">Batasan VPN apps: %1$s</string>
+ <string name="app_no_longer_exists">Paket %s tidak lagi diinstall, menghapus itu dari app memungkinkan/melarang daftar</string>
+ <string name="vpn_disallow_radio">VPN digunakan untuk semua aplikasi tapi mengecualikan yang dipilih</string>
+ <string name="vpn_allow_radio">VPN digunakan untuk hanya untuk aplikasi yang dipilih</string>
+ <string name="query_delete_remote">Hapus entri server jauh?</string>
+ <string name="keep">Biarkan</string>
+ <string name="delete">Hapus</string>
+ <string name="add_remote">Menambahkan baru remote</string>
+ <string name="remote_random">Gunakan entri koneksi secara acak pada koneksi</string>
+ <string name="remote_no_server_selected">Anda harus menentukan dan memungkinkan setidaknya satu server jauh.</string>
+ <string name="server_list">Daftar Server</string>
+ <string name="vpn_allowed_apps">Diizinkan Apps</string>
+ <string name="advanced_settings">Pengaturan lanjutan</string>
+ <string name="payload_options">Muatan pilihan</string>
+ <string name="tls_settings">Pengaturan TLS</string>
+ <string name="no_remote_defined">Didefinisikan Tidak ada remote</string>
+ <string name="duplicate_vpn">Profil duplikat VPN</string>
+ <string name="duplicate_profile_title">Duplikasi profil: %s</string>
+ <string name="show_log">Tampilkan log</string>
+ <string name="faq_android_clients">Ada beberapa klien OpenVPN untuk Android. Yang paling umum adalah OpenVPN untuk Android (ini klien), OpenVPN Connect dan OpenVPN pengaturan. &lt; p &gt; klien dapat dikelompokkan menjadi dua kelompok: OpenVPN untuk Android dan OpenVPN Connect menggunakan API VPNService resmi (Android 4.0 +) dan memerlukan tanpa akar dan pengaturan OpenVPN yang menggunakan akar. &lt; p &gt; OpenVPN untuk Android adalah klien sumber terbuka dan dikembangkan oleh Arne Schwabe. Ini ditargetkan untuk pengguna yang lebih maju dan menawarkan banyak pengaturan dan kemampuan untuk mengimpor profil dari file dan mengkonfigurasi/Ubah profil di dalam app. Klien didasarkan pada versi komunitas OpenVPN. Hal ini didasarkan pada kode sumber 2.x OpenVPN. Klien ini dapat dilihat sebagai semi resmi klien masyarakat. &lt; p &gt; OpenVPN Connect adalah klien sumber terbuka bebas yang dikembangkan oleh OpenVPN Technologies, Inc Klien indentasi untuk penggunaan umum klien dan moree ditargetkan untuk pengguna rata-rata dan memungkinkan impor OpenVPN profil. Klien ini didasarkan pada reimplementation OpenVPN C++ OpenVPN Protokol (ini diperlukan untuk memungkinkan OpenVPN Technologies, Inc untuk menerbitkan sebuah aplikasi OpenVPN iOS). Klien ini adalah resmi klien OpenVPN teknologi &lt; p &gt; OpenVPN pengaturan tertua klien dan juga UI untuk open source OpenVPN. Berbeda dengan OpenVPN untuk Android itu memerlukan akar dan tidak menggunakan VPNService API. Tidak tergantung pada Android 4.0 +</string>
+ <string name="faq_androids_clients_title">Perbedaan antara klien OpenVPN Android</string>
+ <string name="ignore_multicast_route">Mengabaikan rute multicast: %s</string>
+ <string name="ab_only_cidr">Android hanya mendukung rute CIDR ke VPN. Sejak non-CIDR rute yang hampir tidak pernah digunakan, OpenVPN untuk Android akan menggunakan / 32 untuk rute yang tidak CIDR dan mengeluarkan peringatan.</string>
+ <string name="ab_tethering_44">Penarikan bekerja sementara VPN aktif. Ditambatkan sambungan tidak akan menggunakan VPN.</string>
+ <string name="ab_kitkat_mss">Versi KitKat awal menetapkan nilai MSS salah pada TCP koneksi (# 61948). OpenVPN untuk secara otomatis mengaktifkan mssfix pilihan untuk solusi bug ini.</string>
+ <string name="ab_proxy">Android akan tetap menggunakan pengaturan proxy Anda ditentukan untuk mobile koneksi / Wi-Fi ketika tidak ada server DNS diatur. OpenVPN untuk Android akan memperingatkan Anda tentang hal ini dalam log. <p> Ketika VPN menetapkan server DNS Android tidak akan proxy. Tidak ada API untuk mengatur proxy untuk koneksi VPN. </p></string>
+ <string name="ab_lollipop_reinstall">Aplikasi VPN dapat berhenti bekerja ketika dihapus dan diinstal ulang lagi. Untuk jelasnya lihat # 80074</string>
+ <string name="ab_not_route_to_vpn">IP klien dikonfigurasi dan IP di topeng jaringan tidak diteruskan ke VPN. OpenVPN bekerja di sekitar bug ini dengan secara eksplisit menambahkan rute yang corrosponds ke IP klien dan netmask nya</string>
+ <string name="ab_persist_tun">Membuka perangkat tun saat perangkat tun lain sedang aktif, yang digunakan untuk dukungan bertahan-tun, crash VPNServices pada perangkat. A reboot diperlukan untuk membuat pekerjaan VPN lagi. OpenVPN untuk Android mencoba untuk menghindari membuka kembali perangkat tun dan jika benar-benar diperlukan pertama menutup TUN saat sebelum membuka perangkat TUN baru untuk menghindari crash. Hal ini dapat menyebabkan jendela pendek di mana paket dikirim melalui koneksi non-VPN. Bahkan dengan solusi ini VPNServices kadang-kadang crash dan memerlukan reboot perangkat.</string>
+ <string name="ab_secondary_users">VPN tidak bekerja sama sekali bagi pengguna sekunder.</string>
+ <string name="ab_kitkat_reconnect">"Beberapa pengguna melaporkan bahwa koneksi mobile / koneksi data mobile sering menjatuhkan saat menggunakan aplikasi VPN. Perilaku tampaknya hanya mempengaruhi beberapa kombinasi perangkat mobile provider / dan sejauh ini tidak ada penyebab / solusi untuk bug dapat diidentifikasi."</string>
+ <string name="ab_vpn_reachability_44">Hanya tujuan yang bisa dicapai melalui VPN yang bisa dijangkau tanpa VPN. VPN IPv6 tidak bekerja sama sekali.</string>
+ <string name="ab_only_cidr_title">Rute non CIDR</string>
+ <string name="ab_proxy_title">Tindakan Proxy untuk VPN</string>
+ <string name="ab_lollipop_reinstall_title">Menginstal ulang aplikasi VPN</string>
+ <string name="version_upto">%s dan sebelumnya</string>
+ <string name="copy_of_profile">Salinan dari %s</string>
+ <string name="ab_not_route_to_vpn_title">Alihkan ke alamat IP yang telah ditentukan</string>
+ <string name="ab_kitkat_mss_title">Nilai MSS yang salah untuk koneksi VPN</string>
+ <string name="ab_secondary_users_title">Pengguna tablet sekunder</string>
+ <string name="custom_connection_options_warng">Tentukan pengaturan untuk koneksi khusus . Gunakan dengan hati-hati</string>
+ <string name="custom_connection_options">Pilihan buatan</string>
+ <string name="remove_connection_entry">Hapus entri koneksi</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 f35a4b66..a8cafa72 100755
--- a/app/src/main/res/values-it/strings-icsopenvpn.xml
+++ b/app/src/main/res/values-it/strings-icsopenvpn.xml
@@ -182,7 +182,6 @@ Effettuata la lettura del file di configurazione</string>
<string name="keychain_nocacert">Nessun certificato della CA è stato prelevato dal Keystore di Android. E\' probabile che l\'autenticazione fallisca.</string>
<string name="show_log_summary">Mostra la finestra dei log della connessione. Si può sempre accedere alla finestra dei log tramite la barra delle notifiche.</string>
<string name="show_log_window">Visualizza la finestra dei log</string>
- <string name="mobile_info">In esecuzione su %1$s (%2$s) %3$s, Android API %4$d</string>
<string name="error_rsa_sign">Errore di firma con la chiave %1$s: %2$s del Keystore di Android.</string>
<string name="faq_system_dialogs">L\'avvertimento durante la connessione VPN, in cui si informa che questo programma può intercettare tutto il traffico del sistema, serve a prevenire un uso fraudolento delle API del servizio VPN.\nL\'icona di notifica a forma di chiave è altresì imposta dal sistema Android per avvertire che si è connessi ad una VPN. Su alcuni apparecchi questa notifica è accompagnata da un suono.\nAndroid utilizza questi sistemi per la tua sicurezza e per assicurarsi che questi non vengano aggirati (in alcuni firmware questo sfortunamente è accompagnato da un suono di avvertimento).</string>
<string name="faq_system_dialogs_title">Avviso di connessione e notifica sonora</string>
@@ -262,7 +261,6 @@ Effettuata la lettura del file di configurazione</string>
<string name="encryption_cipher">Algoritmo di crittografia</string>
<string name="packet_auth">Autenticazione pacchetti</string>
<string name="auth_dialog_title">Seleziona il metodo di autenticazione dei pacchetti</string>
- <string name="mobile_info_extended">In esecuzione su %1$s (%2$s) %3$s, Android API %4$d, versione %5$s, %6$s</string>
<string name="built_by">compilato da %s</string>
<string name="debug_build">versione di debug</string>
<string name="official_build">versione ufficiale</string>
@@ -346,6 +344,7 @@ Effettuata la lettura del file di configurazione</string>
<string name="tls_settings">Impostazioni TLS</string>
<string name="duplicate_vpn">Profilo VPN duplicato</string>
<string name="duplicate_profile_title">Duplicazione del profilo: %s</string>
+ <string name="show_log">Mostra il log</string>
<string name="version_upto">%s e precedenti</string>
<string name="copy_of_profile">Copia di %s</string>
</resources>
diff --git a/app/src/main/res/values-ja/strings-icsopenvpn.xml b/app/src/main/res/values-ja/strings-icsopenvpn.xml
index f12d149b..93e82f79 100755
--- a/app/src/main/res/values-ja/strings-icsopenvpn.xml
+++ b/app/src/main/res/values-ja/strings-icsopenvpn.xml
@@ -6,8 +6,8 @@
-->
<resources>
- <string name="address">サーバアドレス</string>
- <string name="port">ポート番号</string>
+ <string name="address">サーバーアドレス:</string>
+ <string name="port">ポート番号:</string>
<string name="location">場所</string>
<string name="cant_read_folder">ディレクトリが読み取れません</string>
<string name="select">選択</string>
@@ -20,7 +20,7 @@
<string name="client_pkcs12_title">PKCS12ファイル</string>
<string name="ca_title">CA 証明書</string>
<string name="no_certificate">証明書を選択する必要があります。</string>
- <string name="copyright_guicode">ソースコードと問題管理はここにあります: http://code.google.com/p/ics-openvpn/</string>
+ <string name="copyright_guicode">ソースコードと問題管理はこちら: https://github.com/schwabe/ics-openvpn/</string>
<string name="copyright_others">プログラムは、次のコンポーネントを使用します。完全な詳細についてはソース上のライセンスを参照してください。</string>
<string name="about">バージョン情報</string>
<string name="vpn_list_title">プロファイル</string>
@@ -28,7 +28,7 @@
<string name="pkcs12pwquery">PKCS12のパスワード</string>
<string name="file_select">選択&#8230;</string>
<string name="file_nothing_selected">ファイルを選択する必要があります。</string>
- <string name="useTLSAuth">TLS認証を使用します。</string>
+ <string name="useTLSAuth">TLS認証を使用する</string>
<string name="tls_direction">TLS Direction</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>
@@ -55,7 +55,7 @@
<string name="random_host_prefix">ランダムなホスト プレフィックス</string>
<string name="random_host_summary">ランダムな6文字をホスト名の前に付加します。</string>
<string name="custom_config_title">カスタム オプションを使用する</string>
- <string name="custom_config_summary">カスタムオプションを指定します。注意を要します。</string>
+ <string name="custom_config_summary">カスタムオプションを指定します。注意して使用してください!</string>
<string name="route_rejected">経路がAndroidにより拒否されました。</string>
<string name="cancel_connection">切断</string>
<string name="cancel_connection_long">VPNを切断します</string>
@@ -63,6 +63,8 @@
<string name="title_cancel">キャンセルの確認</string>
<string name="cancel_connection_query">接続中または試行中の接続をキャンセルしますか?</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="remote_tlscn_check_summary">リモートサーバー証明書の所有者識別子(Subject 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\nたとえば相対識別名のプリフィクスとして\"Server\"を指定すると、\"Server-1\"と\"Server-2\"にマッチします。\n\n空欄にした場合は相対識別名とサーバのホスト名をチェックします。\n\n詳細についてはOpenVPN 2.3.1以降のマニュアルの「--verify-x509-name」の項を参照してください。</string>
@@ -73,7 +75,7 @@
<string name="pull_off_summary">サーバからは何も情報が取得できません。指定が必要な設定は以下の通りです。</string>
<string name="use_pull">情報取得の設定</string>
<string name="dns">DNS</string>
- <string name="override_dns">サーバ指定のDNSサーバ設定をオーバーライドします。</string>
+ <string name="override_dns">DNSを手動設定する</string>
<string name="dns_override_summary">DNSをユーザ側で指定します。</string>
<string name="searchdomain">検索ドメイン</string>
<string name="dns1_summary">使用する DNS サーバー</string>
@@ -90,7 +92,7 @@
<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="custom_options_title">カスタムオプション</string>
<string name="edit_vpn">VPN 設定の編集</string>
<string name="remove_vpn_query">VPN プロファイル %s を削除しますか?</string>
<string name="tun_error_helpful">いくつかのカスタムICSイメージは、/dev/tunのパーミッションが異常か、TUNモジュールが含まれていません。CM9イメージの場合は全般設定で所有権設定を修正してください。</string>
@@ -102,12 +104,13 @@
<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 を取得しました。2つ目のアドレスはリモート側のピアアドレスです。32ビットマスクをローカルIPに使用します。 OpenVPNのモードは \"%3$s\" です。</string>
<string name="route_not_cidr">%1$sと%2$sではCIDR形式のIP経路情報として意味をなしません。32ビットマスクを使用します。</string>
<string name="route_not_netip">経路情報%1$s/%2$sを%3$s/%2$sに修正しました。</string>
<string name="keychain_access">Androidの証明書管理にアクセスできません。(ファームウェアの更新、アプリケーションまたはその設定のリストアによって発生する場合があります)。VPNの設定で証明書の選択を再度行ってください。</string>
<string name="version_info">%1$s %2$s</string>
- <string name="send_logfile">ログ ファイルを送信します。</string>
+ <string name="send_logfile">ログファイルを送信</string>
<string name="send">送信</string>
<string name="ics_openvpn_log_file">ICS OpenVPN ログ ファイル</string>
<string name="copied_entry">ログ エントリをクリップボードにコピーしました</string>
@@ -159,7 +162,9 @@ SDカード上のデータは本質的に無防備です。すべてのアプリ
<string name="speed_waiting">状態メッセージを待っています。</string>
<string name="converted_profile">インポートされたプロファイル</string>
<string name="converted_profile_i">インポートされたプロファイル %d</string>
- <string name="broken_images">壊れたイメージ</string>
+ <string name="broken_images">壊れたファームウェア</string>
+ <string name="broken_images_faq">&lt;p&gt;HTCの公式ファームウェアにはトンネルにトラフィックを流すことができない奇妙なルーティングの問題を抱えています。 (バグトラッカーを参照 &lt;a href=\"https://github.com/schwabe/ics-openvpn/issues/18\"&gt;Issue 18&lt;/a&gt;)&lt;/p&gt;&lt;p&gt;古いSONY、Xperia Arc SとXperia RayのファームウェアはVPNServiceが完全に欠落していると報告されています。(バグトラッカーを参照 &lt;a href=\"https://github.com/schwabe/ics-openvpn/issues/29\"&gt;Issue 29&lt;/a&gt;)&lt;/p&gt;&lt;p&gt;カスタムビルドされたファームウェアにおいてtunモジュールがなかったり、あるいは権限が間違っている場合があります。いくつかのCM9では
+\"Device specific hacks(デバイス固有のhack)\"を有効にして\"Fix ownership(所有権を修正)\"オプションを使用する必要があります。&lt;/p&gt;&lt;p&gt;とても重要なこと: もしあなたがファームウェアの不完全なAndroidデバイスを所有していたら、メーカーに報告してください。より多くの人が問題を報告すれば、彼らが修正することでしょう。&lt;/p&gt;</string>
<string name="pkcs12_file_encryption_key">PKCS12ファイルの暗号化キー</string>
<string name="private_key_password">秘密鍵のパスワード</string>
<string name="password">パスワード</string>
@@ -180,7 +185,7 @@ SDカード上のデータは本質的に無防備です。すべてのアプリ
<string name="keychain_nocacert">認証局証明書(CA Cert)がAndroidのキーストアから取得できませんでした。認証はおそらく失敗します。</string>
<string name="show_log_summary">接続時にログウィンドウを表示します。ログウィンドウは常に状態通知からアクセスできます。</string>
<string name="show_log_window">ログウィンドウを表示</string>
- <string name="mobile_info">実行中:%1$s (%2$s)%3$s Android API %4$d</string>
+ <string name="mobile_info">%10$s %9$s は次の環境で実行中です %3$s %1$s (%2$s), Android %6$s (%7$s) API %4$d, ABI %5$s, (%8$s)</string>
<string name="error_rsa_sign">Androidキーストアに保存されたキー %1$s: %2$sの署名エラーです</string>
<string name="faq_system_dialogs">VPN接続の警告は、このアプリケーションがVPNService APIを悪用してすべての通信を傍受できることを、システムがあなたに知らせるものです。\n
VPN接続通知(鍵の形)は、VPN接続が稼働中であることをAndroidが知らせています。いくつかのシステムではこの通知で音を鳴らします。\n
@@ -236,6 +241,9 @@ OpenVPNの接続を保証するためには、アプリケーションを高い
<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\'のような設定を持っており、これは10秒ごとにサーバとクライアントで相互にkeepaliveパケットを送信しあうことを意味します。 &lt;p&gt;これらのパケットは小さく多くの帯域は使用しませんが、モバイル回線機能を常に稼動させ続け電力消費を増大させます。 &lt;p&gt;
+(参考 &lt;a href=\"http://developer.android.com/training/efficient-downloads/efficient-network-access.html#RadioStateMachine\"&gt;The Radio State Machine | Android Developers&lt;/a&gt;)&lt;p&gt;このkeepalive設定はクライアント側からは変更できません。OpenVPNのシステム管理者のみが変更可能です。 &lt;p&gt; 残念なことに、60秒より大きな間隔のUDP keepaliveはいくつかのNATゲートウェイにおいては接続状態が維持できず、それより短い時間でタイムアウトします(検証では60秒)。 TCP keepaliveと長いタイムアウト時間の使用は、動作はしますがTCP over TCP問題を引き起こします。(詳細は&lt;a href=\"http://sites.inka.de/bigred/devel/tcp-tcp.html\"&gt;なぜTCP over TCPは悪いアイディアなのか&lt;/a&gt;を参照)</string>
<string name="faq_tethering">Androidのテザリング機能(WiFi, USB, Bluetooth経由)とVPNService API(このプログラムから使用する機能)は同時に利用できません。詳細については&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>
@@ -271,7 +279,6 @@ OpenVPNの接続を保証するためには、アプリケーションを高い
<string name="encryption_cipher">暗号化方式</string>
<string name="packet_auth">パケット認証</string>
<string name="auth_dialog_title">パケット認証方式を入力してください。</string>
- <string name="mobile_info_extended">%1$s (%2$s) %3$s、Android API %4$d、バージョン %5$s %6$s において実行中</string>
<string name="built_by">%s によりビルド</string>
<string name="debug_build">デバッグ ビルド</string>
<string name="official_build">正式ビルド</string>
@@ -293,25 +300,28 @@ OpenVPNの接続を保証するためには、アプリケーションを高い
<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="screen_nopersistenttun">警告: このVPN接続には永続的なTUNが設定されていません。スクリーンオフ後の通信は通常のインターネット接続を使用します。</string>
+ <string name="screenoff_pause">画面オフにより接続を中断しています: %2$s秒で%1$s 以下 </string>
+ <string name="screen_nopersistenttun">警告: このVPN接続には永続的なTUNデバイスが設定されていません。スクリーンオフ後の通信は通常のインターネット接続を使用します。</string>
<string name="save_password">パスワードを保存</string>
- <string name="pauseVPN">VPN一時停止</string>
+ <string name="pauseVPN">VPNを中断</string>
<string name="resumevpn">VPN再開</string>
- <string name="state_userpause">ユーザによってVPN一時停止が要求されました</string>
- <string name="state_screenoff">VPN一時停止中 - screenオフ</string>
- <string name="device_specific">デバイス固有のhacks</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="permission_icon_app">OpenVPN for Androidを使用しようと試みるアプリのアイコン</string>
- <string name="faq_vpndialog43_title">Android 4.3以降用VPN確認ダイアログ</string>
+ <string name="faq_vpndialog43">Android 4.3で使用した場合、VPN確認画面はオーバーレイ(常に画面全体を覆う表示)を使用するアプリから保護されます。この結果、ダイアログはタッチ操作に反応しなくなります。もしあなたがオーバーレイを使用したアプリを使っていたらこの挙動に遭遇するでしょう。もしあなたがこういった無作法なアプリを見つけたら、そのアプリの作者に連絡しましょう。この問題はAndroid 4.3以降でVPNアプリケーションすべてに影響します。詳細は &lt;a href=\"https://github.com/schwabe/ics-openvpn/issues/185\"&gt;Issue 185&lt;a&gt; を参照してください。</string>
+ <string name="faq_vpndialog43_title">VPN確認ダイアログ</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>
@@ -331,4 +341,76 @@ OpenVPNの接続を保証するためには、アプリケーションを高い
<string name="files_missing_hint">いくつかのファイルが見つかりませんでした。プロファイルをインポートするファイルを選択してください:</string>
<string name="openvpn_is_no_free_vpn">このアプリを使用するには、(多くの場合、あなたの雇用者によって提供される)OpenVPNをサポートするVPNプロバイダ/ VPNゲートウェイが必要です。あなた独自のOpenVPNサーバーをセットアップするためにはhttp://community.openvpn.net/ をチェックしてください。</string>
<string name="import_log">インポートログ:</string>
+ <string name="ip_looks_like_subnet">VPNトポロジ \"%3$s\" が設定されていますが ifconfig %1$s %2$s はIPアドレスとネットマスクのように見えます。\"サブネット\"トポロジを仮定します。</string>
+ <string name="mssfix_invalid_value">MSSに指定できる値は0~9000の整数です</string>
+ <string name="mssfix_value_dialog">OpenVPNがカプセル化したあとのパケットサイズで制限するようトンネル越しのTCPセッションに通知します。結果、OpenVPNが相手に送信するUDPパケットサイズはこのバイト数を超えなくなります。(デフォルトは1450)</string>
+ <string name="mssfix_checkbox">TCPペイロードのMSSを指定する</string>
+ <string name="mssfix_dialogtitle">TCPペイロードのMSSを設定</string>
+ <string name="client_behaviour">クライアント動作</string>
+ <string name="clear_external_apps">許可された外部アプリをクリア</string>
+ <string name="loading">読み込み中...</string>
+ <string name="allowed_vpn_apps_info">許可されたVPNアプリケーション:%1$s</string>
+ <string name="disallowed_vpn_apps_info">許可されていないVPNアプリ:%1$s</string>
+ <string name="app_no_longer_exists">パッケージ %s はインストールされていないため、許可/不許可アプリリストから削除します</string>
+ <string name="vpn_disallow_radio">VPNは選択したアプリ以外のすべてのアプリから使用されます</string>
+ <string name="vpn_allow_radio">VPNは選択されたアプリのみで使用できます</string>
+ <string name="query_delete_remote">接続先設定を削除しますか?</string>
+ <string name="keep">保持</string>
+ <string name="delete">削除</string>
+ <string name="add_remote">新しい接続先を追加</string>
+ <string name="remote_random">接続時に接続先をランダムに使用する</string>
+ <string name="remote_no_server_selected">少なくとも一つ以上の接続先を設定し有効化する必要があります</string>
+ <string name="server_list">接続先リスト</string>
+ <string name="vpn_allowed_apps">許可されたアプリ</string>
+ <string name="advanced_settings">詳細設定</string>
+ <string name="payload_options">ペイロードオプション</string>
+ <string name="tls_settings">TLSの設定</string>
+ <string name="no_remote_defined">接続先が設定されていません</string>
+ <string name="duplicate_vpn">VPNプロファイルを複製</string>
+ <string name="duplicate_profile_title">プロファイルの複製:%s</string>
+ <string name="show_log">ログを表示</string>
+ <string name="faq_android_clients">Android用のOpenVPNクライアントは複数あります。主なものとしては「OpenVPN for Android」(このアプリ)「OpenVPN Connect」「OpenVPN Settings」があります。&lt;p&gt;クライアントは大きく2種類に分けられます。「OpenVPN for Android」「OpenVPN Connect」は公式なVPNService API (Android 4.0以降)を使用しroot権限は不要です。「OpenVPN Settings」はroot権限が必要です。&lt;p&gt;「OpenVPN for Android」はオープンソースのクライアントでArne Schwabeにより開発されています。詳しい人をターゲットとして、多くの設定とファイルからのプロファイルインポート、アプリ内でのプロファイル設定変更ができるようになっています。コミュニティ版のOpenVPN 2.xのソースコードをベースとしています。コミュニティの準公式クライアントとみなせます。&lt;p&gt;「OpenVPN Connect」はOpenVPN Technologies, Incにより開発されておりオープンソースではありません。より一般的な使い方と平均的なユーザをターゲットとしており、OpenVPNプロファイルのインポートができます。OpenVPNプロトコルのC++による再実装コードをベースとしています(これはOpenVPN Technologies, IncがiOS版を公開するために必要でした)。OpenVPN Technologies, Incの公式クライアントです。&lt;p&gt; 「OpenVPN Settings」は最も古いクライアントであり、オープンソースのOpenVPN用のUIです。「OpenVPN for Android」との大きな違いはroot権限を必要とし、かつVPNService APIを使用しないことです。Android 4.0以降に依存しません。</string>
+ <string name="faq_androids_clients_title">OpenVPN Androidクライアント間の違い</string>
+ <string name="ignore_multicast_route">マルチキャストされた経路を無視します: %s</string>
+ <string name="ab_only_cidr">AndroidはVPNへの経路としてCIDRのみサポートします。非CIDR経路はほとんど使用されないため、OpenVPN for Androidは非CIDR経路に/32を使用し、警告を発します。</string>
+ <string name="ab_tethering_44">テザリングはVPNが接続中でも有効です。ただしテザリングした通信はVPNを使用できません。</string>
+ <string name="ab_kitkat_mss">初期のKitKatはTCP接続において間違ったMSS値を使用します。(#61948). このバグを回避するにはmssfixオプションの有効化を試してください。</string>
+ <string name="ab_proxy">AndroidはDNSサーバの設定がされていない場合、モバイル/WiFiのプロキシ設定を使用し続けます。OpenVPN for Androidはこれについてログにて警告します。<p>VPNがDNSサーバを設定した場合、Androidはプロキシを使用しなくなります。VPNでプロキシを使用するよう設定するAPIは存在しません。</p></string>
+ <string name="ab_lollipop_reinstall">VPNアプリはアンインストール/再インストール時に正常に動作しなくなることがあります。詳細は#80074を参照してください。</string>
+ <string name="ab_not_route_to_vpn">設定されたクライアントIPとネットマスクに含まれるIPアドレスはVPNを経由しません。OpenVPNは明示的に経路を追加することでこのバグを回避します。</string>
+ <string name="ab_persist_tun">ほかのTUNデバイスが使用されている間に、永続的なTUNデバイス機能のためにTUNデバイスを開こうとするとデバイス上のVPNServiceがクラッシュします。VPNが再び動作するためにはデバイスの再起動が必要です。OpenVPN for Androidはクラッシュを避けるため、新しいTUNデバイスを開く前に現在のTUNデバイスを閉じます。これは短期間、パケットが非VPN接続に送信される原因になります。この回避策があっても、VPNServiceは時々クラッシュし、デバイスの再起動が必要になります。</string>
+ <string name="ab_secondary_users">VPNはほかのユーザーに対しては動作しません。</string>
+ <string name="ab_kitkat_reconnect">"複数のユーザが、VPNアプリ使用中にモバイル接続が頻繁に欠落すると報告しています。この挙動は特定のプロバイダ/デバイスの組み合わせでのみ発生すると思われ、これまでのところこのバグに対する原因や回避策は特定されていません。"</string>
+ <string name="ab_vpn_reachability_44">VPNなしでも到達可能なネットワークにのみVPN経由で到達できる場合。IPv6 VPN は動作しません。</string>
+ <string name="ab_only_cidr_title">非CIDRルート</string>
+ <string name="ab_proxy_title">VPNのプロキシ動作</string>
+ <string name="ab_lollipop_reinstall_title">VPNアプリを再インストールする場合</string>
+ <string name="version_upto">%sおよびそれ以前</string>
+ <string name="copy_of_profile">%sのコピー</string>
+ <string name="ab_not_route_to_vpn_title">設定されたIPアドレスへの経路</string>
+ <string name="ab_kitkat_mss_title">VPN接続に不正なMSS値</string>
+ <string name="ab_secondary_users_title">タブレットの複数ユーザー</string>
+ <string name="custom_connection_options_warng">カスタム指定の接続オプションを設定します。慎重に利用してください</string>
+ <string name="custom_connection_options">カスタムオプション</string>
+ <string name="remove_connection_entry">接続エントリを削除します</string>
+ <string name="ab_kitkat_reconnect_title">モバイルネットワークが突発的に切断される</string>
+ <string name="ab_vpn_reachability_44_title">リモートネットワークに到達できない</string>
+ <string name="ab_persist_tun_title">持続的なTUNモード</string>
+ <string name="version_and_later">%s以降</string>
+ <string name="tls_cipher_alert_title">SSL23_GET_SERVER_HELLO:sslv3 alert handshake failureで接続が失敗する</string>
+ <string name="tls_cipher_alert">OpenVPN for Androidの新しいバージョン(0.6.29/March 2015)は、暗号化スイートが許す限りよりセキュアなデフォルトを使用します(tls-cipher \"DEFAULT:!EXP:!PSK:!SRP:!kRSA\")。 残念なことに、欠陥のある暗号化スイートあるいは輸出用暗号化スイート、特にPerfect Forward Secrecy (Diffie-Hellman)に欠陥がある暗号化スイートでは問題を生じます。これらは通常、サーバのtls-cipherの設定や最小限のSSLを実装した組み込みOS(例えば MikroTik)で、よりTLSセキュリティを強化しようとした善意での、しかし不完全な試みにより生じます\nこの問題を解決するには、サーバ側で tls-cipher に \"DEFAULT:!EXP:!PSK:!SRP:!kRSA\" のような妥当なデフォルトを設定します。この問題のクライアント側の回避策としては、カスタムオプションに tls-cipher DEFAULT を追加します。</string>
+ <string name="message_no_user_edit">このプロファイルは外部のアプリ(%s)より追加され、ユーザによる編集が無効化されています</string>
+ <string name="crl_file">証明書失効リスト</string>
+ <string name="service_restarted">OpenVPNを再起動しています(クラッシュしたか、メモリ不足により停止させられたため)</string>
+ <string name="import_config_error">設定のインポートでエラーが発生したため、保存できません。</string>
+ <string name="Search">検索</string>
+ <string name="clear_log_on_connect">新規接続時にログをクリアする</string>
+ <string name="connect_timeout">接続タイムアウト</string>
+ <string name="query_permissions_sdcard">OpenVPN for Androidは見失ったファイルを自動でSDカードから再探索することができます。このメッセージをタップして権限のリクエストを行ってください。</string>
+ <string name="protocol">プロトコル</string>
+ <string name="enabled_connection_entry">有効</string>
+ <string name="abi_mismatch">Preferred native ABI precedence of this device (%1$s) and ABI reported by native libraries (%2$s) mismatch</string>
+ <string name="months_left">残り %dヵ月</string>
+ <string name="days_left">残り %d日</string>
+ <string name="hours_left">残り %d時間</string>
</resources>
diff --git a/app/src/main/res/values-ko/strings-icsopenvpn.xml b/app/src/main/res/values-ko/strings-icsopenvpn.xml
index 4a4273d8..ce748cfa 100755
--- a/app/src/main/res/values-ko/strings-icsopenvpn.xml
+++ b/app/src/main/res/values-ko/strings-icsopenvpn.xml
@@ -87,9 +87,9 @@
<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_route_message_excluded">VPN을 통해 라우팅되면 안되는 경로(라우트). 포함된 경로와 동일한 구문을 사용합니다.</string>
<string name="custom_routes_title">사용자 지정 라우트</string>
- <string name="custom_routes_title_excluded">123456</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>
@@ -103,6 +103,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_incl">경로: %1$s %2$s</string>
+ <string name="routes_info_excl">제외된 경로: %1$s %2$s</string>
<string name="ip_not_cidr">인터페이스 정보 %1$s와 %2$s에 있어, 두 번째 주소를 원격 피어 주소로 가정 하겠습니다. 로컬 IP의 넷마스크로는 /32를 사용하겠습니다. OpenVPN에 의해 주어진 모드는 \"%3$s\" 입니다.</string>
<string name="route_not_cidr">CIDR 넷마스크가 있는 IP 라우트 %1$s 와 %2$s 에 있어서 처리가 불가능합니다. /32를 넷마스크로 사용하겠습니다.</string>
<string name="route_not_netip">%1$s/%2$s 에서 %3$s/%2$s로 라우트 수정</string>
@@ -177,7 +179,6 @@
<string name="keychain_nocacert">안드로이드 keystore에서 CA 인증서를 찾지 못했습니다. Auhtentication은 실패할 것 입니다.</string>
<string name="show_log_summary">연결시 로그 윈도우를 보여드립니다. 로그 윈도우는 항상 notification status에서 접근이 가능합니다.</string>
<string name="show_log_window">로그 윈도우 보기</string>
- <string name="mobile_info">%1$s (%2$s) %3$s, 안드로이드 API %4$d 에서 실행</string>
<string name="error_rsa_sign">안드로이드 keystore 키 %1$s: %2$s과 싸이닝 오류</string>
<string name="faq_system_dialogs">시스템에서는 VPN연결 경고를 통해 당신에게 본앱이 모든 트래픽을 가로챌수있다는 점을 알리게 되어 있는데 이는 VPNService API가 남용하는것을 막기 위함입니다.\nVPN 연결 알림 (키 아이콘) 또한 안드로이드 시스템에서 부과하는 부분이며 이는 VPN연결을 알리는 신호입니다. 어떤 버전에서는 소리를 알림으로 사용하는 경우도 있습니다.\n안드로이드는 이같은 방법을 당신의 안전을 위해 도입하였으며 사용은 필수적입니다. (어떤 버전에서는 유감스럽게도 소리 알림 또한 포함됩니다.)</string>
<string name="faq_system_dialogs_title">연결 경고 및 알림 소리</string>
@@ -256,7 +257,6 @@
<string name="encryption_cipher">암호화 암호</string>
<string name="packet_auth">패킷 인증</string>
<string name="auth_dialog_title">패킷 인증 방법을 입력한다</string>
- <string name="mobile_info_extended">%1$s (%2$s) %3$s, 안드로이드 API %4$d, 버전 %5$s, %6$s에서 실행</string>
<string name="built_by">개발자 %s</string>
<string name="debug_build">디버그 빌드</string>
<string name="official_build">공식 빌드</string>
@@ -282,6 +282,7 @@
<string name="screen_nopersistenttun">경고: 이 VPN은 persistent tun이 비활성화 되어있습니다. 화면이 꺼졌을 때 트래픽은 터널을 사용하지 않고 인터넷을 바로 사용합니다.</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">장치 관련 Hacks</string>
@@ -309,4 +310,12 @@
<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="full_licenses">전체 라이센스</string>
+ <string name="userpw_file">사용자 이름/암호 파일</string>
+ <string name="mssfix_invalid_value">MSS override의 값은 0과 9000 사이의 정수이어야합니다</string>
+ <string name="loading">로드 중...</string>
+ <string name="keep">유지</string>
+ <string name="delete">삭제</string>
+ <string name="payload_options">페이로드 옵션</string>
+ <string name="tls_settings">TLS 설정</string>
+ <string name="faq_androids_clients_title">안드로이드 OpenVPN 클라이언트 간의 차이</string>
</resources>
diff --git a/app/src/main/res/values-nl/strings-icsopenvpn.xml b/app/src/main/res/values-nl/strings-icsopenvpn.xml
index 2b3468e3..e05b9105 100755
--- a/app/src/main/res/values-nl/strings-icsopenvpn.xml
+++ b/app/src/main/res/values-nl/strings-icsopenvpn.xml
@@ -20,7 +20,7 @@
<string name="client_pkcs12_title">PKCS12 Bestand</string>
<string name="ca_title">CA Certificaat</string>
<string name="no_certificate">Je moet een certificaat selecteren</string>
- <string name="copyright_guicode">De broncode en bugs zijn te vinden op http://code.google.com/p/ics-openvpn/</string>
+ <string name="copyright_guicode">De broncode en bugs zijn te vinden op https://github.com/schwabe/ics-openvpn/</string>
<string name="copyright_others">Het programma gebruikt de volgende componenten. Zie de broncode voor volledige details over de licenties.</string>
<string name="about">Over</string>
<string name="vpn_list_title">Profielen</string>
@@ -30,9 +30,9 @@
<string name="file_nothing_selected">Je moet een bestand selecteren</string>
<string name="useTLSAuth">Gebruik TLS autentificatie</string>
<string name="tls_direction">TLS Richting</string>
- <string name="ipv6_dialog_tile">Voer een IPv6 Adres/Netmask in met het CIDR Formaat (v.b. 2000:dd::23/64)</string>
- <string name="ipv4_dialog_title">Voer een IPv4 Adres/Netmask in met het CIDR Formaat (v.b. 1.2.3.4/24)</string>
- <string name="ipv4_address">IPv4 Adres</string>
+ <string name="ipv6_dialog_tile">Voer een IPv6 Adres/Netmask in met het CIDR Formaat (b.v. 2000:dd::23/64)</string>
+ <string name="ipv4_dialog_title">Voer een IPv4 Adres/Netmask in met het CIDR Formaat (b.v. 1.2.3.4/24)</string>
+ <string name="ipv4_address">IPv6 Adres</string>
<string name="ipv6_address">IPv4 Adres</string>
<string name="custom_option_warning">Geavanceerde OpenVPN opties. Veel van de tun gerelateerde OpenVPN instellingen worden niet ondersteund. Als u denkt dat een belangrijke optie ontbreekt, neem dan contact op met de auteur.</string>
<string name="auth_username">Gebruikersnaam</string>
@@ -106,8 +106,10 @@
<string name="version_info">%1$s %2$s</string>
<string name="send_logfile">Logboek verzenden</string>
<string name="send">Verzenden</string>
+ <string name="copied_entry">Kopiëer de log ingave naar het clip bord</string>
<string name="tap_mode">Tap mode</string>
<string name="faq_tap_mode">De VPN API van Android werkt zonder rooten van de telefoon en ondersteunt alleen de tun modus. Daarom is de tap modus niet mogelijk met deze app.</string>
+ <string name="tap_faq2">Alweer? Maak je een grapje? Nee, tap mode wordt echt niet ondersteund en meer mails sturen met het verzoek of het ondersteund kan worden zal echt niet helpen, dus Neen.</string>
<string name="faq">Veelgestelde vragen </string>
<string name="encryption">Codering</string>
<string name="cipher_dialog_title">Codering methode</string>
diff --git a/app/src/main/res/values-no/strings-icsopenvpn.xml b/app/src/main/res/values-no/strings-icsopenvpn.xml
index bd71a77c..d4fa66a4 100755
--- a/app/src/main/res/values-no/strings-icsopenvpn.xml
+++ b/app/src/main/res/values-no/strings-icsopenvpn.xml
@@ -125,7 +125,6 @@
<string name="netstatus">Nettverksstatus: %s</string>
<string name="select_file">Velg</string>
<string name="show_log_window">Vis logg-vindu</string>
- <string name="mobile_info">Kjører på %1$s (%2$s) %3$s, Android API %4$d</string>
<string name="translationby">Norsk oversettelse av Jonny</string>
<string name="ipdns">IP og DNS</string>
<string name="basic">Grunnleggende</string>
diff --git a/app/src/main/res/values-pl/strings-icsopenvpn.xml b/app/src/main/res/values-pl/strings-icsopenvpn.xml
index dece207b..0e76b956 100755
--- a/app/src/main/res/values-pl/strings-icsopenvpn.xml
+++ b/app/src/main/res/values-pl/strings-icsopenvpn.xml
@@ -8,8 +8,8 @@
<string name="address">Adres serwera:</string>
<string name="port">Port serwera:</string>
- <string name="location">Lokalizacja</string>
- <string name="cant_read_folder">Nie można odczytać katalogu</string>
+ <string name="location">Ścieżka</string>
+ <string name="cant_read_folder">Nie mogę odczytać katalogu</string>
<string name="select">Wybierz</string>
<string name="cancel">Anuluj</string>
<string name="no_data">Brak danych</string>
@@ -18,11 +18,11 @@
<string name="client_certificate_title">Certyfikat klienta</string>
<string name="client_key_title">Klucz certyfikatu klienta</string>
<string name="client_pkcs12_title">Plik PKCS12</string>
- <string name="ca_title">Certyfikat urzędu certyfikacji</string>
+ <string name="ca_title">Certyfikat CA</string>
<string name="no_certificate">Musisz wybrać certyfikat</string>
- <string name="copyright_guicode">Kod źródłowy i formularz zgłoszeniowy błędów dostępny pod http://code.google.com/p/ics-openvpn/</string>
+ <string name="copyright_guicode">Kod źródłowy i formularz zgłoszeniowy błędów dostępny pod https://github.com/schwabe/ics-openvpn/</string>
<string name="copyright_others">Program ten wykorzystuje następujące składniki; Szczegółowe informacje o licencjach w kodzie źródłowym</string>
- <string name="about">O</string>
+ <string name="about">O programie</string>
<string name="vpn_list_title">Profile</string>
<string name="vpn_type">Typ</string>
<string name="pkcs12pwquery">Hasło PKCS12</string>
@@ -46,8 +46,8 @@
<string name="no_keystore_cert_selected">Musisz wybrać certyfikat użytkownika</string>
<string name="no_error_found">Brak błędów</string>
<string name="config_error_found">Błąd w konfiguracji</string>
- <string name="ipv4_format_error">Błąd parsowania adresu IPv4</string>
- <string name="custom_route_format_error">Błąd parsowania niestandardowych tras</string>
+ <string name="ipv4_format_error">Błąd analizowania adresu IPv4</string>
+ <string name="custom_route_format_error">Błąd analizowania niestandardowych tras</string>
<string name="pw_query_hint">(Pozostaw puste, aby wywołać na żądanie)</string>
<string name="vpn_shortcut">Skrót OpenVPN</string>
<string name="vpn_launch_title">Połącz się z siecią VPN</string>
@@ -63,15 +63,21 @@
<string name="title_cancel">Anuluj potwierdzenie</string>
<string name="cancel_connection_query">Odłącz podłączone VPN / zrezygnować z próby połączenia?</string>
<string name="remove_vpn">Usuń VPN</string>
+ <string name="check_remote_tlscert">Sprawdza, czy serwer używa certyfikatu z rozszerzeniami serwera TLS (--remote-cert-tls server)</string>
<string name="check_remote_tlscert_title">Oczekiwanie na certyfikat TLS z serwera</string>
+ <string name="remote_tlscn_check_summary">Sprawdza podmiot DN certyfikatu zdalnego</string>
<string name="remote_tlscn_check_title">Weryfikuj nazwę domenową zawartą w certyfikacie</string>
- <string name="enter_tlscn_title">Temat zdalnego certyfikatu</string>
+ <string name="enter_tlscn_dialog">Określ czynność weryfikującą DN zdalnego certyfikatu (np. C=DE, L=Paderborn, OU=Avian IP Carriers, CN=openvpn.blinkt.de)\n\nUżyj pełnego DN lub RDN (przykładowo penvpn.blinkt.de), lub prefiks RDN w celu weryfikacji\n\nUżywając prefiksu \"Serwer\", RDN będzie prawidłowy dla \"Serwer-1\" lub \"Serwer-Agaty\"\n\nPozostawiając pole puste RDN będzie sprawdzany pod kątem nazwy serwera.\n\nAby uzyskać więcej informacji, spójrz do podręcznika OpenVPN 2.3.1 w dziale —verify-x509-name</string>
+ <string name="enter_tlscn_title">Podmiot zdalnego certyfikatu</string>
<string name="tls_key_auth">Włącza uwierzytelnianie kluczem TLS</string>
<string name="tls_auth_file">Plik TLS</string>
+ <string name="pull_on_summary">Pobierz z serwera adresy IP, trasy oraz inne opcje.</string>
+ <string name="pull_off_summary">Żadne opcje nie będą pobierane z serwera, należy je ustawić poniżej.</string>
<string name="use_pull">Pobierz ustawienia</string>
<string name="dns">DNS</string>
<string name="override_dns">Nadpisz DNS z serwera</string>
<string name="dns_override_summary">Użyj własnych serwerów DNS</string>
+ <string name="searchdomain">searchDomain</string>
<string name="dns1_summary">Używany serwer DNS.</string>
<string name="dns_server">Serwer DNS</string>
<string name="secondary_dns_message">Pomocniczy serwer DNS używany, jeśli normalny serwer DNS jest nieosiągalny.</string>
@@ -80,9 +86,13 @@
<string name="ignore_routes_summary">Ignoruj trasy serwera.</string>
<string name="default_route_summary">Przekieruj cały ruch przez tunel VPN</string>
<string name="use_default_title">Użyj domyślnej trasy</string>
+ <string name="custom_route_message">Wprowadź własne trasy. Muszą być wprwadzone w formacie CIDR. \"10.0.0.0/8 2002::/16\" przekieruje ruch z 10.0.0.0/8 i 2002::/16 przez VPN.</string>
+ <string name="custom_route_message_excluded">Trasy, które NIE powinny być kierowane przez VPN. Użyj tej samej składni, jak w trasach opcjonalnych.</string>
<string name="custom_routes_title">Opcjonalne trasy</string>
+ <string name="custom_routes_title_excluded">Wykluczone Sieci</string>
<string name="log_verbosity_level">Poziom logowania</string>
<string name="float_summary">Zezwalaj uwierzytelnionym pakietom z każdego IP</string>
+ <string name="float_title">Zezwól na \"pływający\" serwer.</string>
<string name="custom_options_title">Opcje użytkownika</string>
<string name="edit_vpn">Edytuj ustawienia VPN</string>
<string name="remove_vpn_query">Usunąć profil VPN \'%s\'?</string>
@@ -93,14 +103,22 @@
<string name="last_openvpn_tun_config">Otwieram interfejs tun:</string>
<string name="local_ip_info">Lokalne IPv4: %1$s/%2$d IPv6: %3$s MTU: %4$d</string>
<string name="dns_server_info">Serwer DNS: %1$s, Domena: %2$s</string>
+ <string name="routes_info_incl">Trasy: %1$s %2$s</string>
+ <string name="routes_info_excl">Wykluczone trasy: %1$s %2$s</string>
+ <string name="routes_debug">VpnService dodano trasy: %1$s %2$s</string>
+ <string name="ip_not_cidr">Interfejs uzyskał %1$s oraz %2$s, zakładam, że drugi adres jest adresem zdalnym - peer. Użyto maski /32 dla lokalnego IP. Tryb OpenVPN to \"%3$s\".</string>
+ <string name="route_not_cidr">%1$s i %2$s, nie są trasami IP w formacie CIDR, używam /32 jako maski sieci.</string>
+ <string name="route_not_netip">Poprawiłem trasę %1$s/%2$s na %3$s/%2$s</string>
+ <string name="keychain_access">Nie mam dostępu do pęku kluczy Androida. Może być to spowodowane aktualizacją systemu lub przywróceniem kopii aplikacji lub jej opcji. Proszę, edytuj połączenie VPN i wybierz ponownie certyfikat w opcjach, w celu odtworzenia pozwoleń dostępu do certyfikatu.</string>
<string name="version_info">%1$s %2$s</string>
<string name="send_logfile">Wyślij loga</string>
<string name="send">Wyślij</string>
<string name="ics_openvpn_log_file">Plik logów ICS OpenVPN</string>
<string name="copied_entry">Skopiowano log do schowka</string>
<string name="tap_mode">Tryb TAP</string>
- <string name="faq_tap_mode">Tryb TAP nie jest możliwy z nierootwanym API VPN. Dlatego ta aplikacja nie zapewnia wsparcia TAP</string>
- <string name="tap_faq2">Znowu. Żartujesz sobie? Tryb tap jest naprawdę nie wspierany, a wysyłanie więcej maili o to czy będzie wsparcie wcale nie pomoże.</string>
+ <string name="faq_tap_mode">Tryb tap nie jest możliwy z API VPN bez użycia root-a. W związku z powyższym ta aplikacja nie wspiera tap</string>
+ <string name="tap_faq2">Jeszcze raz?! Raczysz sobie żartować... Tryb tap naprawdę nie jest wspierany, a zasypywanie mnie wiadomościami z tego typu pytaniami naprawdę, ale to naprawdę nie pomaga...</string>
+ <string name="tap_faq3">Trzeci raz?! Właściwie można by napisać emulator tap bazując na tun, który dodawałby informacje layer2 przy wysyłaniu oraz ucinał opcje L2 przy odbiorze. No, ale wymagałoby to zaimplementowania ARP - i pewnie klienta DHCP. Pierwsze słyszę, by ktoś w ogóle to robił - skontaktuj się ze mną, jeśli masz plan pomocy przy współtworzeniu wspomnianego emulatora.</string>
<string name="faq">FAQ</string>
<string name="copying_log_entries">Kopiowanie wpisów dziennika</string>
<string name="faq_copying">Aby skopiować pojedynczy wpis dziennika, naciśnij i przytrzymaj interesującą Cię pozycję. Celem skopiowania całego dziennika, należy użyć opcji Wyślij Log - jeżeli nie jest widoczna, użyj klawisza menu na obudowie urządzenia.</string>
@@ -110,75 +128,104 @@
<string name="encryption">Szyfrowanie</string>
<string name="cipher_dialog_title">Wprowadź metodę szyfrowania</string>
<string name="chipher_dialog_message">Wybierz algorytm szyfrowania wykorzystywany przez OpenVPN. Pozostaw puste, aby skorzystać z ustawień domyślnych.</string>
- <string name="auth_dialog_message">Wprowadź dane logowania użyte do OpenVPN. Pozostaw puste, aby skorzystać z ustawień domyślnych.</string>
+ <string name="auth_dialog_message">Wprowadź tryb autoryzacji używany z OpenVPN. Pozostaw puste, aby skorzystać z ustawień domyślnych.</string>
<string name="settings_auth">Uwierzytelnianie/Szyfrowanie</string>
- <string name="file_explorer_tab">Manager plików</string>
+ <string name="file_explorer_tab">Przeglądanie plików</string>
+ <string name="inline_file_tab">Zawarte w pliku</string>
<string name="error_importing_file">Błąd importu pliku</string>
<string name="import_error_message">Nie można zaimportować pliku z systemu</string>
<string name="inline_file_data">[[Inline file data]]</string>
+ <string name="opentun_no_ipaddr">Odmowa otwarcia urządzenia tun bez informacji o IP</string>
<string name="menu_import">Wczytaj profil z pliku ovpn</string>
- <string name="menu_import_short">Wczytaj</string>
+ <string name="menu_import_short">Importuj</string>
<string name="import_content_resolve_error">Nie można odczytać Profilu do importu</string>
<string name="error_reading_config_file">Błąd podczas czytania pliku konfiguracyjnego</string>
<string name="add_profile">Dodaj profil</string>
<string name="import_could_not_open">Nie można znaleźć pliku %1$s zawartego w zaimportowanym pliku</string>
<string name="importing_config">Importowanie pliku konfiguracyjnego ze źródła %1$s</string>
- <string name="import_done">Skończono czytać plik konfiguracyjny.</string>
+ <string name="import_warning_custom_options">Importowana konfiguracja zawierała kilka opcji, które nie są przypisane w interfejsie graficznym. Opcje te zostały dodane jako opcje dodatkowe. Opcje te wyświetlono poniżej:</string>
+ <string name="import_done">Pomyślnie przeczytano plik konfiguracyjny.</string>
<string name="nobind_summary">Nie przypisuj do lokalnego adresu i portu</string>
+ <string name="no_bind">Nie wiąż lokalnie</string>
<string name="import_configuration_file">Importuj plik konfiguracji</string>
+ <string name="faq_security_title">Zagadnienia dotyczące bezpieczeństwa</string>
+ <string name="faq_security">"Jako, że OpenVPN jest wrażliwe na bezpieczeństwo, kilka rozsądnych zdań na ten temat. Wszystke dane na karcie SD z zasady nie są bezpieczne. Każda aplikacja może je odczytać - dla przykładu, ten program nie wymaga żadnych specjalnych uprawnień do odczytu karty SD. Dane tej aplikacji mogą być odczytywane tylko przez nią samą. Używając opcji importu certyfikatów/CA lub kluczy, dane przechowywane są w profilu VPN. Profile VPN odczytywalne są tylko przez tę aplikację. (Nie zapomnij usunąc kopii z karty SD po imporcie). Rootując telefon, lub używając innych exploitów istnieje pradopodobieństwo odczytu tych danych. Zapisane hasła przechowywane są w postaci czystego tekstu. W przypadku plików PKCS12, jest wysoce zalecane, aby zaimportować je do magazynu kluczy Android."</string>
<string name="import_vpn">Importuj</string>
+ <string name="broken_image_cert_title">Błąd przy wyświetlaniu wyboru certyfikatu</string>
+ <string name="broken_image_cert">Wystąpił wyjątek w trakcie próby wyświetlenia okna z wyborem certyfikatu. To w ogóle nie powinno się zdarzyć, gdyż jest to standardowa opcja Androida 4.0+. Być może wsparcie dla magazynu certyfikatów w Twoim ROMie jest źle zaimplementowane</string>
<string name="ipv4">IPv4</string>
<string name="ipv6">IPv6</string>
<string name="speed_waiting">Oczekiwanie na wiadomość powitalną&#8230;</string>
+ <string name="converted_profile">profil zaimportowany</string>
+ <string name="converted_profile_i">zaimportowano profil %d</string>
<string name="broken_images">Uszkodzone obrazy</string>
+ <string name="broken_images_faq">&lt;p&gt; Oficjalne obrazy HTC są znane z posiadania dziwnych problemów z routingiem powodując, że dane nie przepływają przez tunel (sprawdź także &lt;a href=\"https://github.com/schwabe/ics-openvpn/issues/18\"&gt;Issue 18&lt;/a&gt; w śledzeniu błędów). &lt;/p&gt;&lt;p&gt; Starsze oficjalne obrazy SONY dla Xperia Arc S oraz Xperia Ray są znane z całkowitego braku VPNService w obrazie. (Sprawdź także &lt;a href=\"https://github.com/schwabe/ics-openvpn/issues/29\"&gt;Issue 29&lt;/a&gt; w śledzeniu błędów). &lt;/p&gt;&lt;p&gt; We własnoręcznie kompilowanych obrazach może brakować modułu TUN, lub prawa dostępu do /dev/tun mogą być nieprawidłowe. Niektóre obrazy CM9 mogą wymagać opcji \"Popraw prawa dostępu\" w zakładce \"Dodatkowe opcje urządzenia\". &lt;/p&gt;&lt;p&gt;Co najważniejsze: jeśli Twoje urządzenie ma błędy w Android, zgłoś to producentowi. Im więcej osób zgłasza problemy, tym większe prawdopodobieństwo ich poprawy. &lt;/p&gt;</string>
<string name="pkcs12_file_encryption_key">Klucz pliku PKCS12</string>
<string name="private_key_password">Hasło klucza prywatnego</string>
<string name="password">Hasło</string>
<string name="file_icon">plik ikony</string>
<string name="tls_authentication">Uwierzytelnianie TLS</string>
- <string name="generated_config">Wygenerowana konfiguracja</string>
+ <string name="generated_config">Utworzona konfiguracja</string>
<string name="generalsettings">Ustawienia</string>
+ <string name="owner_fix_summary">Stara się ustawić właściciela /dev/tun na system. Niektóre obrazy CM9 wymagają tego, aby API VPNService zaczęło działać. Wymaga root-a.</string>
<string name="owner_fix">Popraw uprawnienia do /dev/tun</string>
<string name="generated_config_summary">Pokazuje wygenerowany plik konfiguracji OpenVPN</string>
- <string name="edit_profile_title">Edycja \"%s\"</string>
+ <string name="edit_profile_title">Edytujesz \"%s\"</string>
<string name="building_configration">Tworzenie konfiguracji&#8230;</string>
<string name="netchange_summary">Włączenie tej opcji spowoduje ponowne połączenie jeśli stan sieci się zmienił (np. z WiFi na GSM)</string>
<string name="netchange">Połącz ponownie przy zmianie sieci</string>
- <string name="netstatus">Status sieci: %s</string>
+ <string name="netstatus">Stan sieci: %s</string>
+ <string name="extracahint">Certyfikat CA z reguły zwracany jest z pęku kluczy Androida. Wybierz zewnętrzny certyfikat, jeśli występują błędy w weryfikacji.</string>
<string name="select_file">Wybierz</string>
+ <string name="keychain_nocacert">Brak certyfikatu CA zwróconego z pęku kluczy Androida. Autoryzacja najprawdopodobniej nie powiedzie się.</string>
+ <string name="show_log_summary">Pokazuje okno dziennika przy łączeniu. Do okna dziennika można dostać się zawsze z paska powiadomień.</string>
<string name="show_log_window">Pokaż okno loga</string>
+ <string name="mobile_info">%10$s %9$s na %3$s %1$s (%2$s), Android %6$s (%7$s) API %4$d, ABI %5$s, (%8$s)</string>
+ <string name="error_rsa_sign">Błąd podpisania kluczem z pęku kluczy Androida %1$s: %2$s</string>
+ <string name="faq_system_dialogs">Ostrzeżenie przy połączeniu VPN informuje Cię, że ta aplikacja przekierowuje cały ruch jest narzucona przez system w celu zapobieżenia nadużyciom API VPNService.\nPowiadomienie połączenia VPN (znak klucza) jest także narzucone przez Android, aby zasygnalizować połączenie z siecią VPN. Na niektórych obrazach Android to powiadomienie odtwarza dźwięk.\nAndroid wprowadził te dialogi systemowe dla Twojego bezpieczeństwa i aby upewnić się, że nie można ich obejść. (Niestety, na niektórych obrazach to także implikuje wydanie dźwięku)</string>
<string name="faq_system_dialogs_title">Ostrzeżenie połączeń oraz dźwięki powiadomień</string>
<string name="translationby">Angielskie tłumaczenie Arne Schwabe&lt;arne@rfc2549.org&gt;</string>
<string name="ipdns">IP i DNS</string>
<string name="basic">Podstawowe</string>
<string name="routing">Routing</string>
+ <string name="obscure">Niejasne ustawienia OpenVPN. Zazwyczaj nie są potrzebne.</string>
<string name="advanced">Zaawansowane</string>
- <string name="export_config_title">Konfiguracja ICS Openvpn</string>
+ <string name="export_config_title">Konfiguracja Openvpn ICS</string>
+ <string name="warn_no_dns">Nie są używane żadne serwery DNS. Rozpoznawanie nazw może nie działać. Rozważ ustawienie własnych serwerów DNS. Miej również na uwadze, że Android nadal będzie korzystać z ustawień proxy Twojego połączenia mobilnego/Wi-Fi, nawet gdy opcje DNS nie są ustawione.</string>
<string name="dns_add_error">Nie można dodać serwera DNS \"%1$s\", odrzucone przez system: %2$s</string>
+ <string name="ip_add_error">Nie można skonfigurować adresu IP \"%1$s\", odrzucone przez system: %2$s</string>
+ <string name="faq_howto">&lt;p&gt;Przygotuj działającą konfigurację (sprawdzoną na Twoim komputerze lub pobraną od Twojego dostawcy/pracodawcy)&lt;/p&gt;&lt;p&gt;Jeśli, jest to jeden plik - bez dodatkowych plików pem/pkcs12 - możesz taki plik wysłać do siebie e-mailem i otworzyć załącznik. Jeśli masz więcej, niż jeden plik - pobierz je na kartę SD.&lt;/p&gt;&lt;p&gt;Kliknij na załącznik w e-mailu/użyj ikony folderu na liście VPN, aby zaimportować plik konfiguracyjny.&lt;/p&gt;&lt;p&gt;Jeśli występują błędy brakującego pliku - umieść je na karcie SD.&lt;/p&gt;&lt;p&gt;Kliknij na ikonę zapisu, aby dodać zaimportowaną konfigurację do Twojej listy.&lt;/p&gt;&lt;p&gt;Połącz się z VPN klikając na nazwę połączenia VPN&lt;/p&gt;&lt;p&gt;Jeśli występują błędy/ostrzeżenia w logu, spróbuj je namierzyć i poprawić&lt;/p&gt; </string>
<string name="faq_howto_title">Szybki start</string>
<string name="setting_loadtun_summary">Próba załadowania modułu tun.ko kernel przez próbą połączenia. Potrzeba rootowanych urządzeń.</string>
<string name="setting_loadtun">Załaduj moduł tun</string>
- <string name="importpkcs12fromconfig">Importuj PKCS12 z konfiguracji do slepu kluczy Androida</string>
- <string name="getproxy_error">Błąd ustawień proxy: %s</string>
- <string name="using_proxy">Użycie proxy %1$s%2$d</string>
+ <string name="importpkcs12fromconfig">Importuj PKCS12 z konfiguracji do pęku kluczy Androida</string>
+ <string name="getproxy_error">Błąd pobierania ustawień proxy: %s</string>
+ <string name="using_proxy">Używam proxy %1$s%2$d</string>
<string name="use_system_proxy">Użyj proxy systemowego</string>
- <string name="use_system_proxy_summary">Użyj konfiguracji systemowej dla HTTP/HTTPS proxy w celu połączenia.</string>
+ <string name="use_system_proxy_summary">Połącz używając systemowej konfiguracji proxy HTTP/HTTPS.</string>
<string name="donatewithpaypal">Możesz &lt;a href=\"https://www.paypal.com/cgi-bin/webscr?hosted_button_id=R2M6ZP9AF25LS&amp;amp;cmd=_s-xclick\"&gt;wspomóc przez PayPal&lt;/a&gt; </string>
- <string name="onbootrestartsummary">OpenVPN połączy VPN jeśli był aktywny przy restarcie/zamknięciu systemu. Proszę przeczytać FAQ ostrzeżenia połączenia przez użyciem tej opcji.</string>
- <string name="onbootrestart">Połącz przy reboocie</string>
+ <string name="onbootrestartsummary">OpenVPN połączy ponownie z VPN jeśli połączenie było aktywne przy restarcie/zamknięciu systemu. Przeczytaj proszę FAQ z ostrzeżeniami przed użyciem tej opcji.</string>
+ <string name="onbootrestart">Połącz po restarcie</string>
<string name="ignore">Ignoruj</string>
- <string name="restart">Restartuj</string>
+ <string name="restart">Uruchom ponownie</string>
<string name="restart_vpn_after_change">Zmiany konfiguracji będą zatwierdzone po restarcie VPN. Uruchomić ponowie teraz?</string>
<string name="configuration_changed">Zmieniono konfigurację</string>
<string name="log_no_last_vpn">Nie można ustalić ostatnio połączonego profilu do edycji</string>
<string name="faq_duplicate_notification_title">Podwójne powiadomienia</string>
- <string name="no_vpn_profiles_defined">Nie zdefiniowano żadnego profilu.</string>
+ <string name="faq_duplicate_notification">Jeśli Android ma obciążoną pamięć (RAM), aplikacje i usługi, które nie są aktualnie potrzebne są usuwane z pamięci. To potrafi zakończyć aktualne połączenie VPN. Aby upewnić się, że połączenie/OpenVPN przetrwa usługa uruchomiona jest z wyższym priorytetem. Aby działać z wyższym priorytetem ta aplikacja musi wyświetlać powiadomienie. Ikona klucza jest narzucona przez system w sposób opisany w poprzednim wpisie FAQ. To nie liczy się jako powiadomienie w celu działania z wyższym priorytetem.</string>
+ <string name="no_vpn_profiles_defined">Brak połączeń VPN.</string>
+ <string name="add_new_vpn_hint">Użyj ikony &lt;img src=\"ic_menu_add\"/&gt; aby dodać nowe połączenie VPN</string>
+ <string name="vpn_import_hint">Użyj ikony &lt;img src=\"ic_menu_archive\"/&gt; aby zaimportować istniejący profil (.ovpn lub .conf) z karty SD.</string>
<string name="faq_hint">Sprawdź także nasze FAQ. Znajdziesz tam krótki poradnik dla początkujących.</string>
<string name="faq_routing_title">Konfiguracja trasy/interfejsu</string>
+ <string name="faq_routing">Konfiguracja routingu i interfejsów nie odbywa się za pomocą tradycyjnych komend ifconfig/route, lecz za pomocą API VPNService. Powoduje to inną konfigurację trasowania, niż ma to miejsce w innych systemach operacyjnych.\nKonfiguracja tunelu VPN składa się z listy adresów IP oraz sieci, które powinny być trasowane przez interfejs. Dzięki temu nie jest potrzebny ani wymagany adres peer\'a lub bramy. Trasy specjalne wymagane do połączenia z serwerem VPN także nie są wymagane (np. te dodawane w przypadku użycia redirect-gateway). Aplikacja podczas importu konsekwentnie ignoruje te ustawienia. Aplikacja poprzez API VPNService upewnia się, że połączenie do serwera nie jest realizowane przez tunel VPN.\nAPI VPNService nie zezwala na ustawianie sieci, które NIE powinny być trasowane przez VPN, jako obejście aplikacja stara się wykryć te sieci, które nie powinny być trasowane przez tunel (np. route x.x.x.x y.y.y.y net_gateway) i oblicza zestaw tras, które wyklucza emulując zachowanie na innych platformach. Okno dziennika pokazuje konfigurację VPNService podczas wykonywania połączenia.\nZa kulisami: Android 4.4+ używa polityki trasowania. Użycie route/ifconfig nie pokaże aktualnie zainstalowanych tras. Zamiast tego użyj ip rule, iptables -t -mangle -L</string>
+ <string name="persisttun_summary">Nie używaj sieci niezabezpieczonych VPN podczas ponownego łączenia przez OpenVPN.</string>
<string name="persistent_tun_title">Persistent tun</string>
<string name="openvpn_log">Log OpenVPN</string>
<string name="import_config">Importuj konfigurację OpenVPN</string>
<string name="battery_consumption_title">Zużycie baterii</string>
+ <string name="baterry_consumption">Podczas osobistych testów odkryłem, iż głównym powodem sporego zużycia baterii przez OpenVPN są pakiety keepalive. Większość serwerów OpenVPN ma ustawienie \'keepalive 10 60\', które narzuca klientowi oraz serwerowi wymianę pakietów keepalive co 10 sekund. &lt;p&gt; Podczas, gdy te pakiety są małe i nie zużywają wiele pasma, utrzymują one radio komórkowe w trybie pracy i zwiększają zużycie energii. (Sprawdź także &lt;a href=\"http://developer.android.com/training/efficient-downloads/efficient-network-access.html#RadioStateMachine\"&gt;The Radio State Machine | Android Developers&lt;/a&gt;) &lt;p&gt; Ustawienie keepalive nie może być zmienione po stronie klienta. Tylko administrator serwera OpenVPN jest w stanie zmienić to ustawienie. &lt;p&gt; Niestety, w przypadku UDP niektóre konfiguracje NAT źle tolerują ustawienie keepalive większe niż 60 sekund powodując odrzucanie pakietów z powodu nieaktywności połączenia. Używanie protokółu TCP z większym timeout działa, jednak tunelowanie TCP-po-TCP bardzo źle się sprawuje przy połączeniach z dużą stratnością pakietów. (See &lt;a href=\"http://sites.inka.de/bigred/devel/tcp-tcp.html\"&gt;Why TCP Over TCP Is A Bad Idea&lt;/a&gt;)</string>
+ <string name="faq_tethering">Funkcja Android Tethering (przez WiFi, USB lub Bluetooth) i interfejs API VPNService (stosowany przez ten program) nie działają razem. Aby uzyskać więcej informacji zobacz &lt;href=\"https://github.com/schwabe/ics-openvpn/issues/34\"&gt; problem #34 &lt;/a&gt;</string>
<string name="vpn_tethering_title">VPN i Tethering</string>
<string name="connection_retries">Próby połączenia</string>
<string name="reconnection_settings">Ustawienia ponownego połączenia</string>
@@ -210,9 +257,9 @@
<string name="start_vpn_title">Łączę z VPN %s</string>
<string name="start_vpn_ticker">Łączę z VPN %s</string>
<string name="jelly_keystore_alphanumeric_bug">Niektóre wersje Androida 4.1 mają problemy, jeśli nazwa certyfikatu zawiera niealfanumeryczne znaki (spacje, podkreślenia, myślniki). Spróbuj zaimportować certyfikat bez znaków specjalnych</string>
+ <string name="encryption_cipher">Szyfr kodujący</string>
<string name="packet_auth">Pakiety uwierzytelniania</string>
<string name="auth_dialog_title">Wpisz metodę uwierzytelniania pakietów</string>
- <string name="mobile_info_extended">Działa na %1$s (%2$s) %3$s, Android API %4$d, wersja %5$s, %6$s</string>
<string name="built_by">zbudowany przez %s</string>
<string name="debug_build">Kompilacja z debugiem</string>
<string name="official_build">Oficjalna kompilacja</string>
@@ -227,6 +274,7 @@
<string name="tls_remote_deprecated">tls-remote (PRZESTARZAŁE)</string>
<string name="help_translate">Możesz pomóc w tłumaczeniu odwiedzająć http://crowdin.net/project/ics-openvpn/invite</string>
<string name="prompt">%1$s próby kontroli %2$s</string>
+ <string name="remote_warning">Akceptując, dajesz aplikacji uprawnienia do pełnego kontrolowania przez OpenVPN całego ruchu sieciowego. <b>Nie akceptuj, jeżeli nie ufasz aplikacji w pełni. </b> W przeciwnym razie istnieje ryzyko przejęcia danych przez złośliwe oprogramowanie</string>
<string name="remote_trust">Ufam tej aplikacji.</string>
<string name="no_external_app_allowed">Żadna aplikacja nie ma pozwolenia do używania zewnętrznego API</string>
<string name="allowed_apps">Dozwolone aplikacje: %s</string>
@@ -260,4 +308,81 @@
<string name="uploaded_data">Wysyłanie</string>
<string name="downloaded_data">Pobieranie</string>
<string name="vpn_status">Status VPN</string>
+ <string name="logview_options">Opcje widoku</string>
+ <string name="unhandled_exception">Nieobsługiwany wyjątek: %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">Pełne licencje</string>
+ <string name="blocklocal_summary">Sieci połączone bezpośrednio do lokalnych interfejsów nie będą kierowane przez VPN. Odznaczając tę opcję przeniesiesz cały ruch przeznaczony dla sieci lokalnych przez VPN.</string>
+ <string name="blocklocal_title">Obejdź VPN dla sieci lokalnych</string>
+ <string name="userpw_file">Plik użytkowników/haseł</string>
+ <string name="imported_from_file">[Importowane z: %s]</string>
+ <string name="files_missing_hint">Nie mogę odnaleźć niektórych plików. Wybierz je, aby zaimportować profil:</string>
+ <string name="openvpn_is_no_free_vpn">Aby skorzystać z tej aplikacji potrzebujesz dostawcy lub bramy VPN obsługującej OpenVPN (często świadczonych przez pracodawcę). Aby uzyskać więcej informacji o OpenVPN i dowiedzieć się jak stworzyć własny serwer zajrzyj na http://community.openvpn.net/</string>
+ <string name="import_log">Dziennik importu:</string>
+ <string name="ip_looks_like_subnet">Określono topologię \"%3$s\", jednak ifconfig %1$s %2$s wygląda bardziej na adres IP z maską. Zakładam, że chodzi o topologię \"subnet\".</string>
+ <string name="mssfix_invalid_value">Wartość nadpisywania MSS musi być liczbą całkowitą pomiędzy 0 i 9000</string>
+ <string name="mssfix_value_dialog">Ogłasza sesjom TCP przekazywanym przez tunel, że powinny ograniczyć wielkość pakietu tak, aby po enkapsulacji przez OpenVPN wynikowy rozmiar pakietu UDP wysyłanego przez VPN do peer\'a nie przekraczał tej liczby bajtów (domyślnie 1450)</string>
+ <string name="mssfix_checkbox">Zastępuje wartość MSS pakietu TCP</string>
+ <string name="mssfix_dialogtitle">Ustaw wartość MSS pakietu TCP</string>
+ <string name="client_behaviour">Zachowanie klienta</string>
+ <string name="clear_external_apps">Wyczyść dozwolone aplikacje</string>
+ <string name="loading">Trwa ładowanie&#8230;</string>
+ <string name="allowed_vpn_apps_info">Dozwolone aplikacje VPN: %1$s</string>
+ <string name="disallowed_vpn_apps_info">Niedozwolone aplikacje VPN: %1$s</string>
+ <string name="app_no_longer_exists">Aplikacja %s nie jest już zainstalowana, usuwam ją z listy dozwolonych/zabronionych</string>
+ <string name="vpn_disallow_radio">VPN jest używany dla wszystkich aplikacji, ale wyklucza wybrane</string>
+ <string name="vpn_allow_radio">VPN jest używany tylko dla wybranych aplikacji</string>
+ <string name="query_delete_remote">Usunąć wpis serwera?</string>
+ <string name="keep">Zachowaj</string>
+ <string name="delete">Usuń</string>
+ <string name="add_remote">Dodaj nowy</string>
+ <string name="remote_random">Użyj wpisów w losowej kolejności przy próbie połączenia</string>
+ <string name="remote_no_server_selected">Musisz zdefiniować i włączyć co najmniej jeden serwer.</string>
+ <string name="server_list">Lista serwerów</string>
+ <string name="vpn_allowed_apps">Dozwolone aplikacje</string>
+ <string name="advanced_settings">Opcje zaawansowane</string>
+ <string name="payload_options">Opcje ładunku</string>
+ <string name="tls_settings">Ustawienia TLS</string>
+ <string name="no_remote_defined">Nie ustawiono zdalnego</string>
+ <string name="duplicate_vpn">Powiel profil VPN</string>
+ <string name="duplicate_profile_title">Powielam profil: %s</string>
+ <string name="show_log">Pokaż dziennik</string>
+ <string name="faq_androids_clients_title">Różnice pomiędzy klientami OpenVPN dla Androida</string>
+ <string name="ignore_multicast_route">Ignoruj trasę multicast: %s</string>
+ <string name="ab_only_cidr">Android wspiera tylko trasy CIDR w sieci VPN. Jako, że trasy nie-CIDR nie są powszechnie używane, OpenVPN dla Androida użyje /32 dla tras w formacie nie-CIDR i wyświetli błąd.</string>
+ <string name="ab_tethering_44">Tethering działa podczas połączenia z VPN. Udostępnione połączenie NIE będzie używało VPN.</string>
+ <string name="ab_kitkat_mss">Wczesne wersje KitKat ustawiają złą wartość MSS połączeń TCP (#61948). Spróbuj ustawić opcję mssfix w celu obejścia tego problemu.</string>
+ <string name="ab_lollipop_reinstall">Aplikacje VPN mogą przestać działać po odinstalowaniu i ponownej instalacji. W celu uzyskania szczegółów zobacz #80074</string>
+ <string name="ab_secondary_users">VPN absolutnie nie działa dla dodatkowych użytkowników.</string>
+ <string name="ab_kitkat_reconnect">"Jest grono użytkowników, którzy donoszą, iż podczas używania aplikacji VPN połączenie danych/komórkowe jest często zrywane. Zachowanie to wydaje się dotykać niewielkiej liczby urządzeń/dostawców danych komórkowych - na tę chwilę nieznana jest przyczyna, ani rozwiązanie problemu."</string>
+ <string name="ab_only_cidr_title">Trasy nie-CIDR</string>
+ <string name="ab_proxy_title">Zachowanie Proxy w sieci VPN</string>
+ <string name="ab_lollipop_reinstall_title">Ponowna instalacja aplikacji VPN</string>
+ <string name="version_upto">%s i wcześniejsze</string>
+ <string name="copy_of_profile">Kopia %s</string>
+ <string name="ab_not_route_to_vpn_title">Trasa do skonfigurowanego adresu IP</string>
+ <string name="ab_kitkat_mss_title">Błędna wartość MSS dla połączenia VPN</string>
+ <string name="ab_secondary_users_title">Dodatkowi użytkownicy tabletu</string>
+ <string name="custom_connection_options_warng">Określ własne opcje dla połączenia. Używaj z rozwagą</string>
+ <string name="custom_connection_options">Opcje niestandardowe</string>
+ <string name="remove_connection_entry">Usuń wpis połączenia</string>
+ <string name="ab_kitkat_reconnect_title">Losowe rozłączenia z sieci komórkowej</string>
+ <string name="ab_vpn_reachability_44_title">Zdalne sieci nie są osiągalne</string>
+ <string name="ab_persist_tun_title">Tryb persist tun</string>
+ <string name="version_and_later">%s i późniejsze</string>
+ <string name="message_no_user_edit">Ten profil został dodany przez zewnętrzną aplikację (%s) i został oznaczony jako nie edytowalny przez użytkownika.</string>
+ <string name="crl_file">Listy odwoławcze CRL</string>
+ <string name="service_restarted">Restartuję usługę OpenVPN (Aplikacja wywaliła się lub zabito ją z powodu braku pamięci)</string>
+ <string name="import_config_error">Importowanie konfiguracji wyrzuciło błąd, nie mogę tego zapisać</string>
+ <string name="Search">Szukaj</string>
+ <string name="lastdumpdate">(Ostatni zrzut sprzed %1$d:%2$dh, (%3$s))</string>
+ <string name="clear_log_on_connect">Wyczyść dziennik przy nowym połączeniu</string>
+ <string name="connect_timeout">Limit czasu połączenia</string>
+ <string name="no_allowed_app">Dodano niedozwoloną aplikację. Dodaję siebie (%s), żeby mieć przynajmniej jedną aplikację w liście dozwolonych aplikacji, aby nie pozwolić wszystkim aplikacjom</string>
+ <string name="query_permissions_sdcard">OpenVPN dla Android spróbuje automatycznie wykryć brakujące pliki na karcie SD. Dotknij tego komunikatu, aby żądać uprawnień.</string>
+ <string name="protocol">Protokół</string>
+ <string name="enabled_connection_entry">Włączony</string>
+ <string name="months_left">pozostało %d miesięcy</string>
+ <string name="days_left">pozostało %d dni</string>
+ <string name="hours_left">pozostało %d godzin</string>
</resources>
diff --git a/app/src/main/res/values-ro/strings-icsopenvpn.xml b/app/src/main/res/values-ro/strings-icsopenvpn.xml
index b368995d..ded69fb7 100755
--- a/app/src/main/res/values-ro/strings-icsopenvpn.xml
+++ b/app/src/main/res/values-ro/strings-icsopenvpn.xml
@@ -174,7 +174,6 @@
<string name="keychain_nocacert">Nici un certificat CA nu a fost returnat la citirea din keystore-ul Android. Autentificarea probabil va eşua.</string>
<string name="show_log_summary">Afişează fereastra jurnal la conectare. Fereastra jurnal poate fi accesată oricând din statusul notificare.</string>
<string name="show_log_window">Arată fereastra Jurnal</string>
- <string name="mobile_info">Rulează pe %1$s (%2$s) %3$s, Android API %4$d</string>
<string name="error_rsa_sign">Eroare semnare cu Android keystore key %1$s: %2$s</string>
<string name="faq_system_dialogs">Avertizarea la conexiunea VPN ce vă spune că această aplicaţie poate intercepta întreg traficul este impusă de sistem pentru a preveni abuzul funcţiei API VPNService.\nNotificarea de conexiune VPN(simbolul cheie)este de asemenea impusă de sistemul Android pentru a semnala o conexiune VPN în derulare. În cadrul unor imagini această notificare face şi un sunet.\nAndroid a introdus aceste notificări pentru siguranţa dvs. şi este asigurat că nu pot fi evitate. (Din păcate în anumite imagini acestea includ şi un sunet de notificare)</string>
<string name="faq_system_dialogs_title">Alertă conexiune şi sunet notificare</string>
@@ -252,7 +251,6 @@
<string name="encryption_cipher">Cifru criptare</string>
<string name="packet_auth">Autentificare pachete</string>
<string name="auth_dialog_title">Introduceţi metoda de autentificare de pachete</string>
- <string name="mobile_info_extended">Rulează pe %1$s (%2$s) %3$s, Android API %4$d, versiunea %5$s, %6$s</string>
<string name="built_by">compilat de %s</string>
<string name="debug_build">versiune debug</string>
<string name="official_build">versiune oficială</string>
diff --git a/app/src/main/res/values-ru/strings-icsopenvpn.xml b/app/src/main/res/values-ru/strings-icsopenvpn.xml
index 4af9e15c..921b5342 100755
--- a/app/src/main/res/values-ru/strings-icsopenvpn.xml
+++ b/app/src/main/res/values-ru/strings-icsopenvpn.xml
@@ -180,7 +180,6 @@
<string name="keychain_nocacert">Не удалось получить CA из хранилища ключей Android. Аутентификация не удалась.</string>
<string name="show_log_summary">Показывает окно журнала при подключении. Окно журнала всегда может быть доступно из панели уведомлений.</string>
<string name="show_log_window">Показать окно журнала</string>
- <string name="mobile_info">Работает на %1$s (%2$s) %3$s, Android API %4$d</string>
<string name="error_rsa_sign">Ошибка подписи с использованием ключа из хранилища Android %1$s: %2$s</string>
<string name="faq_system_dialogs">Предупреждение VPN соединения сообщает вам, что это приложение может перехватывать весь сетевой трафик, и сообщается системой предупреждений VPNService API.\nИзвещение о VPN соединении (символ \"Ключа\") также формируется системой Android для сигнализации исходящего VPN соединения. В некоторых прошивках это оповещение сопровождается сигналом.\nAndroid использует эти оповещения для вашей собственной безопасности и из нельзя обойти. (К сожалению, на некоторых прошивках также издается оповещение звуком)</string>
<string name="faq_system_dialogs_title">Сообщение о подключении и звук уведомления</string>
@@ -260,7 +259,6 @@
<string name="encryption_cipher">Алгоритм шифрования</string>
<string name="packet_auth">Проверка подлинности пакетов</string>
<string name="auth_dialog_title">Укажите метод проверки подлинности пакетов</string>
- <string name="mobile_info_extended">Запущен на %1$s (%2$s) %3$s, Android API %4$d, версии %5$s, %6$s</string>
<string name="built_by">создан %s</string>
<string name="debug_build">сборка для отладки</string>
<string name="official_build">официальная сборка</string>
@@ -323,4 +321,55 @@
<string name="openvpn_is_no_free_vpn">Для использования данного приложения Вам необходим VPN провайдер/шлюз поддерживающий OpenVPN. Для получения информации по настройке собственного OpenVPN сервера: http://community.openvpn.net/</string>
<string name="import_log">Лог импорта:</string>
<string name="ip_looks_like_subnet">VPN топологии «%3$s» указан но ifconfig %1$s %2$s выглядит больше как IP-адрес с маской сети. Если топология «подсеть».</string>
+ <string name="mssfix_invalid_value">Значение, перезаписывающее MSS, должно быть целым числом от 0 до 9000</string>
+ <string name="mssfix_value_dialog">Объявить TCP сессиям, работающим через туннель, что они должны ограниччить размер своих пакетов так, чтобы после их инкапсуляции OpenVPN, результирующий размер UDP пакета, который OpenVPN посылает своим пирам, не превышал это число байт. (1450 по умолчанию)</string>
+ <string name="mssfix_checkbox">Переписать значение MSS для TCP нагрузки</string>
+ <string name="mssfix_dialogtitle">Задать MSS для TCP нагрузки</string>
+ <string name="client_behaviour">Поведение клиента-программы</string>
+ <string name="clear_external_apps">Очистить разрешенные внешние приложения</string>
+ <string name="loading">Загружается&#8230;</string>
+ <string name="allowed_vpn_apps_info">Разрешенные VPN приложения: %1$s</string>
+ <string name="disallowed_vpn_apps_info">Запрещенные VPN приложения: %1$s</string>
+ <string name="app_no_longer_exists">Пакет %s больше не установлен, происходит его удаление из списка разрешенных/запрещенных приложений</string>
+ <string name="vpn_disallow_radio">Использовать VPN для всех приложений, кроме выбранных</string>
+ <string name="vpn_allow_radio">Использовать VPN только для выбранных приложений</string>
+ <string name="query_delete_remote">Убрать запись удаленного сервера?</string>
+ <string name="keep">Сохранить</string>
+ <string name="delete">Удалить</string>
+ <string name="add_remote">Добавить новую удаленку</string>
+ <string name="remote_random">Использовать список подключений в случайном порядке при соединении</string>
+ <string name="remote_no_server_selected">Вы должны определить и включить как минумум один удаленный сервер.</string>
+ <string name="server_list">Список серверов</string>
+ <string name="vpn_allowed_apps">Разрешенные Приложения</string>
+ <string name="advanced_settings">Расширенные настройки</string>
+ <string name="payload_options">Опции нагрузки</string>
+ <string name="tls_settings">Настройки TLS</string>
+ <string name="no_remote_defined">Нет заданной удаленки</string>
+ <string name="duplicate_vpn">Дублировать VPN профиль</string>
+ <string name="duplicate_profile_title">Дублирование профиля: %s</string>
+ <string name="show_log">Показать журнал</string>
+ <string name="faq_android_clients">Существуют различные OpenVPN клиенты для Android. Самые распространенные - OpenVPN for Android (этот клиент), OpenVPN Connect и OpenVPN Settings.&lt;p&gt;Клиенты можно разделить на две группы: OpenVPN for Android и OpenVPN Connect используют официальный VPNService API (Android 4.0+) и не трубуют root-доступ, и OpenVPN Settings, который требует root.&lt;p&gt;OpenVPN for Android - клиент с открытым исходным кодом, который разработал Arne Schwabe. Он предназначен для более опытных пользователей и предоставляет много настроек и возможность испорта профилей из файлов и настраивать/изменять профили внутри приложения. Этот клиент основан на общественной версии OpenVPN. На исходном коде OpenVPN 2.x. Этот клиент может быть представлен как полуофициальный клиент сообщества. &lt;p&gt;OpenVPN Connect - клиент с закрытым исходным кодом, который разработан OpenVPN Technologies, Inc. Он призван для обычного использования и предназначен для средних пользователей, и позволяет импортировать профили из OpenVPN. Этот клиент основан на OpenVPN C++ и написал с использванием протокола OpenVPN (Это требовалось для разрешения OpenVPN Technologies, Inc опубликовать приложение OpenVPN на iOS). Этот клиент - официальный клиент OpenVPN technologies &lt;p&gt; OpenVPN Settings - старейший из клиентов, а также UI для OpenVPN с открытым исходным кодом. В отличие от OpenVPN for Android, он требует root-прав и не использует VPNService API. Он не зависит от Android 4.0+</string>
+ <string name="faq_androids_clients_title">Различия между OpenVPN Android клиентами</string>
+ <string name="ignore_multicast_route">Игнорируется мультиадресный маршрут: %s</string>
+ <string name="ab_only_cidr">Android поддерживет только CIDR маршруты к VPN. Поскольку не CIDR маршруты почти никогда не используются, OpenVPN for Android будет использовать /32 для не CIDR маршрутов и выдавать предупреждение.</string>
+ <string name="ab_tethering_44">Тетеринг/раздача интернета работает, когда активен VPN. Модемное соединение (тетеринг) НЕ БУДЕТ использовать VPN.</string>
+ <string name="ab_kitkat_mss">Ранние версии KitKat устанавливают неверное значение MSS для TCP соединений (#61948). OpenVPN for Android автоматически включает опцию mssfix, чтобы обойти этот баг.</string>
+ <string name="ab_proxy">Android будет продолжать использовать ваши настройки прокси, указанные для мобильного/Wi-Fi соединения, когда не установлен DNS сервер. OpenVPN for Android предупредит вас об этом в журнале.<p>Когда VPN устанавливает DNS сервер Android не использует прокси. Для установки прокси для VPN соединения нет API.</p></string>
+ <string name="ab_lollipop_reinstall">VPN приложения могут перестать работать после удаления и повторной установки. Подробности см. #80074</string>
+ <string name="ab_not_route_to_vpn">IP сконфигурированного клиента и IPs в его сетевой маске немаршрутизированны к VPN. OpenVPN обходит этот баг, явно добавляя маршрут, который соответствует клиентскому IP и его сетевой маске</string>
+ <string name="ab_persist_tun">Открытие туннеля, когда туннель уже активен, для его постоянного удержания, может привести к ошибке и VPNServices закроется на устройстве. Для возобновления работы VPN требуется перезагрузка. OpenVPN for Android пытается избежать установки второго туннеля, и если действительно нужно - сначала закрывает текущий туннель, перед открытием нового, чтобы избежать краха программы. Это может привести к маленькому интервалу, в котором передача пакетов происходит по обычному (не VPN) соединению. Даже с этими ухищрениями VPNServices иногда крашится и требует перезагрузки устройства.</string>
+ <string name="ab_secondary_users">VPN не работает совсем для вторичных пользователей.</string>
+ <string name="ab_kitkat_reconnect">"Различные пользователи сообщают, что мобильная связь/мобильная передача данных часто обрывается, когда используется VPN приложение. Такое поведение, кажется, затрагивает только некторые комбинации провайдеров/устройств, и пока что не выявлена причина/нет обхода этого бага."</string>
+ <string name="ab_vpn_reachability_44">Адреса могут работать через VPN только те, которые доступны без VPN. IPv6 VPN не работают вообще.</string>
+ <string name="ab_only_cidr_title">Не CIDR маршруты</string>
+ <string name="ab_proxy_title">Поведение прокси для VPN</string>
+ <string name="ab_lollipop_reinstall_title">Переустанавливаются приложения VPN</string>
+ <string name="version_upto">%s и ранее</string>
+ <string name="copy_of_profile">Копия %s</string>
+ <string name="ab_not_route_to_vpn_title">Маршрутизация к установленному IP адресу</string>
+ <string name="ab_kitkat_mss_title">Неверное значение MSS для VPN соединения</string>
+ <string name="ab_secondary_users_title">Дополнительные пользователи устройства</string>
+ <string name="custom_connection_options_warng">Укажите особые пользовательские параметры подключения. Используйте с осторожностью</string>
+ <string name="custom_connection_options">Пользовательские Параметры</string>
+ <string name="remove_connection_entry">Удалить запись подключения</string>
</resources>
diff --git a/app/src/main/res/values-sv/strings-icsopenvpn.xml b/app/src/main/res/values-sv/strings-icsopenvpn.xml
index 6ef522c4..b7510ef1 100755
--- a/app/src/main/res/values-sv/strings-icsopenvpn.xml
+++ b/app/src/main/res/values-sv/strings-icsopenvpn.xml
@@ -87,7 +87,9 @@
<string name="default_route_summary">Omdirigerar all trafik över VPN-anslutningen</string>
<string name="use_default_title">Använd standardrutt</string>
<string name="custom_route_message">Ange anpassade rutter. Skriv destination i CIDR-format. \"10.0.0.0/8 2002:: / 16\" dirigerar nätverk 10.0.0.0/8 och 2002:: / 16 över VPN.</string>
+ <string name="custom_route_message_excluded">Rutter som INTE bör dirigeras över VPN. Använd samma syntax som för ingående rutter.</string>
<string name="custom_routes_title">Anpassade rutter</string>
+ <string name="custom_routes_title_excluded">Exkluderade nätverk</string>
<string name="log_verbosity_level">Utförlighetsnivå för log</string>
<string name="float_summary">Tillåter autentiserade paket från alla IP-adresser</string>
<string name="float_title">Tillåt flytande server</string>
@@ -174,7 +176,6 @@
<string name="keychain_nocacert">Inget CA certifikat returnerades från Android Keystore. Autenticering kommer troligen att misslyckas.</string>
<string name="show_log_summary">Visar loggfönstret vid anslutning. Loggfönstret kan alltid nås från statusgardinen.</string>
<string name="show_log_window">Visa loggfönstret</string>
- <string name="mobile_info">Kör på %1$s (%2$s) %3$s, Android API %4$d</string>
<string name="error_rsa_sign">Fel vid signering med Android keystore nyckeln %1$s: %2$s</string>
<string name="faq_system_dialogs">Varningen vid VPN-anslutning som berättar att denna app kan avlyssna all trafik utfärdas av systemet för att förhindra missbruk av VPNService API.\nNotifieringen om VPN-anslutning (nyckelsymbolen) tillhandahålles också av Android-systemet för att signalera en pågående VPN-anslutning. På vissa ROM spelar denna notifiering ett ljud.\nAndroid har infört dessa dialogrutor och notifieringar för din egen säkerhet och kan inte undvikas. (På vissa ROM innehåller dessa tyvärr ljud)</string>
<string name="faq_system_dialogs_title">Anslutnings varning och ljud</string>
@@ -251,7 +252,6 @@
<string name="encryption_cipher">Krypteringschiffer</string>
<string name="packet_auth">Paketautentisering</string>
<string name="auth_dialog_title">Ange autentiseringsmetod för paket</string>
- <string name="mobile_info_extended">Kör på %1$s (%2$s) %3$s, Android API %4$d, version %5$s, %6$s</string>
<string name="built_by">byggd av %s</string>
<string name="debug_build">felsöknings bygge</string>
<string name="official_build">officiellt bygge</string>
diff --git a/app/src/main/res/values-sw600dp/dimens.xml b/app/src/main/res/values-sw600dp/dimens.xml
index 94a120d1..100861fc 100644
--- a/app/src/main/res/values-sw600dp/dimens.xml
+++ b/app/src/main/res/values-sw600dp/dimens.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
- ~ Copyright (c) 2012-2014 Arne Schwabe
+ ~ Copyright (c) 2012-2016 Arne Schwabe
~ Distributed under the GNU GPL v2 with additional terms. For full terms see the file doc/LICENSE.txt
-->
diff --git a/app/src/main/res/values-sw600dp/styles.xml b/app/src/main/res/values-sw600dp/styles.xml
index c320388d..387b2a81 100644
--- a/app/src/main/res/values-sw600dp/styles.xml
+++ b/app/src/main/res/values-sw600dp/styles.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
- ~ Copyright (c) 2012-2014 Arne Schwabe
+ ~ Copyright (c) 2012-2016 Arne Schwabe
~ Distributed under the GNU GPL v2 with additional terms. For full terms see the file doc/LICENSE.txt
-->
diff --git a/app/src/main/res/values-tr/strings-icsopenvpn.xml b/app/src/main/res/values-tr/strings-icsopenvpn.xml
index 106f407f..a9622ff1 100755
--- a/app/src/main/res/values-tr/strings-icsopenvpn.xml
+++ b/app/src/main/res/values-tr/strings-icsopenvpn.xml
@@ -181,7 +181,7 @@
<string name="keychain_nocacert">Hayır CA sertifikasını okurken Android deposunu döndürdü. Kimlik doğrulama muhtemelen başarısız olur.</string>
<string name="show_log_summary">Bağlama kütüğü penceresi üzerinde gösterir. Kütüğü penceresi her zaman bildirim durumu erişilebilir.</string>
<string name="show_log_window">Günlüğü penceresini göster</string>
- <string name="mobile_info">%1$s (%2$s) %3$s, Android API %4$d d\'çalışması</string>
+ <string name="mobile_info">%10$s %9$s %3$s %1$s (%2$s), Android %6$s (%7$s) API %4$d, ABI %5$s, (%8$s) üzerinde çalışıyor</string>
<string name="error_rsa_sign">Android deposunun anahtarı %1$s %2$s ile imzalama hatası</string>
<string name="faq_system_dialogs">Bu app tüm trafiği geçirebilir belirten VPN bağlantısı uyarı dayatılan VPNService API.\nThe VPN bağlantısının istismarını önlemek için sistem tarafından bildirim (anahtar simgesi) da devam eden bir VPN bağlantısı sinyal için Android sistem tarafından uygulanmaktadır. Bu bildirim çalış bazı görüntülerde ses. \nAndroid kendi güvenliğiniz için bu sistem diyaloglar tanıttı ve circumenvented olamaz emin oldum. (Bazı görüntülerde bu unfortunely notifciation ses içerir)</string>
<string name="faq_system_dialogs_title">Bağlantı uyarı ve bildirim sesi</string>
@@ -219,6 +219,7 @@
<string name="vpn_import_hint">Kullanım &lt; img src = \"ic_menu_archive\" / &gt; simgesi sdcard (.ovpn veya .conf) bir profili almak için.</string>
<string name="faq_hint">Ayrıca SSS kontrol etmeyi unutmayın. Hızlı Başlangıç Kılavuzu vardır.</string>
<string name="faq_routing_title">Yönlendirme/arabirimi yapılandırması</string>
+ <string name="faq_routing">Yönlendirme ve arayüz konfigürasyonu klasik ifconfig / rota komutlarıyla değil VPNService API kullanarak yapılmaktadır. Bu diğer işletim sistemlerindekinden farklı bir yönlendirme konfigürasyonu gerektirmektedir.\n VPN tünelinin konfigürasyonu IP adresleri ve bu adreslerin bu arayüz üstünden yönlendirileceği ağlardan oluşur. Özellikle hiçbir eş ortak adresi ya da ağ geçidi adresi gerekli degildir. VPN sunucusuna ulaşmak için özel yollar (redirect-gateway kullanıldığında eklenenler gibi) da gerekli değildir. Bu sebepten dolayı uygulama, bir konfigurasyon alırken bu ayarları yoksayar. App, VPN Servis API\'sı ile sunucuyla olan bağlantının VPN tüneline yönlendirilmesini engeller.\n VPN servisi APIsı VPN üstünden yönlendirilmemesi gereken ağların belirtilmesine izin vermemektedir. Çözüm olarak program tünel üstünden yönlendirilmemesi gereken ağları (örneğin x.x.x.x y.y.y.y net_gateway rotası) bulmaya çalışıp bu rotaları içermeyen bir rota grubu oluşturarak diğer işletim sistemlerindeki davranışı oluşturur. Kütük penceresi VPN servisinin bağlantı sonucu oluşan konfigürasyonunu gösterir.\n Arka planda Android 4.4+ kural tabanlı yönlendirme kullanır. route/ifconfig komutları kullanılan rotaları göstermeyecektir. Bu komutlar yerine ip rule, iptables -t mangle -L komutlarını kullanın</string>
<string name="persisttun_summary">OpenVPN yeniden bağlamadan zaman VPN bağlantısı değil geri dönüş yap</string>
<string name="persistent_tun_title">Kalıcı tun</string>
<string name="openvpn_log">OpenVPN kayıtları</string>
@@ -260,7 +261,6 @@
<string name="encryption_cipher">Şifre şifresi</string>
<string name="packet_auth">Paket kimlik doğrulama</string>
<string name="auth_dialog_title">Paket kimlik doğrulama yöntemini girin</string>
- <string name="mobile_info_extended">Çalışan %1$s (%2$s) %3$s, Android API %4$d, sürüm %5$s, %6$s</string>
<string name="built_by">%s tarafından inşa</string>
<string name="debug_build">hata ayıklama yapı</string>
<string name="official_build">resmi yapı</string>
@@ -314,12 +314,16 @@
<string name="logview_options">Görünüm seçenekleri</string>
<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="faq_system_dialog_xposed">Eğer android cihazınızı rootladıysanız &lt;a href=\"http://xposed.info/\"&gt;Xposed &lt;/a&gt; ve &lt;a href=\"http://repo.xposed.info/module/de.blinkt.vpndialogxposed\"&gt;VPN Dialog confirm modülünü&lt;/a&gt; sorumluluğunu kendiniz alarak yükleyebilirsiniz</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>
<string name="imported_from_file">[Buradan içeri aktar: %s]</string>
+ <string name="files_missing_hint">Bazı dosyalar bulunamadı. Lütfen profile aktarılacak dosyaları seçiniz:</string>
<string name="import_log">Kaydı içe aktar:</string>
+ <string name="mssfix_invalid_value">MSS değeri 0 ile 9000 arasında bir tamsayı olmak zorundadır</string>
<string name="client_behaviour">İstemci davranışı</string>
+ <string name="clear_external_apps">İzin verilmiş harici uygulamaları temizle</string>
<string name="loading">Yükleniyor&#8230;</string>
<string name="allowed_vpn_apps_info">Izin verilen VPN uygulamaları: %1$s</string>
<string name="disallowed_vpn_apps_info">İzin verilmeyen VPN uygulamaları: %1$s</string>
@@ -330,19 +334,38 @@
<string name="keep">Sakla</string>
<string name="delete">Sil</string>
<string name="add_remote">Yenı uzak sunucu ekle</string>
+ <string name="remote_random">Bağlanmak için bağlantı girişlerini rasgele bir sırada kullan</string>
<string name="remote_no_server_selected">En az bir uzak sunucu tanımlamalı ve etkinleştirmelisiniz.</string>
<string name="server_list">Sunucu Listesi</string>
<string name="vpn_allowed_apps">İzin verilen uygulamalar</string>
<string name="advanced_settings">Gelişmiş Ayarlar</string>
<string name="payload_options">Yük seçenekleri</string>
<string name="tls_settings">TLS Ayarları</string>
+ <string name="duplicate_vpn">VPN profilini kopyala</string>
+ <string name="duplicate_profile_title">Profil kopyalama: %s</string>
<string name="show_log">Günlüğü göster</string>
+ <string name="faq_androids_clients_title">Android için OpenVPN uygulamaları aralarındaki farklar</string>
+ <string name="ignore_multicast_route">Multicast rotasını yoksayma:%s</string>
<string name="ab_proxy_title">VPN\'ler için Proxy davranışı</string>
<string name="ab_lollipop_reinstall_title">VPN uygulamaları yeniden yükleme</string>
<string name="version_upto">%s ve önceki</string>
<string name="copy_of_profile">%s kopyası</string>
+ <string name="ab_not_route_to_vpn_title">Yapılandırılmış IP adresine yönlendir</string>
<string name="ab_kitkat_mss_title">VPN bağlantısı için yanlış MSS değeri</string>
<string name="ab_secondary_users_title">İkincil tablet kullanıcıları</string>
<string name="custom_connection_options_warng">Özel bağlantı seçenekleri belirtin. Dikkatli kullanın</string>
<string name="custom_connection_options">Özel Seçenekler</string>
+ <string name="remove_connection_entry">Bağlantı girdisini kaldırın</string>
+ <string name="ab_vpn_reachability_44_title">Uzak ağlar ulaşılamıyor</string>
+ <string name="ab_persist_tun_title">Sürekli tun modu</string>
+ <string name="version_and_later">%s ve daha sonra</string>
+ <string name="crl_file">Sertifika iptal listesi</string>
+ <string name="Search">Arama</string>
+ <string name="clear_log_on_connect">Yeni bağlantıda günlüğü temizle</string>
+ <string name="connect_timeout">Bağlantı zaman aşımına uğradı</string>
+ <string name="protocol">Protokol</string>
+ <string name="enabled_connection_entry">Etkin</string>
+ <string name="months_left">%d ay kaldı</string>
+ <string name="days_left">%d gün kaldı</string>
+ <string name="hours_left">%d saat kaldı</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 35d20e8b..f715bf77 100755
--- a/app/src/main/res/values-uk/strings-icsopenvpn.xml
+++ b/app/src/main/res/values-uk/strings-icsopenvpn.xml
@@ -180,7 +180,6 @@
<string name="keychain_nocacert">Не вдалося отримати СА сертифікат при читанні із сховища ключів Андроїд. Автентифікація не вдалася.</string>
<string name="show_log_summary">Показати вікно журналу при з\'єднанні. Вікно журналу може бути завжди дрступним у панелі сповіщень.</string>
<string name="show_log_window">Показати вікно журналу</string>
- <string name="mobile_info">Працює на %1$s (%2$s) %3$s, Android API %4$d</string>
<string name="error_rsa_sign">Помилка підпису з використанням ключа із сховища Андроїд %1$s: %2$s</string>
<string name="faq_system_dialogs">Попередження VPN з\'єднання повідомляє вам, що цей додаток може перехоплювати весь мережевий трафік, і повідомляється системою попереджень VPNService API. \nСповіщення про VPN з\'єднання (символ \"Ключа\") також формується системою Android для сигналізації про вихідне VPN з\'єднання. У деяких прошивках це сповіщення супроводжується сигналом. \nAndroid використовує ці cповіщення для вашої власної безпеки і їх не можна обійти. (На жаль, на деяких прошивках також сповіщення супроводжується звуком)</string>
<string name="faq_system_dialogs_title">Повідомлення про підключення та звук сповіщеня</string>
@@ -260,7 +259,6 @@
<string name="encryption_cipher">Алгоритм шифрування</string>
<string name="packet_auth">Пакети автентифікації</string>
<string name="auth_dialog_title">Введіть метод автентифікації пакетів</string>
- <string name="mobile_info_extended">Запущено на %1$s (%2$s) %3$s, Android API %4$d, версії %5$s, %6$s</string>
<string name="built_by">побудована по %s</string>
<string name="debug_build">відлагоджувальна збірка</string>
<string name="official_build">Офіційна збірка</string>
@@ -374,4 +372,15 @@
<string name="custom_connection_options_warng">Визначені параметри користувача при з\'єднанні. Будьте обережні!</string>
<string name="custom_connection_options">Власні налаштовування</string>
<string name="remove_connection_entry">Видалити запис підключення</string>
+ <string name="ab_kitkat_reconnect_title">Випадкове відключення від мережі мобільного зв\'язку</string>
+ <string name="ab_vpn_reachability_44_title">Віддалені мережі недоступні</string>
+ <string name="ab_persist_tun_title">Зберігати tun режим</string>
+ <string name="version_and_later">%s і подальше</string>
+ <string name="tls_cipher_alert_title">Підключення не вдається з \"SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure\"</string>
+ <string name="Search">Пошук</string>
+ <string name="lastdumpdate">(Останній Dump %1$d:%2$dh старий (%3$s))</string>
+ <string name="clear_log_on_connect">Очистити журнал при новому підключенні</string>
+ <string name="connect_timeout">Час очікування з\'єднання</string>
+ <string name="protocol">Протокол</string>
+ <string name="enabled_connection_entry">Ввімкнено</string>
</resources>
diff --git a/app/src/main/res/values-v21/colours.xml b/app/src/main/res/values-v21/colours.xml
index 1fedf7b9..024e47eb 100644
--- a/app/src/main/res/values-v21/colours.xml
+++ b/app/src/main/res/values-v21/colours.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
- ~ Copyright (c) 2012-2014 Arne Schwabe
+ ~ Copyright (c) 2012-2016 Arne Schwabe
~ Distributed under the GNU GPL v2 with additional terms. For full terms see the file doc/LICENSE.txt
-->
diff --git a/app/src/main/res/values-v21/refs.xml b/app/src/main/res/values-v21/refs.xml
index 2a09271d..eb9c587c 100644
--- a/app/src/main/res/values-v21/refs.xml
+++ b/app/src/main/res/values-v21/refs.xml
@@ -1,14 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
- ~ Copyright (c) 2012-2014 Arne Schwabe
+ ~ Copyright (c) 2012-2016 Arne Schwabe
~ Distributed under the GNU GPL v2 with additional terms. For full terms see the file doc/LICENSE.txt
-->
<resources>
- <drawable name="ic_menu_close_clear_cancel">@drawable/ic_close_white_24dp</drawable>
- <drawable name="ic_menu_share">@drawable/ic_share_white_24dp </drawable>
- <drawable name="ic_menu_save">@drawable/ic_check_white_24dp</drawable>
- <drawable name="ic_menu_view">@drawable/ic_filter_list_white_24dp</drawable>
- <drawable name="ic_menu_delete">@drawable/ic_delete_white_24dp</drawable>
- <drawable name="ic_menu_delete_grey">@drawable/ic_delete_grey600_24dp</drawable>
+ <drawable name="ic_menu_close_clear_cancel">@drawable/ic_close_white_24dp</drawable>
+ <drawable name="ic_menu_share">@drawable/ic_share_white_24dp </drawable>
+ <drawable name="ic_menu_save">@drawable/ic_check_white_24dp</drawable>
+ <drawable name="ic_menu_view">@drawable/ic_filter_list_white_24dp</drawable>
+ <drawable name="ic_menu_delete">@drawable/ic_delete_white_24dp</drawable>
+ <drawable name="ic_menu_delete_grey">@drawable/ic_delete_grey600_24dp</drawable>
+
</resources>
diff --git a/app/src/main/res/values-v21/styles.xml b/app/src/main/res/values-v21/styles.xml
index 4379dd6d..83a693f1 100644
--- a/app/src/main/res/values-v21/styles.xml
+++ b/app/src/main/res/values-v21/styles.xml
@@ -1,15 +1,26 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
- ~ Copyright (c) 2012-2014 Arne Schwabe
+ ~ Copyright (c) 2012-2016 Arne Schwabe
~ Distributed under the GNU GPL v2 with additional terms. For full terms see the file doc/LICENSE.txt
-->
<resources>
- <style name="blinkt.baseTheme" parent="android:Theme.Material.Light.DarkActionBar" />
+ <!-- http://www.google.de/design/spec/style/color.html#color-color-palette -->
+ <style name="blinkt.baseTheme" parent="android:Theme.Material.Light.DarkActionBar">
+ <item name="android:colorPrimary">@color/primary</item>
+ <item name="android:colorPrimaryDark">@color/primary_dark</item>
+ <item name="android:colorAccent">@color/accent</item>
+ <item name="android:alertDialogTheme">@style/blinkt.alertDialog</item>
+ </style>
+ <style name="blinkt.dialog" parent="android:Theme.Material.Light.Dialog">
+ <item name="android:colorPrimary">@color/primary</item>
+ <item name="android:colorPrimaryDark">@color/primary_dark</item>
+ <item name="android:colorAccent">@color/accent</item>
+ <item name="android:alertDialogTheme">@style/blinkt.alertDialog</item>
+ </style>
- <!-- http://www.google.de/design/spec/style/color.html#color-color-palette -->
- <style name="blinkt" parent="blinkt.common">
+ <style name="blinkt.alertDialog" parent="android:Theme.Material.Light.Dialog.Alert">
<item name="android:colorPrimary">@color/primary</item>
<item name="android:colorPrimaryDark">@color/primary_dark</item>
<item name="android:colorAccent">@color/accent</item>
diff --git a/app/src/main/res/values-vi/strings-icsopenvpn.xml b/app/src/main/res/values-vi/strings-icsopenvpn.xml
index 42f07ee8..87d040ab 100755
--- a/app/src/main/res/values-vi/strings-icsopenvpn.xml
+++ b/app/src/main/res/values-vi/strings-icsopenvpn.xml
@@ -180,7 +180,7 @@
<string name="keychain_nocacert">Không có chứng chỉ CA phản hồi khi đọc khóa lưu trữ Android. Chứng thực có thể sẽ thất bại.</string>
<string name="show_log_summary">Hiển thị cửa sổ đăng nhập khi kết nối. Cửa sổ đăng nhập có thể luôn truy cập từ thanh thông báo trạng thái.</string>
<string name="show_log_window">Hiển thị cửa sổ đăng nhập</string>
- <string name="mobile_info">Đang chạy trên %1$s (%2$s) %3$s, Android API %4$d</string>
+ <string name="mobile_info">%10$s%9$s đang chạy trên %3$s%1$s(%2$s), Android %6$s (%7$s) API %4$d, ABI %5$s, (%8$s)</string>
<string name="error_rsa_sign">Lỗi đăng ký với khóa lưu trữ Android %1$s: %2$s</string>
<string name="faq_system_dialogs">Các kết nối VPN đang cảnh báo bạn rằng ứng dụng này có thể chặn tất cả lưu lượng được đặt bởi hệ thống để chặn tình trạng lạm dụng VPN API. \nThông báo kết nối VPN (Biểu tượng chìa khóa) cũng được đặt bởi hệ thống Android để báo hiệu một kết nối VPN đang hoạt động. Với một số trường hợp thông báo này sẽ phát một âm thanh. \nAndroid giới thiệu những đoạn hội thoại này vì sự an toàn của bạn và chắn chắn rằng chúng không thể bị xâm nhập phá hoại. (Trên một số trường hợp thật không may không bao gồm âm thanh thông báo)</string>
<string name="faq_system_dialogs_title">Cảnh báo kết nối và thông báo âm thanh</string>
@@ -260,7 +260,6 @@
<string name="encryption_cipher">Mã hóa mật mã</string>
<string name="packet_auth">Gói xác thực</string>
<string name="auth_dialog_title">Nhập phương thức xác thực gói</string>
- <string name="mobile_info_extended">Đang chạy trên %1$s (%2$s) %3$s, Android API %4$d, phiên bản %5$s, %6$s</string>
<string name="built_by">được xây dựng bởi %s</string>
<string name="debug_build">bản dựng gỡ lỗi</string>
<string name="official_build">bản dựng chính thức</string>
@@ -374,4 +373,26 @@
<string name="custom_connection_options_warng">Xác định kết nối tùy chỉnh cụ thể. Dùng cẩn thận</string>
<string name="custom_connection_options">Cấu hình tùy chỉnh</string>
<string name="remove_connection_entry">Gỡ bỏ mục kết nối</string>
+ <string name="ab_kitkat_reconnect_title">Ngẫu nhiên ngắt kết nối từ mạng di động</string>
+ <string name="ab_vpn_reachability_44_title">Mạng từ xa không khả dụng</string>
+ <string name="ab_persist_tun_title">Chế độ tun cố định</string>
+ <string name="version_and_later">%s và sau</string>
+ <string name="tls_cipher_alert_title">Kết nối thất bại với lỗi cảnh báo SSL23_GET_SERVER_HELLO:sslv3</string>
+ <string name="tls_cipher_alert">Phiên bản OpenVPN cho Android mới hơn (0.6.29/tháng 3 năm 2015) sử dụng nhiều bảo mật mặc định trên những bộ mã hóa được cho phép (tls-cipher \"DEFAULT:!EXP:!PSK:!SRP:!kRSA\"). Thật không may, việc bỏ qua những mã hóa kém an toàn và xuất các mã hóa, đặc biệt là các thiếu sót của bộ mã hóa không hỗ trợ Perfect Forward Secrecy (Diffie-Hellman) nên gây ra một vài vấn đề. Điều này là ý định tốt nhưng nó thực hiện tăng cường bảo mật TLS kém hơn bằng cách thiết lập mật mã-tls trên máy chủ hoặc một số hệ điều hành với SSL hạ thấp (ví dụ MikroTik).\n Để khắc phục lỗi này, đặt cài đặt mật mã-tls mặc định trên máy chủ một cách hợp lý như mật mã-tls \"DEFAULT:!EXP:!PSK:!SRP:!kRSA\". Để làm việc xung quanh vấn đề trên máy trạm, hãy thêm tùy chọn tùy chỉnh mật mã-tls MẶC ĐỊNH trên máy trạm Android.</string>
+ <string name="message_no_user_edit">Hồ sơ này đã được thêm từ ứng dụng bên ngoài %s và đã được đánh dấu là người dùng không thể chỉnh sửa.</string>
+ <string name="crl_file">Danh sách thu hồi chứng nhận</string>
+ <string name="service_restarted">Đang khởi động lại dịch vụ OpenVPN (Ứng dụng gặp lỗi hoặc bị dừng do tràn bộ nhớ)</string>
+ <string name="import_config_error">Nhập cấu hình mạng bị lỗi, không thể lưu lại</string>
+ <string name="Search">Tìm kiếm</string>
+ <string name="lastdumpdate">(Kết xuất cuối là %1$d:%2$d cũ (%3$s))</string>
+ <string name="clear_log_on_connect">Xóa nhật ký trên kết nối mới</string>
+ <string name="connect_timeout">Thời gian tạm ngưng kết nối</string>
+ <string name="no_allowed_app">Không có ứng dụng nào được phép thêm. Đang thêm (%s) có tối thiểu một ứng dụng trong danh sách những ứng dụng đã cho phép chứ không cho phép tất cả ứng dụng</string>
+ <string name="query_permissions_sdcard">OpenVPN cho Android có thể tìm những tập tin bị mất trên thẻ nhớ một cách tự động. Nhấn vào tin nhắn này để bắt đầu yêu cầu quyền.</string>
+ <string name="protocol">Giao thức</string>
+ <string name="enabled_connection_entry">Bật</string>
+ <string name="abi_mismatch">Ưu tiên ABI gốc của thiết bị này (%1$s) và ABI được báo cáo bởi thư viện gốc (%2$s) bất đối xứng</string>
+ <string name="months_left">%d tháng còn lại</string>
+ <string name="days_left">%d ngày còn lại</string>
+ <string name="hours_left">%d giờ còn lại</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 01fa64a2..efd8a669 100755
--- a/app/src/main/res/values-zh-rCN/strings-icsopenvpn.xml
+++ b/app/src/main/res/values-zh-rCN/strings-icsopenvpn.xml
@@ -181,7 +181,6 @@
<string name="keychain_nocacert">在 Android 密钥库中未找到任何 CA 证书。可能验证失败。</string>
<string name="show_log_summary">连接时显示日志窗口。日志窗口可始终从通知栏访问。</string>
<string name="show_log_window">显示日志窗口</string>
- <string name="mobile_info">运行 %1$s ( %2$s ) %3$s ,Android API %4$d</string>
<string name="error_rsa_sign">与 Android 密钥库 %1$s 签名时出错: %2$s</string>
<string name="faq_system_dialogs">VPN 连接警告会告诉你有程序正要拦截所有的网络流量,这是为了确保 VPN 服务的 API 不被恶意应用滥用。\nVPN 连接通知(通知栏上的钥匙图标)是 Android 系统内建的,如果当前有 VPN 连接,Android 系统就会自动显示这个通知图标。一些系统上还会在 VPN 连接建立的时候发出提示音。Android 这么做的原因是为了保护你不受恶意应用的欺骗。</string>
<string name="faq_system_dialogs_title">连接警告和通知声音</string>
@@ -262,7 +261,6 @@
<string name="encryption_cipher">加密算法(cipher)</string>
<string name="packet_auth">数据包验证</string>
<string name="auth_dialog_title">数据包验证方式</string>
- <string name="mobile_info_extended">当前运行环境 %1$s (%2$s) %3$s,Android API %4$d,版本 %5$s,%6$s</string>
<string name="built_by">由 %s 构建</string>
<string name="debug_build">调试版本</string>
<string name="official_build">正式版本</string>
@@ -359,8 +357,18 @@
<string name="ab_only_cidr">安卓只支持CIDR路由。由于非CIDR路由几乎不用,OpenVPN for Android将使用/32路由并对非CIDR路由发出警告。</string>
<string name="ab_tethering_44">在连接VPN时手机热点依然工作,但连接不会通过VPN。</string>
<string name="ab_kitkat_mss">早期的KitKat版本在TCP连接上设置了错误的MSS值 (#61948)。OpenVPN将自动启动mssfix选项来解决这个Bug。</string>
+ <string name="ab_proxy">在DNS服务没有设置的情况下,安卓会继续使用手机wifi的代理设置。 安卓OpenVPN会在日志文件中留下警告信息。在VPN设置DNS服务时,安卓不是代理;安卓系统里没有为vpn连接设置代理的程序接口。</string>
+ <string name="ab_lollipop_reinstall">在被卸载或重新安装时,VPN程序会停止工作;详细信息请参看 #80074</string>
<string name="ab_only_cidr_title">非CIDR路由</string>
<string name="ab_lollipop_reinstall_title">正在重新安装VPN应用</string>
<string name="custom_connection_options">自定义选项</string>
<string name="remove_connection_entry">删除连接条目</string>
+ <string name="ab_persist_tun_title">保持 tun 通道模式</string>
+ <string name="crl_file">证书吊销列表</string>
+ <string name="Search">搜索</string>
+ <string name="clear_log_on_connect">建立新连接时清空日志</string>
+ <string name="connect_timeout">连接超时</string>
+ <string name="query_permissions_sdcard">OpenVPN for Android 可以尝试自动在 SD 卡上寻找缺失的文件。点击此消息开始请求权限许可。</string>
+ <string name="protocol">协议</string>
+ <string name="enabled_connection_entry">启用</string>
</resources>
diff --git a/app/src/main/res/values-zh-rTW/strings-icsopenvpn.xml b/app/src/main/res/values-zh-rTW/strings-icsopenvpn.xml
index b0056965..179396b8 100755
--- a/app/src/main/res/values-zh-rTW/strings-icsopenvpn.xml
+++ b/app/src/main/res/values-zh-rTW/strings-icsopenvpn.xml
@@ -16,37 +16,39 @@
<string name="useLZO">LZO壓縮</string>
<string name="client_no_certificate">沒有證書</string>
<string name="client_certificate_title">客戶端證書</string>
- <string name="client_key_title">客戶端證書密碼</string>
+ <string name="client_key_title">客戶端證書密鑰</string>
<string name="client_pkcs12_title">PKCS12 檔案</string>
<string name="ca_title">CA證書</string>
- <string name="no_certificate">您必須選擇一個憑證</string>
- <string name="copyright_guicode">取得原始碼與個案追蹤,可上 http://code.google.com/p/ics-openvpn/</string>
- <string name="copyright_others">本程序使用了以下元件,其作者和授權資訊如下</string>
- <string name="about">關於</string>
- <string name="vpn_list_title">設定檔</string>
+ <string name="no_certificate">您必須選擇一個證書</string>
+ <string name="copyright_guicode">源代碼和問題跟踪器可在https://github.com/schwabe/ics-openvpn/</string>
+ <string name="copyright_others">該方案採用了以下組件; 看到源代碼的許可證的全部細節</string>
+ <string name="about">左右</string>
+ <string name="vpn_list_title">簡介</string>
<string name="vpn_type">類型</string>
- <string name="pkcs12pwquery">PKCS12 密碼</string>
- <string name="file_select">選擇&#8230;</string>
- <string name="file_nothing_selected">你必須選擇一個檔案</string>
- <string name="useTLSAuth">使用傳輸層防火牆(TLS-Auth)</string>
+ <string name="pkcs12pwquery">PKCS12密碼</string>
+ <string name="file_select">選擇...</string>
+ <string name="file_nothing_selected">你必須選擇一個文件</string>
+ <string name="useTLSAuth">使用TLS認證</string>
<string name="tls_direction">TLS方向</string>
- <string name="ipv6_dialog_tile">以CIDR格式輸入IPv6地址/遮罩(例如 2000:dd::23/64)</string>
- <string name="ipv4_dialog_title">以CIDR格式輸入IPv4地址/遮罩(例如 1.2.3.4/24)</string>
+ <string name="ipv6_dialog_tile">進入IPv6地址/子網掩碼CIDR格式(例如2000:DD ::六十四分之二十三)</string>
+ <string name="ipv4_dialog_title">輸入IPv4地址/子網掩碼CIDR格式(例如:1.2.3.4/24)</string>
<string name="ipv4_address">IPv4地址</string>
- <string name="ipv6_address">IPv6地址</string>
- <string name="custom_option_warning">使用自訂的OpenVPN選項,請加倍緊慎。請注意因Android API限制,很多與Tun相關的OpenVPN設定皆無法正常使用。如果你認為我們遺忘了重要的OpenVPN選項,請向作者反映。</string>
- <string name="auth_username">用戶名稱</string>
+ <string name="ipv6_address">IPv6的地址</string>
+ <string name="custom_option_warning">輸入自定義的OpenVPN選項。請謹慎使用。另外請注意,許多囤地的相關OpenVPN的設置不能被VPNSettings的設計支持。如果您認為一個重要的選擇缺少聯繫作者</string>
+ <string name="auth_username">用戶名</string>
<string name="auth_pwquery">密碼</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="no_keystore_cert_selected">你必須選取一個使用者證書</string>
+ <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="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="config_error_found">在配置錯誤</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>
<string name="shortcut_profile_notfound">在快捷方式找不到指定的設定檔</string>
@@ -54,86 +56,116 @@
<string name="random_host_summary">在主機名稱前加入6個隨機字符</string>
<string name="custom_config_title">啟用自訂選項</string>
<string name="custom_config_summary">自訂選項,使用時請小心!</string>
- <string name="route_rejected">路由被Android拒絕</string>
- <string name="cancel_connection">中斷連線</string>
- <string name="cancel_connection_long">中斷VPN連線</string>
- <string name="clear_log">清除記錄檔</string>
- <string name="title_cancel">確認取消</string>
- <string name="cancel_connection_query">中斷已連接的VPN/取消正在嘗試的連線?</string>
- <string name="remove_vpn">移除VPN</string>
+ <string name="route_rejected">路由拒絕的Andr​​oid</string>
+ <string name="cancel_connection">斷開連接</string>
+ <string name="cancel_connection_long">斷開VPN</string>
+ <string name="clear_log">清除日誌</string>
+ <string name="title_cancel">取消確認</string>
+ <string name="cancel_connection_query">斷開連接的VPN /取消連接嘗試?</string>
+ <string name="remove_vpn">刪除VPN</string>
+ <string name="check_remote_tlscert">檢查服務器是否使用TLS的服務器擴展(--remote-CERT-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="tls_key_auth">啟用傳輸層防火牆(TLS-Auth)</string>
- <string name="tls_auth_file">TLS驗證檔</string>
- <string name="pull_on_summary">向伺服器請求IP地址, 路由和時間資訊</string>
- <string name="use_pull">接受設定推送(Pull)</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 =帕德博恩,OU =禽流IP運營商,CN = openvpn.blinkt.de)\ñ\ n指定完整的DN或RDN檢查(openvpn.blinkt.de在這個例子中)或RDN前綴進行驗證。\ N使用RDN前綴“服務器”\ n當匹配“服務器1”和“服務器2”\ñ\ nLeaving文本字段為空將檢查RDN對服務器的主機名。 \ñ\ n有關詳細信息請參見下-verify-X509-名的OpenVPN 2.3.1+手冊頁</string>
+ <string name="enter_tlscn_title">遠程證書主題</string>
+ <string name="tls_key_auth">啟用TLS密鑰認證</string>
+ <string name="tls_auth_file">TLS驗證文件</string>
+ <string name="pull_on_summary">請求,則來自服務器的地址,路線和時機選擇。</string>
+ <string name="pull_off_summary">沒有信息從服務器請求。設置需要規定如下。</string>
+ <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="searchdomain">搜索網域</string>
- <string name="dns1_summary">要使用的DNS伺服器。</string>
- <string name="dns_server">DNS伺服器</string>
- <string name="secondary_dns_message">當主要DNS伺服器無法使用,就會嘗試備用DNS伺服器</string>
- <string name="backup_dns">後備VPN伺服器</string>
- <string name="ignored_pushed_routes">忽略伺服器推送的路由</string>
- <string name="ignore_routes_summary">忽略從伺服器推送的路由。</string>
- <string name="default_route_summary">重定向所有流量到VPN</string>
- <string name="use_default_title">使用VPN作為預設閘道</string>
- <string name="custom_route_message">以CIDR格式輸入目的地路由,例如\"10.0.0.0/8 2002::/16\",以上兩個路由將導向到VPN。</string>
- <string name="custom_routes_title">自訂路由</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">一些自訂的Android4.0 ROM存在/dev/tun的擁有者權限問題,甚至完全沒有Tun模組。CM9用家請嘗試於\"全域設置\"下修正Tun擁有者。</string>
- <string name="tun_open_error">無法開啟Tun網絡介面</string>
- <string name="error">"錯誤: "</string>
+ <string name="override_dns">覆蓋的DNS設置服務器</string>
+ <string name="dns_override_summary">使用您自己的DNS服務器</string>
+ <string name="searchdomain">sea​​rchDomain</string>
+ <string name="dns1_summary">要使用的DNS服務器。</string>
+ <string name="dns_server">DNS服務器</string>
+ <string name="secondary_dns_message">備用DNS服務器使用,如果正常的DNS服務器無法到達。</string>
+ <string name="backup_dns">備份DNS服務器</string>
+ <string name="ignored_pushed_routes">忽略推路線</string>
+ <string name="ignore_routes_summary">忽略路由推服務器。</string>
+ <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">在一些定制IC圖片在/ dev / TUN的權限可能是錯誤的,或者囤模塊可能會完全丟失。對於CM9圖像嘗試在常規設置的固定所有權選項</string>
+ <string name="tun_open_error">無法打開囤接口</string>
+ <string name="error">“錯誤:”</string>
<string name="clear">清除</string>
- <string name="local_ip_info">本地IPv4: %1$s/%2$d IPv6: %3$s MTU: %4$d</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">安裝VpnService路線:%1$s %2$s</string>
+ <string name="ip_not_cidr">GOT的接口信息%1$s和%2$s,假設第二個地址是遠程的對等地址。使用/ 32掩碼本地IP。通過OpenVPN的給定方式是“%3$s”。</string>
+ <string name="route_not_cidr">不能使%1$s和%2$s如IP路由CIDR子網掩碼感,使用/ 32子網掩碼。</string>
+ <string name="route_not_netip">修正路線%1$s / %2$s到%3$s / %2$s</string>
+ <string name="keychain_access">無法訪問Android鑰匙扣證書。這可以通過固件升級或通過恢復的應用程序/應用程序設置的備份引起。請編輯VPN和重新選擇下基本設置證書重新訪問證書的權限。</string>
<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="copied_entry">已將記錄複製到剪貼簿</string>
- <string name="tap_mode">Tap模式</string>
- <string name="faq_tap_mode">Android內置的VPN API並不支援Tap介面,故此本程序並不支援Tap模式。</string>
+ <string name="send_logfile">發送日誌文件</string>
+ <string name="send">派</string>
+ <string name="ics_openvpn_log_file">ICS OpenVPN的日誌文件</string>
+ <string name="copied_entry">複製日誌條目夾板</string>
+ <string name="tap_mode">點擊模式</string>
+ <string name="faq_tap_mode">點擊模式是不可能的非根VPN API。因此,該應用程序不能提供自來水的支持</string>
+ <string name="tap_faq2">了嗎?你在開玩笑吧?不,攻牙模式真的不支持和發送更多的郵件,詢問是否將支持也無濟於事。</string>
<string name="faq">FAQ</string>
<string name="copying_log_entries">複製記錄檔條目</string>
+ <string name="faq_copying">要複製單個日誌條目按住上的日誌條目。若要複製/發送全部日誌請使用發送日誌選項。使用硬件菜單按鈕時,如果按鈕沒有在GUI可見。</string>
<string name="faq_shortcut">以快捷方式啟動</string>
+ <string name="faq_howto_shortcut">您可以將快捷方式啟動 OpenVPN 在您的桌面上。根據您的主畫面程式必須添加一個快捷方式或小部件。</string>
<string name="no_vpn_support_image">你的Android ROM不支援VPN服務API,抱歉了。 :(</string>
<string name="encryption">加密</string>
<string name="cipher_dialog_title">輸入加密方法</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>
<string name="inline_file_tab">內嵌檔案</string>
<string name="error_importing_file">匯入過程中發生錯誤</string>
<string name="import_error_message">無法從檔案系統中匯入檔案</string>
<string name="inline_file_data">&lt;內嵌於設定檔&gt;</string>
+ <string name="opentun_no_ipaddr">拒絕沒有IP信息打開tun設備</string>
<string name="menu_import">匯入.ovpn檔案</string>
<string name="menu_import_short">匯入</string>
<string name="import_content_resolve_error">匯入過程中無法讀取設定檔</string>
<string name="error_reading_config_file">讀取設定檔時發生錯誤</string>
<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_done">成功讀取設定檔</string>
<string name="nobind_summary">不要綁定本地地址和端口</string>
<string name="no_bind">沒有本地綁定</string>
<string name="import_configuration_file">匯入設定檔</string>
<string name="faq_security_title">保安上的考慮</string>
+ <string name="faq_security">“由於OpenVPN是安全敏感的有關安全性的幾個音符都是明智的。在​​SD卡的所有數據本質上是不安全的。每一個應用程序可以讀取它(比如這個方案並不需要特別的SD卡的權限)。此應用程序的數據只能讀由應用程序本身。通過使用CACERT /證書/密鑰的文件對話框中的數據導入選項存儲在VPN配置文件的VPN配置文件只能由該應用程序進行訪問。(不要忘了刪除在SD副本卡後)。即使只能由該應用程序中的數據仍然是未加密的,通過生根電話或其他攻擊有可能檢索數據。保存的密碼是明文存儲以及對於PKCS12文件,強烈建議你將它們導入到android的密鑰庫。“</string>
<string name="import_vpn">匯入</string>
+ <string name="broken_image_cert_title">錯誤顯示證書選擇</string>
+ <string name="broken_image_cert">有一個例外,試圖展示了Android 4.0+證書選擇對話框。這不應該發生,因為這款Android 4.0+的標準功能。也許對於證書存儲你的Andr​​oid ROM支持被打破</string>
<string name="ipv4">IPv4</string>
<string name="ipv6">IPv6</string>
<string name="speed_waiting">等待狀態訊息&#8230;</string>
<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;Official HTC圖像,已知有一種奇怪的路由問題造成交通不流過隧道(也&lt;a href=\"https://github.com/schwabe/ics-openvpn/issues/18\"&gt;Issue 18&lt;/a&gt;看到bug跟踪系統。)的的Xperia弧S和的Xperia雷&lt;/p&gt;&lt;p&gt;Older官方SONY圖像已被報導完全缺少VPNService從圖像。 (也&lt;a href=\"https://github.com/schwabe/ics-openvpn/issues/29\"&gt;Issue 29&lt;/a&gt;看到bug跟踪系統。)&lt;/p&gt;&lt;p&gt;On自定義生成的TUN模塊可能會丟失照片或為/ dev / TUN的權利可能是錯誤的。一些CM9圖像需要在“設備特定的黑客”enabled.&lt;/p&gt;&lt;p&gt;Most重要的是“修復所有權”選項:如果您的設備有一個破碎的機器人形象,報告給你的供應商。越多的人誰給供應商報告問題時,他們越有可能解決it.&lt;/p&gt;</string>
<string name="pkcs12_file_encryption_key">PKCS12檔加密金鑰</string>
<string name="private_key_password">私密金鑰密碼</string>
<string name="password">密碼</string>
<string name="file_icon">檔案圖標</string>
<string name="tls_authentication">傳輸層防火牆(TLS Firewall)</string>
<string name="generated_config">生成的設定檔</string>
+ <string name="generalsettings">設置</string>
<string name="owner_fix_summary">嘗試修正/dev/tun擁有者權限。已知有些CM9 ROM需要透過這個來才能使得VPN服務API得以運作。本功能需要Root。</string>
<string name="owner_fix">修正 /dev/tun 的擁有者</string>
<string name="generated_config_summary">顯示本程序生成的設定檔</string>
@@ -142,10 +174,14 @@
<string name="netchange_summary">若切換此選項當網絡狀況變更時將強制重新連線(例如從WiFi變成手機網絡,反之亦然)</string>
<string name="netchange">網絡異動時重新連線</string>
<string name="netstatus">網絡狀態: %s</string>
+ <string name="extracahint">該CA證書通常是從Android密鑰庫返回。指定一個單獨的證書,如果你拿到證書驗證錯誤。</string>
<string name="select_file">選擇</string>
+ <string name="keychain_nocacert">沒有CA證書返回,而從Android的密鑰庫讀取。身份驗證可能會失敗。</string>
<string name="show_log_summary">連接時顯示記錄檔視窗。記錄檔視窗可以隨時從通知欄中進入。</string>
<string name="show_log_window">顯示記錄視窗</string>
- <string name="mobile_info">於 %1$s (%2$s) %3$s 上運行, Android API 版本: %4$d</string>
+ <string name="mobile_info">%10$s %9$s上%3$s %1$s(%2$s),運行Android %6$s(%7$s)API %4$d,ABI %5$s,(%8$s)</string>
+ <string name="error_rsa_sign">錯誤簽名與Android密鑰庫密鑰%1$s:%2$s</string>
+ <string name="faq_system_dialogs">VPN連接警告信息,告訴你,這個程序可以攔截所有流量是由系統施加的防止濫用VPNService的API。\ n此VPN連接的通知(關鍵標誌)也徵收Android系統的信號持續VPN連接。在某些圖像此通知播放聲音。\ nAndroid介紹這些系統對話框為自己的安全,並確保他們無法規避。 (在某些圖片這個不幸的是包括通知聲音)</string>
<string name="faq_system_dialogs_title">連線警告和通知時發出音效</string>
<string name="translationby">繁體中文</string>
<string name="ipdns">IP和DNS</string>
@@ -154,9 +190,14 @@
<string name="obscure">鮮為人知的OpenVPN設定,一般情況下不需要派上用場。</string>
<string name="advanced">進階</string>
<string name="export_config_title">ICS Openvpn 設定</string>
+ <string name="warn_no_dns">不使用任何DNS服務器。名稱解析可能無法正常工作。考慮設置自定義DNS服務器。另請注意,Android將繼續使用您的手機/ Wi-Fi連接指定的代理服務器設置時沒有DNS服務器設置。</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;Get工作的配置(從供應商/機構檢測您的電腦或下載)&lt;/p&gt;&lt;p&gt;If它沒有多餘的PEM / pks12文件,你可以自己通過電子郵件發送文件和打開附件的單個文件。如果您有多個文件,把它們放在你的SD card.&lt;/p&gt;&lt;p&gt;Click上的電子郵件附件/使用的文件夾圖標,在VPN列表導入配置file&lt;/p&gt;&lt;p&gt;If大約有丟失的文件將丟失的文件在你的SD card.&lt;/p&gt;&lt;p&gt;Click上保存錯誤標誌將導入的VPN添加到您的VPN list&lt;/p&gt;&lt;p&gt;Connect的VPN通過點擊VPN&lt;/p&gt;&lt;p&gt;If的名字有錯誤或警告日誌試著去了解警告/錯誤,並嘗試修復them&lt;/p&gt; </string>
<string name="faq_howto_title">快速入門</string>
<string name="setting_loadtun_summary">在連線前嘗試載入Tun模組,需要Root。</string>
<string name="setting_loadtun">載入Tun模組</string>
+ <string name="importpkcs12fromconfig">導入PKCS12從配置到Android的密鑰庫</string>
<string name="getproxy_error">取得代理伺服器資訊時發生錯誤: %s</string>
<string name="using_proxy">使用代理伺服器 %1$s %2$d</string>
<string name="use_system_proxy">使用系統代理</string>
@@ -170,7 +211,14 @@
<string name="configuration_changed">設定已變更</string>
<string name="log_no_last_vpn">無法判斷最後一次連線使用的設定檔,因此無法編輯設定檔。</string>
<string name="faq_duplicate_notification_title">重複的通知</string>
+ <string name="faq_duplicate_notification">如果Android是在系統內存中的一些並不需要的時刻(RAM)的壓力,應用程序和服務,從積極的內存中刪除。這將終止正在進行的VPN連接。為了確保連接/ OpenVPN的生存服務的運行具有更高的優先級。於具有較高優先級運行的應用程序必須顯示通知。關鍵的通知圖標是由系統中的前一個FAQ條目中描述的罰款。它並不能算作應用程序通知具有較高優先級運行的目的。</string>
+ <string name="no_vpn_profiles_defined">沒有VPN配置文件定義。</string>
+ <string name="add_new_vpn_hint">使用&lt;img src=\"ic_menu_add\"/&gt;圖標添加新的VPN</string>
+ <string name="vpn_import_hint">使用&lt;img src=\"ic_menu_archive\"/&gt;圖標,導入從您的SD卡現有的(.ovpn或.conf文件)配置文件。</string>
+ <string name="faq_hint">此外,請務必檢查出的常見問​​題解答。有一個快速入門指南。</string>
<string name="faq_routing_title">路由/網絡介面 設定</string>
+ <string name="faq_routing">路由和接口配置不經由傳統的ifconfig /路由命令,但通過使用VPNService API來完成。這將導致比其他操作系統不同的路由配置。 \ n此VPN隧道的配置包括IP地址和應該被路由通過該接口的網絡。特別是,沒有同行夥伴地址或網關地址是必要的或需要。特殊的路由到達VPN服務器不需要任一(例如,當使用重定向網關加)。導入配置時,應用程序將因此而忽略這些設置。該應用程序可確保與連接到服務器沒有通過VPN隧道路由到的VPNService API。\ n此VPNService API不允許指定網絡不應該通過VPN路由。作為一種變通方法的應用程序會自動檢測網絡,不應該被路由到隧道(如航線XXXX YYYY net_gateway),並計算一組路由排除此路線效仿其他平台的行為。日誌窗口顯示VPNService的在建立一個連接的配置\ nBehind場景:安卓4.4+確實使用策略路由。利用路由/ ifconfig命令將不顯示已安裝的路線。相反,使用IP規則,iptables的-t軋-L</string>
+ <string name="persisttun_summary">不要退回到沒有VPN連接時,OpenVPN是重新連接。</string>
<string name="openvpn_log">OpenVPN 運作記錄</string>
<string name="import_config">匯入 OpenVPN 配置</string>
<string name="battery_consumption_title">電池消耗</string>
@@ -189,4 +237,61 @@
<string name="notifcation_title_notconnect">未連線</string>
<string name="start_vpn_title">正在連接至 VPN %s</string>
<string name="start_vpn_ticker">正在連接至 VPN %s</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="permission_icon_app">應用程序嘗試使用OpenVPN的為Android的圖標</string>
+ <string name="faq_vpndialog43">“與Android 4.3啟動VPN確認是防範”覆蓋應用程序“,這將導致該對話框沒有反應,觸摸輸入。如果你有一個使用覆蓋一個應用程序可能會導致此行為。如果發現違規應用程序聯繫作者該應用程序的。這個問題影響到在Android 4.3及更高版本的所有VPN應用。另見&lt;a href=\"https://github.com/schwabe/ics-openvpn/issues/185\"&gt;Issue 185&lt;a&gt;了解更多詳細信息“</string>
+ <string name="faq_vpndialog43_title">Vpn確認對話框</string>
+ <string name="donatePlayStore">或者你可以給我的Play商店捐贈:</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%2$s</string>
+ <string name="unhandled_exception_context">%3$s:%1$s \ñ\ n%2$s</string>
+ <string name="faq_system_dialog_xposed">如果你已經植根Android設備可以安裝&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對話框確認module&lt;/a&gt;需要您自擔風險“</string>
+ <string name="full_licenses">證照齊全</string>
+ <string name="blocklocal_summary">直接連接到本地接口的網絡將不被路由通過VPN。取消選擇此選項將縮進重定向本地網絡的VPN的所有流量。</string>
+ <string name="blocklocal_title">旁路VPN本地網絡</string>
+ <string name="userpw_file">用戶名/密碼文件</string>
+ <string name="imported_from_file">[進口:%s]</string>
+ <string name="files_missing_hint">一些文件無法找到。請選擇要導入的文件的配置文件:</string>
+ <string name="openvpn_is_no_free_vpn">要使用這個程序,你需要一個VPN供應商/ VPN支持OpenVPN的網關(通常由雇主提供)。查看http://community.openvpn.net/關於OpenVPN的更多信息,以及如何設置自己的OpenVPN服務器。</string>
+ <string name="import_log">導入日誌:</string>
+ <string name="ip_looks_like_subnet">VPN拓撲“%3$s”規定,但使用ifconfig %1$s %2$s看起來更像是一個網絡掩碼的IP地址。假設“子網”的拓撲結構。</string>
+ <string name="mssfix_invalid_value">MSS的覆蓋值必須在0到9000的整數</string>
+ <string name="mssfix_value_dialog">宣布運行在他們應當限制其發送的包大小,使得後的OpenVPN已包封它們,將所得的UDP包大小的OpenVPN給對端發送將不超過此字節數的隧道的TCP會話。 (默認為1450)</string>
+ <string name="mssfix_checkbox">重寫 TCP 負載的 MSS 的值</string>
+ <string name="mssfix_dialogtitle">設置的 TCP MSS 負載</string>
+ <string name="client_behaviour">客戶端行為</string>
+ <string name="clear_external_apps">清除允許外部應用程序</string>
+ <string name="loading">載入中...</string>
+ <string name="allowed_vpn_apps_info">允許上傳的VPN應用程序:%1$s</string>
+ <string name="disallowed_vpn_apps_info">不允許VPN應用程序:%1$s</string>
+ <string name="app_no_longer_exists">包%s不再安裝,從應用程序刪除它允許/禁止列表</string>
+ <string name="vpn_disallow_radio">VPN適用於所有的應用程序,但不包括所選</string>
+ <string name="vpn_allow_radio">的VPN僅用於對選定的應用程序</string>
+ <string name="query_delete_remote">刪除遠程服務器條目?</string>
+ <string name="keep">養</string>
+ <string name="delete">刪</string>
+ <string name="add_remote">添加新的遠程</string>
+ <string name="query_permissions_sdcard">添加新的遠程</string>
+ <string name="protocol">協定</string>
+ <string name="enabled_connection_entry">啟用</string>
+ <string name="abi_mismatch">該設備的優先考慮的母語ABI優先級(%1$s)和ABI報告本地庫(%2$s)不匹配</string>
+ <string name="months_left">離開%d個月</string>
+ <string name="days_left">離開%d天</string>
+ <string name="hours_left">%d小時離開</string>
</resources>
diff --git a/app/src/main/res/values/colours.xml b/app/src/main/res/values/colours.xml
index f27167f3..d06bc233 100644
--- a/app/src/main/res/values/colours.xml
+++ b/app/src/main/res/values/colours.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
- ~ Copyright (c) 2012-2014 Arne Schwabe
+ ~ Copyright (c) 2012-2016 Arne Schwabe
~ Distributed under the GNU GPL v2 with additional terms. For full terms see the file doc/LICENSE.txt
-->
diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml
index 727f5a78..f8fafecd 100644
--- a/app/src/main/res/values/dimens.xml
+++ b/app/src/main/res/values/dimens.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
- ~ Copyright (c) 2012-2014 Arne Schwabe
+ ~ Copyright (c) 2012-2016 Arne Schwabe
~ Distributed under the GNU GPL v2 with additional terms. For full terms see the file doc/LICENSE.txt
-->
diff --git a/app/src/main/res/values/refs.xml b/app/src/main/res/values/refs.xml
index 6abfb609..dce39385 100644
--- a/app/src/main/res/values/refs.xml
+++ b/app/src/main/res/values/refs.xml
@@ -1,14 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
- ~ Copyright (c) 2012-2014 Arne Schwabe
+ ~ Copyright (c) 2012-2016 Arne Schwabe
~ Distributed under the GNU GPL v2 with additional terms. For full terms see the file doc/LICENSE.txt
-->
<resources>
- <drawable name="ic_menu_close_clear_cancel">@android:drawable/ic_menu_close_clear_cancel</drawable>
- <drawable name="ic_menu_share">@android:drawable/ic_menu_share </drawable>
- <drawable name="ic_menu_save">@android:drawable/ic_menu_save</drawable>
- <drawable name="ic_menu_view">@android:drawable/ic_menu_view</drawable>
- <drawable name="ic_menu_delete">@android:drawable/ic_menu_delete</drawable>
- <drawable name="ic_menu_edit">@android:drawable/ic_menu_edit</drawable>
+ <drawable name="ic_menu_close_clear_cancel">@android:drawable/ic_menu_close_clear_cancel</drawable>
+ <drawable name="ic_menu_share">@android:drawable/ic_menu_share </drawable>
+ <drawable name="ic_menu_save">@android:drawable/ic_menu_save</drawable>
+ <drawable name="ic_menu_view">@android:drawable/ic_menu_view</drawable>
+ <drawable name="ic_menu_delete">@android:drawable/ic_menu_delete</drawable>
+ <drawable name="ic_menu_edit">@android:drawable/ic_menu_edit</drawable>
</resources>
diff --git a/app/src/main/res/values/strings-icsopenvpn.xml b/app/src/main/res/values/strings-icsopenvpn.xml
index dec656fc..aa65a14d 100755
--- a/app/src/main/res/values/strings-icsopenvpn.xml
+++ b/app/src/main/res/values/strings-icsopenvpn.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?> <!--
- ~ Copyright (c) 2012-2014 Arne Schwabe
+ ~ Copyright (c) 2012-2016 Arne Schwabe
~ Distributed under the GNU GPL v2 with additional terms. For full terms see the file doc/LICENSE.txt
-->
<resources>
@@ -18,7 +18,7 @@
<string name="client_pkcs12_title">PKCS12 File</string>
<string name="ca_title">CA Certificate</string>
<string name="no_certificate">You must select a certificate</string>
- <string name="copyright_guicode">Source code and issue tracker available at https://github.com/schwabe/ics-openvpn</string>
+ <string name="copyright_guicode">Source code and issue tracker available at https://github.com/schwabe/ics-openvpn/</string>
<string name="copyright_others">This program uses the following components; see the source code for full details on the licenses</string>
<string name="about">About</string>
<string name="vpn_list_title">Profiles</string>
@@ -157,7 +157,7 @@
<string name="converted_profile">imported profile</string>
<string name="converted_profile_i">imported profile %d</string>
<string name="broken_images">Broken Images</string>
- <string name="broken_images_faq">&lt;p&gt;Official HTC images are known to have a strange routing problem causing traffic not to flow through the tunnel (See also &lt;a href="http://code.google.com/p/ics-openvpn/issues/detail?id=18"&gt;Issue 18&lt;/a&gt; in the bug tracker.)&lt;/p&gt;&lt;p&gt;Older official SONY images from Xperia Arc S and Xperia Ray have been reported to be missing the VPNService completely from the image. (See also &lt;a href="http://code.google.com/p/ics-openvpn/issues/detail?id=29"&gt;Issue 29&lt;/a&gt; in the bug tracker.)&lt;/p&gt;&lt;p&gt;On custom build images the tun module might be missing or the rights of /dev/tun might be wrong. Some CM9 images need the "Fix ownership" option under "Device specific hacks" enabled.&lt;/p&gt;&lt;p&gt;Most importantly: If your device has a broken Android image, report it to your vendor. The more people who report an issue to the vendor, the more likely they are to fix it.&lt;/p&gt;</string>
+ <string name="broken_images_faq">&lt;p&gt;Official HTC images are known to have a strange routing problem causing traffic not to flow through the tunnel (See also &lt;a href="https://github.com/schwabe/ics-openvpn/issues/18"&gt;Issue 18&lt;/a&gt; in the bug tracker.)&lt;/p&gt;&lt;p&gt;Older official SONY images from Xperia Arc S and Xperia Ray have been reported to be missing the VPNService completely from the image. (See also &lt;a href="https://github.com/schwabe/ics-openvpn/issues/29"&gt;Issue 29&lt;/a&gt; in the bug tracker.)&lt;/p&gt;&lt;p&gt;On custom build images the tun module might be missing or the rights of /dev/tun might be wrong. Some CM9 images need the "Fix ownership" option under "Device specific hacks" enabled.&lt;/p&gt;&lt;p&gt;Most importantly: If your device has a broken Android image, report it to your vendor. The more people who report an issue to the vendor, the more likely they are to fix it.&lt;/p&gt;</string>
<string name="pkcs12_file_encryption_key">PKCS12 File Encryption Key</string>
<string name="private_key_password">Private Key Password</string>
<string name="password">Password</string>
@@ -178,7 +178,7 @@
<string name="keychain_nocacert">No CA Certificate returned while reading from Android keystore. Authentication will probably fail.</string>
<string name="show_log_summary">Shows the log window on connect. The log window can always be accessed from the notification status.</string>
<string name="show_log_window">Show log window</string>
- <string name="mobile_info">Running on %1$s (%2$s) %3$s, Android API %4$d</string>
+ <string name="mobile_info">%10$s %9$s running on %3$s %1$s (%2$s), Android %6$s (%7$s) API %4$d, ABI %5$s, (%8$s)</string>
<string name="error_rsa_sign">Error signing with Android keystore key %1$s: %2$s</string>
<string name="faq_system_dialogs">The VPN connection warning telling you that this app can intercept all traffic is imposed by the system to prevent abuse of the VPNService API.\nThe VPN connection notification (The key symbol) is also imposed by the Android system to signal an ongoing VPN connection. On some images this notification plays a sound.\nAndroid introduced these system dialogs for your own safety and made sure that they cannot be circumvented. (On some images this unfortunately includes a notification sound)</string>
<string name="faq_system_dialogs_title">Connection warning and notification sound</string>
@@ -192,7 +192,7 @@
<string name="warn_no_dns">No DNS servers being used. Name resolution may not work. Consider setting custom DNS Servers. Please also note that Android will keep using your proxy settings specified for your mobile/Wi-Fi connection when no DNS servers are set.</string>
<string name="dns_add_error">Could not add DNS Server \"%1$s\", rejected by the system: %2$s</string>
<string name="ip_add_error">Could not configure IP Address \"%1$s\", rejected by the system: %2$s</string>
- <string name="faq_howto">&lt;p&gt;Get a working config (tested on your computer or download from your provider/organisation)&lt;/p&gt;&lt;p&gt;If it is a single file with no extra pem/pks12 files you can email the file yourself and open the attachment. If you have multiple files put them on your sd card.&lt;/p&gt;&lt;p&gt;Click on the email attachment/Use the folder icon in the vpn list to import the config file&lt;/p&gt;&lt;p&gt;If there are errors about missing files put the missing files on your sd card.&lt;/p&gt;&lt;p&gt;Click on the save symbol to add the imported VPN to your VPN list&lt;/p&gt;&lt;p&gt;Connect the VPN by clicking on the name of the VPN&lt;/p&gt;&lt;p&gt;If there are error or warnings in the log try to understand the warnings/error and try to fix them&lt;/p&gt; </string>
+ <string name="faq_howto">&lt;p&gt;Get a working config (tested on your computer or download from your provider/organisation)&lt;/p&gt;&lt;p&gt;If it is a single file with no extra pem/pkcs12 files you can email the file yourself and open the attachment. If you have multiple files put them on your sd card.&lt;/p&gt;&lt;p&gt;Click on the email attachment/Use the folder icon in the vpn list to import the config file&lt;/p&gt;&lt;p&gt;If there are errors about missing files put the missing files on your sd card.&lt;/p&gt;&lt;p&gt;Click on the save symbol to add the imported VPN to your VPN list&lt;/p&gt;&lt;p&gt;Connect the VPN by clicking on the name of the VPN&lt;/p&gt;&lt;p&gt;If there are error or warnings in the log try to understand the warnings/error and try to fix them&lt;/p&gt; </string>
<string name="faq_howto_title">Quick Start</string>
<string name="setting_loadtun_summary">Try to load the tun.ko kernel module before trying to connect. Needs rooted devices.</string>
<string name="setting_loadtun">Load tun module</string>
@@ -223,7 +223,7 @@
<string name="import_config">Import OpenVPN configuration</string>
<string name="battery_consumption_title">Battery consumption</string>
<string name="baterry_consumption">In my personal tests the main reason for high battery consumption of OpenVPN are the keepalive packets. Most OpenVPN servers have a configuration directive like \'keepalive 10 60\' which causes the client and server to exchange keepalive packets every ten seconds. &lt;p&gt; While these packets are small and do not use much traffic, they keep the mobile radio network busy and increase the energy consumption. (See also &lt;a href="http://developer.android.com/training/efficient-downloads/efficient-network-access.html#RadioStateMachine"&gt;The Radio State Machine | Android Developers&lt;/a&gt;) &lt;p&gt; This keepalive setting cannot be changed on the client. Only the system administrator of the OpenVPN can change the setting. &lt;p&gt; Unfortunately using a keepalive larger than 60 seconds with UDP can cause some NAT gateways to drop the connection due to an inactivity timeout. Using TCP with a long keep alive timeout works, but tunneling TCP over TCP performs extremely poorly on connections with high packet loss. (See &lt;a href="http://sites.inka.de/bigred/devel/tcp-tcp.html"&gt;Why TCP Over TCP Is A Bad Idea&lt;/a&gt;)</string>
- <string name="faq_tethering">The Android Tethering feature (over WiFi, USB or Bluetooth) and the VPNService API (used by this program) do not work together. For more details see the &lt;a href=\"http://code.google.com/p/ics-openvpn/issues/detail?id=34\">issue #34&lt;/a></string>
+ <string name="faq_tethering">The Android Tethering feature (over WiFi, USB or Bluetooth) and the VPNService API (used by this program) do not work together. For more details see the &lt;a href=\"https://github.com/schwabe/ics-openvpn/issues/34\">issue #34&lt;/a></string>
<string name="vpn_tethering_title">VPN and Tethering</string>
<string name="connection_retries">Connection retries</string>
<string name="reconnection_settings">Reconnection settings</string>
@@ -258,7 +258,6 @@
<string name="encryption_cipher">Encryption cipher</string>
<string name="packet_auth">Packet authentication</string>
<string name="auth_dialog_title">Enter packet authentication method</string>
- <string name="mobile_info_extended">Running on %1$s (%2$s) %3$s, Android API %4$d, version %5$s, %6$s</string>
<string name="built_by">built by %s</string>
<string name="debug_build">debug build</string>
<string name="official_build">official build</string>
@@ -377,10 +376,28 @@
<string name="ab_persist_tun_title">Persist tun mode</string>
<string name="version_and_later">%s and later</string>
<string name="tls_cipher_alert_title">Connections fails with SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure</string>
- <string name="tls_cipher_alert">Newer OpenVPN for Android versions (0.6.29/March 2015) use a more secure default for the allowed cipher suites (tls-cipher \"DEFAULT:!EXP:!PSK:!SRP:!kRSA\"). Unfortunately, omitting the less secure cipher suites and export cipher suites, especially the omission of cipher suites that do not support Perfect Forward Secrecy (Diffie-Hellman) causes some problems. This usually caused by an well-intentioned but poorly executed attempts to strengthen TLS security by setting tls-cipher on the server or some embedded OSes with stripped down SSL (e.g. MikroTik).\nTo solve this problem the problem, set the tls-cipher settings on the server to reasonable default like tls-cipher \"DEFAULT:!EXP:!PSK:!SRP:!kRSA\". To work around the problem on the client add the custom option tls-cipher DEFAULT on the Android client.</string>
+ <string name="tls_cipher_alert">Newer OpenVPN for Android versions (0.6.29/March 2015) use a more secure default for the allowed cipher suites (tls-cipher \"DEFAULT:!EXP:!PSK:!SRP:!kRSA\"). Unfortunately, omitting the less secure cipher suites and export cipher suites, especially the omission of cipher suites that do not support Perfect Forward Secrecy (Diffie-Hellman) causes some problems. This usually caused by an well-intentioned but poorly executed attempt to strengthen TLS security by setting tls-cipher on the server or some embedded OSes with stripped down SSL (e.g. MikroTik).\nTo solve this problem the problem, set the tls-cipher settings on the server to reasonable default like tls-cipher \"DEFAULT:!EXP:!PSK:!SRP:!kRSA\". To work around the problem on the client add the custom option tls-cipher DEFAULT on the Android client.</string>
<string name="message_no_user_edit">This profile has been added from an external app (%s) and has been marked as not user editable.</string>
<string name="crl_file">Certificate Revocation List</string>
<string name="service_restarted">Restarting OpenVPN Service (App crashed probably crashed or killed for memory pressure)</string>
<string name="import_config_error">Importing the config yielded an error, cannot save it</string>
-
+ <string name="Search">Search</string>
+ <string name="lastdumpdate">(Last dump is %1$d:%2$dh old (%3$s))</string>
+ <string name="clear_log_on_connect">Clear log on new connection</string>
+ <string name="connect_timeout">Connect Timeout</string>
+ <string name="no_allowed_app">No allowed app added. Adding ourselves (%s) to have at least one app in the allowed app list to not allow all apps</string>
+ <string name="query_permissions_sdcard">OpenVPN for Android can try to discover the missing file(s) on the sdcard automatically. Tap this message start the permission request.</string>
+ <string name="protocol">Protocol</string>
+ <string name="enabled_connection_entry">Enabled</string>
+ <string name="abi_mismatch">Preferred native ABI precedence of this device (%1$s) and ABI reported by native libraries (%2$s) mismatch</string>
+ <string name="months_left">%d months left</string>
+ <string name="days_left">%d days left</string>
+ <string name="hours_left">%d hours left</string>
+ <string name="permission_revoked">VPN permission revoked by OS (e.g. other VPN program started), stopping VPN</string>
+ <string name="pushpeerinfo">Push Peer info</string>
+ <string name="pushpeerinfosummary">Send extra information to the server, e.g. SSL version and Android version</string>
+ <string name="pw_request_dialog_title">Need %1$s</string>
+ <string name="pw_request_dialog_prompt">Please enter the password for profile %1$s</string>
+ <string name="menu_use_inline_data">Use inline data</string>
+ <string name="export_config_chooser_title">Export configuration file</string>
</resources>
diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml
index 94970c88..13d5e0b1 100644
--- a/app/src/main/res/values/styles.xml
+++ b/app/src/main/res/values/styles.xml
@@ -1,24 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
- ~ Copyright (c) 2012-2014 Arne Schwabe
+ ~ Copyright (c) 2012-2016 Arne Schwabe
~ Distributed under the GNU GPL v2 with additional terms. For full terms see the file doc/LICENSE.txt
-->
<resources>
<style name="blinkt.baseTheme" parent="android:Theme.DeviceDefault.Light" />
- <style name="blinkt.common" parent="blinkt.baseTheme" >
- <!-- Shared between Holo and Material -->
- <item name="android:preferenceStyle">@style/BlinktPreferencePanel</item>
+ <style name="blinkt" parent="blinkt.baseTheme" />
- </style>
-
- <style name="blinkt" parent="blinkt.common">
- </style>
-
- <!-- No margins or background by default. Not different for x-large screens -->
- <style name="BlinktPreferencePanel">
- <item name="android:background">@color/gelb</item>
- </style>
+ <style name="blinkt.dialog" parent="android:Theme.DeviceDefault.Light.Dialog" />
<style name="item">
<item name="android:layout_width">match_parent</item>