summaryrefslogtreecommitdiff
path: root/app
diff options
context:
space:
mode:
authorcyberta <cyberta@riseup.net>2017-09-29 07:27:19 +0000
committercyberta <cyberta@riseup.net>2017-09-29 07:27:19 +0000
commitfc913a46cfc85c0bdb0c9d19b2c94c8b53f93b1f (patch)
tree247408a15cd7caf621206d574af61d0c16d25876 /app
parent51afe1eeba990c2cd57bd842a96f7a756df51ce8 (diff)
parent7322b8e01f852bb4d0243a6ff2fc563422ba274c (diff)
Merge branch 'feature/updateDependencies' into 'master'
Feature/update dependencies See merge request leap/bitmask_android!8
Diffstat (limited to 'app')
-rw-r--r--app/build.gradle38
-rw-r--r--app/src/androidTest/java/se/leap/bitmaskclient/test/BaseTestDashboardFragment.java2
-rw-r--r--app/src/androidTest/java/se/leap/bitmaskclient/test/UserStatusTestController.java2
-rw-r--r--app/src/androidTest/java/se/leap/bitmaskclient/test/VpnTestController.java23
-rw-r--r--app/src/insecure/java/se/leap/bitmaskclient/ProviderAPI.java2
-rw-r--r--app/src/main/AndroidManifest.xml6
-rw-r--r--app/src/main/aidl/de/blinkt/openvpn/api/APIVpnProfile.aidl3
-rw-r--r--app/src/main/aidl/de/blinkt/openvpn/api/IOpenVPNAPIService.aidl66
-rw-r--r--app/src/main/aidl/de/blinkt/openvpn/api/IOpenVPNStatusCallback.aidl13
-rw-r--r--app/src/main/aidl/de/blinkt/openvpn/core/ConnectionStatus.aidl3
-rw-r--r--app/src/main/aidl/de/blinkt/openvpn/core/IOpenVPNServiceInternal.aidl23
-rw-r--r--app/src/main/aidl/de/blinkt/openvpn/core/IServiceStatus.aidl36
-rw-r--r--app/src/main/aidl/de/blinkt/openvpn/core/IStatusCallbacks.aidl24
-rw-r--r--app/src/main/aidl/de/blinkt/openvpn/core/LogItem.aidl3
-rw-r--r--app/src/main/aidl/de/blinkt/openvpn/core/TrafficHistory.aidl4
-rw-r--r--app/src/main/java/de/blinkt/openvpn/LaunchVPN.java75
-rw-r--r--app/src/main/java/de/blinkt/openvpn/VpnProfile.java150
-rw-r--r--app/src/main/java/de/blinkt/openvpn/activities/DisconnectVPN.java52
-rw-r--r--app/src/main/java/de/blinkt/openvpn/api/APIVpnProfile.java60
-rw-r--r--app/src/main/java/de/blinkt/openvpn/core/CIDRIP.java4
-rw-r--r--app/src/main/java/de/blinkt/openvpn/core/ConfigParser.java89
-rw-r--r--app/src/main/java/de/blinkt/openvpn/core/Connection.java23
-rw-r--r--app/src/main/java/de/blinkt/openvpn/core/ConnectionStatus.java47
-rw-r--r--app/src/main/java/de/blinkt/openvpn/core/DeviceStateReceiver.java17
-rw-r--r--app/src/main/java/de/blinkt/openvpn/core/ICSOpenVPNApplication.java61
-rw-r--r--app/src/main/java/de/blinkt/openvpn/core/LogFileHandler.java181
-rw-r--r--app/src/main/java/de/blinkt/openvpn/core/LogItem.java6
-rw-r--r--app/src/main/java/de/blinkt/openvpn/core/NetworkSpace.java94
-rw-r--r--app/src/main/java/de/blinkt/openvpn/core/OpenVPNManagement.java2
-rw-r--r--app/src/main/java/de/blinkt/openvpn/core/OpenVPNService.java305
-rw-r--r--app/src/main/java/de/blinkt/openvpn/core/OpenVPNStatusService.java232
-rw-r--r--app/src/main/java/de/blinkt/openvpn/core/OpenVPNThread.java32
-rw-r--r--app/src/main/java/de/blinkt/openvpn/core/OpenVpnManagementThread.java72
-rw-r--r--app/src/main/java/de/blinkt/openvpn/core/PasswordCache.java61
-rw-r--r--app/src/main/java/de/blinkt/openvpn/core/Preferences.java31
-rw-r--r--app/src/main/java/de/blinkt/openvpn/core/ProfileManager.java114
-rw-r--r--app/src/main/java/de/blinkt/openvpn/core/StatusListener.java109
-rw-r--r--app/src/main/java/de/blinkt/openvpn/core/TrafficHistory.java243
-rw-r--r--app/src/main/java/de/blinkt/openvpn/core/VPNLaunchHelper.java47
-rw-r--r--app/src/main/java/de/blinkt/openvpn/core/VpnStatus.java328
-rw-r--r--app/src/main/java/de/blinkt/openvpn/core/X509Utils.java9
-rw-r--r--app/src/main/java/de/blinkt/openvpn/fragments/LogFragment.java92
-rw-r--r--app/src/main/java/se/leap/bitmaskclient/VpnFragment.java6
-rw-r--r--app/src/main/java/se/leap/bitmaskclient/eip/EIP.java2
-rw-r--r--app/src/main/java/se/leap/bitmaskclient/eip/EipStatus.java24
-rw-r--r--app/src/main/res/layout-xlarge/eip_service_fragment.xml7
-rw-r--r--app/src/main/res/layout/eip_service_fragment.xml4
-rw-r--r--app/src/main/res/layout/vpnstatus.xml3
-rwxr-xr-xapp/src/main/res/values-ca/plurals-icsopenvpn.xml3
-rwxr-xr-xapp/src/main/res/values-ca/strings-icsopenvpn.xml3
-rwxr-xr-xapp/src/main/res/values-cs/plurals-icsopenvpn.xml3
-rwxr-xr-xapp/src/main/res/values-cs/strings-icsopenvpn.xml6
-rwxr-xr-xapp/src/main/res/values-de/plurals-icsopenvpn.xml20
-rwxr-xr-xapp/src/main/res/values-de/strings-icsopenvpn.xml63
-rwxr-xr-xapp/src/main/res/values-es/plurals-icsopenvpn.xml20
-rwxr-xr-xapp/src/main/res/values-es/strings-icsopenvpn.xml35
-rwxr-xr-xapp/src/main/res/values-et/plurals-icsopenvpn.xml20
-rwxr-xr-xapp/src/main/res/values-et/strings-icsopenvpn.xml41
-rwxr-xr-xapp/src/main/res/values-fr/plurals-icsopenvpn.xml20
-rwxr-xr-xapp/src/main/res/values-fr/strings-icsopenvpn.xml343
-rwxr-xr-xapp/src/main/res/values-hu/plurals-icsopenvpn.xml20
-rwxr-xr-xapp/src/main/res/values-hu/strings-icsopenvpn.xml192
-rwxr-xr-xapp/src/main/res/values-in/plurals-icsopenvpn.xml10
-rwxr-xr-xapp/src/main/res/values-in/strings-icsopenvpn.xml17
-rwxr-xr-xapp/src/main/res/values-it/plurals-icsopenvpn.xml3
-rwxr-xr-xapp/src/main/res/values-it/strings-icsopenvpn.xml6
-rwxr-xr-xapp/src/main/res/values-ja/plurals-icsopenvpn.xml16
-rwxr-xr-xapp/src/main/res/values-ja/strings-icsopenvpn.xml191
-rwxr-xr-xapp/src/main/res/values-ko/plurals-icsopenvpn.xml3
-rwxr-xr-xapp/src/main/res/values-ko/strings-icsopenvpn.xml9
-rwxr-xr-xapp/src/main/res/values-nl/plurals-icsopenvpn.xml20
-rwxr-xr-xapp/src/main/res/values-nl/strings-icsopenvpn.xml113
-rwxr-xr-xapp/src/main/res/values-no/plurals-icsopenvpn.xml20
-rwxr-xr-xapp/src/main/res/values-no/strings-icsopenvpn.xml80
-rw-r--r--app/src/main/res/values-no/strings.xml2
-rwxr-xr-xapp/src/main/res/values-pl/plurals-icsopenvpn.xml3
-rwxr-xr-xapp/src/main/res/values-pl/strings-icsopenvpn.xml52
-rwxr-xr-xapp/src/main/res/values-pt/plurals-icsopenvpn.xml3
-rwxr-xr-xapp/src/main/res/values-pt/strings-icsopenvpn.xml32
-rwxr-xr-xapp/src/main/res/values-ro/plurals-icsopenvpn.xml24
-rwxr-xr-xapp/src/main/res/values-ro/strings-icsopenvpn.xml182
-rwxr-xr-xapp/src/main/res/values-ru/plurals-icsopenvpn.xml24
-rwxr-xr-xapp/src/main/res/values-ru/strings-icsopenvpn.xml246
-rwxr-xr-xapp/src/main/res/values-sl/plurals-icsopenvpn.xml28
-rwxr-xr-xapp/src/main/res/values-sl/strings-icsopenvpn.xml53
-rwxr-xr-xapp/src/main/res/values-sv/plurals-icsopenvpn.xml20
-rwxr-xr-xapp/src/main/res/values-sv/strings-icsopenvpn.xml136
-rwxr-xr-xapp/src/main/res/values-tr/plurals-icsopenvpn.xml20
-rwxr-xr-xapp/src/main/res/values-tr/strings-icsopenvpn.xml63
-rwxr-xr-xapp/src/main/res/values-uk/plurals-icsopenvpn.xml3
-rwxr-xr-xapp/src/main/res/values-uk/strings-icsopenvpn.xml43
-rw-r--r--app/src/main/res/values-v21/refs.xml28
-rwxr-xr-xapp/src/main/res/values-vi/plurals-icsopenvpn.xml16
-rwxr-xr-xapp/src/main/res/values-vi/strings-icsopenvpn.xml42
-rwxr-xr-xapp/src/main/res/values-zh-rCN/plurals-icsopenvpn.xml3
-rwxr-xr-xapp/src/main/res/values-zh-rCN/strings-icsopenvpn.xml195
-rwxr-xr-xapp/src/main/res/values-zh-rTW/plurals-icsopenvpn.xml3
-rwxr-xr-xapp/src/main/res/values-zh-rTW/strings-icsopenvpn.xml371
-rw-r--r--app/src/main/res/values/colours.xml3
-rw-r--r--app/src/main/res/values/plurals-icsopenvpn.xml19
-rw-r--r--app/src/main/res/values/refs.xml29
-rwxr-xr-xapp/src/main/res/values/strings-icsopenvpn.xml65
-rw-r--r--app/src/main/res/values/untranslatable.xml3
-rw-r--r--app/src/ovpn3/java/de/blinkt/openvpn/core/OpenVPNThreadv3.java98
-rw-r--r--app/src/production/java/se/leap/bitmaskclient/ProviderAPI.java78
-rw-r--r--app/src/test/java/de/blinkt/openvpn/core/TestConfigParser.java37
-rw-r--r--app/src/test/java/de/blinkt/openvpn/core/TestIpParser.java38
-rw-r--r--app/src/test/java/de/blinkt/openvpn/core/TestLogFileHandler.java257
108 files changed, 4625 insertions, 1701 deletions
diff --git a/app/build.gradle b/app/build.gradle
index b6bb39ff..97ce9c35 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -1,8 +1,8 @@
apply plugin: 'com.android.application'
android {
- compileSdkVersion 23
- buildToolsVersion '25.0.2'
+ compileSdkVersion 26
+ buildToolsVersion '26.0.0'
;
signingConfigs {
release {
@@ -56,7 +56,8 @@ dependencies {
compile 'com.google.code.gson:gson:2.4'
compile 'org.thoughtcrime.ssl.pinning:AndroidPinning:1.0.0'
compile 'mbanje.kurt:fabbutton:1.1.4'
- compile 'com.android.support:support-annotations:23.2.1'
+ compile 'com.android.support:support-annotations:25.3.1'
+ compile 'com.android.support:support-v4:26.0.0-alpha1'
}
def processFileInplace(file, Closure processText) {
@@ -84,6 +85,9 @@ task copyIcsOpenVPNClasses( type: Copy ) {
include '**/logmenu.xml'
include '**/core/**.java'
include '**/activities/BaseActivity.java'
+ include '**/APIVpnProfile.java'
+ include '**/aidl/**/api/**.aidl'
+ include '**/aidl/**/core/**.aidl'
includeEmptyDirs = false
@@ -111,9 +115,11 @@ task copyIcsOpenVPNXml( type: Copy ) {
include '**/colours.xml'
include '**/logmenu.xml'
include '**/white_rect.xml'
+ include '**/plurals.xml'
includeEmptyDirs = false
rename 'strings.xml', 'strings-icsopenvpn.xml'
+ rename 'plurals.xml', 'plurals-icsopenvpn.xml'
filter {
line -> line.replaceAll('.*name="app".*', '')
}
@@ -139,17 +145,21 @@ task copyIcsOpenVPNImages( type: Copy ) {
task removeDuplicatedStrings() {
println "removeDuplicatedStrings"
new File('.').eachFileRecurse {
- if(it.name.equals('strings.xml')) {
- def ics_openvpn_file = file(it.absolutePath.replace('strings.xml', 'strings-icsopenvpn.xml'))
- if(ics_openvpn_file.exists()) {
- def ics_openvpn_strings_names = (new XmlParser()).parse(ics_openvpn_file)
- def current_file = it
-
- ics_openvpn_strings_names.string.each {
- processFileInplace(current_file) { text ->
- text.replaceAll('.*name=\"' + it.attribute('name') + '\".*(\n)*.*string>.*\n+', '')
- }
- }
+ if(it.name.equals('strings.xml') || it.name.equals('plurals.xml')) {
+ replaceDuplicatesForSource(it, it.name.substring(0, it.name.lastIndexOf('.')))
+ }
+ }
+}
+
+def replaceDuplicatesForSource(File it, String type) {
+ def ics_openvpn_file = file(it.absolutePath.replace(type+'.xml', type+'-icsopenvpn.xml'))
+ if(ics_openvpn_file.exists()) {
+ def ics_openvpn_strings_names = (new XmlParser()).parse(ics_openvpn_file)
+ def current_file = it
+
+ ics_openvpn_strings_names.string.each {
+ processFileInplace(current_file) { text ->
+ text.replaceAll('.*name=\"' + it.attribute('name') + '\".*(\n)*.*string>.*\n+', '')
}
}
}
diff --git a/app/src/androidTest/java/se/leap/bitmaskclient/test/BaseTestDashboardFragment.java b/app/src/androidTest/java/se/leap/bitmaskclient/test/BaseTestDashboardFragment.java
index 3e572c31..d0b8cf6f 100644
--- a/app/src/androidTest/java/se/leap/bitmaskclient/test/BaseTestDashboardFragment.java
+++ b/app/src/androidTest/java/se/leap/bitmaskclient/test/BaseTestDashboardFragment.java
@@ -54,7 +54,7 @@ public abstract class BaseTestDashboardFragment extends ActivityInstrumentationT
}
private void clickAndWaitForDashboard(String click_text) {
- solo.clickOnText(click_text);
+ solo.clickOnButton(click_text);
assertTrue(solo.waitForActivity(Dashboard.class, 80 * 1000));
}
diff --git a/app/src/androidTest/java/se/leap/bitmaskclient/test/UserStatusTestController.java b/app/src/androidTest/java/se/leap/bitmaskclient/test/UserStatusTestController.java
index 821a23fd..76d14911 100644
--- a/app/src/androidTest/java/se/leap/bitmaskclient/test/UserStatusTestController.java
+++ b/app/src/androidTest/java/se/leap/bitmaskclient/test/UserStatusTestController.java
@@ -30,7 +30,7 @@ public class UserStatusTestController {
void logIn(String username, String password, boolean expectSuccess) {
solo.enterText(0, username);
solo.enterText(1, password);
- solo.clickOnText(solo.getString(R.string.login_button));
+ solo.clickOnButton(solo.getString(R.string.login_button));
assertTrue(solo.waitForDialogToClose());
if (expectSuccess) {
diff --git a/app/src/androidTest/java/se/leap/bitmaskclient/test/VpnTestController.java b/app/src/androidTest/java/se/leap/bitmaskclient/test/VpnTestController.java
index b0996032..d339ab26 100644
--- a/app/src/androidTest/java/se/leap/bitmaskclient/test/VpnTestController.java
+++ b/app/src/androidTest/java/se/leap/bitmaskclient/test/VpnTestController.java
@@ -9,6 +9,7 @@ import com.robotium.solo.Solo;
import de.blinkt.openvpn.activities.DisconnectVPN;
import mbanje.kurt.fabbutton.FabButton;
import mbanje.kurt.fabbutton.ProgressRingView;
+import se.leap.bitmaskclient.Dashboard;
import se.leap.bitmaskclient.R;
import static junit.framework.Assert.assertTrue;
@@ -48,7 +49,9 @@ public class VpnTestController {
}
protected FabButton getVpnWholeIcon() {
- View view = solo.getView(R.id.vpn_Status_Image);
+ assertTrue(solo.waitForActivity(Dashboard.class, 5 * 1000));
+
+ View view = solo.getView(R.id.vpn_status_image);
if (view != null)
return (FabButton) view;
else
@@ -92,9 +95,9 @@ public class VpnTestController {
okToBrowserWarning();
sayOkToDisconnect();
- int max_seconds_until_connected = 1;
+ int max_seconds_until_connected = 120;
- Condition condition = new Condition() {
+ Condition condition = new Condition() {
@Override
public boolean isSatisfied() {
return iconShowsDisconnected();
@@ -107,17 +110,25 @@ public class VpnTestController {
private void okToBrowserWarning() {
assertTrue(solo.waitForDialogToOpen());
clickYes();
+ solo.waitForDialogToClose();
}
private void clickYes() {
String yes = solo.getString(android.R.string.yes);
- solo.clickOnText(yes);
+ solo.clickOnButton(yes);
+ }
+
+ private void clickDisconnect() {
+ String disconnect = solo.getString(R.string.cancel_connection);
+ solo.clickOnButton(disconnect);
}
private void sayOkToDisconnect() throws IllegalStateException {
boolean disconnect_vpn_appeared = solo.waitForActivity(DisconnectVPN.class);
- if(disconnect_vpn_appeared)
- clickYes();
+ if(disconnect_vpn_appeared){
+ clickDisconnect();
+ solo.waitForDialogToClose();
+ }
else throw new IllegalStateException();
}
diff --git a/app/src/insecure/java/se/leap/bitmaskclient/ProviderAPI.java b/app/src/insecure/java/se/leap/bitmaskclient/ProviderAPI.java
index df827242..a1b1b383 100644
--- a/app/src/insecure/java/se/leap/bitmaskclient/ProviderAPI.java
+++ b/app/src/insecure/java/se/leap/bitmaskclient/ProviderAPI.java
@@ -20,7 +20,7 @@ import android.app.*;
import android.content.*;
import android.content.res.*;
import android.os.*;
-import android.util.*;
+import android.util.Base64;
import org.json.*;
import org.thoughtcrime.ssl.pinning.util.*;
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 7e0c9c0b..025c98f0 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -28,7 +28,7 @@
<uses-sdk
android:minSdkVersion="14"
- android:targetSdkVersion="24"/>
+ android:targetSdkVersion="26"/>
<application
android:allowBackup="true"
@@ -84,7 +84,9 @@
<activity
android:name="se.leap.bitmaskclient.Dashboard"
android:label="@string/title_activity_dashboard"
- android:uiOptions="splitActionBarWhenNarrow" >
+ android:uiOptions="splitActionBarWhenNarrow"
+ android:launchMode="singleTask"
+ >
<intent-filter android:label="@string/app_name">
<action android:name="android.intent.action.MAIN" />
diff --git a/app/src/main/aidl/de/blinkt/openvpn/api/APIVpnProfile.aidl b/app/src/main/aidl/de/blinkt/openvpn/api/APIVpnProfile.aidl
new file mode 100644
index 00000000..f6799659
--- /dev/null
+++ b/app/src/main/aidl/de/blinkt/openvpn/api/APIVpnProfile.aidl
@@ -0,0 +1,3 @@
+package de.blinkt.openvpn.api;
+
+parcelable APIVpnProfile;
diff --git a/app/src/main/aidl/de/blinkt/openvpn/api/IOpenVPNAPIService.aidl b/app/src/main/aidl/de/blinkt/openvpn/api/IOpenVPNAPIService.aidl
new file mode 100644
index 00000000..75d0c329
--- /dev/null
+++ b/app/src/main/aidl/de/blinkt/openvpn/api/IOpenVPNAPIService.aidl
@@ -0,0 +1,66 @@
+// IOpenVPNAPIService.aidl
+package de.blinkt.openvpn.api;
+
+import de.blinkt.openvpn.api.APIVpnProfile;
+import de.blinkt.openvpn.api.IOpenVPNStatusCallback;
+
+import android.content.Intent;
+import android.os.ParcelFileDescriptor;
+
+interface IOpenVPNAPIService {
+ List<APIVpnProfile> getProfiles();
+
+ void startProfile (String profileUUID);
+
+ /** Use a profile with all certificates etc. embedded,
+ * old version which does not return the UUID of the addded profile, see
+ * below for a version that return the UUID on add */
+ boolean addVPNProfile (String name, String config);
+
+ /** start a profile using a config as inline string. Make sure that all needed data is inlined,
+ * e.g., using <ca>...</ca> or <auth-user-data>...</auth-user-data>
+ * See the OpenVPN manual page for more on inlining files */
+ void startVPN (in String inlineconfig);
+
+ /** This permission framework is used to avoid confused deputy style attack to the VPN
+ * calling this will give null if the app is allowed to use the external API and an Intent
+ * that can be launched to request permissions otherwise */
+ Intent prepare (in String packagename);
+
+ /** Used to trigger to the Android VPN permission dialog (VPNService.prepare()) in advance,
+ * if this return null OpenVPN for ANdroid already has the permissions otherwise you can start the returned Intent
+ * to let OpenVPN for Android request the permission */
+ Intent prepareVPNService ();
+
+ /* Disconnect the VPN */
+ void disconnect();
+
+ /* Pause the VPN (same as using the pause feature in the notifcation bar) */
+ void pause();
+
+ /* Resume the VPN (same as using the pause feature in the notifcation bar) */
+ void resume();
+
+ /**
+ * Registers to receive OpenVPN Status Updates
+ */
+ void registerStatusCallback(in IOpenVPNStatusCallback cb);
+
+ /**
+ * Remove a previously registered callback interface.
+ */
+ void unregisterStatusCallback(in IOpenVPNStatusCallback cb);
+
+ /** Remove a profile by UUID */
+ void removeProfile (in String profileUUID);
+
+ /** Request a socket to be protected as a VPN socket would be. Useful for creating
+ * a helper socket for an app controlling OpenVPN
+ * Before calling this function you should make sure OpenVPN for Android may actually
+ * this function by checking if prepareVPNService returns null; */
+ boolean protectSocket(in ParcelFileDescriptor fd);
+
+
+ /** Use a profile with all certificates etc. embedded */
+ APIVpnProfile addNewVPNProfile (String name, boolean userEditable, String config);
+} \ No newline at end of file
diff --git a/app/src/main/aidl/de/blinkt/openvpn/api/IOpenVPNStatusCallback.aidl b/app/src/main/aidl/de/blinkt/openvpn/api/IOpenVPNStatusCallback.aidl
new file mode 100644
index 00000000..a94b3b44
--- /dev/null
+++ b/app/src/main/aidl/de/blinkt/openvpn/api/IOpenVPNStatusCallback.aidl
@@ -0,0 +1,13 @@
+package de.blinkt.openvpn.api;
+
+/**
+ * Example of a callback interface used by IRemoteService to send
+ * synchronous notifications back to its clients. Note that this is a
+ * one-way interface so the server does not block waiting for the client.
+ */
+interface IOpenVPNStatusCallback {
+ /**
+ * Called when the service has a new status for you.
+ */
+ oneway void newStatus(in String uuid, in String state, in String message, in String level);
+}
diff --git a/app/src/main/aidl/de/blinkt/openvpn/core/ConnectionStatus.aidl b/app/src/main/aidl/de/blinkt/openvpn/core/ConnectionStatus.aidl
new file mode 100644
index 00000000..f37c3101
--- /dev/null
+++ b/app/src/main/aidl/de/blinkt/openvpn/core/ConnectionStatus.aidl
@@ -0,0 +1,3 @@
+package de.blinkt.openvpn.core;
+
+parcelable ConnectionStatus; \ No newline at end of file
diff --git a/app/src/main/aidl/de/blinkt/openvpn/core/IOpenVPNServiceInternal.aidl b/app/src/main/aidl/de/blinkt/openvpn/core/IOpenVPNServiceInternal.aidl
new file mode 100644
index 00000000..3958bcf3
--- /dev/null
+++ b/app/src/main/aidl/de/blinkt/openvpn/core/IOpenVPNServiceInternal.aidl
@@ -0,0 +1,23 @@
+/*
+ * 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;
+
+/**
+ * Created by arne on 15.11.16.
+ */
+
+interface IOpenVPNServiceInternal {
+
+ boolean protect(int fd);
+
+ void userPause(boolean b);
+
+ /**
+ * @param replaceConnection True if the VPN is connected by a new connection.
+ * @return true if there was a process that has been send a stop signal
+ */
+ boolean stopVPN(boolean replaceConnection);
+}
diff --git a/app/src/main/aidl/de/blinkt/openvpn/core/IServiceStatus.aidl b/app/src/main/aidl/de/blinkt/openvpn/core/IServiceStatus.aidl
new file mode 100644
index 00000000..5a5cbdb5
--- /dev/null
+++ b/app/src/main/aidl/de/blinkt/openvpn/core/IServiceStatus.aidl
@@ -0,0 +1,36 @@
+// StatusIPC.aidl
+package de.blinkt.openvpn.core;
+
+// Declare any non-default types here with import statements
+import de.blinkt.openvpn.core.IStatusCallbacks;
+import android.os.ParcelFileDescriptor;
+import de.blinkt.openvpn.core.TrafficHistory;
+
+
+interface IServiceStatus {
+ /**
+ * Registers to receive OpenVPN Status Updates and gets a
+ * ParcelFileDescript back that contains the log up to that point
+ */
+ ParcelFileDescriptor registerStatusCallback(in IStatusCallbacks cb);
+
+ /**
+ * Remove a previously registered callback interface.
+ */
+ void unregisterStatusCallback(in IStatusCallbacks cb);
+
+ /**
+ * Returns the last connedcted VPN
+ */
+ String getLastConnectedVPN();
+
+ /**
+ * Sets a cached password
+ */
+ void setCachedPassword(in String uuid, int type, String password);
+
+ /**
+ * Gets the traffic history
+ */
+ TrafficHistory getTrafficHistory();
+}
diff --git a/app/src/main/aidl/de/blinkt/openvpn/core/IStatusCallbacks.aidl b/app/src/main/aidl/de/blinkt/openvpn/core/IStatusCallbacks.aidl
new file mode 100644
index 00000000..75860b81
--- /dev/null
+++ b/app/src/main/aidl/de/blinkt/openvpn/core/IStatusCallbacks.aidl
@@ -0,0 +1,24 @@
+/*
+ * 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 de.blinkt.openvpn.core.LogItem;
+import de.blinkt.openvpn.core.ConnectionStatus;
+
+
+
+interface IStatusCallbacks {
+ /**
+ * Called when the service has a new status for you.
+ */
+ oneway void newLogItem(in LogItem item);
+
+ oneway void updateStateString(in String state, in String msg, in int resid, in ConnectionStatus level);
+
+ oneway void updateByteCount(long inBytes, long outBytes);
+
+ oneway void connectedVPN(String uuid);
+}
diff --git a/app/src/main/aidl/de/blinkt/openvpn/core/LogItem.aidl b/app/src/main/aidl/de/blinkt/openvpn/core/LogItem.aidl
new file mode 100644
index 00000000..9a7291af
--- /dev/null
+++ b/app/src/main/aidl/de/blinkt/openvpn/core/LogItem.aidl
@@ -0,0 +1,3 @@
+package de.blinkt.openvpn.core;
+
+parcelable LogItem; \ No newline at end of file
diff --git a/app/src/main/aidl/de/blinkt/openvpn/core/TrafficHistory.aidl b/app/src/main/aidl/de/blinkt/openvpn/core/TrafficHistory.aidl
new file mode 100644
index 00000000..5bd255fc
--- /dev/null
+++ b/app/src/main/aidl/de/blinkt/openvpn/core/TrafficHistory.aidl
@@ -0,0 +1,4 @@
+package de.blinkt.openvpn.core;
+
+
+parcelable TrafficHistory;
diff --git a/app/src/main/java/de/blinkt/openvpn/LaunchVPN.java b/app/src/main/java/de/blinkt/openvpn/LaunchVPN.java
index 16f986ae..0c3f20fb 100644
--- a/app/src/main/java/de/blinkt/openvpn/LaunchVPN.java
+++ b/app/src/main/java/de/blinkt/openvpn/LaunchVPN.java
@@ -7,15 +7,25 @@ package de.blinkt.openvpn;
import se.leap.bitmaskclient.R;
+import se.leap.bitmaskclient.R;
+
+import android.annotation.SuppressLint;
+import android.annotation.TargetApi;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.ActivityNotFoundException;
+import android.content.ComponentName;
+import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.content.Intent;
+import android.content.ServiceConnection;
import android.content.SharedPreferences;
import android.net.VpnService;
+import android.os.Build;
import android.os.Bundle;
+import android.os.IBinder;
+import android.os.RemoteException;
import android.preference.PreferenceManager;
import android.text.InputType;
import android.text.TextUtils;
@@ -28,10 +38,14 @@ import android.widget.EditText;
import java.io.IOException;
import de.blinkt.openvpn.activities.LogWindow;
+import de.blinkt.openvpn.core.ConnectionStatus;
+import de.blinkt.openvpn.core.IServiceStatus;
+import de.blinkt.openvpn.core.OpenVPNStatusService;
+import de.blinkt.openvpn.core.PasswordCache;
+import de.blinkt.openvpn.core.Preferences;
import de.blinkt.openvpn.core.ProfileManager;
import de.blinkt.openvpn.core.VPNLaunchHelper;
import de.blinkt.openvpn.core.VpnStatus;
-import de.blinkt.openvpn.core.VpnStatus.ConnectionStatus;
/**
* This Activity actually handles two stages of a launcher shortcut's life cycle.
@@ -64,6 +78,7 @@ public class LaunchVPN extends Activity {
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";
+ public static final String EXTRA_TEMP_VPN_PROFILE = "se.leap.bitmask.tempVpnProfile";
private static final int START_VPN_PROFILE = 70;
@@ -92,15 +107,17 @@ 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))
+ if (Preferences.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);
mhideLog = intent.getBooleanExtra(EXTRA_HIDELOG, false);
+ VpnProfile profileToConnect = (VpnProfile) intent.getExtras().getSerializable(EXTRA_TEMP_VPN_PROFILE);
+ if (profileToConnect == null)
+ profileToConnect = ProfileManager.get(this, shortcutUUID);
- VpnProfile profileToConnect = ProfileManager.get(this, shortcutUUID);
if (shortcutName != null && profileToConnect == null)
profileToConnect = ProfileManager.getInstance(this).getProfileByName(shortcutName);
@@ -118,24 +135,28 @@ public class LaunchVPN extends Activity {
@Override
protected void onActivityResult (int requestCode, int resultCode, Intent data) {
- super.onActivityResult(requestCode, resultCode, data);
+ super.onActivityResult(requestCode, resultCode, data);
- if(requestCode==START_VPN_PROFILE) {
- SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
- boolean showLogWindow = prefs.getBoolean("showlogwindow", true);
+ if(requestCode==START_VPN_PROFILE) {
+ SharedPreferences prefs = Preferences.getDefaultSharedPreferences(this);
+ boolean showLogWindow = prefs.getBoolean("showlogwindow", true);
+
+ if(!mhideLog && showLogWindow)
+ showLogWindow();
+ ProfileManager.updateLRU(this, mSelectedProfile);
+ VPNLaunchHelper.startOpenVpn(mSelectedProfile, getBaseContext());
+ finish();
- if(!mhideLog && showLogWindow)
- showLogWindow();
+ } else if (resultCode == Activity.RESULT_CANCELED) {
+ // User does not want us to start, so we just vanish
+ VpnStatus.updateStateString("USER_VPN_PERMISSION_CANCELLED", "", R.string.state_user_vpn_permission_cancelled,
+ ConnectionStatus.LEVEL_NOTCONNECTED);
- VPNLaunchHelper.startOpenVpn(mSelectedProfile, getBaseContext());
- finish();
- } else if (resultCode == Activity.RESULT_CANCELED) {
- // User does not want us to start, so we just vanish
- VpnStatus.updateStateString("USER_VPN_PERMISSION_CANCELLED", "", R.string.state_user_vpn_permission_cancelled,
- ConnectionStatus.LEVEL_NOTCONNECTED);
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N)
+ VpnStatus.logError(R.string.nought_alwayson_warning);
- finish();
- }
+ finish();
+ }
}
void showLogWindow() {
@@ -158,9 +179,27 @@ public class LaunchVPN extends Activity {
}
});
+ d.setOnCancelListener(new DialogInterface.OnCancelListener() {
+ @Override
+ public void onCancel(DialogInterface dialog) {
+ finish();
+ }
+ });
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1)
+ setOnDismissListener(d);
d.show();
}
+ @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
+ private void setOnDismissListener(AlertDialog.Builder d) {
+ d.setOnDismissListener(new DialogInterface.OnDismissListener() {
+ @Override
+ public void onDismiss(DialogInterface dialog) {
+ finish();
+ }
+ });
+ }
+
void launchVPN() {
int vpnok = mSelectedProfile.checkProfile(this);
if (vpnok != R.string.no_error_found) {
@@ -170,7 +209,7 @@ public class LaunchVPN extends Activity {
Intent intent = VpnService.prepare(this);
// Check if we want to fix /dev/tun
- SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
+ SharedPreferences prefs = Preferences.getDefaultSharedPreferences(this);
boolean usecm9fix = prefs.getBoolean("useCM9Fix", false);
boolean loadTunModule = prefs.getBoolean("loadTunModule", false);
diff --git a/app/src/main/java/de/blinkt/openvpn/VpnProfile.java b/app/src/main/java/de/blinkt/openvpn/VpnProfile.java
index 38d76f68..aa25da48 100644
--- a/app/src/main/java/de/blinkt/openvpn/VpnProfile.java
+++ b/app/src/main/java/de/blinkt/openvpn/VpnProfile.java
@@ -11,7 +11,6 @@ import android.annotation.SuppressLint;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
-import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.os.Build;
@@ -54,6 +53,7 @@ import javax.crypto.NoSuchPaddingException;
import de.blinkt.openvpn.core.Connection;
import de.blinkt.openvpn.core.NativeUtils;
import de.blinkt.openvpn.core.OpenVPNService;
+import de.blinkt.openvpn.core.PasswordCache;
import de.blinkt.openvpn.core.VPNLaunchHelper;
import de.blinkt.openvpn.core.VpnStatus;
import de.blinkt.openvpn.core.X509Utils;
@@ -73,14 +73,10 @@ 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 = 6;
- public static final int DEFAULT_MSSFIX_SIZE = 1450;
+ public static final int DEFAULT_MSSFIX_SIZE = 1280;
public static String DEFAULT_DNS1 = "8.8.8.8";
public static String DEFAULT_DNS2 = "8.8.4.4";
- public transient String mTransientPW = null;
- public transient String mTransientPCKS12PW = null;
-
-
public static final int TYPE_CERTIFICATES = 0;
public static final int TYPE_PKCS12 = 1;
public static final int TYPE_KEYSTORE = 2;
@@ -94,6 +90,12 @@ public class VpnProfile implements Serializable, Cloneable {
public static final int X509_VERIFY_TLSREMOTE_DN = 2;
public static final int X509_VERIFY_TLSREMOTE_RDN = 3;
public static final int X509_VERIFY_TLSREMOTE_RDN_PREFIX = 4;
+
+
+ public static final int AUTH_RETRY_NONE_FORGET = 0;
+ private static final int AUTH_RETRY_NONE_KEEP = 1;
+ public static final int AUTH_RETRY_NOINTERACT = 2;
+ private static final int AUTH_RETRY_INTERACT = 3;
// variable named wrong and should haven beeen transient
// but needs to keep wrong name to guarante loading of old
// profiles
@@ -137,11 +139,14 @@ public class VpnProfile implements Serializable, Cloneable {
public String mCustomRoutesv6 = "";
public String mKeyPassword = "";
public boolean mPersistTun = false;
- public String mConnectRetryMax = "5";
- public String mConnectRetry = "5";
+ public String mConnectRetryMax = "-1";
+ public String mConnectRetry = "2";
+ public String mConnectRetryMaxTime = "300";
public boolean mUserEditable = true;
public String mAuth = "";
public int mX509AuthType = X509_VERIFY_TLSREMOTE_RDN;
+ public String mx509UsernameField = null;
+
private transient PrivateKey mPrivateKey;
// Public attributes, since I got mad with getter/setter
// set members to default values
@@ -159,15 +164,25 @@ public class VpnProfile implements Serializable, Cloneable {
public String mCrlFilename;
public String mProfileCreator;
+ public int mAuthRetry = AUTH_RETRY_NONE_FORGET;
+ public int mTunMtu;
+
public boolean mPushPeerInfo = false;
public static final boolean mIsOpenVPN22 = false;
+ public int mVersion = 0;
+
+ // timestamp when the profile was last used
+ public long mLastUsed;
+
/* Options no longer used in new profiles */
- public String mServerName = "openvpn.blinkt.de";
+ public String mServerName = "openvpn.example.com";
public String mServerPort = "1194";
public boolean mUseUdp = true;
+
+
public VpnProfile(String name) {
mUuid = UUID.randomUUID();
mName = name;
@@ -175,6 +190,7 @@ public class VpnProfile implements Serializable, Cloneable {
mConnections = new Connection[1];
mConnections[0] = new Connection();
+ mLastUsed = System.currentTimeMillis();
}
public static String openVpnEscape(String unescaped) {
@@ -192,6 +208,17 @@ public class VpnProfile implements Serializable, Cloneable {
return '"' + escapedString + '"';
}
+
+ @Override
+ public boolean equals(Object obj) {
+ if (obj instanceof VpnProfile) {
+ VpnProfile vpnProfile = (VpnProfile) obj;
+ return mUuid.equals(vpnProfile.mUuid);
+ } else {
+ return false;
+ }
+ }
+
public void clearDefaults() {
mServerName = "unknown";
mUsePull = false;
@@ -212,7 +239,7 @@ public class VpnProfile implements Serializable, Cloneable {
}
public String getName() {
- if (mName == null)
+ if (TextUtils.isEmpty(mName))
return "No profile name";
return mName;
}
@@ -274,12 +301,13 @@ public class VpnProfile implements Serializable, Cloneable {
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,
+ String versionString = String.format(Locale.US, "%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";
+ cfg += "allow-recursive-routing\n";
// Users are confused by warnings that are misleading...
cfg += "ifconfig-nowarn\n";
@@ -299,19 +327,25 @@ public class VpnProfile implements Serializable, Cloneable {
cfg += "verb " + MAXLOGLEVEL + "\n";
if (mConnectRetryMax == null) {
- mConnectRetryMax = "5";
+ mConnectRetryMax = "-1";
}
if (!mConnectRetryMax.equals("-1"))
cfg += "connect-retry-max " + mConnectRetryMax + "\n";
- if (mConnectRetry == null)
- mConnectRetry = "5";
+ if (TextUtils.isEmpty(mConnectRetry))
+ mConnectRetry = "2";
+
+ if (TextUtils.isEmpty(mConnectRetryMaxTime))
+ mConnectRetryMaxTime = "300";
- if (!mIsOpenVPN22 || !mUseUdp)
+ if (!mIsOpenVPN22)
+ cfg += "connect-retry " + mConnectRetry + " " + mConnectRetryMaxTime + "\n";
+ else if (mIsOpenVPN22 && mUseUdp)
cfg += "connect-retry " + mConnectRetry + "\n";
+
cfg += "resolv-retry 60\n";
@@ -384,6 +418,12 @@ public class VpnProfile implements Serializable, Cloneable {
cfg += insertFileData("ca", mCaFilename);
}
+ if (isUserPWAuth())
+ {
+ if (mAuthenticationType == AUTH_RETRY_NOINTERACT)
+ cfg += "auth-retry nointeract";
+ }
+
if (!TextUtils.isEmpty(mCrlFilename))
cfg += insertFileData("crl-verify", mCrlFilename);
@@ -392,12 +432,16 @@ public class VpnProfile implements Serializable, Cloneable {
}
if (mUseTLSAuth) {
+ boolean useTlsCrypt = mTLSAuthDirection.equals("tls-crypt");
+
if (mAuthenticationType == TYPE_STATICKEYS)
cfg += insertFileData("secret", mTLSAuthFilename);
+ else if (useTlsCrypt)
+ cfg += insertFileData("tls-crypt", mTLSAuthFilename);
else
cfg += insertFileData("tls-auth", mTLSAuthFilename);
- if (!TextUtils.isEmpty(mTLSAuthDirection)) {
+ if (!TextUtils.isEmpty(mTLSAuthDirection) && !useTlsCrypt) {
cfg += "key-direction ";
cfg += mTLSAuthDirection;
cfg += "\n";
@@ -409,8 +453,12 @@ public class VpnProfile implements Serializable, Cloneable {
if (!TextUtils.isEmpty(mIPv4Address))
cfg += "ifconfig " + cidrToIPAndNetmask(mIPv4Address) + "\n";
- if (!TextUtils.isEmpty(mIPv6Address))
- cfg += "ifconfig-ipv6 " + mIPv6Address + "\n";
+ if (!TextUtils.isEmpty(mIPv6Address)) {
+ // Use our own ip as gateway since we ignore it anyway
+ String fakegw = mIPv6Address.split("/", 2)[0];
+ cfg += "ifconfig-ipv6 " + mIPv6Address + " " + fakegw +"\n";
+ }
+
}
if (mUsePull && mRoutenopull)
@@ -441,22 +489,33 @@ public class VpnProfile implements Serializable, Cloneable {
cfg += routes;
if (mOverrideDNS || !mUsePull) {
- if (!TextUtils.isEmpty(mDNS1))
- cfg += "dhcp-option DNS " + mDNS1 + "\n";
- if (!TextUtils.isEmpty(mDNS2))
- cfg += "dhcp-option DNS " + mDNS2 + "\n";
- if (!TextUtils.isEmpty(mSearchDomain))
+ if (!TextUtils.isEmpty(mDNS1)) {
+ if (mDNS1.contains(":"))
+ cfg += "dhcp-option DNS6 " + mDNS1 + "\n";
+ else
+ cfg += "dhcp-option DNS " + mDNS1 + "\n";
+ } if (!TextUtils.isEmpty(mDNS2)) {
+ if (mDNS2.contains(":"))
+ cfg += "dhcp-option DNS6 " + mDNS2 + "\n";
+ else
+ cfg += "dhcp-option DNS " + mDNS2 + "\n";
+ } if (!TextUtils.isEmpty(mSearchDomain))
cfg += "dhcp-option DOMAIN " + mSearchDomain + "\n";
}
if (mMssFix != 0) {
if (mMssFix != 1450) {
- cfg += String.format("mssfix %d\n", mMssFix, Locale.US);
+ cfg += String.format(Locale.US, "mssfix %d\n", mMssFix);
} else
cfg += "mssfix\n";
}
+ if (mTunMtu >= 48 && mTunMtu != 1500)
+ {
+ cfg+= String.format(Locale.US, "tun-mtu %d\n", mTunMtu);
+ }
+
if (mNobind)
cfg += "nobind\n";
@@ -465,7 +524,7 @@ public class VpnProfile implements Serializable, Cloneable {
if (mAuthenticationType != TYPE_STATICKEYS) {
if (mCheckRemoteCN) {
if (mRemoteCN == null || mRemoteCN.equals(""))
- cfg += "verify-x509-name " + mConnections[0].mServerName + " name\n";
+ cfg += "verify-x509-name " + openVpnEscape(mConnections[0].mServerName) + " name\n";
else
switch (mX509AuthType) {
@@ -488,6 +547,8 @@ public class VpnProfile implements Serializable, Cloneable {
cfg += "verify-x509-name " + openVpnEscape(mRemoteCN) + "\n";
break;
}
+ if (!TextUtils.isEmpty(mx509UsernameField))
+ cfg += "x509-username-field " + openVpnEscape(mx509UsernameField) + "\n";
}
if (mExpectTLSCert)
cfg += "remote-cert-tls server\n";
@@ -659,7 +720,7 @@ public class VpnProfile implements Serializable, Cloneable {
Intent intent = new Intent(context, OpenVPNService.class);
intent.putExtra(prefix + ".profileUUID", mUuid.toString());
-
+ intent.putExtra(prefix + ".profileVersion", mVersion);
return intent;
}
@@ -730,6 +791,10 @@ public class VpnProfile implements Serializable, Cloneable {
}
}
+ public void pwDidFail(Context c) {
+
+ }
+
class NoCertReturnedException extends Exception {
public NoCertReturnedException(String msg) {
@@ -738,6 +803,10 @@ public class VpnProfile implements Serializable, Cloneable {
}
synchronized String[] getKeyStoreCertificates(Context context, int tries) {
+ // Force application context- KeyChain methods will block long enough that by the time they
+ // are finished and try to unbind, the original activity context might have been destroyed.
+ context = context.getApplicationContext();
+
try {
PrivateKey privateKey = KeyChain.getPrivateKey(context, mAlias);
mPrivateKey = privateKey;
@@ -838,8 +907,14 @@ public class VpnProfile implements Serializable, Cloneable {
if (mAuthenticationType == TYPE_KEYSTORE || mAuthenticationType == TYPE_USERPASS_KEYSTORE) {
if (mAlias == null)
return R.string.no_keystore_cert_selected;
+ } else if (mAuthenticationType == TYPE_CERTIFICATES || mAuthenticationType == TYPE_USERPASS_CERTIFICATES){
+ if (TextUtils.isEmpty(mCaFilename))
+ return R.string.no_ca_cert_selected;
}
+ if (mCheckRemoteCN && mX509AuthType==X509_VERIFY_TLSREMOTE)
+ return R.string.deprecated_tls_remote;
+
if (!mUsePull || mAuthenticationType == TYPE_STATICKEYS) {
if (mIPv4Address == null || cidrToIPAndNetmask(mIPv4Address) == null)
return R.string.ipv4_format_error;
@@ -881,10 +956,9 @@ public class VpnProfile implements Serializable, Cloneable {
//! Openvpn asks for a "Private Key", this should be pkcs12 key
//
public String getPasswordPrivateKey() {
- if (mTransientPCKS12PW != null) {
- String pwcopy = mTransientPCKS12PW;
- mTransientPCKS12PW = null;
- return pwcopy;
+ String cachedPw = PasswordCache.getPKCS12orCertificatePassword(mUuid, true);
+ if (cachedPw != null) {
+ return cachedPw;
}
switch (mAuthenticationType) {
case TYPE_PKCS12:
@@ -949,33 +1023,32 @@ public class VpnProfile implements Serializable, Cloneable {
return false;
}
- public int needUserPWInput(boolean ignoreTransient) {
+ public int needUserPWInput(String transientCertOrPkcs12PW, String mTransientAuthPW) {
if ((mAuthenticationType == TYPE_PKCS12 || mAuthenticationType == TYPE_USERPASS_PKCS12) &&
(mPKCS12Password == null || mPKCS12Password.equals(""))) {
- if (ignoreTransient || mTransientPCKS12PW == null)
+ if (transientCertOrPkcs12PW == null)
return R.string.pkcs12_file_encryption_key;
}
if (mAuthenticationType == TYPE_CERTIFICATES || mAuthenticationType == TYPE_USERPASS_CERTIFICATES) {
if (requireTLSKeyPassword() && TextUtils.isEmpty(mKeyPassword))
- if (ignoreTransient || mTransientPCKS12PW == null) {
+ if (transientCertOrPkcs12PW == null) {
return R.string.private_key_password;
}
}
if (isUserPWAuth() &&
(TextUtils.isEmpty(mUsername) ||
- (TextUtils.isEmpty(mPassword) && (mTransientPW == null || ignoreTransient)))) {
+ (TextUtils.isEmpty(mPassword) && mTransientAuthPW == null))) {
return R.string.password;
}
return 0;
}
public String getPasswordAuth() {
- if (mTransientPW != null) {
- String pwcopy = mTransientPW;
- mTransientPW = null;
- return pwcopy;
+ String cachedPw = PasswordCache.getAuthPassword(mUuid, true);
+ if (cachedPw != null) {
+ return cachedPw;
} else {
return mPassword;
}
@@ -1008,7 +1081,6 @@ public class VpnProfile implements Serializable, Cloneable {
try {
-
/* ECB is perfectly fine in this special case, since we are using it for
the public/private part in the TLS exchange
*/
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 d25bccad..068821f5 100644
--- a/app/src/main/java/de/blinkt/openvpn/activities/DisconnectVPN.java
+++ b/app/src/main/java/de/blinkt/openvpn/activities/DisconnectVPN.java
@@ -7,33 +7,40 @@ package de.blinkt.openvpn.activities;
import android.app.Activity;
import android.app.AlertDialog;
-import android.content.*;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.content.ServiceConnection;
import android.os.IBinder;
+import android.os.RemoteException;
+import de.blinkt.openvpn.LaunchVPN;
import se.leap.bitmaskclient.R;
+import de.blinkt.openvpn.core.IOpenVPNServiceInternal;
import de.blinkt.openvpn.core.OpenVPNService;
import de.blinkt.openvpn.core.ProfileManager;
+import de.blinkt.openvpn.core.VpnStatus;
/**
* Created by arne on 13.10.13.
*/
public class DisconnectVPN extends Activity implements DialogInterface.OnClickListener, DialogInterface.OnCancelListener {
- protected OpenVPNService mService;
-
+ private IOpenVPNServiceInternal mService;
private ServiceConnection mConnection = new ServiceConnection() {
+
@Override
public void onServiceConnected(ComponentName className,
IBinder service) {
- // We've bound to LocalService, cast the IBinder and get LocalService instance
- OpenVPNService.LocalBinder binder = (OpenVPNService.LocalBinder) service;
- mService = binder.getService();
+
+ mService = IOpenVPNServiceInternal.Stub.asInterface(service);
}
@Override
public void onServiceDisconnected(ComponentName arg0) {
- mService =null;
+ mService = null;
}
};
@@ -53,24 +60,13 @@ public class DisconnectVPN extends Activity implements DialogInterface.OnClickLi
unbindService(mConnection);
}
- // if (getIntent() !=null && OpenVpnService.DISCONNECT_VPN.equals(getIntent().getAction()))
-
- // setIntent(null);
-
- /*
- @Override
- protected void onNewIntent(Intent intent) {
- super.onNewIntent(intent);
- setIntent(intent);
- }
- */
-
private void showDisconnectDialog() {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle(R.string.title_cancel);
builder.setMessage(R.string.cancel_connection_query);
- builder.setNegativeButton(android.R.string.no, this);
- builder.setPositiveButton(android.R.string.yes,this);
+ builder.setNegativeButton(android.R.string.cancel, this);
+ builder.setPositiveButton(R.string.cancel_connection, this);
+ builder.setNeutralButton(R.string.reconnect, this);
builder.setOnCancelListener(this);
builder.show();
@@ -80,8 +76,18 @@ public class DisconnectVPN extends Activity implements DialogInterface.OnClickLi
public void onClick(DialogInterface dialog, int which) {
if (which == DialogInterface.BUTTON_POSITIVE) {
ProfileManager.setConntectedVpnProfileDisconnected(this);
- if (mService != null && mService.getManagement() != null)
- mService.getManagement().stopVPN(false);
+ if (mService != null) {
+ try {
+ mService.stopVPN(false);
+ } catch (RemoteException e) {
+ VpnStatus.logException(e);
+ }
+ }
+ } else if (which == DialogInterface.BUTTON_NEUTRAL) {
+ Intent intent = new Intent(this, LaunchVPN.class);
+ intent.putExtra(LaunchVPN.EXTRA_KEY, VpnStatus.getLastConnectedVPNProfile());
+ intent.setAction(Intent.ACTION_MAIN);
+ startActivity(intent);
}
finish();
}
diff --git a/app/src/main/java/de/blinkt/openvpn/api/APIVpnProfile.java b/app/src/main/java/de/blinkt/openvpn/api/APIVpnProfile.java
new file mode 100644
index 00000000..adc7f8b7
--- /dev/null
+++ b/app/src/main/java/de/blinkt/openvpn/api/APIVpnProfile.java
@@ -0,0 +1,60 @@
+/*
+ * 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.api;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+public class APIVpnProfile implements Parcelable {
+
+ public final String mUUID;
+ public final String mName;
+ public final boolean mUserEditable;
+ //public final String mProfileCreator;
+
+ public APIVpnProfile(Parcel in) {
+ mUUID = in.readString();
+ mName = in.readString();
+ mUserEditable = in.readInt() != 0;
+ //mProfileCreator = in.readString();
+ }
+
+ public APIVpnProfile(String uuidString, String name, boolean userEditable, String profileCreator) {
+ mUUID = uuidString;
+ mName = name;
+ mUserEditable = userEditable;
+ //mProfileCreator = profileCreator;
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(Parcel dest, int flags) {
+ dest.writeString(mUUID);
+ dest.writeString(mName);
+ if (mUserEditable)
+ dest.writeInt(0);
+ else
+ dest.writeInt(1);
+ //dest.writeString(mProfileCreator);
+ }
+
+ public static final Parcelable.Creator<APIVpnProfile> CREATOR
+ = new Parcelable.Creator<APIVpnProfile>() {
+ public APIVpnProfile createFromParcel(Parcel in) {
+ return new APIVpnProfile(in);
+ }
+
+ public APIVpnProfile[] newArray(int size) {
+ return new APIVpnProfile[size];
+ }
+ };
+
+
+}
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 07f2152f..799c68c9 100644
--- a/app/src/main/java/de/blinkt/openvpn/core/CIDRIP.java
+++ b/app/src/main/java/de/blinkt/openvpn/core/CIDRIP.java
@@ -47,9 +47,9 @@ class CIDRIP {
public boolean normalise() {
long ip = getInt(mIp);
- long newip = ip & (0xffffffffl << (32 - len));
+ long newip = ip & (0xffffffffL << (32 - len));
if (newip != ip) {
- mIp = String.format("%d.%d.%d.%d", (newip & 0xff000000) >> 24, (newip & 0xff0000) >> 16, (newip & 0xff00) >> 8, newip & 0xff);
+ mIp = String.format(Locale.US,"%d.%d.%d.%d", (newip & 0xff000000) >> 24, (newip & 0xff0000) >> 16, (newip & 0xff00) >> 8, newip & 0xff);
return true;
} else {
return false;
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 d14e643e..74afd61e 100644
--- a/app/src/main/java/de/blinkt/openvpn/core/ConfigParser.java
+++ b/app/src/main/java/de/blinkt/openvpn/core/ConfigParser.java
@@ -6,7 +6,7 @@
package de.blinkt.openvpn.core;
import android.text.TextUtils;
-import android.util.Pair;
+import android.support.v4.util.Pair;
import java.io.BufferedReader;
import java.io.IOException;
@@ -119,6 +119,9 @@ public class ConfigParser {
}
} while (true);
+ if(inlinefile.endsWith("\n"))
+ inlinefile = inlinefile.substring(0, inlinefile.length()-1);
+
args.clear();
args.add(argname);
args.add(inlinefile);
@@ -251,10 +254,12 @@ public class ConfigParser {
"route-up",
"route-pre-down",
"auth-user-pass-verify",
+ "block-outside-dns",
"dhcp-release",
"dhcp-renew",
"dh",
"group",
+ "allow-recursive-routing",
"ip-win32",
"management-hold",
"management",
@@ -273,6 +278,7 @@ public class ConfigParser {
"plugin",
"machine-readable-output",
"persist-key",
+ "push",
"register-dns",
"route-delay",
"route-gateway",
@@ -322,7 +328,6 @@ public class ConfigParser {
"socks-proxy",
"socks-proxy-retry",
"explicit-exit-notify",
- "mssfix"
};
@@ -394,7 +399,7 @@ public class ConfigParser {
np.mCustomRoutesv6 = customIPv6Routes;
}
- Vector<String> routeNoPull = getOption("route-nopull", 1, 1);
+ Vector<String> routeNoPull = getOption("route-nopull", 0, 0);
if (routeNoPull!=null)
np.mRoutenopull=true;
@@ -417,15 +422,21 @@ public class ConfigParser {
if (direction != null)
np.mTLSAuthDirection = direction.get(1);
- Vector<Vector<String>> defgw = getAllOption("redirect-gateway", 0, 5);
+ Vector<String> tlscrypt = getOption("tls-crypt", 1, 1);
+ if (tlscrypt!=null) {
+ np.mUseTLSAuth = true;
+ np.mTLSAuthFilename = tlscrypt.get(1);
+ np.mTLSAuthDirection = "tls-crypt";
+ }
+
+ Vector<Vector<String>> defgw = getAllOption("redirect-gateway", 0, 7);
if (defgw != null) {
- np.mUseDefaultRoute = true;
- checkRedirectParameters(np, defgw);
+ checkRedirectParameters(np, defgw, true);
}
Vector<Vector<String>> redirectPrivate = getAllOption("redirect-private", 0, 5);
if (redirectPrivate != null) {
- checkRedirectParameters(np, redirectPrivate);
+ checkRedirectParameters(np, redirectPrivate, false);
}
Vector<String> dev = getOption("dev", 1, 1);
Vector<String> devtype = getOption("dev-type", 1, 1);
@@ -448,11 +459,23 @@ public class ConfigParser {
throw new ConfigParseError("Argument to --mssfix has to be an integer");
}
} else {
- np.mMssFix = VpnProfile.DEFAULT_MSSFIX_SIZE;
+ np.mMssFix = 1450; // OpenVPN default size
}
}
+ Vector<String> tunmtu = getOption("mtu", 1, 1);
+
+ if (tunmtu != null) {
+ try {
+ np.mTunMtu = Integer.parseInt(tunmtu.get(1));
+ } catch (NumberFormatException e) {
+ throw new ConfigParseError("Argument to --tun-mtu has to be an integer");
+ }
+ }
+
+
+
Vector<String> mode = getOption("mode", 1, 1);
if (mode != null) {
if (!mode.get(1).equals("p2p"))
@@ -554,16 +577,23 @@ public class ConfigParser {
if (verifyx509name.size() > 2) {
if (verifyx509name.get(2).equals("name"))
np.mX509AuthType = VpnProfile.X509_VERIFY_TLSREMOTE_RDN;
+ else if (verifyx509name.get(2).equals("subject"))
+ np.mX509AuthType = VpnProfile.X509_VERIFY_TLSREMOTE_DN;
else if (verifyx509name.get(2).equals("name-prefix"))
np.mX509AuthType = VpnProfile.X509_VERIFY_TLSREMOTE_RDN_PREFIX;
else
- throw new ConfigParseError("Unknown parameter to x509-verify-name: " + verifyx509name.get(2));
+ throw new ConfigParseError("Unknown parameter to verify-x509-name: " + verifyx509name.get(2));
} else {
np.mX509AuthType = VpnProfile.X509_VERIFY_TLSREMOTE_DN;
}
}
+ Vector<String> x509usernamefield = getOption("x509-username-field", 1,1);
+ if (x509usernamefield!=null) {
+ np.mx509UsernameField = x509usernamefield.get(1);
+ }
+
Vector<String> verb = getOption("verb", 1, 1);
if (verb != null) {
@@ -580,9 +610,12 @@ public class ConfigParser {
if (getOption("push-peer-info", 0, 0) != null)
np.mPushPeerInfo = true;
- Vector<String> connectretry = getOption("connect-retry", 1, 1);
- if (connectretry != null)
+ Vector<String> connectretry = getOption("connect-retry", 1, 2);
+ if (connectretry != null) {
np.mConnectRetry = connectretry.get(1);
+ if (connectretry.size() > 2)
+ np.mConnectRetryMaxTime = connectretry.get(2);
+ }
Vector<String> connectretrymax = getOption("connect-retry-max", 1, 1);
if (connectretrymax != null)
@@ -613,6 +646,19 @@ public class ConfigParser {
}
}
+ Vector<String> authretry = getOption("auth-retry", 1, 1);
+ if (authretry != null) {
+ if (authretry.get(1).equals("none"))
+ np.mAuthRetry = VpnProfile.AUTH_RETRY_NONE_FORGET;
+ else if (authretry.get(1).equals("nointeract"))
+ np.mAuthRetry = VpnProfile.AUTH_RETRY_NOINTERACT;
+ else if (authretry.get(1).equals("interact"))
+ np.mAuthRetry = VpnProfile.AUTH_RETRY_NOINTERACT;
+ else
+ throw new ConfigParseError("Unknown parameter to auth-retry: " + authretry.get(2));
+ }
+
+
Vector<String> crlfile = getOption("crl-verify", 1, 2);
if (crlfile != null) {
// If the 'dir' parameter is present just add it as custom option ..
@@ -776,22 +822,34 @@ public class ConfigParser {
}
- private void checkRedirectParameters(VpnProfile np, Vector<Vector<String>> defgw) {
+ private void checkRedirectParameters(VpnProfile np, Vector<Vector<String>> defgw, boolean defaultRoute) {
+
+ boolean noIpv4 = false;
+ if (defaultRoute)
+
for (Vector<String> redirect : defgw)
for (int i = 1; i < redirect.size(); i++) {
if (redirect.get(i).equals("block-local"))
np.mAllowLocalLAN = false;
else if (redirect.get(i).equals("unblock-local"))
np.mAllowLocalLAN = true;
+ else if (redirect.get(i).equals("!ipv4"))
+ noIpv4=true;
+ else if (redirect.get(i).equals("ipv6"))
+ np.mUseDefaultRoutev6=true;
}
+ if (defaultRoute && !noIpv4)
+ np.mUseDefaultRoute=true;
}
private boolean isUdpProto(String proto) throws ConfigParseError {
boolean isudp;
- if (proto.equals("udp") || proto.equals("udp6"))
+ if (proto.equals("udp") || proto.equals("udp4") || proto.equals("udp6"))
isudp = true;
else if (proto.equals("tcp-client") ||
proto.equals("tcp") ||
+ proto.equals("tcp4") ||
+ proto.endsWith("tcp4-client") ||
proto.equals("tcp6") ||
proto.endsWith("tcp6-client"))
isudp = false;
@@ -858,10 +916,9 @@ public class ConfigParser {
for (Vector<String> optionsline : option) {
if (!ignoreThisOption(optionsline)) {
// Check if option had been inlined and inline again
- if (optionsline.size() == 2 && "extra-certs".equals(optionsline.get(0)) ) {
+ if (optionsline.size() == 2 &&
+ ("extra-certs".equals(optionsline.get(0)) || "http-proxy-user-pass".equals(optionsline.get(0)))) {
custom += VpnProfile.insertFileData(optionsline.get(0), optionsline.get(1));
-
-
} else {
for (String arg : optionsline)
custom += VpnProfile.openVpnEscape(arg) + " ";
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 3455450b..ff15daec 100644
--- a/app/src/main/java/de/blinkt/openvpn/core/Connection.java
+++ b/app/src/main/java/de/blinkt/openvpn/core/Connection.java
@@ -8,21 +8,23 @@ package de.blinkt.openvpn.core;
import android.text.TextUtils;
import java.io.Serializable;
+import java.util.Locale;
public class Connection implements Serializable, Cloneable {
- public String mServerName = "openvpn.blinkt.de";
+ public String mServerName = "openvpn.example.com";
public String mServerPort = "1194";
public boolean mUseUdp = true;
- public String mCustomConfiguration="";
- public boolean mUseCustomConfig=false;
- public boolean mEnabled=true;
+ public String mCustomConfiguration = "";
+ public boolean mUseCustomConfig = false;
+ public boolean mEnabled = true;
public int mConnectTimeout = 0;
+ public static final int CONNECTION_DEFAULT_TIMEOUT = 120;
private static final long serialVersionUID = 92031902903829089L;
public String getConnectionBlock() {
- String cfg="";
+ String cfg = "";
// Server Address
cfg += "remote ";
@@ -34,8 +36,8 @@ public class Connection implements Serializable, Cloneable {
else
cfg += " tcp-client\n";
- if (mConnectTimeout!=0)
- cfg += String.format(" connect-timeout %d\n" , mConnectTimeout);
+ if (mConnectTimeout != 0)
+ cfg += String.format(Locale.US, " connect-timeout %d\n", mConnectTimeout);
if (!TextUtils.isEmpty(mCustomConfiguration) && mUseCustomConfig) {
@@ -53,4 +55,11 @@ public class Connection implements Serializable, Cloneable {
public boolean isOnlyRemote() {
return TextUtils.isEmpty(mCustomConfiguration) || !mUseCustomConfig;
}
+
+ public int getTimeout() {
+ if (mConnectTimeout <= 0)
+ return CONNECTION_DEFAULT_TIMEOUT;
+ else
+ return mConnectTimeout;
+ }
}
diff --git a/app/src/main/java/de/blinkt/openvpn/core/ConnectionStatus.java b/app/src/main/java/de/blinkt/openvpn/core/ConnectionStatus.java
new file mode 100644
index 00000000..03d842e3
--- /dev/null
+++ b/app/src/main/java/de/blinkt/openvpn/core/ConnectionStatus.java
@@ -0,0 +1,47 @@
+/*
+ * 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.Parcel;
+import android.os.Parcelable;
+
+/**
+ * Created by arne on 08.11.16.
+ */
+public enum ConnectionStatus implements Parcelable {
+ LEVEL_CONNECTED,
+ LEVEL_VPNPAUSED,
+ LEVEL_CONNECTING_SERVER_REPLIED,
+ LEVEL_CONNECTING_NO_SERVER_REPLY_YET,
+ LEVEL_NONETWORK,
+ LEVEL_NOTCONNECTED,
+ LEVEL_START,
+ LEVEL_AUTH_FAILED,
+ LEVEL_WAITING_FOR_USER_INPUT,
+ UNKNOWN_LEVEL;
+
+ @Override
+ public void writeToParcel(Parcel dest, int flags) {
+ dest.writeInt(ordinal());
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ public static final Creator<ConnectionStatus> CREATOR = new Creator<ConnectionStatus>() {
+ @Override
+ public ConnectionStatus createFromParcel(Parcel in) {
+ return ConnectionStatus.values()[in.readInt()];
+ }
+
+ @Override
+ public ConnectionStatus[] newArray(int size) {
+ return new ConnectionStatus[size];
+ }
+ };
+}
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 40684af3..c396f181 100644
--- a/app/src/main/java/de/blinkt/openvpn/core/DeviceStateReceiver.java
+++ b/app/src/main/java/de/blinkt/openvpn/core/DeviceStateReceiver.java
@@ -20,6 +20,7 @@ import de.blinkt.openvpn.core.VpnStatus.ByteCountListener;
import java.util.LinkedList;
import java.util.Objects;
+import java.util.StringTokenizer;
import static de.blinkt.openvpn.core.OpenVPNManagement.pauseReason;
@@ -64,13 +65,13 @@ public class DeviceStateReceiver extends BroadcastReceiver implements ByteCountL
return shouldBeConnected();
}
- enum connectState {
+ private enum connectState {
SHOULDBECONNECTED,
PENDINGDISCONNECT,
DISCONNECTED
}
- static class Datapoint {
+ private static class Datapoint {
private Datapoint(long t, long d) {
timestamp = t;
data = d;
@@ -80,7 +81,7 @@ public class DeviceStateReceiver extends BroadcastReceiver implements ByteCountL
long data;
}
- LinkedList<Datapoint> trafficdata = new LinkedList<DeviceStateReceiver.Datapoint>();
+ private LinkedList<Datapoint> trafficdata = new LinkedList<>();
@Override
@@ -102,7 +103,7 @@ public class DeviceStateReceiver extends BroadcastReceiver implements ByteCountL
if (windowtraffic < TRAFFIC_LIMIT) {
screen = connectState.DISCONNECTED;
VpnStatus.logInfo(R.string.screenoff_pause,
- OpenVPNService.humanReadableByteCount(TRAFFIC_LIMIT, false), TRAFFIC_WINDOW);
+ "64 kB", TRAFFIC_WINDOW);
mManagement.pause(getPauseReason());
}
@@ -135,7 +136,7 @@ public class DeviceStateReceiver extends BroadcastReceiver implements ByteCountL
@Override
public void onReceive(Context context, Intent intent) {
- SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
+ SharedPreferences prefs = Preferences.getDefaultSharedPreferences(context);
if (ConnectivityManager.CONNECTIVITY_ACTION.equals(intent.getAction())) {
@@ -173,15 +174,15 @@ 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) {
NetworkInfo networkInfo = getCurrentNetworkInfo(context);
- SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
+ SharedPreferences prefs = Preferences.getDefaultSharedPreferences(context);
boolean sendusr1 = prefs.getBoolean("netchangereconnect", true);
@@ -261,6 +262,8 @@ public class DeviceStateReceiver extends BroadcastReceiver implements ByteCountL
if (!netstatestring.equals(lastStateMsg))
VpnStatus.logInfo(R.string.netstatus, netstatestring);
+ VpnStatus.logDebug(String.format("Debug state info: %s, pause: %s, shouldbeconnected: %s, network: %s ",
+ netstatestring, getPauseReason(), shouldBeConnected(), network));
lastStateMsg = netstatestring;
}
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 db3ae751..e7019f42 100644
--- a/app/src/main/java/de/blinkt/openvpn/core/ICSOpenVPNApplication.java
+++ b/app/src/main/java/de/blinkt/openvpn/core/ICSOpenVPNApplication.java
@@ -4,7 +4,14 @@
*/
package de.blinkt.openvpn.core;
+
+import android.annotation.TargetApi;
import android.app.Application;
+import android.app.NotificationChannel;
+import android.app.NotificationManager;
+import android.content.Context;
+import android.graphics.Color;
+import android.os.Build;
/*
import org.acra.ACRA;
@@ -12,32 +19,50 @@ import org.acra.ReportingInteractionMode;
import org.acra.annotation.ReportsCrashes;
*/
-import se.leap.bitmaskclient.BuildConfig;
import se.leap.bitmaskclient.R;
-import de.blinkt.openvpn.core.PRNGFixes;
-/*
-@ReportsCrashes(
- formKey = "",
- formUri = "http://reports.blinkt.de/report-icsopenvpn",
- reportType = org.acra.sender.HttpSender.Type.JSON,
- httpMethod = org.acra.sender.HttpSender.Method.PUT,
- formUriBasicAuthLogin="report-icsopenvpn",
- formUriBasicAuthPassword="Tohd4neiF9Ai!!!!111eleven",
- mode = ReportingInteractionMode.TOAST,
- resToastText = R.string.crash_toast_text
-)
-*/
public class ICSOpenVPNApplication extends Application {
+ private StatusListener mStatus;
+
@Override
public void onCreate() {
super.onCreate();
PRNGFixes.apply();
- if (BuildConfig.DEBUG) {
- //ACRA.init(this);
- }
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
+
+ createNotificationChannels();
+ mStatus = new StatusListener();
+ mStatus.init(getApplicationContext());
+
+ }
+
+ @TargetApi(Build.VERSION_CODES.O)
+ private void createNotificationChannels() {
+ NotificationManager mNotificationManager =
+ (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
+
+ // Background message
+ CharSequence name = getString(R.string.channel_name_background);
+ NotificationChannel mChannel = new NotificationChannel(OpenVPNService.NOTIFICATION_CHANNEL_BG_ID,
+ name, NotificationManager.IMPORTANCE_MIN);
+
+ mChannel.setDescription(getString(R.string.channel_description_background));
+ mChannel.enableLights(false);
+
+ mChannel.setLightColor(Color.DKGRAY);
+ mNotificationManager.createNotificationChannel(mChannel);
+
+ // Connection status change messages
+
+ name = getString(R.string.channel_name_status);
+ mChannel = new NotificationChannel(OpenVPNService.NOTIFICATION_CHANNEL_NEWSTATUS_ID,
+ name, NotificationManager.IMPORTANCE_DEFAULT);
+
+ mChannel.setDescription(getString(R.string.channel_description_status));
+ mChannel.enableLights(true);
- VpnStatus.initLogCache(getApplicationContext().getCacheDir());
+ mChannel.setLightColor(Color.BLUE);
+ mNotificationManager.createNotificationChannel(mChannel);
}
}
diff --git a/app/src/main/java/de/blinkt/openvpn/core/LogFileHandler.java b/app/src/main/java/de/blinkt/openvpn/core/LogFileHandler.java
index 288c7934..57d1fb22 100644
--- a/app/src/main/java/de/blinkt/openvpn/core/LogFileHandler.java
+++ b/app/src/main/java/de/blinkt/openvpn/core/LogFileHandler.java
@@ -8,7 +8,6 @@ package de.blinkt.openvpn.core;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
-import android.os.Parcel;
import java.io.BufferedInputStream;
import java.io.File;
@@ -16,6 +15,10 @@ import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.UnsupportedEncodingException;
+import java.nio.BufferOverflowException;
import java.nio.ByteBuffer;
import java.util.Locale;
@@ -29,7 +32,8 @@ class LogFileHandler extends Handler {
static final int FLUSH_TO_DISK = 101;
static final int LOG_INIT = 102;
public static final int LOG_MESSAGE = 103;
- private static FileOutputStream mLogFile;
+ public static final int MAGIC_BYTE = 0x55;
+ protected OutputStream mLogFile;
public static final String LOGFILE_NAME = "logcache.dat";
@@ -47,20 +51,20 @@ class LogFileHandler extends Handler {
throw new RuntimeException("mLogFile not null");
readLogCache((File) msg.obj);
openLogFile((File) msg.obj);
- } else if (msg.what == LOG_MESSAGE && msg.obj instanceof VpnStatus.LogItem) {
+ } else if (msg.what == LOG_MESSAGE && msg.obj instanceof LogItem) {
// Ignore log messages if not yet initialized
if (mLogFile == null)
return;
- writeLogItemToDisk((VpnStatus.LogItem) msg.obj);
+ writeLogItemToDisk((LogItem) msg.obj);
} else if (msg.what == TRIM_LOG_FILE) {
trimLogFile();
- for (VpnStatus.LogItem li : VpnStatus.getlogbuffer())
+ for (LogItem li : VpnStatus.getlogbuffer())
writeLogItemToDisk(li);
} else if (msg.what == FLUSH_TO_DISK) {
flushToDisk();
}
- } catch (IOException e) {
+ } catch (IOException | BufferOverflowException e) {
e.printStackTrace();
VpnStatus.logError("Error during log cache: " + msg.what);
VpnStatus.logException(e);
@@ -72,95 +76,160 @@ class LogFileHandler extends Handler {
mLogFile.flush();
}
- private static void trimLogFile() {
+ private void trimLogFile() {
try {
mLogFile.flush();
- mLogFile.getChannel().truncate(0);
+ ((FileOutputStream) mLogFile).getChannel().truncate(0);
} catch (IOException e) {
e.printStackTrace();
}
}
- private void writeLogItemToDisk(VpnStatus.LogItem li) throws IOException {
- Parcel p = Parcel.obtain();
- li.writeToParcel(p, 0);
+ private void writeLogItemToDisk(LogItem li) throws IOException {
+
// We do not really care if the log cache breaks between Android upgrades,
// write binary format to disc
- byte[] liBytes = p.marshall();
- byte[] lenBytes = ByteBuffer.allocate(4).putInt(liBytes.length).array();
- mLogFile.write(lenBytes);
- mLogFile.write(liBytes);
- p.recycle();
+ byte[] liBytes = li.getMarschaledBytes();
+
+ writeEscapedBytes(liBytes);
+ }
+
+ public void writeEscapedBytes(byte[] bytes) throws IOException {
+ int magic = 0;
+ for (byte b : bytes)
+ if (b == MAGIC_BYTE || b == MAGIC_BYTE + 1)
+ magic++;
+
+ byte eBytes[] = new byte[bytes.length + magic];
+
+ int i = 0;
+ for (byte b : bytes) {
+ if (b == MAGIC_BYTE || b == MAGIC_BYTE + 1) {
+ eBytes[i++] = MAGIC_BYTE + 1;
+ eBytes[i++] = (byte) (b - MAGIC_BYTE);
+ } else {
+ eBytes[i++] = b;
+ }
+ }
+
+ byte[] lenBytes = ByteBuffer.allocate(4).putInt(bytes.length).array();
+ synchronized (mLogFile) {
+ mLogFile.write(MAGIC_BYTE);
+ mLogFile.write(lenBytes);
+ mLogFile.write(eBytes);
+ }
}
- private void openLogFile (File cacheDir) throws FileNotFoundException {
+ private void openLogFile(File cacheDir) throws FileNotFoundException {
File logfile = new File(cacheDir, LOGFILE_NAME);
mLogFile = new FileOutputStream(logfile);
}
private void readLogCache(File cacheDir) {
- File logfile = new File(cacheDir, LOGFILE_NAME);
-
+ try {
+ File logfile = new File(cacheDir, LOGFILE_NAME);
- if (!logfile.exists() || !logfile.canRead())
- return;
+ if (!logfile.exists() || !logfile.canRead())
+ return;
+ readCacheContents(new FileInputStream(logfile));
- try {
+ } catch (java.io.IOException | java.lang.RuntimeException e) {
+ VpnStatus.logError("Reading cached logfile failed");
+ VpnStatus.logException(e);
+ e.printStackTrace();
+ // ignore reading file error
+ } finally {
+ synchronized (VpnStatus.readFileLock) {
+ VpnStatus.readFileLog = true;
+ VpnStatus.readFileLock.notifyAll();
+ }
+ }
+ }
- BufferedInputStream logFile = new BufferedInputStream(new FileInputStream(logfile));
- byte[] buf = new byte[8192];
- int read = logFile.read(buf, 0, 4);
- int itemsRead=0;
+ protected void readCacheContents(InputStream in) throws IOException {
+ BufferedInputStream logFile = new BufferedInputStream(in);
- while (read >= 4) {
- int len = ByteBuffer.wrap(buf, 0, 4).asIntBuffer().get();
+ byte[] buf = new byte[16384];
+ int read = logFile.read(buf, 0, 5);
+ int itemsRead = 0;
- // Marshalled LogItem
- read = logFile.read(buf, 0, len);
- Parcel p = Parcel.obtain();
- p.unmarshall(buf, 0, read);
- p.setDataPosition(0);
- VpnStatus.LogItem li = VpnStatus.LogItem.CREATOR.createFromParcel(p);
- if (li.verify()) {
- VpnStatus.newLogItem(li, true);
- } else {
- VpnStatus.logError(String.format(Locale.getDefault(),
- "Could not read log item from file: %d/%d: %s",
- read, len, bytesToHex(buf, Math.max(read,80))));
+ readloop:
+ while (read >= 5) {
+ int skipped = 0;
+ while (buf[skipped] != MAGIC_BYTE) {
+ skipped++;
+ if (!(logFile.read(buf, skipped + 4, 1) == 1) || skipped + 10 > buf.length) {
+ VpnStatus.logDebug(String.format(Locale.US, "Skipped %d bytes and no a magic byte found", skipped));
+ break readloop;
}
- p.recycle();
-
- //Next item
- read = logFile.read(buf, 0, 4);
- itemsRead++;
- if (itemsRead > 2*VpnStatus.MAXLOGENTRIES) {
- VpnStatus.logError("Too many logentries read from cache, aborting.");
- read = 0;
+ }
+ if (skipped > 0)
+ VpnStatus.logDebug(String.format(Locale.US, "Skipped %d bytes before finding a magic byte", skipped));
+
+ int len = ByteBuffer.wrap(buf, skipped + 1, 4).asIntBuffer().get();
+
+ // Marshalled LogItem
+ int pos = 0;
+ byte buf2[] = new byte[buf.length];
+
+ while (pos < len) {
+ byte b = (byte) logFile.read();
+ if (b == MAGIC_BYTE) {
+ VpnStatus.logDebug(String.format(Locale.US, "Unexpected magic byte found at pos %d, abort current log item", pos));
+ read = logFile.read(buf, 1, 4) + 1;
+ continue readloop;
+ } else if (b == MAGIC_BYTE + 1) {
+ b = (byte) logFile.read();
+ if (b == 0)
+ b = MAGIC_BYTE;
+ else if (b == 1)
+ b = MAGIC_BYTE + 1;
+ else {
+ VpnStatus.logDebug(String.format(Locale.US, "Escaped byte not 0 or 1: %d", b));
+ read = logFile.read(buf, 1, 4) + 1;
+ continue readloop;
+ }
}
+ buf2[pos++] = b;
+ }
+
+ restoreLogItem(buf2, len);
+ //Next item
+ read = logFile.read(buf, 0, 5);
+ itemsRead++;
+ if (itemsRead > 2 * VpnStatus.MAXLOGENTRIES) {
+ VpnStatus.logError("Too many logentries read from cache, aborting.");
+ read = 0;
}
- VpnStatus.logDebug(R.string.reread_log, itemsRead);
+ }
+ VpnStatus.logDebug(R.string.reread_log, itemsRead);
+ }
+ protected void restoreLogItem(byte[] buf, int len) throws UnsupportedEncodingException {
- } catch (java.io.IOException | java.lang.RuntimeException e) {
- VpnStatus.logError("Reading cached logfile failed");
- VpnStatus.logException(e);
- e.printStackTrace();
- // ignore reading file error
+ LogItem li = new LogItem(buf, len);
+ if (li.verify()) {
+ VpnStatus.newLogItem(li, true);
+ } else {
+ VpnStatus.logError(String.format(Locale.getDefault(),
+ "Could not read log item from file: %d: %s",
+ len, bytesToHex(buf, Math.max(len, 80))));
}
}
- final protected static char[] hexArray = "0123456789ABCDEF".toCharArray();
+ private final static char[] hexArray = "0123456789ABCDEF".toCharArray();
+
public static String bytesToHex(byte[] bytes, int len) {
len = Math.min(bytes.length, len);
char[] hexChars = new char[len * 2];
- for ( int j = 0; j < len; j++ ) {
+ for (int j = 0; j < len; j++) {
int v = bytes[j] & 0xFF;
hexChars[j * 2] = hexArray[v >>> 4];
hexChars[j * 2 + 1] = hexArray[v & 0x0F];
diff --git a/app/src/main/java/de/blinkt/openvpn/core/LogItem.java b/app/src/main/java/de/blinkt/openvpn/core/LogItem.java
index 6aefbb2e..cd048f4a 100644
--- a/app/src/main/java/de/blinkt/openvpn/core/LogItem.java
+++ b/app/src/main/java/de/blinkt/openvpn/core/LogItem.java
@@ -12,12 +12,10 @@ import android.content.pm.PackageManager;
import android.content.pm.Signature;
import android.os.Parcel;
import android.os.Parcelable;
-import android.text.TextUtils;
-import android.util.Log;
import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
import java.io.UnsupportedEncodingException;
+import java.nio.BufferOverflowException;
import java.nio.ByteBuffer;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
@@ -89,7 +87,7 @@ public class LogItem implements Parcelable {
}
- public byte[] getMarschaledBytes() throws UnsupportedEncodingException {
+ public byte[] getMarschaledBytes() throws UnsupportedEncodingException, BufferOverflowException {
ByteBuffer bb = ByteBuffer.allocate(16384);
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 eb6d4d42..37689b3f 100644
--- a/app/src/main/java/de/blinkt/openvpn/core/NetworkSpace.java
+++ b/app/src/main/java/de/blinkt/openvpn/core/NetworkSpace.java
@@ -34,8 +34,8 @@ public class NetworkSpace {
/**
* sorts the networks with following criteria:
- * 1. compares first 1 of the network
- * 2. smaller networks are returned as smaller
+ * 1. compares first 1 of the network
+ * 2. smaller networks are returned as smaller
*/
@Override
public int compareTo(@NonNull ipAddress another) {
@@ -55,8 +55,7 @@ public class NetworkSpace {
/**
* Warning ignores the included integer
*
- * @param o
- * the object to compare this instance with.
+ * @param o the object to compare this instance with.
*/
@Override
public boolean equals(Object o) {
@@ -89,15 +88,15 @@ public class NetworkSpace {
}
public BigInteger getLastAddress() {
- if(lastAddress ==null)
+ if (lastAddress == null)
lastAddress = getMaskedAddress(true);
return lastAddress;
}
public BigInteger getFirstAddress() {
- if (firstAddress ==null)
- firstAddress =getMaskedAddress(false);
+ if (firstAddress == null)
+ firstAddress = getMaskedAddress(false);
return firstAddress;
}
@@ -126,7 +125,7 @@ public class NetworkSpace {
public String toString() {
//String in = included ? "+" : "-";
if (isV4)
- return String.format(Locale.US,"%s/%d", getIPv4Address(), networkMask);
+ return String.format(Locale.US, "%s/%d", getIPv4Address(), networkMask);
else
return String.format(Locale.US, "%s/%d", getIPv6Address(), networkMask);
}
@@ -142,36 +141,48 @@ public class NetworkSpace {
public ipAddress[] split() {
ipAddress firstHalf = new ipAddress(getFirstAddress(), networkMask + 1, included, isV4);
ipAddress secondHalf = new ipAddress(firstHalf.getLastAddress().add(BigInteger.ONE), networkMask + 1, included, isV4);
- if (BuildConfig.DEBUG) Assert.assertTrue(secondHalf.getLastAddress().equals(getLastAddress()));
+ if (BuildConfig.DEBUG)
+ Assert.assertTrue(secondHalf.getLastAddress().equals(getLastAddress()));
return new ipAddress[]{firstHalf, secondHalf};
}
String getIPv4Address() {
if (BuildConfig.DEBUG) {
- Assert.assertTrue (isV4);
- Assert.assertTrue (netAddress.longValue() <= 0xffffffffl);
- Assert.assertTrue (netAddress.longValue() >= 0);
+ Assert.assertTrue(isV4);
+ Assert.assertTrue(netAddress.longValue() <= 0xffffffffl);
+ Assert.assertTrue(netAddress.longValue() >= 0);
}
long ip = netAddress.longValue();
return String.format(Locale.US, "%d.%d.%d.%d", (ip >> 24) % 256, (ip >> 16) % 256, (ip >> 8) % 256, ip % 256);
}
String getIPv6Address() {
- if (BuildConfig.DEBUG) Assert.assertTrue (!isV4);
+ if (BuildConfig.DEBUG) Assert.assertTrue(!isV4);
BigInteger r = netAddress;
- Vector<String> parts = new Vector<String>();
- while (r.compareTo(BigInteger.ZERO) == 1 || parts.size() <3) {
+ String ipv6str = null;
+ boolean lastPart = true;
+
+ while (r.compareTo(BigInteger.ZERO) == 1) {
+
long part = r.mod(BigInteger.valueOf(0x10000)).longValue();
- if (part!=0)
- parts.add(0, String.format(Locale.US, "%x", part));
- else
- parts.add(0, "");
+ if (ipv6str != null || part != 0) {
+ if (ipv6str == null && !lastPart)
+ ipv6str = ":";
+
+ if (lastPart)
+ ipv6str = String.format(Locale.US, "%x", part, ipv6str);
+ else
+ ipv6str = String.format(Locale.US, "%x:%s", part, ipv6str);
+ }
+
r = r.shiftRight(16);
+ lastPart = false;
}
- String ipv6str = TextUtils.join(":", parts);
- while (ipv6str.contains(":::"))
- ipv6str = ipv6str.replace(":::", "::");
+ if (ipv6str == null)
+ return "::";
+
+
return ipv6str;
}
@@ -183,8 +194,8 @@ public class NetworkSpace {
BigInteger netLast = network.getLastAddress();
boolean a = ourFirst.compareTo(netFirst) != 1;
- boolean b = ourLast.compareTo(netLast) != -1;
- return a && b;
+ boolean b = ourLast.compareTo(netLast) != -1;
+ return a && b;
}
}
@@ -215,7 +226,7 @@ public class NetworkSpace {
public void addIPSplit(CIDRIP cidrIp, boolean include) {
ipAddress newIP = new ipAddress(cidrIp, include);
ipAddress[] splitIps = newIP.split();
- for (ipAddress split: splitIps)
+ for (ipAddress split : splitIps)
mIpAddresses.add(split);
}
@@ -229,16 +240,16 @@ public class NetworkSpace {
TreeSet<ipAddress> ipsDone = new TreeSet<ipAddress>();
- ipAddress currentNet = networks.poll();
- if (currentNet==null)
+ ipAddress currentNet = networks.poll();
+ if (currentNet == null)
return ipsDone;
- while (currentNet!=null) {
+ while (currentNet != null) {
// Check if it and the next of it are compatible
ipAddress nextNet = networks.poll();
if (BuildConfig.DEBUG) Assert.assertNotNull(currentNet);
- if (nextNet== null || currentNet.getLastAddress().compareTo(nextNet.getFirstAddress()) == -1) {
+ if (nextNet == null || currentNet.getLastAddress().compareTo(nextNet.getFirstAddress()) == -1) {
// Everything good, no overlapping nothing to do
ipsDone.add(currentNet);
@@ -249,7 +260,7 @@ public class NetworkSpace {
if (currentNet.included == nextNet.included) {
// Included in the next next and same type
// Simply forget our current network
- currentNet=nextNet;
+ currentNet = nextNet;
} else {
// our currentNet is included in next and types differ. Need to split the next network
ipAddress[] newNets = nextNet.split();
@@ -262,7 +273,8 @@ public class NetworkSpace {
networks.add(newNets[1]);
if (newNets[0].getLastAddress().equals(currentNet.getLastAddress())) {
- if (BuildConfig.DEBUG) Assert.assertEquals (newNets[0].networkMask, currentNet.networkMask);
+ if (BuildConfig.DEBUG)
+ Assert.assertEquals(newNets[0].networkMask, currentNet.networkMask);
// Don't add the lower half that would conflict with currentNet
} else {
if (!networks.contains(newNets[0]))
@@ -273,8 +285,8 @@ public class NetworkSpace {
} else {
if (BuildConfig.DEBUG) {
Assert.assertTrue(currentNet.networkMask < nextNet.networkMask);
- Assert.assertTrue (nextNet.getFirstAddress().compareTo(currentNet.getFirstAddress()) == 1);
- Assert.assertTrue (currentNet.getLastAddress().compareTo(nextNet.getLastAddress()) != -1);
+ Assert.assertTrue(nextNet.getFirstAddress().compareTo(currentNet.getFirstAddress()) == 1);
+ Assert.assertTrue(currentNet.getLastAddress().compareTo(nextNet.getLastAddress()) != -1);
}
// This network is bigger than the next and last ip of current >= next
@@ -289,8 +301,8 @@ public class NetworkSpace {
if (newNets[1].networkMask == nextNet.networkMask) {
if (BuildConfig.DEBUG) {
- Assert.assertTrue (newNets[1].getFirstAddress().equals(nextNet.getFirstAddress()));
- Assert.assertTrue (newNets[1].getLastAddress().equals(currentNet.getLastAddress()));
+ Assert.assertTrue(newNets[1].getFirstAddress().equals(nextNet.getFirstAddress()));
+ Assert.assertTrue(newNets[1].getLastAddress().equals(currentNet.getLastAddress()));
// split second equal the next network, do not add it
}
networks.add(nextNet);
@@ -322,20 +334,20 @@ public class NetworkSpace {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
// Include postive routes from the original set under < 4.4 since these might overrule the local
// network but only if no smaller negative route exists
- for(ipAddress origIp: mIpAddresses){
+ for (ipAddress origIp : mIpAddresses) {
if (!origIp.included)
continue;
// The netspace exists
- if(ipsSorted.contains(origIp))
+ if (ipsSorted.contains(origIp))
continue;
- boolean skipIp=false;
+ boolean skipIp = false;
// If there is any smaller net that is excluded we may not add the positive route back
- for (ipAddress calculatedIp: ipsSorted) {
- if(!calculatedIp.included && origIp.containsNet(calculatedIp)) {
- skipIp=true;
+ for (ipAddress calculatedIp : ipsSorted) {
+ if (!calculatedIp.included && origIp.containsNet(calculatedIp)) {
+ skipIp = true;
break;
}
}
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 2911fb1e..ef17e98b 100644
--- a/app/src/main/java/de/blinkt/openvpn/core/OpenVPNManagement.java
+++ b/app/src/main/java/de/blinkt/openvpn/core/OpenVPNManagement.java
@@ -13,7 +13,7 @@ public interface OpenVPNManagement {
enum pauseReason {
noNetwork,
userPause,
- screenOff
+ screenOff,
}
int mBytecountInterval = 2;
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 2917bce1..5faa1de4 100644
--- a/app/src/main/java/de/blinkt/openvpn/core/OpenVPNService.java
+++ b/app/src/main/java/de/blinkt/openvpn/core/OpenVPNService.java
@@ -16,17 +16,21 @@ import android.content.Intent;
import android.content.IntentFilter;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
+import android.content.pm.ShortcutManager;
import android.content.res.Configuration;
+import android.content.res.Resources;
import android.net.ConnectivityManager;
import android.net.VpnService;
-import android.os.Binder;
import android.os.Build;
+import android.os.Bundle;
import android.os.Handler;
import android.os.Handler.Callback;
import android.os.IBinder;
import android.os.Message;
import android.os.ParcelFileDescriptor;
-import android.preference.PreferenceManager;
+import android.os.RemoteException;
+import android.support.annotation.NonNull;
+import android.support.annotation.RequiresApi;
import android.system.OsConstants;
import android.text.TextUtils;
import android.util.Log;
@@ -39,38 +43,38 @@ import java.net.Inet6Address;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.Collection;
-import java.util.HashMap;
import java.util.Locale;
import java.util.Vector;
import se.leap.bitmaskclient.BuildConfig;
+import de.blinkt.openvpn.LaunchVPN;
import se.leap.bitmaskclient.R;
import de.blinkt.openvpn.VpnProfile;
import de.blinkt.openvpn.activities.DisconnectVPN;
import de.blinkt.openvpn.core.VpnStatus.ByteCountListener;
-import de.blinkt.openvpn.core.VpnStatus.ConnectionStatus;
import de.blinkt.openvpn.core.VpnStatus.StateListener;
+import static de.blinkt.openvpn.core.ConnectionStatus.LEVEL_CONNECTED;
+import static de.blinkt.openvpn.core.ConnectionStatus.LEVEL_WAITING_FOR_USER_INPUT;
import static de.blinkt.openvpn.core.NetworkSpace.ipAddress;
-import static de.blinkt.openvpn.core.VpnStatus.ConnectionStatus.LEVEL_CONNECTED;
-import static de.blinkt.openvpn.core.VpnStatus.ConnectionStatus.LEVEL_CONNECTING_NO_SERVER_REPLY_YET;
-import static de.blinkt.openvpn.core.VpnStatus.ConnectionStatus.LEVEL_WAITING_FOR_USER_INPUT;
import se.leap.bitmaskclient.Dashboard;
-public class OpenVPNService extends VpnService implements StateListener, Callback, ByteCountListener {
+public class OpenVPNService extends VpnService implements StateListener, Callback, ByteCountListener, IOpenVPNServiceInternal {
public static final String START_SERVICE = "de.blinkt.openvpn.START_SERVICE";
public static final String START_SERVICE_STICKY = "de.blinkt.openvpn.START_SERVICE_STICKY";
public static final String ALWAYS_SHOW_NOTIFICATION = "de.blinkt.openvpn.NOTIFICATION_ALWAYS_VISIBLE";
public static final String DISCONNECT_VPN = "de.blinkt.openvpn.DISCONNECT_VPN";
private static final String PAUSE_VPN = "de.blinkt.openvpn.PAUSE_VPN";
private static final String RESUME_VPN = "se.leap.bitmaskclient.RESUME_VPN";
- private static final int OPENVPN_STATUS = 1;
+ public static final String NOTIFICATION_CHANNEL_BG_ID = "openvpn_bg";
+ public static final String NOTIFICATION_CHANNEL_NEWSTATUS_ID = "openvpn_newstat";
+ private String lastChannel;
+
private static boolean mNotificationAlwaysVisible = false;
private final Vector<String> mDnslist = new Vector<>();
private final NetworkSpace mRoutes = new NetworkSpace();
private final NetworkSpace mRoutesv6 = new NetworkSpace();
- private final IBinder mBinder = new LocalBinder();
private Thread mProcessThread = null;
private VpnProfile mProfile;
private String mDomain = null;
@@ -90,20 +94,65 @@ public class OpenVPNService extends VpnService implements StateListener, Callbac
private Toast mlastToast;
private Runnable mOpenVPNThread;
+ private static final int PRIORITY_MIN = -2;
+ private static final int PRIORITY_DEFAULT = 0;
+ private static final int PRIORITY_MAX = 2;
+
+
+ private final IBinder mBinder = new IOpenVPNServiceInternal.Stub() {
+
+ @Override
+ public boolean protect(int fd) throws RemoteException {
+ return OpenVPNService.this.protect(fd);
+ }
+
+ @Override
+ public void userPause(boolean shouldbePaused) throws RemoteException {
+ OpenVPNService.this.userPause(shouldbePaused);
+ }
+
+ @Override
+ public boolean stopVPN(boolean replaceConnection) throws RemoteException {
+ return OpenVPNService.this.stopVPN(replaceConnection);
+ }
+ };
+
// From: http://stackoverflow.com/questions/3758606/how-to-convert-byte-size-into-human-readable-format-in-java
- public static String humanReadableByteCount(long bytes, boolean mbit) {
- if (mbit)
+ public static String humanReadableByteCount(long bytes, boolean speed, Resources res) {
+ if (speed)
bytes = bytes * 8;
- int unit = mbit ? 1000 : 1024;
- if (bytes < unit)
- return bytes + (mbit ? " bit" : " B");
-
- int exp = (int) (Math.log(bytes) / Math.log(unit));
- String pre = (mbit ? "kMGTPE" : "KMGTPE").charAt(exp - 1) + (mbit ? "" : "");
- if (mbit)
- return String.format(Locale.getDefault(), "%.1f %sbit", bytes / Math.pow(unit, exp), pre);
+ int unit = speed ? 1000 : 1024;
+
+
+ int exp = Math.max(0, Math.min((int) (Math.log(bytes) / Math.log(unit)), 3));
+
+ float bytesUnit = (float) (bytes / Math.pow(unit, exp));
+
+ if (speed)
+ switch (exp) {
+ case 0:
+ return res.getString(R.string.bits_per_second, bytesUnit);
+ case 1:
+ return res.getString(R.string.kbits_per_second, bytesUnit);
+ case 2:
+ return res.getString(R.string.mbits_per_second, bytesUnit);
+ default:
+ return res.getString(R.string.gbits_per_second, bytesUnit);
+ }
else
- return String.format(Locale.getDefault(), "%.1f %sB", bytes / Math.pow(unit, exp), pre);
+ switch (exp) {
+ case 0:
+ return res.getString(R.string.volume_byte, bytesUnit);
+ case 1:
+ return res.getString(R.string.volume_kbyte, bytesUnit);
+ case 2:
+ return res.getString(R.string.volume_mbyte, bytesUnit);
+ default:
+ return res.getString(R.string.volume_gbyte, bytesUnit);
+
+ }
+
+
}
@Override
@@ -117,7 +166,7 @@ public class OpenVPNService extends VpnService implements StateListener, Callbac
@Override
public void onRevoke() {
- VpnStatus.logInfo(R.string.permission_revoked);
+ VpnStatus.logError(R.string.permission_revoked);
mManagement.stopVPN(false);
endVpnService();
}
@@ -145,26 +194,33 @@ public class OpenVPNService extends VpnService implements StateListener, Callbac
}
}
- private void showNotification(final String msg, String tickerText, boolean lowpriority, long when, ConnectionStatus status) {
- String ns = Context.NOTIFICATION_SERVICE;
- NotificationManager mNotificationManager = (NotificationManager) getSystemService(ns);
-
+ private void showNotification(final String msg, String tickerText, @NonNull String channel, long when, ConnectionStatus status) {
+ NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
int icon = getIconByConnectionStatus(status);
android.app.Notification.Builder nbuilder = new Notification.Builder(this);
+ int priority;
+ if (channel.equals(NOTIFICATION_CHANNEL_BG_ID))
+ priority = PRIORITY_MIN;
+ else
+ priority = PRIORITY_DEFAULT;
+
if (mProfile != null)
- nbuilder.setContentTitle(getString(R.string.notifcation_title, mProfile.mName));
+ nbuilder.setContentTitle(getString(R.string.notifcation_title_bitmask, mProfile.mName));
else
nbuilder.setContentTitle(getString(R.string.notifcation_title_notconnect));
nbuilder.setContentText(msg);
nbuilder.setOnlyAlertOnce(true);
nbuilder.setOngoing(true);
- nbuilder.setContentIntent(getLogPendingIntent());
- nbuilder.setSmallIcon(icon);
+ nbuilder.setSmallIcon(icon);
+ if (status == LEVEL_WAITING_FOR_USER_INPUT)
+ nbuilder.setContentIntent(getUserInputIntent(msg));
+ else
+ nbuilder.setContentIntent(getGraphPendingIntent());
if (when != 0)
nbuilder.setWhen(when);
@@ -172,23 +228,39 @@ public class OpenVPNService extends VpnService implements StateListener, Callbac
// Try to set the priority available since API 16 (Jellybean)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN)
- jbNotificationExtras(lowpriority, nbuilder);
+
+ jbNotificationExtras(priority, nbuilder);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
lpNotificationExtras(nbuilder);
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
+ //noinspection NewApi
+ nbuilder.setChannelId(channel);
+ if (mProfile != null)
+ //noinspection NewApi
+ nbuilder.setShortcutId(mProfile.getUUIDString());
+
+ }
+
if (tickerText != null && !tickerText.equals(""))
nbuilder.setTicker(tickerText);
@SuppressWarnings("deprecation")
Notification notification = nbuilder.getNotification();
+ int notificationId = channel.hashCode();
- mNotificationManager.notify(OPENVPN_STATUS, notification);
- // startForeground(OPENVPN_STATUS, notification);
+ mNotificationManager.notify(notificationId, notification);
+ startForeground(notificationId, notification);
+
+ if (lastChannel != null && !channel.equals(lastChannel)) {
+ // Cancel old notification
+ mNotificationManager.cancel(lastChannel.hashCode());
+ }
// Check if running on a TV
- if (runningOnAndroidTV() && !lowpriority)
+ if (runningOnAndroidTV() && !(priority < 0))
guiHandler.post(new Runnable() {
@Override
@@ -238,13 +310,12 @@ public class OpenVPNService extends VpnService implements StateListener, Callbac
}
@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
- private void jbNotificationExtras(boolean lowpriority,
+ private void jbNotificationExtras(int priority,
android.app.Notification.Builder nbuilder) {
try {
- if (lowpriority) {
+ if (priority != 0) {
Method setpriority = nbuilder.getClass().getMethod("setPriority", int.class);
- // PRIORITY_MIN == -2
- setpriority.invoke(nbuilder, -2);
+ setpriority.invoke(nbuilder, priority);
Method setUsesChronometer = nbuilder.getClass().getMethod("setUsesChronometer", boolean.class);
setUsesChronometer.invoke(nbuilder, true);
@@ -281,9 +352,20 @@ public class OpenVPNService extends VpnService implements StateListener, Callbac
}
- PendingIntent getLogPendingIntent() {
+ PendingIntent getUserInputIntent(String needed) {
+ Intent intent = new Intent(getApplicationContext(), LaunchVPN.class);
+ intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
+ intent.putExtra("need", needed);
+ Bundle b = new Bundle();
+ b.putString("need", needed);
+ PendingIntent pIntent = PendingIntent.getActivity(this, 12, intent, 0);
+ return pIntent;
+ }
+
+ PendingIntent getGraphPendingIntent() {
// Let the configure Button show the Log
Intent intent = new Intent(getBaseContext(), Dashboard.class);
+ intent.putExtra("PAGE", "graph");
intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
PendingIntent startLW = PendingIntent.getActivity(this, 0, intent, 0);
intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
@@ -298,6 +380,10 @@ public class OpenVPNService extends VpnService implements StateListener, Callbac
filter.addAction(Intent.ACTION_SCREEN_OFF);
filter.addAction(Intent.ACTION_SCREEN_ON);
mDeviceStateReceiver = new DeviceStateReceiver(magnagement);
+
+ // Fetch initial network state
+ mDeviceStateReceiver.networkStateChange(this);
+
registerReceiver(mDeviceStateReceiver, filter);
VpnStatus.addByteCountListener(mDeviceStateReceiver);
@@ -329,6 +415,14 @@ public class OpenVPNService extends VpnService implements StateListener, Callbac
}
@Override
+ public boolean stopVPN(boolean replaceConnection) throws RemoteException {
+ if (getManagement() != null)
+ return getManagement().stopVPN(replaceConnection);
+ else
+ return false;
+ }
+
+ @Override
public int onStartCommand(Intent intent, int flags, int startId) {
if (intent != null && intent.getBooleanExtra(ALWAYS_SHOW_NOTIFICATION, false))
@@ -359,26 +453,32 @@ public class OpenVPNService extends VpnService implements StateListener, Callbac
return START_REDELIVER_INTENT;
}
- /* The intent is null when the service has been restarted */
- if (intent == null) {
- mProfile = ProfileManager.getLastConnectedProfile(this, false);
+ if (intent != null && intent.hasExtra(getPackageName() + ".profileUUID")) {
+ String profileUUID = intent.getStringExtra(getPackageName() + ".profileUUID");
+ int profileVersion = intent.getIntExtra(getPackageName() + ".profileVersion", 0);
+ // Try for 10s to get current version of the profile
+ mProfile = ProfileManager.get(this, profileUUID, profileVersion, 100);
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N_MR1) {
+ updateShortCutUsage(mProfile);
+ }
+
+ } else {
+ /* The intent is null when we are set as always-on or the service has been restarted. */
+ mProfile = ProfileManager.getLastConnectedProfile(this);
VpnStatus.logInfo(R.string.service_restarted);
/* Got no profile, just stop */
if (mProfile == null) {
- Log.d("OpenVPN", "Got no last connected profile on null intent. Stopping");
- stopSelf(startId);
- return START_NOT_STICKY;
+ Log.d("OpenVPN", "Got no last connected profile on null intent. Assuming always on.");
+ mProfile = ProfileManager.getAlwaysOnVPN(this);
+
+ if (mProfile == null) {
+ stopSelf(startId);
+ return START_NOT_STICKY;
+ }
}
/* Do the asynchronous keychain certificate stuff */
mProfile.checkForRestart(this);
-
- /* Recreate the intent */
- intent = mProfile.getStartServiceIntent(this);
-
- } else {
- String profileUUID = intent.getStringExtra(getPackageName() + ".profileUUID");
- mProfile = ProfileManager.get(this, profileUUID);
}
/* start the OpenVPN process itself in a background thread */
@@ -391,17 +491,22 @@ public class OpenVPNService extends VpnService implements StateListener, Callbac
ProfileManager.setConnectedVpnProfile(this, mProfile);
- /* TODO: At the moment we have no way to handle asynchronous PW input
- * Fixing will also allow to handle challenge/response authentication */
- if (mProfile.needUserPWInput(true) != 0)
- return START_NOT_STICKY;
+ VpnStatus.setConnectedVPNProfile(mProfile.getUUIDString());
return START_STICKY;
}
+ @RequiresApi(Build.VERSION_CODES.N_MR1)
+ private void updateShortCutUsage(VpnProfile profile) {
+ if (profile == null)
+ return;
+ ShortcutManager shortcutManager = getSystemService(ShortcutManager.class);
+ shortcutManager.reportShortcutUsed(profile.getUUIDString());
+ }
+
private void startOpenVPN() {
VpnStatus.logInfo(R.string.building_configration);
- VpnStatus.updateStateString("VPN_GENERATE_CONFIG", "", R.string.building_configration, VpnStatus.ConnectionStatus.LEVEL_START);
+ VpnStatus.updateStateString("VPN_GENERATE_CONFIG", "", R.string.building_configration, ConnectionStatus.LEVEL_START);
try {
@@ -411,12 +516,9 @@ public class OpenVPNService extends VpnService implements StateListener, Callbac
endVpnService();
return;
}
-
- // Extract information from the intent.
- String prefix = getPackageName();
String nativeLibraryDirectory = getApplicationInfo().nativeLibraryDir;
- // Also writes OpenVPN binary
+ // Write OpenVPN binary
String[] argv = VPNLaunchHelper.buildOpenvpnArgv(this);
@@ -429,7 +531,7 @@ public class OpenVPNService extends VpnService implements StateListener, Callbac
mStarting = false;
// Start a new session by creating a new thread.
- SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
+ SharedPreferences prefs = Preferences.getDefaultSharedPreferences(this);
mOvpn3 = prefs.getBoolean("ovpn3", false);
if (!"ovpn3".equals(BuildConfig.FLAVOR))
@@ -462,8 +564,7 @@ public class OpenVPNService extends VpnService implements StateListener, Callbac
} else {
- HashMap<String, String> env = new HashMap<>();
- processThread = new OpenVPNThread(this, argv, env, nativeLibraryDirectory);
+ processThread = new OpenVPNThread(this, argv, nativeLibraryDirectory);
mOpenVPNThread = processThread;
}
@@ -475,21 +576,21 @@ public class OpenVPNService extends VpnService implements StateListener, Callbac
}
new Handler(getMainLooper()).post(new Runnable() {
- @Override
- public void run() {
- if (mDeviceStateReceiver != null)
- unregisterDeviceStateReceiver();
+ @Override
+ public void run() {
+ if (mDeviceStateReceiver != null)
+ unregisterDeviceStateReceiver();
- registerDeviceStateReceiver(mManagement);
- }
- }
+ registerDeviceStateReceiver(mManagement);
+ }
+ }
- );
+ );
}
private void stopOldOpenVPNProcess() {
if (mManagement != null) {
- if (mOpenVPNThread!=null)
+ if (mOpenVPNThread != null)
((OpenVPNThread) mOpenVPNThread).setReplaceConnection();
if (mManagement.stopVPN(true)) {
// an old was asked to exit, wait 1s
@@ -501,6 +602,10 @@ public class OpenVPNService extends VpnService implements StateListener, Callbac
}
}
+ forceStopOpenVpnProcess();
+ }
+
+ public void forceStopOpenVpnProcess() {
synchronized (mProcessLock) {
if (mProcessThread != null) {
mProcessThread.interrupt();
@@ -525,6 +630,16 @@ public class OpenVPNService extends VpnService implements StateListener, Callbac
}
@Override
+ public IBinder asBinder() {
+ return mBinder;
+ }
+
+ @Override
+ public void onCreate() {
+ super.onCreate();
+ }
+
+ @Override
public void onDestroy() {
synchronized (mProcessLock) {
if (mProcessThread != null) {
@@ -538,7 +653,6 @@ public class OpenVPNService extends VpnService implements StateListener, Callbac
// Just in case unregister for state
VpnStatus.removeStateListener(this);
VpnStatus.flushLog();
-
}
private String getTunConfigString() {
@@ -636,7 +750,9 @@ public class OpenVPNService extends VpnService implements StateListener, Callbac
positiveIPv4Routes.add(dnsServer);
}
} catch (Exception e) {
- VpnStatus.logError("Error parsing DNS Server IP: " + mDnslist.get(0));
+ // If it looks like IPv6 ignore error
+ if (!mDnslist.get(0).contains(":"))
+ VpnStatus.logError("Error parsing DNS Server IP: " + mDnslist.get(0));
}
}
@@ -698,7 +814,7 @@ public class OpenVPNService extends VpnService implements StateListener, Callbac
mLocalIPv6 = null;
mDomain = null;
- builder.setConfigureIntent(getLogPendingIntent());
+ builder.setConfigureIntent(getGraphPendingIntent());
try {
//Debug.stopMethodTracing();
@@ -812,7 +928,7 @@ public class OpenVPNService extends VpnService implements StateListener, Callbac
NetworkSpace.ipAddress gatewayIP = new NetworkSpace.ipAddress(new CIDRIP(gateway, 32), false);
if (mLocalIP == null) {
- VpnStatus.logError("Local IP address unset but adding route?! This is broken! Please contact author with log");
+ VpnStatus.logError("Local IP address unset and received. Neither pushed server config nor local config specifies an IP addresses. Opening tun device is most likely going to fail.");
return;
}
NetworkSpace.ipAddress localNet = new NetworkSpace.ipAddress(mLocalIP, true);
@@ -924,7 +1040,7 @@ public class OpenVPNService extends VpnService implements StateListener, Callbac
if (mProcessThread == null && !mNotificationAlwaysVisible)
return;
- boolean lowpriority = false;
+ String channel = NOTIFICATION_CHANNEL_NEWSTATUS_ID;
// Display byte count only after being connected
{
@@ -936,11 +1052,7 @@ public class OpenVPNService extends VpnService implements StateListener, Callbac
mDisplayBytecount = true;
mConnecttime = System.currentTimeMillis();
if (!runningOnAndroidTV())
- lowpriority = true;
-
- String ns = Context.NOTIFICATION_SERVICE;
- NotificationManager mNotificationManager = (NotificationManager) getSystemService(ns);
- mNotificationManager.cancel(OPENVPN_STATUS);
+ channel = NOTIFICATION_CHANNEL_BG_ID;
} else {
mDisplayBytecount = false;
}
@@ -949,13 +1061,16 @@ public class OpenVPNService extends VpnService implements StateListener, Callbac
// This also mean we are no longer connected, ignore bytecount messages until next
// CONNECTED
// Does not work :(
- String msg = getString(resid);
- // showNotification(VpnStatus.getLastCleanLogMessage(this),
- // msg, lowpriority, 0, level);
+ showNotification(VpnStatus.getLastCleanLogMessage(this),
+ VpnStatus.getLastCleanLogMessage(this), channel, 0, level);
}
}
+ @Override
+ public void setConnectedVPN(String uuid) {
+ }
+
private void doSendBroadcast(String state, ConnectionStatus level) {
Intent vpnstatus = new Intent();
vpnstatus.setAction("de.blinkt.openvpn.VPN_STATUS");
@@ -968,13 +1083,13 @@ public class OpenVPNService extends VpnService implements StateListener, Callbac
public void updateByteCount(long in, long out, long diffIn, long diffOut) {
if (mDisplayBytecount) {
String netstat = String.format(getString(R.string.statusline_bytecount),
- humanReadableByteCount(in, false),
- humanReadableByteCount(diffIn / OpenVPNManagement.mBytecountInterval, true),
- humanReadableByteCount(out, false),
- humanReadableByteCount(diffOut / OpenVPNManagement.mBytecountInterval, true));
+ humanReadableByteCount(in, false, getResources()),
+ humanReadableByteCount(diffIn / OpenVPNManagement.mBytecountInterval, true, getResources()),
+ humanReadableByteCount(out, false, getResources()),
+ humanReadableByteCount(diffOut / OpenVPNManagement.mBytecountInterval, true, getResources()));
- boolean lowpriority = !mNotificationAlwaysVisible;
- //showNotification(netstat, null, lowpriority, mConnecttime, LEVEL_CONNECTED);
+
+ showNotification(netstat, null, NOTIFICATION_CHANNEL_BG_ID, mConnecttime, LEVEL_CONNECTED);
}
}
@@ -1009,10 +1124,8 @@ public class OpenVPNService extends VpnService implements StateListener, Callbac
}
}
- public class LocalBinder extends Binder {
- public OpenVPNService getService() {
- // Return this instance of LocalService so clients can call public methods
- return OpenVPNService.this;
- }
+ public void requestInputFromUser(int resid, String needed) {
+ VpnStatus.updateStateString("NEED", "need " + needed, resid, LEVEL_WAITING_FOR_USER_INPUT);
+ showNotification(getString(resid), getString(resid), NOTIFICATION_CHANNEL_NEWSTATUS_ID, 0, LEVEL_WAITING_FOR_USER_INPUT);
}
}
diff --git a/app/src/main/java/de/blinkt/openvpn/core/OpenVPNStatusService.java b/app/src/main/java/de/blinkt/openvpn/core/OpenVPNStatusService.java
new file mode 100644
index 00000000..6df1379a
--- /dev/null
+++ b/app/src/main/java/de/blinkt/openvpn/core/OpenVPNStatusService.java
@@ -0,0 +1,232 @@
+/*
+ * 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.app.Service;
+import android.content.Intent;
+import android.os.Build;
+import android.os.Handler;
+import android.os.IBinder;
+import android.os.Message;
+import android.os.ParcelFileDescriptor;
+import android.os.RemoteCallbackList;
+import android.os.RemoteException;
+import android.support.annotation.Nullable;
+import android.util.Pair;
+
+import java.io.DataOutputStream;
+import java.io.IOException;
+import java.lang.ref.WeakReference;
+
+/**
+ * Created by arne on 08.11.16.
+ */
+
+public class OpenVPNStatusService extends Service implements VpnStatus.LogListener, VpnStatus.ByteCountListener, VpnStatus.StateListener {
+ @Nullable
+ @Override
+ public IBinder onBind(Intent intent) {
+ return mBinder;
+ }
+
+
+ static final RemoteCallbackList<IStatusCallbacks> mCallbacks =
+ new RemoteCallbackList<>();
+
+ @Override
+ public void onCreate() {
+ super.onCreate();
+ VpnStatus.addLogListener(this);
+ VpnStatus.addByteCountListener(this);
+ VpnStatus.addStateListener(this);
+ mHandler.setService(this);
+
+ }
+
+ @Override
+ public void onDestroy() {
+ super.onDestroy();
+
+ VpnStatus.removeLogListener(this);
+ VpnStatus.removeByteCountListener(this);
+ VpnStatus.removeStateListener(this);
+ mCallbacks.kill();
+
+ }
+
+ private static final IServiceStatus.Stub mBinder = new IServiceStatus.Stub() {
+
+ @Override
+ public ParcelFileDescriptor registerStatusCallback(IStatusCallbacks cb) throws RemoteException {
+ final LogItem[] logbuffer = VpnStatus.getlogbuffer();
+ if (mLastUpdateMessage != null)
+ sendUpdate(cb, mLastUpdateMessage);
+
+ mCallbacks.register(cb);
+ try {
+ final ParcelFileDescriptor[] pipe = ParcelFileDescriptor.createPipe();
+ new Thread("pushLogs") {
+ @Override
+ public void run() {
+ DataOutputStream fd = new DataOutputStream(new ParcelFileDescriptor.AutoCloseOutputStream(pipe[1]));
+ try {
+ synchronized (VpnStatus.readFileLock) {
+ if (!VpnStatus.readFileLog) {
+ VpnStatus.readFileLock.wait();
+ }
+ }
+ } catch (InterruptedException e) {
+ VpnStatus.logException(e);
+ }
+ try {
+
+ for (LogItem logItem : logbuffer) {
+ byte[] bytes = logItem.getMarschaledBytes();
+ fd.writeShort(bytes.length);
+ fd.write(bytes);
+ }
+ // Mark end
+ fd.writeShort(0x7fff);
+ fd.close();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+
+ }
+ }.start();
+ return pipe[0];
+ } catch (IOException e) {
+ e.printStackTrace();
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1) {
+ throw new RemoteException(e.getMessage());
+ }
+ return null;
+ }
+ }
+
+ @Override
+ public void unregisterStatusCallback(IStatusCallbacks cb) throws RemoteException {
+ mCallbacks.unregister(cb);
+ }
+
+ @Override
+ public String getLastConnectedVPN() throws RemoteException {
+ return VpnStatus.getLastConnectedVPNProfile();
+ }
+
+ @Override
+ public void setCachedPassword(String uuid, int type, String password) {
+ PasswordCache.setCachedPassword(uuid, type, password);
+ }
+
+ @Override
+ public TrafficHistory getTrafficHistory() throws RemoteException {
+ return VpnStatus.trafficHistory;
+ }
+
+ };
+
+ @Override
+ public void newLog(LogItem logItem) {
+ Message msg = mHandler.obtainMessage(SEND_NEW_LOGITEM, logItem);
+ msg.sendToTarget();
+ }
+
+ @Override
+ public void updateByteCount(long in, long out, long diffIn, long diffOut) {
+ Message msg = mHandler.obtainMessage(SEND_NEW_BYTECOUNT, Pair.create(in, out));
+ msg.sendToTarget();
+ }
+
+ static UpdateMessage mLastUpdateMessage;
+
+ static class UpdateMessage {
+ public String state;
+ public String logmessage;
+ public ConnectionStatus level;
+ int resId;
+
+ UpdateMessage(String state, String logmessage, int resId, ConnectionStatus level) {
+ this.state = state;
+ this.resId = resId;
+ this.logmessage = logmessage;
+ this.level = level;
+ }
+ }
+
+
+ @Override
+ public void updateState(String state, String logmessage, int localizedResId, ConnectionStatus level) {
+
+ mLastUpdateMessage = new UpdateMessage(state, logmessage, localizedResId, level);
+ Message msg = mHandler.obtainMessage(SEND_NEW_STATE, mLastUpdateMessage);
+ msg.sendToTarget();
+ }
+
+ @Override
+ public void setConnectedVPN(String uuid) {
+ Message msg = mHandler.obtainMessage(SEND_NEW_CONNECTED_VPN, uuid);
+ msg.sendToTarget();
+ }
+
+ private static final OpenVPNStatusHandler mHandler = new OpenVPNStatusHandler();
+
+ private static final int SEND_NEW_LOGITEM = 100;
+ private static final int SEND_NEW_STATE = 101;
+ private static final int SEND_NEW_BYTECOUNT = 102;
+ private static final int SEND_NEW_CONNECTED_VPN = 103;
+
+ private static class OpenVPNStatusHandler extends Handler {
+ WeakReference<OpenVPNStatusService> service = null;
+
+ private void setService(OpenVPNStatusService statusService) {
+ service = new WeakReference<>(statusService);
+ }
+
+ @Override
+ public void handleMessage(Message msg) {
+
+ RemoteCallbackList<IStatusCallbacks> callbacks;
+ if (service == null || service.get() == null)
+ return;
+ callbacks = service.get().mCallbacks;
+ // Broadcast to all clients the new value.
+ final int N = callbacks.beginBroadcast();
+ for (int i = 0; i < N; i++) {
+
+ try {
+ IStatusCallbacks broadcastItem = callbacks.getBroadcastItem(i);
+
+ switch (msg.what) {
+ case SEND_NEW_LOGITEM:
+ broadcastItem.newLogItem((LogItem) msg.obj);
+ break;
+ case SEND_NEW_BYTECOUNT:
+ Pair<Long, Long> inout = (Pair<Long, Long>) msg.obj;
+ broadcastItem.updateByteCount(inout.first, inout.second);
+ break;
+ case SEND_NEW_STATE:
+ sendUpdate(broadcastItem, (UpdateMessage) msg.obj);
+ break;
+
+ case SEND_NEW_CONNECTED_VPN:
+ broadcastItem.connectedVPN((String) msg.obj);
+ break;
+ }
+ } catch (RemoteException e) {
+ // The RemoteCallbackList will take care of removing
+ // the dead object for us.
+ }
+ }
+ callbacks.finishBroadcast();
+ }
+ }
+
+ private static void sendUpdate(IStatusCallbacks broadcastItem,
+ UpdateMessage um) throws RemoteException {
+ broadcastItem.updateStateString(um.state, um.logmessage, um.resId, um.level);
+ }
+} \ No newline at end of file
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 e0c39546..c96f88c4 100644
--- a/app/src/main/java/de/blinkt/openvpn/core/OpenVPNThread.java
+++ b/app/src/main/java/de/blinkt/openvpn/core/OpenVPNThread.java
@@ -19,15 +19,10 @@ import java.util.Collections;
import java.util.Date;
import java.util.LinkedList;
import java.util.Locale;
-import java.util.Map;
-import java.util.Map.Entry;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import se.leap.bitmaskclient.R;
-import de.blinkt.openvpn.VpnProfile;
-import de.blinkt.openvpn.core.VpnStatus.ConnectionStatus;
-import de.blinkt.openvpn.core.VpnStatus.LogItem;
public class OpenVPNThread implements Runnable {
private static final String DUMP_PATH_STRING = "Dump path: ";
@@ -44,15 +39,13 @@ public class OpenVPNThread implements Runnable {
private String mNativeDir;
private OpenVPNService mService;
private String mDumpPath;
- private Map<String, String> mProcessEnv;
private boolean mBrokenPie = false;
private boolean mNoProcessExitStatus = false;
- public OpenVPNThread(OpenVPNService service, String[] argv, Map<String, String> processEnv, String nativelibdir) {
+ public OpenVPNThread(OpenVPNService service, String[] argv, String nativelibdir) {
mArgv = argv;
mNativeDir = nativelibdir;
mService = service;
- mProcessEnv = processEnv;
}
public void stopProcess() {
@@ -68,7 +61,7 @@ public class OpenVPNThread implements Runnable {
public void run() {
try {
Log.i(TAG, "Starting openvpn");
- startOpenVPNThreadArgs(mArgv, mProcessEnv);
+ startOpenVPNThreadArgs(mArgv);
Log.i(TAG, "OpenVPN process exited");
} catch (Exception e) {
VpnStatus.logException("Starting OpenVPN Thread", e);
@@ -94,7 +87,6 @@ public class OpenVPNThread implements Runnable {
mArgv = noPieArgv;
VpnStatus.logInfo("PIE Version could not be executed. Trying no PIE version");
run();
- return;
}
}
@@ -124,7 +116,7 @@ public class OpenVPNThread implements Runnable {
}
}
- private void startOpenVPNThreadArgs(String[] argv, Map<String, String> env) {
+ private void startOpenVPNThreadArgs(String[] argv) {
LinkedList<String> argvlist = new LinkedList<String>();
Collections.addAll(argvlist, argv);
@@ -136,10 +128,6 @@ public class OpenVPNThread implements Runnable {
pb.environment().put("LD_LIBRARY_PATH", lbpath);
- // Add extra variables
- for (Entry<String, String> e : env.entrySet()) {
- pb.environment().put(e.getKey(), e.getValue());
- }
pb.redirectErrorStream(true);
try {
mProcess = pb.start();
@@ -164,6 +152,7 @@ public class OpenVPNThread implements Runnable {
Pattern p = Pattern.compile("(\\d+).(\\d+) ([0-9a-f])+ (.*)");
Matcher m = p.matcher(logline);
+ int logerror = 0;
if (m.matches()) {
int flags = Integer.parseInt(m.group(3), 16);
String msg = m.group(4);
@@ -183,15 +172,22 @@ public class OpenVPNThread implements Runnable {
if (msg.startsWith("MANAGEMENT: CMD"))
logLevel = Math.max(4, logLevel);
+ if ((msg.endsWith("md too weak") && msg.startsWith("OpenSSL: error")) || msg.contains("error:140AB18E"))
+ logerror = 1;
VpnStatus.logMessageOpenVPN(logStatus, logLevel, msg);
+ if (logerror==1)
+ VpnStatus.logError("OpenSSL reproted a certificate with a weak hash, please the in app FAQ about weak hashes");
+
} else {
VpnStatus.logInfo("P:" + logline);
}
- }
-
- } catch (IOException e) {
+ if (Thread.interrupted()) {
+ throw new InterruptedException("OpenVpn process was killed form java code");
+ }
+ }
+ } catch (InterruptedException | IOException e) {
VpnStatus.logException("Error reading from output of OpenVPN process", e);
stopProcess();
}
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 569a3846..492e8913 100644
--- a/app/src/main/java/de/blinkt/openvpn/core/OpenVpnManagementThread.java
+++ b/app/src/main/java/de/blinkt/openvpn/core/OpenVpnManagementThread.java
@@ -9,8 +9,10 @@ import android.content.Context;
import android.net.LocalServerSocket;
import android.net.LocalSocket;
import android.net.LocalSocketAddress;
+import android.os.Handler;
import android.os.ParcelFileDescriptor;
import android.support.annotation.NonNull;
+import android.text.TextUtils;
import android.util.Log;
import junit.framework.Assert;
@@ -31,11 +33,11 @@ import java.util.Vector;
import se.leap.bitmaskclient.BuildConfig;
import se.leap.bitmaskclient.R;
import de.blinkt.openvpn.VpnProfile;
-import de.blinkt.openvpn.core.VpnStatus.ConnectionStatus;
public class OpenVpnManagementThread implements Runnable, OpenVPNManagement {
private static final String TAG = "openvpn";
+ private final Handler mResumeHandler;
private LocalSocket mSocket;
private VpnProfile mProfile;
private OpenVPNService mOpenVPNService;
@@ -54,8 +56,19 @@ public class OpenVpnManagementThread implements Runnable, OpenVPNManagement {
public OpenVpnManagementThread(VpnProfile profile, OpenVPNService openVpnService) {
mProfile = profile;
mOpenVPNService = openVpnService;
+ mResumeHandler = new Handler(openVpnService.getMainLooper());
+
}
+ private Runnable mResumeHoldRunnable = new Runnable() {
+ @Override
+ public void run() {
+ if (shouldBeRunning()) {
+ releaseHoldCmd();
+ }
+ }
+ };
+
public boolean openManagementInterface(@NonNull Context c) {
// Could take a while to open connection
int tries = 8;
@@ -92,15 +105,21 @@ public class OpenVpnManagementThread implements Runnable, OpenVPNManagement {
}
- public void managmentCommand(String cmd) {
+ /**
+ * @param cmd command to write to management socket
+ * @return true if command have been sent
+ */
+ public boolean managmentCommand(String cmd) {
try {
if (mSocket != null && mSocket.getOutputStream() != null) {
mSocket.getOutputStream().write(cmd.getBytes());
mSocket.getOutputStream().flush();
+ return true;
}
} catch (IOException e) {
// Ignore socket stack traces
}
+ return false;
}
@@ -118,13 +137,20 @@ public class OpenVpnManagementThread implements Runnable, OpenVPNManagement {
// Wait for a client to connect
mSocket = mServerSocket.accept();
InputStream instream = mSocket.getInputStream();
+
+
// Close the management socket after client connected
+ try {
+ mServerSocket.close();
+ } catch (IOException e) {
+ VpnStatus.logException(e);
+ }
- mServerSocket.close();
// Closing one of the two sockets also closes the other
//mServerSocketLocal.close();
while (true) {
+
int numbytesread = instream.read(buffer);
if (numbytesread == -1)
return;
@@ -215,7 +241,7 @@ public class OpenVpnManagementThread implements Runnable, OpenVPNManagement {
processPWCommand(argument);
break;
case "HOLD":
- handleHold();
+ handleHold(argument);
break;
case "NEED-OK":
processNeedCommand(argument);
@@ -305,19 +331,26 @@ public class OpenVpnManagementThread implements Runnable, OpenVPNManagement {
return mPauseCallback.shouldBeRunning();
}
- private void handleHold() {
+ private void handleHold(String argument) {
+ mWaitingForRelease = true;
+ int waittime = Integer.parseInt(argument.split(":")[1]);
if (shouldBeRunning()) {
- releaseHoldCmd();
- } else {
- mWaitingForRelease = true;
+ if (waittime > 1)
+ VpnStatus.updateStateString("CONNECTRETRY", String.valueOf(waittime),
+ R.string.state_waitconnectretry, ConnectionStatus.LEVEL_CONNECTING_NO_SERVER_REPLY_YET);
+ mResumeHandler.postDelayed(mResumeHoldRunnable, waittime * 1000);
+ if (waittime > 5)
+ VpnStatus.logInfo(R.string.state_waitconnectretry, String.valueOf(waittime));
+ else
+ VpnStatus.logDebug(R.string.state_waitconnectretry, String.valueOf(waittime));
+ } else {
VpnStatus.updateStatePause(lastPauseReason);
-
-
}
}
private void releaseHoldCmd() {
+ mResumeHandler.removeCallbacks(mResumeHoldRunnable);
if ((System.currentTimeMillis() - mLastHoldRelease) < 5000) {
try {
Thread.sleep(3000);
@@ -402,6 +435,7 @@ public class OpenVpnManagementThread implements Runnable, OpenVPNManagement {
protectFileDescriptor(fdtoprotect);
break;
case "DNSSERVER":
+ case "DNS6SERVER":
mOpenVPNService.addDNS(extra);
break;
case "DNSDOMAIN":
@@ -529,15 +563,17 @@ public class OpenVpnManagementThread implements Runnable, OpenVPNManagement {
if (needed.equals("Private Key")) {
pw = mProfile.getPasswordPrivateKey();
} else if (needed.equals("Auth")) {
+ pw = mProfile.getPasswordAuth();
+
String usercmd = String.format("username '%s' %s\n",
needed, VpnProfile.openVpnEscape(mProfile.mUsername));
managmentCommand(usercmd);
- pw = mProfile.getPasswordAuth();
}
if (pw != null) {
String cmd = String.format("password '%s' %s\n", needed, VpnProfile.openVpnEscape(pw));
managmentCommand(cmd);
} else {
+ mOpenVPNService.requestInputFromUser(R.string.password, needed);
VpnStatus.logError(String.format("Openvpn requires Authentication type '%s' but no password/key information available", needed));
}
@@ -553,8 +589,7 @@ public class OpenVpnManagementThread implements Runnable, OpenVPNManagement {
synchronized (active) {
boolean sendCMD = false;
for (OpenVpnManagementThread mt : active) {
- mt.managmentCommand("signal SIGINT\n");
- sendCMD = true;
+ sendCMD = mt.managmentCommand("signal SIGINT\n");
try {
if (mt.mSocket != null)
mt.mSocket.close();
@@ -571,7 +606,7 @@ public class OpenVpnManagementThread implements Runnable, OpenVPNManagement {
if (mWaitingForRelease)
releaseHold();
else if (samenetwork)
- managmentCommand("network-change samenetwork\n");
+ managmentCommand("network-change\n");
else
managmentCommand("network-change\n");
}
@@ -582,6 +617,7 @@ public class OpenVpnManagementThread implements Runnable, OpenVPNManagement {
}
public void signalusr1() {
+ mResumeHandler.removeCallbacks(mResumeHoldRunnable);
if (!mWaitingForRelease)
managmentCommand("signal SIGUSR1\n");
else
@@ -624,8 +660,12 @@ public class OpenVpnManagementThread implements Runnable, OpenVPNManagement {
@Override
public boolean stopVPN(boolean replaceConnection) {
- mShuttingDown = true;
- return stopOpenVPN();
+ boolean stopSucceed = stopOpenVPN();
+ if (stopSucceed) {
+ mShuttingDown = true;
+
+ }
+ return stopSucceed;
}
}
diff --git a/app/src/main/java/de/blinkt/openvpn/core/PasswordCache.java b/app/src/main/java/de/blinkt/openvpn/core/PasswordCache.java
new file mode 100644
index 00000000..179a8a7b
--- /dev/null
+++ b/app/src/main/java/de/blinkt/openvpn/core/PasswordCache.java
@@ -0,0 +1,61 @@
+/*
+ * 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 java.util.UUID;
+
+/**
+ * Created by arne on 15.12.16.
+ */
+
+public class PasswordCache {
+ public static final int PCKS12ORCERTPASSWORD = 2;
+ public static final int AUTHPASSWORD = 3;
+ private static PasswordCache mInstance;
+ final private UUID mUuid;
+ private String mKeyOrPkcs12Password;
+ private String mAuthPassword;
+
+ private PasswordCache(UUID uuid) {
+ mUuid = uuid;
+ }
+
+ public static PasswordCache getInstance(UUID uuid) {
+ if (mInstance == null || !mInstance.mUuid.equals(uuid)) {
+ mInstance = new PasswordCache(uuid);
+ }
+ return mInstance;
+ }
+
+ public static String getPKCS12orCertificatePassword(UUID uuid, boolean resetPw) {
+ String pwcopy = getInstance(uuid).mKeyOrPkcs12Password;
+ if (resetPw)
+ getInstance(uuid).mKeyOrPkcs12Password = null;
+ return pwcopy;
+ }
+
+
+ public static String getAuthPassword(UUID uuid, boolean resetPW) {
+ String pwcopy = getInstance(uuid).mAuthPassword;
+ if (resetPW)
+ getInstance(uuid).mAuthPassword = null;
+ return pwcopy;
+ }
+
+ public static void setCachedPassword(String uuid, int type, String password) {
+ PasswordCache instance = getInstance(UUID.fromString(uuid));
+ switch (type) {
+ case PCKS12ORCERTPASSWORD:
+ instance.mKeyOrPkcs12Password = password;
+ break;
+ case AUTHPASSWORD:
+ instance.mAuthPassword = password;
+ break;
+ }
+ }
+
+
+}
diff --git a/app/src/main/java/de/blinkt/openvpn/core/Preferences.java b/app/src/main/java/de/blinkt/openvpn/core/Preferences.java
new file mode 100644
index 00000000..76a064ff
--- /dev/null
+++ b/app/src/main/java/de/blinkt/openvpn/core/Preferences.java
@@ -0,0 +1,31 @@
+/*
+ * 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;
+
+/**
+ * Created by arne on 08.01.17.
+ */
+
+// Until I find a good solution
+
+public class Preferences {
+
+ static SharedPreferences getSharedPreferencesMulti(String name, Context c) {
+ return c.getSharedPreferences(name, Context.MODE_MULTI_PROCESS | Context.MODE_PRIVATE);
+
+ }
+
+
+ public static SharedPreferences getDefaultSharedPreferences(Context c) {
+ return c.getSharedPreferences(c.getPackageName() + "_preferences", Context.MODE_MULTI_PROCESS | Context.MODE_PRIVATE);
+
+ }
+
+
+}
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 4f9c219b..f776fc2e 100644
--- a/app/src/main/java/de/blinkt/openvpn/core/ProfileManager.java
+++ b/app/src/main/java/de/blinkt/openvpn/core/ProfileManager.java
@@ -9,7 +9,6 @@ import android.app.Activity;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
-import android.preference.PreferenceManager;
import java.io.IOException;
import java.io.ObjectInputStream;
@@ -17,7 +16,9 @@ import java.io.ObjectOutputStream;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
+import java.util.Locale;
import java.util.Set;
+import java.util.UUID;
import de.blinkt.openvpn.VpnProfile;
@@ -25,6 +26,7 @@ public class ProfileManager {
private static final String PREFS_NAME = "VPNList";
private static final String LAST_CONNECTED_PROFILE = "lastConnectedProfile";
+ private static final String TEMPORARY_PROFILE_FILENAME = "temporary-vpn-profile";
private static ProfileManager instance;
private static VpnProfile mLastConnectedVpn = null;
@@ -59,30 +61,31 @@ public class ProfileManager {
}
public static void setConntectedVpnProfileDisconnected(Context c) {
- SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(c);
+ SharedPreferences prefs = Preferences.getDefaultSharedPreferences(c);
Editor prefsedit = prefs.edit();
prefsedit.putString(LAST_CONNECTED_PROFILE, null);
prefsedit.apply();
}
- public static void setConnectedVpnProfile(Context c, VpnProfile connectedrofile) {
- SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(c);
+ /**
+ * Sets the profile that is connected (to connect if the service restarts)
+ */
+ public static void setConnectedVpnProfile(Context c, VpnProfile connectedProfile) {
+ SharedPreferences prefs = Preferences.getDefaultSharedPreferences(c);
Editor prefsedit = prefs.edit();
- prefsedit.putString(LAST_CONNECTED_PROFILE, connectedrofile.getUUIDString());
+ prefsedit.putString(LAST_CONNECTED_PROFILE, connectedProfile.getUUIDString());
prefsedit.apply();
- mLastConnectedVpn = connectedrofile;
+ mLastConnectedVpn = connectedProfile;
}
- public static VpnProfile getLastConnectedProfile(Context c, boolean onBoot) {
- SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(c);
-
- boolean useStartOnBoot = prefs.getBoolean("restartvpnonboot", false);
-
- if (onBoot && !useStartOnBoot)
- return null;
+ /**
+ * Returns the profile that was last connected (to connect if the service restarts)
+ */
+ public static VpnProfile getLastConnectedProfile(Context c) {
+ SharedPreferences prefs = Preferences.getDefaultSharedPreferences(c);
String lastConnectedProfile = prefs.getString(LAST_CONNECTED_PROFILE, null);
if (lastConnectedProfile != null)
@@ -106,7 +109,7 @@ public class ProfileManager {
}
public void saveProfileList(Context context) {
- SharedPreferences sharedprefs = context.getSharedPreferences(PREFS_NAME, Activity.MODE_PRIVATE);
+ SharedPreferences sharedprefs = Preferences.getSharedPreferencesMulti(PREFS_NAME, context);
Editor editor = sharedprefs.edit();
editor.putStringSet("vpnlist", profiles.keySet());
@@ -124,24 +127,35 @@ public class ProfileManager {
}
- public static void setTemporaryProfile(VpnProfile tmp) {
+ public static void setTemporaryProfile(Context c, VpnProfile tmp) {
ProfileManager.tmpprofile = tmp;
+ saveProfile(c, tmp, true, true);
}
- public static boolean isTempProfile()
- {
- return mLastConnectedVpn == tmpprofile;
+ public static boolean isTempProfile() {
+ return mLastConnectedVpn != null && mLastConnectedVpn == tmpprofile;
}
-
public void saveProfile(Context context, VpnProfile profile) {
- ObjectOutputStream vpnfile;
+ saveProfile(context, profile, true, false);
+ }
+
+ private static void saveProfile(Context context, VpnProfile profile, boolean updateVersion, boolean isTemporary) {
+
+ if (updateVersion)
+ profile.mVersion += 1;
+ ObjectOutputStream vpnFile;
+
+ String filename = profile.getUUID().toString() + ".vp";
+ if (isTemporary)
+ filename = TEMPORARY_PROFILE_FILENAME + ".vp";
+
try {
- vpnfile = new ObjectOutputStream(context.openFileOutput((profile.getUUID().toString() + ".vp"), Activity.MODE_PRIVATE));
+ vpnFile = new ObjectOutputStream(context.openFileOutput(filename, Activity.MODE_PRIVATE));
- vpnfile.writeObject(profile);
- vpnfile.flush();
- vpnfile.close();
+ vpnFile.writeObject(profile);
+ vpnFile.flush();
+ vpnFile.close();
} catch (IOException e) {
VpnStatus.logException("saving VPN profile", e);
throw new RuntimeException(e);
@@ -151,11 +165,13 @@ public class ProfileManager {
private void loadVPNList(Context context) {
profiles = new HashMap<>();
- SharedPreferences listpref = context.getSharedPreferences(PREFS_NAME, Activity.MODE_PRIVATE);
+ SharedPreferences listpref = Preferences.getSharedPreferencesMulti(PREFS_NAME, context);
Set<String> vlist = listpref.getStringSet("vpnlist", null);
if (vlist == null) {
vlist = new HashSet<>();
}
+ // Always try to load the temporary profile
+ vlist.add(TEMPORARY_PROFILE_FILENAME);
for (String vpnentry : vlist) {
try {
@@ -167,10 +183,15 @@ public class ProfileManager {
continue;
vp.upgradeProfile();
- profiles.put(vp.getUUID().toString(), vp);
+ if (vpnentry.equals(TEMPORARY_PROFILE_FILENAME)) {
+ tmpprofile = vp;
+ } else {
+ profiles.put(vp.getUUID().toString(), vp);
+ }
} catch (IOException | ClassNotFoundException e) {
- VpnStatus.logException("Loading VPN List", e);
+ if (!vpnentry.equals(TEMPORARY_PROFILE_FILENAME))
+ VpnStatus.logException("Loading VPN List", e);
}
}
}
@@ -187,12 +208,49 @@ public class ProfileManager {
}
public static VpnProfile get(Context context, String profileUUID) {
+ return get(context, profileUUID, 0, 10);
+ }
+
+ public static VpnProfile get(Context context, String profileUUID, int version, int tries) {
checkInstance(context);
- return get(profileUUID);
+ VpnProfile profile = get(profileUUID);
+ int tried = 0;
+ while ((profile == null || profile.mVersion < version) && (tried++ < tries)) {
+ try {
+ Thread.sleep(100);
+ } catch (InterruptedException ignored) {
+ }
+ instance.loadVPNList(context);
+ profile = get(profileUUID);
+ int ver = profile == null ? -1 : profile.mVersion;
+ }
+
+ if (tried > 5)
+
+ {
+ int ver = profile == null ? -1 : profile.mVersion;
+ VpnStatus.logError(String.format(Locale.US, "Used x %d tries to get current version (%d/%d) of the profile", tried, ver, version));
+ }
+ return profile;
}
public static VpnProfile getLastConnectedVpn() {
return mLastConnectedVpn;
}
+ public static VpnProfile getAlwaysOnVPN(Context context) {
+ checkInstance(context);
+ SharedPreferences prefs = Preferences.getDefaultSharedPreferences(context);
+
+ String uuid = prefs.getString("alwaysOnVpn", null);
+ return get(uuid);
+
+ }
+
+ public static void updateLRU(Context c, VpnProfile profile) {
+ profile.mLastUsed = System.currentTimeMillis();
+ // LRU does not change the profile, no need for the service to refresh
+ if (profile!=tmpprofile)
+ saveProfile(c, profile, false, false);
+ }
}
diff --git a/app/src/main/java/de/blinkt/openvpn/core/StatusListener.java b/app/src/main/java/de/blinkt/openvpn/core/StatusListener.java
new file mode 100644
index 00000000..5d0b7037
--- /dev/null
+++ b/app/src/main/java/de/blinkt/openvpn/core/StatusListener.java
@@ -0,0 +1,109 @@
+/*
+ * 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.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.ServiceConnection;
+import android.os.IBinder;
+import android.os.ParcelFileDescriptor;
+import android.os.RemoteException;
+
+import java.io.DataInputStream;
+import java.io.File;
+import java.io.IOException;
+
+/**
+ * Created by arne on 09.11.16.
+ */
+
+public class StatusListener {
+ private File mCacheDir;
+ private ServiceConnection mConnection = new ServiceConnection() {
+
+
+ @Override
+ public void onServiceConnected(ComponentName className,
+ IBinder service) {
+ // We've bound to LocalService, cast the IBinder and get LocalService instance
+ IServiceStatus serviceStatus = IServiceStatus.Stub.asInterface(service);
+ try {
+ /* Check if this a local service ... */
+ if (service.queryLocalInterface("de.blinkt.openvpn.core.IServiceStatus") == null) {
+ // Not a local service
+ VpnStatus.setConnectedVPNProfile(serviceStatus.getLastConnectedVPN());
+ VpnStatus.setTrafficHistory(serviceStatus.getTrafficHistory());
+ ParcelFileDescriptor pfd = serviceStatus.registerStatusCallback(mCallback);
+ DataInputStream fd = new DataInputStream(new ParcelFileDescriptor.AutoCloseInputStream(pfd));
+
+ short len = fd.readShort();
+ byte[] buf = new byte[65336];
+ while (len != 0x7fff) {
+ fd.readFully(buf, 0, len);
+ LogItem logitem = new LogItem(buf, len);
+ VpnStatus.newLogItem(logitem, false);
+ len = fd.readShort();
+ }
+ fd.close();
+
+
+
+ } else {
+ VpnStatus.initLogCache(mCacheDir);
+ }
+
+ } catch (RemoteException | IOException e) {
+ e.printStackTrace();
+ VpnStatus.logException(e);
+ }
+ }
+
+ @Override
+ public void onServiceDisconnected(ComponentName arg0) {
+
+ }
+
+ };
+
+ void init(Context c) {
+
+ Intent intent = new Intent(c, OpenVPNStatusService.class);
+ intent.setAction(OpenVPNService.START_SERVICE);
+ mCacheDir = c.getCacheDir();
+
+ c.bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
+
+
+ }
+
+
+ private IStatusCallbacks mCallback = new IStatusCallbacks.Stub()
+
+ {
+ @Override
+ public void newLogItem(LogItem item) throws RemoteException {
+ VpnStatus.newLogItem(item);
+ }
+
+ @Override
+ public void updateStateString(String state, String msg, int resid, ConnectionStatus
+ level) throws RemoteException {
+ VpnStatus.updateStateString(state, msg, resid, level);
+ }
+
+ @Override
+ public void updateByteCount(long inBytes, long outBytes) throws RemoteException {
+ VpnStatus.updateByteCount(inBytes, outBytes);
+ }
+
+ @Override
+ public void connectedVPN(String uuid) throws RemoteException {
+ VpnStatus.setConnectedVPNProfile(uuid);
+ }
+ };
+
+}
diff --git a/app/src/main/java/de/blinkt/openvpn/core/TrafficHistory.java b/app/src/main/java/de/blinkt/openvpn/core/TrafficHistory.java
new file mode 100644
index 00000000..6ba35066
--- /dev/null
+++ b/app/src/main/java/de/blinkt/openvpn/core/TrafficHistory.java
@@ -0,0 +1,243 @@
+/*
+ * Copyright (c) 2012-2017 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.Parcel;
+import android.os.Parcelable;
+
+import java.util.HashSet;
+import java.util.LinkedList;
+import java.util.Vector;
+
+import static java.lang.Math.max;
+
+/**
+ * Created by arne on 23.05.17.
+ */
+
+public class TrafficHistory implements Parcelable {
+
+ public static final long PERIODS_TO_KEEP = 5;
+ public static final int TIME_PERIOD_MINTUES = 60 * 1000;
+ public static final int TIME_PERIOD_HOURS = 3600 * 1000;
+ private LinkedList<TrafficDatapoint> trafficHistorySeconds = new LinkedList<>();
+ private LinkedList<TrafficDatapoint> trafficHistoryMinutes = new LinkedList<>();
+ private LinkedList<TrafficDatapoint> trafficHistoryHours = new LinkedList<>();
+
+ private TrafficDatapoint lastSecondUsedForMinute;
+ private TrafficDatapoint lastMinuteUsedForHours;
+
+ public TrafficHistory() {
+
+ }
+
+ protected TrafficHistory(Parcel in) {
+ in.readList(trafficHistorySeconds, getClass().getClassLoader());
+ in.readList(trafficHistoryMinutes, getClass().getClassLoader());
+ in.readList(trafficHistoryHours, getClass().getClassLoader());
+ lastSecondUsedForMinute = in.readParcelable(getClass().getClassLoader());
+ lastMinuteUsedForHours = in.readParcelable(getClass().getClassLoader());
+ }
+
+ public static final Creator<TrafficHistory> CREATOR = new Creator<TrafficHistory>() {
+ @Override
+ public TrafficHistory createFromParcel(Parcel in) {
+ return new TrafficHistory(in);
+ }
+
+ @Override
+ public TrafficHistory[] newArray(int size) {
+ return new TrafficHistory[size];
+ }
+ };
+
+ public LastDiff getLastDiff(TrafficDatapoint tdp) {
+
+ TrafficDatapoint lasttdp;
+
+
+ if (trafficHistorySeconds.size() == 0)
+ lasttdp = new TrafficDatapoint(0, 0, System.currentTimeMillis());
+
+ else
+ lasttdp = trafficHistorySeconds.getLast();
+
+ if (tdp == null) {
+ tdp = lasttdp;
+ if (trafficHistorySeconds.size() < 2)
+ lasttdp = tdp;
+ else {
+ trafficHistorySeconds.descendingIterator().next();
+ tdp = trafficHistorySeconds.descendingIterator().next();
+ }
+ }
+
+ return new LastDiff(lasttdp, tdp);
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(Parcel dest, int flags) {
+ dest.writeList(trafficHistorySeconds);
+ dest.writeList(trafficHistoryMinutes);
+ dest.writeList(trafficHistoryHours);
+ dest.writeParcelable(lastSecondUsedForMinute, 0);
+ dest.writeParcelable(lastMinuteUsedForHours, 0);
+
+ }
+
+ public LinkedList<TrafficDatapoint> getHours() {
+ return trafficHistoryHours;
+ }
+
+ public LinkedList<TrafficDatapoint> getMinutes() {
+ return trafficHistoryMinutes;
+ }
+
+ public LinkedList<TrafficDatapoint> getSeconds() {
+ return trafficHistorySeconds;
+ }
+
+ public static LinkedList<TrafficDatapoint> getDummyList() {
+ LinkedList<TrafficDatapoint> list = new LinkedList<>();
+ list.add(new TrafficDatapoint(0, 0, System.currentTimeMillis()));
+ return list;
+ }
+
+
+ public static class TrafficDatapoint implements Parcelable {
+ private TrafficDatapoint(long inBytes, long outBytes, long timestamp) {
+ this.in = inBytes;
+ this.out = outBytes;
+ this.timestamp = timestamp;
+ }
+
+ public final long timestamp;
+ public final long in;
+ public final long out;
+
+ private TrafficDatapoint(Parcel in) {
+ timestamp = in.readLong();
+ this.in = in.readLong();
+ out = in.readLong();
+ }
+
+ public static final Creator<TrafficDatapoint> CREATOR = new Creator<TrafficDatapoint>() {
+ @Override
+ public TrafficDatapoint createFromParcel(Parcel in) {
+ return new TrafficDatapoint(in);
+ }
+
+ @Override
+ public TrafficDatapoint[] newArray(int size) {
+ return new TrafficDatapoint[size];
+ }
+ };
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(Parcel dest, int flags) {
+ dest.writeLong(timestamp);
+ dest.writeLong(in);
+ dest.writeLong(out);
+ }
+ }
+
+ LastDiff add(long in, long out) {
+ TrafficDatapoint tdp = new TrafficDatapoint(in, out, System.currentTimeMillis());
+
+ LastDiff diff = getLastDiff(tdp);
+ addDataPoint(tdp);
+ return diff;
+ }
+
+ private void addDataPoint(TrafficDatapoint tdp) {
+ trafficHistorySeconds.add(tdp);
+
+ if (lastSecondUsedForMinute == null) {
+ lastSecondUsedForMinute = new TrafficDatapoint(0, 0, 0);
+ lastMinuteUsedForHours = new TrafficDatapoint(0, 0, 0);
+ }
+
+ removeAndAverage(tdp, true);
+ }
+
+ private void removeAndAverage(TrafficDatapoint newTdp, boolean seconds) {
+ HashSet<TrafficDatapoint> toRemove = new HashSet<>();
+ Vector<TrafficDatapoint> toAverage = new Vector<>();
+
+ long timePeriod;
+ LinkedList<TrafficDatapoint> tpList, nextList;
+ TrafficDatapoint lastTsPeriod;
+
+ if (seconds) {
+ timePeriod = TIME_PERIOD_MINTUES;
+ tpList = trafficHistorySeconds;
+ nextList = trafficHistoryMinutes;
+ lastTsPeriod = lastSecondUsedForMinute;
+ } else {
+ timePeriod = TIME_PERIOD_HOURS;
+ tpList = trafficHistoryMinutes;
+ nextList = trafficHistoryHours;
+ lastTsPeriod = lastMinuteUsedForHours;
+ }
+
+ if (newTdp.timestamp / timePeriod > (lastTsPeriod.timestamp / timePeriod)) {
+ nextList.add(newTdp);
+
+ if (seconds) {
+ lastSecondUsedForMinute = newTdp;
+ removeAndAverage(newTdp, false);
+ } else
+ lastMinuteUsedForHours = newTdp;
+
+ for (TrafficDatapoint tph : tpList) {
+ // List is iteratered from oldest to newest, remembert first one that we did not
+ if ((newTdp.timestamp - tph.timestamp) / timePeriod >= PERIODS_TO_KEEP)
+ toRemove.add(tph);
+ }
+ tpList.removeAll(toRemove);
+ }
+ }
+
+ static class LastDiff {
+
+ final private TrafficDatapoint tdp;
+ final private TrafficDatapoint lasttdp;
+
+ private LastDiff(TrafficDatapoint lasttdp, TrafficDatapoint tdp) {
+ this.lasttdp = lasttdp;
+ this.tdp = tdp;
+ }
+
+ public long getDiffOut() {
+ return max(0, tdp.out - lasttdp.out);
+ }
+
+ public long getDiffIn() {
+ return max(0, tdp.in - lasttdp.in);
+ }
+
+ public long getIn() {
+ return tdp.in;
+ }
+
+ public long getOut() {
+ return tdp.out;
+ }
+
+ }
+
+
+} \ No newline at end of file
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 78f462e7..f3b40381 100644
--- a/app/src/main/java/de/blinkt/openvpn/core/VPNLaunchHelper.java
+++ b/app/src/main/java/de/blinkt/openvpn/core/VPNLaunchHelper.java
@@ -6,6 +6,7 @@
package de.blinkt.openvpn.core;
import android.annotation.TargetApi;
+import android.app.NotificationManager;
import android.content.Context;
import android.content.Intent;
import android.os.Build;
@@ -26,7 +27,6 @@ public class VPNLaunchHelper {
private static final String OVPNCONFIGFILE = "android.conf";
-
private static String writeMiniVPN(Context context) {
String[] abis;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
@@ -38,36 +38,34 @@ public class VPNLaunchHelper {
String nativeAPI = NativeUtils.getNativeAPI();
if (!nativeAPI.equals(abis[0])) {
VpnStatus.logWarning(R.string.abi_mismatch, Arrays.toString(abis), nativeAPI);
- abis = new String[] {nativeAPI};
+ abis = new String[]{nativeAPI};
}
- for (String abi: abis) {
+ for (String abi : abis) {
- File vpnExecutable = new File(context.getCacheDir(), getMiniVPNExecutableName() + "." + abi);
+ File vpnExecutable = new File(context.getCacheDir(), "c_" + getMiniVPNExecutableName() + "." + abi);
if ((vpnExecutable.exists() && vpnExecutable.canExecute()) || writeMiniVPNBinary(context, abi, vpnExecutable)) {
return vpnExecutable.getPath();
}
}
return null;
- }
+ }
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
private static String[] getSupportedABIsLollipop() {
return Build.SUPPORTED_ABIS;
}
- private static String getMiniVPNExecutableName()
- {
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN)
+ private static String getMiniVPNExecutableName() {
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN)
return MINIPIEVPN;
else
return MININONPIEVPN;
}
- public static String[] replacePieWithNoPie(String[] mArgv)
- {
+ public static String[] replacePieWithNoPie(String[] mArgv) {
mArgv[0] = mArgv[0].replace(MINIPIEVPN, MININONPIEVPN);
return mArgv;
}
@@ -79,7 +77,7 @@ public class VPNLaunchHelper {
String binaryName = writeMiniVPN(c);
// Add fixed paramenters
//args.add("/data/data/de.blinkt.openvpn/lib/openvpn");
- if(binaryName==null) {
+ if (binaryName == null) {
VpnStatus.logError("Error writing minivpn binary");
return null;
}
@@ -98,8 +96,7 @@ public class VPNLaunchHelper {
try {
mvpn = context.getAssets().open(getMiniVPNExecutableName() + "." + abi);
- }
- catch (IOException errabi) {
+ } catch (IOException errabi) {
VpnStatus.logInfo("Failed getting assets for archicture " + abi);
return false;
}
@@ -107,16 +104,16 @@ public class VPNLaunchHelper {
FileOutputStream fout = new FileOutputStream(mvpnout);
- byte buf[]= new byte[4096];
+ byte buf[] = new byte[4096];
int lenread = mvpn.read(buf);
- while(lenread> 0) {
+ while (lenread > 0) {
fout.write(buf, 0, lenread);
lenread = mvpn.read(buf);
}
fout.close();
- if(!mvpnout.setExecutable(true)) {
+ if (!mvpnout.setExecutable(true)) {
VpnStatus.logError("Failed to make OpenVPN executable");
return false;
}
@@ -129,14 +126,20 @@ public class VPNLaunchHelper {
}
}
-
- public static void startOpenVpn(VpnProfile startprofile, Context context) {
- Intent startVPN = startprofile.prepareStartService(context);
- if(startVPN!=null)
- context.startService(startVPN);
- }
+ public static void startOpenVpn(VpnProfile startprofile, Context context) {
+ Intent startVPN = startprofile.prepareStartService(context);
+ if (startVPN != null) {
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
+ //noinspection NewApi
+ context.startForegroundService(startVPN);
+ else
+ context.startService(startVPN);
+
+ }
+ }
+
public static String getConfigFilePath(Context context) {
return context.getCacheDir().getAbsolutePath() + "/" + OVPNCONFIGFILE;
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 1e2ccba3..a9cc4f18 100644
--- a/app/src/main/java/de/blinkt/openvpn/core/VpnStatus.java
+++ b/app/src/main/java/de/blinkt/openvpn/core/VpnStatus.java
@@ -5,45 +5,27 @@
package de.blinkt.openvpn.core;
-import android.annotation.SuppressLint;
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;
-import android.util.Log;
-import java.io.ByteArrayInputStream;
-import java.io.DataOutputStream;
import java.io.File;
-import java.io.OutputStream;
import java.io.PrintWriter;
import java.io.StringWriter;
-import java.security.MessageDigest;
-import java.security.NoSuchAlgorithmException;
-import java.security.cert.CertificateException;
-import java.security.cert.CertificateFactory;
-import java.security.cert.X509Certificate;
-import java.util.Arrays;
-import java.util.FormatFlagsConversionMismatchException;
import java.util.LinkedList;
import java.util.Locale;
-import java.util.UnknownFormatConversionException;
+import java.util.Queue;
import java.util.Vector;
+import java.util.concurrent.ConcurrentLinkedQueue;
-import se.leap.bitmaskclient.BuildConfig;
import se.leap.bitmaskclient.R;
+import de.blinkt.openvpn.VpnProfile;
public class VpnStatus {
- public static LinkedList<LogItem> logbuffer;
+ private static final LinkedList<LogItem> logbuffer;
private static Vector<LogListener> logListener;
private static Vector<StateListener> stateListener;
@@ -55,7 +37,14 @@ public class VpnStatus {
private static int mLastStateresid = R.string.state_noprocess;
- private static long mlastByteCount[] = {0, 0, 0, 0};
+ private static HandlerThread mHandlerThread;
+
+ private static String mLastConnectedVPNUUID;
+ static boolean readFileLog =false;
+ final static java.lang.Object readFileLock = new Object();
+
+
+ public static TrafficHistory trafficHistory;
public static void logException(LogLevel ll, String context, Exception e) {
StringWriter sw = new StringWriter();
@@ -79,6 +68,9 @@ public class VpnStatus {
static final int MAXLOGENTRIES = 1000;
+ public static boolean isVPNActive() {
+ return mLastLevel != ConnectionStatus.LEVEL_AUTH_FAILED && !(mLastLevel == ConnectionStatus.LEVEL_NOTCONNECTED);
+ }
public static String getLastCleanLogMessage(Context c) {
String message = mLaststatemsg;
@@ -111,6 +103,10 @@ public class VpnStatus {
if (status.equals("NOPROCESS"))
return message;
+ if (mLastStateresid == R.string.state_waitconnectretry) {
+ return c.getString(R.string.state_waitconnectretry, mLaststatemsg);
+ }
+
String prefix = c.getString(mLastStateresid);
if (mLastStateresid == R.string.unknown_state)
message = status + message;
@@ -122,28 +118,38 @@ public class VpnStatus {
}
public static void initLogCache(File cacheDir) {
+ mHandlerThread = new HandlerThread("LogFileWriter", Thread.MIN_PRIORITY);
+ mHandlerThread.start();
+ mLogFileHandler = new LogFileHandler(mHandlerThread.getLooper());
+
+
Message m = mLogFileHandler.obtainMessage(LogFileHandler.LOG_INIT, cacheDir);
mLogFileHandler.sendMessage(m);
}
public static void flushLog() {
- mLogFileHandler.sendEmptyMessage(LogFileHandler.FLUSH_TO_DISK);
+ if (mLogFileHandler!=null)
+ mLogFileHandler.sendEmptyMessage(LogFileHandler.FLUSH_TO_DISK);
}
- public enum ConnectionStatus {
- LEVEL_CONNECTED,
- LEVEL_VPNPAUSED,
- LEVEL_CONNECTING_SERVER_REPLIED,
- LEVEL_CONNECTING_NO_SERVER_REPLY_YET,
- LEVEL_NONETWORK,
- LEVEL_NOTCONNECTED,
- LEVEL_START,
- LEVEL_AUTH_FAILED,
- LEVEL_WAITING_FOR_USER_INPUT,
- UNKNOWN_LEVEL
+ public static void setConnectedVPNProfile(String uuid) {
+ mLastConnectedVPNUUID = uuid;
+ for (StateListener sl: stateListener)
+ sl.setConnectedVPN(uuid);
}
+
+ public static String getLastConnectedVPNProfile()
+ {
+ return mLastConnectedVPNUUID;
+ }
+
+ public static void setTrafficHistory(TrafficHistory trafficHistory) {
+ VpnStatus.trafficHistory = trafficHistory;
+ }
+
+
public enum LogLevel {
INFO(2),
ERROR(-2),
@@ -163,14 +169,17 @@ public class VpnStatus {
public static LogLevel getEnumByValue(int value) {
switch (value) {
- case 1:
- return INFO;
case 2:
+ return INFO;
+ case -2:
return ERROR;
- case 3:
+ case 1:
return WARNING;
+ case 3:
+ return VERBOSE;
case 4:
return DEBUG;
+
default:
return null;
}
@@ -178,218 +187,36 @@ public class VpnStatus {
}
// keytool -printcert -jarfile de.blinkt.openvpn_85.apk
- public static final byte[] officalkey = {-58, -42, -44, -106, 90, -88, -87, -88, -52, -124, 84, 117, 66, 79, -112, -111, -46, 86, -37, 109};
- public static final byte[] officaldebugkey = {-99, -69, 45, 71, 114, -116, 82, 66, -99, -122, 50, -70, -56, -111, 98, -35, -65, 105, 82, 43};
- public static final byte[] amazonkey = {-116, -115, -118, -89, -116, -112, 120, 55, 79, -8, -119, -23, 106, -114, -85, -56, -4, 105, 26, -57};
- public static final byte[] fdroidkey = {-92, 111, -42, -46, 123, -96, -60, 79, -27, -31, 49, 103, 11, -54, -68, -27, 17, 2, 121, 104};
+ static final byte[] officalkey = {-58, -42, -44, -106, 90, -88, -87, -88, -52, -124, 84, 117, 66, 79, -112, -111, -46, 86, -37, 109};
+ static final byte[] officaldebugkey = {-99, -69, 45, 71, 114, -116, 82, 66, -99, -122, 50, -70, -56, -111, 98, -35, -65, 105, 82, 43};
+ static final byte[] amazonkey = {-116, -115, -118, -89, -116, -112, 120, 55, 79, -8, -119, -23, 106, -114, -85, -56, -4, 105, 26, -57};
+ static final byte[] fdroidkey = {-92, 111, -42, -46, 123, -96, -60, 79, -27, -31, 49, 103, 11, -54, -68, -27, 17, 2, 121, 104};
private static ConnectionStatus mLastLevel = ConnectionStatus.LEVEL_NOTCONNECTED;
- private static final LogFileHandler mLogFileHandler;
+ private static 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());
+ trafficHistory = new TrafficHistory();
logInformation();
}
- public static class LogItem implements Parcelable {
- private Object[] mArgs = null;
- private String mMessage = null;
- private int mRessourceId;
- // Default log priority
- LogLevel mLevel = LogLevel.INFO;
- private long logtime = System.currentTimeMillis();
- private int mVerbosityLevel = -1;
-
- private LogItem(int ressourceId, Object[] args) {
- mRessourceId = ressourceId;
- mArgs = args;
- }
-
- public LogItem(LogLevel level, int verblevel, String message) {
- mMessage = message;
- mLevel = level;
- mVerbosityLevel = verblevel;
- }
-
- @Override
- public int describeContents() {
- return 0;
- }
-
-
- @Override
- public void writeToParcel(Parcel dest, int flags) {
- dest.writeArray(mArgs);
- dest.writeString(mMessage);
- dest.writeInt(mRessourceId);
- dest.writeInt(mLevel.getInt());
- dest.writeInt(mVerbosityLevel);
-
- dest.writeLong(logtime);
- }
-
- public LogItem(Parcel in) {
- mArgs = in.readArray(Object.class.getClassLoader());
- mMessage = in.readString();
- mRessourceId = in.readInt();
- mLevel = LogLevel.getEnumByValue(in.readInt());
- mVerbosityLevel = in.readInt();
- logtime = in.readLong();
- }
-
- public static final Parcelable.Creator<LogItem> CREATOR
- = new Parcelable.Creator<LogItem>() {
- public LogItem createFromParcel(Parcel in) {
- return new LogItem(in);
- }
-
- public LogItem[] newArray(int size) {
- return new LogItem[size];
- }
- };
-
- public LogItem(LogLevel loglevel, int ressourceId, Object... args) {
- mRessourceId = ressourceId;
- mArgs = args;
- mLevel = loglevel;
- }
-
-
- public LogItem(LogLevel loglevel, String msg) {
- mLevel = loglevel;
- mMessage = msg;
- }
-
-
- public LogItem(LogLevel loglevel, int ressourceId) {
- mRessourceId = ressourceId;
- mLevel = loglevel;
- }
-
- public String getString(Context c) {
- try {
- if (mMessage != null) {
- return mMessage;
- } else {
- if (c != null) {
- if (mRessourceId == R.string.mobile_info)
- return getMobileInfoString(c);
- if (mArgs == null)
- return c.getString(mRessourceId);
- else
- return c.getString(mRessourceId, mArgs);
- } else {
- String str = String.format(Locale.ENGLISH, "Log (no context) resid %d", mRessourceId);
- if (mArgs != null)
- str += TextUtils.join("|", mArgs);
-
- return str;
- }
- }
- } catch (UnknownFormatConversionException e) {
- if (c != null)
- throw new UnknownFormatConversionException(e.getLocalizedMessage() + getString(null));
- else
- throw e;
- } catch (java.util.FormatFlagsConversionMismatchException e) {
- if (c != null)
- throw new FormatFlagsConversionMismatchException(e.getLocalizedMessage() + getString(null), e.getConversion());
- else
- throw e;
- }
-
- }
-
- public LogLevel getLogLevel() {
- return mLevel;
- }
-
- // The lint is wrong here
- @SuppressLint("StringFormatMatches")
- private String getMobileInfoString(Context c) {
- c.getPackageManager();
- String apksign = "error getting package signature";
-
- 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()));
- MessageDigest md = MessageDigest.getInstance("SHA-1");
- byte[] der = cert.getEncoded();
- md.update(der);
- byte[] digest = md.digest();
-
- if (Arrays.equals(digest, officalkey))
- apksign = c.getString(R.string.official_build);
- else if (Arrays.equals(digest, officaldebugkey))
- apksign = c.getString(R.string.debug_build);
- else if (Arrays.equals(digest, amazonkey))
- apksign = "amazon version";
- else if (Arrays.equals(digest, fdroidkey))
- apksign = "F-Droid built and signed version";
- else
- apksign = c.getString(R.string.built_by, cert.getSubjectX500Principal().getName());
-
- PackageInfo packageinfo = c.getPackageManager().getPackageInfo(c.getPackageName(), 0);
- version = packageinfo.versionName;
-
- } catch (NameNotFoundException | CertificateException |
- NoSuchAlgorithmException ignored) {
- }
-
- Object[] argsext = Arrays.copyOf(mArgs, mArgs.length);
- argsext[argsext.length - 1] = apksign;
- argsext[argsext.length - 2] = version;
-
- return c.getString(R.string.mobile_info, argsext);
-
- }
-
- public long getLogtime() {
- return logtime;
- }
-
-
- public int getVerbosityLevel() {
- if (mVerbosityLevel == -1) {
- // Hack:
- // For message not from OpenVPN, report the status level as log level
- return mLevel.getInt();
- }
- return mVerbosityLevel;
- }
-
- public boolean verify() {
- if (mLevel == null)
- return false;
-
- if (mMessage == null && mRessourceId == 0)
- return false;
-
- return true;
- }
- }
-
public interface LogListener {
void newLog(LogItem logItem);
}
public interface StateListener {
void updateState(String state, String logmessage, int localizedResId, ConnectionStatus level);
+
+ void setConnectedVPN(String uuid);
}
public interface ByteCountListener {
@@ -404,12 +231,20 @@ public class VpnStatus {
public synchronized static void clearLog() {
logbuffer.clear();
logInformation();
- mLogFileHandler.sendEmptyMessage(LogFileHandler.TRIM_LOG_FILE);
+ if (mLogFileHandler != null)
+ mLogFileHandler.sendEmptyMessage(LogFileHandler.TRIM_LOG_FILE);
}
private static void logInformation() {
+ String nativeAPI;
+ try {
+ nativeAPI = NativeUtils.getNativeAPI();
+ } catch (UnsatisfiedLinkError ignore) {
+ nativeAPI = "error";
+ }
+
logInfo(R.string.mobile_info, Build.MODEL, Build.BOARD, Build.BRAND, Build.VERSION.SDK_INT,
- NativeUtils.getNativeAPI(), Build.VERSION.RELEASE, Build.ID, Build.FINGERPRINT, "", "");
+ nativeAPI, Build.VERSION.RELEASE, Build.ID, Build.FINGERPRINT, "", "");
}
public synchronized static void addLogListener(LogListener ll) {
@@ -421,7 +256,8 @@ public class VpnStatus {
}
public synchronized static void addByteCountListener(ByteCountListener bcl) {
- bcl.updateByteCount(mlastByteCount[0], mlastByteCount[1], mlastByteCount[2], mlastByteCount[3]);
+ TrafficHistory.LastDiff diff = trafficHistory.getLastDiff(null);
+ bcl.updateByteCount(diff.getIn(), diff.getOut(), diff.getDiffIn(),diff.getDiffOut());
byteCountListener.add(bcl);
}
@@ -525,7 +361,7 @@ public class VpnStatus {
}
- public static void updateStateString(String state, String msg) {
+ static void updateStateString(String state, String msg) {
int rid = getLocalizedState(state);
ConnectionStatus level = getLevel(state);
updateStateString(state, msg, rid, level);
@@ -549,7 +385,7 @@ public class VpnStatus {
for (StateListener sl : stateListener) {
sl.updateState(state, msg, resid, level);
}
- //newLogItem(new LogItem((LogLevel.DEBUG), String.format("New OpenVPN Status (%s->%s): %s",state,level.toString(),msg)));
+ newLogItem(new LogItem((LogLevel.DEBUG), String.format("New OpenVPN Status (%s->%s): %s",state,level.toString(),msg)));
}
public static void logInfo(String message) {
@@ -568,7 +404,7 @@ public class VpnStatus {
newLogItem(new LogItem(LogLevel.DEBUG, resourceId, args));
}
- private static void newLogItem(LogItem logItem) {
+ static void newLogItem(LogItem logItem) {
newLogItem(logItem, false);
}
@@ -578,18 +414,21 @@ public class VpnStatus {
logbuffer.addFirst(logItem);
} else {
logbuffer.addLast(logItem);
- Message m = mLogFileHandler.obtainMessage(LogFileHandler.LOG_MESSAGE, logItem);
- mLogFileHandler.sendMessage(m);
+ if (mLogFileHandler != null) {
+ 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));
+ if (mLogFileHandler != null)
+ mLogFileHandler.sendMessage(mLogFileHandler.obtainMessage(LogFileHandler.TRIM_LOG_FILE));
}
- if (BuildConfig.DEBUG && !cachedLine)
- Log.d("OpenVPN", logItem.getString(null));
+ //if (BuildConfig.DEBUG && !cachedLine && !BuildConfig.FLAVOR.equals("test"))
+ // Log.d("OpenVPN", logItem.getString(null));
for (LogListener ll : logListener) {
@@ -627,17 +466,10 @@ public class VpnStatus {
public static synchronized void updateByteCount(long in, long out) {
- long lastIn = mlastByteCount[0];
- long lastOut = mlastByteCount[1];
- long diffIn = mlastByteCount[2] = Math.max(0, in - lastIn);
- long diffOut = mlastByteCount[3] = Math.max(0, out - lastOut);
-
+ TrafficHistory.LastDiff diff = trafficHistory.add(in, out);
- mlastByteCount = new long[]{in, out, diffIn, diffOut};
for (ByteCountListener bcl : byteCountListener) {
- bcl.updateByteCount(in, out, diffIn, diffOut);
+ bcl.updateByteCount(in, out, diff.getDiffIn(), diff.getDiffOut());
}
}
-
-
}
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 4048f0e0..9e2060fd 100644
--- a/app/src/main/java/de/blinkt/openvpn/core/X509Utils.java
+++ b/app/src/main/java/de/blinkt/openvpn/core/X509Utils.java
@@ -5,6 +5,7 @@
package de.blinkt.openvpn.core;
+import android.annotation.SuppressLint;
import android.content.Context;
import android.content.res.Resources;
import android.text.TextUtils;
@@ -106,14 +107,14 @@ public class X509Utils {
// 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);
+ return res.getQuantityString(R.plurals.months_left, (int) months, months);
} else if (timeLeft > 72 * 3600 * 1000) {
long days = timeLeft / (24 * 3600 * 1000);
- return res.getString(R.string.days_left, days);
+ return res.getQuantityString(R.plurals.days_left, (int) days, days);
} else {
long hours = timeLeft / (3600 * 1000);
- return res.getString(R.string.hours_left, hours);
+ return res.getQuantityString(R.plurals.hours_left, (int)hours, hours);
}
}
@@ -131,7 +132,7 @@ public class X509Utils {
/* Hack so we do not have to ship a whole Spongy/bouncycastle */
Exception exp=null;
try {
- Class X509NameClass = Class.forName("com.android.org.bouncycastle.asn1.x509.X509Name");
+ @SuppressLint("PrivateApi") Class X509NameClass = Class.forName("com.android.org.bouncycastle.asn1.x509.X509Name");
Method getInstance = X509NameClass.getMethod("getInstance",Object.class);
Hashtable defaultSymbols = (Hashtable) X509NameClass.getField("DefaultSymbols").get(X509NameClass);
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 bbd52a34..a1fc7cdc 100644
--- a/app/src/main/java/de/blinkt/openvpn/fragments/LogFragment.java
+++ b/app/src/main/java/de/blinkt/openvpn/fragments/LogFragment.java
@@ -16,6 +16,7 @@ import android.content.ClipboardManager;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
+import android.content.res.Resources;
import android.database.DataSetObserver;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
@@ -56,12 +57,13 @@ import de.blinkt.openvpn.LaunchVPN;
import se.leap.bitmaskclient.R;
import de.blinkt.openvpn.VpnProfile;
import de.blinkt.openvpn.activities.DisconnectVPN;
+import de.blinkt.openvpn.core.ConnectionStatus;
import de.blinkt.openvpn.core.OpenVPNManagement;
import de.blinkt.openvpn.core.OpenVPNService;
+import de.blinkt.openvpn.core.Preferences;
import de.blinkt.openvpn.core.ProfileManager;
import de.blinkt.openvpn.core.VpnStatus;
-import de.blinkt.openvpn.core.VpnStatus.ConnectionStatus;
-import de.blinkt.openvpn.core.VpnStatus.LogItem;
+import de.blinkt.openvpn.core.LogItem;
import de.blinkt.openvpn.core.VpnStatus.LogListener;
import de.blinkt.openvpn.core.VpnStatus.StateListener;
@@ -117,8 +119,9 @@ public class LogFragment extends ListFragment implements StateListener, SeekBar.
@Override
public void updateByteCount(long in, long out, long diffIn, long diffOut) {
//%2$s/s %1$s - ↑%4$s/s %3$s
- final String down = String.format("%2$s/s %1$s", humanReadableByteCount(in, false), humanReadableByteCount(diffIn / OpenVPNManagement.mBytecountInterval, true));
- final String up = String.format("%2$s/s %1$s", humanReadableByteCount(out, false), humanReadableByteCount(diffOut / OpenVPNManagement.mBytecountInterval, true));
+ Resources res = getActivity().getResources();
+ final String down = String.format("%2$s %1$s", humanReadableByteCount(in, false, res), humanReadableByteCount(diffIn / OpenVPNManagement.mBytecountInterval, true, res));
+ final String up = String.format("%2$s %1$s", humanReadableByteCount(out, false, res), humanReadableByteCount(diffOut / OpenVPNManagement.mBytecountInterval, true, res));
if (mUpStatus != null && mDownStatus != null) {
if (getActivity() != null) {
@@ -429,33 +432,34 @@ public class LogFragment extends ListFragment implements StateListener, SeekBar.
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.get(getActivity(), VpnStatus.getLastConnectedVPNProfile());
+
+ 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() {
@@ -500,13 +504,16 @@ public class LogFragment extends ListFragment implements StateListener, SeekBar.
@Override
public void onResume() {
super.onResume();
- VpnStatus.addStateListener(this);
- VpnStatus.addByteCountListener(this);
Intent intent = new Intent(getActivity(), OpenVPNService.class);
intent.setAction(OpenVPNService.START_SERVICE);
-
}
+ @Override
+ public void onStart() {
+ super.onStart();
+ VpnStatus.addStateListener(this);
+ VpnStatus.addByteCountListener(this);
+ }
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
@@ -603,7 +610,7 @@ public class LogFragment extends ListFragment implements StateListener, SeekBar.
mClearLogCheckBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
- PreferenceManager.getDefaultSharedPreferences(getActivity()).edit().putBoolean(LaunchVPN.CLEARLOG, isChecked).apply();
+ Preferences.getDefaultSharedPreferences(getActivity()).edit().putBoolean(LaunchVPN.CLEARLOG, isChecked).apply();
}
});
@@ -628,7 +635,14 @@ public class LogFragment extends ListFragment implements StateListener, SeekBar.
}
@Override
- public void onAttach(Activity activity) {
+ public void onViewCreated(View view, Bundle savedInstanceState) {
+ super.onViewCreated(view, savedInstanceState);
+ // Scroll to the end of the list end
+ //getListView().setSelection(getListView().getAdapter().getCount()-1);
+ }
+
+ @Override
+ public void onAttach(Context activity) {
super.onAttach(activity);
if (getResources().getBoolean(R.bool.logSildersAlwaysVisible)) {
mShowOptionsLayout = true;
@@ -660,13 +674,17 @@ public class LogFragment extends ListFragment implements StateListener, SeekBar.
mSpeedView.setText(cleanLogMessage);
}
if (mConnectStatus != null)
- mConnectStatus.setText(getString(resId));
+ mConnectStatus.setText(cleanLogMessage);
}
}
});
}
}
+ @Override
+ public void setConnectedVPN(String uuid) {
+ }
+
@Override
public void onDestroy() {
diff --git a/app/src/main/java/se/leap/bitmaskclient/VpnFragment.java b/app/src/main/java/se/leap/bitmaskclient/VpnFragment.java
index 6ffeacc1..9e9adef1 100644
--- a/app/src/main/java/se/leap/bitmaskclient/VpnFragment.java
+++ b/app/src/main/java/se/leap/bitmaskclient/VpnFragment.java
@@ -19,6 +19,7 @@ package se.leap.bitmaskclient;
import android.app.*;
import android.content.*;
import android.os.*;
+import android.util.Log;
import android.view.*;
import android.widget.*;
@@ -39,7 +40,7 @@ public class VpnFragment extends Fragment implements Observer {
protected static final String IS_CONNECTED = TAG + ".is_connected";
public static final String START_ON_BOOT = "start on boot";
- @InjectView(R.id.vpn_Status_Image)
+ @InjectView(R.id.vpn_status_image)
FabButton vpn_status_image;
@InjectView(R.id.vpn_main_button)
Button main_button;
@@ -91,7 +92,8 @@ public class VpnFragment extends Fragment implements Observer {
@Override
public void onResume() {
super.onResume();
- eipCommand(Constants.ACTION_CHECK_CERT_VALIDITY);
+ //FIXME: avoid race conditions while checking certificate an logging in at about the same time
+ //eipCommand(Constants.ACTION_CHECK_CERT_VALIDITY);
handleNewState(eip_status);
}
diff --git a/app/src/main/java/se/leap/bitmaskclient/eip/EIP.java b/app/src/main/java/se/leap/bitmaskclient/eip/EIP.java
index 9ff7f1af..5b72a4e7 100644
--- a/app/src/main/java/se/leap/bitmaskclient/eip/EIP.java
+++ b/app/src/main/java/se/leap/bitmaskclient/eip/EIP.java
@@ -117,8 +117,8 @@ public final class EIP extends IntentService {
Intent intent = new Intent(this, LaunchVPN.class);
intent.setAction(Intent.ACTION_MAIN);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- intent.putExtra(LaunchVPN.EXTRA_NAME, gateway.getProfile().getName());
intent.putExtra(LaunchVPN.EXTRA_HIDELOG, true);
+ intent.putExtra(LaunchVPN.EXTRA_TEMP_VPN_PROFILE, gateway.getProfile());
startActivity(intent);
}
diff --git a/app/src/main/java/se/leap/bitmaskclient/eip/EipStatus.java b/app/src/main/java/se/leap/bitmaskclient/eip/EipStatus.java
index 4bfef1cb..501543b8 100644
--- a/app/src/main/java/se/leap/bitmaskclient/eip/EipStatus.java
+++ b/app/src/main/java/se/leap/bitmaskclient/eip/EipStatus.java
@@ -26,7 +26,7 @@ public class EipStatus extends Observable implements VpnStatus.StateListener {
public static String TAG = EipStatus.class.getSimpleName();
private static EipStatus current_status;
- private static VpnStatus.ConnectionStatus level = VpnStatus.ConnectionStatus.LEVEL_NOTCONNECTED;
+ private static ConnectionStatus level = ConnectionStatus.LEVEL_NOTCONNECTED;
private static boolean
wants_to_disconnect = false,
is_connecting = false;
@@ -47,7 +47,7 @@ public class EipStatus extends Observable implements VpnStatus.StateListener {
}
@Override
- public void updateState(final String state, final String logmessage, final int localizedResId, final VpnStatus.ConnectionStatus level) {
+ public void updateState(final String state, final String logmessage, final int localizedResId, final ConnectionStatus level) {
updateStatus(state, logmessage, localizedResId, level);
if (isConnected() || isDisconnected() || wantsToDisconnect()) {
setConnectedOrDisconnected();
@@ -55,7 +55,11 @@ public class EipStatus extends Observable implements VpnStatus.StateListener {
setConnecting();
}
- private void updateStatus(final String state, final String logmessage, final int localizedResId, final VpnStatus.ConnectionStatus level) {
+ @Override
+ public void setConnectedVPN(String uuid) {
+ }
+
+ private void updateStatus(final String state, final String logmessage, final int localizedResId, final ConnectionStatus level) {
current_status = getInstance();
current_status.setState(state);
current_status.setLogMessage(logmessage);
@@ -73,15 +77,15 @@ public class EipStatus extends Observable implements VpnStatus.StateListener {
}
public boolean isConnected() {
- return level == VpnStatus.ConnectionStatus.LEVEL_CONNECTED;
+ return level == ConnectionStatus.LEVEL_CONNECTED;
}
public boolean isDisconnected() {
- return level == VpnStatus.ConnectionStatus.LEVEL_NOTCONNECTED;
+ return level == ConnectionStatus.LEVEL_NOTCONNECTED;
}
public boolean isPaused() {
- return level == VpnStatus.ConnectionStatus.LEVEL_VPNPAUSED;
+ return level == ConnectionStatus.LEVEL_VPNPAUSED;
}
public void setConnecting() {
@@ -116,7 +120,7 @@ public class EipStatus extends Observable implements VpnStatus.StateListener {
return localized_res_id;
}
- public VpnStatus.ConnectionStatus getLevel() {
+ public ConnectionStatus getLevel() {
return level;
}
@@ -132,7 +136,7 @@ public class EipStatus extends Observable implements VpnStatus.StateListener {
this.localized_res_id = localized_res_id;
}
- private void setLevel(VpnStatus.ConnectionStatus level) {
+ private void setLevel(ConnectionStatus level) {
EipStatus.level = level;
}
@@ -145,13 +149,13 @@ public class EipStatus extends Observable implements VpnStatus.StateListener {
String[] error_keywords = {"error", "ERROR", "fatal", "FATAL"};
- VpnStatus.LogItem[] log = VpnStatus.getlogbuffer();
+ LogItem[] log = VpnStatus.getlogbuffer();
if(log.length < last_error_line)
last_error_line = 0;
String message = "";
for (int i = 1; i <= lines && log.length > i; i++) {
int line = log.length - i;
- VpnStatus.LogItem log_item = log[line];
+ LogItem log_item = log[line];
message = log_item.getString(context);
for (int j = 0; j < error_keywords.length; j++)
if (message.contains(error_keywords[j]) && line > last_error_line) {
diff --git a/app/src/main/res/layout-xlarge/eip_service_fragment.xml b/app/src/main/res/layout-xlarge/eip_service_fragment.xml
index a9f01fb8..2b3c4f2e 100644
--- a/app/src/main/res/layout-xlarge/eip_service_fragment.xml
+++ b/app/src/main/res/layout-xlarge/eip_service_fragment.xml
@@ -27,7 +27,7 @@
android:layout_centerInParent="true">
<Button
- android:id="@+id/vpn.main.button"
+ android:id="@+id/vpn_main_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="24dp"
@@ -35,12 +35,11 @@
android:textSize="32sp"
/>
- <view
- android:id="@+id/vpn.Status.Image"
+ <mbanje.kurt.fabbutton.FabButton
+ android:id="@+id/vpn_status_image"
android:layout_width="48dp"
android:layout_height="48dp"
android:color="@android:color/holo_blue_dark"
- class="mbanje.kurt.fabbutton.FabButton"
android:layout_gravity="center"
android:visibility="visible"
android:indeterminate="true"
diff --git a/app/src/main/res/layout/eip_service_fragment.xml b/app/src/main/res/layout/eip_service_fragment.xml
index 7df82b19..c8370cf1 100644
--- a/app/src/main/res/layout/eip_service_fragment.xml
+++ b/app/src/main/res/layout/eip_service_fragment.xml
@@ -24,14 +24,14 @@
android:layout_centerInParent="true">
<Button
- android:id="@+id/vpn.main.button"
+ android:id="@+id/vpn_main_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="12sp"
/>
<mbanje.kurt.fabbutton.FabButton
- android:id="@+id/vpn.Status.Image"
+ android:id="@+id/vpn_status_image"
android:layout_width="32dp"
android:layout_height="32dp"
android:layout_marginLeft="3dp"
diff --git a/app/src/main/res/layout/vpnstatus.xml b/app/src/main/res/layout/vpnstatus.xml
index b304ad10..3b464b62 100644
--- a/app/src/main/res/layout/vpnstatus.xml
+++ b/app/src/main/res/layout/vpnstatus.xml
@@ -43,8 +43,9 @@
style="@style/logWindowStatusTitle"/>
<TextView
+
android:id="@+id/speedStatus"
- tools:text="Connected"
+ tools:text="Connected to a very long ipv4 and 3483489348238824829482384928"
style="@style/logWindowStatusText"/>
diff --git a/app/src/main/res/values-ca/plurals-icsopenvpn.xml b/app/src/main/res/values-ca/plurals-icsopenvpn.xml
new file mode 100755
index 00000000..70489fbc
--- /dev/null
+++ b/app/src/main/res/values-ca/plurals-icsopenvpn.xml
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Generated by crowdin.com-->
+<resources></resources>
diff --git a/app/src/main/res/values-ca/strings-icsopenvpn.xml b/app/src/main/res/values-ca/strings-icsopenvpn.xml
index 2233e71e..48eca2d6 100755
--- a/app/src/main/res/values-ca/strings-icsopenvpn.xml
+++ b/app/src/main/res/values-ca/strings-icsopenvpn.xml
@@ -37,7 +37,6 @@
<string name="no_error_found">No s\'ha trobat cap error</string>
<string name="config_error_found">S\'ha trobat un error a la configuració</string>
<string name="vpn_shortcut">Acces directe de OpenVPN</string>
- <string name="vpn_launch_title">Conecta a la VPN</string>
<string name="shortcut_profile_notfound">No s\'ha trobat el perfil especificat a l\'accès directe</string>
<string name="random_host_prefix">Prefix aleatoria del host</string>
<string name="route_rejected">La ruta ha estat refusas per Android</string>
@@ -90,7 +89,6 @@
<string name="private_key_password">Contrasenya de la clau privada</string>
<string name="password">Contrasenya</string>
<string name="file_icon">Icona del fitxer</string>
- <string name="tls_authentication">Autentificació TLS</string>
<string name="generated_config">Configuració generada</string>
<string name="owner_fix">Corregir els permisos de /dev/tun</string>
<string name="generated_config_summary">Mostra el fitxer de configuració d\'OpenVPN generat</string>
@@ -109,7 +107,6 @@
<string name="faq_howto_title">Inici rapid</string>
<string name="using_proxy">Utilitzant el proxy %1$s %2$d</string>
<string name="use_system_proxy">Utiliza el proxy del sistema</string>
- <string name="onbootrestart">Torna a conectar al reiniciar</string>
<string name="ignore">Ignorar</string>
<string name="restart">Reinicia</string>
<string name="restart_vpn_after_change">Els canvis de configuració s\'apliquen desprès de reinicar la VPN. (Re)inicar la VPN ara?</string>
diff --git a/app/src/main/res/values-cs/plurals-icsopenvpn.xml b/app/src/main/res/values-cs/plurals-icsopenvpn.xml
new file mode 100755
index 00000000..70489fbc
--- /dev/null
+++ b/app/src/main/res/values-cs/plurals-icsopenvpn.xml
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Generated by crowdin.com-->
+<resources></resources>
diff --git a/app/src/main/res/values-cs/strings-icsopenvpn.xml b/app/src/main/res/values-cs/strings-icsopenvpn.xml
index f5e4db60..eb039901 100755
--- a/app/src/main/res/values-cs/strings-icsopenvpn.xml
+++ b/app/src/main/res/values-cs/strings-icsopenvpn.xml
@@ -50,7 +50,6 @@
<string name="custom_route_format_error">Chyba při zpracování vlastního směrování</string>
<string name="pw_query_hint">(nechej prázdné pro dotazování, až bude potřeba)</string>
<string name="vpn_shortcut">OpenVPN zkratka</string>
- <string name="vpn_launch_title">Připojit k VPN</string>
<string name="shortcut_profile_notfound">Profil zvolený ve zkratce nenalezen</string>
<string name="random_host_prefix">Náhodný prefix klienta</string>
<string name="random_host_summary">Přidej 6 náhodných znaků před jméno klienta (hostname)</string>
@@ -164,7 +163,6 @@
<string name="private_key_password">Heslo k soukromému klíči</string>
<string name="password">Heslo</string>
<string name="file_icon">ikona souboru</string>
- <string name="tls_authentication">TLS autentikace</string>
<string name="generated_config">Vygenerované nastavení</string>
<string name="generalsettings">Nastavení</string>
<string name="owner_fix_summary">Pokusit se nastavit vlastníka /dev/tun zařízení. Na některých systémech s CM9 je toto potřeba pro zprovoznění VPNService API. Vyžaduje root zařízení.</string>
@@ -202,9 +200,6 @@
<string name="using_proxy">Používám proxy %1$s %2$d</string>
<string name="use_system_proxy">Použít systémovou proxy</string>
<string name="use_system_proxy_summary">K připojení použít systémové nastavení pro HTTP/HTTPS.</string>
- <string name="donatewithpaypal">K přispění můžeš využít &lt;a href=\"https://www.paypal.com/cgi-bin/webscr?hosted_button_id=R2M6ZP9AF25LS&amp;amp;cmd=_s-xclick\"&gt;PayPal&lt;/a&gt; </string>
- <string name="onbootrestartsummary">OpenVPN se opětovně připojí k VPN, pokud byla aktivní před vypnutím/restartem systému. Přečti si oddíl o varování před připojením než použiješ tuto možnost.</string>
- <string name="onbootrestart">Znovu připoj po restartu</string>
<string name="ignore">Ignorovat</string>
<string name="restart">Restartovat</string>
<string name="restart_vpn_after_change">Změna nastavení začne platit až po restartu VPN. Restartovat teď?</string>
@@ -251,7 +246,6 @@
<string name="state_tcp_connect">Připojuji (TCP)</string>
<string name="state_auth_failed">Přihlášení nebylo úspěšné</string>
<string name="state_nonetwork">Čekání na použitelnou síť</string>
- <string name="statusline_bytecount">↓%2$s/s %1$s - ↑%4$s/s %3$s</string>
<string name="notifcation_title_notconnect">Nepřipojeno</string>
<string name="start_vpn_title">Připojování k VPN %s</string>
<string name="start_vpn_ticker">Připojování k VPN %s</string>
diff --git a/app/src/main/res/values-de/plurals-icsopenvpn.xml b/app/src/main/res/values-de/plurals-icsopenvpn.xml
new file mode 100755
index 00000000..1737fa7a
--- /dev/null
+++ b/app/src/main/res/values-de/plurals-icsopenvpn.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Generated by crowdin.com-->
+<resources>
+ <plurals name="months_left">
+ <item quantity="one">Ein Monat verbleibend</item>
+ <item quantity="other">%d Monate verbleibend</item>
+ </plurals>
+ <plurals name="days_left">
+ <item quantity="one">Ein Tag verbleibend</item>
+ <item quantity="other">%d Tage verbleibend</item>
+ </plurals>
+ <plurals name="hours_left">
+ <item quantity="one">Eine Stunde verbleibend</item>
+ <item quantity="other">%d Stunden verbleibend</item>
+ </plurals>
+ <plurals name="minutes_left">
+ <item quantity="one">Ein Minute verbleibend</item>
+ <item quantity="other">%d Minuten verbleibend</item>
+ </plurals>
+</resources>
diff --git a/app/src/main/res/values-de/strings-icsopenvpn.xml b/app/src/main/res/values-de/strings-icsopenvpn.xml
index c78c0039..c80dc0d1 100755
--- a/app/src/main/res/values-de/strings-icsopenvpn.xml
+++ b/app/src/main/res/values-de/strings-icsopenvpn.xml
@@ -44,13 +44,14 @@
<string name="duplicate_profile_name">Profilname bereits vorhanden. Bitte vergeben Sie einen eindeutigen Profilnamen.</string>
<string name="profilename">Profilname</string>
<string name="no_keystore_cert_selected">Kein Benutzerzertifikat ausgewählt</string>
+ <string name="no_ca_cert_selected">Kein Benutzerzertifikat ausgewählt.</string>
<string name="no_error_found">Kein Fehler.</string>
<string name="config_error_found">Fehler in der Konfiguration</string>
- <string name="ipv4_format_error">Fehler beim Auflösen der IPv4-Adresse</string>
+ <string name="ipv4_format_error">Kann die konfigurierte IPv4 Adresse nicht parsen</string>
<string name="custom_route_format_error">Kann die manuell angegeben Routen nicht verarbeiten</string>
<string name="pw_query_hint">(Leer lassen, um nicht zu speichern)</string>
<string name="vpn_shortcut">OpenVPN-Verknüpfung</string>
- <string name="vpn_launch_title">VPN verbinden</string>
+ <string name="vpn_launch_title">Verbinde VPN&#8230;</string>
<string name="shortcut_profile_notfound">Von der Verknüpfung referenziertes Profil konnte nicht gefunden werden</string>
<string name="random_host_prefix">Zufälliger Host-Präfix</string>
<string name="random_host_summary">Fügt 6 zufällige Zeichen am Anfang des Hostnamens hinzu</string>
@@ -164,7 +165,7 @@
<string name="private_key_password">Passphrase des privaten Schlüssels</string>
<string name="password">Passwort</string>
<string name="file_icon">Dateisymbol</string>
- <string name="tls_authentication">TLS-Authentifizierung</string>
+ <string name="tls_authentication">TLS Authentifizierung/Verschlüsselung</string>
<string name="generated_config">Generierte Konfiguration</string>
<string name="generalsettings">Einstellungen</string>
<string name="owner_fix_summary">Versucht, den Eigentümer von /dev/tun auf system zu ändern. Einige Cyanogenmod 9-ROM-Versionen benötigen diese Option, damit die VPN-API funktioniert. Benötigt root.</string>
@@ -203,9 +204,8 @@
<string name="using_proxy">Verwende Proxy %1$s %2$d</string>
<string name="use_system_proxy">System-Proxys verwenden</string>
<string name="use_system_proxy_summary">Systemweite Einstellungen für HTTP- und HTTPS-Proxys beim Verbinden verwenden.</string>
- <string name="donatewithpaypal">&lt;a href=\"https://www.paypal.com/cgi-bin/webscr?hosted_button_id=R2M6ZP9AF25LS&amp;amp;cmd=_s-xclick\"&gt;Spenden mit PayPal&lt;/a&gt; </string>
- <string name="onbootrestartsummary">OpenVPN wird bei einem Neustart des Telefons das beim Herunterfahren aktive VPN wieder verbinden. Bitte lesen Sie die FAQ \"Warnung beim Verbinden\", bevor Sie diese Option verwenden.</string>
- <string name="onbootrestart">Nach Neustart verbinden</string>
+ <string name="onbootrestartsummary">Beim Systemstart das angegebene VPN verbinden. Auf Geräten mit Android 5.0 und höher bitte vor der Verwendung dieser Option die FAQ zum Bestätigungsdialog lesen.</string>
+ <string name="onbootrestart">Beim Gerätestart verbinden</string>
<string name="ignore">Ignorieren</string>
<string name="restart">Neu verbinden</string>
<string name="restart_vpn_after_change">Konfigurationsänderungen werden erst nach einem Neustart des VPNs aktiv. Jetzt neu verbinden?</string>
@@ -219,7 +219,7 @@
<string name="faq_hint">Werfen Sie auch einen Blick in die FAQ. Dort befindet sich eine Schnellstart-Anleitung.</string>
<string name="faq_routing_title">Routing-/Netzwerk-Konfiguration</string>
<string name="faq_routing">In dieser App wird die Routing- und Netzwerkkonfiguration nicht mit den traditionellen ifconfig-/route-Kommandos konfiguriert, sondern mittels der VPNService-API. Diese erwartet eine Tunnel-IP-Adresse und die Netze, die über den Tunnel geroutet werden sollen. Insbesondere wird keine Gateway- oder Peer-IP-Adresse benötigt. Die Anwendung ignoriert diese daher auch beim Import. Die VPNService-API stellt weiterhin sicher, dass die Verbindung zum VPN-Server nicht über den Tunnel geroutet wird, ohne dass hierfür spezielle Routen nötig sind. Da nur Netze, die über den Tunnel geroutet werden sollen, angeben werden können, ist es nicht möglich andere Routen zu unterstützen. Die Anwendung versucht daher andere Routen (wie z.B. route x.x.x.x y.y.y.y net_gateway), die nicht über den Tunnel geroutet werden sollen, zu erkennen, und eine Menge von Routen zu berechnen, die das Verhalten auf anderen Plattformen emulieren. Das Verbindungsprotokoll zeigt die genaue Konfiguration und die errechneten Routen beim Verbinden an.</string>
- <string name="persisttun_summary">Verhindere Zurückfallen auf nicht VPN Verbindungen während OpenVPN neu verbindet.</string>
+ <string name="persisttun_summary">Während Neuaufbau von VPN-Verbindungen nicht auf andere Verbindungen zurückfallen</string>
<string name="persistent_tun_title">Persistentes tun-Device</string>
<string name="openvpn_log">OpenVPN-Protokoll</string>
<string name="import_config">OpenVPN-Konfiguration importieren</string>
@@ -252,7 +252,7 @@
<string name="state_tcp_connect">Verbinde (TCP)</string>
<string name="state_auth_failed">Authentifizierung fehlgeschlagen</string>
<string name="state_nonetwork">Warte auf Internetverbindung</string>
- <string name="statusline_bytecount">↓%2$s/s %1$s - ↑%4$s/s %3$s</string>
+ <string name="statusline_bytecount">↓%2$s %1$s - ↑%4$s %3$s</string>
<string name="notifcation_title_notconnect">Nicht verbunden</string>
<string name="start_vpn_title">Verbinde mit VPN %s</string>
<string name="start_vpn_ticker">Verbinde mit VPN %s</string>
@@ -323,6 +323,7 @@
<string name="import_log">Import-Protokoll:</string>
<string name="ip_looks_like_subnet">VPN-Topologie \"%3$s\" wurde angegeben, die Interface-Konfiguration \'ifconfig %1$s %2$s sieht allerdings wie eine IP-Adresse mit einer Netzwerkmaske aus. Topologie \"subnet\" wird angenommen.</string>
<string name="mssfix_invalid_value">Wert muss eine Zahl zwischen 0 und 9000 sein</string>
+ <string name="mtu_invalid_value">Der MTU-Wert muss eine Zahle zwischen 64 und 9000 sein</string>
<string name="mssfix_value_dialog">TCP-Verbindungen, die über den Tunnel laufen, anweisen, ihre maximale Paketgröße so einzustellen, dass die resultierende UDP-Paketgröße nach der Enkapsulierung durch OpenVPN auf den hier eingestellten Wert beschränkt bleibt. (Standardwert ist 1450)</string>
<string name="mssfix_checkbox">MSS-Wert der TCP-Nutzlast überschreiben</string>
<string name="mssfix_dialogtitle">MSS der TCP-Nutzlast</string>
@@ -392,13 +393,53 @@
<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>
<string name="permission_revoked">VPN-Berechtigung wurde vom Betriebssytem widerrufen (z.B. weil ein anderes VPN gestartet wurde); VPN wird gestoppt</string>
<string name="pushpeerinfo">Peer-Informationen senden</string>
<string name="pushpeerinfosummary">Weitere Informationen, wie z.B. SSL- und Android-Version, an den Server senden</string>
<string name="pw_request_dialog_title">%1$s benötigt</string>
<string name="pw_request_dialog_prompt">Geben Sie bitte das Passwort für das Profil %1$s ein</string>
<string name="menu_use_inline_data">Inline-Daten verwenden</string>
+ <string name="export_config_chooser_title">Konfigurationsdatei exportieren</string>
+ <string name="missing_tlsauth">TLS-Auth-Datei fehlt</string>
+ <string name="missing_certificates">Fehlendes Benutzerzertifikat oder privater Schlüssel</string>
+ <string name="missing_ca_certificate">Fehlendes CA-Zertifikat</string>
+ <string name="crl_title">Zertifikatswiderrufsliste (optional)</string>
+ <string name="reread_log">%d Einträge aus Protokoll-Cache gelesen</string>
+ <string name="samsung_broken">Wenngleich Samsung-Telefone unter den meistverkauften Android-Geräten sind, gehört deren Firmware auch zu den fehlerbehaftetsten aller Android-Geräte. Diese Fehler betreffen nicht nur den Aufbau von VPN-Verbindungen; viele von ihnen können allerdings umgangen werden. Im Folgenden sind einige dieser Fehler beschrieben.\n\nDNS funktioniert nicht, wenn sich der DNS-Server nicht im VPN befindet.\n\nBei vielen Samsung-Geräten mit Android 5.x funktioniert das Sperren/Zulassen von einzelnen Apps nicht.\n\nBei Samsung-Geräten mit Android 6.x wurde berichtet, dass VPN nicht funktioniert, wenn die VPN-App nicht als Ausnahme in den Energiespareinstellungen eingetragen wird.</string>
+ <string name="samsung_broken_title">Samsung-Geräte</string>
+ <string name="novpn_selected">Kein VPN ausgewählt</string>
+ <string name="defaultvpn">Standard-VPN</string>
+ <string name="defaultvpnsummary">Standard VPN. Wird momentan für VPN beim Booten, Always-On-Modus und die Schnellzugriffskachel benutzt.</string>
+ <string name="vpnselected">Derzeit ausgewähltes VPN: \'%s\'</string>
+ <string name="reconnect">Neu verbinden</string>
+ <string name="qs_title">VPN an-/ausschalten</string>
+ <string name="qs_connect">Mit %s verbinden</string>
+ <string name="qs_disconnect">%s trennen</string>
+ <string name="connectretrymaxmessage">Maximale Zeit zwischen Verbindungsversuchen. OpenVPN erhöht die Wartezeit zwischen zwei Verbindungsversuchen schrittweise bis zu dieser Zeit. Der Standardwert ist 300s.</string>
+ <string name="connectretrymaxtitle">Maximale Zeit zwischen Verbindungsversuchen</string>
+ <string name="state_waitconnectretry">Warte %ss Sekunden zwischen zwei Verbindungsversuchen</string>
+ <string name="nought_alwayson_warning"><![CDATA[Wenn der VPN-Bestätigungs-Dialog nicht geöffnet wurde, ist \"Immer auf VPN\" für eine andere Anwendung aktiviert. In diesem Fall darf nur diese APP über VPN verbunden werden. Überprüfen Sie unter Einstellungen-> Netzwerke mehr... -> VPNS]]></string>
+ <string name="management_socket_closed">Verbindung mit OpenVPN getrennt (%s)</string>
+ <string name="change_sorting">Sortierung ändern</string>
+ <string name="sort">Sortieren</string>
+ <string name="sorted_lru">Profile nach letzter Verwendung sortiert</string>
+ <string name="sorted_az">Profile nach Namen sortiert</string>
+ <string name="deprecated_tls_remote">Konfiguration verwendet die Option tls-remote, die in 2.3 als veraltet markiert und schließlich in 2.4 entfernt wurde</string>
+ <string name="auth_failed_behaviour">Verhalten bei AUTH_FAILED</string>
+ <string name="graph">Kurven</string>
+ <string name="use_logarithmic_scale">logarithmische Skala verwnden</string>
+ <string name="notenoughdata">noch keine Daten</string>
+ <string name="avghour">Durchschnitt pro Stunde</string>
+ <string name="avgmin">Durchschnitt pro Minute</string>
+ <string name="last5minutes">letzten 5 Minuten</string>
+ <string name="data_in">Eingehend</string>
+ <string name="data_out">Ausgehend</string>
+ <string name="bits_per_second">%.0f bit/s</string>
+ <string name="kbits_per_second">%.1f kbit/s</string>
+ <string name="mbits_per_second">%.1f Mbit/s</string>
+ <string name="gbits_per_second">%.1f Gbit/s</string>
+ <string name="volume_byte">%.0f B</string>
+ <string name="volume_kbyte">%.1f kB</string>
+ <string name="volume_mbyte">%.1f MB</string>
+ <string name="volume_gbyte">%.1f GB</string>
</resources>
diff --git a/app/src/main/res/values-es/plurals-icsopenvpn.xml b/app/src/main/res/values-es/plurals-icsopenvpn.xml
new file mode 100755
index 00000000..2aa7eab7
--- /dev/null
+++ b/app/src/main/res/values-es/plurals-icsopenvpn.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Generated by crowdin.com-->
+<resources>
+ <plurals name="months_left">
+ <item quantity="one">%d mes restante</item>
+ <item quantity="other">%d meses restantes</item>
+ </plurals>
+ <plurals name="days_left">
+ <item quantity="one">%d día restante</item>
+ <item quantity="other">%d días restantes</item>
+ </plurals>
+ <plurals name="hours_left">
+ <item quantity="one">%d hora restante</item>
+ <item quantity="other">%d horas restantes</item>
+ </plurals>
+ <plurals name="minutes_left">
+ <item quantity="one">%d minuto restanate</item>
+ <item quantity="other">%d minutos restanates</item>
+ </plurals>
+</resources>
diff --git a/app/src/main/res/values-es/strings-icsopenvpn.xml b/app/src/main/res/values-es/strings-icsopenvpn.xml
index 324742de..a123d5e6 100755
--- a/app/src/main/res/values-es/strings-icsopenvpn.xml
+++ b/app/src/main/res/values-es/strings-icsopenvpn.xml
@@ -44,13 +44,13 @@
<string name="duplicate_profile_name">Por favor, introduzca un nombre de perfil único</string>
<string name="profilename">Nombre del Perfil</string>
<string name="no_keystore_cert_selected">Debe seleccionar un certificado de usuario</string>
+ <string name="no_ca_cert_selected">Debe seleccionar un certificado</string>
<string name="no_error_found">No se encontraron errores</string>
<string name="config_error_found">Error en la configuración</string>
<string name="ipv4_format_error">Error al analizar la dirección IPv4</string>
<string name="custom_route_format_error">Error al analizar las rutas personalizadas</string>
<string name="pw_query_hint">(Deje en blanco para consultar sobre demanda)</string>
<string name="vpn_shortcut">Acceso directo de OpenVPN</string>
- <string name="vpn_launch_title">Conectar a VPN</string>
<string name="shortcut_profile_notfound">Perfil especificado en el acceso directo no encontrado</string>
<string name="random_host_prefix">Prefijo aleatorio de Host</string>
<string name="random_host_summary">Agrega 6 caracteres al azar delante del nombre de host</string>
@@ -164,7 +164,7 @@
<string name="private_key_password">Contraseña de clave privada</string>
<string name="password">Contraseña</string>
<string name="file_icon">icono de archivo</string>
- <string name="tls_authentication">Autenticación TLS</string>
+ <string name="tls_authentication">TLS autenticación/cifrado</string>
<string name="generated_config">Configuración generada</string>
<string name="generalsettings">Preferencias</string>
<string name="owner_fix_summary">Intenta establecer el propietario de /dev/tun a system. Algunas imágenes de CM9 lo necesitan hacer funcionar la API de VPNService. Requiere permisos root.</string>
@@ -181,6 +181,7 @@ 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">%10$s %9$s corriendo en %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 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>
@@ -203,9 +204,8 @@ hacia/de Móvil)</string>
<string name="using_proxy">Usando proxy %1$s %2$d</string>
<string name="use_system_proxy">Usar el proxy del sistema</string>
<string name="use_system_proxy_summary">Utilice la configuración del sistema para los proxies HTTP/HTTPS al conectar.</string>
- <string name="donatewithpaypal">Usted puede &lt;a href=\"https://www.paypal.com/cgi-bin/webscr?hosted_button_id=R2M6ZP9AF25LS&amp;amp;cmd=_s-xclick\"&gt;donar con PayPal&lt;/a&gt; </string>
- <string name="onbootrestartsummary">OpenVPN volvera a conectar a una VPN si estaba activa en el apagado/reinicio del sistema. Por favor lea la P+F de advertencia de conexión antes de usar esta opción.</string>
- <string name="onbootrestart">Vuelva a conectar al reiniciar</string>
+ <string name="onbootrestartsummary">OpenVPN se conectará la VPN se especifica si está activa en el arranque del sistema. Por favor, lea las preguntas frecuentes de aviso de conexión antes de utilizar esta opción en Android &lt; 5.0.</string>
+ <string name="onbootrestart">Volver a conectar al reiniciar</string>
<string name="ignore">Ignorar</string>
<string name="restart">Reiniciar</string>
<string name="restart_vpn_after_change">Los cambios de configuración se aplican después de reiniciar la VPN. ¿(Re)iniciar la VPN ahora?</string>
@@ -252,7 +252,6 @@ hacia/de Móvil)</string>
<string name="state_tcp_connect">Conectando (TCP)</string>
<string name="state_auth_failed">Fallo de autenticación</string>
<string name="state_nonetwork">Esperando por una red que se pueda usar</string>
- <string name="statusline_bytecount">↓%2$s/s %1$s - ↑%4$s/s %3$s</string>
<string name="notifcation_title_notconnect">No conectado</string>
<string name="start_vpn_title">Conectando a VPN %s</string>
<string name="start_vpn_ticker">Conectando a VPN %s</string>
@@ -373,4 +372,28 @@ hacia/de Móvil)</string>
<string name="custom_connection_options_warng">Especifique las opciones específicas de conexión personalizada. Úselo con cuidado</string>
<string name="custom_connection_options">Opciones personalizadas</string>
<string name="remove_connection_entry">Eliminar entrada de conexión</string>
+ <string name="ab_kitkat_reconnect_title">Desconexiones aleatorias de la red móvil</string>
+ <string name="ab_vpn_reachability_44_title">Redes remotas inalcanzables</string>
+ <string name="ab_persist_tun_title">Modo Tun Persistente</string>
+ <string name="version_and_later">%s y siguientes</string>
+ <string name="tls_cipher_alert_title">Falló la conexion con SSL23_GET_SERVER_HELLO: sslv3 alerta de falla de handshake</string>
+ <string name="tls_cipher_alert">OpenVPN más reciente de las versiones de Android (0.6.29 / marzo de 2015) utilizan un defecto más seguro para los conjuntos de cifrado permitidos (TLS-cifrado \"DEFAULT: EXP: PSK: SRP: KRSA\"). Por desgracia, omitiendo el cifrado y la exportación de cifrado menos seguro, especialmente la omisión de conjuntos de cifrado que no admiten la confidencialidad directa perfecta (Diffie-Hellman) causa algunos problemas. Esto suele deberse a un intento bien intencionado pero mal ejecutada para reforzar la seguridad TLS configurando TLS-cifrado en el servidor o algunos sistemas operativos embebidos con simplificada SSL (por ejemplo MikroTik). \ N Para resolver este problema el problema, establezca el TLS-cifrado configuración en el servidor a los valores razonables como TLS-cifrado \"dEFAULT: EXP: PSK: SRP: KRSA\". Para solucionar el problema en el cliente agregar la omisión de las opciones de encargo-TLS cifrado en el cliente Android.</string>
+ <string name="message_no_user_edit">Este perfil ha sido añadido desde una aplicación externa (%s) y se ha marcado como no editable por el usuario.</string>
+ <string name="crl_file">Lista de revocación de certificados</string>
+ <string name="service_restarted">Servicio OpenVPN reinicio (App estrelló probablemente se estrelló o muerto por la presión de memoria)</string>
+ <string name="import_config_error">Importación de la configuración produjo un error, no puede guardarlo</string>
+ <string name="Search">Buscar</string>
+ <string name="lastdumpdate">(Última volcado tiene %1$d: %2$dh de edad (%3$s))</string>
+ <string name="clear_log_on_connect">Borrar registro de nueva conexión</string>
+ <string name="connect_timeout">Timeout de conexion</string>
+ <string name="no_allowed_app">No aplicación permitido añadió. Adición de nosotros mismos (%s) que tiene al menos una aplicación en la lista de aplicaciones permitido para no permitir que todas las aplicaciones
+</string>
+ <string name="query_permissions_sdcard">OpenVPN para Android puede tratar de encontrar el/los archivo/s faltante/s en la tarjeta de memoria automáticamente. Toque este mensaje de iniciar la solicitud de permiso.</string>
+ <string name="protocol">Protocolo</string>
+ <string name="enabled_connection_entry">Activo</string>
+ <string name="missing_ca_certificate">Falta certificado CA</string>
+ <string name="reread_log">Vuelva a leer (%d) artículos de archivo de caché de registro log</string>
+ <string name="samsung_broken">A pesar de que los teléfonos Samsung son algunos de los teléfonos Android más vendidos, el firmware de Samsung se encuentran entre los firmware con más errores. Los errores no se limitan a la operación del VPN en estos dispositivos, pero muchos de ellos se pueden solucionar. A continuación de describen algunos errores. \n\n El DNS no funciona a menos que el servidor DNS en el rango del VPN. \n \n En muchos dispositivos Samsung 5.x la funcionalidad de aplicaciones permitidas y no permitidas no funciona. \n En Samsung 6.x Se reporta que VPN no funcionará a menos que la aplicación de VPN se encuentre por fuera de la funcionalidad de ahorro de energía.</string>
+ <string name="samsung_broken_title">Celulares Samsung</string>
+ <string name="novpn_selected">VPN no seleccionado.</string>
</resources>
diff --git a/app/src/main/res/values-et/plurals-icsopenvpn.xml b/app/src/main/res/values-et/plurals-icsopenvpn.xml
new file mode 100755
index 00000000..829589b6
--- /dev/null
+++ b/app/src/main/res/values-et/plurals-icsopenvpn.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Generated by crowdin.com-->
+<resources>
+ <plurals name="months_left">
+ <item quantity="one">Jäänud üks kuu</item>
+ <item quantity="other">Jäänud %d kuud</item>
+ </plurals>
+ <plurals name="days_left">
+ <item quantity="one">Jäänud üks päev</item>
+ <item quantity="other">Jäänud %d päeva</item>
+ </plurals>
+ <plurals name="hours_left">
+ <item quantity="one">Jäänud üks tund</item>
+ <item quantity="other">Jäänud %d tundi</item>
+ </plurals>
+ <plurals name="minutes_left">
+ <item quantity="one">Jäänud üks minut</item>
+ <item quantity="other">Jäänud %d minutit</item>
+ </plurals>
+</resources>
diff --git a/app/src/main/res/values-et/strings-icsopenvpn.xml b/app/src/main/res/values-et/strings-icsopenvpn.xml
index 0a28199f..916e8db1 100755
--- a/app/src/main/res/values-et/strings-icsopenvpn.xml
+++ b/app/src/main/res/values-et/strings-icsopenvpn.xml
@@ -44,13 +44,14 @@
<string name="duplicate_profile_name">Palun sisestage unikaalne profiilinimi</string>
<string name="profilename">Profiili nimi</string>
<string name="no_keystore_cert_selected">Peate valima kasutaja sertifikaadi</string>
+ <string name="no_ca_cert_selected">Peate valima CA sertifikaadi</string>
<string name="no_error_found">Vigu ei leitud</string>
<string name="config_error_found">Konfiguratsiooni viga</string>
<string name="ipv4_format_error">Sisestatud IPv4 aadress ei allu süntaksianalüüsile</string>
<string name="custom_route_format_error">Kohandatud marsruudid ei allu süntaksianalüüsile</string>
<string name="pw_query_hint">(jäta tühjaks, küsitakse vajadusel)</string>
<string name="vpn_shortcut">OpenVPN kiirkäivitus</string>
- <string name="vpn_launch_title">Ühendu VPN\'iga</string>
+ <string name="vpn_launch_title">Ühendumine VPN külge&#8230;</string>
<string name="shortcut_profile_notfound">Lühivalikus määratud profiil puudub</string>
<string name="random_host_prefix">Juhuslik serveri eesliide</string>
<string name="random_host_summary">Lisab 6 juhuslikku tähte serveri nime ette</string>
@@ -164,7 +165,7 @@
<string name="private_key_password">Privaatse võtme salasõna</string>
<string name="password">Salasõna</string>
<string name="file_icon">faili ikoon</string>
- <string name="tls_authentication">TLS autentimine</string>
+ <string name="tls_authentication">TLS Autentimine/Krüpteerimine</string>
<string name="generated_config">Genereeritud konfiguratsioon</string>
<string name="generalsettings">Seaded</string>
<string name="owner_fix_summary">Püütakse seada /dev/tun omanikku system\'iks. VPNService API nõuab seda mõne CM9 versiooni puhul. Seade peab olema ruuditud.</string>
@@ -203,9 +204,8 @@
<string name="using_proxy">Kasutusel proxy %1$s %2$d</string>
<string name="use_system_proxy">Kasuta süsteemset proxy\'t</string>
<string name="use_system_proxy_summary">Kasuta ühendumisel süsteemse HTTP/HTTPS proxy konfiguratsiooni.</string>
- <string name="donatewithpaypal">Sul on võimalus &lt;a href=\"https://www.paypal.com/cgi-bin/webscr?hosted_button_id=R2M6ZP9AF25LS&amp;amp;cmd=_s-xclick\"&gt;annetada PayPal vahendusel&lt;/a&gt; </string>
- <string name="onbootrestartsummary">Kui VPN oli süsteemi uuestilaadimisel/sulgemisel aktiivne siis taastatakse seadme käivitamisel OpenVPN ühendus. Palun lugege enne selle valiku kasutamist läbi ühendumise hoiatuse KKK.</string>
- <string name="onbootrestart">Uuestilaadimisel ühendu uuesti</string>
+ <string name="onbootrestartsummary">OpenVPN ühendab määratud VPN kui see oli süsteemi käivitumisel aktiivne. Palun tutvuge, enne Android &lt; 5.0 peal selle võimaluse kasutamist, KKK hoiatusega ühendumise kohta.</string>
+ <string name="onbootrestart">Ühenda käivitamisel</string>
<string name="ignore">Ignoreeri</string>
<string name="restart">Uuestilaadimine</string>
<string name="restart_vpn_after_change">Konfiguratsioonimuudatused rakendatakse peale VPN uuestilaadimist. Kas soovite VPN kohe (uuesti)laadida?</string>
@@ -252,7 +252,7 @@
<string name="state_tcp_connect">Ühendumine (TCP)</string>
<string name="state_auth_failed">Autentimine ebaõnnestus</string>
<string name="state_nonetwork">Oodatakse kasutatavat võrku</string>
- <string name="statusline_bytecount">↓%2$s/s %1$s - ↑%4$s/s %3$s</string>
+ <string name="statusline_bytecount">↓%2$s %1$s - ↑%4$s %3$s</string>
<string name="notifcation_title_notconnect">Pole ühendatud</string>
<string name="start_vpn_title">Ühendumine VPN %s külge</string>
<string name="start_vpn_ticker">Ühendumine VPN %s külge</string>
@@ -392,7 +392,30 @@
<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>
+ <string name="permission_revoked">OS tühistas VPN õigused (nt. töötab teine VPN programm). VPN peatatakse</string>
+ <string name="pushpeerinfo">Saada partneri andmed</string>
+ <string name="pushpeerinfosummary">Saada serverile lisaandmeid, nt. SSL versioon ja Android versioon</string>
+ <string name="pw_request_dialog_title">Vaja %1$s</string>
+ <string name="pw_request_dialog_prompt">Palun sisestage profiili %1$s salasõna</string>
+ <string name="menu_use_inline_data">Kasutage tekstisiseseid andmeid</string>
+ <string name="export_config_chooser_title">Konfiguratsioonifaili eksportimine</string>
+ <string name="missing_tlsauth">puudub tls-auth fail</string>
+ <string name="missing_certificates">Puudub kasutajasertifikaat või kasutajasertifikaadi võtmefail</string>
+ <string name="missing_ca_certificate">Puudub CA sertifikaat</string>
+ <string name="crl_title">Sertifikaatide tühistusnimekiri (valikuline)</string>
+ <string name="reread_log">Taasloe logi puhverfailist (%d) logikirjet</string>
+ <string name="samsung_broken">Vaatamata sellele et Samsungi telefonid on ühed populaarsemad Android telefonid, on Samsungi tarkvara üks auklikumatest Android tarkvarade seas. Probleemid ei piirdu vaid nende seadmete VPN toimingutega kuid on enamasti lahendatavad. Edasine kirjeldab mõnda probleemi.\n\nDNS ei toimi kui DNS server pole VPN vahemikus.\n\nPaljudel Samsungi 5.x seadmetel ei toimi programmide lubamise/keelamise võimalus.\nSamsung 6.x telefonide kohta on teateid et VPN ei tööta kui VPN programmil pole välistatud toitesääst.</string>
+ <string name="samsung_broken_title">Samsungi telefonid</string>
+ <string name="novpn_selected">VPN valimata.</string>
+ <string name="defaultvpn">Vaikimisi VPN</string>
+ <string name="reconnect">Taasühenda</string>
+ <string name="qs_title">VPN lülitamine</string>
+ <string name="qs_connect">Ühendu %s külge</string>
+ <string name="qs_disconnect">Lahuta %s küljest</string>
+ <string name="connectretrymaxmessage">Sisestage suurim ühendumiskatsete vaheline aeg. OpenVPN tõstab ebaõnnestunud ühendumiskatsete puhul aegamööda ooteaega kuni jõuab selle väärtuseni. Vaikeväärtus on 300s.</string>
+ <string name="connectretrymaxtitle">Suurim lubatud ühendumiskatsete vaheline aeg</string>
+ <string name="state_waitconnectretry">Ühendumiskatsete vahel oodatakse %ss sekundit</string>
+ <string name="change_sorting">Muuda sorteerimist</string>
+ <string name="sort">Sorteeri</string>
+ <string name="last5minutes">Viimased 5 minutit</string>
</resources>
diff --git a/app/src/main/res/values-fr/plurals-icsopenvpn.xml b/app/src/main/res/values-fr/plurals-icsopenvpn.xml
new file mode 100755
index 00000000..e9e4c680
--- /dev/null
+++ b/app/src/main/res/values-fr/plurals-icsopenvpn.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Generated by crowdin.com-->
+<resources>
+ <plurals name="months_left">
+ <item quantity="one">Un mois restant</item>
+ <item quantity="other">%d mois restants</item>
+ </plurals>
+ <plurals name="days_left">
+ <item quantity="one">Un jour restant</item>
+ <item quantity="other">%d jours restants</item>
+ </plurals>
+ <plurals name="hours_left">
+ <item quantity="one">Une heure restante</item>
+ <item quantity="other">%d heures restantes</item>
+ </plurals>
+ <plurals name="minutes_left">
+ <item quantity="one">Une minute restante</item>
+ <item quantity="other">%d minutes restantes</item>
+ </plurals>
+</resources>
diff --git a/app/src/main/res/values-fr/strings-icsopenvpn.xml b/app/src/main/res/values-fr/strings-icsopenvpn.xml
index 43737f3d..ae289702 100755
--- a/app/src/main/res/values-fr/strings-icsopenvpn.xml
+++ b/app/src/main/res/values-fr/strings-icsopenvpn.xml
@@ -7,9 +7,9 @@
<resources>
<string name="address">"Adresse du serveur:"</string>
- <string name="port">"Port du serveur:"</string>
+ <string name="port">Port du serveur :</string>
<string name="location">"Emplacement"</string>
- <string name="cant_read_folder">"Le dossier ne peut être lu !"</string>
+ <string name="cant_read_folder">Impossible de lire le dossier</string>
<string name="select">"Sélectionner"</string>
<string name="cancel">"Annuler"</string>
<string name="no_data">"Aucune donnée"</string>
@@ -20,7 +20,7 @@
<string name="client_pkcs12_title">"Fichier PKCS12"</string>
<string name="ca_title">"Certificat CA"</string>
<string name="no_certificate">"Vous devez sélectionner un certificat"</string>
- <string name="copyright_guicode">"Le code source et le tracker de bugs est disponible ici: http://code.google.com/p/ics-openvpn/ "</string>
+ <string name="copyright_guicode">Le code source et le tracker de bugs est disponible sur https://github.com/schwabe/ics-openvpn/</string>
<string name="copyright_others">"Le programme utilise les composants suivants. Voir le code source pour plus de détails sur les licences."</string>
<string name="about">"À propos"</string>
<string name="vpn_list_title">Profils</string>
@@ -29,12 +29,12 @@
<string name="file_select">"Sélectionner…"</string>
<string name="file_nothing_selected">Vous devez sélectionner un fichier</string>
<string name="useTLSAuth">"Utiliser l\'authentification TLS"</string>
- <string name="tls_direction">"Direction de l\'authentification TLS"</string>
- <string name="ipv6_dialog_tile">"Entrez l\'adresse IPv6 / masque de réseau au format CIDR (ex.: 2000:jj::23/64)"</string>
- <string name="ipv4_dialog_title">"Saisissez l\'adresse IPv4 / masque de réseau au format CIDR (ex.: 1.2.3.4/24)"</string>
+ <string name="tls_direction">Direction TLS</string>
+ <string name="ipv6_dialog_tile">Entrez l\'adresse IPv6 / masque de réseau au format CIDR (ex : 2000:jj::23/64)</string>
+ <string name="ipv4_dialog_title">Entrez l\'adresse IPv4 / masque de réseau au format CIDR (ex : 1.2.3.4/24)</string>
<string name="ipv4_address">"Adresse IPv4"</string>
<string name="ipv6_address">"Adresse IPv6"</string>
- <string name="custom_option_warning">"Entrez les options d\'OpenVPN personnalisés. A manipuler avec le plus grand soin. A noter également que de nombreux paramètres Tun d\'OpenVPN ne sont pas pris en charge à cause de la conception de \"VPNSettings\". Si vous pensez qu\'une option importante manque, veuillez contacter l\'auteur"</string>
+ <string name="custom_option_warning">Entrez les options d\'OpenVPN personnalisées. A utiliser avec précaution. A noter aussi que de nombreux paramètres Tun d\'OpenVPN ne sont pas pris en charge à cause de la conception de \"VPNSettings\". Si vous pensez qu\'une option importante manque, veuillez contacter l\'auteur</string>
<string name="auth_username">"Nom d\'utilisateur"</string>
<string name="auth_pwquery">"Mot de passe"</string>
<string name="static_keys_info">"Pour la configuration statique, des clés d\'authentification TLS seront utilisés comme des clés statiques."</string>
@@ -44,27 +44,28 @@
<string name="duplicate_profile_name">Veuillez entrer un nom de profil unique</string>
<string name="profilename">"Nom de profil"</string>
<string name="no_keystore_cert_selected">"Aucun certificat utilisateur sélectionné."</string>
+ <string name="no_ca_cert_selected">Vous devez sélectionner un certificat CA</string>
<string name="no_error_found">"Aucune erreur"</string>
<string name="config_error_found">"Erreur dans la configuration"</string>
<string name="ipv4_format_error">"Impossible d\'analyser l\'adresse IPv4"</string>
- <string name="custom_route_format_error">"Impossible d\'analyser les règles de redirection personnalisés"</string>
- <string name="pw_query_hint">"Laissez vide pour définir si nécessaire"</string>
+ <string name="custom_route_format_error">Impossible d\'analyser les redirections personnalisées</string>
+ <string name="pw_query_hint">(Laisser vide pour interroger sur demande)</string>
<string name="vpn_shortcut">"Raccourci OpenVPN"</string>
- <string name="vpn_launch_title">"Se connecter au VPN"</string>
+ <string name="vpn_launch_title">Connexion à VPN &#8230;</string>
<string name="shortcut_profile_notfound">"Profil spécifié dans raccourci introuvable"</string>
- <string name="random_host_prefix">"Préfixe de l\'hôte au hasard"</string>
+ <string name="random_host_prefix">Préfixe de l\'hôte aléatoire</string>
<string name="random_host_summary">"Ajoute 6 caractères aléatoires en face du nom d\'hôte"</string>
<string name="custom_config_title">"Activer les options personnalisées"</string>
<string name="custom_config_summary">"Spécifiez les options personnalisées. A utiliser avec précaution !"</string>
<string name="route_rejected">"Route rejetée par Android"</string>
- <string name="cancel_connection">"Déconnecter"</string>
+ <string name="cancel_connection">Déconnecter</string>
<string name="cancel_connection_long">Déconnecter le VPN</string>
- <string name="clear_log">"Effacer les logs"</string>
+ <string name="clear_log">effacer le journal</string>
<string name="title_cancel">"Annuler la confirmation"</string>
<string name="cancel_connection_query">"Déconnecter le VPN connecté / annuler la tentative de connexion ?"</string>
- <string name="remove_vpn">"Retirer le VPN"</string>
- <string name="check_remote_tlscert">Vérifier si le serveur utilise des certificats avec les extensions TLS serveur (--remote-cert-tls serveur)</string>
- <string name="check_remote_tlscert_title">Attendre un certificat de serveur TLS</string>
+ <string name="remove_vpn">Supprimer le VPN</string>
+ <string name="check_remote_tlscert">Vérifie si le serveur utilise un certificat avec les extensions de serveur TLS (--remote-cert-tls server)</string>
+ <string name="check_remote_tlscert_title">Attendre le certificat de serveur TLS</string>
<string name="remote_tlscn_check_summary">Vérifie l\'objet du certificat serveur distant DN</string>
<string name="remote_tlscn_check_title">"Vérification du certificat de l\'hôte"</string>
<string name="enter_tlscn_dialog">Spécifiez le contrôle utilisé pour vérifier le certificat à distance DN (par exemple, C=DE, L=Paderborn, OU =Avian IP Carriers, CN=openvpn.blinkt.de)\n\nIndiquez le DN complet ou le RDN (openvpn.blinkt.de dans l\'exemple) ou un préfixe RDN pour vérification.\n\nEn utilisant le préfixe RDN \"Server\" correspond à \"Server-1\" et \"Server 2\"\n\nSi vous laissez le champ de texte vide, cela vérifiera le RDN contre le nom du serveur.\n\nPour plus de détails, voir la page du manuel OpenVPN 2.3.1 sous —verify-x509-name</string>
@@ -73,64 +74,64 @@
<string name="tls_auth_file">"Fichier d\'authentification TLS"</string>
<string name="pull_on_summary">"Demande les adresses IP, les règles de redirection et les options de synchronisation du serveur."</string>
<string name="pull_off_summary">"Aucune information n\'est demandée par le serveur. Les paramètres doivent être spécifiés ci-dessous."</string>
- <string name="use_pull">"Réglages \"Pull\""</string>
- <string name="dns">"DNS"</string>
+ <string name="use_pull">Paramètres \"Pull\"</string>
+ <string name="dns">DNS</string>
<string name="override_dns">"Remplacer les paramètres DNS par le serveur"</string>
- <string name="dns_override_summary">"Utilisez vos propres serveurs DNS"</string>
- <string name="searchdomain">"Domaine"</string>
- <string name="dns1_summary">"Serveur DNS à utiliser."</string>
- <string name="dns_server">"Serveur DNS"</string>
- <string name="secondary_dns_message">"Serveur DNS secondaire utilisé si le serveur DNS principal ne peut pas être atteint."</string>
- <string name="backup_dns">"Serveur DNS secondaire"</string>
- <string name="ignored_pushed_routes">"Ignorer les règles envoyées"</string>
- <string name="ignore_routes_summary">"Ignorer les règles de redirection de ports envoyées par le serveur."</string>
- <string name="default_route_summary">"Redirige tout le trafic sur la connexion VPN"</string>
- <string name="use_default_title">"Utiliser la redirection par défaut"</string>
- <string name="custom_route_message">"Entrez les règles de redirection. N\'entrez la destination qu\'au format CIDR. \"10.0.0.0 / 8 2002::/16\" redirigerait les réseaux 10.0.0.0/8 et 2002::/16 via le VPN."</string>
- <string name="custom_route_message_excluded">Routes qui ne devraient pas être routés via le VPN. Utilisez la même syntaxe que pour les routes incluses.</string>
- <string name="custom_routes_title">"Règles personnalisés"</string>
+ <string name="dns_override_summary">Utilisez vos propres serveurs DNS</string>
+ <string name="searchdomain">suffixe de recherche</string>
+ <string name="dns1_summary">Serveur DNS à utiliser.</string>
+ <string name="dns_server">Serveur DNS</string>
+ <string name="secondary_dns_message">Serveur DNS secondaire utilisé si le serveur DNS principal ne peut pas être joins.</string>
+ <string name="backup_dns">Serveur DNS secondaire</string>
+ <string name="ignored_pushed_routes">Ignorer les routes envoyées</string>
+ <string name="ignore_routes_summary">Ignorer les règles de routage envoyées par le serveur.</string>
+ <string name="default_route_summary">Redirige tout le trafic vers la connexion VPN</string>
+ <string name="use_default_title">Utiliser la route par défaut</string>
+ <string name="custom_route_message">Entrer les règles de routage. Saisissez seulement les destinations au format CIDR. Exemple: \"10.0.0.0/8 2002::/16\" devrait router les réseaux 10.0.0.0/8 et 2002::/16 via le VPN.</string>
+ <string name="custom_route_message_excluded">Routes qui ne devant pas être routées à travers le VPN. Utilisez la même syntaxe que pour les règles de routage.</string>
+ <string name="custom_routes_title">Routes personnalisées</string>
<string name="custom_routes_title_excluded">Réseaux exclus</string>
- <string name="log_verbosity_level">"Niveau de verbosité des logs"</string>
- <string name="float_summary">"Autorise les paquets authentifiés à partir de n\'importe quelle adresse IP"</string>
+ <string name="log_verbosity_level">Niveau de verbosité des logs</string>
+ <string name="float_summary">Autorise les paquets authentifiés à partir de n\'importe quelle adresse IP</string>
<string name="float_title">"Permettre des serveur flottants"</string>
- <string name="custom_options_title">"Options personnalisées"</string>
- <string name="edit_vpn">"Modifier les paramètres VPN"</string>
- <string name="remove_vpn_query">\"Effacer le profil VPN %s ?\"?</string>
- <string name="tun_error_helpful">"Sur certaines ROMs ICS les permissions de /dev/tun peuvent être incorrectes, ou le module Tun peut être manquant. Pour les ROMs CM9, essayez de corriger les options dans \"General Settings\""</string>
- <string name="tun_open_error">"L\'ouverture de l\'interface Tun a échoué."</string>
- <string name="error">"Erreur: "</string>
- <string name="clear">"Effacer"</string>
- <string name="last_openvpn_tun_config">Ouverture de l\'interface tun:</string>
- <string name="local_ip_info">"IPv4 locale: %1$s/%2$d IPv6: %3$s MTU: %4$d"</string>
- <string name="dns_server_info">Serveur DNS: %1$s, Domaine: %2$s</string>
+ <string name="custom_options_title">Options personnalisées</string>
+ <string name="edit_vpn">Modifier les paramètres du VPN</string>
+ <string name="remove_vpn_query">Effacer le profil VPN \"%s\" ?</string>
+ <string name="tun_error_helpful">Sur certaines images ICS les permissions de /dev/tun peuvent être incorrectes, ou encore le module tun peut être manquant. Pour les images CM9, essayez de corriger les permissions via les paramètres généreaux</string>
+ <string name="tun_open_error">L\'ouverture de l\'interface /dev/tun a échouée</string>
+ <string name="error">Erreur :</string>
+ <string name="clear">Effacer</string>
+ <string name="last_openvpn_tun_config">Ouverture de l\'interface tun :</string>
+ <string name="local_ip_info">IPv4 locale : %1$s/%2$d IPv6 : %3$s MTU : %4$d</string>
+ <string name="dns_server_info">Serveur DNS : %1$s, Domaine : %2$s</string>
<string name="routes_info_incl">Routes : %1$s %2$s</string>
<string name="routes_info_excl">Routes exclues : %1$s %2$s</string>
<string name="routes_debug">Routes VpnService installés : %1$s %2$s</string>
- <string name="ip_not_cidr">"Informations récupérées de l\'interface: %1$s et %2$s , en supposant que la seconde adresse est l\'adresse peer du réseau distant. Utilisation du masque de réseau /32 pour l\'IP locale. Mode donné par OpenVPN: \"%3$s\"."</string>
+ <string name="ip_not_cidr">Informations récupérées de l\'interface : %1$s et %2$s , en supposant que la seconde adresse est l\'adresse peer du réseau distant. Utilisation du masque de réseau /32 pour l\'IP locale. Mode donné par OpenVPN : \"%3$s\".</string>
<string name="route_not_cidr">"Ne peut pas donner un sens à %1$s et %2$s comme routage IP avec masque réseau de type CIDR, en utilisant /32 comme masque de réseau."</string>
- <string name="route_not_netip">"Règle de redirection corrigée: %1$s / %2$s en %3$s / %2$s"</string>
+ <string name="route_not_netip">Route corrigée : %1$s / %2$s en %3$s / %2$s</string>
<string name="keychain_access">\"Impossible d\'accéder aux certificats \"Android Keychain\". (Peut être causé par une mise à jour du firmware ou par une restauration d\'une sauvegarde des paramètres de l\'application). Veuillez modifier le profil VPN et sélectionnez de nouveau le certificat dans les réglages de base pour recréer l\'autorisation d\'accéder au certificat.\".</string>
<string name="version_info">"%1$s %2$s"</string>
- <string name="send_logfile">"Envoyer le fichier de log"</string>
- <string name="send">"Envoyer"</string>
+ <string name="send_logfile">Envoyer le fichier de log</string>
+ <string name="send">Envoyer</string>
<string name="ics_openvpn_log_file">"Fichier de log OpenVPN ICS"</string>
- <string name="copied_entry">"Entrée du log copiée"</string>
- <string name="tap_mode">"Mode TAP"</string>
+ <string name="copied_entry">Entrée du journal copié dans le presse papier</string>
+ <string name="tap_mode">Mode Tap</string>
<string name="faq_tap_mode">"Le mode TAP est indisponible avec l\'API non root VPN. Par conséquent, cette application ne peut pas supporter TAP"</string>
<string name="tap_faq2">\"Encore une fois? Vous plaisantez? Le mode TAP n\'est absolument pas pris en charge et l\'envoi de plus d\'e-mails demandant si il sera intégré ne va en rien aider.\".</string>
<string name="tap_faq3">\"Encore une fois ? En fait il est possible que quelqu\'un puisse écrire un émulateur TAP basé sur TUN qui pourrait analyser des informations de type \"layer2\". Mais cet émulateur devrait aussi implémenter ARP et un client DHCP. Je ne suis actuellement pas au courant que quelqu\'un travail dessus. Contactez moi si vous voulez m\'aider là dessus\".</string>
- <string name="faq">"FAQ"</string>
+ <string name="faq">FAQ</string>
<string name="copying_log_entries">"Copie des entrées du log"</string>
<string name="faq_copying">"Pour copier une seule entrée du log restez appuyé sur celle-ci. Pour copier ou envoyer le log au complet utilisez l\'option \"Envoi du Log\". Utilisez le bouton matériel s\'il n\'est pas visible."</string>
<string name="faq_shortcut">"Raccourci pour démarrer"</string>
<string name="faq_howto_shortcut">Vous pouvez placer un raccourci pour démarrer OpenVPN sur l\'écran d\'accueil. En fonction du programme gérant votre écran d\'accueil, vous devez soit ajouter un raccourci, soit un widget.</string>
<string name="no_vpn_support_image">"Votre ROM ne prend pas en charge l\'API VPNService, désolé :("</string>
- <string name="encryption">"Cryptage"</string>
- <string name="cipher_dialog_title">"Entrez la méthode de cryptage"</string>
- <string name="chipher_dialog_message">Entrer l\'algorithme de chiffrement utilisé par OpenVPN. Laisser vide pour utiliser l\'algorithme par défaut.</string>
- <string name="auth_dialog_message">Entrer le digest à utiliser par OpenVPN pour l\'authentification. Laisser vide pour utiliser l\'algorithme par défaut.</string>
- <string name="settings_auth">"Authentification / Cryptage"</string>
- <string name="file_explorer_tab">"Explorateur de fichiers"</string>
+ <string name="encryption">Chiffrement</string>
+ <string name="cipher_dialog_title">Entrez la méthode de chiffrement</string>
+ <string name="chipher_dialog_message">Entrez l\'algorithme de chiffrement utilisé par OpenVPN. Laisser vide pour utiliser le cipher par défaut.</string>
+ <string name="auth_dialog_message">Entrez l\'authentification digest utilisé pour OpenVPN. Laisser vide pour utiliser le digest par défaut.</string>
+ <string name="settings_auth">Authentification / Chiffrement</string>
+ <string name="file_explorer_tab">Explorateur de fichiers</string>
<string name="inline_file_tab">"Fichier personnalisé"</string>
<string name="error_importing_file">"Impossible d\'importer le fichier"</string>
<string name="import_error_message">"Impossible d\'importer le fichier depuis le système de fichiers"</string>
@@ -140,44 +141,44 @@
<string name="menu_import_short">"Importer"</string>
<string name="import_content_resolve_error">"Impossible de lire le profil à importer"</string>
<string name="error_reading_config_file">"Erreur de lecture du fichier de configuration"</string>
- <string name="add_profile">"Ajouter un profil"</string>
+ <string name="add_profile">ajouter un profil</string>
<string name="import_could_not_open">"Impossible de trouver le fichier %1$s mentionné dans le fichier de configuration importé"</string>
<string name="importing_config">"Importation du fichier de configuration depuis %1$s"</string>
- <string name="import_warning_custom_options">Votre configuration a quelques options qui ne sont pas prises en compte par l\'interface utilisateur. Ces options ont donc été ajoutées comme des options de configuration personnalisées:</string>
+ <string name="import_warning_custom_options">Votre configuration a quelques options qui ne sont pas prises en compte par l\'interface utilisateur. Ces options ont donc été ajoutées comme des options de configuration personnalisées :</string>
<string name="import_done">"Fin de la lecture du fichier de configuration."</string>
<string name="nobind_summary">"Ne pas se lier à l\'adresse locale et au port"</string>
<string name="no_bind">"Aucune liaison locale"</string>
- <string name="import_configuration_file">"Importer un fichier de configuration"</string>
+ <string name="import_configuration_file">Importer le fichier de configuration</string>
<string name="faq_security_title">"Considérations de sécurité"</string>
<string name="faq_security">"La stratégie de sécurité d\'OpenVPN amène quelque remarques concernant la sécurité des données saisies. En général, toutes les informations stockées sur la carte SD ne sont pas sécurisées. Toute application peut en obtenir l\'accès (par exemple, ce programme ne requiert aucun droit particulier d\'accès à la carte SD). Dans le cas de ce programme, il est le seul à avoir accès à ces données. En utilisant l\'option d\'importation pour les CaCert/Cert/Key, les données sont stockées dans le porfile VPN. Ce dernier est seulement accessible à cette application. Ainsi, veuillez ne pas oublier de supprimer les copies sur la carte SD après importation. Car, même si l\'application en a l\'exclusivité, les données ne sont pas pour autant cryptées. En \"rootant\" l\'appareil ou par d\'autres exploits il est toujours possible d\'accéder à ces informations. A titre d\'exemple, les mots de passe sont stockés en clair. Pour les fichiers de type Pkfcs12, il est fortement recommandé que vous les importiez dans le gestionnaire de clées d\'Android."</string>
<string name="import_vpn">"Importer"</string>
<string name="broken_image_cert_title">"Erreur d\'affichage certificat sélectionné"</string>
<string name="broken_image_cert">"Exception en essayant d\'afficher le dialogue de sélection du certification d\'Android 4.0+. Ceci ne devrait pas se produire car c\'est une des fonctionnalités de base de ce système. Il est donc possible que votre ROM ne supporte pas le stockage de certfiicats."</string>
<string name="ipv4">"IPv4"</string>
- <string name="ipv6">"IPv6"</string>
- <string name="speed_waiting">Attente du status&#8230;</string>
- <string name="converted_profile">"profil importé"</string>
- <string name="converted_profile_i">"profil importé: %d"</string>
- <string name="broken_images">"Images corrompues "</string>
+ <string name="ipv6">IPv6</string>
+ <string name="speed_waiting">Attente du statut&#8230;</string>
+ <string name="converted_profile">profil importé</string>
+ <string name="converted_profile_i">profil importé %d</string>
+ <string name="broken_images">Images corrompues</string>
<string name="broken_images_faq">&lt;&gt;Les ROMs officielles HTC sont connues pour avoir des problèmes de routage entraînant que le trafic ne passe pas par le tunnel VPN. (C.f.: &lt;a href=\"http://code.google.com/p/ics-openvpn/issues/detail?id=18\"&gt;Issue 18&lt;/a&gt; dans le \"bug tacker\")&lt;/p&gt;&lt;p&gt;Les ROMs officielles de SONY pour le Xperia Arc S et le Xperia Ray ont été signalé comme ne possédant pas le service VPN. Toute autre ROM SONY peut avoir le même problème. (C.f.: &lt;a href=\"http://code.google.com/p/ics-openvpn/issues/detail?id=29\"&gt;Issue 29&lt;/a&gt; dans le \"bug tacker\")&lt;/p&gt;&lt;p&gt;Sur les ROM personnalisées le module TUN peut être manquant ou les droits de /dev/tun peuvent être incorrects. Certaines ROM CM9 peuvent nécessiter d\'utiliser l\'option de correction des droits de /dev/tun accessible depuis les \"Options générales\"/&lt;/p&gt;&lt;p&gt;Important: Si votre ROM a un problème, contactez le vendeur, il se peut que qu\'il vous fournisse un patch.&lt;/p&gt;</string>
- <string name="pkcs12_file_encryption_key">"Fichier de clé de cryptage PKCS12"</string>
- <string name="private_key_password">"Mot de passe de clé privée"</string>
- <string name="password">"Mot de passe"</string>
- <string name="file_icon">"icône du fichier"</string>
- <string name="tls_authentication">"Authentification TLS"</string>
- <string name="generated_config">"Configuration générée"</string>
+ <string name="pkcs12_file_encryption_key">Fichier contenant la clé de chiffrement PKCS12</string>
+ <string name="private_key_password">Mot de passe de la clé privée</string>
+ <string name="password">Mot de passe</string>
+ <string name="file_icon">icône du fichier</string>
+ <string name="tls_authentication">TLS Authentification/Cryptage</string>
+ <string name="generated_config">Configuration générée</string>
<string name="generalsettings">Paramètres</string>
- <string name="owner_fix_summary">"Tente de définir le propriétaire de /dev/tun. Certaines ROMs CM9 en ont besoin pour faire fonctionner l\'API VPNService. Nécessite les droits root."</string>
- <string name="owner_fix">"Corriger le propriétaire de /dev/tun"</string>
- <string name="generated_config_summary">"Affiche le fichier de configuration OpenVPN généré"</string>
- <string name="edit_profile_title">"Modification \"%s\""</string>
- <string name="building_configration">"Création de la configuration…"</string>
- <string name="netchange_summary">"L\'activation de cette option forcera l\'appareil à se reconnecter si l\'état du réseau change (ex.: WIFI/Mobile)"</string>
- <string name="netchange">"Reconnexion lors de changement du réseau"</string>
- <string name="netstatus">"État du réseau: %s"</string>
+ <string name="owner_fix_summary">Essaie de définir le propriétaire de l\'interface /dev/tun. Certaines images CM9 en ont besoin pour faire fonctionner l\'API VPNService. Nécessite les droits root.</string>
+ <string name="owner_fix">Corriger les permissions de /dev/tun</string>
+ <string name="generated_config_summary">Affiche le fichier de configuration OpenVPN généré</string>
+ <string name="edit_profile_title">Modification \"%s\"</string>
+ <string name="building_configration">Création de la configuration&#8230;</string>
+ <string name="netchange_summary">Activer cette option forcera une reconnexion si l\'état du réseau est modifié (par exemple WiFi/Mobile)</string>
+ <string name="netchange">Se reconnecter lors d\'un changement de réseau</string>
+ <string name="netstatus">État du réseau : %s</string>
<string name="extracahint">"Le certificat CA est généralement renvoyé par le gestionnaire de clés Android. Spécifiez un certificat distinct si vous obtenez des erreurs de vérification de certificat."</string>
<string name="select_file">"Sélectionner"</string>
- <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="keychain_nocacert">Aucun certificat CA n\'a été trouvé depuis le gestionnaire de clés d\'Android. L\'authentification va probablement échoué.</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">%10$s %9$s courir sur %3$s %1$s (%2$s), Android %6$s (%7$s) API %4$d, ABI %5$s, (%8$s)</string>
@@ -185,13 +186,13 @@
<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>
<string name="faq_system_dialogs_title">"Avertissement de connexion et son de notification"</string>
- <string name="translationby">French translation by Stanislas Bach&lt;stanislasbach@gmail.com&gt;</string>
- <string name="ipdns">"IP et DNS"</string>
- <string name="basic">"Base"</string>
- <string name="routing">"Redirection de ports"</string>
- <string name="obscure">"Réglages OpenVPN avancés"</string>
- <string name="advanced">"Avancé"</string>
- <string name="export_config_title">"Configuration ICS OpenVPN "</string>
+ <string name="translationby">Traduction française par les utilisateurs sur Crowdin</string>
+ <string name="ipdns">IP et DNS</string>
+ <string name="basic">Base</string>
+ <string name="routing">Routage</string>
+ <string name="obscure">Paramètres OpenVPN avancés</string>
+ <string name="advanced">Avancée</string>
+ <string name="export_config_title">Configuration ICS OpenVPN</string>
<string name="warn_no_dns">Aucun serveur DNS utilisé. La résolution de noms de domaines peut ne pas fonctionner. Envisager d\'ajouter des serveurs DNS personnalisés. Veuillez également noter que Android va continuer à utiliser vos paramètres de proxy spécifiés pour votre connexion Wi-Fi/mobile lorsque aucun serveur DNS n\'est défini.</string>
<string name="dns_add_error">"Impossible d\'ajouter le serveur DNS \"%1$s\", rejetés par le système: %2$s"</string>
<string name="ip_add_error">Impossible de configurer l\'adresse IP \"%1$s\", rejetées par le système : %2$s</string>
@@ -200,21 +201,20 @@ Sur certaines images, cette notification joue un son.\nAndroid à introduit ces
<string name="setting_loadtun_summary">"Essayez de charger le module du noyau \"tun.ko\" avant d\'essayer de vous connecter. Requiert des droits root."</string>
<string name="setting_loadtun">"Charger le module TUN"</string>
<string name="importpkcs12fromconfig">"Importer PKCS12 de la configuration dans le gestionnaire de clés Android"</string>
- <string name="getproxy_error">"Erreur d\'obtention des paramètres de proxy: %s"</string>
+ <string name="getproxy_error">Erreur d\'obtention des paramètres de proxy : %s</string>
<string name="using_proxy">"Utilisation du proxy %1$s %2$d"</string>
<string name="use_system_proxy">"Utiliser le proxy système"</string>
<string name="use_system_proxy_summary">"Utiliser la configuration générale du système pour que les proxy HTTP / HTTPS se connectent."</string>
- <string name="donatewithpaypal">"Vous pouvez faire un &lt;a href=\"https://www.paypal.com/cgi-bin/webscr?hosted_button_id=R2M6ZP9AF25LS&amp;cmd=_s-xclick\"&gt;don avec PayPal&lt;/ a&gt; "</string>
- <string name="onbootrestartsummary">"Reconnecter OpenVPN automatiquement si une connexion était active lors de l\'extinction/redémarrage de l\'appareil. Veuillez lire l\'avertissement de connexion dans la FAQ avant d\'utiliser cette option."</string>
- <string name="onbootrestart">"Connexion automatique au redémarrage"</string>
- <string name="ignore">"Ignorer"</string>
- <string name="restart">"Redémarrer"</string>
- <string name="restart_vpn_after_change">"Les changements de configuration sont appliquées après redémarrage du VPN. (Re)démarrer le VPN maintenant?"</string>
- <string name="configuration_changed">"Configuration modifiée"</string>
+ <string name="onbootrestartsummary">OpenVPN connecter le VPN spécifié si elle était active au démarrage du système. S\'il vous plaît lire l\'avertissement de connexion FAQ avant d\'utiliser cette option sur Android &lt; 5.0.</string>
+ <string name="onbootrestart">Se connecter au redémarrage</string>
+ <string name="ignore">Ignorer</string>
+ <string name="restart">Redémarrer</string>
+ <string name="restart_vpn_after_change">Les changements de configuration sont appliqués après redémarrage du VPN. (Re)démarrer le VPN maintenant ?</string>
+ <string name="configuration_changed">Configuration modifiée</string>
<string name="log_no_last_vpn">"Impossible de déterminer le dernier profil connecté pour l\'édition"</string>
- <string name="faq_duplicate_notification_title">"Notifications multiples"</string>
+ <string name="faq_duplicate_notification_title">Notifications en double</string>
<string name="faq_duplicate_notification">"Si Android tourne sur la mémoire du système (RAM), les application et les services qui ne sont pas nécessaires à un moment sont automatiquement supprimés de la mémoire. Cela stoppe donc la connexion VPN en cours. Pour s\'assurer que celle-ci reste toujours lancée, le service est lancé avec une priorité plus élevée. Pour cela, l\'application doit afficher une notification permanente. L\'icône de \"clé\" dans la notification est imposée par le système comme expliqué dans l\'entrée de la FAQ précédente."</string>
- <string name="no_vpn_profiles_defined">"Pas de profils VPN définis."</string>
+ <string name="no_vpn_profiles_defined">Aucun profil VPN défini.</string>
<string name="add_new_vpn_hint">"Utilisez l\'icône &lt;img src=\"ic_menu_add\"/ pour ajouter un nouveau VPN"</string>
<string name="vpn_import_hint">"Utilisez l\'icône &lt;img src=\"ic_menu_archive\"/&gt; pour importer un fichier profil (.opvpn ou .conf) de votre carte SD."</string>
<string name="faq_hint">"Veillez également à consulter la FAQ. Il s\'y trouve un guide de démarrage rapide."</string>
@@ -226,15 +226,15 @@ Sur certaines images, cette notification joue un son.\nAndroid à introduit ces
<string name="import_config">"Importer une configuration OpenVPN"</string>
<string name="battery_consumption_title">"Consommation de la batterie"</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 keepalive 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">La fonctionnalité de Tethering Android (sur WiFi, USB ou Bluetooth) et l\'API VPNService (utilisé par ce programme) ne fonctionnent pas ensemble. Pour plus de détails, voir la &lt;a href=\"http://code.google.com/p/ics-openvpn/issues/detail?id=34\" &gt; page #34 &lt;/a&gt;</string>
- <string name="vpn_tethering_title">VPN et Tethering</string>
- <string name="connection_retries">"Tentatives de connexion"</string>
- <string name="reconnection_settings">"Paramètres de reconnexion"</string>
- <string name="connectretrymessage">Nombre de secondes d\'attente entre chaque tentative de connexion.</string>
- <string name="connectretrywait">"Temps, en secondes, entre deux connexions"</string>
- <string name="minidump_generated">OpenVPN s\'est écrasé de façon inattendue. S\'il vous plaît, envisagez d\'utiliser l\'option de Minidump depuis le menu principal</string>
+ <string name="faq_tethering">La fonctionnalité Partage de connexion Android (sur WiFi, USB ou Bluetooth) et l\'API VPNService (utilisé par ce programme) ne fonctionnent pas ensemble. Pour plus de détails voir &lt;a href=\"https://github.com/schwabe/ics-openvpn/issues/34\"&gt;issue #34&lt;/a&gt;</string>
+ <string name="vpn_tethering_title">VPN et Partage</string>
+ <string name="connection_retries">Tentatives de connexion</string>
+ <string name="reconnection_settings">Paramètres de reconnexion</string>
+ <string name="connectretrymessage">Nombre de secondes entre chaque tentatives de connexion.</string>
+ <string name="connectretrywait">Nombre de secondes entre deux connexions</string>
+ <string name="minidump_generated">OpenVPN a planté de façon inattendue. Veuillez envisager d\'utiliser l\'option Minidump dans le menu principal</string>
<string name="send_minidump">Envoyer le Minidump au développeur</string>
- <string name="send_minidump_summary">Envoyer les informations de débogage à propos du dernier accident au développeur</string>
+ <string name="send_minidump_summary">Envoie les informations sur le dernier crash au développeur</string>
<string name="notifcation_title">OpenVPN - %s</string>
<string name="session_ipv4string">%1$s - %2$s</string>
<string name="session_ipv6string">%1$s - %3$s, %2$s</string>
@@ -242,23 +242,22 @@ Sur certaines images, cette notification joue un son.\nAndroid à introduit ces
<string name="state_wait">En attente de la réponse du serveur</string>
<string name="state_auth">Authentification</string>
<string name="state_get_config">Obtention de la configuration du client</string>
- <string name="state_assign_ip">Attribution de l\'adresses IP</string>
+ <string name="state_assign_ip">Attribution des adresses IP</string>
<string name="state_add_routes">Ajout des routes</string>
<string name="state_connected">Connecté</string>
<string name="state_disconnected">Déconnecter</string>
<string name="state_reconnecting">Reconnexion</string>
<string name="state_exiting">Fermeture</string>
- <string name="state_noprocess">Eteint</string>
+ <string name="state_noprocess">Éteint</string>
<string name="state_resolve">Résolution des noms d\'hôtes</string>
<string name="state_tcp_connect">Connexion (TCP)</string>
- <string name="state_auth_failed">Echec de l\'authentification</string>
+ <string name="state_auth_failed">Authentification échouée</string>
<string name="state_nonetwork">En attente d\'un réseau utilisable</string>
- <string name="statusline_bytecount">↓%2$s/s %1$s - ↑%4$s/s %3$s</string>
<string name="notifcation_title_notconnect">Non connecté</string>
<string name="start_vpn_title">Connexion au VPN %s</string>
<string name="start_vpn_ticker">Connexion au VPN %s</string>
<string name="jelly_keystore_alphanumeric_bug">Certaines versions d\'Android 4.1 rencontrent des problèmes si le nom du certificat du trousseau de clé contient des caractères non alphanumériques (comme des espaces, des caractères de soulignement ou des tirets). Essayez de réimporter le certificat sans caractères spéciaux</string>
- <string name="encryption_cipher">Chiffrement de cryptage</string>
+ <string name="encryption_cipher">Algorithme de chiffrement</string>
<string name="packet_auth">Authentification des paquets</string>
<string name="auth_dialog_title">Méthode d\'authentification des paquets</string>
<string name="built_by">compilé par %s</string>
@@ -272,23 +271,23 @@ Sur certaines images, cette notification joue un son.\nAndroid à introduit ces
<string name="remotetlsnote">La configuration que vous avez importée utilise l\'option désuette tls-remote qui utilise un format de DN différent.</string>
<string name="rdn">RDN (nom commun)</string>
<string name="rdn_prefix">Préfixe RDN</string>
- <string name="tls_remote_deprecated">tl-remote (OBSOLETE)</string>
+ <string name="tls_remote_deprecated">tls-remote (OBSOLÈTE)</string>
<string name="help_translate">Vous pouvez aider à traduire en visitant http://crowdin.net/project/ics-openvpn/invite</string>
<string name="prompt">%1$s essais de controler %2$s</string>
<string name="remote_warning">En poursuivant vous donnez la permission a l\'application de contrôler complètement OpenVPN pour Android et d\'intercepter tout le trafic réseau.<b>N\'acceptez que si vous faite confiance à l\'application.</b> Sinon vous vous exposez au risque de voir vos données compromises par un logiciel malveillant.\"</string>
<string name="remote_trust">Faire confiance à cette application.</string>
<string name="no_external_app_allowed">Aucune application n\'est autorisée à utiliser l\'API externe</string>
- <string name="allowed_apps">Applications autorisées: %s</string>
- <string name="clearappsdialog">Effacer la liste des appli. externes?\nListe des appli. autorisées:\n\n%s</string>
- <string name="screenoff_summary">\"Mettre le VPN en pause lorsque l\'écran est éteint et moins de 64ko de données sont transférées dans les 60s. Lorsque l\'option \"Persistance Tun\" est activée, la pause laissera votre appareil SANS connectivité réseau. Sans l\'option \"Persistance Tun\" le dispositif n\'aura pas connexion/protection VPN.</string>
- <string name="screenoff_title">Mettre la connection VPN en pause à l\'exctinction de l\'écran</string>
- <string name="screenoff_pause">Connexion en pause quand l\'écran est éteint : moins de %1$s en %2$ss</string>
- <string name="screen_nopersistenttun">Attention: tun persistant pas activé pour ce VPN. Le trafic utilisera la connexion Internet normale lorsque l\'écran est éteint.</string>
+ <string name="allowed_apps">Applications autorisées : %s</string>
+ <string name="clearappsdialog">Effacer la liste des applications externes ?\nListe des applications autorisées :\n\n%s</string>
+ <string name="screenoff_summary">Suspendre le VPN lorsque l\'écran est éteint et moins de 64ko de données sont transférées en 60s. Lorsque l\'option \"Persistance Tun\" est activée, la pause laissera votre appareil SANS connectivité réseau. Sans l\'option \"Persistance Tun\" l\'appareil n\'aura pas de connexion/protection VPN.</string>
+ <string name="screenoff_title">Suspendre la connexion VPN après écran éteint</string>
+ <string name="screenoff_pause">Connexion suspendu quand l\'écran est éteint : moins de %1$s en %2$ss</string>
+ <string name="screen_nopersistenttun">Attention : tun persistant pas activé pour ce VPN. Le trafic utilisera la connexion Internet normale lorsque l\'écran est éteint.</string>
<string name="save_password">Enregistrer le mot de passe</string>
- <string name="pauseVPN">Pause du VPN</string>
+ <string name="pauseVPN">Suspendre VPN</string>
<string name="resumevpn">Reprendre VPN</string>
- <string name="state_userpause">Pause du VPN demandé par l\'utilisateur</string>
- <string name="state_screenoff">VPN en pause - écran eteint</string>
+ <string name="state_userpause">VPN suspendu sur demande de l\'utilisateur</string>
+ <string name="state_screenoff">VPN suspendu - écran éteint</string>
<string name="device_specific">Hacks spécifiques à l\'appareil</string>
<string name="cannotparsecert">Ne peut pas afficher les informations de certificat</string>
<string name="appbehaviour">Comportement de l\'application</string>
@@ -297,9 +296,9 @@ Sur certaines images, cette notification joue un son.\nAndroid à introduit ces
<string name="hwkeychain">Clés du matériel :</string>
<string name="permission_icon_app">Icône de l\'application qui essaie d\'utiliser OpenVPN for Android</string>
<string name="faq_vpndialog43">"À partir d\'Android 4.3 la confirmation VPN est gardée contre les \"applications recouvrante\". Cela se traduit par la boîte de dialogue qui ne réagi pas à la saisie tactile. Si vous avez une application qui utilise des superpositions, elle peut causer ce comportement. Si vous trouvez une application délinquante contacter l\'auteur de l\'application. Ce problème affecte toutes les applications VPN sur Android 4.3 et plus. Voir aussi &lt;a href=\"http://code.google.com/p/ics-openvpn/issues/detail?id=185\"&gt;Issue 185&lt;a&gt; pour plus de détails"</string>
- <string name="faq_vpndialog43_title">Dialogue de confirmation du VPN sur Android 4,3 et plus</string>
- <string name="donatePlayStore">Sinon, vous pouvez m\'envoyer un don avec le Play Store :</string>
- <string name="thanks_for_donation">Merci pour le don %s!</string>
+ <string name="faq_vpndialog43_title">Fenêtre de confirmation du VPN</string>
+ <string name="donatePlayStore">Sinon vous pouvez m\'envoyer un don via le Play Store :</string>
+ <string name="thanks_for_donation">Merci pour le don %s !</string>
<string name="logCleared">Journal effacé.</string>
<string name="show_password">Afficher le mot de passe</string>
<string name="keyChainAccessError">Erreur d\'accès de KeyChain : %s</string>
@@ -312,7 +311,7 @@ Sur certaines images, cette notification joue un son.\nAndroid à introduit ces
<string name="vpn_status">État VPN</string>
<string name="logview_options">Options d\'affichage</string>
<string name="unhandled_exception">Exception non gérée : %1$s\n\n%2$s</string>
- <string name="unhandled_exception_context">%3$s: %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">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>
@@ -324,31 +323,95 @@ Sur certaines images, cette notification joue un son.\nAndroid à introduit ces
<string name="import_log">Journal d\'importation :</string>
<string name="ip_looks_like_subnet">Topologie VPN «%3$s » spécifiée mais ifconfig %1$s %2$s ressemble plus à une adresse IP avec un masque de réseau. On suppose que la topologie « sous-réseau » est utilisée.</string>
<string name="mssfix_invalid_value">La valeur de mssfix doit être un entier compris entre 0 et 9000</string>
- <string name="mssfix_value_dialog">Announce to TCP sessions running over the tunnel that they should limit their send packet sizes such that after OpenVPN has encapsulated them, the resulting UDP packet size that OpenVPN sends to its peer will not exceed this number of bytes. (default is 1450)</string>
- <string name="mssfix_checkbox">Override MSS value of TCP payload</string>
- <string name="mssfix_dialogtitle">Set MSS of TCP payload</string>
+ <string name="mssfix_value_dialog">Annoncer aux sessions TCP en cours d\'exécution sur le tunnel qu\'ils devraient limiter leurs tailles de paquets d\'émission de telle sorte qu\'après OpenVPN les a encapsulé, la taille des paquets UDP résultant que OpenVPN envoie à son homologue ne dépassera pas ce nombre d\'octets. (Valeur par défaut est 1450)</string>
+ <string name="mssfix_checkbox">Remplacer la valeur MSS de TCP payload</string>
+ <string name="mssfix_dialogtitle">Définir MSS de TCP payload</string>
<string name="client_behaviour">Comportement du client</string>
- <string name="clear_external_apps">Clear allowed external apps</string>
+ <string name="clear_external_apps">Effacer applications externes autorisées</string>
<string name="loading">Chargement&#8230;</string>
- <string name="allowed_vpn_apps_info">Allowed VPN apps: %1$s</string>
- <string name="disallowed_vpn_apps_info">Disallowed VPN apps: %1$s</string>
- <string name="app_no_longer_exists">Package %s is no longer installed, removing it from app allow/disallow list</string>
- <string name="vpn_disallow_radio">VPN is used for all apps but exclude selected</string>
- <string name="vpn_allow_radio">VPN is used for only for selected apps</string>
- <string name="query_delete_remote">Remove remote server entry?</string>
+ <string name="allowed_vpn_apps_info">Applications VPN autorisées : %1$s</string>
+ <string name="disallowed_vpn_apps_info">Applications VPN refusées : %1$s</string>
+ <string name="app_no_longer_exists">Application %s désinstallée, retirée de la liste des applications autorisées/refusées</string>
+ <string name="vpn_disallow_radio">VPN est utilisé pour toutes les applications mais exclut les sélectionnées</string>
+ <string name="vpn_allow_radio">VPN est utilisé uniquement pour les applications sélectionnées</string>
+ <string name="query_delete_remote">Supprimer l\'entrée du serveur distant ?</string>
<string name="keep">Garder</string>
<string name="delete">Supprimer</string>
- <string name="add_remote">Add new remote</string>
- <string name="remote_random">Use connection entries in random order on connect</string>
- <string name="remote_no_server_selected">You need to define and enable at least one remote server.</string>
+ <string name="add_remote">Ajouter nouveau serveur distant</string>
+ <string name="remote_random">Utiliser les entrées de connexion dans un ordre aléatoire à la connexion</string>
+ <string name="remote_no_server_selected">Vous devez définir et activer au moins un serveur distant.</string>
<string name="server_list">Liste des serveurs</string>
- <string name="vpn_allowed_apps">Allowed Apps</string>
+ <string name="vpn_allowed_apps">Applications autorisées</string>
<string name="advanced_settings">Paramètres avancés</string>
- <string name="payload_options">Payload options</string>
+ <string name="payload_options">Options Payload</string>
<string name="tls_settings">Paramètres TLS</string>
- <string name="no_remote_defined">No remote defined</string>
+ <string name="no_remote_defined">Aucun serveur distant défini</string>
<string name="duplicate_vpn">Dupliquer le profil VPN</string>
- <string name="duplicate_profile_title">Duplicating profile: %s</string>
+ <string name="duplicate_profile_title">Duplication de profil : %s</string>
<string name="show_log">Afficher le journal</string>
<string name="faq_android_clients">Il existe plusieurs clients OpenVPN pour Android. Les plus communs sont OpenVPN for Android (ce client), OpenVPN Connect, et OpenVPN Settings..&lt;p&gt;Les clients peuvent êtres regroupés en 2 groupes : OpenVPN for Android et OpenVPN Connect utilisent le service API officiel de VPNService (Android 4.0+) et ne nécessitent pas une élévation des privilèges (rootage), puis OpenVPN Settings qui nécessite le rootage.&lt;p&gt;OpenVPN for Android et un client « open source » développé par Arne Schwabe. Il est destiné aux utilisateurs avancés et comprend plusieurs paramètres, ainsi que la possibilité d\'importer les profils depuis des fichiers et de les configurer/changer à partir de l\'application. Le client est basé sur la version communautaire d\'OpenVPN. Il est basé sur le code source d\'OpenVPN 2.x. Ce client peut-être considérer en étant la version semi-officielle de la communauté.&lt;p&gt;OpenVPN Connect est un logiciel propriétaire développé par OpenVPN Technologies, Inc. Le client est destiné aux utilisateurs avec une connaissance moyenne et offre la possibilité d\'importer les profils OpenVPN. Ce client est basé sur une nouvelle réalisation du protocole OpenVPN C++ (ceci était nécessaire afin de permettre à OpenVPN Technologies, Inc. de publier une version iOS de l\'application OpenVPN). Ce client est le client officiel des technologies OpenVPN&lt;p&gt;OpenVPN Settings est le client le plus ancien et agit comme l\'interface utilisateur de la version « open source » d\'OpenVPN. Contrairement à OpenVPN for Android il ne nécessite pas le rootage et ne se sert pas du service API de VPNService. Il ne dépend pas sur Android 4.0+</string>
+ <string name="faq_androids_clients_title">Différences entre les clients OpenVPN Android</string>
+ <string name="ignore_multicast_route">Ignorer la route multidiffusion : %s</string>
+ <string name="ab_only_cidr">Android ne prend en charge que les routes CIDR vers VPN. Étant donné que les routes non-CIDR ne sont pratiquement jamais utilisées, OpenVPN pour Android utilisera un /32 pour les routes ne sont pas CIDR et émettre un avertissement.</string>
+ <string name="ab_tethering_44">Le partage fonctionne tandis que le VPN est actif. La connexion partagée n\'utilisera pas le VPN.</string>
+ <string name="ab_kitkat_mss">Les versions antérieures à KitKat définissent une valeur MSS erronée (#61948). Essayez d\'activer l\'option mssfix pour contourner ce bug.</string>
+ <string name="ab_proxy">Android va continuer à utiliser vos paramètres de proxy spécifiés pour la connexion mobile / Wi-Fi lorsque aucun serveur DNS n\'est définis. OpenVPN pour Android vous avertira à ce sujet dans le log.<p>Quand un VPN définit un serveur de DNS, Android n\'utilisera pas de proxy. Il n\'y a pas d\'API pour définir un proxy pour un connection VPN.</p></string>
+ <string name="ab_lollipop_reinstall">Les applications VPN peuvent s\'arrêter de fonctionner lors d\'une désinstallation suivie d\'une réinstallation. Pour plus de détails, voir #80074</string>
+ <string name="ab_not_route_to_vpn">L\'adresse IP du client, et les adresses IP de ce réseau ne sont pas routées par le VPN. OpenVPN contourne ce problème en ajoutant une route qui corresponds à l’adresse IP et le Masque de sous réseau du client</string>
+ <string name="ab_secondary_users">Le VPN ne fonctionnera pas du tout pour tous les utilisateurs secondaires.</string>
+ <string name="ab_kitkat_reconnect">"Plusieurs utilisateurs ont signalés des prêtes de paquets durant l\'utilisation d\'un VPN sur leur connexion mobile. Ce comportement semble lier à certains fournisseurs, il n\'y a pas de contournement connu ou de bug que l\'on puisse régler."</string>
+ <string name="ab_only_cidr_title">Routes non CIDR</string>
+ <string name="ab_proxy_title">Comportement proxy pour les VPN</string>
+ <string name="ab_lollipop_reinstall_title">Réinstallation des applications VPN</string>
+ <string name="version_upto">%s et antérieur</string>
+ <string name="copy_of_profile">Copie de %s</string>
+ <string name="ab_not_route_to_vpn_title">Route vers l\'adresse IP configurée</string>
+ <string name="ab_kitkat_mss_title">Valeur MSS erronée pour la connexion VPN</string>
+ <string name="ab_secondary_users_title">Utilisateurs de tablettes secondaires</string>
+ <string name="custom_connection_options_warng">Spécifiez la connexion et les options personnalisés. À utiliser avec précaution</string>
+ <string name="custom_connection_options">Options personnalisées</string>
+ <string name="remove_connection_entry">Supprimer entrée de connexion</string>
+ <string name="ab_kitkat_reconnect_title">Déconnexion aléatoire du réseau mobile</string>
+ <string name="ab_vpn_reachability_44_title">Réseau distant injoignable</string>
+ <string name="ab_persist_tun_title">Mode tun persistant</string>
+ <string name="version_and_later">%s et ultérieur</string>
+ <string name="tls_cipher_alert_title">Échec de la connexion avec l\'erreur SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure</string>
+ <string name="message_no_user_edit">Ce profil a été ajouté à partir d\'une application externe (%s) et a été marqué comme non modifiable par l\'utilisateur.</string>
+ <string name="crl_file">Liste des certificats révoqués</string>
+ <string name="service_restarted">Redémarrage du service OpenVPN (l\'Application a probablement plantée ou a été tué pour cause d\'utilisation excessive de la mémoire)</string>
+ <string name="import_config_error">L\'importation de la configuration a abouti à une erreur, l\'enregistrement est impossible</string>
+ <string name="Search">Rechercher</string>
+ <string name="lastdumpdate">(Le dernier dump est vieux de %1$d:%2$d (du %3$s ))</string>
+ <string name="clear_log_on_connect">Effacer le journal sur une nouvelle connexion</string>
+ <string name="connect_timeout">Extinction de la connexion</string>
+ <string name="no_allowed_app">Aucune application n\'est autorisée. Il faut au minimum ajouter cette application (%s) afin d\'en autoriser au moins une. Cela évite d’autoriser toutes les autres applications inutilement</string>
+ <string name="query_permissions_sdcard">OpenVPN pour Android va essayer de chercher le(s) fichier(s) manquant(s) sur une sdcard. Tapoter cette fenêtre de dialogue va démarrer une demande d\'autorisation.</string>
+ <string name="protocol">Protocole</string>
+ <string name="enabled_connection_entry">Activé</string>
+ <string name="permission_revoked">Autorisation de VPN révoquée par le système d\'exploitation (ex : un autre programme VPN est lancé), arrêt du VPN</string>
+ <string name="pushpeerinfo">Envoyer plus d\'infos</string>
+ <string name="pushpeerinfosummary">Envoyer des informations supplémentaires sur le serveur, par exemple la version SSL et la version Android</string>
+ <string name="pw_request_dialog_title">Besoin de %1$s</string>
+ <string name="pw_request_dialog_prompt">Veuillez entrer le mot de passe pour le profil %1$s</string>
+ <string name="menu_use_inline_data">Utiliser données en ligne</string>
+ <string name="export_config_chooser_title">Exporter le fichier de configuration</string>
+ <string name="missing_tlsauth">Fichier tls-auth manquant</string>
+ <string name="missing_certificates">Le certificat ou le fichier de clé de l\'utilisateur est manquant</string>
+ <string name="missing_ca_certificate">Certificat CA manquant</string>
+ <string name="crl_title">Liste des certificats révoqués (facultatif)</string>
+ <string name="reread_log">Relire (%d) éléments du fichier de log</string>
+ <string name="samsung_broken_title">Téléphones Samsung</string>
+ <string name="novpn_selected">Aucun VPN sélectionné.</string>
+ <string name="reconnect">Reconnecter</string>
+ <string name="qs_title">Activer VPN</string>
+ <string name="qs_connect">Connecter à %s</string>
+ <string name="qs_disconnect">Déconnecter %s</string>
+ <string name="connectretrymaxmessage">Entrez le temps maximum entre les tentatives de connexion. OpenVPN va lentement augmenter son temps d\'attente après une tentative de connexion infructueuse jusqu\'à atteindre cette valeur. Par défaut, 300sec.</string>
+ <string name="connectretrymaxtitle">Temps maximum entre les tentatives de connexion</string>
+ <string name="state_waitconnectretry">%s secondes avant la prochaine tentative de connexion</string>
+ <string name="management_socket_closed">Connexion à OpenVPN fermé (%s)</string>
+ <string name="change_sorting">Changer de tri</string>
+ <string name="sort">Trier</string>
+ <string name="sorted_lru">Profils triés par dernier récemment utilisé</string>
+ <string name="sorted_az">Profils triés par nom</string>
</resources>
diff --git a/app/src/main/res/values-hu/plurals-icsopenvpn.xml b/app/src/main/res/values-hu/plurals-icsopenvpn.xml
new file mode 100755
index 00000000..a8ffc2ee
--- /dev/null
+++ b/app/src/main/res/values-hu/plurals-icsopenvpn.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Generated by crowdin.com-->
+<resources>
+ <plurals name="months_left">
+ <item quantity="one">Egy hónap van hátra</item>
+ <item quantity="other">%d hónap van hátra</item>
+ </plurals>
+ <plurals name="days_left">
+ <item quantity="one">Egy nap van hátra</item>
+ <item quantity="other">%d nap van hátra</item>
+ </plurals>
+ <plurals name="hours_left">
+ <item quantity="one">Egy óra van hátra</item>
+ <item quantity="other">%d óra van hátra</item>
+ </plurals>
+ <plurals name="minutes_left">
+ <item quantity="one">Egy perc van hátra</item>
+ <item quantity="other">%d perc van hátra</item>
+ </plurals>
+</resources>
diff --git a/app/src/main/res/values-hu/strings-icsopenvpn.xml b/app/src/main/res/values-hu/strings-icsopenvpn.xml
index dd07abdb..a1db366c 100755
--- a/app/src/main/res/values-hu/strings-icsopenvpn.xml
+++ b/app/src/main/res/values-hu/strings-icsopenvpn.xml
@@ -41,16 +41,17 @@
<string name="configure_the_vpn">A VPN beállítása</string>
<string name="menu_add_profile">Profil hozzáadása</string>
<string name="add_profile_name_prompt">Adja meg az új Profil nevét</string>
- <string name="duplicate_profile_name">Kérlek, egyedi profilnevet válassz magadnak</string>
+ <string name="duplicate_profile_name">Kérem, egyedi profilnevet válasszon</string>
<string name="profilename">Profil név</string>
- <string name="no_keystore_cert_selected">Válassz egy felhasználói tanúsítványt</string>
- <string name="no_error_found">hiba nem található</string>
+ <string name="no_keystore_cert_selected">Válasszon egy felhasználói tanúsítványt</string>
+ <string name="no_ca_cert_selected">Ki kell választania egy CA tanúsítványt</string>
+ <string name="no_error_found">Hiba nem található</string>
<string name="config_error_found">Hiba a beállításokban</string>
<string name="ipv4_format_error">Hiba az IPv4 cím elemzésekor</string>
<string name="custom_route_format_error">Hiba az egyéni útvonalak elemzésekor</string>
- <string name="pw_query_hint">(a lekérdezés igénye szerint hagyja üresen)</string>
+ <string name="pw_query_hint">(hagyja üresen esetenkénti bekéréshez)</string>
<string name="vpn_shortcut">OpenVPN parancsikon</string>
- <string name="vpn_launch_title">Csatlakozás a VPN-hez</string>
+ <string name="vpn_launch_title">Csatlakozás a VPN-hez&#8230;</string>
<string name="shortcut_profile_notfound">A parancsikonban kiválasztott Profil nem létezik</string>
<string name="random_host_prefix">Véletlen Host Prefix</string>
<string name="random_host_summary">6 random karakter hozzáadása a hosztnév elejére</string>
@@ -62,7 +63,7 @@
<string name="clear_log">napló 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="remove_vpn">VPN 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>
<string name="check_remote_tlscert_title">TLS server tanúsítvány megkövetelése</string>
<string name="remote_tlscn_check_summary">Ellenőrzi a Távoli Kiszolgáló Tanúsítvány Subject DN mezőt</string>
@@ -78,28 +79,28 @@
<string name="override_dns">A kiszolgálótól kapott DNS Beállítások felülbírálása</string>
<string name="dns_override_summary">Saját DNS Szerverek használata</string>
<string name="searchdomain">searchDomain</string>
- <string name="dns1_summary">a használatban levő DNS-kiszolgáló.</string>
- <string name="dns_server">DNS szerver</string>
- <string name="secondary_dns_message">A másodlagos DNS-kiszolgáló használható, ha a normál DNS-kiszolgáló nem érhető el.</string>
- <string name="backup_dns">tartalék DNS szerver</string>
+ <string name="dns1_summary">Használni kívánt DNS kiszolgáló.</string>
+ <string name="dns_server">DNS kiszolgáló</string>
+ <string name="secondary_dns_message">Másodlagos DNS kiszolgáló használata, ha a normál DNS-kiszolgáló nem érhető el.</string>
+ <string name="backup_dns">Tartalék DNS kiszolgáló</string>
<string name="ignored_pushed_routes">Push-olt útvonalak figyelmen kívül hagyása</string>
<string name="ignore_routes_summary">A szerver által push-olt útvonalak figyelmen kívül hagyása.</string>
<string name="default_route_summary">A teljes forgalom átirányítása a VPN-re</string>
- <string name="use_default_title">használja az alapértelmezett útvonalat</string>
+ <string name="use_default_title">Alapértelmezett útvonal használata</string>
<string name="custom_route_message">Egyéni útvonalak megadása. A célt csak CIDR formátumban adja meg. \"10.0.0.0/8 2002::/16\" átirányítaná a 10.0.0.0/8 és 2002::/16 hálózatokat a VPN-en.</string>
<string name="custom_route_message_excluded">Útvonalak amikek nem a VPN-en át kell route-olni.</string>
<string name="custom_routes_title">Egyéni útvonalak</string>
<string name="custom_routes_title_excluded">Hálózat kivételek</string>
<string name="log_verbosity_level">Napló részletességi szint</string>
<string name="float_summary">Hitelesített csomagok engedélyezése minden IP-ről</string>
- <string name="float_title">Lebegő szerver engedélyezése</string>
+ <string name="float_title">Lebegő kiszolgáló engedélyezése</string>
<string name="custom_options_title">Egyéni beállítások</string>
<string name="edit_vpn">VPN-beállítások szerkesztése</string>
<string name="remove_vpn_query">\'%s\' VPN Profil eltávolítása?</string>
<string name="tun_error_helpful">Néhány egyedi ICS image-en a /dev/tun hozzáférési jogai rosszak lehetnek, vagy a tun modul teljesen hiányzik. CM9 imagek-en próbálja a fix tulajdonos opciót az általános beállításokban</string>
<string name="tun_open_error">Nem sikerült megnyitni a tun interfészt</string>
- <string name="error">"Hiba:"</string>
- <string name="clear">töröl</string>
+ <string name="error">"Hiba: "</string>
+ <string name="clear">Töröl</string>
<string name="last_openvpn_tun_config">tun interfész megnyitása:</string>
<string name="local_ip_info">Helyi IPv4: %1$s/%2$d IPv6: %3$s MTU: %4$d</string>
<string name="dns_server_info">DNS Szerver: %1$s, Domain: %2$s</string>
@@ -112,7 +113,7 @@
<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">küld</string>
+ <string name="send">Küldés</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>
<string name="tap_mode">Tap mód</string>
@@ -120,7 +121,7 @@
<string name="tap_faq2">Megint? Viccelsz? Nem, a tap mód tényleg nem támogatott és további levelek küldése hogy támogatott lesz-e sem fog segíteni.</string>
<string name="tap_faq3">Harmadszor is? Tulajdonképpen lehetne írni egy tap emulátort a tun alapján ami képes layer2 adatokat is küldeni és fogadni, de ennek a tap emulátornak implementálnia kell ARP-t és lehetőleg egy DHCP klienst is. Nem tudok róla, hogy bárki is ezen az irányon dolgozna. Ha lenne kedve ilyet kódolni, lépjen kapcsolatba velem.</string>
<string name="faq">GYIK</string>
- <string name="copying_log_entries">naplóbejegyzések másolása</string>
+ <string name="copying_log_entries">Naplóbejegyzések másolása</string>
<string name="faq_copying">Másoláshoz nyomja le és tartsa lenyomva a naplóbejegyzést. A teljes napló küldéséhez használja a Napló Küldése opciót. Használja a hardver menü gombot ha nem látható a GUI-ban.</string>
<string name="faq_shortcut">Parancsikon az indításhoz</string>
<string name="faq_howto_shortcut">Az asztalra helyezhet egy OpenVPN parancsikont. A képernyőkezelő programtól függően parancsikont vagy widget-et helyezhet el.</string>
@@ -149,6 +150,7 @@
<string name="no_bind">Nincs helyi bind</string>
<string name="import_configuration_file">Konfigurációs fájl importálása</string>
<string name="faq_security_title">Biztonsági szempontok</string>
+ <string name="faq_security">"Az OpenVPN biztonságérzékeny, ezért néhány megjegyzés indokolt. Az SD kártyán tárolt bármilyen adat eredendően nem biztonságos. Minden alkalmazás olvashatja (például ez a program sem kíván speciális SD kártya jogosultságokat). Az alkalmazás adait csak az alkalmazás önmaga képes olvasni. A cacert/cert/key fájl párbeszédablakban történő importálásával az adatok a VPN profilban tárolódnak. A VPN profil csak az alkalmazás által hozzáférhető. (Ne felejtse el törölni az SD kártyán tárolt másolatokat.) Az adatok nem titkosítottak, annak ellenére, hogy az adatok csak az alkalmazás számára hozzáférhetőek. A telefon root-olásával vagy egyéb exploit-olásával az adatok még mindig visszaállíthatóak lesznek. A pkcs12 fájlokat erősen ajánlott az android keystore-ba importálni."</string>
<string name="import_vpn">Import</string>
<string name="broken_image_cert_title">Hiba a tanúsítvány kiválasztása során</string>
<string name="broken_image_cert">Exception történt az Android 4.0+ tanúsítvány legördülő megjelenítésekor. Ennek sohasem szabad megtörténnie, mivel ez egy szavványos Android 4.0+ funkció. Lehet, hogy az Android ROM tanúsítványtár támogatása nem működik megfelelően</string>
@@ -158,15 +160,16 @@
<string name="converted_profile">importált profil</string>
<string name="converted_profile_i">%d profil importálva</string>
<string name="broken_images">Működésképtelen image-ek</string>
+ <string name="broken_images_faq">&lt;p&gt;A hivatalos HTC lemezképek köztudottan különös útvonal választási problémákat tartalmaznak, amik azt okozzák, hogy az adatforgalom nem a csatornán kereszül folyik (Lást &lt;a href=\"https://github.com/schwabe/ics-openvpn/issues/18\"&gt;Issue 18&lt;/a&gt; a bug tracker-ben.)&lt;/p&gt;&lt;p&gt;Régebbi hivatalos SONY Xperia Arc S és Xperia Ray lemezképekből jelentették, hogy a VPNService teljesen hiányzik. (Lásd &lt;a href=\"https://github.com/schwabe/ics-openvpn/issues/29\"&gt;Issue 29&lt;/a&gt; a bug tracker-ben.)&lt;/p&gt;&lt;p&gt;Egyedi fordítású lemezképekben a tun modul hiányozhat vagy a /dev/tun hozzáférési joga lehet nem megfelelő. Néhány CM9 lemezképnél szükséges a \"Fix ownership\" opció engedélyezése a \"Device specific hacks\" alatt.&lt;/p&gt;&lt;p&gt;Legfontosabb: Ha az eszköz Android lemezképe sérült, jelezze a gyártónál. Minél több ember jelent egy esetet a gyártónál, annál esélyesebb hogy javítani fogja.&lt;/p&gt;</string>
<string name="pkcs12_file_encryption_key">PKCS12 Fájltitkosítási kulcs</string>
<string name="private_key_password">Privát kulcs jelszó</string>
<string name="password">Jelszó</string>
- <string name="file_icon">fájlikon</string>
- <string name="tls_authentication">TLS hitelesítés</string>
+ <string name="file_icon">fájl ikon</string>
+ <string name="tls_authentication">TLS hitelesítés / titkosítás</string>
<string name="generated_config">Generált konfiguráció</string>
<string name="generalsettings">Beállítások</string>
<string name="owner_fix_summary">/dev/tun tulajdonosának beállítása. Néhány CM9 image-hez ez kell, hogy a VPNService API működjön. Root szükséges.</string>
- <string name="owner_fix">Fix tulajdonos a /dev/tun-hoz</string>
+ <string name="owner_fix">/dev/tun tulajdonos javítása</string>
<string name="generated_config_summary">Generált OpenVPN konfigurációs fájl megmutatása</string>
<string name="edit_profile_title">\"%s\" szerkesztése</string>
<string name="building_configration">Konfiguráció felépítése&#8230;</string>
@@ -178,9 +181,11 @@
<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">%10$s %9$s futtatva %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">Hiba az Android keystore %1$s: %2$s kulccsal való belépéskor</string>
+ <string name="faq_system_dialogs">A VPN csatlakozás figyelmeztetés azt jelzi, hogy ez az alkalmazás a rendszer általi teljes forgalmat lehallgathatja a VPNService API visszaélések elkerülése érdekében.\nA VPN csatlakozás értesítés (A kulcs szimbólum) is az Android rendszer jelzése egy kimenő VPN kapcsolatról. Néhány lemezképen ez az értesítés hangot is lejátszik.\nAz android az ön biztonsága érdekében vezette be ezeket a rendszer értesítéseket, és gondoskodott arról, hogy ne lehessen megkerülni. (Néhány lemezképen ez sajnos értesítési hangot is tartalmaz.)</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>
+ <string name="translationby">A magyar fordítást készítették: kisjuhos, hd_adam, tomygee, Floo19, PettyBlue, ha1dfo</string>
<string name="ipdns">IP és DNS</string>
<string name="basic">Alapvető</string>
<string name="routing">Útválasztás</string>
@@ -190,6 +195,7 @@
<string name="warn_no_dns">Nincsenek DNS szerverek használatban. A névfeloldás nem működik. Fontolja meg az egyéni DNS szerverek beállítását. Kérjük, vegye figyelembe, hogy az Android továbbra is ugyanazokat a proxy beállításokat fogja használni a mobil/WiFi csatlakozáshoz, mint amit a DNS szerverek megadása előtt.</string>
<string name="dns_add_error">Nem lehet hozzáadni a %1$s DNS szervert, a rendszer elutasította: %2$s</string>
<string name="ip_add_error">A \"%1$s\" IP címet nem lehet konfigurálni, a rendszer elutasította: %2$s</string>
+ <string name="faq_howto">&lt;p&gt;Szerezzen be működő konfigurációt (számítógépen tesztelje vagy töltse le a szolgáltatótól/szervezettől)&lt;/p&gt;&lt;p&gt;Ha ez egyetlen fájl extra pem/pkcs12 fájlok nélkül, akkor küldje el önmagának email-ben és nyissa meg a csatolmányt. Ha több fájl akkor másolja az SD kártyára.&lt;/p&gt;&lt;p&gt;Kattintson az email csatolmányra/Használja a mappa ikont a VPN listában az importáláshoz&lt;/p&gt;&lt;p&gt;Ha hibaüzenetet kap hiányzó fájlokról, másolja azokat is az SD kártyára.&lt;/p&gt;&lt;p&gt;Kattintson a mentés szimbólumra az importált VPN kapcsolat VPN listához adásához&lt;/p&gt;&lt;p&gt;Csatlakozzon a VPN-hez a VPN nevére kattintva&lt;/p&gt;&lt;p&gt;Ha hiba- vagy figyelmeztető üzenetek vannak a log-ban, próbálja meg értelmezni és kijavítani őket. &lt;/p&gt; </string>
<string name="faq_howto_title">Quick Start</string>
<string name="setting_loadtun_summary">Próbálja meg betölteni a tun.ko kernel modult mielőtt megpróbál csatlakozni. Root-olt eszköz szükséges.</string>
<string name="setting_loadtun">Tun modul betöltése</string>
@@ -198,24 +204,28 @@
<string name="using_proxy">Proxy használatban: %1$s %2$d</string>
<string name="use_system_proxy">Rendszerproxy használata</string>
<string name="use_system_proxy_summary">Rendszerszintű konfiguráció használata a HTTP/HTTPS proxy csatlakozáshoz.</string>
- <string name="donatewithpaypal">&lt;a href=\"https://www.paypal.com/cgi-bin/webscr?hosted_button_id=R2M6ZP9AF25LS&amp;amp;cmd=_s-xclick\"&gt;Adakozhat PayPal-al&lt;/a&gt; </string>
- <string name="onbootrestartsummary">Az OpenVPN újracsatlakozik a VPN-hez ha az aktív volt az újraindításkoz/leállításkor.</string>
- <string name="onbootrestart">Újracsatlakozás újraindításkor</string>
- <string name="ignore">Hagyja figyelmen kívül</string>
+ <string name="onbootrestartsummary">Az OpenVPN csatlakozni fog a VPN-hez, ha az a rendszer indulásakor aktív. Kérem, olvassa el a csatlakozás figyelmeztető GYIK-et mielőtt ezt az opciót Android &lt; 5.0-n használná.</string>
+ <string name="onbootrestart">Csatlakozás rendszerindításkor</string>
+ <string name="ignore">Figyelmen kívül hagy</string>
<string name="restart">Újraindítás</string>
<string name="restart_vpn_after_change">A konfiguráció változások a VPN újraindítása után lépnek életbe. (Újra)indítja most a VPN-t?</string>
<string name="configuration_changed">A konfiguráció megváltozott</string>
<string name="log_no_last_vpn">A legutóbb csatlakozott profil nem található</string>
+ <string name="faq_duplicate_notification_title">Kettőzött értesítések</string>
+ <string name="faq_duplicate_notification">Ha az Android rendszer memória (RAM) kényszer alatt áll, alkalmazások és szolgáltatások amik pillanatnyilag nem szükségesek el lesznek távolítva az aktív memóriából. Ez lezárja a folyamatban levő VPN kapcsolatot. A kapcsolat/OpenVPN túlélése érdekében a szolgáltatás magas prioritással fut. A magas prioritással való futáshoz az alkalmazásnak értesítést kell kijeleznie. A rendszer által mutatott kulcs értesítési ikonról az előző GYIK bejegyzésben olvashat. Ez nem az alkalmazás magas prioritással futásának értesítésére utal.</string>
<string name="no_vpn_profiles_defined">Nincsenek VPN profilok definiálva.</string>
<string name="add_new_vpn_hint">Használd az &lt;img src=\"ic_menu_add\"/&gt; ikont új VPN hozzáadásához</string>
<string name="vpn_import_hint">Használd az &lt;img src=\"ic_menu_archive\"/&gt; ikont egy SD-kártyán meglevő (.ovpn or .conf) profil importálásához.</string>
<string name="faq_hint">Tekintse meg a FAQ-ot. Ott van egy a kezdeti lépéseket segítő leírás.</string>
<string name="faq_routing_title">Routing/Interfész Beállítás</string>
+ <string name="faq_routing">Az útválasztás és interfész konfiguráció nem a hagyományos ifconfig/route parancsokkal történik, hanem a VPNService API használatával. Ez különböző útválasztási konfigurációhoz vezet más operációs rendszereken.\nA VPN csatorna konfigurációja az IP címből és a hálózatokból áll, amelyek útvonala ezen az interfészen keresztül kell vezessen. Tekintettel, hogy peer partner cím vagy átjáró megadása nem szükséges. A VPN szerver eléréséhez szükséges speciális útvonalak (például amik redirect-gateway használatakor vannak hozzáadva) megadása sem szükséges. Az alkalmazás ezeket logikusan figyelmen kívül fogja hagyni a beállítások importálása során. Az alkalmazás a VPNService API által biztosítja, hogy a szerverhez történő csatlakozás ne a VPN csatornán át menjen.\nA VPNService API nem engedi azoknak a hálózatok a megadását, amiknek nem a VPN-en keresztül kellene menniük. Kerülőútként az alkalmazás megpróbálja meghatározni azokat a hálózatokat, amelyek útvonala nem VPN csatornán keresztül kellene haladjon (például x.x.x.x y.y.y.y net_gateway), kiszámolja és kizárja ezeket az útvonalakat, hogy más platformok viselkedését emulálja. Csatlakozási kísérletkor a log ablakban látható a VPNService konfiguráció.\nA színfalak mögött: az Android 4.4+ nem használ policy routing-ot. A route/ifconfig parancsok nem fogják megmutatni a létrehozott útvonalakat. Ehelyett használhatóak az ip rule, iptables -t mangle -L parancsok</string>
<string name="persisttun_summary">Ne térjen vissza VPN kapcsolat nélküli módba, amikor az OpenVPN újracsatlakozik.</string>
<string name="persistent_tun_title">Megmaradó tun</string>
<string name="openvpn_log">OpenVPN Napló</string>
<string name="import_config">OpenVPN konfiguráció importálása</string>
<string name="battery_consumption_title">Akkumulátor használat</string>
+ <string name="baterry_consumption">Személyes tesztjeim alapján a magas akkuhasználatot az OpenVPN keepalive csomagjai okozzák. A legtöbb OpenVPN szerver tartalmaz egy konfigurációs direktívát, mint \'keepalive 10 60\' ami a kliens és a szerver között minden 10 másodpercben keepalive csomagok cseréjét eredményezi. &lt;p&gt; Ezek ugyan kis csomagok és nem okoznak nagy adatforgalmat, de lefoglalják a mobil rádiós részét és ezáltal növelik az energia fogyasztást. (Lásd még &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; Ez a keepalive küldés nem változtatható a kliensben. Csak az OpenVPN rendszer adminisztrátor tudja megváltoztatni ezt a beállítást. &lt;p&gt; Sajnos 60 másodpercnél nagyobb keepalive használata UDP kapcsolatnál néhány NAT átjárónál a kapcsolat eldobását okozza inaktivitási időtúllépés miatt. Hosszú keepalive timeout működőképes lehet TCP kapcsolat esetén, de TCP csomagok TCP kapcsolatban tunnel-ezése extrém rossz minőségű kapcsolatot eredményezhet magas csomagvesztésű hálózatokon. (Lásd &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">Az Android internet megosztás funkció (WiFi-n, USB-n vagy Bluetooth-on) és a VPNService API (amit ez a program használ) nem működnek együtt. További részletekért lást &lt;a href=\"https://github.com/schwabe/ics-openvpn/issues/34\"&gt;issue #34&lt;/a&gt;</string>
<string name="vpn_tethering_title">VPN és Internetmegosztás</string>
<string name="connection_retries">Csatlakozás újrapróbálkozások</string>
<string name="reconnection_settings">Újracsatlakozás beállítások</string>
@@ -242,12 +252,11 @@
<string name="state_tcp_connect">Csatlakozás (TCP)</string>
<string name="state_auth_failed">Hitelesítési hiba</string>
<string name="state_nonetwork">Várakozás használható hálózatra</string>
- <string name="statusline_bytecount">↓%2$s/s %1$s - ↑%4$s/s %3$s</string>
<string name="notifcation_title_notconnect">Nincs kapcsolat</string>
- <string name="start_vpn_title">Csatlakozás VPN-hez %s</string>
- <string name="start_vpn_ticker">Csatlakozás VPN-hez %s</string>
+ <string name="start_vpn_title">Csatlakozás a %s VPN-hez</string>
+ <string name="start_vpn_ticker">Csatlakozás a %s VPN-hez</string>
<string name="jelly_keystore_alphanumeric_bug">Néhány Android 4.1-es verzió alatt problémába ütközhet ha a hitelesítési tanúsítvány nevében nem csak alfanumerikus karakterek szerepelnek (mint pl szóköz, alulvonás vagy kötőjel). Speciális karakterek nélkül próbálja újra importálni</string>
- <string name="encryption_cipher">Titkosítás</string>
+ <string name="encryption_cipher">Titkosítás rejtjelezé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="built_by">%s fordítóval</string>
@@ -262,18 +271,36 @@
<string name="rdn">RDN (közös név)</string>
<string name="rdn_prefix">RDN előtag</string>
<string name="tls_remote_deprecated">tls-remote (elavult)</string>
- <string name="help_translate">Segíthetsz fordítani ha meglátogatod http://crowdin.net/project/ics-openvpn/invite</string>
+ <string name="help_translate">Segíthetsz fordítani: http://crowdin.net/project/ics-openvpn/invite</string>
<string name="prompt">%1$s próbálkozás %2$s vezérlésre</string>
+ <string name="remote_warning">A folytatással engedélyt ad az alkalmazásnak, hogy teljes mértékben vezérelhesse az OpenVPN for Android-ot és lehallgathassa a teljes hálózati forgalmat.<b>NE fogadja el, ha nem bízik meg az alkalmazásban.</b> Különben azt kockáztatja, hogy az adatait rosszindulatú szoftver veszélyeztetheti.</string>
<string name="remote_trust">Megbízom ebben az alkalmazásban.</string>
<string name="no_external_app_allowed">Egy alkalmazás sem használhat külső API-t</string>
<string name="allowed_apps">Engedélyezett alkalmazások: %s</string>
<string name="clearappsdialog">Engedélyezett külső alkalmazások listájának törlése?\nAz engedélyezett alkalmazások aktuális listája:\n\n%s</string>
+ <string name="screenoff_summary">A VPN szünetel ha kikapcsolt képernyőnél 60 másodpercen belül kevesebb mint 64 kB az adatforgalom. Ha a \"Tartós Tun\" opció engedélyezve van, akkor a VPN szüneteltetése esetén az eszköznek nem lesz hálózati kapcsolata. \"Tartós Tun\" opció nélkül az eszköznek nem lesz VPN kapcsolata/védelme.</string>
<string name="screenoff_title">VPN kapcsolat szüneteltetése a képernyő lekapcsolása után</string>
<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="pauseVPN">VPN szüneteltetése</string>
+ <string name="resumevpn">VPN helyreállítása</string>
+ <string name="state_userpause">A felhasználó a VPN szüneteltetését kérte</string>
+ <string name="state_screenoff">VPN szüneteltetve - képernyő kikapcsolva</string>
+ <string name="device_specific">Eszköz specifikus Hack-ek</string>
+ <string name="cannotparsecert">Nem lehet megjeleníteni a tanúsítvány információit</string>
+ <string name="appbehaviour">Alkalmazás viselkedés</string>
+ <string name="vpnbehaviour">VPN viselkedés</string>
+ <string name="allow_vpn_changes">VPN Profilok megváltoztatásának engedélyezése</string>
+ <string name="hwkeychain">Hardver Kulcstár:</string>
+ <string name="permission_icon_app">Az alkalmazás ikonja megpróbálja használni az OpenVPN for Android-ot</string>
+ <string name="faq_vpndialog43">"Android 4.3-tól kezdve a VPN jóváhagyás védett az \"átlapoló alkalmazásoktól\". Ez azt eredményezi, hogy a párbeszéd ablak nem reagál érintésre. Ha olyan alkalmazást futtat, ami átlapolást használ az okozhatja ezt a viselkedést. Ha jogsértő alkalmazást észlel, lépjen kapcsolatba az alkalmazás szerzőjével. Ez a probléma minden VPN alkalmazást érint Android 4.3 és későbbi verziókon. Lásd &lt;a href=\"https://github.com/schwabe/ics-openvpn/issues/185\"&gt;Issue 185&lt;a&gt; további részletekért"</string>
+ <string name="faq_vpndialog43_title">VPN Megerősítés Dialógus</string>
+ <string name="donatePlayStore">Esetlegesen, küldhet nekem adományt a Play Store-ral:</string>
+ <string name="thanks_for_donation">Köszönöm az adományt %s!</string>
<string name="logCleared">Napló törölve.</string>
<string name="show_password">Jelszó mutatása</string>
+ <string name="keyChainAccessError">KeyChain Hozzáférési hiba: %s</string>
<string name="timestamp_short">Rövid</string>
<string name="timestamp_iso">ISO</string>
<string name="timestamps">Időbélyegzők</string>
@@ -283,25 +310,114 @@
<string name="vpn_status">Vpn állapot</string>
<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="unhandled_exception_context">%3$s: %1$s\n\n%2$s</string>
+ <string name="faq_system_dialog_xposed">Ha root-olta Android eszközét, akkor installálhatja a &lt;a href=\"http://xposed.info/\"&gt;Xposed framework&lt;/a&gt; -öt és a &lt;a href=\"http://repo.xposed.info/module/de.blinkt.vpndialogxposed\"&gt;VPN Dialog confirm module&lt;/a&gt; -t saját felelősségére</string>
+ <string name="full_licenses">Teljes licenszek</string>
+ <string name="blocklocal_summary">Azok a hálózatok útvonalai amik közvetlenül a helyi interfészére csatlakoznak nem a VPN-en keresztül fognak vezetni. Az opció kiválasztásának törlésével minden helyi forgalmat a VPN-hez irányíthat.</string>
+ <string name="blocklocal_title">VPN megkerülése helyi hálózatokhoz</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="openvpn_is_no_free_vpn">Az alkalmazás használatához szüksége van egy VPN szolgáltatóra / VPN átjáróra ami támogatja az OpenVPN-t (gyakran a munkáltató szolgáltatja). Nézzen utána a http://community.openvpn.net/ címen további információért hogyan készíthet saját OpenVPN kiszolgálót.</string>
<string name="import_log">Importálási napló:</string>
+ <string name="ip_looks_like_subnet">VPN topológia \"%3$s\" specifikálva, de ifconfig %1$s %2$s inkább IP címnek tűnik hálózati maszkkal. \"Alhálózat\" topológiát feltételezve.</string>
+ <string name="mssfix_invalid_value">Az MSS felülbírálati értéknek egész számnak kell lennie 0 és 9000 között</string>
+ <string name="mssfix_value_dialog">Jelentse be a TCP munkameneteknek, hogy korlátozniuk kell a küldendő csomagjaik méretét hogy miután az OpenVPN bekapszulázza őket a peer-nek küldendő eredmény UDP csomag mérete ne haladhassa meg ezt a byte számot. (az alapérték 1450)</string>
+ <string name="mssfix_checkbox">TCP payload MSS felülbírálati érték</string>
+ <string name="mssfix_dialogtitle">MSS beállítás a TCP payload-hoz</string>
+ <string name="client_behaviour">Kliens viselkedés</string>
+ <string name="clear_external_apps">Engedélyezett külső alkalmazások törlése</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="allowed_vpn_apps_info">Engedélyezett VPN alkalmazások: %1$s</string>
+ <string name="disallowed_vpn_apps_info">Letiltott VPN alkalmazások: %1$s</string>
+ <string name="app_no_longer_exists">%s csomag már nincs telepítve, eltávolítás az alkalmazások engedélyező/letiltó listájáról</string>
+ <string name="vpn_disallow_radio">VPN használata minden alkalmazáshoz kivéve a kiválasztottakat</string>
+ <string name="vpn_allow_radio">VPN használata kizárólag a kiválasztott alkalmazásokhoz</string>
+ <string name="query_delete_remote">Távoli kiszolgáló bejegyzés eltávolítása?</string>
<string name="keep">Megtartás</string>
<string name="delete">Törlés</string>
- <string name="server_list">Szerver lista</string>
+ <string name="add_remote">Új távoli kiszolgáló hozzáadása</string>
+ <string name="remote_random">Csatlakozási bejegyzések véletlenszerű használata csatlakozáskor</string>
+ <string name="remote_no_server_selected">Legalább egy távoli kiszolgálót definiálnia és engedélyeznie kell.</string>
+ <string name="server_list">Kiszolgáló lista</string>
+ <string name="vpn_allowed_apps">Engedélyezett Alkalmazások</string>
+ <string name="advanced_settings">Haladó Beállítások</string>
+ <string name="payload_options">Payload opciók</string>
+ <string name="tls_settings">TLS Beállítások</string>
+ <string name="no_remote_defined">Nincs kiszolgáló definiálva</string>
+ <string name="duplicate_vpn">VPN profil duplikálás</string>
+ <string name="duplicate_profile_title">Profil duplikálása: %s</string>
<string name="show_log">Napló mutatása</string>
+ <string name="faq_android_clients">Több OpenVPN kliens létezik Androidra. A leggyakoribb az OpenVPN for Android (ez a kliens), OpenVPN Connect és OpenVPN Settings.&lt;p&gt;A kliensek két csoportra oszthatóak: az OpenVPN for Android és az OpenVPN Connect a hivatalos VPNService API-t (Android 4.0+) használják és nem igényelnek root jogokat, és az OpenVPN Settings, ami root-ot használ.&lt;p&gt;Az OpenVPN for Android egy nyílt forráskódú kliens, amit Arne Schwabe fejleszt. Hozzáértőbb felhasználókat céloz meg, mivel rengeteg beállítást kínál, lehetőséget ad profilok fájlból történő importálására és alkalmazáson belüli konfigurálására/váltására. A kliens az OpenVPN közösségi verziójára épül, az OpenVPN 2.x verzió forráskódja alapján. Ezt a klienst tekinthetjük úgy, mint a félhivatalos közösségi klienst.&lt;p&gt;Az OpenVPN Connect nem nyílt forráskódú, amit az OpenVPN Technologies cég fejleszt. A klienst általános célra szánták az átlag felhasználók számára és engedi profilok importálását. Ez a kliens az OpenVPN C++ OpenVPN protokolljának újra-implementációjára épül (Ez volt az elvárás hogy az OpenVPN Technologies cég közzé tehessen egy iOS OpenVPN alkalmazást is). Ez a kliens az OpenVPN Technologies cég hivatalos kliense. &lt;p&gt; Az OpenVPN Settings a legrégebbi a kliensek között, egy UI a nyílt forráskódú OpenVPN-hez. Az OpenVPN for Android-dal szemben root jogosultságot igényel és nem használja az OpenVPN API-t. Nincs Android 4.0+ függése</string>
+ <string name="faq_androids_clients_title">Különbségek az Android OpenVPN kliensek között</string>
+ <string name="ignore_multicast_route">Multicast útvonal figyelmen kívül hagyása: %s</string>
+ <string name="ab_only_cidr">Az Android csak a CIDR útvonalakat támogatja a VPN-nél. Mivel nem-CIDR útvonalakat majdnem soha sem használnak, ezért az OpenVPN for ANdroid /32-t használ a nem-CIDR útvonalakhoz és figyelmeztetést ad.</string>
+ <string name="ab_tethering_44">Internetmegosztás működik mialatt a VPN aktív. A megosztott kapcsolat NEM fogja használni a VPN-t.</string>
+ <string name="ab_kitkat_mss">A korai KitKat verzió rosszul állítja be az MSS értéket a TCP kapcsolaton (#61948). Próbálja meg engedélyezni az mssfix opciót a hiba kiküszöbölésére.</string>
+ <string name="ab_proxy">Az Android továbbra is használni fogja a proxy beállításokat, amik a mobil/WiFi kapcsolathoz vannak megadva ameddig nincs beállítva DNS kiszolgáló. Az OpenVPN for Android erről figyelmeztetni fog a log-ban.<p>Amikor a VPN beállít egy DNS kiszolgálót, az Android nem fogja tovább használni a proxy-t. Nincs API proxy beállításra VPN kapcsolathoz.</p></string>
+ <string name="ab_lollipop_reinstall">A VPN alkalmazások nem biztos hogy működnek ha uninstallálják majd újra installálják. A részleteket lásd #80074</string>
+ <string name="ab_not_route_to_vpn">A konfigurált kliens IP és a hálózati maszkjában levő IP-k útvonala nem a VPN-en keresztül vezet. Az OpenVPN úgy küszöböli ki ezt a hibát, hogy explicit hozzáad egy útvonalat ami a kliens IP és hálózati maszkjának megfelel</string>
+ <string name="ab_persist_tun">Egy tun eszköz megnyitása, mialatt egy másik tun eszköz aktív, ami megmaradó-tun esetén használt, a VPNService összeomlását okozza az eszközön. A VPN újbóli működéséhez újraindítás szükséges. Az OpenVPN for Android megpróbálja elkerülni a tun eszköz újra megnyitását és ha valóban szükséges akkor először lezárja az aktuális TUN-t az új TUN megnyitása előtt az összeomlás elkerülése érdekében. Ez egy rövid ablakoz vezethet ami alatt csomagok továbbítódhatnak nem-VPN kapcsolaton keresztül. A VPNService ennek ellenére néha mégis összeomlik, ami az eszköz újraindítását igényli.</string>
+ <string name="ab_secondary_users">A VPN egyáltalán nem működik másodlagos felhasználóknak.</string>
+ <string name="ab_kitkat_reconnect">"Több felhasználó jelentette, hogy a mobil kapcsolat/mobil adat gyakran megszakad a VPN használata alatt. Ez a viselkedés úgy tűnik csak néhány mobil szolgáltató/eszköz kombinációt érint és eddig nem azonosítottak okot/kiküszöbölést a hibára. "</string>
+ <string name="ab_vpn_reachability_44">Csak azok a célállomások érhetőek el VPN-en, amik VPN nélkül is elérhetőek. Az IPv6 VPN egyáltalán nem működik.</string>
+ <string name="ab_only_cidr_title">Nem CIDR Útvonalak</string>
+ <string name="ab_proxy_title">Proxy viselkedés a VPN-ekhez</string>
+ <string name="ab_lollipop_reinstall_title">VPN alkalmazások újratelepítése</string>
+ <string name="version_upto">%s és korábbi</string>
+ <string name="copy_of_profile">%s másolata</string>
+ <string name="ab_not_route_to_vpn_title">Útvonal a konfigurált IP címhez</string>
+ <string name="ab_kitkat_mss_title">Rossz MSS érték a VPN kapcsolathoz</string>
+ <string name="ab_secondary_users_title">Másodlagos tablet felhasználók</string>
+ <string name="custom_connection_options_warng">Határozzon meg egyedi kapcsolat specifikus opciókat. Elővigyázatosan használja</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="remove_connection_entry">Kapcsolat bejegyzés eltávolítása</string>
+ <string name="ab_kitkat_reconnect_title">Véletlenszerű lecsatlakozások a mobil hálózatról</string>
+ <string name="ab_vpn_reachability_44_title">A távoli hálózat nem elérhető</string>
+ <string name="ab_persist_tun_title">Megmaradó tun mód</string>
+ <string name="version_and_later">%s és későbbi</string>
+ <string name="tls_cipher_alert_title">Kapcsolódás sikertelen SSL23_GET_SERVER_HELLO:sslv3 alert handshake hibával</string>
+ <string name="tls_cipher_alert">Újabb OpenVPN for Android verziók (0.6.29/2015 március) biztonságosabb alapértelmezést használnak az engedélyezett rejtjelező kísérletekhez (tls-cipher \"DEFAULT:!EXP:!PSK:!SRP:!kRSA\"). Sajnos a kevésbé biztonságos és export rejtjelező kísérletek kihagyása, különösen azoknak a rejtjelező kísérleteknek a kihagyása amik nem támogatják a Perfect Forward Security-t (Diffie-Hellman), néhány problémát okoz. Ezt általában egy jószándékú de gyengén végrehajtott TLS biztonság fokozás okozza a szerveren vagy néhány beágyazott OS-nél lecsupaszított SSL-el (pl.: MikroTik).\nA probléma megoldásához állítsa a tls-rejtjelezés alapértelmezését ésszerűbbre a szerveren, mint például tls-cipher \"DEFAULT:!EXP:!PSK:!SRP:!kRSA\". A probléma kliensen történő kiküszöböléséhez adja hozzá az Android kliensben az egyedi opciókhoz hogy tls-cipher DEFAULT.</string>
+ <string name="message_no_user_edit">Ez a profil egy külső alkalmazásból (%s) lett hozzáadva és a felhasználó által nem szerkeszthetőnek lett jelölve.</string>
+ <string name="crl_file">Tanúsítvány Visszavonási Lista</string>
+ <string name="service_restarted">OpenVPN Service újraindítása (az alkalmazás valószínűleg összeomlott vagy memória nyomásra bezárták)</string>
+ <string name="import_config_error">A konfiguráció importálása akadályba ütközött, nem lehet menteni</string>
<string name="Search">Keresés</string>
+ <string name="lastdumpdate">(Utolsó dump %3$s (%1$d:%2$d))</string>
+ <string name="clear_log_on_connect">Napló törlése új kapcsolódáskor</string>
+ <string name="connect_timeout">Csatlakozás Időtúllépés</string>
+ <string name="no_allowed_app">Nincs engedélyezett alkalmazás hozzáadva. Saját magunk (%s) hozzáadása, hogy legalább egy alkalmazás legyen az engedélyezett alkalmazások listáján, hogy ne engedjünk meg minden alkalmazást</string>
+ <string name="query_permissions_sdcard">Az OpenVPN for Android képes automatikusan felderíteni a hiányzó fájlokat az SD kártyán. Az üzenetre koppintva elindul az engedély kéré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>
+ <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="permission_revoked">A VPN engedélyt visszavonta az OS (pl.: másik VPN program indult), VPN leállítása</string>
+ <string name="pushpeerinfo">Peer információ küldése</string>
+ <string name="pushpeerinfosummary">Extra információ küldése a kiszolgálónak, pl.: SSL verzió és Android verzió</string>
+ <string name="pw_request_dialog_title">%1$s szükséges</string>
+ <string name="pw_request_dialog_prompt">Kérem adja meg a %1$s profilhoz tartozó jelszót</string>
+ <string name="menu_use_inline_data">Beágyazott adatok használata</string>
+ <string name="export_config_chooser_title">Konfigurációs fájl exportálása</string>
+ <string name="missing_tlsauth">Hiányzó tls-auth fájl</string>
+ <string name="missing_certificates">Hiányzó felhasználói tanúsítvány vagy privát kulcs fájl</string>
+ <string name="missing_ca_certificate">Hiányzó CA tanúsítvány</string>
+ <string name="crl_title">Tanúsítvány Visszavonási Lista (opcionális)</string>
+ <string name="reread_log">%d napló bejegyzés újraolvasása a log cache fájlból</string>
+ <string name="samsung_broken">Annak ellenére, hogy a Samsung telefonok a legtöbbet eladott Android telefonok közé tartoznak, a Samsung firmware-ek a leg bug-osabb Android firmware-ek. Ezeken az eszközökön a hibák nem csak a VPN működésre korlátozódnak, de nagy részük kiküszöbölhető. A következő néhány ilyen hiba leírása.\n\nA DNS nem működik hacsak nem a DNS kiszolgáló a VPN tartományban van.\n\nSok Samsung 5.x eszközön nem működik az engedélyezett/tiltott alkalmazások funkció.\nSamsung 6.0-n a VPN nem működik hacsak nem adjuk hozzá kivételként az alkalmazást a Powersave funkcióknál.</string>
+ <string name="samsung_broken_title">Samsung telefonok</string>
+ <string name="novpn_selected">Nincs VPN kiválasztva.</string>
+ <string name="reconnect">Újracsatlakozás</string>
+ <string name="qs_title">VPN be/kikapcsolás</string>
+ <string name="qs_connect">Csatlakozás %s-hez</string>
+ <string name="qs_disconnect">%s bontása</string>
+ <string name="connectretrymaxmessage">Adja meg a csatlakozási kísérletek közötti maximális időt. Az OpenVPN eddig az értékig fokozatosan növeli a sikertelen csatlakozási kísérletek közötti várakozási időt. 300 másodperc az alapértelmezett.</string>
+ <string name="connectretrymaxtitle">Csatlakozási kísérletek közötti maximális idő</string>
+ <string name="state_waitconnectretry">%s másodperc várakozás a csatlakozási kísérletek között</string>
+ <string name="nought_alwayson_warning"><![CDATA[Ha nem jelent meg a VPN megerősítés ablak, akkor egy másik alkalmazáshoz engedélyezve van a \"Mindig VPN-en\". Ebben az esetben csak az az alkalmazás csatlakozhat VPN-hez. Ellenőrizze a Beállítások -> Hálózatok további... -> VPN-ek alatt]]></string>
+ <string name="management_socket_closed">OpenVPN kapcsolatot lezárva (%s)</string>
+ <string name="change_sorting">Rendezés megváltoztatása</string>
+ <string name="sort">Rendezés</string>
+ <string name="sorted_lru">A profilok a legutóbbi használat szerint rendezve</string>
+ <string name="sorted_az">A profilok név szerint rendezve</string>
+ <string name="deprecated_tls_remote">A konfiguráció tls-remote opciót használ, ami a 2.3-ban elavulttá vált és a 2.4-ben végleg eltávolították</string>
</resources>
diff --git a/app/src/main/res/values-in/plurals-icsopenvpn.xml b/app/src/main/res/values-in/plurals-icsopenvpn.xml
new file mode 100755
index 00000000..6b7daaef
--- /dev/null
+++ b/app/src/main/res/values-in/plurals-icsopenvpn.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Generated by crowdin.com-->
+<resources>
+ <plurals name="months_left">
+ <item quantity="other">%d bulan kiri</item>
+ </plurals>
+ <plurals name="days_left">
+ <item quantity="other">%d hari lagi</item>
+ </plurals>
+</resources>
diff --git a/app/src/main/res/values-in/strings-icsopenvpn.xml b/app/src/main/res/values-in/strings-icsopenvpn.xml
index 132f25a1..e310d2f9 100755
--- a/app/src/main/res/values-in/strings-icsopenvpn.xml
+++ b/app/src/main/res/values-in/strings-icsopenvpn.xml
@@ -44,13 +44,14 @@
<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_ca_cert_selected">Opoeo</string>
<string name="no_error_found">Tidak ada kesalahan</string>
<string name="config_error_found">Konfigurasi Salah</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>
- <string name="vpn_launch_title">Hubungkan VPN</string>
+ <string name="vpn_launch_title">Dyan</string>
<string name="shortcut_profile_notfound">Profil di shrotcut tidak ada</string>
<string name="random_host_prefix">Acak awalan Host </string>
<string name="random_host_summary">Tambah 6 karakter acak di depan nama host</string>
@@ -164,7 +165,7 @@
<string name="private_key_password">Sandi kunci pribadi</string>
<string name="password">Sandi</string>
<string name="file_icon">ikon berkas</string>
- <string name="tls_authentication">Otentikasi TLS</string>
+ <string name="tls_authentication">TLS Authentication / Enkripsi</string>
<string name="generated_config">Konfigurasi Dibuat</string>
<string name="generalsettings">Pengaturan</string>
<string name="owner_fix_summary">Mencoba menetapkan pemilik /dev/tun ke sistem. Beberapa gambar CM9 memerlukan ini untuk membuat API VPNService bekerja. Memerlukan akses Root.</string>
@@ -203,9 +204,8 @@
<string name="using_proxy">Menggunakan proxy %1$s %2$d</string>
<string name="use_system_proxy">Gunakan sistem proxy</string>
<string name="use_system_proxy_summary">Gunakan konfigurasi lebih luas untuk menyambung system melalui proxy HTTP/HTTPS</string>
- <string name="donatewithpaypal">Anda dapat melakukan donasi &lt;a href=\"https://www.paypal.com/cgi-bin/webscr?hosted_button_id=R2M6ZP9AF25LS&amp;amp;cmd=_s-xclick\"&gt;dengan PayPal&lt;/a&gt; </string>
- <string name="onbootrestartsummary">OpenVPN akan menyambung kembali VPN jika VPN aktif pada saat sistem reboot/shutdown. Silakan baca FAQ tentang peringatan sambungan sebelum menggunakan pilihan ini.</string>
- <string name="onbootrestart">Koneksi ulang saat perangkat dihidupkan kembali</string>
+ <string name="onbootrestartsummary">OpenVPN akan menghubungkan VPN ditentukan apakah itu aktif di sistem boot. Silakan baca koneksi peringatan FAQ sebelum menggunakan opsi ini pada Android &lt; 5.0.</string>
+ <string name="onbootrestart">Minatosuki</string>
<string name="ignore">Abaikan</string>
<string name="restart">Restart</string>
<string name="restart_vpn_after_change">Perubahan konfigurasi baru diterapkan setelah restart VPN. Restart VPN sekarang?</string>
@@ -252,7 +252,6 @@
<string name="state_tcp_connect">Menghubungkan (TCP)</string>
<string name="state_auth_failed">Otentifikasi gagal</string>
<string name="state_nonetwork">Menunggu jaringan yang dapat dipakai</string>
- <string name="statusline_bytecount">↓%2$s/s %1$s - ↑%4$s/s %3$s</string>
<string name="notifcation_title_notconnect">Tidak terhubung</string>
<string name="start_vpn_title">Menghubungkan ke VPN %s</string>
<string name="start_vpn_ticker">Menghubungkan ke VPN %s</string>
@@ -378,4 +377,10 @@
<string name="ab_persist_tun_title">Modus terowongan bertahan</string>
<string name="version_and_later">%s dan yang lebih baru</string>
<string name="tls_cipher_alert_title">Sambungan gagal dengan peringatan kegagalan jabat tangan SSL23_GET_SERVER_HELLO:sslv3</string>
+ <string name="tls_cipher_alert">Dyankoclok</string>
+ <string name="message_no_user_edit">Profil ini telah ditambahkan dari aplikasi eksternal (%s) dan telah ditandai sebagai pengguna tidak dapat diedit.</string>
+ <string name="crl_file">Certificate Revocation List</string>
+ <string name="service_restarted">Restart layanan OpenVPN (App jatuh mungkin jatuh atau dibunuh untuk memori tekanan)</string>
+ <string name="import_config_error">Mengimpor konfigurasi menghasilkan kesalahan, tidak bisa menyimpannya</string>
+ <string name="Search">Pencarian</string>
</resources>
diff --git a/app/src/main/res/values-it/plurals-icsopenvpn.xml b/app/src/main/res/values-it/plurals-icsopenvpn.xml
new file mode 100755
index 00000000..70489fbc
--- /dev/null
+++ b/app/src/main/res/values-it/plurals-icsopenvpn.xml
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Generated by crowdin.com-->
+<resources></resources>
diff --git a/app/src/main/res/values-it/strings-icsopenvpn.xml b/app/src/main/res/values-it/strings-icsopenvpn.xml
index feb61f0d..b3774986 100755
--- a/app/src/main/res/values-it/strings-icsopenvpn.xml
+++ b/app/src/main/res/values-it/strings-icsopenvpn.xml
@@ -50,7 +50,6 @@
<string name="custom_route_format_error">Errore durante la lettura delle regole di reindirizzamento (routing)</string>
<string name="pw_query_hint">(non compilare perché venga sempre richiesto)</string>
<string name="vpn_shortcut">Collegamento a OpenVPN</string>
- <string name="vpn_launch_title">Connetti alla VPN</string>
<string name="shortcut_profile_notfound">Profilo indicato nel collegamento non trovato</string>
<string name="random_host_prefix">Prefisso Host casuale</string>
<string name="random_host_summary">Aggiunge 6 caratteri casuali prima dell\'hostname</string>
@@ -166,7 +165,6 @@ Effettuata la lettura del file di configurazione</string>
<string name="private_key_password">Password della chiave privata</string>
<string name="password">Password</string>
<string name="file_icon">icona del file</string>
- <string name="tls_authentication">Autenticazione TLS</string>
<string name="generated_config">Configurazione generata</string>
<string name="generalsettings">Impostazioni</string>
<string name="owner_fix_summary">Tenta di impostare system come proprietario di /dev/tun. Alcuni firmware CM9 necessitano di questa impostazione affinché le API del servizio VPN funzionino. E\' necessario essere root.</string>
@@ -204,9 +202,6 @@ Effettuata la lettura del file di configurazione</string>
<string name="using_proxy">Si sta utilizzando il proxy %1$s %2$d</string>
<string name="use_system_proxy">Utilizza il proxy di sistema</string>
<string name="use_system_proxy_summary">Utilizza la configurazione generale del sistema relativa ai proxy HTTP/HTTPS per connettersi.</string>
- <string name="donatewithpaypal">Puoi &lt;a href=\"https://www.paypal.com/cgi-bin/webscr?hosted_button_id=R2M6ZP9AF25LS&amp;amp;cmd=_s-xclick\"&gt;donare tramite PayPal&lt;/a&gt; </string>
- <string name="onbootrestartsummary">OpenVPN is riconnetterà alla VPN se era in funzione durante un riavvio od un spegnimento dell\'apparecchio. Leggi con attenzione le FAQ con gli avvertimenti sulla connessione prima di scegliere questa opzione.</string>
- <string name="onbootrestart">Riconnetti al riavvio</string>
<string name="ignore">Ignora</string>
<string name="restart">Riavvia</string>
<string name="restart_vpn_after_change">Le modifiche sarannoi applicate dopo aver riavviato la connessione VPN. Riavviare ora la connessione?</string>
@@ -253,7 +248,6 @@ Effettuata la lettura del file di configurazione</string>
<string name="state_tcp_connect">Connessione in corso (TCP)</string>
<string name="state_auth_failed">Autenticazione fallita</string>
<string name="state_nonetwork">In attesa di una rete utilizzabile</string>
- <string name="statusline_bytecount">↓%2$s/s %1$s - ↑%4$s/s %3$s</string>
<string name="notifcation_title_notconnect">Non connesso</string>
<string name="start_vpn_title">Connessione alla VPN %s in corso</string>
<string name="start_vpn_ticker">Connessione alla VPN %s in corso</string>
diff --git a/app/src/main/res/values-ja/plurals-icsopenvpn.xml b/app/src/main/res/values-ja/plurals-icsopenvpn.xml
new file mode 100755
index 00000000..0511286f
--- /dev/null
+++ b/app/src/main/res/values-ja/plurals-icsopenvpn.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Generated by crowdin.com-->
+<resources>
+ <plurals name="months_left">
+ <item quantity="other">残り%dヵ月</item>
+ </plurals>
+ <plurals name="days_left">
+ <item quantity="other">残り%d日</item>
+ </plurals>
+ <plurals name="hours_left">
+ <item quantity="other">残り%d時間</item>
+ </plurals>
+ <plurals name="minutes_left">
+ <item quantity="other">残り%d分</item>
+ </plurals>
+</resources>
diff --git a/app/src/main/res/values-ja/strings-icsopenvpn.xml b/app/src/main/res/values-ja/strings-icsopenvpn.xml
index 7e8be056..0f55b892 100755
--- a/app/src/main/res/values-ja/strings-icsopenvpn.xml
+++ b/app/src/main/res/values-ja/strings-icsopenvpn.xml
@@ -6,20 +6,20 @@
-->
<resources>
- <string name="address">サーバーアドレス:</string>
+ <string name="address">サーバーアドレス:</string>
<string name="port">ポート番号:</string>
<string name="location">場所</string>
- <string name="cant_read_folder">ディレクトリが読み取れません</string>
+ <string name="cant_read_folder">ディレクトリを読み取れません</string>
<string name="select">選択</string>
<string name="cancel">キャンセル</string>
- <string name="no_data">データなし</string>
+ <string name="no_data">データがありません</string>
<string name="useLZO">LZO圧縮</string>
- <string name="client_no_certificate">証明書がありません。</string>
+ <string name="client_no_certificate">証明書がありません</string>
<string name="client_certificate_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="ca_title">CA証明書</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>
@@ -27,7 +27,7 @@
<string name="vpn_type">種別</string>
<string name="pkcs12pwquery">PKCS12のパスワード</string>
<string name="file_select">選択&#8230;</string>
- <string name="file_nothing_selected">ファイルを選択する必要があります。</string>
+ <string name="file_nothing_selected">ファイルを選択する必要があります</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>
@@ -43,37 +43,38 @@
<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="no_keystore_cert_selected">ユーザー証明書を選択する必要があります</string>
+ <string name="no_ca_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="pw_query_hint">必要に応じて入力するには空欄にしてください</string>
<string name="vpn_shortcut">OpenVPN のショートカット</string>
- <string name="vpn_launch_title">VPNに接続</string>
+ <string name="vpn_launch_title">VPNに接続しています...</string>
<string name="shortcut_profile_notfound">ショートカットで指定されたプロファイルが見つかりません</string>
<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="route_rejected">経路がAndroidにより拒否されました。</string>
- <string name="cancel_connection">切断</string>
- <string name="cancel_connection_long">VPNを切断します</string>
+ <string name="cancel_connection">VPNを切断</string>
+ <string name="cancel_connection_long">VPN接続を切断</string>
<string name="clear_log">ログをクリア</string>
- <string name="title_cancel">キャンセルの確認</string>
- <string name="cancel_connection_query">接続中または試行中の接続をキャンセルしますか?</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 server)を使用しているか確認する</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>
<string name="enter_tlscn_title">リモート証明書サブジェクト</string>
- <string name="tls_key_auth">TLS鍵認証を有効にする</string>
+ <string name="tls_key_auth">TLS鍵認証を有効にします。</string>
<string name="tls_auth_file">TLS 認証ファイル</string>
<string name="pull_on_summary">IPアドレス、経路情報、DNSなどの情報をサーバから取得します。</string>
<string name="pull_off_summary">サーバからは何も情報が取得できません。指定が必要な設定は以下の通りです。</string>
- <string name="use_pull">情報取得の設定</string>
+ <string name="use_pull">設定情報を取得する</string>
<string name="dns">DNS</string>
<string name="override_dns">DNSを手動設定する</string>
<string name="dns_override_summary">DNSをユーザ側で指定します。</string>
@@ -84,18 +85,18 @@
<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="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="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="edit_vpn">VPN設定の編集</string>
+ <string name="remove_vpn_query">VPNプロファイル %s を削除しますか?</string>
<string name="tun_error_helpful">いくつかのカスタムICSイメージは、/dev/tunのパーミッションが異常か、TUNモジュールが含まれていません。CM9イメージの場合は全般設定で所有権設定を修正してください。</string>
<string name="tun_open_error">TUNデバイスを開こうとして失敗しました。</string>
<string name="error">"エラー:"</string>
@@ -116,15 +117,15 @@
<string name="ics_openvpn_log_file">ICS OpenVPN ログ ファイル</string>
<string name="copied_entry">ログ エントリをクリップボードにコピーしました</string>
<string name="tap_mode">TAPモード</string>
- <string name="faq_tap_mode">TAPモードは非root化環境では動作しません。よってこのアプリケーションではTAPをサポートできません。</string>
+ <string name="faq_tap_mode">TAPモードはroot化されていないVPN APIでは動作しません。よってこのアプリケーションではTAPをサポートできません。</string>
<string name="tap_faq2">またですか?TAPモードはサポートされていませんし、サポートされるかどうかメールを送ることは何の役にも立ちません。</string>
- <string name="tap_faq3">3回目です。本当のところ、TUN上で動くレイヤ2エミュレータを書くことはできました。(送信時の情報追加と受信時の情報削除で)。しかしこのエミュレータはARPやおそらくはDHCPをも実装しなければならないでしょう。誰もこのことに気がついていません。もしあなたがこの機能を作る気になったのであれば、どうぞ私に連絡してください。</string>
+ <string name="tap_faq3">3回目ですか?本当のところ、TUN上で動くレイヤ2エミュレータを書くことはできました。(送信時の情報追加と受信時の情報削除で)。しかしこのエミュレータはARPやおそらくはDHCPをも実装しなければならないでしょう。誰もこのことに気がついていません。もしあなたがこの機能を作る気になったのであれば、どうぞ私に連絡してください。</string>
<string name="faq">よくある質問</string>
<string name="copying_log_entries">ログ エントリのコピー</string>
<string name="faq_copying">1行のログエントリをコピーするには、そのエントリをタッチし続けます。コピー/送信するには「ログエントリを送信」を使用します。GUIで表示されない場合はハードウェアのメニューボタンを使用してください。</string>
<string name="faq_shortcut">起動ショートカット</string>
<string name="faq_howto_shortcut">OpenVPNを起動するためのショートカットをデスクトップに配置できます。ショートカットやウィジェットを配置できるかどうかはホームスクリーンプログラムに依存します。</string>
- <string name="no_vpn_support_image">申し訳ありませんが、お使いの環境ではVPNサービスがサポートされていません。</string>
+ <string name="no_vpn_support_image">申し訳ありませんが、お使いの環境ではVPNサービスがサポートされていません</string>
<string name="encryption">暗号化</string>
<string name="cipher_dialog_title">暗号化方式を入力</string>
<string name="chipher_dialog_message">OpenVPNが暗号化に使用する暗号方式を入力してください。空欄にするとデフォルトを使用します。</string>
@@ -133,21 +134,21 @@
<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="import_error_message">ファイルシステムからファイルをインポートできませんでした</string>
<string name="inline_file_data">[インライン ファイル データ]</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="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_could_not_open">インポートされた設定ファイルに記載されたファイル %1$s が見つかりません。</string>
+ <string name="importing_config">設定ファイルを%1$sからインポートしています。</string>
<string name="import_warning_custom_options">ユーザインターフェースにマッピングされていないいくつかの設定項目があります。それらの設定はカスタムオプションとして追加されます。カスタムオプションを以下に表示します。</string>
- <string name="import_done">構成ファイルの読み込みを完了しました。</string>
+ <string name="import_done">設定ファイルの読み込みを完了しました。</string>
<string name="nobind_summary">ローカル アドレスとポートにバインドを行いません。</string>
<string name="no_bind">ローカルバインドしない</string>
- <string name="import_configuration_file">構成ファイルのインポート</string>
+ <string name="import_configuration_file">設定ファイルのインポート</string>
<string name="faq_security_title">セキュリティに関する考慮事項</string>
<string name="faq_security">OpenVPNがセキュリティに敏感であるように、セキュリティに関してのいくつかの注意事項は理にかなっています。
SDカード上のデータは本質的に無防備です。すべてのアプリケーションが読み取り可能です。(たとえばこのプログラムはSDカードへの特別な読み取り許可を必要としていません)
@@ -155,7 +156,7 @@ SDカード上のデータは本質的に無防備です。すべてのアプリ
ただし、このアプリケーションからのみ読み取り可能ではあるものの、暗号化されてはいません。
機体をroot化したり、あるいはその他の脆弱性によってファイルは読み取ることが可能かもしれません。パスワードは平文で保存されています。PKCS12ファイルをAndroidの証明書管理機能にインポートして使用することが強く推奨されます。</string>
<string name="import_vpn">インポート</string>
- <string name="broken_image_cert_title">証明書の選択でエラーが表示されます</string>
+ <string name="broken_image_cert_title">証明書の選択画面でエラー</string>
<string name="broken_image_cert">Android 4.0以降の証明書選択ダイアログ表示で例外を検知しました。
この事象は標準的なAndroid 4.0以降では発生しません。お使いのAndroidの証明書管理機構が壊れている可能性があります。</string>
<string name="ipv4">IPv4</string>
@@ -170,22 +171,22 @@ SDカード上のデータは本質的に無防備です。すべてのアプリ
<string name="private_key_password">秘密鍵のパスワード</string>
<string name="password">パスワード</string>
<string name="file_icon">ファイルのアイコン</string>
- <string name="tls_authentication">TLS認証</string>
- <string name="generated_config">生成された構成</string>
+ <string name="tls_authentication">TLS認証/暗号化</string>
+ <string name="generated_config">生成された設定</string>
<string name="generalsettings">設定</string>
<string name="owner_fix_summary">システムに/dev/tunの所有者を設定します。いくつかのCM9のイメージでVPNService APIを動作させるために必要です。root権限が必要です。</string>
<string name="owner_fix">/dev/tun の所有権を修正</string>
- <string name="generated_config_summary">生成された OpenVPN の構成ファイルを表示します</string>
+ <string name="generated_config_summary">生成された OpenVPN の設定ファイルを表示します</string>
<string name="edit_profile_title">\"%s\"の編集</string>
- <string name="building_configration">構成中・・・</string>
+ <string name="building_configration">設定を構成中・・・</string>
<string name="netchange_summary">この設定を有効にすると、ネットワークの状態変化時(WiFi/モバイル)に再接続を行います。</string>
- <string name="netchange">ネットワーク変化時に再接続</string>
+ <string name="netchange">ネットワーク変化時に再接続する</string>
<string name="netstatus">ネットワーク状態: %s</string>
<string name="extracahint">認証局証明書(CA cert)は、通常、Android のキーストアから返されます。証明書の検証でエラーになる場合は、個別の証明書を指定します。</string>
<string name="select_file">選択</string>
<string name="keychain_nocacert">認証局証明書(CA Cert)がAndroidのキーストアから取得できませんでした。認証はおそらく失敗します。</string>
<string name="show_log_summary">接続時にログウィンドウを表示します。ログウィンドウは常に状態通知からアクセスできます。</string>
- <string name="show_log_window">ログウィンドウを表示</string>
+ <string name="show_log_window">ログウィンドウを表示する</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
@@ -194,37 +195,38 @@ Androidはあなた自身の安全性のために、これらを迂回できな
<string name="faq_system_dialogs_title">接続時の警告と通知音</string>
<string name="translationby">日本語翻訳 高橋正希@埼玉 &lt;tools@artin.nu&gt;</string>
<string name="ipdns">IPとDNS</string>
- <string name="basic">基本</string>
+ <string name="basic">基本設定</string>
<string name="routing">経路設定</string>
<string name="obscure">特殊なOpenVPNの設定。通常は必要ありません</string>
- <string name="advanced">高度</string>
- <string name="export_config_title">ICSのOpenVPN設定</string>
+ <string name="advanced">高度な設定</string>
+ <string name="export_config_title">OpenVPN設定</string>
<string name="warn_no_dns">DNSサーバーが使用されていません。名前解決が動作しない可能性があります。カスタムDNSの設定を検討してください。また、DNSが指定されていない場合Androidはモバイル回線/WiFi接続に設定したプロキシを使用し続けることにも注意してください。</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;動作確認済の設定ファイルを入手します。(あなたのコンピュータでテスト済のものや、プロバイダや会社などの組織からダウンロードしたもの)&lt;/p&gt;
-&lt;p&gt;もしそれが単一のファイルでpemやpks12ファイルを伴わないなら、自分宛のメールに添付して送付し、それを開いてください。もし複数のファイルで構成されているならSDカードに格納してください。&lt;/p&gt;
+&lt;p&gt;もしそれが単一のファイルでPEMやPKCS12ファイルを伴わないなら、自分宛のメールに添付して送付し、それを開いてください。もし複数のファイルで構成されているならSDカードに格納してください。&lt;/p&gt;
&lt;p&gt;メールの添付ファイルを開く、あるいはVPNリストのフォルダアイコンをクリックして設定ファイルをインポートします。&lt;/p&gt;
&lt;p&gt;もしファイルが足りないというエラーが表示されたら、足りなかったファイルをSDカード上に格納してください。&lt;/p&gt;
&lt;p&gt;インポートされたVPN設定をリストに追加するには、保存アイコンをクリックします。&lt;/p&gt;
&lt;p&gt;VPNを接続するには、VPNの名称をクリックします。&lt;/p&gt;
-&lt;p&gt;もし警告やエラーがログエントリに表示されたら、それらを調べて解決してください。&lt;/p&gt;</string>
+&lt;p&gt;もし警告やエラーがログエントリに表示されたら、それらを調べて解決してください。&lt;/p&gt;
+</string>
<string name="faq_howto_title">クイックスタート</string>
<string name="setting_loadtun_summary">接続の試行前にTUNデバイスモジュール(tun.ko)を読み込みます。デバイスの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>
- <string name="use_system_proxy_summary">システム全体の構成の HTTP/HTTPS プロキシ接続を使用します。</string>
- <string name="donatewithpaypal">以下のURLより寄付いただけます。 &lt;a href=\"https://www.paypal.com/cgi-bin/webscr?hosted_button_id=R2M6ZP9AF25LS&amp;amp;cmd=_s-xclick\"&gt;PayPalで寄付&lt;/a&gt; </string>
- <string name="onbootrestartsummary">OpenVPNはシステムの再起動やシャットダウン時に再接続するようになります。このオプションを使用する前にFAQをご一読ください。</string>
- <string name="onbootrestart">システム起動後に再接続</string>
+ <string name="use_system_proxy">システムのプロキシ設定を使用する</string>
+ <string name="use_system_proxy_summary">接続にシステム全体の構成の HTTP/HTTPS プロキシを使用します。</string>
+ <string name="onbootrestartsummary">有効にすると、OpenVPNはシステムの起動時に指定されたVPNに接続します。Android 5.0より前のバージョンでこのオプションを使用する場合は、接続時の警告に関する「よくある質問」を読んでください。</string>
+ <string name="onbootrestart">システム起動時に接続</string>
<string name="ignore">無視</string>
<string name="restart">再起動</string>
<string name="restart_vpn_after_change">設定の変更はVPNの再起動後に反映されます。VPNを(再)起動しますか?</string>
<string name="configuration_changed">設定が変更されました</string>
- <string name="log_no_last_vpn">編集されたため、最後に接続したプロファイルを確認できませんでした</string>
+ <string name="log_no_last_vpn">編集されたため、最後に接続したプロファイルを確認できませんでした
+</string>
<string name="faq_duplicate_notification_title">重複した通知</string>
<string name="faq_duplicate_notification">もしAndroidがメモリ不足に陥った場合、その時点で必要とされないアプリケーションやサービスはアクティブなメモリから排除されます。
この処理に伴い、VPN接続は終了されます。
@@ -235,7 +237,7 @@ OpenVPNの接続を保証するためには、アプリケーションを高い
<string name="no_vpn_profiles_defined">VPNのプロファイルが定義されていません</string>
<string name="add_new_vpn_hint">新しいVPNを追加するには &lt;img src=\"ic_menu_add\"/&gt; のアイコンを使用します</string>
<string name="vpn_import_hint">SDカードからプロファイル(.ovpnや.conf)をインポートするには &lt;img src=\"ic_menu_archive\"/&gt; のアイコンを使用します。</string>
- <string name="faq_hint">FAQを確認してください。クイックスタートガイドがあります。</string>
+ <string name="faq_hint">「よくある質問」を確認してください。クイックスタートガイドがあります。</string>
<string name="faq_routing_title">経路情報/インターフェース設定</string>
<string name="faq_routing">経路とインターフェースの設定は従来のifconfig/routeコマンドではなくVPNService APIを使用して行われます。
その結果、経路の設定はほかのOSとは異なります。\n
@@ -253,16 +255,16 @@ VPNService APIはVPNを経由すべきでないネットワークの指定を許
こっそり:
Android 4.4以上はポリシールーティングを使用します。route/ifconfigコマンドは設定された経路を表示しません。代わりにip ruleまたはiptables -t mangle -Lを使用します。</string>
- <string name="persisttun_summary">OpenVPNが再接続試行中は、VPNなし状態を報告しません。</string>
+ <string name="persisttun_summary">OpenVPNが再接続試行中は、VPN接続なしとして報告しません。</string>
<string name="persistent_tun_title">永続的なTUNデバイス</string>
- <string name="openvpn_log">OpenVPN のログ</string>
- <string name="import_config">OpenVPN の構成のインポート</string>
+ <string name="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="vpn_tethering_title">VPNとテザリング</string>
<string name="connection_retries">接続の再試行回数</string>
<string name="reconnection_settings">再接続の設定</string>
<string name="connectretrymessage">再接続を試行する際の間隔(秒)</string>
@@ -273,22 +275,22 @@ Android 4.4以上はポリシールーティングを使用します。route/ifc
<string name="notifcation_title">OpenVPN - %s</string>
<string name="session_ipv4string">%1$s - %2$s</string>
<string name="session_ipv6string">%1$s - %3$s, %2$s</string>
- <string name="state_connecting">接続中</string>
- <string name="state_wait">サーバーの応答を待っています。</string>
+ <string name="state_connecting">接続しています</string>
+ <string name="state_wait">サーバーの応答を待っています</string>
<string name="state_auth">認証中</string>
- <string name="state_get_config">クライアントの構成を取得中</string>
+ <string name="state_get_config">クライアントの設定を取得中</string>
<string name="state_assign_ip">IPアドレスを割り当て中</string>
<string name="state_add_routes">経路を追加中</string>
<string name="state_connected">接続しました</string>
<string name="state_disconnected">切断</string>
- <string name="state_reconnecting">再接続中</string>
+ <string name="state_reconnecting">再接続しています</string>
<string name="state_exiting">終了中</string>
<string name="state_noprocess">停止中</string>
<string name="state_resolve">ホスト名を解決中</string>
<string name="state_tcp_connect">接続中(TCP)</string>
<string name="state_auth_failed">認証に失敗しました</string>
<string name="state_nonetwork">使用可能なネットワークを待機中</string>
- <string name="statusline_bytecount">↓%2$s/s %1$s - ↑%4$s/s %3$s</string>
+ <string name="statusline_bytecount">↓%2$s %1$s - ↑%4$s %3$s</string>
<string name="notifcation_title_notconnect">未接続</string>
<string name="start_vpn_title">VPN %sに接続中</string>
<string name="start_vpn_ticker">VPN %sに接続中</string>
@@ -296,19 +298,19 @@ Android 4.4以上はポリシールーティングを使用します。route/ifc
<string name="encryption_cipher">暗号化方式</string>
<string name="packet_auth">パケット認証</string>
<string name="auth_dialog_title">パケット認証方式を入力してください。</string>
- <string name="built_by">%s によりビルド</string>
+ <string name="built_by">%s によりビルドされました</string>
<string name="debug_build">デバッグ ビルド</string>
<string name="official_build">正式ビルド</string>
<string name="make_selection_inline">プロファイルにコピー</string>
<string name="crashdump">クラッシュ ダンプ</string>
<string name="add">追加</string>
- <string name="send_config">構成ファイルを送信</string>
+ <string name="send_config">設定ファイルを送信</string>
<string name="complete_dn">完全な識別名(DN)</string>
<string name="remotetlsnote">あなたがインポートした設定は異なるDNフォーマットを使用した非推奨のtls-remoteオプションを使用しています。</string>
<string name="rdn">相対識別名(RDN/共通名)</string>
<string name="rdn_prefix">相対識別名(RDN)プリフィクス</string>
<string name="tls_remote_deprecated"> tls-remote (非推奨)</string>
- <string name="help_translate">翻訳作業を手伝っていただける方は次のURLへ http://crowdin.net/project/ics-openvpn/invite</string>
+ <string name="help_translate">次のURLにアクセスすると、翻訳作業を手伝うことができます http://crowdin.net/project/ics-openvpn/invite</string>
<string name="prompt">%1$s は %2$s を制御しようとしています。</string>
<string name="remote_warning">このまま進むと、あなたはOpenVPN for Androidの完全な制御とすべての通信を傍受する権限をアプリケーションに対し与えることになります。<b>アプリケーションが信頼できない限り、承諾しないでください。</b>さもないと、あなたのデータがマルウェアにより漏洩させられる危険があります。</string>
<string name="remote_trust">私はこのアプリケーションを信頼します</string>
@@ -316,12 +318,12 @@ Android 4.4以上はポリシールーティングを使用します。route/ifc
<string name="allowed_apps">許可アプリ: %s</string>
<string name="clearappsdialog">許可アプリの一覧をクリアしますか?\n現在の許可アプリ一覧:\n\n%s</string>
<string name="screenoff_summary">スクリーンがオフかつ60秒で64kB以下のデータ転送量の場合、VPN通信を中断します。「永続的なTUN」設定が有効な場合、VPN接続が中断されると通信ができなくなります。「永続的なTUN」を無効にすると、VPNによる接続保護は行われなくなります。</string>
- <string name="screenoff_title">画面オフ後にVPN接続を中断</string>
+ <string name="screenoff_title">画面オフ後にVPN接続を中断する</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="resumevpn">VPN再開</string>
+ <string name="resumevpn">VPNを再開</string>
<string name="state_userpause">ユーザによってVPNの中断が要求されました</string>
<string name="state_screenoff">VPN中断中 - 画面オフ</string>
<string name="device_specific">デバイス固有のハック</string>
@@ -352,7 +354,7 @@ Android 4.4以上はポリシールーティングを使用します。route/ifc
<string name="full_licenses">完全なライセンス告知</string>
<string name="blocklocal_summary">ローカルインターフェイスに直接接続されているネットワークはVPNを経由しません。
このオプションを外すとローカルネットワーク宛のすべての通信をVPNにリダイレクトします。</string>
- <string name="blocklocal_title">ローカルは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>
@@ -360,6 +362,7 @@ Android 4.4以上はポリシールーティングを使用します。route/ifc
<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="mtu_invalid_value">MTUに指定できる値は64~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>
@@ -399,8 +402,8 @@ Android 4.4以上はポリシールーティングを使用します。route/ifc
<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_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>
@@ -409,7 +412,7 @@ Android 4.4以上はポリシールーティングを使用します。route/ifc
<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="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>
@@ -429,13 +432,53 @@ Android 4.4以上はポリシールーティングを使用します。route/ifc
<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>
<string name="permission_revoked">OSによりVPNの権限が取り消されました (ほかのVPNプログラムが動作した場合など)。VPNを停止します</string>
<string name="pushpeerinfo">ピア情報を送信する</string>
- <string name="pushpeerinfosummary">追加の情報をサーバに送信する (SSLやAndroidのバージョン等)</string>
- <string name="pw_request_dialog_title">%1$s </string>
+ <string name="pushpeerinfosummary">追加の情報をサーバに送信します。 (SSLやAndroidのバージョン等)</string>
+ <string name="pw_request_dialog_title">%1$s のパスワード</string>
<string name="pw_request_dialog_prompt">プロファイル %1$s のパスワードを入力してください</string>
<string name="menu_use_inline_data">インラインデータを使用する</string>
+ <string name="export_config_chooser_title">設定ファイルのエクスポート</string>
+ <string name="missing_tlsauth">tls-authファイルが不足しています</string>
+ <string name="missing_certificates">ユーザ証明書またはユーザ証明書キーのファイルが不足しています</string>
+ <string name="missing_ca_certificate">CA証明書が不足しています</string>
+ <string name="crl_title">証明書の失効リスト(オプション)</string>
+ <string name="reread_log">ログキャッシュからログ(%d個)を再読み込みしました</string>
+ <string name="samsung_broken">サムスン製の携帯電話は最も販売されているAndroid機ですが、サムスン製のファームウェアは最もバグを引き起こすAndroidファームウェアです。これらのデバイスのバグはVPN操作に限ったことではありませんが、それらの多くは回避可能です。以下にいくつかのバグを記載します。\n\nDNSサーバがVPNの範囲内にないとDNSが動作しません。\n\nサムスン製Android 5.0の多くの機種では、アプリの許可/不許可機能が動作しません。\nサムスン製Android 6.0機種のVPNは、VPNアプリを省電力機能から除外しない限り動作しないことが報告されています。</string>
+ <string name="samsung_broken_title">サムスン製の機種</string>
+ <string name="novpn_selected">VPNが選択されていません</string>
+ <string name="defaultvpn">既定のVPN</string>
+ <string name="defaultvpnsummary">既定のVPNが必要な場面で使用されます。現在のところ、起動時、常時接続、クイック設定タイルで使用されます。</string>
+ <string name="vpnselected">現在選択されているVPN: \'%s\'</string>
+ <string name="reconnect">再接続</string>
+ <string name="qs_title">VPNを切り替える</string>
+ <string name="qs_connect">%sに接続</string>
+ <string name="qs_disconnect">%sを切断</string>
+ <string name="connectretrymaxmessage">最大接続試行間隔を入力します。OpenVPNは接続に失敗するとこの値まで少しずつ待機時間を増やしていきます。デフォルトは300秒です。</string>
+ <string name="connectretrymaxtitle">接続試行の最大間隔</string>
+ <string name="state_waitconnectretry">接続試行の間隔として%s秒を待っています</string>
+ <string name="nought_alwayson_warning"><![CDATA[VPNの確認ダイアログが表示されない場合、ほかのアプリのために「常時VPN接続」が有効になっているかもしれません。この場合、そのアプリだけがVPNに接続できます。「設定」-「ネットワーク」-「もっと見る」-「VPN」を確認してください。]]></string>
+ <string name="management_socket_closed">OpenVPNへの接続が閉じられました (%s)</string>
+ <string name="change_sorting">並べ替えの変更</string>
+ <string name="sort">並べ替え</string>
+ <string name="sorted_lru">プロファイルを最近使った順に並べ替えました</string>
+ <string name="sorted_az">プロファイルを名前順に並べ替えました</string>
+ <string name="deprecated_tls_remote">設定はtls-remoteを使用しています(2.3で非推奨、2.4で削除されました)</string>
+ <string name="auth_failed_behaviour">認証失敗時の挙動</string>
+ <string name="graph">グラフ</string>
+ <string name="use_logarithmic_scale">対数スケールを使用する</string>
+ <string name="notenoughdata">データが不十分です</string>
+ <string name="avghour">毎時間平均</string>
+ <string name="avgmin">毎分平均</string>
+ <string name="last5minutes">過去5分間</string>
+ <string name="data_in">In</string>
+ <string name="data_out">Out</string>
+ <string name="bits_per_second">%.0f bit/s</string>
+ <string name="kbits_per_second">%.1f kbit/s</string>
+ <string name="mbits_per_second">%.1f Mbit/s</string>
+ <string name="gbits_per_second">%.1f Gbit/s</string>
+ <string name="volume_byte">%.0f B</string>
+ <string name="volume_kbyte">%.1f kB</string>
+ <string name="volume_mbyte">%.1f MB</string>
+ <string name="volume_gbyte">%.1f GB</string>
</resources>
diff --git a/app/src/main/res/values-ko/plurals-icsopenvpn.xml b/app/src/main/res/values-ko/plurals-icsopenvpn.xml
new file mode 100755
index 00000000..70489fbc
--- /dev/null
+++ b/app/src/main/res/values-ko/plurals-icsopenvpn.xml
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Generated by crowdin.com-->
+<resources></resources>
diff --git a/app/src/main/res/values-ko/strings-icsopenvpn.xml b/app/src/main/res/values-ko/strings-icsopenvpn.xml
index 640ee0f1..2ebdf272 100755
--- a/app/src/main/res/values-ko/strings-icsopenvpn.xml
+++ b/app/src/main/res/values-ko/strings-icsopenvpn.xml
@@ -50,7 +50,6 @@
<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>
<string name="random_host_prefix">임의의 호스트 접두사</string>
<string name="random_host_summary">6개 임의의 문자를 호스트 이름 앞에 추가</string>
@@ -105,6 +104,7 @@
<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에 있어, 두 번째 주소를 원격 피어 주소로 가정 하겠습니다. 로컬 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>
@@ -163,7 +163,6 @@
<string name="private_key_password">개인 키 암호</string>
<string name="password">암호</string>
<string name="file_icon">파일 아이콘</string>
- <string name="tls_authentication">TLS 인증</string>
<string name="generated_config">생성 된 설정</string>
<string name="generalsettings">설정</string>
<string name="owner_fix_summary">/dev/tun의 소유권을 시스템으로 설정 하려고 합니다. 일부 CM9 이미지에서 VPNService API를 사용하기 위해서는 앞의 작업이 요구됩니다. root권한을 가져야합니다.</string>
@@ -201,9 +200,8 @@
<string name="using_proxy">프록시 %1$s %2$d 을 사용</string>
<string name="use_system_proxy">시스템 프록시를 사용</string>
<string name="use_system_proxy_summary">연결시 전 시스템 설정에 있는 HTTP/HTTPS 프록시를 사용합니다.</string>
- <string name="donatewithpaypal">당신은 &lt;a href=\"https://www.paypal.com/cgi-bin/webscr?hosted_button_id=R2M6ZP9AF25LS&amp;amp;cmd=_s-xclick\"&gt;PayPal을 통해 기부할 수 있습니다.&lt;/a&gt; </string>
- <string name="onbootrestartsummary">OpenVPN은 시스템 재부팅/종료에 활성화 되었으면 VPN을 다시 연결합니다. 이 옵션을 사용 하기 전에 연결 경고 FAQ를 읽어 보시기 바랍니다.</string>
- <string name="onbootrestart">재시작 후 다시 연결</string>
+ <string name="onbootrestartsummary">이 시스템 부팅에 활성화 된 경우 OpenVPN을 지정된 VPN을 연결합니다. 안드로이드 &lt; 5.0에이 옵션을 사용하기 전에 연결 경고 FAQ를 읽어 보시기 바랍니다.</string>
+ <string name="onbootrestart">부팅에 연결</string>
<string name="ignore">무시</string>
<string name="restart">다시 시작</string>
<string name="restart_vpn_after_change">VPN을 다시 시작한 후 설정 변경 내용이 적용 됩니다. VPN을 지금 (재)시작?</string>
@@ -249,7 +247,6 @@
<string name="state_tcp_connect">연결중 (TCP)</string>
<string name="state_auth_failed">인증 실패</string>
<string name="state_nonetwork">사용 가능한 네트워크 대기중</string>
- <string name="statusline_bytecount">↓%2$s/s %1$s - ↑%4$s/s %3$s</string>
<string name="notifcation_title_notconnect">연결 되지 않음</string>
<string name="start_vpn_title">VPN %s 연결중</string>
<string name="start_vpn_ticker">VPN %s 연결중</string>
diff --git a/app/src/main/res/values-nl/plurals-icsopenvpn.xml b/app/src/main/res/values-nl/plurals-icsopenvpn.xml
new file mode 100755
index 00000000..5dd855b4
--- /dev/null
+++ b/app/src/main/res/values-nl/plurals-icsopenvpn.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Generated by crowdin.com-->
+<resources>
+ <plurals name="months_left">
+ <item quantity="one">Nog één maand</item>
+ <item quantity="other">Nog %d maanden</item>
+ </plurals>
+ <plurals name="days_left">
+ <item quantity="one">Nog één dag</item>
+ <item quantity="other">Nog %d dagen</item>
+ </plurals>
+ <plurals name="hours_left">
+ <item quantity="one">Nog één uur</item>
+ <item quantity="other">Nog %d uren</item>
+ </plurals>
+ <plurals name="minutes_left">
+ <item quantity="one">Nog één minuut</item>
+ <item quantity="other">Nog %d minuten</item>
+ </plurals>
+</resources>
diff --git a/app/src/main/res/values-nl/strings-icsopenvpn.xml b/app/src/main/res/values-nl/strings-icsopenvpn.xml
index da57e5e0..838ae5b9 100755
--- a/app/src/main/res/values-nl/strings-icsopenvpn.xml
+++ b/app/src/main/res/values-nl/strings-icsopenvpn.xml
@@ -44,19 +44,20 @@
<string name="duplicate_profile_name">Profielnaam is al in gebruik</string>
<string name="profilename">Profiel name</string>
<string name="no_keystore_cert_selected">Geen gebruikerscertificaat geselecteerd</string>
+ <string name="no_ca_cert_selected">Je moet een CA certificaat selecteren</string>
<string name="no_error_found">Geen fout.</string>
<string name="config_error_found">Fout in de configuratie</string>
<string name="ipv4_format_error">Fout bij inlezen van IPv4-adres</string>
<string name="custom_route_format_error">Fout bij inlezen van aangepaste routes</string>
<string name="pw_query_hint">(vrij laten voor query op aanvraag)</string>
- <string name="vpn_shortcut">Open VPN shortcut</string>
- <string name="vpn_launch_title">Met VPN verbinden</string>
+ <string name="vpn_shortcut">OpenVPN snelkoppeling</string>
+ <string name="vpn_launch_title">Verbinding maken met VPN&#8230;</string>
<string name="shortcut_profile_notfound">Het profiel zoals aangegeven in de snelkoppeling kon niet gevonden worden.</string>
<string name="random_host_prefix">Willekeurig Host Voorvoegsel</string>
<string name="random_host_summary">Voegt 6 willekeurige tekens toe voor de hostname</string>
<string name="custom_config_title">Eigen configuratie opties</string>
<string name="custom_config_summary">Geef je eigen configuratieopties aan. Wees voorzichtig!</string>
- <string name="route_rejected">Route geweigert door Android</string>
+ <string name="route_rejected">Route geweigerd door Android</string>
<string name="cancel_connection">Verbinding verbreken</string>
<string name="cancel_connection_long">VPN verbinding verbreken</string>
<string name="clear_log">logboek wissen</string>
@@ -106,14 +107,19 @@
<string name="version_info">%1$s %2$s</string>
<string name="send_logfile">Logboek verzenden</string>
<string name="send">Verzenden</string>
+ <string name="ics_openvpn_log_file">ICS OpenVPN logbestand</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="copying_log_entries">Loggegevens aan het kopiëren</string>
+ <string name="faq_shortcut">Snelkoppeling naar start</string>
<string name="encryption">Codering</string>
<string name="cipher_dialog_title">Codering methode</string>
+ <string name="menu_import">Importeer profiel van ovpn bestand</string>
<string name="menu_import_short">Import</string>
+ <string name="error_reading_config_file">Fout bij het lezen van het configuratiebestand</string>
<string name="add_profile">Profiel toevoegen</string>
<string name="import_could_not_open">Kon het bestand %1$s, zoals aangegeven in de geïmporteerde configuratie niet vinden</string>
<string name="importing_config">Geïmporteerde configuratie bestand uit %1$s</string>
@@ -133,10 +139,109 @@
<string name="private_key_password">Privé Sleutel Wachtwoord</string>
<string name="password">Wachtwoord</string>
<string name="file_icon">bestands pictogram</string>
- <string name="tls_authentication">TLS Verificatie</string>
<string name="generated_config">Gegenereerde Configuratie</string>
<string name="generalsettings">Instellingen</string>
+ <string name="owner_fix">Verbeter eigendom van /dev/tun</string>
+ <string name="generated_config_summary">Toont het gegenereerde OpenVPN configuratiebestand</string>
<string name="edit_profile_title">Bewerken van \"%s\"</string>
<string name="building_configration">Opbouwen configuratie&#8230;</string>
+ <string name="netchange_summary">Het inschakelen van deze optie zal opnieuw verbinden na het veranderen van de netwerk status (bijv. van WiFi naar mobiel) forceren</string>
+ <string name="netchange">Opnieuw verbinden na netwerkverandering</string>
+ <string name="netstatus">Netwerk status: %s</string>
+ <string name="select_file">Selecteer</string>
+ <string name="show_log_window">Toon logboekvenster</string>
+ <string name="error_rsa_sign">Fout bij het ondertekenen met Android keystore sleutel %1$s: %2$s</string>
+ <string name="faq_system_dialogs_title">Verbindingswaarschuwing en meldingsgeluid</string>
<string name="ipdns">IP en DNS</string>
+ <string name="advanced">Geanvanceerd</string>
+ <string name="export_config_title">ICS Openvpn configuratie</string>
+ <string name="faq_howto_title">Snelle start</string>
+ <string name="setting_loadtun">Laad tun module</string>
+ <string name="getproxy_error">Fout bij het opvragen van proxy-instellingen: %s</string>
+ <string name="use_system_proxy">Gebruik systeemproxy</string>
+ <string name="use_system_proxy_summary">Gebruik de systeemconfiguratie voor HTTP/HTTPS proxys om te verbinden.</string>
+ <string name="onbootrestart">Verbinden bij het opstarten</string>
+ <string name="ignore">Negeren</string>
+ <string name="restart">Opnieuw starten</string>
+ <string name="configuration_changed">Configuratie gewijzigd</string>
+ <string name="no_vpn_profiles_defined">Geen VPN-profielen gedefinieerd.</string>
+ <string name="persisttun_summary">Niet terugvallen op geen VPN-verbinding wanneer OpenVPN opnieuw aan het verbinden is.</string>
+ <string name="persistent_tun_title">Persistent tun</string>
+ <string name="openvpn_log">OpenVPN log</string>
+ <string name="import_config">Importeer OpenVPN configuratie</string>
+ <string name="battery_consumption_title">Batterijverbruik</string>
+ <string name="faq_tethering">De Android Tethering feature (via WiFi, USB of Bluetooth) en de VPNService API (die gebruikt wordt door dit programma) werken niet samen. Voor meer details, zie &lt;a href=\"https://github.com/schwabe/ics-openvpn/issues/34\"&gt;issue #34&lt;/a&gt;</string>
+ <string name="vpn_tethering_title">VPN en Tethering</string>
+ <string name="connection_retries">Verbinding pogingen</string>
+ <string name="reconnection_settings">Instellingen voor opnieuw verbinden</string>
+ <string name="connectretrywait">Seconden tussen verbindingen</string>
+ <string name="notifcation_title">OpenVPN - %s</string>
+ <string name="state_connecting">Aan het verbinden</string>
+ <string name="state_wait">Wachten op antwoord van de server</string>
+ <string name="state_get_config">Clientconfiguratie ophalen</string>
+ <string name="state_assign_ip">IP-addressen toewijzen</string>
+ <string name="state_connected">Verbonden</string>
+ <string name="state_disconnected">Verbinding verbreken</string>
+ <string name="state_reconnecting">Opnieuw aan het verbinden</string>
+ <string name="state_exiting">Afsluiten</string>
+ <string name="state_noprocess">Niet actief</string>
+ <string name="state_tcp_connect">Aan het verbinden (TCP)</string>
+ <string name="notifcation_title_notconnect">Niet verbonden</string>
+ <string name="start_vpn_title">Verbinding maken met VPN %s</string>
+ <string name="start_vpn_ticker">Verbinding maken met VPN %s</string>
+ <string name="built_by">gebouwd door %s</string>
+ <string name="debug_build">debug build</string>
+ <string name="official_build">officiële build</string>
+ <string name="make_selection_inline">Kopieer naar profiel</string>
+ <string name="crashdump">Crashdump</string>
+ <string name="add">Toevoegen</string>
+ <string name="send_config">Verstuur configureerbestand</string>
+ <string name="complete_dn">Volledige DN</string>
+ <string name="rdn_prefix">RDN voorvoegsel</string>
+ <string name="allowed_apps">Toegestane apps: %s</string>
+ <string name="save_password">Wachtwoord opslaan</string>
+ <string name="pauseVPN">Pauzeer VPN</string>
+ <string name="resumevpn">Hervat VPN</string>
+ <string name="state_screenoff">VPN gepauzeerd - scherm uit</string>
+ <string name="vpnbehaviour">VPN gedrag</string>
+ <string name="thanks_for_donation">Bedankt voor het doneren van %s!</string>
+ <string name="logCleared">Log gewist.</string>
+ <string name="show_password">Toon wachtwoord</string>
+ <string name="timestamp_short">Kort</string>
+ <string name="timestamp_iso">ISO</string>
+ <string name="timestamps_none">Geen</string>
+ <string name="uploaded_data">Upload</string>
+ <string name="downloaded_data">Download</string>
+ <string name="vpn_status">VPN Status</string>
+ <string name="logview_options">Toon opties</string>
+ <string name="full_licenses">Volledige licenties</string>
+ <string name="userpw_file">Gebruikersnaam/Wachtwoord bestand</string>
+ <string name="imported_from_file">[Geïmporteerd uit: %s]</string>
+ <string name="import_log">Importeer log:</string>
+ <string name="loading">Aan het laden&#8230;</string>
+ <string name="allowed_vpn_apps_info">Toegestane VPN apps: %1$s</string>
+ <string name="disallowed_vpn_apps_info">Niet toegestane VPN apps: %1$s</string>
+ <string name="keep">Houden</string>
+ <string name="delete">Verwijderen</string>
+ <string name="server_list">Serverlijst</string>
+ <string name="vpn_allowed_apps">Toegestane apps</string>
+ <string name="advanced_settings">Geavanceerde instellingen</string>
+ <string name="tls_settings">TLS-instellingen</string>
+ <string name="show_log">Toon logboek</string>
+ <string name="version_upto">%s en eerder</string>
+ <string name="copy_of_profile">Kopie van %s</string>
+ <string name="ab_secondary_users_title">Secundaire tabletgebruikers</string>
+ <string name="version_and_later">%s en hoger</string>
+ <string name="Search">Zoeken</string>
+ <string name="protocol">Protocol</string>
+ <string name="enabled_connection_entry">Ingeschakeld</string>
+ <string name="samsung_broken_title">Samsung telefoons</string>
+ <string name="novpn_selected">Geen VPN geselecteerd.</string>
+ <string name="reconnect">Opnieuw verbinden</string>
+ <string name="qs_connect">Verbinden met %s</string>
+ <string name="qs_disconnect">Verbinding met %s verbreken</string>
+ <string name="change_sorting">Verander sortering</string>
+ <string name="sort">Sorteer</string>
+ <string name="sorted_lru">Profielen gesorteerd op laatst recent gebruikte</string>
+ <string name="sorted_az">Profielen gesorteerd op naam</string>
</resources>
diff --git a/app/src/main/res/values-no/plurals-icsopenvpn.xml b/app/src/main/res/values-no/plurals-icsopenvpn.xml
new file mode 100755
index 00000000..f4716401
--- /dev/null
+++ b/app/src/main/res/values-no/plurals-icsopenvpn.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Generated by crowdin.com-->
+<resources>
+ <plurals name="months_left">
+ <item quantity="one">En måned igjen</item>
+ <item quantity="other">%d måneder igjen</item>
+ </plurals>
+ <plurals name="days_left">
+ <item quantity="one">En dag igjen</item>
+ <item quantity="other">%d dager igjen</item>
+ </plurals>
+ <plurals name="hours_left">
+ <item quantity="one">En time igjen</item>
+ <item quantity="other">%d timer igjen</item>
+ </plurals>
+ <plurals name="minutes_left">
+ <item quantity="one">Ett minutt igjen</item>
+ <item quantity="other">%d minutter igjen</item>
+ </plurals>
+</resources>
diff --git a/app/src/main/res/values-no/strings-icsopenvpn.xml b/app/src/main/res/values-no/strings-icsopenvpn.xml
index b227c4b6..4ebf757a 100755
--- a/app/src/main/res/values-no/strings-icsopenvpn.xml
+++ b/app/src/main/res/values-no/strings-icsopenvpn.xml
@@ -44,13 +44,14 @@
<string name="duplicate_profile_name">Skriv inn et unikt profilnavn</string>
<string name="profilename">Profilnavn</string>
<string name="no_keystore_cert_selected">Du må velge et brukersertifikat</string>
+ <string name="no_ca_cert_selected">Du må velge et CA-sertifikat</string>
<string name="no_error_found">Ingen feil funnet</string>
<string name="config_error_found">Feil i konfigurasjonen</string>
<string name="ipv4_format_error">Feil ved analyse av IPv4-adressen</string>
<string name="custom_route_format_error">Feil ved analyse av egendefinerte ruter</string>
<string name="pw_query_hint">(La stå tomt for å søke på forespørsel)</string>
<string name="vpn_shortcut">OpenVPN snarvei</string>
- <string name="vpn_launch_title">Koble til VPN</string>
+ <string name="vpn_launch_title">Kobler til VPN&#8230;</string>
<string name="shortcut_profile_notfound">Profilen som er angitt i snarveien ble ikke funnet</string>
<string name="random_host_prefix">Tilfeldig vert prefiks</string>
<string name="random_host_summary">Legger til 6 tilfeldige tegn foran vertsnavn</string>
@@ -67,28 +68,55 @@
<string name="check_remote_tlscert_title">Forvent TLS-serversertifikat</string>
<string name="remote_tlscn_check_summary">Kontrollerer eksternt tjenersertifikatemne DN</string>
<string name="remote_tlscn_check_title">Sjekk av vertsnavn i sertifikat</string>
+ <string name="tls_key_auth">Aktiver autentisering med TLS-nøkkel</string>
<string name="tls_auth_file">TLS-Auth-fil</string>
+ <string name="pull_on_summary">Etterspør IP-adresser, ruter og alternativer for timing fra serveren.</string>
+ <string name="pull_off_summary">Serveren etterspør ingen informasjon. Innstillinger må angis nedenfor.</string>
+ <string name="use_pull">Trekk innstillinger</string>
<string name="dns">DNS</string>
+ <string name="override_dns">Overstyr DNS-innstillinger etter Server</string>
<string name="dns_override_summary">Bruk din egen DNS-server</string>
<string name="dns1_summary">DNS-Server som skal brukes.</string>
<string name="dns_server">DNS-server</string>
+ <string name="secondary_dns_message">Sekundær DNS-server brukes hvis den vanlige DNS-serveren ikke kan nås.</string>
+ <string name="backup_dns">Backup-DNS-server</string>
+ <string name="default_route_summary">Omdirigerer all trafikk over VPN</string>
<string name="use_default_title">Bruk standard rute</string>
<string name="custom_routes_title">Egendefinert rute</string>
+ <string name="custom_routes_title_excluded">Ekskluder nettverk</string>
<string name="log_verbosity_level">Detaljnivå for Logging</string>
+ <string name="float_summary">Tillater autentiserte pakker fra enhver IP</string>
+ <string name="float_title">Tillat flytende server</string>
<string name="custom_options_title">Egendefinerte valg</string>
<string name="edit_vpn">Rediger VPN-innstillinger</string>
+ <string name="remove_vpn_query">Fjerne VPN-profilen \'%s\'?</string>
+ <string name="tun_open_error">Kunne ikke åpne tun-grensesnittet</string>
<string name="error">"Feil:"</string>
<string name="clear">Fjern</string>
+ <string name="last_openvpn_tun_config">Åpner tun-grensesnittet:</string>
+ <string name="local_ip_info">Lokal IPv4: %1$s/%2$d IPv6: %3$s MTU: %4$d</string>
+ <string name="dns_server_info">DNS-server: %1$s, domene: %2$s</string>
+ <string name="routes_info_incl">Ruter: %1$s %2$s</string>
+ <string name="routes_info_excl">Ekskluderte ruter: %1$s %2$s</string>
+ <string name="routes_debug">VpnService-ruter som er installert: %1$s %2$s</string>
<string name="version_info">%1$s %2$s</string>
<string name="send_logfile">Send loggfilen</string>
<string name="send">Send</string>
<string name="ics_openvpn_log_file">ICS OpenVPN loggfil</string>
+ <string name="copied_entry">Kopierte oppføring i loggen til utklippstavlen</string>
<string name="tap_mode">Tap modus</string>
+ <string name="faq_tap_mode">Tap-modus er ikke mulig med ikke-root APN API. Denne appen kan derfor ikke bidra med tap-støtte</string>
+ <string name="tap_faq2">Igjen? Tuller du? Nei, Tap-modus støttes ikke. Flere e-poster med forespørsler om det vil bli støtte vil heller ikke hjelpe.</string>
+ <string name="tap_faq3">En tredje gang? Egentlig så kan man skrive en taå-emulator basert på tun-grensesnittet som ville gitt layer2-informasjon ved sending og fjernet layer2-informasjon ved mottakelse. Men, denne tap-emulatoren ville også måtte ha implementert ARP og muligens en DHSP-klient. Som utvikler er jeg ikke kjent med at noen arbeider med noe i denne retningen. Ta kontakt med meg dersom du ønsker å programmere dette.</string>
<string name="faq">FAQ</string>
<string name="copying_log_entries">Kopier loggoppføringer</string>
<string name="faq_shortcut">Snarvei til start</string>
+ <string name="faq_howto_shortcut">Du kan legge inn en snarvei for å starte OpenVPN på skrivebordet. Avhengig av ditt startskjermprogram må du legge til enten en snarvei eller en widget.</string>
+ <string name="no_vpn_support_image">Bildet ditt støtter ikke VPNService API, beklager :(</string>
<string name="encryption">Kryptering</string>
<string name="cipher_dialog_title">Angi krypteringsmetode</string>
+ <string name="chipher_dialog_message">Skriv inn krypteringskrypteringsalgoritmen som brukes av OpenVPN. La det stå tomt for å bruke standard kryptering.</string>
+ <string name="auth_dialog_message">Skriv inn godkjenningsfordeling som brukes til OpenVPN. La være tom for å bruke standard fordøyelse.</string>
<string name="settings_auth">Autentisering/kryptering</string>
<string name="file_explorer_tab">Filutforsker</string>
<string name="error_importing_file">Feil ved import av fil</string>
@@ -101,9 +129,11 @@
<string name="import_could_not_open">Finner ikke filen %1$s nevnt i importert konfigurasjons fil</string>
<string name="importing_config">Importerer konfigurasjonsfilen fra kilde %1$s</string>
<string name="import_done">Ferdig med å lese konfigurasjons-filen.</string>
+ <string name="nobind_summary">Ikke bind til lokal adresse og port</string>
<string name="no_bind">Ingen lokale binding</string>
<string name="import_configuration_file">Importer konfigurasjonsfil</string>
<string name="faq_security_title">Sikkerhetsvurderinger</string>
+ <string name="faq_security">"Som OpenVPN er sikkerhetsfølsomt, er noen få notater om sikkerhet fornuftig. Alle data på SD-kortet er iboende usikre. Hvert program kan lese det (for eksempel krever dette programmet ingen spesielle SD-kortrettigheter). Dataene i denne applikasjonen kan bare leses Ved bruk av importalternativet for cacert/cert/nøkkel i fildialogen lagres dataene i VPN-profilen. VPN-profilene er bare tilgjengelige for dette programmet. (Ikke glem å slette kopier på SD Kort etterpå). Selv om det kun er tilgjengelig med denne applikasjonen, er dataene fortsatt ukrypterte. Ved å rote telefonen eller andre utnytelser kan det hende at dataene kan hentes. Lagrede passord lagres også i vanlig tekst. For pkcs12-filer anbefales det sterkt At du importerer dem inn i android-nøkkelbutikken. "</string>
<string name="import_vpn">Importer</string>
<string name="broken_image_cert_title">Feil ved visning av sertifikatvalg</string>
<string name="ipv4">IPv4</string>
@@ -116,15 +146,18 @@
<string name="private_key_password">Privat nøkkel passord</string>
<string name="password">Passord</string>
<string name="file_icon">fil ikon</string>
- <string name="tls_authentication">TLS-godkjenning</string>
+ <string name="tls_authentication">TLS Godkjenning/Kryptering</string>
<string name="generated_config">Generert konfigurasjon</string>
+ <string name="generalsettings">Innstillinger</string>
<string name="owner_fix">Fiks eierskap av /dev/tun</string>
+ <string name="generated_config_summary">Viser den genererte OpenVPN konfigurasjonsfilen</string>
<string name="edit_profile_title">Rediger \"%s\"</string>
<string name="building_configration">Lager konfigurasjon&#8230;</string>
<string name="netchange">Koble til på nytt ved nettverks endring</string>
<string name="netstatus">Nettverksstatus: %s</string>
<string name="select_file">Velg</string>
<string name="show_log_window">Vis logg-vindu</string>
+ <string name="faq_system_dialogs_title">Tilkoblingsvarsel og varslingslyd</string>
<string name="translationby">Norsk oversettelse av Jonny</string>
<string name="ipdns">IP og DNS</string>
<string name="basic">Grunnleggende</string>
@@ -138,8 +171,6 @@
<string name="using_proxy">Bruker proxy %1$s %2$d</string>
<string name="use_system_proxy">Bruk systemet proxy</string>
<string name="use_system_proxy_summary">Bruk global systemkonfigurasjon for HTTP/HTTPS proxy for å koble til.</string>
- <string name="donatewithpaypal">Du kan &lt;a href=\"https://www.paypal.com/cgi-bin/webscr?hosted_button_id=R2M6ZP9AF25LS&amp;amp;cmd=_s-xclick\"&gt;donere med PayPal&lt;/a&gt; </string>
- <string name="onbootrestart">Koble til på nytt ved restart</string>
<string name="ignore">Ignorer</string>
<string name="restart">Start på nytt</string>
<string name="configuration_changed">Konfigurasjon endret</string>
@@ -150,4 +181,45 @@
<string name="openvpn_log">OpenVPN Logg</string>
<string name="import_config">Importer OpenVPN konfigurasjon</string>
<string name="battery_consumption_title">Batteriforbruk</string>
+ <string name="minidump_generated">OpenVPN krasjet uventet. Vennligst vurder bruk av Minidump-alternativet i hovedmenyen</string>
+ <string name="send_minidump">Send Minidump til utvikler</string>
+ <string name="send_minidump_summary">Sender feilsøkingsinformasjon om siste krasj til utvikler</string>
+ <string name="notifcation_title">OpenVPN - %s</string>
+ <string name="session_ipv4string">%1$s - %2$s</string>
+ <string name="session_ipv6string">%1$s - %3$s, %2$s</string>
+ <string name="state_connecting">Kobler til</string>
+ <string name="state_wait">Venter på serverrespons</string>
+ <string name="state_auth">Autentisering</string>
+ <string name="state_get_config">Få klient konfigurasjon</string>
+ <string name="state_assign_ip">Tilordne IP-adresser</string>
+ <string name="state_add_routes">Legge til ruter</string>
+ <string name="state_connected">Tilkoblet</string>
+ <string name="state_disconnected">Koble fra</string>
+ <string name="state_reconnecting">Koble til igjen</string>
+ <string name="state_exiting">Avslutter</string>
+ <string name="state_noprocess">Kjører ikke</string>
+ <string name="state_resolve">Løse vertsnavn</string>
+ <string name="state_tcp_connect">Kobler til (TCP)</string>
+ <string name="state_auth_failed">Autentisering mislyktes</string>
+ <string name="notifcation_title_notconnect">Ikke tilkoblet</string>
+ <string name="start_vpn_title">Kobler til VPN %s</string>
+ <string name="start_vpn_ticker">Kobler til VPN %s</string>
+ <string name="encryption_cipher">Kryptering chiffer</string>
+ <string name="packet_auth">Pakkegodkjenning</string>
+ <string name="auth_dialog_title">Angi pakkeautentiseringsmetode</string>
+ <string name="built_by">bygget av %s</string>
+ <string name="make_selection_inline">Kopier til profil</string>
+ <string name="add">Legg til</string>
+ <string name="send_config">Send konfigurasjonsfilen</string>
+ <string name="complete_dn">Fullfør DN</string>
+ <string name="remotetlsnote">Din importerte konfigurasjon brukte det gamle DEPRECATED tls-remote-alternativet som bruker et annet DN-format.</string>
+ <string name="rdn">RDN (vanlig navn)</string>
+ <string name="rdn_prefix">RDN prefiks</string>
+ <string name="help_translate">Du kan bidra til å oversette ved å besøke http://crowdin.net/project/ics-openvpn/invite</string>
+ <string name="screenoff_title">Pause VPN-tilkobling etter at skjermen er slått av</string>
+ <string name="import_log">Importer logg:</string>
+ <string name="client_behaviour">Klient adferd</string>
+ <string name="clear_external_apps">Slett tillatte eksterne apper</string>
+ <string name="loading">Laster&#8230;</string>
+ <string name="allowed_vpn_apps_info">Tillatte VPN-apper: %1$s</string>
</resources>
diff --git a/app/src/main/res/values-no/strings.xml b/app/src/main/res/values-no/strings.xml
index 500f5bcd..db93ebc6 100644
--- a/app/src/main/res/values-no/strings.xml
+++ b/app/src/main/res/values-no/strings.xml
@@ -2,7 +2,5 @@
<resources>
<string name="info">info</string>
<string name="show_connection_details">Vis Tilkoblingsdetaljer</string>
- <string name="dns_server_info">DNS-server: %s</string>
- <string name="dns_domain_info">DNS-domene: %s</string>
<string name="routes_info">Ruter: %s</string>
</resources>
diff --git a/app/src/main/res/values-pl/plurals-icsopenvpn.xml b/app/src/main/res/values-pl/plurals-icsopenvpn.xml
new file mode 100755
index 00000000..70489fbc
--- /dev/null
+++ b/app/src/main/res/values-pl/plurals-icsopenvpn.xml
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Generated by crowdin.com-->
+<resources></resources>
diff --git a/app/src/main/res/values-pl/strings-icsopenvpn.xml b/app/src/main/res/values-pl/strings-icsopenvpn.xml
index 04b8f56c..40c9c522 100755
--- a/app/src/main/res/values-pl/strings-icsopenvpn.xml
+++ b/app/src/main/res/values-pl/strings-icsopenvpn.xml
@@ -9,7 +9,7 @@
<string name="address">Adres serwera:</string>
<string name="port">Port serwera:</string>
<string name="location">Ścieżka</string>
- <string name="cant_read_folder">Nie mogę odczytać katalogu</string>
+ <string name="cant_read_folder">Brak możliwości czytania z katalogu</string>
<string name="select">Wybierz</string>
<string name="cancel">Anuluj</string>
<string name="no_data">Brak danych</string>
@@ -21,7 +21,7 @@
<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 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="copyright_others">Program ten wykorzystuje następujące składniki; szczegółowe informacje o licencjach znajdziesz w kodzie źródłowym</string>
<string name="about">O programie</string>
<string name="vpn_list_title">Profile</string>
<string name="vpn_type">Typ</string>
@@ -44,13 +44,14 @@
<string name="duplicate_profile_name">Wybierz unikalną nazwę profilu</string>
<string name="profilename">Nazwa profilu</string>
<string name="no_keystore_cert_selected">Musisz wybrać certyfikat użytkownika</string>
+ <string name="no_ca_cert_selected">Musisz wybrać certyfikat CA</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 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>
+ <string name="vpn_launch_title">Podłączanie do VPN...</string>
<string name="shortcut_profile_notfound">Nie odnaleziono profilu określonego w skrócie</string>
<string name="random_host_prefix">Losowy prefiks hosta</string>
<string name="random_host_summary">Dodaje 6 losowych znaków przed nazwą hosta</string>
@@ -164,7 +165,7 @@
<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="tls_authentication">Uwierzytelnianie TLS / Szyfrowanie</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>
@@ -203,9 +204,8 @@
<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">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 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="onbootrestartsummary">OpenVPN połączy się z wybranym VPN jeżeli będzie aktywny podczas startu systemu. Przeczytaj FAQ dotyczący połączeń przed zastosowaniem tej opcji na Androidzie &lt; 5.0.</string>
+ <string name="onbootrestart">Połącz przy starcie</string>
<string name="ignore">Ignoruj</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>
@@ -252,7 +252,6 @@
<string name="state_tcp_connect">Łączenie (TCP)</string>
<string name="state_auth_failed">Błąd autentykacji</string>
<string name="state_nonetwork">Czekam na sieć</string>
- <string name="statusline_bytecount">↓%2$s/s %1$s - ↑%4$s/s %3$s</string>
<string name="notifcation_title_notconnect">Niepołączony</string>
<string name="start_vpn_title">Łączę z VPN %s</string>
<string name="start_vpn_ticker">Łączę z VPN %s</string>
@@ -311,6 +310,7 @@
<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="faq_system_dialog_xposed">Jeśli masz dostęp do roota możesz zaisntalować &lt;a href=\"http://xposed.info/\"&gt;Xposed framework&lt;/a&gt; oraz &lt;a href=\"http://repo.xposed.info/module/de.blinkt.vpndialogxposed\"&gt;VPN potwierdzi moduł&lt;/a&gt;na wsłasne ryzyko\"</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>
@@ -347,12 +347,16 @@
<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_android_clients">Istnieje wiele klientów OpenVPN dla systemu Android. Najpopularniejszym jest OpenVPN for Android (ten klient), OpenVPN Connect oraz OpenVPN Settings.&lt;p&gt;Aplikacje można podzielić na dwie grupy: OpenVPN for Android oraz OpenVPN Connect używają oficjalnego API VPNService (Android 4.0+) i nie wymagają rootowania urządzenia oraz OpenVPN Settings, który wymagania rootowania.&lt;p&gt;OpenVPN for Android jest klientem otwarto-źródłowym i stworzonym przez Arne Schwabe. Dedykowany jest dla bardziej zaawansowanych użytkowników oraz oferuje wiele opcji konfiguracji włącznie z możliwością importowania i modyfikacji konfiguracji zapisanych do pliku. Ten klient powstał w oparciu o społecznościową wersję OpenVPN w wersji 2.x. Ten klient może uchodzić za oficjalnego klienta używanego przez społeczność. &lt;p&gt;OpenVPN Connect nie jest aplikacją otwarto-źródłową i został stworzony przez OpenVPN Technologies, Inc. Klient przeznaczony jest do generalnego użytku, dedykowany dla przeciętnego użytkownika i również umożliwia importowanie konfiguracji. Ten klient bazuje na implementacji protokołu OpenVPN w języku C++ (podyktowanego to było warunkami umożliwiającymi OpenVPN Technologies, Inc opublikowanie wersji klienta dla systemu iOS). Jest to oficjalny klient OpenVPN Technologies, Inc. &lt;p&gt; OpenVPN Settings jest najstarszym z wymienionych klientów i jednocześnie interfejsem graficznym dla otwarto-źródłowego OpenVPN. W odróżnieniu od OpenVPN for Android wymaga rootowania urządzenia i nie wykorzystuje VPNService API. Nie wymaga do działania Android 4.0+</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_proxy">Android będzie używał Twoich ustawień proxy dla połączenia mobilnego/Wi-Fi kiedy nie jest sprecyzowany serwer DNS.
+OpenVPN dla Androida ostrzeże Cię o tym w logu.<p>Kiedy VPN ustawi serwer DNS Android nie będzie używał więcej proxy. Nie ma żadnego API do ustawienia proxy dla połączenia VPN.</p></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_not_route_to_vpn">Brakuje konfiguracji tras dla adresu IP klienta oraz masek podsieci. OpenVPN rozwiązuje ten problem przez dodanie trasy odpowiedniej dla adresu IP klienta i maski jego podsieci</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>
@@ -370,6 +374,8 @@
<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="tls_cipher_alert_title">Uzgodnienie połączenia nie powiodło się z kodem błędu: SSL23_GET_SERVER_HELLO:sslv3</string>
+ <string name="tls_cipher_alert">Nowsze wersje OpenVPN for Android (od wersji 0.6.29 z marca 2015) używają domyślnie bezpieczniejszego szyfrowania (tls-cipher \"DEFAULT:!EXP:!PSK:!SRP:!kRSA\"). Niestety, pominięcie mniej bezpiecznego szyfrowania - w szczególności pominięcie metod szyfrowania niewspierających Perfekcyjnego Utajnienia Przekazywania - powoduje pewne problemy. Te, najczęściej są spowodowane przez dobrze motywowane lecz źle wykonane próby poprawienia bezpieczeństwa TLS przez ustawienie tls-cipher na serwerze lub niektórych systemach wbudowanych z ograniczonym SSL (np.: MikroTik).\n W celu rozwiązania tego problemu, ustaw tls-cipher na serwerze na rozsądną wartość (np.: tls-cipher \"DEFAULT:!EXP:!PSK:!SRP:!kRSA\"). W celu rozwiązania problemu po stronie klienta - ustaw niestandardową wartość: tls-cipher DEFAULT.</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>
@@ -382,7 +388,31 @@
<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>
+ <string name="permission_revoked">Pozwolenie VPN odwołane przez system (na przykład inny program VPN jest uruchomiony), zatrzymuję VPN</string>
+ <string name="pushpeerinfo">Naciśnij \"Peer info\"</string>
+ <string name="pushpeerinfosummary">Wyślij dodatkowe informację do serwera, na przykład wersję SSL oraz Androida</string>
+ <string name="pw_request_dialog_title">Potrzeba %1$s</string>
+ <string name="pw_request_dialog_prompt">Proszę podać hasło do profilu %1$s</string>
+ <string name="menu_use_inline_data">Użyj danych podanych explicite</string>
+ <string name="export_config_chooser_title">Eksportuj plik konfiguracyjny</string>
+ <string name="missing_tlsauth">Plik tls-auth nie odnaleziony</string>
+ <string name="missing_certificates">Brakujący certyfikat użytkownika lub plik klucza certyfikatu użytkownika</string>
+ <string name="missing_ca_certificate">Brak certyfikatu CA</string>
+ <string name="crl_title">Lista unieważnionych certyfikatów (opcjonalnie)</string>
+ <string name="reread_log">Odśwież %d wpis(ów) dziennika z pliku pamięci podręcznej</string>
+ <string name="samsung_broken">Pomimo, że telefony marki Samsung są jednymi z najliczniej sprzedawanych urządzeń z Androidem, oprogramowanie układowe Samsunga jest jednocześnie jednym z posiadających najwięcej błędów. Błędy nie ograniczają się wyłącznie do operacji związanych z VPN a wiele z nich zostało rozwiązanych technikami tymczasowymi. Poniższa lista przedstawia kilka ze wspomnianych błędów.\n\nDNS nie działa poza zakresem VPN.\n\nNa wielu urządzeniach marki Samsung z Androidem 5.x aplikacje dozwolone/niedozwolone nie działają.\n\nNa urządzeniach marki Samsung z Androidem 6.x VPN może nie działać podczas aktywnego oszczędzania energii.</string>
+ <string name="samsung_broken_title">Telefony Samsung</string>
+ <string name="novpn_selected">Nie wybrano VPN.</string>
+ <string name="reconnect">Podłącz ponownie</string>
+ <string name="qs_title">Przełącz VPN</string>
+ <string name="qs_connect">Połącz z %s</string>
+ <string name="qs_disconnect">Rozłącz %s</string>
+ <string name="connectretrymaxmessage">Podaj maksymalny czas pomiędzy kolejnymi próbami połączenia. OpenVPN będzie powoli zwiększał czas oczekiwania po każdej nieudanej próbie połączenia aż do podanej wartości. Domyślna wartość to 300 sekund.</string>
+ <string name="connectretrymaxtitle">Maksymalny czas między próbami połączenia</string>
+ <string name="state_waitconnectretry">Oczekiwanie %s sekund pomiędzy kolejnymi próbami połączenia</string>
+ <string name="management_socket_closed">Połączenie OpenVPN zamknięte (%s)</string>
+ <string name="change_sorting">Zmień sortowanie</string>
+ <string name="sort">Sortowanie</string>
+ <string name="sorted_lru">Profile posortowane według ostatnio używanych</string>
+ <string name="sorted_az">Profile sortowane według nazwy</string>
</resources>
diff --git a/app/src/main/res/values-pt/plurals-icsopenvpn.xml b/app/src/main/res/values-pt/plurals-icsopenvpn.xml
new file mode 100755
index 00000000..70489fbc
--- /dev/null
+++ b/app/src/main/res/values-pt/plurals-icsopenvpn.xml
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Generated by crowdin.com-->
+<resources></resources>
diff --git a/app/src/main/res/values-pt/strings-icsopenvpn.xml b/app/src/main/res/values-pt/strings-icsopenvpn.xml
index 994c8cc2..00523b59 100755
--- a/app/src/main/res/values-pt/strings-icsopenvpn.xml
+++ b/app/src/main/res/values-pt/strings-icsopenvpn.xml
@@ -50,7 +50,6 @@
<string name="custom_route_format_error">Erro ao analisar as rotas personalizadas</string>
<string name="pw_query_hint">(deixe em branco para consulta a pedido)</string>
<string name="vpn_shortcut">Atalho do OpenVPN</string>
- <string name="vpn_launch_title">Ligar à VPN</string>
<string name="shortcut_profile_notfound">Perfil especificado no atalho não encontrado</string>
<string name="random_host_prefix">Prefixo de Host aleatório</string>
<string name="random_host_summary">Adiciona 6 caracteres aleatórios ao nome do host</string>
@@ -65,6 +64,7 @@
<string name="remove_vpn">Remover VPN</string>
<string name="check_remote_tlscert">Verifica se o servidor utiliza um certificado com extensões TLS Server (--remote-cert-tls server)</string>
<string name="check_remote_tlscert_title">Esperar certificado do servidor TLS</string>
+ <string name="remote_tlscn_check_summary">Verifica o assunto DN do certificado do servidor remoto</string>
<string name="remote_tlscn_check_title">Verificar nome de host do certificado</string>
<string name="enter_tlscn_title">Assunto do certificado remoto</string>
<string name="tls_key_auth">Ativa a autenticação de chave TLS</string>
@@ -155,7 +155,6 @@
<string name="private_key_password">Senha de chave privada</string>
<string name="password">Senha</string>
<string name="file_icon">ícone de ficheiro</string>
- <string name="tls_authentication">Autenticação TLS</string>
<string name="generated_config">Config gerado</string>
<string name="generalsettings">Configurações</string>
<string name="owner_fix">Corrija a propriedade de /dev/tun</string>
@@ -169,11 +168,16 @@
<string name="ipdns">IP e DNS</string>
<string name="basic">Básico</string>
<string name="routing">Encaminhamento</string>
+ <string name="obscure">Definições obscuras OpenVPN. Raramente necessário.</string>
<string name="advanced">Avançado</string>
+ <string name="export_config_title">Configuração Openvpn ICS</string>
<string name="faq_howto_title">Início Rápido</string>
+ <string name="setting_loadtun_summary">Tente carregar o módulo tun.ko do kernel antes de ligar. Necessita de acesso root ao dispositivo.</string>
+ <string name="setting_loadtun">Carregar o módulo tun</string>
+ <string name="getproxy_error">Erro ao obter definições proxy %s</string>
<string name="using_proxy">A utilizar proxy %1$s %2$d</string>
<string name="use_system_proxy">Usar a proxy do sistema</string>
- <string name="onbootrestart">Volte a ligar na reinicialização</string>
+ <string name="onbootrestart">Ligar no arranque</string>
<string name="ignore">Ignorar</string>
<string name="restart">Reiniciar</string>
<string name="restart_vpn_after_change">As alterações de configuração são aplicadas depois de reiniciar a VPN. Reiniciar a VPN agora?</string>
@@ -182,6 +186,7 @@
<string name="no_vpn_profiles_defined">Não há perfis de VPN definidos.</string>
<string name="add_new_vpn_hint">Use o &lt; img src = \"ic_menu_add\" / &gt; ícone para adicionar uma nova VPN</string>
<string name="vpn_import_hint">Use o &lt; img src = \"ic_menu_archive\" / &gt; ícone para importar um perfil existente (ovpn ou conf) do seu sdcard.</string>
+ <string name="faq_hint">Verifique as FAQ. Existe um guia rápido.</string>
<string name="faq_routing_title">Configuração de roteamento/Interface</string>
<string name="persistent_tun_title">Tun Persistente</string>
<string name="openvpn_log">OpenVPN Log</string>
@@ -192,6 +197,7 @@
<string name="reconnection_settings">Configurações de religação</string>
<string name="connectretrywait">Segundos entre ligações</string>
<string name="send_minidump">Enviar Minidump para desenvolvedor</string>
+ <string name="send_minidump_summary">Envia informação de depuração sobre falhas para o programador</string>
<string name="notifcation_title">OpenVPN - %s</string>
<string name="session_ipv4string">%1$s - %2$s</string>
<string name="session_ipv6string">%1$s - %3$s, %2$s</string>
@@ -210,7 +216,6 @@
<string name="state_tcp_connect">A ligar (TCP)</string>
<string name="state_auth_failed">Falha na autenticação</string>
<string name="state_nonetwork">A aguardar rede utilizável</string>
- <string name="statusline_bytecount">↓%2$s/s %1$s - ↑%4$s/s %3$s</string>
<string name="notifcation_title_notconnect">Não ligado</string>
<string name="start_vpn_title">A ligar a VPN %s</string>
<string name="start_vpn_ticker">A ligar a VPN %s</string>
@@ -233,6 +238,8 @@
<string name="remote_trust">Confio nesta aplicação.</string>
<string name="no_external_app_allowed">Nenhuma app pode usar a API externa</string>
<string name="allowed_apps">Aplicações permitidas:%s</string>
+ <string name="screenoff_title">Pausar a ligação VPN após desligar o ecrã</string>
+ <string name="screen_nopersistenttun">Aviso: Tun persistente não está ativado para esta VPN. Quando o ecrã estiver desligado o tráfego de internet usa a ligação normal.</string>
<string name="save_password">Guardar senha</string>
<string name="pauseVPN">Pausar VPN</string>
<string name="resumevpn">Retomar VPN</string>
@@ -261,8 +268,25 @@
<string name="userpw_file">Ficheiro de utilizador/senha</string>
<string name="imported_from_file">[Importado de: %s]</string>
<string name="import_log">Log de importação:</string>
+ <string name="mssfix_dialogtitle">Definir MSS do TCP payload</string>
+ <string name="client_behaviour">Comportamento cliente</string>
+ <string name="loading">A carregar&#8230;</string>
+ <string name="allowed_vpn_apps_info">Aplicações permitidas:%s</string>
+ <string name="query_delete_remote">Remover entrada do servidor remoto?</string>
+ <string name="keep">Manter</string>
+ <string name="delete">Eliminar</string>
+ <string name="server_list">Lista servidores</string>
+ <string name="vpn_allowed_apps">Aplicações permitidas</string>
+ <string name="advanced_settings">Definições avançadas</string>
+ <string name="tls_settings">Definições TLS</string>
+ <string name="duplicate_vpn">Perfil VPN duplicado</string>
+ <string name="show_log">Mostrar registo</string>
<string name="ignore_multicast_route">Ignorar caminho multicast: %s</string>
<string name="ab_only_cidr">Android apenas suporta rotas CIDR para a VPN. Pelo facto de as rotas não-CIDR quase nunca serem usadas, OpenVPN para Android irá usar uma rota /32 para rotas não-CIDR e emitir um aviso.</string>
<string name="ab_secondary_users">VPN não funcionar para utilizadores secundários.</string>
<string name="ab_only_cidr_title">Rotas não CIDR</string>
+ <string name="ab_proxy_title">Comportamento proxy para VPNs</string>
+ <string name="version_upto">%s e anteriores</string>
+ <string name="copy_of_profile">Copiar de %s</string>
+ <string name="custom_connection_options">Opções personalizadas</string>
</resources>
diff --git a/app/src/main/res/values-ro/plurals-icsopenvpn.xml b/app/src/main/res/values-ro/plurals-icsopenvpn.xml
new file mode 100755
index 00000000..8ca7bf07
--- /dev/null
+++ b/app/src/main/res/values-ro/plurals-icsopenvpn.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Generated by crowdin.com-->
+<resources>
+ <plurals name="months_left">
+ <item quantity="one">O lună rămasă</item>
+ <item quantity="few">%d luni rămase</item>
+ <item quantity="other">%d luni rămase</item>
+ </plurals>
+ <plurals name="days_left">
+ <item quantity="one">O zi rămasă</item>
+ <item quantity="few">%d zile rămase</item>
+ <item quantity="other">%d zile rămase</item>
+ </plurals>
+ <plurals name="hours_left">
+ <item quantity="one">O oră rămasă</item>
+ <item quantity="few">%d ore rămase</item>
+ <item quantity="other">%d ore rămase</item>
+ </plurals>
+ <plurals name="minutes_left">
+ <item quantity="one">Un minut rămas</item>
+ <item quantity="few">%d minute rămase</item>
+ <item quantity="other">%d minute rămase</item>
+ </plurals>
+</resources>
diff --git a/app/src/main/res/values-ro/strings-icsopenvpn.xml b/app/src/main/res/values-ro/strings-icsopenvpn.xml
index 856ffb06..cafe3011 100755
--- a/app/src/main/res/values-ro/strings-icsopenvpn.xml
+++ b/app/src/main/res/values-ro/strings-icsopenvpn.xml
@@ -44,13 +44,14 @@
<string name="duplicate_profile_name">Vă rugăm să introduceţi un nume de profil unic</string>
<string name="profilename">Nume profil</string>
<string name="no_keystore_cert_selected">Trebuie să selectați un certificat de utilizator</string>
+ <string name="no_ca_cert_selected">Trebuie să selectați un certificat CA</string>
<string name="no_error_found">Nu s-a găsit nici o eroare</string>
<string name="config_error_found">Eroare în configurare</string>
<string name="ipv4_format_error">Eroare parsare adresă IPv4</string>
<string name="custom_route_format_error">Eroare parsare rute particularizate</string>
<string name="pw_query_hint">(lăsaţi necompletat pentru a interoagre la cerere)</string>
<string name="vpn_shortcut">Scurtătură OpenVPN</string>
- <string name="vpn_launch_title">Conectare la VPN</string>
+ <string name="vpn_launch_title">Conectare la VPN&#8230;</string>
<string name="shortcut_profile_notfound">Profilul specificat în comanda rapidă nu a fost găsit</string>
<string name="random_host_prefix">Prefix host aleator</string>
<string name="random_host_summary">Adaugă 6 caractere aleatoare în faţa hostname</string>
@@ -87,7 +88,9 @@
<string name="default_route_summary">Redirecţionează tot traficul peste VPN</string>
<string name="use_default_title">Foloseşte ruta default</string>
<string name="custom_route_message">Introduceţi rute particularizate. Introduceţi destinaţia în format CIDR. \"10.0.0.0/8 2002:: / 16\" va redirecta reţelele 10.0.0.0/8 şi 2002:: / 16 peste VPN.</string>
+ <string name="custom_route_message_excluded">Rute care NU ar trebui să fie direcționate prin VPN. Utilizați aceeași sintaxă ca și pentru rutele incluse.</string>
<string name="custom_routes_title">Rute particularizate</string>
+ <string name="custom_routes_title_excluded">Rețele Excluse</string>
<string name="log_verbosity_level">Nivel detaliu jurnal</string>
<string name="float_summary">Permite pachete autentificate de la orice IP</string>
<string name="float_title">Permite floating server</string>
@@ -101,6 +104,9 @@
<string name="last_openvpn_tun_config">Se deschide interfața tun:</string>
<string name="local_ip_info">Local IPv4: %1$s/%2$d IPv6: %3$s MTU: %4$d</string>
<string name="dns_server_info">Server DNS: %1$s, Domeniu: %2$s</string>
+ <string name="routes_info_incl">Rute: %1$s %2$s</string>
+ <string name="routes_info_excl">Rute excluse: %1$s %2$s</string>
+ <string name="routes_debug">Rute VpnService instalate: %1$s %2$s</string>
<string name="ip_not_cidr">S-au primit informaţiile despre interfaţă %1$s şi %2$s, presupun că a doua adresă este adresa peer a serverlui remote. Folosesc netmask /32 pentru IP local. Modul dat de OpenVPN este \"%3$s\".</string>
<string name="route_not_cidr">Nu se poate interpreta %1$s şi %2$s ca rute IP cu netmask CIDR, folosesc /32 ca netmask.</string>
<string name="route_not_netip">Am corectat ruta %1$s/%2$s ca %3$s/%2$s</string>
@@ -114,7 +120,7 @@
<string name="faq_tap_mode">Modul Tap nu este posibil folosind API-ul VPN non root. Astfel această aplicaţie nu poate oferi suport tap</string>
<string name="tap_faq2">Din nou? Glumesti? Nu, modul tap chiar nu este suportat şi trimiţând mai multe email-uri în care îl cereţi nu va ajuta.</string>
<string name="tap_faq3">A treia oară? De fapt, cineva ar putea scrie un emulator tap bazat pe tun ce ar adăuga informaţii din layer2 la trimitere şi are elimina informaţiile layer2 la primire. Dar acest emulator ar trebui sa implementeze ARP şi probabil un client DHCP. Nu sunt la curent cu cineva care lucrează la asta. Daca vreţi sa programaţi aceste funcţii mă puteţi contacta.</string>
- <string name="faq">FAQ</string>
+ <string name="faq">Întrebări frecvente</string>
<string name="copying_log_entries">Copiere linii jurnal</string>
<string name="faq_copying">Pentru a copia o singură linie din jurnal apăsaţi şi menţineţi apăsat pe acea linie. Pentru a copia/trimite întreg jurnalul folosiţi opţiunea Trimite Jurnal. Folosiţi butonul de meniu hardware dacă nu este vizibil în GUI.</string>
<string name="faq_shortcut">Shortcut pornire</string>
@@ -122,6 +128,7 @@
<string name="no_vpn_support_image">Imaginea dvs. nu suportă API-ul VPNService, îmi pare rău :(</string>
<string name="encryption">Criptare</string>
<string name="cipher_dialog_title">Alegeţi metoda de criptare</string>
+ <string name="chipher_dialog_message">Introduceți cifrul algoritmului de criptare folosit de OpenVPN. Lăsați liber pentru a utiliza cifrul implicit.</string>
<string name="auth_dialog_message">Introduceţi autentificarea digest ce este folosită de OpenVPN. Lăsaţi gol pentru digest predefinit.</string>
<string name="settings_auth">Autentificare/criptare</string>
<string name="file_explorer_tab">File Explorer</string>
@@ -158,7 +165,7 @@
<string name="private_key_password">Parola cheie privată</string>
<string name="password">Parola</string>
<string name="file_icon">icon fişier</string>
- <string name="tls_authentication">autentificare TLS</string>
+ <string name="tls_authentication">Autentificare / criptare TLS</string>
<string name="generated_config">Config generat</string>
<string name="generalsettings">Setări</string>
<string name="owner_fix_summary">Încearcă să seteze owner-ul /dev/tun ca sistem. Unele imagini CM9 au nevoie de asta pentru a permite API-ului VPNService să funcţioneze. Are nevoie de root.</string>
@@ -174,6 +181,7 @@
<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">%10$s %9$s rulează pe %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">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>
@@ -186,6 +194,7 @@
<string name="export_config_title">Configurare Openvpn ICS</string>
<string name="warn_no_dns">Nici un server DNS utilizat. Rezolvarea de nume poate să nu funcționeze. Luați în considerare stabilirea unor servere DNS personalizate. Vă rugăm, de asemenea, rețineți că Android va continua să utilizeze setările proxy specificate pentru conexiunea mobilă/Wi-Fi atunci când nu sunt stabilite servere DNS.</string>
<string name="dns_add_error">Nu s-a putut adăuga serverul DNS \"%1$s\", respins de sistem: %2$s</string>
+ <string name="ip_add_error">Adresa IP \"%1$s\" nu a putut fi configurată, respinsă de sistem: %2$s</string>
<string name="faq_howto">&lt;p&gt;Obţineţi o configurare funcţională (testată pe calculatorul dvs. sau descărcată de la provider/companie)&lt;/p&gt;&lt;p&gt;Dacă este un singur fişier fără alte fişiere pem/pks12 puteţi să vă trimiteţi fişierul prin email şi să deschideţi ataşamentul. Daca aveţi fişiere multiple le puteţi pune pe cardul sd.&lt;/p&gt;&lt;p&gt;Click pe ataşamentul email/Folosiţi icoana director din lista de vpn-ri pentru a importa fişierul de configurare.&lt;/p&gt;&lt;p&gt;Dacă sunt erori despre fişiere lipsă le puteţi pune pe cardul sd.&lt;/p&gt;&lt;p&gt;Click pe simbolul de salvare pentru a adăuga VPN-ul importat în lista dvs. de VPN-uri&lt;/p&gt;&lt;p&gt;Conectaţi VPN-ul dând click pe numele VPN-ului&lt;/p&gt;&lt;p&gt;Dacă sunt erori/avertismente în jurnal încercaţi să le înţelegeţi şi să le reparaţi&lt;/p&gt; </string>
<string name="faq_howto_title">Pornire rapidă</string>
<string name="setting_loadtun_summary">Încearcă încărcarea modului kernel tun.ko înainte de conectare. Are nevoie de un device root-at.</string>
@@ -195,9 +204,8 @@
<string name="using_proxy">Folosesc proxy %1$s %2$d</string>
<string name="use_system_proxy">Foloseşte proxy sistem</string>
<string name="use_system_proxy_summary">Foloseşte configurarea sistem pentru proxy HTTP/HTTPS folosit la conectare.</string>
- <string name="donatewithpaypal">Puteţi &lt;a href=\"https://www.paypal.com/cgi-bin/webscr?hosted_button_id=R2M6ZP9AF25LS&amp;amp;cmd=_s-xclick\"&gt;dona prin PayPal&lt;/a&gt; </string>
- <string name="onbootrestartsummary">OpenVPN va reconecta un VPN dacă a fost activ la reboot/shutdown. Citiţi avertizarea la Conexiune din FAQ înainte de a folosi această funcţie.</string>
- <string name="onbootrestart">Reconectarea la reboot</string>
+ <string name="onbootrestartsummary">OpenVPN va conecta VPN-ul specificat dacă vs fi activ la pornirea sistemului. Citiți întrebările frecvente privind avertizare de conexiune înainte de a utiliza această opțiune pe Android &lt; 5.0.</string>
+ <string name="onbootrestart">Conectare la pornire</string>
<string name="ignore">Ignora</string>
<string name="restart">Restart</string>
<string name="restart_vpn_after_change">Schimbările de configurare vor fi aplicate după restartarea VPN-ului. (Re)startaţi VPN-ul acum?</string>
@@ -210,6 +218,7 @@
<string name="vpn_import_hint">Folosiţi icoana &lt;img src=\"ic_menu_archive\"/&gt; pentru a importa un profil existent (.ovpn sau .conf) de pe cardul sd.</string>
<string name="faq_hint">Verificaţi şi FAQ. Acolo este ghid rapid de utilizare.</string>
<string name="faq_routing_title">Configurare Rutare/Interfaţă</string>
+ <string name="faq_routing">Rutarea și configurarea interfaței nu este făcută prin comenzile tradiționale ifconfig / route, ci prin utilizarea API-ului VPNService. Acest lucru are ca rezultat o altă configurație de rutare decât pe alte sisteme de operare. \nConfigurarea tunelului VPN constă în adresa IP și în rețelele prin care ar trebui să fie direcționată această interfață. În mod special, nu este necesară nicio adresă de peer sau o adresă de gateway. Nu sunt necesare rute speciale pentru a ajunge la serverul VPN (de exemplu, adăugate atunci când utilizați gateway-ul de redirecționare). Prin urmare, aplicația va ignora aceste setări atunci când importează o configurație. Aplicația asigură cu API-ul VPNService că conexiunea la server nu este direcționată prin tunelul VPN. \nAPI-ul VPNService nu permite specificarea unor rețele care nu ar trebui să fie direcționate prin VPN. Pentru a evita această problemă, aplicația încearcă să detecteze rețele care nu ar trebui să fie direcționate către tunel (de exemplu, route x.x.x.x y.y.y.y net_gateway) și calculează un set de rute care exclude aceste rute pentru a emula comportamentul altor platforme. Ferestrele de jurnal arată configurația serviciului VPNService la stabilirea conexiunii. \nPS: Android 4.4+ folosește rutarea politică. Utilizarea route/ifconfig nu va afișa rutele instalate. În schimb, utilizați regulile ip, iptables -t mangle -L</string>
<string name="persisttun_summary">Nu reveni la nici o conexiune VPN câtă vreme OpenVPN se reconectează.</string>
<string name="persistent_tun_title">Tun persistent</string>
<string name="openvpn_log">jurnal OpenVPN</string>
@@ -243,7 +252,7 @@
<string name="state_tcp_connect">Se conectează (TCP)</string>
<string name="state_auth_failed">Autentificare a eşuat</string>
<string name="state_nonetwork">Se aşteaptă o reţea utilizabilă</string>
- <string name="statusline_bytecount">↓%2$s/s %1$s - ↑%4$s/s %3$s</string>
+ <string name="statusline_bytecount">↓%2$s %1$s - ↑%4$s %3$s</string>
<string name="notifcation_title_notconnect">Nu este conectat</string>
<string name="start_vpn_title">Conectare la VPN %s</string>
<string name="start_vpn_ticker">Conectare la VPN %s</string>
@@ -265,6 +274,7 @@
<string name="tls_remote_deprecated">tls-remote (ÎNVECHIT)</string>
<string name="help_translate">Puteţi ajuta la traducere vizitând http://crowdin.net/project/ics-openvpn/invite</string>
<string name="prompt">%1$s încercări de a controla %2$s</string>
+ <string name="remote_warning">Continuând, daţi permisiunea aplicaţiei de a controla complet OpenVPN pentru Android și de a intercepta tot traficul de rețea. <b>Nu acceptaţi decât dacă aveți încredere în aplicație</b> În caz contrar, riscaţi să aveţi datele compromise de software maliţios.\"</string>
<string name="remote_trust">Am încredere în această aplicaţie.</string>
<string name="no_external_app_allowed">Nici o aplicaţie nu are permisiunea de a folosi API-ul extern</string>
<string name="allowed_apps">Aplicaţii permise: %s</string>
@@ -274,4 +284,162 @@
<string name="screenoff_pause">Se suspendă conexiunea în starea ecran oprit: mai puţin de %1$s în %2$s</string>
<string name="screen_nopersistenttun">Atenție: TUN persistent nu este activat pentru acest VPN. Traficul va utiliza conexiunea Internet normala atunci când ecranul este oprit.</string>
<string name="save_password">Salvare parola</string>
+ <string name="pauseVPN">Pauză VPN</string>
+ <string name="resumevpn">Reluare VPN</string>
+ <string name="state_userpause">Întrerupere VPN solicitată de utilizator</string>
+ <string name="state_screenoff">VPN întrerupt - ecran stins</string>
+ <string name="device_specific">Trucuri specifice dispozitivului</string>
+ <string name="cannotparsecert">Nu se pot afișa informații privind certificatul</string>
+ <string name="appbehaviour">Comportamentul aplicației</string>
+ <string name="vpnbehaviour">Comportamentul VPN</string>
+ <string name="allow_vpn_changes">Permite modificări la Profilurile VPN</string>
+ <string name="hwkeychain">Hardware Keystore:</string>
+ <string name="permission_icon_app">Iconița aplicației care încearcă să utilizeze OpenVPN pentru Android</string>
+ <string name="faq_vpndialog43">"Începând cu versiunea Android 4.3, confirmarea VPN este protejată împotriva \"suprapunerii aplicațiilor\", și din acest motiv căsuța de dialog nu răspunde la atingere. Dacă aveți o aplicație care folosește suprapuneri, aceasta poate cauza acest comportament și contactați autorul acelei aplicații. Această problemă afectează toate aplicațiile VPN pe Android 4.3 și versiuni ulterioare. A se vedea, de asemenea, &lt;a href=\"https://github.com/schwabe/ics-openvpn/issues/185\"&gt;Issue 185&lt;a&gt; pentru detalii suplimentare"</string>
+ <string name="faq_vpndialog43_title">Dialog de Confirmare VPN</string>
+ <string name="donatePlayStore">Alternativ puteţi dona prin Play Store:</string>
+ <string name="thanks_for_donation">Vă mulțumim că ați donat %s!</string>
+ <string name="logCleared">Jurnal șters.</string>
+ <string name="show_password">Arată parola</string>
+ <string name="keyChainAccessError">KeyChain eroare de acces: %s</string>
+ <string name="timestamp_short">Scurt</string>
+ <string name="timestamp_iso">ISO</string>
+ <string name="timestamps">Marcaj de timp</string>
+ <string name="timestamps_none">Nici unul</string>
+ <string name="uploaded_data">Încărcare</string>
+ <string name="downloaded_data">Descărcare</string>
+ <string name="vpn_status">Stare VPN</string>
+ <string name="logview_options">Vezi opţiuni</string>
+ <string name="unhandled_exception">Excepție netrată: %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">Dacă aveți dispozitivul Android rootat, puteți instala &lt;a href=\"http://xposed.info/\"&gt;Xposed&lt;/a&gt; și &lt;a href=\"http://repo.xposed.info/module/de.blinkt.vpndialogxposed\"&gt;modulul Dialog de Confirmare VPN&lt;/a&gt; pe propriul risc\"</string>
+ <string name="full_licenses">Licențe complete</string>
+ <string name="blocklocal_summary">Rețelele conectate direct la interfețele locale nu vor fi rutate prin VPN. Dacă dezactivați această opțiune, veți redirecționa prin VPN întregul trafic intenționat pentru rețelele locale.</string>
+ <string name="blocklocal_title">Bypass VPN pentru rețelele locale</string>
+ <string name="userpw_file">Fișier de utilizator și parolă</string>
+ <string name="imported_from_file">[Importat din %s]</string>
+ <string name="files_missing_hint">Unele fișiere nu au putut fi găsite. Selectați fișierele pentru a importa profilul:</string>
+ <string name="openvpn_is_no_free_vpn">Pentru a utiliza această aplicație, aveți nevoie de un furnizor VPN / gateway VPN care să suporte OpenVPN (adesea furnizat de angajatorul dvs.). Consultați http://community.openvpn.net/ pentru mai multe informații despre OpenVPN și despre configurarea propriului server OpenVPN.</string>
+ <string name="import_log">Jurnal de import:</string>
+ <string name="ip_looks_like_subnet">Topologia VPN \"%3$s\" este specificată, dar ifconfig %1$s %2$s arată mai mult ca o adresă IP cu o mască de rețea. Utilizăm topologia \"subrețelei\".</string>
+ <string name="mssfix_invalid_value">Valoarea de suprascriere MSS trebuie să fie un număr întreg între 0 și 9000</string>
+ <string name="mtu_invalid_value">Valoarea suprascrierii MTU trebuie să fie un număr întreg între 64 și 9000</string>
+ <string name="mssfix_value_dialog">Anunțați sesiunile TCP care rulează prin tunel că ar trebui să limiteze dimensiunile pachetelor de trimitere astfel încât, după ce OpenVPN le-a încapsulat, dimensiunea pachetului UDP rezultat pe care OpenVPN o trimite la partenerii săi nu va depăși acest număr de biți. (Implicit este 1450)</string>
+ <string name="mssfix_checkbox">Suprascrie valoarea MSS a datelor utile TCP</string>
+ <string name="mssfix_dialogtitle">Setați MSS a datelor utile TCP</string>
+ <string name="client_behaviour">Comportamentul clientului</string>
+ <string name="clear_external_apps">Ștergeți aplicațiile externe permise</string>
+ <string name="loading">Se încarcă&#8230;</string>
+ <string name="allowed_vpn_apps_info">Aplicaţii VPN permise: %1$s</string>
+ <string name="disallowed_vpn_apps_info">Aplicaţii VPN nepermise: %1$s</string>
+ <string name="app_no_longer_exists">Pachetul %s nu mai este instalat, eliminați-l din lista de acces / dezactivare a aplicației</string>
+ <string name="vpn_disallow_radio">VPN este utilizat pentru toate aplicațiile, cu excepția celor selectate</string>
+ <string name="vpn_allow_radio">VPN este utilizat numai pentru aplicațiile selectate</string>
+ <string name="query_delete_remote">Eliminați serverul la distanță?</string>
+ <string name="keep">Păstrează</string>
+ <string name="delete">Şterge</string>
+ <string name="add_remote">Adăugați distanță nouă</string>
+ <string name="remote_random">Utilizați intrări de conectare în ordine aleatorie la conectare</string>
+ <string name="remote_no_server_selected">Trebuie să definiți și să activați cel puțin un server de la distanță.</string>
+ <string name="server_list">Listă de Servere</string>
+ <string name="vpn_allowed_apps">Aplicații Permise</string>
+ <string name="advanced_settings">Setări Avansate</string>
+ <string name="payload_options">Opțiuni de încărcare</string>
+ <string name="tls_settings">Setări TLS</string>
+ <string name="no_remote_defined">Nici o sursă la distanţă definită</string>
+ <string name="duplicate_vpn">Profil VPN duplicat</string>
+ <string name="duplicate_profile_title">Duplicând profilul: %s</string>
+ <string name="show_log">Arată jurnal</string>
+ <string name="faq_android_clients">Există mai mulți clienți OpenVPN pentru Android. Cele mai frecvente sunt OpenVPN pentru Android (acest client), OpenVPN Connect și OpenVPN Settings.&lt;p&gt;Clientii pot fi grupați în două grupuri: OpenVPN pentru Android și OpenVPN Connect utilizează API-ul oficial VPNService (Android 4.0+) și nu necesită root și OpenVPN Settings care utilizează root.&lt;p&gt;OpenVPN pentru Android sunt un client open source și este dezvoltat de Arne Schwabe. Este destinat utilizatorilor mai avansați și oferă multe setări și posibilitatea de a importa profiluri din fișiere și de a configura / schimba profiluri în interiorul aplicației. Clientul se bazează pe versiunea comunității OpenVPN. Se bazează pe codul sursă OpenVPN 2.x. Acest client poate fi văzut ca client semi-oficial al comunității. &lt;p&gt;OpenVPN Connect este un client non-open source care este dezvoltat de OpenVPN Technologies, Inc. Clientul este gândit să fie client de uz general și orientat mai mult spre utilizatorul mediu și permite importul de profile OpenVPN. Acest client se bazează pe reimplementarea OpenVPN C++ a protocolului OpenVPN (aceasta a fost necesară pentru a permite OpenVPN Technologies, Inc. să publice o aplicație iOS OpenVPN). Acest client este clientul oficial al tehnologiilor OpenVPN &lt;p&gt; OpenVPN Settings este cel mai vechi dintre clienți și, de asemenea, o interfață utilizator pentru OpenVPN open source. Spre deosebire de OpenVPN pentru Android, aceasta necesită root și nu utilizează API-ul VPNService. Nu depinde de Android 4.0+</string>
+ <string name="faq_androids_clients_title">Diferențele dintre clienții OpenVPN Android</string>
+ <string name="ignore_multicast_route">Ignorarea rutei multicast: %s</string>
+ <string name="ab_only_cidr">Android acceptă doar rute CIDR către VPN. Din moment ce rutele non-CIDR nu sunt aproape niciodată folosite, OpenVPN pentru Android va folosi o /32 pentru rute care nu sunt CIDR și emite un avertisment.</string>
+ <string name="ab_tethering_44">Funcția tethering funcționează în timp ce VPN-ul este activ. Conexiunea legată NU va utiliza VPN-ul.</string>
+ <string name="ab_kitkat_mss">Primele versiuni KitKat setao o valoare MSS greșită pe conexiunile TCP (#61948). Încercați să activați opțiunea mssfix pentru a rezolva această eroare.</string>
+ <string name="ab_proxy">Android va continua să utilizeze setările proxy specificate pentru conexiunea mobilă/Wi-Fi atunci când nu sunt setate servere DNS. OpenVPN pentru Android vă va avertiza despre acest lucru în fișierul log.<p>Când VPN stabilește un server DNS, Android nu va utiliza un proxy. Nu există niciun API pentru a seta un proxy pentru o conexiune VPN.</p></string>
+ <string name="ab_lollipop_reinstall">Aplicațiile VPN pot să nu mai funcționeze când sunt dezinstalate și reinstalate din nou. Pentru detalii, a se vedea #80074</string>
+ <string name="ab_not_route_to_vpn">IP-ul client configurat și IP-urile din masca sa de rețea nu sunt direcționate către VPN. OpenVPN funcționează în jurul acestui bug prin adăugarea explicită a unui traseu care corespunde IP-ului client și netmask-ului său</string>
+ <string name="ab_persist_tun">Deschiderea unui dispozitiv tun în timp ce un alt dispozitiv tun este activ, care este utilizat pentru suportul tun persistent, blochează serviciile VPN de pe dispozitiv. Este necesară o repornire pentru ca VPN să funcționeze din nou. OpenVPN pentru Android încearcă să evite redeschiderea dispozitivului tun și, dacă este necesar, mai întâi închide TUN-ul curent înainte de a deschide noul dispozitiv TUN pentru a evita accidentarea. Acest lucru poate duce la o fereastră scurtă în care pachetele sunt trimise prin conexiunea non-VPN. Chiar și cu această soluție, VPNServices se blochează uneori și necesită repornirea dispozitivului.</string>
+ <string name="ab_secondary_users">VPN nu funcționează deloc pentru utilizatorii secundari.</string>
+ <string name="ab_kitkat_reconnect">"Mai mulți utilizatori raportează că conexiunea mobilă/conexiunea de date mobilă se deconectează des în timp ce utilizați aplicația VPN. Comportamentul pare să afecteze numai o combinație de furnizori/dispozitive mobile și până în prezent nu a putut fi identificată nici o cauză/soluție pentru acest bug."</string>
+ <string name="ab_vpn_reachability_44">Numai destinația poate fi atinsă prin VPN care poate fi accesată fără VPN. Porturile IPv6 VPN nu funcționează deloc.</string>
+ <string name="ab_only_cidr_title">Rute non-CIDR</string>
+ <string name="ab_proxy_title">Comportamentul proxy pentru VPN-uri</string>
+ <string name="ab_lollipop_reinstall_title">Reinstalarea aplicațiilor VPN</string>
+ <string name="version_upto">%s sau mai puțin</string>
+ <string name="copy_of_profile">Copie a %s</string>
+ <string name="ab_not_route_to_vpn_title">Rutează prin adresa IP configurată</string>
+ <string name="ab_kitkat_mss_title">Valoare MSS greșită pentru conexiunea VPN</string>
+ <string name="ab_secondary_users_title">Utilizatori de tablete secundari</string>
+ <string name="custom_connection_options_warng">Specificați opțiunile specifice conexiunii personalizate. Folosiți cu grijă</string>
+ <string name="custom_connection_options">Opţiunile Particularizate</string>
+ <string name="remove_connection_entry">Ștergeți conexiunea</string>
+ <string name="ab_kitkat_reconnect_title">Se deconectează aleatoriu de la rețeaua mobilă</string>
+ <string name="ab_vpn_reachability_44_title">Rețelele la distanță nu sunt accesibile</string>
+ <string name="ab_persist_tun_title">Păstrați modul tun</string>
+ <string name="version_and_later">%s şi mai târziu</string>
+ <string name="tls_cipher_alert_title">Conexiunile eșuează cu SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure</string>
+ <string name="tls_cipher_alert">Noile versiuni OpenVPN pentru Android (0.6.29 / martie 2015) utilizează o setare implicită mai sigură pentru suitele de cifruri permise (codul \"DEFAULT:!EXP:!PSK:!SRP:!KRSA\"). Din nefericire, omiterea suitelor de cifruri mai puțin sigure și a suitelor de cifruri de export, în special omiterea suitelor de cifru care nu acceptă Perfect Forward Secrecy (Diffie-Hellman) crează unele probleme. Acest lucru este cauzat, de obicei, de o încercare bine intenționată, dar prost executată, de a consolida securitatea TLS prin setarea tls-cipher pe server sau pe anumite sisteme embedded cu SSL (de ex. MikroTik).\nPentru a rezolva această problemă, setați tls-chipher settings de pe server la implicit ca TLS-cipher \"DEFAULT:!EXP:!PSK:!SRP:!KRSA\". Pentru a rezolva problema pe client, adăugați opțiunea personalizată tls-cipher DEFAULT pe clientul Android.</string>
+ <string name="message_no_user_edit">Acest profil a fost adăugat dintr-o aplicație externă (%s) și a fost marcat ca nemodificabil de utilizator.</string>
+ <string name="crl_file">Lista de revocare a certificatelor</string>
+ <string name="service_restarted">Repornirea serviciului OpenVPN (aplicația s-a blocat probabil a blocat sau terminat pentru presiunea de memorie)</string>
+ <string name="import_config_error">Importarea configurației a dat o eroare, nu se poate salva</string>
+ <string name="Search">Căutare</string>
+ <string name="lastdumpdate">(Ultimul dump este %1$d:%2$dh old (%3$s))</string>
+ <string name="clear_log_on_connect">Ştergeți log-uri la conexiune nouă</string>
+ <string name="connect_timeout">Timp de expirare a conexiunii</string>
+ <string name="no_allowed_app">Nu a fost adăugată nicio aplicație permisă. Adăugându-ne (%s) să aibă cel puțin o aplicație în lista de aplicații permise pentru a nu permite tuturor aplicațiilor</string>
+ <string name="query_permissions_sdcard">OpenVPN pentru Android poate încerca să găsească automat fișierele lipsă pe cardul sdcard. Apăsați acest mesaj să porniți cererea de permisiune.</string>
+ <string name="protocol">Protocol</string>
+ <string name="enabled_connection_entry">Activat</string>
+ <string name="abi_mismatch">Precedența ABI-ului nativ preferat a acestui dispozitiv (%1$s) și ABI-ul raportat de bibliotecile native (%2$s) diferă</string>
+ <string name="permission_revoked">Permisiunea VPN revocată de sistemul de operare (de exemplu, a pornit un alt program VPN), se oprește VPN</string>
+ <string name="pushpeerinfo">Pasați informații de la Peer</string>
+ <string name="pushpeerinfosummary">Trimiteți informații suplimentare serverului, de exemplu, versiunea SSL și versiunea Android</string>
+ <string name="pw_request_dialog_title">Aveți nevoie de %1$s</string>
+ <string name="pw_request_dialog_prompt">Introduceți parola pentru profilul %1$s</string>
+ <string name="menu_use_inline_data">Utilizați date inline</string>
+ <string name="export_config_chooser_title">Exportați fișierul de configurare</string>
+ <string name="missing_tlsauth">Fișierul tls-auth lipsește</string>
+ <string name="missing_certificates">Lipsește certificatul de utilizator sau fișierul certificat cheie</string>
+ <string name="missing_ca_certificate">Certificatul CA lipsește</string>
+ <string name="crl_title">Lista de certificate revocate (opțional)</string>
+ <string name="reread_log">Recitesc (%d) elemente de log din fișierul de cache log</string>
+ <string name="samsung_broken">Chiar dacă telefoanele Samsung sunt printre cele mai vândute telefoane Android, firmware-ul Samsung este, de asemenea, printre cele mai pline de bug-uri firmware-uri Android. Bugurile nu se limitează la operațiunile VPN pe aceste dispozitive, dar multe dintre ele pot fi rezolvate. În continuare sunt descrise unele dintre aceste erori. \n\nDNS-ul nu funcționează decât dacă serverul DNS din gama VPN. \n\nPe multe dispozitive Samsung 5.x, funcția permis/nepermis a aplicațiilor nu funcționează. \nPe Samsung 6.x VPN-ul este raportat că nu funcționează decât dacă aplicația VPN este exceptată de la caracteristicile Powersave.</string>
+ <string name="samsung_broken_title">Telefoanele Samsung</string>
+ <string name="novpn_selected">Niciun VPN selectat.</string>
+ <string name="defaultvpn">VPN prestabilit</string>
+ <string name="defaultvpnsummary">VPN utilizat în locurile unde este necesară o rețea VPN implicită. Acestea sunt în prezent la pornire, pentru Always-On și placa Quick Settings.</string>
+ <string name="vpnselected">VPN selectat în prezent: \'%s\'</string>
+ <string name="reconnect">Reconectaţi</string>
+ <string name="qs_title">Comutare VPN</string>
+ <string name="qs_connect">Conectați-vă la %s</string>
+ <string name="qs_disconnect">Deconectați %s</string>
+ <string name="connectretrymaxmessage">Introduceți timpul maxim între încercările de conectare. OpenVPN va crește lent timpul de așteptare după o încercare de conexiune nereușită până la această valoare. Valoarea implicită este de 300 secunde.</string>
+ <string name="connectretrymaxtitle">Durata maximă între încercările de conectare</string>
+ <string name="state_waitconnectretry">Se așteaptă %s secunde până la următoarea conectare</string>
+ <string name="nought_alwayson_warning"><![CDATA[Dacă nu ați primit un dialog de confirmare VPN, aveți activată \"Always on VPN\" pentru o altă aplicație. În acest caz, numai acelei aplicații i se permite să se conecteze la o rețea VPN. Verificați din Setări-> Rețele mai .. -> VPNS]]></string>
+ <string name="management_socket_closed">Conexiunea la OpenVPN a fost închisă (%s)</string>
+ <string name="change_sorting">Modificați sortarea</string>
+ <string name="sort">Sortare</string>
+ <string name="sorted_lru">Profiluri ordonate după ultima utilizare recentă</string>
+ <string name="sorted_az">Profiluri sortate după nume</string>
+ <string name="deprecated_tls_remote">Config utilizează opțiunea tls-remote, care a fost depreciată în 2.3 și, în final, eliminată în 2.4</string>
+ <string name="auth_failed_behaviour">Comportament pentru AUTH_FAILED</string>
+ <string name="graph">Grafic</string>
+ <string name="use_logarithmic_scale">Utilizați scala logaritmică</string>
+ <string name="notenoughdata">Nu există date suficiente</string>
+ <string name="avghour">Media pe oră</string>
+ <string name="avgmin">Media pe minut</string>
+ <string name="last5minutes">Ultimele 5 minute</string>
+ <string name="data_in">Intrare</string>
+ <string name="data_out">Ieșire</string>
+ <string name="bits_per_second">%.0f bit/s</string>
+ <string name="kbits_per_second">%.1f kbit/s</string>
+ <string name="mbits_per_second">%.1f Mbit/s</string>
+ <string name="gbits_per_second">%.1f Gbit/s</string>
+ <string name="volume_byte">%.0f B</string>
+ <string name="volume_kbyte">%.1f kB</string>
+ <string name="volume_mbyte">%.1f MB</string>
+ <string name="volume_gbyte">%.1f GB</string>
</resources>
diff --git a/app/src/main/res/values-ru/plurals-icsopenvpn.xml b/app/src/main/res/values-ru/plurals-icsopenvpn.xml
new file mode 100755
index 00000000..fc40574a
--- /dev/null
+++ b/app/src/main/res/values-ru/plurals-icsopenvpn.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Generated by crowdin.com-->
+<resources>
+ <plurals name="months_left">
+ <item quantity="one">Остался %d месяц</item>
+ <item quantity="few">Осталось %d месяца</item>
+ <item quantity="other">Осталось %d месяцев</item>
+ </plurals>
+ <plurals name="days_left">
+ <item quantity="one">Остался %d день</item>
+ <item quantity="few">Осталось %d дня</item>
+ <item quantity="other">Осталось %d дней</item>
+ </plurals>
+ <plurals name="hours_left">
+ <item quantity="one">Остался %d час</item>
+ <item quantity="few">Осталось %d часа</item>
+ <item quantity="other">Осталось %d часов</item>
+ </plurals>
+ <plurals name="minutes_left">
+ <item quantity="one">Осталась %d минута</item>
+ <item quantity="few">Осталось %d минуты</item>
+ <item quantity="other">Осталось %d минут</item>
+ </plurals>
+</resources>
diff --git a/app/src/main/res/values-ru/strings-icsopenvpn.xml b/app/src/main/res/values-ru/strings-icsopenvpn.xml
index f7419e2c..faa4ef22 100755
--- a/app/src/main/res/values-ru/strings-icsopenvpn.xml
+++ b/app/src/main/res/values-ru/strings-icsopenvpn.xml
@@ -17,10 +17,10 @@
<string name="client_no_certificate">Нет сертификата</string>
<string name="client_certificate_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="client_pkcs12_title">Файл PKCS12</string>
+ <string name="ca_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>
@@ -30,44 +30,45 @@
<string name="file_nothing_selected">Вы должны выбрать файл</string>
<string name="useTLSAuth">Использовать аутентификацию TLS</string>
<string name="tls_direction">Направление проверки TLS</string>
- <string name="ipv6_dialog_tile">Введите адрес/маску подсети IPv6 в формате CIDR (например 2000:dd::23/64)</string>
- <string name="ipv4_dialog_title">Введите адрес/маску подсети IPv4 в формате CIDR (например 1.2.3.4/24)</string>
+ <string name="ipv6_dialog_tile">Введите адрес/маску подсети IPv6 в формате CIDR (например, 2000:dd::23/64)</string>
+ <string name="ipv4_dialog_title">Введите адрес/маску подсети IPv4 в формате CIDR (например, 1.2.3.4/24)</string>
<string name="ipv4_address">Адрес IPv4</string>
<string name="ipv6_address">Адрес IPv6</string>
<string name="custom_option_warning">Введите дополнительные параметры OpenVPN. Используйте эту возможность с большой осторожностью. Если вы считаете, что отсутствует важный параметр, свяжитесь с автором</string>
<string name="auth_username">Имя пользователя</string>
<string name="auth_pwquery">Пароль</string>
<string name="static_keys_info">Для конфигурации с статичными сертификатами будут использоваться ключи TLS</string>
- <string name="configure_the_vpn">Настройка VPN-туннеля</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_ca_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="pw_query_hint">(оставьте пустым для запроса по требованию)</string>
<string name="vpn_shortcut">Ярлык OpenVPN</string>
- <string name="vpn_launch_title">Подключиться к VPN</string>
+ <string name="vpn_launch_title">Подключение к VPN&#8230;</string>
<string name="shortcut_profile_notfound">Не найден профиль, указанный в ярлыке</string>
<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="route_rejected">Маршрут отвергнут Android</string>
- <string name="cancel_connection">Отключение</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="cancel_connection_query">Отключить активный VPN/отменить попытку подключения?</string>
<string name="remove_vpn">Удалить VPN</string>
- <string name="check_remote_tlscert">Проверяет, использует ли сервер сертификаты TLS (--remote-cert-tls server)</string>
- <string name="check_remote_tlscert_title">Ожидать TLS сертификат от сервера</string>
+ <string name="check_remote_tlscert">Проверяет, использует ли сервер сертификат с серверными расширениями TLS (--remote-cert-tls server)</string>
+ <string name="check_remote_tlscert_title">Ожидать серверный сертификат TLS</string>
<string name="remote_tlscn_check_summary">Проверка DN объекта удаленного сертификата</string>
<string name="remote_tlscn_check_title">Проверка имени хоста сертификата</string>
- <string name="enter_tlscn_dialog">Переключатель способа проверки DN сертификата (e.g. C=DE, L=Paderborn, OU=Avian IP Carriers, CN=openvpn.blinkt.de)\n\nВозможные значения: полный DN, RDN (для примера openvpn.blinkt.de) или только преффикс RDN для проверки.\n\nПри использовании преффикса RDN, например \"Server\", значения будут \"Server-1\", \"Server-2\" и т.д.\n\nПри пустом текстовом поле проверка будет проводиться по имени хоста.\n\nДля подробностей смотрите руководство для OpenVPN 2.3.1+, раздел —verify-x509-name</string>
+ <string name="enter_tlscn_dialog">Введите значение для проверки DN удалённого сертификата (например, C=DE, L=Paderborn, OU=Avian IP Carriers, CN=openvpn.blinkt.de)\n\nВозможные значения: полный DN или RDN (в примере выше openvpn.blinkt.de) или только префикс RDN для проверки.\n\nПри использовании префикса RDN, «Server» подойдёт для «Server-1» и «Server-2»\n\nПри пустом текстовом поле будет проверяться, что RDN совпадает с именем узла.\n\nПодробности смотрите в руководстве OpenVPN 2.3.1+, раздел --verify-x509-name</string>
<string name="enter_tlscn_title">Объект удаленного сертификата</string>
<string name="tls_key_auth">Включить аутентификацию по TLS ключу</string>
<string name="tls_auth_file">Файл аутентификации TLS</string>
@@ -85,17 +86,17 @@
<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="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">Исключенные сети</string>
- <string name="log_verbosity_level">Уровень детализации лога</string>
- <string name="float_summary">Разрешить пакеты аутентификации с любого IP-адреса</string>
- <string name="float_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="remove_vpn_query">Удалить профиль VPN «%s»?</string>
<string name="tun_error_helpful">На некоторых кастомных сборках права на /dev/tun могут быть неверными или tun-модуль может быть не включен. Для прошивки CM9 можете попробовать исправить владельца прямо из настроек программы</string>
<string name="tun_open_error">Не удается открыть tun интерфейс</string>
<string name="error">"Ошибка: "</string>
@@ -114,77 +115,77 @@
<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="copied_entry">Запись журнала скопирована в буфер обмена</string>
<string name="tap_mode">Режим TAP</string>
<string name="faq_tap_mode">Режим TAP невозможен на устройствах без root-а. Поэтому это приложение не поддерживает TAP</string>
<string name="tap_faq2">Снова? Вы издеваетесь? Не поддерживается режим TAP и просьбы к автору об этом не помогут ему реализоваться.</string>
<string name="tap_faq3">Третий раз? На самом деле можно было бы писать эмулятор tap, основанные на tun, который бы добавлял информацию 2 уровня при отправке и извлекал бы ее при получении. Но этот эмулятор потребует также ARP и, возможно, клиента DHCP. Я не знаю никого, кто мог бы этим заняться. Свяжитесь со мной, если вы хотите заняться этим.</string>
<string name="faq">Вопросы и ответы</string>
- <string name="copying_log_entries">Копирование записей лога</string>
- <string name="faq_copying">Для копирования одного элемента журнала необходимо нажать и удерживать. Для копирования/передачи всего файла журнала используйте опцию \"Отправить файл журнала\". Используйте hardware кнопку меню, если вы не в графическом интерфейсе.</string>
+ <string name="copying_log_entries">Копирование записей журнала</string>
+ <string name="faq_copying">Для копирования одной записи журнала необходимо нажать на неё и удерживать. Чтобы скопировать/отправить весь файл журнала, используйте опцию «Отправить файл журнала». Если она скрыта, используйте аппаратную кнопку меню.</string>
<string name="faq_shortcut">Ярлык для запуска</string>
<string name="faq_howto_shortcut">Вы можете создать ярлык для запуска OpenVPN на рабочем столе. В зависимости от вашего окружения необходимо добавить ярлык или виджет.</string>
<string name="no_vpn_support_image">Ваша прошивка не поддерживает VPNService 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="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">[[Встроенный файл данных]]</string>
<string name="opentun_no_ipaddr">Отказ в открытии устройства tun без информации об IP-адресе</string>
- <string name="menu_import">Импорта конфигурации из файла .ovpn</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_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/cert/key в диалоговом окне файл, данные сохраняются в VPN профиле. VPN профили доступны только этому приложению. (Потом не забудьте удалить копии на sd карте). Несмотря на то, что данные доступны только этому приложению, они все еще незашифрованы. Путем получения прав администратора (рута) на телефоне или другими эксплойтами возможно извлечь данные. Также сохраненные пароли хранятся в обычном текстовом виде. Настоятельно рекомендуется pkcs12 файлы импортировать в android keystore."</string>
+ <string name="faq_security">"Так как OpenVPN чувствителен к безопасности, то уместны будут несколько замечаний на её счёт. Все данные на SD-карте по сути не защищены. Каждое приложение может прочесть их (например, эта программа не требует специальных привилегий на SD-карту). Данные этого приложения могут быть прочитаны только им самим. При использовании опции импорта сертификатов и ключей в диалоговом окне данные сохраняются в профиле VPN. Профили VPN доступны только этому приложению. (Не забудьте потом удалить копии на SD-карте). Несмотря на то, что данные доступны только этому приложению, они всё ещё не зашифрованы. При наличии прав администратора (рута) на телефоне или через некую уязвимость эти данные можно извлечь. Также сохранённые пароли хранятся в обычном текстовом виде. Настоятельно рекомендуется файлы pkcs12 импортировать в android keystore."</string>
<string name="import_vpn">Импорт</string>
<string name="broken_image_cert_title">Ошибка вывода выбранного сертификата</string>
- <string name="broken_image_cert">Произошла ошибка при попытке вызова системного диалога выбора сертификатов Android 4.0+ Этого не должно было случиться на стандартной прошивке. Может быть в вашей прошивке испорчено хранилище сертификатов</string>
+ <string name="broken_image_cert">Произошла ошибка при попытке вызова системного диалога выбора сертификатов Android 4.0+. Этого не должно было случиться на стандартной прошивке. Может быть в вашей прошивке испорчено хранилище сертификатов</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;Извествно, что официальные прошивки HTC имеют странные проблемы с маршрутизацией, приводящей к тому, что трафик не идёт через туннель (см. &lt;a href=\"http://code.google.com/p/ics-openvpn/issues/detail?id=18\"&gt;Issue 18&lt;/a&gt; в баг-трекере).&lt;/p&gt;&lt;p&gt;Также сообщалось, что в старых официальных прошивках SONY от Xperia Arc S и Xperia Ray полностью отсутствует сервис VPNService (см. &lt;a href=\"http://code.google.com/p/ics-openvpn/issues/detail?id=29\"&gt;Issue 29&lt;/a&gt; в баг-трекере).&lt;/p&gt;&lt;p&gt;В некоторых встроенных прошивках модуль tun может отсутствовать или иметь неправильные права на файл устройства /dev/tun. Некоторые CM9 прошивки могут требовать исправлений опции прав в главных настройках.&lt;/p&gt;&lt;p&gt;И самое главное: Если у вас прошивка с указанными проблемами, сообщите об этом производителю устройства. Чем больше пользователей сообщит о проблеме, тем больше шансов, что этот производитель исправит прошивку.&lt;/p&gt;</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 может отсутствовать, или файл устройства /dev/tun может иметь неправильные права. Некоторые прошивки CM9 могут требовать исправления прав на /dev/tun в настройках «Хаки для данного устройства».&lt;/p&gt;&lt;p&gt;И самое главное: если у вас прошивка с указанными проблемами, сообщите об этом производителю устройства. Чем больше пользователей сообщит о проблеме, тем больше шансов, что производитель её исправит.&lt;/p&gt;</string>
<string name="pkcs12_file_encryption_key">Файл PKCS12-ключа</string>
<string name="private_key_password">Пароль закрытого ключа</string>
<string name="password">Пароль</string>
<string name="file_icon">файл значка</string>
- <string name="tls_authentication">TLS-аутентификация</string>
+ <string name="tls_authentication">Аутентификация/шифрование TLS</string>
<string name="generated_config">Сгенерированая конфигурация</string>
<string name="generalsettings">Настройки</string>
<string name="owner_fix_summary">Попытаться изменить владельца для /dev/tun. Некоторые прошивки CM9 требуют этого для корректной работы API OpenVPN. Требуется root.</string>
<string name="owner_fix">Исправить права для /dev/tun</string>
<string name="generated_config_summary">Показать сгенерированный файл конфигурации OpenVPN</string>
- <string name="edit_profile_title">Правка \"%s\"</string>
+ <string name="edit_profile_title">Правка «%s»</string>
<string name="building_configration">Создание конфигурации&#8230;</string>
- <string name="netchange_summary">Включение этого параметра заставит переподключаться, если состояние интернет соединения (WIFI) изменится</string>
+ <string name="netchange_summary">Переподключаться, если изменяется состояние сети (например, при переключении с Wi-Fi на мобильную и наоборот)</string>
<string name="netchange">Переподключение при изменении сети</string>
<string name="netstatus">Статус сети: %s</string>
- <string name="extracahint">Сертификат CA обычно возвращается из хранилища Android Keystore. Укажите отдельный сертификат, если у вас возникли ошибки при проверке сертификата.</string>
+ <string name="extracahint">Сертификат ЦС обычно хранится в Android Keystore. Укажите отдельный сертификат, если у вас возникли ошибки при проверке сертификата.</string>
<string name="select_file">Выбрать</string>
- <string name="keychain_nocacert">Не удалось получить CA из хранилища ключей Android. Аутентификация не удалась.</string>
- <string name="show_log_summary">Показывает окно журнала при подключении. Окно журнала всегда может быть доступно из панели уведомлений.</string>
+ <string name="keychain_nocacert">Не удалось получить сертификат ЦС из хранилища ключей Android. Вероятно, аутентификация завершится ошибкой.</string>
+ <string name="show_log_summary">Показывает окно журнала при подключении. Окно журнала всегда доступно из панели уведомлений.</string>
<string name="show_log_window">Показать окно журнала</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">Предупреждение VPN соединения, говорящее, что это приложение может перехватывать весь сетевой трафик, показывается системой для предотвращения злоупотребления API VPNService.\nУведомление о VPN соединении (символ ключа) также формируется системой Android для сигнализации исходящего VPN соединения. В некоторых прошивках это уведомление сопровождается звуком.\nAndroid использует эти системные уведомления для вашей же собственной безопасности и их нельзя обойти. (К сожалению, на некоторых прошивках это относится и к звуку уведомления)</string>
<string name="faq_system_dialogs_title">Сообщение о подключении и звук уведомления</string>
- <string name="translationby">Русский перевод от RusFox &lt;horonitel@gmail.com&gt;</string>
+ <string name="translationby">Русский перевод от RusFox &lt;horonitel@gmail.com&gt; и многих других</string>
<string name="ipdns">IP-адрес и DNS</string>
<string name="basic">Основные</string>
<string name="routing">Маршрутизация</string>
@@ -192,40 +193,39 @@
<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;Используйте готовую конфигурацию (протестированную на вашем компьютере или полученную от вашего провайдера)&lt;/p&gt;&lt;p&gt;Если это простой файл без pem/pks12 вы можете отправить его по email на свое устройство. Если же это несколько файлов, вы можете использовать их со своей карты памяти.&lt;/p&gt;&lt;p&gt;Просто кликните на .conf файл или выберите его с помощью меню в программе для импорта конфигурации&lt;/p&gt;&lt;p&gt;Если программа выдаст ошибку о нехватке некоторых файлов, просто поместите эти файлы на карту памяти&lt;/p&gt;&lt;p&gt;Нажмите кнопку сохранения для добавления импортируемой конфигурации в программу&lt;/p&gt;&lt;p&gt;Запустите ваш VPN-тоннель нажав на его название в списке&lt;/p&gt;&lt;p&gt;Если при запуске возникли ошибки попробуйте разобраться и устранить их.&lt;/p&gt; </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;Используйте готовую конфигурацию (протестированную на вашем компьютере или полученную от вашего провайдера)&lt;/p&gt;&lt;p&gt;Если это простой файл без pem/pkcs12, вы можете отправить его как вложение по электронной почте на своё устройство. Если же файлов несколько, вы можете использовать их со своей карты памяти.&lt;/p&gt;&lt;p&gt;Просто откройте .conf файл или выберите его в диалоге импорта (значок папки в списке профилей)&lt;/p&gt;&lt;p&gt;Если программа выдаст ошибку о нехватке некоторых файлов, просто поместите эти файлы на карту памяти.&lt;/p&gt;&lt;p&gt;Нажмите кнопку сохранения для добавления импортируемой конфигурации в программу&lt;/p&gt;&lt;p&gt;Запустите ваш VPN-тоннель, нажав на его название в списке&lt;/p&gt;&lt;p&gt;Если при запуске возникли ошибки, попробуйте разобраться и устранить их.&lt;/p&gt; </string>
<string name="faq_howto_title">Быстрый старт</string>
- <string name="setting_loadtun_summary">Попробуйте загрузить модуль ядра tun.ko прежде чем пытаться подключиться. Требуется root-доступ на устройстве.</string>
+ <string name="setting_loadtun_summary">Попробуйте загрузить модуль ядра tun.ko, прежде чем пытаться подключиться. Требуется 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>
<string name="use_system_proxy_summary">Использовать системную конфигурацию прокси HTTP/HTTPS для соединения.</string>
- <string name="donatewithpaypal">Вы можете &lt;a href=\"https://www.paypal.com/cgi-bin/webscr?hosted_button_id=R2M6ZP9AF25LS&amp;amp;cmd=_s-xclick\"&gt;пожертвовать с PayPal&lt;/a&gt; </string>
- <string name="onbootrestartsummary">OpenVPN будет переподключаться, если он был активен в момент выключения/перезагрузки. Пожалуйста, прочтите FAQ перед тем, как использовать эту настройку.</string>
- <string name="onbootrestart">Переподключение после перезагрузки</string>
+ <string name="onbootrestartsummary">OpenVPN будет подключаться к указанному VPN, если он был активен при загрузке системы. Пожалуйста, прочитайте FAQ о предупреждении при подключении перед тем, как использовать эту опцию на Android &lt; 5.0.</string>
+ <string name="onbootrestart">Подключение при загрузке</string>
<string name="ignore">Игнорировать</string>
<string name="restart">Перезапуск</string>
<string name="restart_vpn_after_change">Изменения конфигурации применяются после перезапуска VPN. (Пере)запустить VPN сейчас?</string>
<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-соединение. Чтобы избежать этого, приложение нужно запускать с повышенным приоритетом. Для запуска с высоким приоритетом приложение должно вывести предупреждение. Основная иконка приложения будет закреплена наверху панели уведомлений самой системой, как описано в предыдущем вопросе. Она не является собственно уведомлением, это ограничение распространяется на все приложения, запущенные с высоким приоритетом.</string>
+ <string name="faq_duplicate_notification">Если в Android возникает нехватка оперативной памяти (RAM), ненужные службы и приложения останавливаются. Из-за этого прерывается установленное VPN-соединение. Чтобы избежать этого, приложение нужно запускать с повышенным приоритетом. Для запуска с высоким приоритетом приложение должно вывести уведомление. Значок ключа показывается наверху панели уведомлений самой системой, как описано в предыдущем вопросе. Он не считается тем уведомлением, которое приложению нужно для запуска с высоким приоритетом.</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; кнопку для импорта существующих профилей (.ovpn or .conf) с вашей карты памяти.</string>
- <string name="faq_hint">Не забудьте заглянуть в FAQ. Также имеется краткое руководство.</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; для импорта существующих профилей (.ovpn или .conf) с карты памяти.</string>
+ <string name="faq_hint">Не забудьте заглянуть в FAQ. Там есть краткое руководство.</string>
<string name="faq_routing_title">Конфигурация маршрутизации/интерфейса</string>
<string name="faq_routing">Конфигурация маршрутизации и интерфейса производится не через традиционные ifconfig/route команды, а с помощью VPNService API. Это приводит к созданию другой конфигурации маршрутизации, отличной от конфигураций, используемых на других ОС. Конфигурация VPN-туннеля состоит из IP-адресов и сетей, которые должны направляться через этот интерфейс. Никаких особых партнерских адресов или адресов шлюза не требуется. Также не требуются и специальные маршруты для соединения с VPN-сервером (например, добавленные при использовании redirect-gateway). Следовательно, приложение будет игнорировать эти параметры при импорте конфигурации. Приложение с помощью VPNService API гарантирует, что подключение к серверу не направляется через VPN-туннель. Поддерживается направление через туннель только определенных сетей. Приложение пытается определить сети, которые не должны быть направлены через туннель (например, маршрут x.x.x.x y.y.y.y net_gateway) и вычисляет список маршрутов, в который не включаются эти маршруты, чтобы эмулировать поведение других платформ. Окна журналов и логов показывают конфигурацию сервиса VPN после установления соединения.</string>
- <string name="persisttun_summary">Не открывать диалог, когда происходит переподключение VPN.</string>
- <string name="persistent_tun_title">Постоянный tun</string>
- <string name="openvpn_log">OpenVPN Журнал</string>
+ <string name="persisttun_summary">Не использовать обычное соединение без VPN при переподключении OpenVPN.</string>
+ <string name="persistent_tun_title">Постоянный туннель</string>
+ <string name="openvpn_log">Журнал OpenVPN</string>
<string name="import_config">Импорт конфигурации OpenVPN</string>
<string name="battery_consumption_title">Потребление батареи</string>
- <string name="baterry_consumption">В моих тестах, главным источником высокого потребления электроэнергии батареи были keepalive пакеты. Большинство OpenVPN-серверов содержат директиву вроде \'keepalive 10 60\', которая отправляет keepalive-пакет с клиента на сервер и с сервера на клиент каждые 10 секунд. &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;pgt; К сожалению, использование keepalive более, чем 60 секунд с UDP, может вносить проблемы с некоторыми типами NAT, которые удаляют информацию о соединении через короткое время (в моем случае, это было 60 секунд). Использование TCP с большим keepalive-таймаутом будет работать, но производительность туннелирования TCP через TCP в сетях с высокой вероятностью потери пакета крайне низкая (см. &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">Тетеринг функция Android (через WiFi, USB или Bluetooth) и VPNService API (используемое этой программой) не работают вместе. Подробней в &lt;a href=\"http://code.google.com/p/ics-openvpn/issues/detail?id=34\"&gt;проблеме №34&lt;/a&gt;</string>
+ <string name="baterry_consumption">В моих тестах главным источником высокого потребления электроэнергии батареи были пакеты keepalive. Большинство OpenVPN-серверов содержат директиву вроде «keepalive 10 60», которая заставляет клиент и сервер обмениваться keepalive-пакетами каждые 10 секунд. &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; К сожалению, использование keepalive более, чем 60 секунд с UDP, может привести к тому, что некоторые шлюзы NAT будут обрывать соединение из-за отсутствия активности. Использование TCP с большим keepalive-таймаутом будет работать, но производительность туннелирования TCP через TCP в сетях с высокими потерями пакетов крайне низкая (см. &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">Функция тетеринга Android (через WiFi, USB или Bluetooth) и VPNService API (используемое этой программой) не работают вместе. Подробней в &lt;a href=\"https://github.com/schwabe/ics-openvpn/issues/34\"&gt;проблеме №34&lt;/a&gt;</string>
<string name="vpn_tethering_title">VPN и Tethering</string>
<string name="connection_retries">Попытки подключения</string>
<string name="reconnection_settings">Параметры переподключения</string>
@@ -252,7 +252,7 @@
<string name="state_tcp_connect">Подключение (TCP)</string>
<string name="state_auth_failed">Ошибка аутентификации</string>
<string name="state_nonetwork">Ожидание работы сети</string>
- <string name="statusline_bytecount">↓%2$s/s %1$s - ↑%4$s/s %3$s</string>
+ <string name="statusline_bytecount">↓%2$s %1$s - ↑%4$s %3$s</string>
<string name="notifcation_title_notconnect">Разъединено</string>
<string name="start_vpn_title">Подключение к VPN %s</string>
<string name="start_vpn_ticker">Подключение к VPN %s</string>
@@ -268,7 +268,7 @@
<string name="add">Добавить</string>
<string name="send_config">Отправить конфигурационный файл</string>
<string name="complete_dn">Полное DN</string>
- <string name="remotetlsnote">Импортированнаяе конфигурация использует устаревшую опцию tls-remote которая имеет другой формат DN.</string>
+ <string name="remotetlsnote">Импортированная конфигурация использует УСТАРЕВШУЮ опцию tls-remote, которая имеет другой формат DN.</string>
<string name="rdn">RDN (полное имя)</string>
<string name="rdn_prefix">Префикс RDN</string>
<string name="tls_remote_deprecated">tls-remote (УСТАРЕВШЕЕ)</string>
@@ -277,25 +277,25 @@
<string name="remote_warning">Продолжая, вы даете приложению права на управление \"OpenVPN для Android\" и перехват всего сетевого трафика. <b> Не продолжайте, если не доверяете полностью этому приложению. </b> В противном случае вы рискуете утечкой и использованием ваших данных злоумышленниками.</string>
<string name="remote_trust">Я доверяю этому приложению.</string>
<string name="no_external_app_allowed">Нет приложений, авторизованных для внешнего API</string>
- <string name="allowed_apps">Авторизованные приложения: %s</string>
+ <string name="allowed_apps">Разрешённые приложения: %s</string>
<string name="clearappsdialog">Очистить список авторизованных внешних приложений?\nСписок разрешенных приложений:\n\n%s</string>
- <string name="screenoff_summary">VPN-соединение приостанавливается, если экран выключен или объем данных меньше 64kb за 60сек. Если включена опция \"Удержание соединения\", VPN-соединение будет постоянно активным. Без этого параметра оно будет приостанавливаться при этих условиях..</string>
+ <string name="screenoff_summary">Приостанавливать VPN, если экран выключен и передано меньше 64kb данных за 60 сек. Когда включена опция \"Постоянный туннель\", приостановка VPN оставит ваше устройство без сетевого подключения. Без опции \"Постоянный туннель\" устройство не будет иметь VPN-соединения/защиты.</string>
<string name="screenoff_title">Приостановить VPN-соединение при выключенном экране</string>
<string name="screenoff_pause">Приостановка соединения при выключенном экране: меньше, чем %1$s in %2$ss</string>
- <string name="screen_nopersistenttun">Внимание: постоянный tun не включен для этого VPN. Трафик будет проходить через обычный доступ в Интернет, когда экран выключен.</string>
+ <string name="screen_nopersistenttun">Внимание: Постоянный туннель не включен для этого VPN. Трафик будет использовать обычное интернет соединение, когда экран выключен.</string>
<string name="save_password">Сохранить пароль</string>
<string name="pauseVPN">Приостановить VPN</string>
<string name="resumevpn">Продолжить VPN</string>
<string name="state_userpause">VPN приостановлен по запросу пользователя</string>
<string name="state_screenoff">VPN приостановлен - выкл. экран</string>
- <string name="device_specific">Хак для данного устройства</string>
+ <string name="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="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-соединения защищен от приложений, \"накладывающихся поверх экрана». Это приводит к тому, что диалоговое окно подтверждения не реагирует на сенсорные нажатия. Если у вас имеется приложение, использующее наложения, то это может вызвать такое поведение. Если вы обнаружите где-либо такое приложение, свяжитесь с автором приложения. Эта проблема затрагивает все VPN приложения на Android 4.3 и более поздних версиях. Смотрите также &lt; a href = \"http://code.google.com/p/ics-openvpn/issues/detail?id=185\" &gt; Проблему 185 &lt; &gt; для получения дополнительных сведений»</string>
+ <string name="faq_vpndialog43">"Начиная с Android 4.3, диалог подтверждения VPN-соединения защищён от приложений, «накладывающихся поверх экрана». Это приводит к тому, что диалоговое окно подтверждения не реагирует на сенсорные нажатия. Если вам попадётся приложение, использующее наложения и вызывающее такое поведение, свяжитесь с автором этого приложения. Эта проблема затрагивает все VPN приложения на Android 4.3 и более поздних версиях. Смотрите также &lt;a href=\"https://github.com/schwabe/ics-openvpn/issues/185\"&gt;Issue 185&lt;a&gt; для получения дополнительных сведений"</string>
<string name="faq_vpndialog43_title">Окно подтверждения VPN для Android 4.3 и позже</string>
<string name="donatePlayStore">Также Вы можете выразить благодарность в виде пожертвования на Play Store:</string>
<string name="thanks_for_donation">Спасибо за пожертвование %s!</string>
@@ -309,29 +309,30 @@
<string name="uploaded_data">Выгружено</string>
<string name="downloaded_data">Загружено</string>
<string name="vpn_status">Статус VPN</string>
- <string name="logview_options">Посмотреть настройки</string>
- <string name="unhandled_exception">Неопознання ошибка: %1$s\n\n%2$s</string>
+ <string name="logview_options">Настройки вида</string>
+ <string name="unhandled_exception">Неопознанная ошибка: %1$s\n\n%2$s</string>
<string name="unhandled_exception_context">%3$s: %1$s\n\n%2$s</string>
- <string name="faq_system_dialog_xposed">Если на Вашем устройстве установлены Рут права, Вы можете установить &lt;a href=\"http://xposed.info/\"&gt;Xposed framework&lt;/a&gt; и &lt;a href=\"http://repo.xposed.info/module/de.blinkt.vpndialogxposed\"&gt;модуль автоматического подтверждения диалога подключения VPN&lt;/a&gt; на свой страх и риск</string>
+ <string name="faq_system_dialog_xposed">Если на вашем устройстве есть root, можете установить &lt;a href=\"http://xposed.info/\"&gt;Xposed framework&lt;/a&gt; и &lt;a href=\"http://repo.xposed.info/module/de.blinkt.vpndialogxposed\"&gt;модуль автоматического подтверждения диалога подключения VPN&lt;/a&gt; на свой страх и риск</string>
<string name="full_licenses">Полные тексты лицензий</string>
- <string name="blocklocal_summary">Сети напрямую доступные через локальный интерфейс не будут маршрутизированы через VPN. Отключите эту опцию чтобы направить трафик через VPN.</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 провайдер/шлюз поддерживающий OpenVPN. Для получения информации по настройке собственного OpenVPN сервера: http://community.openvpn.net/</string>
+ <string name="openvpn_is_no_free_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="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="mtu_invalid_value">Значение, переопределяющее MTU, должно быть целым числом от 64 до 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="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>
@@ -339,53 +340,106 @@
<string name="delete">Удалить</string>
<string name="add_remote">Добавить новую удаленку</string>
<string name="remote_random">Использовать список подключений в случайном порядке при соединении</string>
- <string name="remote_no_server_selected">Вы должны определить и включить как минумум один удаленный сервер.</string>
+ <string name="remote_no_server_selected">Вы должны определить и включить как минимум один удаленный сервер.</string>
<string name="server_list">Список серверов</string>
- <string name="vpn_allowed_apps">Разрешенные Приложения</string>
+ <string name="vpn_allowed_apps">Разрешённые приложения</string>
<string name="advanced_settings">Расширенные настройки</string>
- <string name="payload_options">Опции нагрузки</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_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="faq_android_clients">Существуют различные клиенты OpenVPN для Android. Самые распространённые — OpenVPN для Android (этот клиент), OpenVPN Connect и OpenVPN Settings.&lt;p&gt;Клиенты можно разделить на две группы: OpenVPN для Android и OpenVPN Connect используют официальный VPNService API (Android 4.0+) и не требуют root-доступ, и OpenVPN Settings, который требует root.&lt;p&gt;OpenVPN для 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 для 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_only_cidr">Android поддерживает только CIDR маршруты к VPN. Поскольку не CIDR маршруты почти никогда не используются, OpenVPN для 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_kitkat_mss">Ранние версии KitKat устанавливают неверное значение MSS для TCP соединений (#61948). Попробуйте включить опцию 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_lollipop_reinstall">Приложения VPN могут перестать работать после удаления и повторной установки. Подробности см. #80074</string>
+ <string name="ab_not_route_to_vpn">Сконфигурированный IP-адрес клиента и IP-адреса в его подсети (согласно сетевой маске) не направляются через VPN. OpenVPN обходит этот баг, явно добавляя маршрут, который соответствует клиентскому IP и его сетевой маске</string>
+ <string name="ab_persist_tun">Открытие туннеля, когда туннель уже активен, для его постоянного удержания, может привести к ошибке и VPNServices закроется на устройстве. Для возобновления работы VPN требуется перезагрузка. OpenVPN для Android пытается избежать установки второго туннеля, и если действительно нужно - сначала закрывает текущий туннель, перед открытием нового, чтобы избежать краха программы. Это может привести к маленькому интервалу, в котором передача пакетов происходит по обычному (не VPN) соединению. Даже с этими ухищрениями VPNServices иногда крашится и требует перезагрузки устройства.</string>
<string name="ab_secondary_users">VPN не работает совсем для вторичных пользователей.</string>
- <string name="ab_kitkat_reconnect">"Различные пользователи сообщают, что мобильная связь/мобильная передача данных часто обрывается, когда используется 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="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_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="custom_connection_options">Пользовательские параметры</string>
<string name="remove_connection_entry">Удалить запись подключения</string>
- <string name="ab_kitkat_reconnect_title">Случайные разъединения от мобильной сети</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 для Android (0.6.29/Март 2015) используют более безопасные настройки по умолчанию для разрешенных наборов шифров (tls-шифрование \"DEFAULT:!EXP:!PSK:!SRP:!kRSA\"). К сожалению, прекращение использования менее безопасных наборов шифров и экспортирование наборов шифров, а особенно прекращение использования наборов шифров, которые не поддерживают Perfect Forward Secrecy (Diffie-Hellman), приводит к возникновению некоторых проблем. Обычно это происходит из-за изначально полезной, но плохо реализованной попытки усиления безопасности TLS путем установки tls-шифрования на сервере или некоторых встроенных ОС с урезанным SSL (например, MikroTik).\nЧтобы решить эту проблему, установите настройки tls-шифрования на сервере на разумные по умолчанию, такие как tls-шифрование \"DEFAULT:!EXP:!PSK:!SRP:!kRSA\". Чтобы обойти проблему на клиенте, добавьте отдельную настройку tls-шифрования tls-cipher DEFAULT в Android-клиент.</string>
+ <string name="tls_cipher_alert">Новые версии OpenVPN для Android (0.6.29/Март 2015) используют более безопасные настройки по умолчанию для разрешённых наборов шифров (tls-cipher \"DEFAULT:!EXP:!PSK:!SRP:!kRSA\"). К сожалению, прекращение использования менее безопасных и экспортных наборов шифров, а особенно тех наборов шифров, которые не поддерживают Perfect Forward Secrecy (Diffie-Hellman), приводит к некоторым проблемам. Обычно это происходит из-за благонамеренной, но плохо реализованной попытки усиления безопасности TLS путём установки tls-cipher на сервере или некоторых встроенных ОС с урезанным SSL (например, MikroTik).\nЧтобы решить эту проблему, установите настройки tls-cipher на сервере на разумные по умолчанию, такие как tls-cipher \"DEFAULT:!EXP:!PSK:!SRP:!kRSA\". Чтобы обойти проблему на клиенте, добавьте отдельную настройку tls-cipher DEFAULT в Android-клиент.</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="lastdumpdate">(Последний дамп создан %1$d ч. и %2$d м. назад (%3$s))</string>
<string name="clear_log_on_connect">Очищать журнал при новом соединении</string>
<string name="connect_timeout">Время ожидания соединения</string>
+ <string name="no_allowed_app">Не добавлено разрешенных приложений. Добавляем себя (%s), чтобы в списке разрешенных приложений было хотя бы одно приложение, иначе все приложения добавятся в список разрешенных</string>
+ <string name="query_permissions_sdcard">OpenVPN для Android может попытаться найти отсутствующие файлы на SD-карте автоматически. Нажмите на это сообщение, чтобы получить запрос на разрешение.</string>
<string name="protocol">Протокол</string>
<string name="enabled_connection_entry">Включено</string>
- <string name="months_left">%d мес. осталось</string>
- <string name="days_left">%d д. осталось</string>
- <string name="hours_left">%d ч. осталось</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="permission_revoked">Разрешение VPN отозвано ОС (например, запущена другая программа VPN), останавливаем VPN</string>
+ <string name="pushpeerinfo">Отправить информацию об участнике</string>
+ <string name="pushpeerinfosummary">Отправить дополнительную информацию на сервер, например, версию SSL и версию Android</string>
+ <string name="pw_request_dialog_title">Требуется %1$s</string>
+ <string name="pw_request_dialog_prompt">Пожалуйста, введите пароль для профиля %1$s</string>
+ <string name="menu_use_inline_data">Использовать встроенные данные</string>
+ <string name="export_config_chooser_title">Экспорт файла конфигурации</string>
+ <string name="missing_tlsauth">файл tls-auth отсутствует</string>
+ <string name="missing_certificates">Отсутствует сертификат пользователя или файл ключа сертификата пользователя</string>
+ <string name="missing_ca_certificate">Отсутствует сертификат ЦС</string>
+ <string name="crl_title">Список отозванных сертификатов (опционально)</string>
+ <string name="reread_log">Перечитать (%d) элементов лога из файла кэша лога</string>
+ <string name="samsung_broken">Даже несмотря на то, что телефоны Samsung являются одними из наиболее продаваемых телефонов на Android, прошивки Samsung также являются и наиболее проблемными прошивками на Android. Ошибки не ограничиваются только работой VPN на этих устройствах, но многие из них можно обойти. Далее описаны некоторые из этих ошибок.\n\nDNS не работает, если сервер DNS не в диапазоне VPN.\n\nНа многих устройствах Samsung 5.x функция разрешённых/запрещённых приложений не работает.\nНа Samsung 6.x, как сообщается, VPN не работает, пока приложению VPN не разрешено не экономить заряд батареи.</string>
+ <string name="samsung_broken_title">Телефоны Samsung</string>
+ <string name="novpn_selected">Не выбрано VPN.</string>
+ <string name="defaultvpn">VPN по умолчанию</string>
+ <string name="defaultvpnsummary">VPN, который будет использоваться по умолчанию, когда это необходимо. А именно, при загрузке, для «Постоянной VPN» и для переключателя в «Быстрых настройках».</string>
+ <string name="vpnselected">В настоящее время выбран VPN: \'%s\'</string>
+ <string name="reconnect">Переподключить</string>
+ <string name="qs_title">Переключение VPN</string>
+ <string name="qs_connect">Подключиться к %s</string>
+ <string name="qs_disconnect">Отключиться от %s</string>
+ <string name="connectretrymaxmessage">Введите максимальное время между попытками соединения. OpenVPN будет медленно поднимать свое время ожидания после неудачной попытки подключения до этого значения. По умолчанию 300 сек.</string>
+ <string name="connectretrymaxtitle">Максимальное время между попытками соединения</string>
+ <string name="state_waitconnectretry">Ожидание %ss секунд между попыткой подключения</string>
+ <string name="nought_alwayson_warning"><![CDATA[Если диалог подтверждения VPN не открылся, то у вас выбрано другое приложение в «Постоянная VPN». Это значит, что только данному приложению разрешено подключаться к VPN. Проверьте Настройки -> (Сети) Ещё -> VPN]]></string>
+ <string name="management_socket_closed">Подключение к OpenVPN закрыто (%s)</string>
+ <string name="change_sorting">Изменить сортировку</string>
+ <string name="sort">Сортировать</string>
+ <string name="sorted_lru">Профили отсортированы по порядку последнего использования</string>
+ <string name="sorted_az">Профили отсортированы по названию</string>
+ <string name="deprecated_tls_remote">Файл настройки использует опцию tls-remote, которая была объявлена устаревшей в версии 2.3 и окончательно удалена в версии 2.4</string>
+ <string name="auth_failed_behaviour">Поведение при AUTH_FAILED</string>
+ <string name="graph">График</string>
+ <string name="use_logarithmic_scale">Использовать логарифмическую шкалу</string>
+ <string name="notenoughdata">Недостаточно данных</string>
+ <string name="avghour">В среднем за час</string>
+ <string name="avgmin">В среднем за минуту</string>
+ <string name="last5minutes">Последние 5 минут</string>
+ <string name="data_in">Входящий</string>
+ <string name="data_out">Исходящий</string>
+ <string name="bits_per_second">%.0f бит/с</string>
+ <string name="kbits_per_second">%.1f Кбит/с</string>
+ <string name="mbits_per_second">%.1f Мбит/с</string>
+ <string name="gbits_per_second">%.1f Гбит/с</string>
+ <string name="volume_byte">%.0f Б</string>
+ <string name="volume_kbyte">%.1f КБ</string>
+ <string name="volume_mbyte">%.1f МБ</string>
+ <string name="volume_gbyte">%.1f ГБ</string>
</resources>
diff --git a/app/src/main/res/values-sl/plurals-icsopenvpn.xml b/app/src/main/res/values-sl/plurals-icsopenvpn.xml
new file mode 100755
index 00000000..a5975083
--- /dev/null
+++ b/app/src/main/res/values-sl/plurals-icsopenvpn.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Generated by crowdin.com-->
+<resources>
+ <plurals name="months_left">
+ <item quantity="one">Preostal je še en mesec</item>
+ <item quantity="two">Preostala sta še %d meseca</item>
+ <item quantity="few">Preostali so še %d meseci</item>
+ <item quantity="other">Preostalo je še %d mesecev</item>
+ </plurals>
+ <plurals name="days_left">
+ <item quantity="one">Preostal je še en dan</item>
+ <item quantity="two">Preostala sta še %d dneva</item>
+ <item quantity="few">Preostali so še %d-je dnevi</item>
+ <item quantity="other">Preostalih je še %d dni</item>
+ </plurals>
+ <plurals name="hours_left">
+ <item quantity="one">Preostala je še ena ura</item>
+ <item quantity="two">Preostali sta še %d uri</item>
+ <item quantity="few">Preostale so še %d ure</item>
+ <item quantity="other">Preostalo je še %d ur</item>
+ </plurals>
+ <plurals name="minutes_left">
+ <item quantity="one">Preostala je še ena minuta</item>
+ <item quantity="two">Preostali sta še %d minuti</item>
+ <item quantity="few">Preostale so še %d minute</item>
+ <item quantity="other">Preostalo je še %d minut</item>
+ </plurals>
+</resources>
diff --git a/app/src/main/res/values-sl/strings-icsopenvpn.xml b/app/src/main/res/values-sl/strings-icsopenvpn.xml
index 28634668..019e27e4 100755
--- a/app/src/main/res/values-sl/strings-icsopenvpn.xml
+++ b/app/src/main/res/values-sl/strings-icsopenvpn.xml
@@ -44,15 +44,16 @@
<string name="duplicate_profile_name">Vnesite edinstveno ime profila</string>
<string name="profilename">Ime profila</string>
<string name="no_keystore_cert_selected">Izbrati morate uporabniško potrdilo</string>
- <string name="no_error_found">Nobene napake ni bilo najdene</string>
+ <string name="no_ca_cert_selected">Izbrati morate potrdilo overitelja potrdil</string>
+ <string name="no_error_found">Ni najdenih napak</string>
<string name="config_error_found">Napaka v nastavitvah</string>
<string name="ipv4_format_error">Napaka pri razčlenjevanju naslova IPv4</string>
<string name="custom_route_format_error">Napaka pri razčlenjevanju poti po meri</string>
<string name="pw_query_hint">(pustite prazno za poizvedbo na zahtevo)</string>
<string name="vpn_shortcut">Bližnjica OpenVPN</string>
- <string name="vpn_launch_title">Poveži se v VPN</string>
+ <string name="vpn_launch_title">Povezovanje v VPN &#8230;</string>
<string name="shortcut_profile_notfound">Profila, določenega v bližnjici, ni bilo mogoče najti</string>
- <string name="random_host_prefix">Predpona naklj. gostitelja</string>
+ <string name="random_host_prefix">Predpona naključnega gostitelja</string>
<string name="random_host_summary">Doda 6 naključnih znakov pred ime gostitelja</string>
<string name="custom_config_title">Omogoči možnosti po meri</string>
<string name="custom_config_summary">Določite možnosti po meri. Uporabljajte previdno!</string>
@@ -164,7 +165,7 @@
<string name="private_key_password">Geslo zasebnega ključa</string>
<string name="password">Geslo</string>
<string name="file_icon">ikona datoteke</string>
- <string name="tls_authentication">Overitev TLS</string>
+ <string name="tls_authentication">Overitev/Šifriranje TLS</string>
<string name="generated_config">Ustvarjene nastavitve</string>
<string name="generalsettings">Nastavitve</string>
<string name="owner_fix_summary">Poizkusi nastaviti lastnika mape /dev/tun na sistem. Nekateri odtisi CM9 to potrebujejo za delovanje API-ja storitve VPN. Zahteva skrbniški dostop.</string>
@@ -203,9 +204,8 @@
<string name="using_proxy">Uporaba posredniškega strežnika %1$s %2$d</string>
<string name="use_system_proxy">Uporabi sis. pos. str.</string>
<string name="use_system_proxy_summary">Za povezavo uporabi nastavitve celega sistema za posredniške strežnike HTTP/HTTPS.</string>
- <string name="donatewithpaypal">Darujete lahko s &lt;a href=\"https://www.paypal.com/cgi-bin/webscr?hosted_button_id=R2M6ZP9AF25LS&amp;amp;cmd=_s-xclick\"&gt;PayPalom&lt;/a&gt; </string>
- <string name="onbootrestartsummary">OpenVPN bo ponovno povezal VPN, če je bil dejaven ob zaustavitvi/ponovnem zagonu sistema. Preberite pogosta vprašanja opozoril o povezavi pred uporabo te možnosti.</string>
- <string name="onbootrestart">Pon. povez. ob pon. zag.</string>
+ <string name="onbootrestartsummary">OpenVPN bo povezal navedeni VPN, če je bil dejaven ob zagonu sistema. Preberite pogosta vprašanja o opozorilih glede povezav pred uporabo te možnosti na Androidu &lt; 5.0.</string>
+ <string name="onbootrestart">Poveži ob zagonu</string>
<string name="ignore">Prezri</string>
<string name="restart">Ponovno zaženi</string>
<string name="restart_vpn_after_change">Spremembe nastavitev se bodo uporabile po ponovnem zagonu VPN-a. (Ponovno) zaženi VPN zdaj?</string>
@@ -252,7 +252,6 @@
<string name="state_tcp_connect">Povezovanje (TCP)</string>
<string name="state_auth_failed">Overitev je spodletela</string>
<string name="state_nonetwork">Čakanje na uporabno omrežje</string>
- <string name="statusline_bytecount">↓%2$s/s %1$s - ↑%4$s/s %3$s</string>
<string name="notifcation_title_notconnect">Ni povezan</string>
<string name="start_vpn_title">Povezovanje v VPN %s</string>
<string name="start_vpn_ticker">Povezovanje v VPN %s</string>
@@ -392,13 +391,45 @@
<string name="protocol">Protokol</string>
<string name="enabled_connection_entry">Omogočeno</string>
<string name="abi_mismatch">Prednostna izvirna predhodnost ABI (%1$s) in ABI, ki ga sporočajo izvirne knjižnice (%2$s), se ne ujemata.</string>
- <string name="months_left">Preostalih še %d mesecev</string>
- <string name="days_left">Preostalih še %d dni</string>
- <string name="hours_left">Preostalih še %d ur</string>
<string name="permission_revoked">OS je preklical dovoljenje VPN (npr. zagnan je bil drug program VPN), ustavljanje VPN-a</string>
<string name="pushpeerinfo">Potisni podatke o soležniku</string>
<string name="pushpeerinfosummary">Pošlji dodatne podatke na strežnik, npr. različico SSL in Android</string>
<string name="pw_request_dialog_title">Zahtevano %1$s</string>
<string name="pw_request_dialog_prompt">Vnesite geslo za profil %1$s</string>
<string name="menu_use_inline_data">Uporabi podatke v besedilu</string>
+ <string name="export_config_chooser_title">Izvozi nastavitveno datoteko</string>
+ <string name="missing_tlsauth">Datoteka tls-auth manjka</string>
+ <string name="missing_certificates">Manjka uporabniško potrdilo ali datoteka ključa uporabniškega potrdila</string>
+ <string name="missing_ca_certificate">Manjka potrdilo CA</string>
+ <string name="crl_title">Seznam preklicanih potrdil (izbirno)</string>
+ <string name="reread_log">Ponovno preberite predmete dnevnika (%d) iz njegove predpomnjene datoteke</string>
+ <string name="samsung_broken">Čeprav so Samsungovi telefoni eni najbolj prodajanih telefonov z Androidom, je strojna programska oprema njihovih telefonov ena najbolj hroščastih. Hrošči niso omejeni na delovanje VPN-a in se veliko od njih da zaobiti. Tukaj je opisanih nekaj hroščev.\n\nDNS ne deluje, če strežnik DNS ni v dosegu VPN-a.\n\nNa veliko napravah Samsung 5.x značilnost dovoljeni/nedovoljeni programi ne deluje.\nZa Samsungu 6.x je bilo sporočeno, da VPN ne deluje razen če je program za VPN dodan na seznam izjem značilnosti varčevanja z energijo.</string>
+ <string name="samsung_broken_title">Telefoni Samsung</string>
+ <string name="novpn_selected">VPN ni izbran.</string>
+ <string name="vpnselected">Trenutno izbrani VPN: \'%s\'</string>
+ <string name="reconnect">Ponovno poveži</string>
+ <string name="qs_title">Preklopi VPN</string>
+ <string name="qs_connect">Poveži se v %s</string>
+ <string name="qs_disconnect">Prekini povezavo s/z %s</string>
+ <string name="connectretrymaxmessage">Vnesite najdaljši čas med poizkusi povezave. OpenVPN bo po neuspešnem poizkusu povezave počasi povečeval čakalni čas do te vrednosti. Privzeto je 300 s.</string>
+ <string name="connectretrymaxtitle">Najdaljši čas med poizkusi povezave</string>
+ <string name="state_waitconnectretry">Čakanje %s s med poizkusi povezave</string>
+ <string name="nought_alwayson_warning"><![CDATA[Če niste dobili potrditvenega pogovornega okna VPN, imate v drugem programu omogočeno \"Vedno z VPN-om\". V tem primeru se lahko v VPN poveže samo ta program. Preverite v Nastavitve -> Omrežje (več) ... -> VPN-i]]></string>
+ <string name="management_socket_closed">Povezava v OmenVPN zaprta (%s)</string>
+ <string name="change_sorting">Spremeni razvrščanje</string>
+ <string name="sort">Razvrsti</string>
+ <string name="sorted_lru">Profili, razvrščeni po nazadnje uporabljenem</string>
+ <string name="sorted_az">Profili, razvrščeni po imenu</string>
+ <string name="deprecated_tls_remote">Nastavitve uporabljajo možnost tls-remote, ki je bila opuščena v raz. 2.3 in končno odstranjena v raz. 2.4</string>
+ <string name="graph">Graf</string>
+ <string name="notenoughdata">Ni dovolj podatkov</string>
+ <string name="last5minutes">Zadnjih 5 minut</string>
+ <string name="bits_per_second">%.0f bit/s</string>
+ <string name="kbits_per_second">%.1f kbit/s</string>
+ <string name="mbits_per_second">%.1f Mbit/s</string>
+ <string name="gbits_per_second">%.1f Gbit/s</string>
+ <string name="volume_byte">%.0f B</string>
+ <string name="volume_kbyte">%.1f kB</string>
+ <string name="volume_mbyte">%.1f MB</string>
+ <string name="volume_gbyte">%.1f GB</string>
</resources>
diff --git a/app/src/main/res/values-sv/plurals-icsopenvpn.xml b/app/src/main/res/values-sv/plurals-icsopenvpn.xml
new file mode 100755
index 00000000..9bab8338
--- /dev/null
+++ b/app/src/main/res/values-sv/plurals-icsopenvpn.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Generated by crowdin.com-->
+<resources>
+ <plurals name="months_left">
+ <item quantity="one">En månad kvar</item>
+ <item quantity="other">%d månader kvar</item>
+ </plurals>
+ <plurals name="days_left">
+ <item quantity="one">En dag kvar</item>
+ <item quantity="other">%d dagar kvar</item>
+ </plurals>
+ <plurals name="hours_left">
+ <item quantity="one">En timme kvar</item>
+ <item quantity="other">%d timmar kvar</item>
+ </plurals>
+ <plurals name="minutes_left">
+ <item quantity="one">En minut kvar</item>
+ <item quantity="other">%d minuter kvar</item>
+ </plurals>
+</resources>
diff --git a/app/src/main/res/values-sv/strings-icsopenvpn.xml b/app/src/main/res/values-sv/strings-icsopenvpn.xml
index 075de908..585844fa 100755
--- a/app/src/main/res/values-sv/strings-icsopenvpn.xml
+++ b/app/src/main/res/values-sv/strings-icsopenvpn.xml
@@ -44,13 +44,14 @@
<string name="duplicate_profile_name">Vänligen ange ett unikt Profilnamn</string>
<string name="profilename">Profilnamn</string>
<string name="no_keystore_cert_selected">Du måste välja ett användarcertifikat</string>
+ <string name="no_ca_cert_selected">Du måste välja ett CA-certifikat</string>
<string name="no_error_found">Inga fel hittades</string>
<string name="config_error_found">Fel i konfigurationen</string>
<string name="ipv4_format_error">Det går inte att tolka IPv4-adressen</string>
<string name="custom_route_format_error">Det går inte att tolka de anpassade rutterna</string>
<string name="pw_query_hint">(lämna tom för förfrågan vid behov)</string>
<string name="vpn_shortcut">OpenVPN genväg</string>
- <string name="vpn_launch_title">Ansluta till VPN</string>
+ <string name="vpn_launch_title">Ansluter till VPN&#8230;</string>
<string name="shortcut_profile_notfound">Profilen som anges i genvägen hittades inte</string>
<string name="random_host_prefix">Slumpmässigt värd-prefix</string>
<string name="random_host_summary">Lägger till 6 slumpmässiga tecken framför hostname</string>
@@ -159,12 +160,12 @@
<string name="converted_profile">importerad profil</string>
<string name="converted_profile_i">importerad profil %d</string>
<string name="broken_images">Trasiga ROM</string>
- <string name="broken_images_faq">lt;pgt;Officiella HTC ROM är kända för att ha ett konstigt rutt problem som orsakar att trafik inte går genom tunneln (Se även &lt;a href=\"http://code.google.com/p/ics-openvpn/issues/detail?id=18\"&gt;Ärende 18&lt;/a&gt; i äredehanteringen.)&lt;/p&gt;&lt;p&gt;Äldre officiella SONY ROM för Xperia Arc S och Xperia Ray har rapporterats sakna VPNService helt. (Se även &lt;a href=\"http://code.google.com/p/ics-openvpn/issues/detail?id=29\"&gt;Ärende 29&lt;/a&gt; i ärendehanteringen.)&lt;/p&gt;&lt;p&gt;I anpassade/modifierade ROM kan tun modulen saknas eller rättigheterna på /dev/tun kan vara fel. Vissa CM9 ROM behöver alternativet \"Fixa ägande\" under \"Modellanpassade hack\" ikryssat.&lt;/p&gt;&lt;p&gt;Viktigt: Om du har en trasig ROM, rapportera det till din leverantör. Ju fler människor som rapportera problemet till leverantören desto mer sannolikt är det att det kommer en rättning.&lt;/p&gt;</string>
+ <string name="broken_images_faq">&lt;p&gt;Officiella HTC ROM är kända för att ha ett konstigt rutt problem som orsakar att trafik inte går genom tunneln (Se även &lt;a href=\"http://code.google.com/p/ics-openvpn/issues/detail?id=18\"&gt;Ärende 18&lt;/a&gt; i äredehanteringen.)&lt;/p&gt;&lt;p&gt;Äldre officiella SONY ROM för Xperia Arc S och Xperia Ray har rapporterats sakna VPNService helt. (Se även &lt;a href=\"http://code.google.com/p/ics-openvpn/issues/detail?id=29\"&gt;Ärende 29&lt;/a&gt; i ärendehanteringen.)&lt;/p&gt;&lt;p&gt;I anpassade/modifierade ROM kan tun modulen saknas eller rättigheterna på /dev/tun kan vara fel. Vissa CM9 ROM behöver alternativet \"Fixa ägande\" under \"Modellanpassade hack\" ikryssat.&lt;/p&gt;&lt;p&gt;Viktigt: Om du har en trasig ROM, rapportera det till din leverantör. Ju fler människor som rapportera problemet till leverantören desto mer sannolikt är det att det kommer en rättning.&lt;/p&gt;</string>
<string name="pkcs12_file_encryption_key">Krypteringsnyckel för PKCS12-filen</string>
<string name="private_key_password">Lösenord för privat nyckel</string>
<string name="password">Lösenord</string>
<string name="file_icon">filikon</string>
- <string name="tls_authentication">TLS-autentisering</string>
+ <string name="tls_authentication">TLS-autentisering/kryptering</string>
<string name="generated_config">Genererad konfiguration</string>
<string name="generalsettings">Inställningar</string>
<string name="owner_fix_summary">Försöker att sätta ägaren av /dev/tun till system. Vissa CM9 ROM behöver detta för att VPNService API ska fungera. Detta kräver root.</string>
@@ -203,26 +204,27 @@
<string name="using_proxy">Använder proxy %1$s %2$d</string>
<string name="use_system_proxy">Använd system proxy</string>
<string name="use_system_proxy_summary">Använda systemkonfigurationen för HTTP/HTTPS proxy för att ansluta.</string>
- <string name="donatewithpaypal">Du kan &lt;a href=\"https://www.paypal.com/cgi-bin/webscr?hosted_button_id=R2M6ZP9AF25LS&amp;amp;cmd=_s-xclick\"&gt;donera via PayPal&lt;/a&gt; </string>
- <string name="onbootrestartsummary">OpenVPN återansluter VPN om den var aktiv vid avstängning/omstart. Läs FAQ om anslutningsvarning innan du använder detta alternativ.</string>
- <string name="onbootrestart">Återanslut vid omstart</string>
+ <string name="onbootrestartsummary">OpenVPN kommer att ansluta angiven VPN om den var aktivt vid systemets uppstart. Vänligen läs anslutningsvarnings FAQ innan du använder det här alternativet på Android &lt; 5.0.</string>
+ <string name="onbootrestart">Anslut vid uppstart</string>
<string name="ignore">Ignorera</string>
<string name="restart">Starta om</string>
<string name="restart_vpn_after_change">Konfigurationsändringar tillämpas efter omstart av VPN. Starta(om) VPN nu?</string>
<string name="configuration_changed">Konfigurationen ändrades</string>
<string name="log_no_last_vpn">Kunde inte avgöra vilken den sista anslutna profilen var för redigering</string>
- <string name="faq_duplicate_notification_title">Dubblerade meddelanden</string>
+ <string name="faq_duplicate_notification_title">Dubbla noteringar</string>
<string name="faq_duplicate_notification">Om Android tillfälligt har brist på systemminne (RAM), tas program och tjänster som inte behövs just nu bort från aktiva minnet. Detta avslutar en pågående VPN-anslutning. För att se till att pågående anslutning/OpenVPN överlever körs denna tjänst med högre prioritet. För att köra med högre prioritet måste applikationen visa en notifikation. Nyckelikonen visas av systemet, som beskrivs i FAQ tidigare, och räknas inte som ett meddelande som ger rättighet att köra med högre prioritet.</string>
<string name="no_vpn_profiles_defined">Inga VPN-profiler har definierats.</string>
<string name="add_new_vpn_hint">Använd &lt;img src=\"ic_menu_add\"/&gt; ikonen för att lägga till en ny VPN</string>
<string name="vpn_import_hint">Använd &lt;img src=\"ic_menu_archive\"/&gt; ikonen för att importera en befintlig (.ovpn eller .conf) profil från ditt sd-kort.</string>
<string name="faq_hint">Tänk på att titta i FAQ\'n. Där finns en snabbstartguide.</string>
<string name="faq_routing_title">Konfiguration för rutter/gränssnitt</string>
+ <string name="faq_routing">Omdirigering och gränssnittskonfiguration görs inte via traditionella ifconfig/rutt kommandon men med hjälp av VPNService API. Detta resulterar i en annan omdirigering konfigurering än på andra operativsystem. \nKonfiguration av VPN-tunneln består av IP-adressen och de nätverk som ska dirigeras över detta gränssnitt. Speciellt behövs eller krävs ingen inbördes partner adress eller gatewayadress. Särskilda rutter för att nå VPN-server (t.ex. när du använder omdirigera-gateway) behövs inte heller. Applikationen kommer följaktligen ignorera dessa inställningar när du importerar en konfiguration. Applikationen försäkrar med VPNService API att anslutningen till servern inte dirigeras genom VPN-tunnel.\nVPNService API tillåter inte att specificera nätverk som inte ska dirigeras via VPN. Som en lösning försöker applikationen att identifiera nätverk som inte ska dirigeras över tunneln (t.ex. rutt x.x.x.x y.y.y.y net_gateway) och beräknar en uppsättning av rutter som utesluter dessa rutter att efterlikna beteendet hos andra plattformar. Loggnings fönstret visar konfigurationen av VPNService då en upprättning av anslutning.\nBakom kulisserna. Android 4.4+ använder policy omdirigering. Användning av rutt/ifconfig kommer inte att visa installerade rutter. Använd istället ip regel, iptables -t mangle -L</string>
<string name="persisttun_summary">Fall inte tillbaka till ingen VPN-anslutning när OpenVPN återansluter.</string>
<string name="persistent_tun_title">Ihållande tun</string>
<string name="openvpn_log">OpenVPN Log</string>
<string name="import_config">Importera OpenVPN konfiguration</string>
<string name="battery_consumption_title">Batteriförbrukning</string>
+ <string name="baterry_consumption">I mina personliga tester är den främsta orsaken till hög batteriförbrukning vid användning av OpenVPN hållvidliv-paketen. De flesta OpenVPN servrar har en konfiguration med \"keepalive 10 60\" som leder till att hållvidliv-paket skickas från klienten till servern och från servern till klienten var tionde sekund. &lt;p&gt; Även om dessa paket är små och inte använder mycket datatrafik håller de det mobila radionätet upptaget och ökar på så vis energiförbrukningen. (Se även &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; Denna hållvidliv-inställning kan inte ändras i klienten. Endast systemadministratören för OpenVPN kan ändra inställningen. &lt;p&gt; Tyvärr leder en hållvidliv som är större än 60 sekunder med UDP till att vissa NAT-gateways tappar anslutningen efter en kort timeout (60 sekunder i mina tester). Via TCP med lång hållvidliv fungerar men ger TCP över TCP problem. (Se &lt;a href=\"http://sites.inka.de/bigred/devel/tcp-tcp.html\"&gt;varför TCP över TCP är en dålig idé&lt;/a&gt;)</string>
<string name="faq_tethering">Funktionen Internetdelning i Android (över WiFi, USB eller Bluetooth) och VPNService API (används av denna applikation) fungerar inte tillsammans. För mer information se &lt;a href=\"http://code.google.com/p/ics-openvpn/issues/detail?id=34\"&gt;ärende #34&lt;/a&gt;</string>
<string name="vpn_tethering_title">VPN och Internetdelning</string>
<string name="connection_retries">Anslutningsförsök</string>
@@ -250,7 +252,7 @@
<string name="state_tcp_connect">Ansluter (TCP)</string>
<string name="state_auth_failed">Autentisering misslyckades</string>
<string name="state_nonetwork">Väntar på användbart nätverk</string>
- <string name="statusline_bytecount">↓%2$s/s %1$s - ↑%4$s/s %3$s</string>
+ <string name="statusline_bytecount">↓%2$s %1$s - ↑%4$s %3$s</string>
<string name="notifcation_title_notconnect">Inte ansluten</string>
<string name="start_vpn_title">Ansluter till VPN %s</string>
<string name="start_vpn_ticker">Ansluter till VPN %s</string>
@@ -272,7 +274,7 @@
<string name="tls_remote_deprecated">TLS-remote (ej längre i bruk)</string>
<string name="help_translate">Du kan hjälpa till med översättningen genom att besöka http://crowdin.net/project/ics-openvpn/invite</string>
<string name="prompt">%1$s försöker styra %2$s</string>
- <string name="remote_warning">Genom att fortsätta ger du applikationen tilstånd att fullständigt styra OpenVPM för Android och att avlyssna all nätverkstrafik. <b>Acceptera INTE om du inte litar på applikationen.</b> Annars riskerar du att din data äventyras av skadlig programvara.\"</string>
+ <string name="remote_warning">Genom att fortsätta ger du applikationen tilstånd att fullständigt styra OpenVPN för Android och att avlyssna all nätverkstrafik. <b>Acceptera INTE om du inte litar på applikationen.</b> Annars riskerar du att din data äventyras av skadlig programvara.\"</string>
<string name="remote_trust">Jag litar på denna applikation.</string>
<string name="no_external_app_allowed">Ingen app får använda externa API</string>
<string name="allowed_apps">Tillåtna apps: %s</string>
@@ -286,46 +288,158 @@
<string name="resumevpn">Återuppta VPN</string>
<string name="state_userpause">VPN paus begärs av användaren</string>
<string name="state_screenoff">VPN paus - skärmen av</string>
+ <string name="device_specific">Enhetsutförande Hacks</string>
<string name="cannotparsecert">Kan inte visa certifikatinformation</string>
<string name="appbehaviour">Ansökan beteende</string>
<string name="vpnbehaviour">VPN beteende</string>
<string name="allow_vpn_changes">Tillåta ändringar av VPN profiler</string>
<string name="hwkeychain">Hårdvara Keystore:</string>
<string name="permission_icon_app">Ikonen för appen försöker använda OpenVPN för Android</string>
+ <string name="faq_vpndialog43">"Från och med Android 4.3, så är dialogrutan för att godkänna VPN-anslutning skyddad mot \"appar som lägger sig över\". Detta gör att dialogen spärras mot tryckningar. Om du använder en app som lägger sig över andra appar, så kan detta orsaka det beteendet. Om du hittar den trilskande appen, kontakta skaparen av den appen. Detta problem påverkar alla VPN-appar på Android 4.3 och senare. Se också &lt;a href=\"https://github.com/schwabe/ics-openvpn/issues/185\"&gt;Ärende 185&lt;a&gt; för mer information"</string>
<string name="faq_vpndialog43_title">Vpn Bekräftelse Dialog</string>
<string name="donatePlayStore">Alternativt kan du skicka mig en donation med Play Store:</string>
+ <string name="thanks_for_donation">Tack för att du donerar %s!</string>
<string name="logCleared">Log rensas.</string>
<string name="show_password">Visa lösenord</string>
+ <string name="keyChainAccessError">Nyckelhanterare fel: %s</string>
<string name="timestamp_short">Kort</string>
<string name="timestamp_iso">ISO</string>
<string name="timestamps">Tidsstämplar</string>
<string name="timestamps_none">Ingen</string>
<string name="uploaded_data">Ladda upp</string>
<string name="downloaded_data">Hämta</string>
+ <string name="vpn_status">VPN-status</string>
<string name="logview_options">Visa alternativ</string>
+ <string name="unhandled_exception">Ohanterat undantag: %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">Om du har rootat din Android-enhet, så kan du installera &lt;a href=\"http://xposed.info/\"&gt;Xposed-ramverket&lt;/a&gt; och &lt;a href=\"http://repo.xposed.info/module/de.blinkt.vpndialogxposed\"&gt;VPN-bekräftelsemodulen&lt;/a&gt; på egen risk\"</string>
+ <string name="full_licenses">Fullständiga licensavtal</string>
+ <string name="blocklocal_summary">Nätverk direkt kopplade till lokala gränssnitt kommer inte att dirigeras över VPN. Avmarkering av detta alternativ kommer att omdirigera all trafik avsedda för lokala nätverk till VPN.</string>
<string name="blocklocal_title">Kringgå VPN för lokala nätverk</string>
<string name="userpw_file">Användarnamn / lösenord fil</string>
<string name="imported_from_file">[Importerad från: %s]</string>
+ <string name="files_missing_hint">Vissa filer kunde inte hittas. Välj filer för att importera profil:</string>
+ <string name="openvpn_is_no_free_vpn">För att använda denna applikation behöver du en VPN-leverantör/VPN-gateway som stöder OpenVPN (ofta tillhandahållen av din arbetsgivare). Kolla http://community.openvpn.net/ för mer information om OpenVPN och hur man ställer in en egen OpenVPN-server.</string>
<string name="import_log">Importloggen:</string>
+ <string name="ip_looks_like_subnet">Vpn-topologi \"%3$s\" specifierad, men ifconfig %1$s %2$s ser ut att vara en IP-adress med en nätmask. Antar \"subnet\"-topologi.</string>
+ <string name="mssfix_invalid_value">MSS överbelastningsvärde måste vara en heltal mellan 0 och 9000</string>
+ <string name="mtu_invalid_value">MTU-överskridningsvärdet måste vara ett heltal mellan 64 och 9000</string>
+ <string name="mssfix_value_dialog">Meddela TCP-sessioner som körs över tunneln att de ska begränsa sina sändningspaketstorlekar så att efter OpenVPN har inkapslat dem, kommer den resulterande UDP-paketstorleken som OpenVPN skickar till dess peerer inte överstiga detta antal byte. (Standard är 1450)</string>
+ <string name="mssfix_checkbox">Kringgå MSS-värdet för innehållet i TCP-paket</string>
+ <string name="mssfix_dialogtitle">Ställ in MSS för innehållet i TCP-paket</string>
<string name="client_behaviour">Klientens beteende</string>
+ <string name="clear_external_apps">Rensa tillåtna externa applikationer</string>
<string name="loading">Laddar...</string>
+ <string name="allowed_vpn_apps_info">Tillåtna VPN-applikationer: %1$s</string>
+ <string name="disallowed_vpn_apps_info">Otillåtna VPN-applikationer: %1$s</string>
+ <string name="app_no_longer_exists">Paket %s är inte längre installerat, ta bort den från tillåtna/otillåtna applikationslistan</string>
+ <string name="vpn_disallow_radio">VPN används för alla applikationer men exkluderar valda</string>
+ <string name="vpn_allow_radio">VPN används endast för utvalda applikationer</string>
+ <string name="query_delete_remote">Radera serverpost?</string>
<string name="keep">Ha kvar</string>
<string name="delete">Radera</string>
+ <string name="add_remote">Lägg till ny server</string>
+ <string name="remote_random">Använd anslutnings poster i slumpmässig ordning på Anslut</string>
+ <string name="remote_no_server_selected">Du måste definiera och aktivera åtminstone en fjärrserver.</string>
<string name="server_list">Serverlista</string>
<string name="vpn_allowed_apps">Tillåtna appar</string>
+ <string name="advanced_settings">Avancerade inställningar</string>
+ <string name="payload_options">Alternativ för paketinnehåll</string>
+ <string name="tls_settings">TLS-inställningar</string>
+ <string name="no_remote_defined">Ingen server specifierad</string>
+ <string name="duplicate_vpn">Duplicera VPN-profil</string>
+ <string name="duplicate_profile_title">Duplicerar profil: %s</string>
<string name="show_log">Visa logg</string>
+ <string name="faq_android_clients">Flera OpenVPN klienter för Android finns. Den vanligaste är OpenVPN för Android (denna klient), OpenVPN Connect och OpenVPN Settings.&lt;p&gt;Klienterna kan delas in i två grupper: OpenVPN för Android och OpenVPN Connect använder den officiella VPNService API:n (Android 4.0+) och kräver ingen rot och OpenVPN Settings som använder rot.&lt;p&gt;OpenVPN for Android är en klient med öppen källkod som har utvecklats av Arne Schwabe. Den riktar sig till mer avancerade användare och erbjuder många inställningar och möjligheten som att importera profiler från filer och konfigurera/ändra profiler inuti appen. Klienten bygger på den gemensamma versionen av OpenVPN. Den är baserad på OpenVPN 2.x källkod. Denna klient kan ses som den halvt officiella klienten i gemenskapen. &lt;p&gt;OpenVPN Connect har inte öppen källkod klient och är utvecklad av OpenVPN Technologies, Inc. Klienten indragen för allmänt bruk och mer inriktad på den genomsnittlige användaren och tillåter importering av OpenVPN profiler. Denna klient är baserad på OpenVPN C ++ reimplementation av OpenVPN protokollet (detta krävdes för att tillåta OpenVPN Technologies, Inc att publicera en iOS OpenVPN app). Denna klient är den officiella klienten av OpenVPN teknik &lt;p&gt; OpenVPN Settings är den äldsta av klienterna och även för UI för OpenVPN öppna källkod. I motsats till OpenVPN för Android kräver den rot och använder inte VPNService API. Den beror inte på Android 4.0+</string>
<string name="faq_androids_clients_title">Skillnader mellan OpenVPN Android klienterna</string>
<string name="ignore_multicast_route">Ignorera multicast rutt: %s</string>
+ <string name="ab_only_cidr">Android stödjer bara rutter specifierade i CIDR-format för VPNet. Eftersom rutter specifierade utan CIDR nästan aldrig används, så kommer OpenVPN för Android använda /32 för dessa rutter, och ge en varning.</string>
+ <string name="ab_tethering_44">Internetdelning fungerar medans VPNet är aktivt. Den delade anslutningen kommer INTE gå via VPNet.</string>
<string name="ab_kitkat_mss">Tidigt KitKat version anger fel MSS värdet på TCP-anslutningar (# 61.948). Försök att göra det möjligt för mssfix möjlighet att kringgå denna bugg.</string>
+ <string name="ab_proxy">Android kommer att använda de proxyinställningar som har ställts in för anslutningen över mobilnät/trådlöst när inga DNS-servrar är inställda. OpenVPN kommer att varna för detta i loggen.<p>När en VPN-anslutning anger en DNS-server, kommer Android att hoppa över proxyn. Det finns inget API för att ange en proxy för en VPN-anslutning.</p></string>
<string name="ab_lollipop_reinstall">VPN appar kan sluta fungera när avinstalleras och installeras igen. För mer information se # 80074</string>
+ <string name="ab_not_route_to_vpn">Det konfigurerade klient-IPt och de IP-nummer som omfattas av dess nätmask är inte ruttade via VPNet. OpenVPN kommer att motarbeta denna bugg genom att explicit lägga till en rutt som omfattar klient-IPt och dess nätmask</string>
+ <string name="ab_persist_tun">Att öppna en tun-enhet medans en annan tun-enhet är aktiv, och denna används för ihållande tun, kommer att krascha VPN-funktionen på enheten. Detta innebär att enheten måste startas om för att VPN skall fungera igen. OpenVPN för Android försöker undvika att öppna tun-enheten på nytt, och om det verkligen behövs, då stänga befintliga tun-anslutningar innan den öppnar den nya tun-enheten för att undvika denna krasch. Detta kan leda till ett litet tidsfönster där paket kan läcka ut utanför VPN-anslutningen. Även med denna fix, så kraschar ibland VPN-funktionen, och kräver då att enheten startas om.</string>
+ <string name="ab_secondary_users">VPN fungerar inte över huvud taget för extra användarkonton.</string>
+ <string name="ab_kitkat_reconnect">"Flera användare har rapporterat att anslutningen till mobilnätverket går ner då och då medans denna VPN-app används. Detta beteende verkar bara påverka vissa kombinationer av operatörer/enheter, och vi har hittils inte hittat någon orsak/lösning för buggen."</string>
+ <string name="ab_vpn_reachability_44">Bara destination kan nås över VPN som kan nås utan VPN. IPv6-VPN fungerar inte alls.</string>
<string name="ab_only_cidr_title">Icke CIDR rutter</string>
+ <string name="ab_proxy_title">Proxy beteende för VPN</string>
<string name="ab_lollipop_reinstall_title">Installera om VPN appar</string>
<string name="version_upto">%s och tidigare</string>
<string name="copy_of_profile">Kopia av %s</string>
+ <string name="ab_not_route_to_vpn_title">Rutt till den konfigurerade IP-adressen</string>
+ <string name="ab_kitkat_mss_title">Fel MSS-värde för VPN-anslutning</string>
+ <string name="ab_secondary_users_title">Sekundära surfplattsanvändare</string>
+ <string name="custom_connection_options_warng">Ange anpassade anslutningsspecifika alternativ. Används med försiktighet</string>
+ <string name="custom_connection_options">Anpassade alternativ</string>
+ <string name="remove_connection_entry">Ta bort anslutningspost</string>
+ <string name="ab_kitkat_reconnect_title">Intermittienta frånkopplingar från mobilnätverk</string>
+ <string name="ab_vpn_reachability_44_title">VPN-nätverket är inte nåbart</string>
+ <string name="ab_persist_tun_title">Ihållande tun-läge</string>
+ <string name="version_and_later">%s och senare</string>
+ <string name="tls_cipher_alert_title">Anslutningar misslyckas med SSL23_GET_SERVER_HELLO:SSLv3 alert handskakningsfel</string>
+ <string name="tls_cipher_alert">Nyare OpenVPN för Android-versioner (0.6.29/mars 2015) använder en säkrare standard för de tillåtna krypteringssviter (tls-chiffer \"DEFAULT:!EXP:!PSK:!SRP:!kRSA\"). Tyvärr, utelämna mindre säker krypteringssviter och exportchiffersviter, särskilt utelämnandet av chiffersviter som inte stöder Perfect Forward Secrecy (Diffie-Hellman) orsakar några problem. Detta orsakas oftast av en välmenande men dåligt utförda försök att stärka TLS-säkerhet genom att tls-chiffer på servern eller några inbäddade operativsystem med avskalad SSL (t.ex. MikroTik).\nFör att lösa problemet, ställa in tls-chiffer inställningar på servern till rimlig standard som tls-siffran \"DEFAULT:!EXP:!PSK:!SRP:!kRSA\". För att komma runt problemet med klienten lägg till anpassad alternativ tls-chiffer DEFAULT i Android-klienten.</string>
+ <string name="message_no_user_edit">Den här profilen har lagts från en extern app (%s) och har markerats som oredigerbar av användare.</string>
+ <string name="crl_file">Lista över återkallade certifikat</string>
+ <string name="service_restarted">Startar om OpenVPN Service (Applikationen har antagligen kraschat eller avlivats för minnespress)</string>
+ <string name="import_config_error">Importera config gav ett fel, kan inte spara det</string>
<string name="Search">Sök</string>
+ <string name="lastdumpdate">(Senaste dumpningen är %1$d:%2$dh gamla (%3$s))</string>
+ <string name="clear_log_on_connect">Rensa loggen vid ny anslutning</string>
+ <string name="connect_timeout">Anslutningsavbrott</string>
+ <string name="no_allowed_app">Ingen godkänd app har lagts till. Denna app (%s) läggs till i listan över godkända appar för att inte alla appar skall godkännas</string>
+ <string name="query_permissions_sdcard">OpenVPN för Android kan försöka upptäcka de saknade fil(erna) på SD-kortet automatiskt. Tryck på det här meddelandet för att ge tillstånd för att starta.</string>
<string name="protocol">Protokoll</string>
<string name="enabled_connection_entry">Aktiverad</string>
- <string name="days_left">%d dagar kvar</string>
- <string name="hours_left">%d timmar kvar</string>
+ <string name="abi_mismatch">Önskemålet av ABI för denna enhet (%1$s) och det ABI som rapporteras av de inlästa biblioteken (%2$s) stämmer inte överens</string>
+ <string name="permission_revoked">VPN-tillstånd återkallas av operativsystemet (t.ex. andra VPN-program har startats), stoppar VPN</string>
+ <string name="pushpeerinfo">Skicka klientinformation till servern</string>
+ <string name="pushpeerinfosummary">Skicka extra information till servern, t.ex. SSL-versionen och Android-version</string>
+ <string name="pw_request_dialog_title">Behöver %1$s</string>
+ <string name="pw_request_dialog_prompt">Ange lösenordet för profil %1$s</string>
+ <string name="menu_use_inline_data">Använd inline-data</string>
+ <string name="export_config_chooser_title">Exportera konfigurationsfil</string>
+ <string name="missing_tlsauth">Filen för TLS-autensitering saknas</string>
+ <string name="missing_certificates">Filen för användarcertifikatet, eller filen för dess privata nyckel, saknas</string>
+ <string name="missing_ca_certificate">CA-certifikat saknas</string>
+ <string name="crl_title">Lista över återkallade certifikat (valfri)</string>
+ <string name="reread_log">Läs in (%d) loggrader från loggens cachefil på nytt</string>
+ <string name="samsung_broken">Även om Samsung telefoner är bland de mest säljande Android-telefoner, Samsungs mjukvara är också bland de mest buggiga Android mjukvarorna. Buggarna är inte begränsade till VPN driften på dessa enheter, men många av dem kan gås runt. Till följd beskrivs några av dessa buggar.\n\nDNS fungerar inte om inte DNS-servern finns VPN intervallet.\n\nPå många Samsung 5.x enheter fungerar inte de tillåtna/otillåtna programmen.\nSamsung 6.x VPN har rapporteras att inte fungera om VPN-appen är undantagen från energisparfunktioner.</string>
+ <string name="samsung_broken_title">Samsung-telefoner</string>
+ <string name="novpn_selected">Ingen VPN-anslutning vald.</string>
+ <string name="defaultvpn">Förvald VPN</string>
+ <string name="defaultvpnsummary">VPN används på platser där en förvald VPN behövs. Dessa är för närvarande vid uppstart, för Always-On och Quick Settings Tile.</string>
+ <string name="vpnselected">För närvarande vald VPN: \'%s\'</string>
+ <string name="reconnect">Återansluta</string>
+ <string name="qs_title">Omkoppla VPN</string>
+ <string name="qs_connect">Anslut till %s</string>
+ <string name="qs_disconnect">Koppla från %s</string>
+ <string name="connectretrymaxmessage">Ange den maximala tiden mellan anslutningsförsök. OpenVPN kommer sakta höja dess väntetid efter ett misslyckat anslutningsförsök upp till detta värde. Standardvärdet är 300s.</string>
+ <string name="connectretrymaxtitle">Maximal tid mellan anslutningsförsök</string>
+ <string name="state_waitconnectretry">Vänta %ss sekunder mellan anslutningsförsök</string>
+ <string name="nought_alwayson_warning"><![CDATA[Om du inte fick en VPN-bekräftelsesdialog har du \"Alltid på VPN\" aktiverat för en annan app. I så fall får bara den appen ansluta till en VPN. Kontrollera under Inställningar-> Nätverk mer .. -> VPNS]]></string>
+ <string name="management_socket_closed">Anslutning till OpenVPN stängd (%s)</string>
+ <string name="change_sorting">Ändra sortering</string>
+ <string name="sort">Sortera</string>
+ <string name="sorted_lru">Profiler sorterade efter senast använt</string>
+ <string name="sorted_az">Profiler sorterade efter namn</string>
+ <string name="deprecated_tls_remote">Config använder alternativ tls-fjärrkontroll som avlägsnades i 2.3 och slutligen avlägsnades i 2.4</string>
+ <string name="auth_failed_behaviour">Beteende vid AUTH_FAILED</string>
+ <string name="graph">Graf</string>
+ <string name="use_logarithmic_scale">Använd logaritmisk skala</string>
+ <string name="notenoughdata">Inte tillräckligt med data</string>
+ <string name="avghour">Genomsnitt per timme</string>
+ <string name="avgmin">Genomsnitt per minut</string>
+ <string name="last5minutes">Senaste 5 minuter</string>
+ <string name="data_in">In</string>
+ <string name="data_out">Ut</string>
+ <string name="bits_per_second">%.0f bit/s</string>
+ <string name="kbits_per_second">%.1f kbit/s</string>
+ <string name="mbits_per_second">%.1f Mbit/s</string>
+ <string name="gbits_per_second">%.1f Gbit/s</string>
+ <string name="volume_byte">%.0f B</string>
+ <string name="volume_kbyte">%.1f kB</string>
+ <string name="volume_mbyte">%.1f MB</string>
+ <string name="volume_gbyte">%.1f GB</string>
</resources>
diff --git a/app/src/main/res/values-tr/plurals-icsopenvpn.xml b/app/src/main/res/values-tr/plurals-icsopenvpn.xml
new file mode 100755
index 00000000..c7d13659
--- /dev/null
+++ b/app/src/main/res/values-tr/plurals-icsopenvpn.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Generated by crowdin.com-->
+<resources>
+ <plurals name="months_left">
+ <item quantity="one">Bir ay kaldı</item>
+ <item quantity="other">%d ay kaldı</item>
+ </plurals>
+ <plurals name="days_left">
+ <item quantity="one">Bir gün kaldı</item>
+ <item quantity="other">%d gün kaldı</item>
+ </plurals>
+ <plurals name="hours_left">
+ <item quantity="one">Bir saat kaldı</item>
+ <item quantity="other">%d saat kaldı</item>
+ </plurals>
+ <plurals name="minutes_left">
+ <item quantity="one">Bir dakika kaldı</item>
+ <item quantity="other">%d dakika kaldı</item>
+ </plurals>
+</resources>
diff --git a/app/src/main/res/values-tr/strings-icsopenvpn.xml b/app/src/main/res/values-tr/strings-icsopenvpn.xml
index 9c88acf0..a8429009 100755
--- a/app/src/main/res/values-tr/strings-icsopenvpn.xml
+++ b/app/src/main/res/values-tr/strings-icsopenvpn.xml
@@ -44,13 +44,14 @@
<string name="duplicate_profile_name">Benzersiz bir profil adı girin</string>
<string name="profilename">Profil Adı</string>
<string name="no_keystore_cert_selected">Bir kullanıcı sertifikası seçmelisiniz</string>
+ <string name="no_ca_cert_selected">Bir CA sertifikası seçmelisiniz</string>
<string name="no_error_found">Hiçbir hata bulunamadı</string>
<string name="config_error_found">Yapılandırmada Hata</string>
<string name="ipv4_format_error">IPv4 adresi ayrıştırma hatası</string>
<string name="custom_route_format_error">Özel yolları ayrıştırma hatası</string>
<string name="pw_query_hint">(talep üzerine sorgulamak için boş bırakın)</string>
<string name="vpn_shortcut">OpenVPN Kısayolu</string>
- <string name="vpn_launch_title">VPN\'e Bağlan</string>
+ <string name="vpn_launch_title">VPN\'e bağlanıyor&#8230;</string>
<string name="shortcut_profile_notfound">Kısayolu belirtilen profil bulunamadı</string>
<string name="random_host_prefix">Rastgele Ana Makine Ön Eki</string>
<string name="random_host_summary">Makine ismine 6 rastgele karakter ekler</string>
@@ -61,7 +62,7 @@
<string name="cancel_connection_long">VPN Bağlantısını Kes</string>
<string name="clear_log">kayıtları temizle</string>
<string name="title_cancel">İptal Onayı</string>
- <string name="cancel_connection_query">Bağlı VPN bağlantısını kesilsin veya bağlantı girişimini iptal edilsin mi?</string>
+ <string name="cancel_connection_query">Bağlı VPN bağlantısı kesilsin ya da bağlantı girişimi iptal edilsin mi?</string>
<string name="remove_vpn">VPN\'i Kaldır</string>
<string name="check_remote_tlscert">Sunucunun TLS Sunucu uzantıları ile bir sertifika kullanıp kullanmadığını denetler (--remote-cert-tls server)</string>
<string name="check_remote_tlscert_title">TLS sunucu sertifikası bekle</string>
@@ -164,7 +165,7 @@
<string name="private_key_password">Özel Anahtar Parolası</string>
<string name="password">Parola</string>
<string name="file_icon">dosya simgesi</string>
- <string name="tls_authentication">TLS Kimlik Doğrulama</string>
+ <string name="tls_authentication">TLS Kimlik Doğrulama/Şifreleme</string>
<string name="generated_config">Oluşturulan Yapılandırma</string>
<string name="generalsettings">Ayarlar</string>
<string name="owner_fix_summary">/dev/tun sahipliğini sisteme vermeye çalışır. Bazı CM9 kalıpları VPNService API\'sinin çalışabilmesi için buna ihtiyaç duyar. Root gerektirir.</string>
@@ -203,9 +204,8 @@
<string name="using_proxy">%1$s %2$d vekil sunucusu kullanarak</string>
<string name="use_system_proxy">Sistem vekil sunucusunu kullan</string>
<string name="use_system_proxy_summary">Bağlanmak için sistem çapındaki HTTP/HTTPS vekil sunucularını kullan.</string>
- <string name="donatewithpaypal">&lt;a href=\"https://www.paypal.com/cgi-bin/webscr?hosted_button_id=R2M6ZP9AF25LS&amp;amp;cmd=_s-xclick\"&gt;PayPal ile bağış&lt;/a&gt; yapabilirsiniz; </string>
- <string name="onbootrestartsummary">OpenVPN, sistem yeniden başlatma/kapatma sırasında etkinse, tekrar bir VPN\'ye bağlanacak. Lütfen bu seçeneği kullanmadan önce Bağlantı uyarı SSS\'sini okuyun.</string>
- <string name="onbootrestart">Yeniden başlatmada tekrar bağlan</string>
+ <string name="onbootrestartsummary">Sistem önyüklemesi üzerinde etkinse, OpenVPN belirtilen VPN bağlantısına bağlanır. Lütfen bu seçeneği Android &lt; 5.0 üzerinde kullanmadan önce bağlantı uyarısı için SSS bölümünü okuyun.</string>
+ <string name="onbootrestart">Önyükleme sırasında bağlan</string>
<string name="ignore">Yoksay</string>
<string name="restart">Yeniden Başlat</string>
<string name="restart_vpn_after_change">Yapılandırma değişiklikleri, VPN yeniden başlattıktan sonra geçerli olur. VPN (yeniden) başlatılsın mı?</string>
@@ -239,7 +239,7 @@
<string name="session_ipv6string">%1$s - %3$s, %2$s</string>
<string name="state_connecting">Bağlanıyor</string>
<string name="state_wait">Sunucudan yanıt bekleniyor</string>
- <string name="state_auth">Kimlik Doğrulanıyor</string>
+ <string name="state_auth">Kimlik doğrulanıyor</string>
<string name="state_get_config">İstemci yapılandırması alınıyor</string>
<string name="state_assign_ip">IP adresleri atanıyor</string>
<string name="state_add_routes">Yollar ekleniyor</string>
@@ -252,7 +252,7 @@
<string name="state_tcp_connect">Bağlanıyor (TCP)</string>
<string name="state_auth_failed">Kimlik doğrulaması başarısız</string>
<string name="state_nonetwork">Kullanılabilir ağ için bekleniyor</string>
- <string name="statusline_bytecount">↓%2$s/s %1$s - ↑%4$s/s %3$s</string>
+ <string name="statusline_bytecount">↓%2$s %1$s - ↑%4$s %3$s</string>
<string name="notifcation_title_notconnect">Bağlı değil</string>
<string name="start_vpn_title">VPN %s bağlanıyor</string>
<string name="start_vpn_ticker">VPN %s bağlanıyor</string>
@@ -323,6 +323,7 @@
<string name="import_log">Alma günlüğü:</string>
<string name="ip_looks_like_subnet">Vpn topolojisi \"%3$s\" belirtildi ancak ifconfig %1$s %2$s daha çok bir ağ maskesi içeren bir IP adresi gibi görünüyor. \"subnet\" topolojisi olarak varsayılacak.</string>
<string name="mssfix_invalid_value">MSS geçersiz kılma değeri 0 ile 9000 arasında bir tamsayı olmak zorundadır</string>
+ <string name="mtu_invalid_value">MTU geçersiz kılma değeri 64 ile 9000 arasında bir tamsayı olmak zorundadır</string>
<string name="mssfix_value_dialog">Tünel üzerinden çalışan TCP oturumlarına, gönderi paket boyutlarını OpenVPN kapladıktan sonra sınırlamalarını, OpenVPN\'nin eşine gönderdiği dönen UDP paket boyutunun bu bayt sayısını aşmayacağını bildir (öntanımlı 1450).</string>
<string name="mssfix_checkbox">TCP yükünün MSS değerini geçersiz kıl</string>
<string name="mssfix_dialogtitle">TCP yükünün MSS değerini ayarla</string>
@@ -392,13 +393,53 @@
<string name="protocol">Protokol</string>
<string name="enabled_connection_entry">Etkin</string>
<string name="abi_mismatch">Tercih edilen bu cihazın yerli ABI önceliği (%1$s) ile yerli kütüphanelerden bildirilen ABI (%2$s) uyuşmuyor</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>
<string name="permission_revoked">VPN izni işletim sistemi tarafından (örn. başlatılan diğer VPN programı) reddedildi, VPN durduruluyor</string>
<string name="pushpeerinfo">Eş bilgisini it</string>
<string name="pushpeerinfosummary">Sunucuya ek bilgi gönder, örn. SSL sürümü ve Android sürümü</string>
<string name="pw_request_dialog_title">%1$s gerekli</string>
<string name="pw_request_dialog_prompt">Lütfen %1$s profili için parola girin</string>
<string name="menu_use_inline_data">Satır içi veri kullan</string>
+ <string name="export_config_chooser_title">Yapılandırma dosyasını dışa aktar</string>
+ <string name="missing_tlsauth">tls-auth dosyası kayıp</string>
+ <string name="missing_certificates">Kullanıcı sertifikası ve ya kullanıcı sertifika anahtar dosyası kayıp</string>
+ <string name="missing_ca_certificate">CA sertifikası kayıp</string>
+ <string name="crl_title">Sertifika İptal Listesi (isteğe bağlı)</string>
+ <string name="reread_log">Günlük önbellek dosyasından (%d) günlük ögesini tekrar oku</string>
+ <string name="samsung_broken">Samsung telefonlar en çok satan Android telefonlar arasında yer alıyor olsa da, Samsung\'un yazılım yazılımı en hatalı Android yazılımları arasında yer alıyor. Hatalar, bu aygıtlardaki VPN işlemi ile sınırlı değildir, ancak bunların birçoğuna geçici çözüm bulunabilir. Bu hataların bazıları aşağıda açıklanıyor.\n\n DNS, DNS sunucusu VPN aralığında olmadığı takdirde çalışmaz.\n\nÇoğu Samsung 5.x cihazında izin verilen/izin verilmeyen uygulamalar özelliği çalışmıyor.\nSamsung 6.x üzerinde, VPN uygulamasının Güç tasarrufu özelliklerinden muaf tutulmadıkça çalışmadığı bildirildi.</string>
+ <string name="samsung_broken_title">Samsung telefonlar</string>
+ <string name="novpn_selected">Seçili VPN yok.</string>
+ <string name="defaultvpn">Öntanımlı VPN</string>
+ <string name="defaultvpnsummary">Varsayılan olarak bir VPN gereken yerlerde VPN kullanılır. Bunlar şu anda: önyükleme sırasında, Her Zaman Açık ve Hızlı Ayarlar Döşemesi içindir.</string>
+ <string name="vpnselected">Şu anda seçili VPN: \'%s\'</string>
+ <string name="reconnect">Yeniden bağlan</string>
+ <string name="qs_title">VPN\'i Aç/Kapat</string>
+ <string name="qs_connect">Şuna bağlan: %s</string>
+ <string name="qs_disconnect">%s bağlantısını kes</string>
+ <string name="connectretrymaxmessage">Bağlantı denemeleri arasındaki en uzun süreyi girin. OpenVPN bir başarısız bağlantı girişiminden sonra bu değer kadar onun bekleme süresini yavaş yavaş arttıracak. Varsayılan 300 sn.</string>
+ <string name="connectretrymaxtitle">Bağlantı denemeleri arasındaki azami süre</string>
+ <string name="state_waitconnectretry">Bağlantı denemesi arasında %s saniye bekleniyor</string>
+ <string name="nought_alwayson_warning"><![CDATA[VPN onay ekranını almıyorsanız başka bir uygulama için \"Her zaman açık VPN\" ayarını etkinleştirmişsinizdir. Bu durumda sadece o uygulama VPN\'e bağlanabilir. Ayarlar->Diğer Ağlar...->VPN bölümünden bu ayarı kontrol edin]]></string>
+ <string name="management_socket_closed">OpenVPN bağlantısı kapalı (%s)</string>
+ <string name="change_sorting">Sıralamayı değiştir</string>
+ <string name="sort">Sırala</string>
+ <string name="sorted_lru">Son kullanılan profillere göre sıralanmış</string>
+ <string name="sorted_az">Profil adına göre sıralanmış</string>
+ <string name="deprecated_tls_remote">Yapılandırma seçeneği tls-remote 2.3\'de kullanımdan kaldırıldı ve 2.4\'de sürümden tamamen çıkarıldı</string>
+ <string name="auth_failed_behaviour">AUTH_FAILED davranışı</string>
+ <string name="graph">Grafik</string>
+ <string name="use_logarithmic_scale">Logaritmik ölçek kullan</string>
+ <string name="notenoughdata">Yeterli veri yok</string>
+ <string name="avghour">Saat başına ortalama</string>
+ <string name="avgmin">Dakika başına ortalama</string>
+ <string name="last5minutes">Son 5 dakika</string>
+ <string name="data_in">Giriş</string>
+ <string name="data_out">Çıkış</string>
+ <string name="bits_per_second">%.0f bit/s</string>
+ <string name="kbits_per_second">%.1f kbit/s</string>
+ <string name="mbits_per_second">%.1f Mbit/s</string>
+ <string name="gbits_per_second">%.1f Gbit/s</string>
+ <string name="volume_byte">%.0f B</string>
+ <string name="volume_kbyte">%.1f kB</string>
+ <string name="volume_mbyte">%.1f MB</string>
+ <string name="volume_gbyte">%.1f GB</string>
</resources>
diff --git a/app/src/main/res/values-uk/plurals-icsopenvpn.xml b/app/src/main/res/values-uk/plurals-icsopenvpn.xml
new file mode 100755
index 00000000..70489fbc
--- /dev/null
+++ b/app/src/main/res/values-uk/plurals-icsopenvpn.xml
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Generated by crowdin.com-->
+<resources></resources>
diff --git a/app/src/main/res/values-uk/strings-icsopenvpn.xml b/app/src/main/res/values-uk/strings-icsopenvpn.xml
index d97ced06..206457d9 100755
--- a/app/src/main/res/values-uk/strings-icsopenvpn.xml
+++ b/app/src/main/res/values-uk/strings-icsopenvpn.xml
@@ -44,13 +44,14 @@
<string name="duplicate_profile_name">Введіть унікальне ім\'я профілю</string>
<string name="profilename">Ім\'я профілю</string>
<string name="no_keystore_cert_selected">Потрібно вибрати сертифікат користувача</string>
+ <string name="no_ca_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="pw_query_hint">(залиште порожнім для запиту на вимогу)</string>
<string name="vpn_shortcut">Ярлик OpenVPN</string>
- <string name="vpn_launch_title">Підключення до VPN</string>
+ <string name="vpn_launch_title">Підключення до VPN ...</string>
<string name="shortcut_profile_notfound">Профіль, вказаний у ярлику, не знайдено</string>
<string name="random_host_prefix">Випадковий префікс вузла</string>
<string name="random_host_summary">Додає 6 випадкових символів перед іменем вузла</string>
@@ -164,7 +165,7 @@
<string name="private_key_password">Пароль закритого ключа</string>
<string name="password">Пароль</string>
<string name="file_icon">Піктограма файлу</string>
- <string name="tls_authentication">Аутентифікація TLS</string>
+ <string name="tls_authentication">TLS-аутентифікація / Шифрування</string>
<string name="generated_config">Згенерована конфігурація</string>
<string name="generalsettings">Параметри</string>
<string name="owner_fix_summary">Спробуйте змінити власника для /dev/tun. Деякі прошивки CM9 вимагають цього для коректної роботи API OpenVPN. Потрібний root.</string>
@@ -180,6 +181,7 @@
<string name="keychain_nocacert">Не вдалося отримати СА сертифікат при читанні із сховища ключів Андроїд. Автентифікація не вдалася.</string>
<string name="show_log_summary">Показати вікно журналу при з\'єднанні. Вікно журналу може бути завжди дрступним у панелі сповіщень.</string>
<string name="show_log_window">Показати вікно журналу</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">Помилка підпису з використанням ключа із сховища Андроїд %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>
@@ -202,9 +204,8 @@
<string name="using_proxy">Використовується проксі %1$s %2$d</string>
<string name="use_system_proxy">Використовувати системний проксі</string>
<string name="use_system_proxy_summary">Використовувати системну конфігурацію HTTP/HTTPS проксі для з\'єднання.</string>
- <string name="donatewithpaypal">Ви можете &lt;a href=\"https://www.paypal.com/cgi-bin/webscr?hosted_button_id=R2M6ZP9AF25LS&amp;amp;cmd=_s-xclick\"&gt;пожертвувати через PayPal&lt;/a&gt; </string>
- <string name="onbootrestartsummary">OpenVPN буде перепідключатися, якщо він був активний в момент вимикання/перезавантаження. Будь ласка, прочитайте ЧаП перед тим, як використовувати цей параметр.</string>
- <string name="onbootrestart">Перепідключати при перезавантаженні</string>
+ <string name="onbootrestartsummary">OpenVPN підключатиметься до вказаного VPN, якщо він був активний при завантаженні системи. Будь ласка, прочитайте FAQ про попередження при підключенні перед використанням цієї опції на Android &lt; 5.0.</string>
+ <string name="onbootrestart">Підключення при завантаженні</string>
<string name="ignore">Ігнорувати</string>
<string name="restart">Перезапустити</string>
<string name="restart_vpn_after_change">Після перезапуску VPN застосувати зміни конфігурації. (Пере)запустити VPN тепер?</string>
@@ -251,7 +252,6 @@
<string name="state_tcp_connect">Підключення (TCP)</string>
<string name="state_auth_failed">Помилка автентифікації</string>
<string name="state_nonetwork">Очікування на використання мережі</string>
- <string name="statusline_bytecount">↓%2$s/s %1$s - ↑%4$s/s %3$s</string>
<string name="notifcation_title_notconnect">Не підключено</string>
<string name="start_vpn_title">Підключення до VPN %s</string>
<string name="start_vpn_ticker">Підключення до VPN %s</string>
@@ -377,10 +377,41 @@
<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="message_no_user_edit">Цей профіль був доданий з зовнішнього додатку (%s) і був відзначений як таким, що не керується користувачем.</string>
+ <string name="crl_file">Список відкликаних сертифікатів</string>
+ <string name="service_restarted">Перезапуск OpenVPN Service (Додаток зупинився або закрився через нестачу пам\'яті)</string>
+ <string name="import_config_error">Імпортування конфігурації привелу до помилки, неможливо зберегти зміни</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="no_allowed_app">Не додано в список дозволених додатків. Додайте себе (%s), щоб мати принаймні один додаток в списку дозволених, щоб не дозволяти всі програми</string>
+ <string name="query_permissions_sdcard">OpenVPN для Android може спробувати знайти відсутні файли на Sd карті автоматично. Натисніть на це повідомлення, щоб отримати права на дозвіл.</string>
<string name="protocol">Протокол</string>
<string name="enabled_connection_entry">Ввімкнено</string>
+ <string name="permission_revoked">Дозвіл VPN відкликано ОС (наприклад, інша програма VPN запущена), зупинка VPN</string>
+ <string name="pushpeerinfo">Отримати інформацію про піра</string>
+ <string name="pushpeerinfosummary">Надіслати додаткову інформацію на сервер, наприклад версію SSL та Android</string>
+ <string name="pw_request_dialog_title">Потрібно %1$s</string>
+ <string name="pw_request_dialog_prompt">Будь ласка, введіть пароль для профілю %1$s</string>
+ <string name="menu_use_inline_data">Використовувати вбудовані дані</string>
+ <string name="export_config_chooser_title">Експортувати файл конфігурації</string>
+ <string name="missing_tlsauth">відсутній файл tls-auth</string>
+ <string name="missing_certificates">Відсутній сертифікат користувача або файл ключа сертифікату користувача</string>
+ <string name="missing_ca_certificate">Відсутній сертифікат центру сертифікації</string>
+ <string name="crl_title">Список відкликаних сертифікатів (опціонально)</string>
+ <string name="reread_log">Перечитати (%d) елементів з кеш-файлу журналу історії</string>
+ <string name="samsung_broken">Навіть не зважаючи на те, що телефони Samsung є одними з найбільш популярних телефонів на Android, прошивка від Samsung також є однією з найбільш дирявими прошивками на Android. Ці помилки не обмежуються лише VPN операціями на цих пристроях, але багато з них можна уникнути. Дальше деякі з цих помилок описані. \n\nDNS не працює, якщо сервер DNS в межах віртуальної приватної мережі. \n\nНа багатьох пристроях Samsung 5.x функція дозволених/заборонених програм не працює. \n\nНа Samsung 6.x VPN не працює, якщо додаток VPN не звільняється від PowerSave функцій.</string>
+ <string name="samsung_broken_title">телефони Samsung</string>
+ <string name="novpn_selected">VPN не вибрано.</string>
+ <string name="reconnect">Перепідключитись</string>
+ <string name="qs_connect">Підключення до %s</string>
+ <string name="qs_disconnect">Відключення %s</string>
+ <string name="connectretrymaxtitle">Максимальний час між спробами підключення</string>
+ <string name="state_waitconnectretry">Очікування %ss секунд між спробами підключення</string>
+ <string name="management_socket_closed">Підключення до OpenVPN закрито (%s)</string>
+ <string name="change_sorting">Змінити сортування</string>
+ <string name="sort">Cортувати</string>
+ <string name="sorted_lru">Профілі відсортовано за часом використовувався</string>
+ <string name="sorted_az">Профілі відсортовані за назвою</string>
</resources>
diff --git a/app/src/main/res/values-v21/refs.xml b/app/src/main/res/values-v21/refs.xml
index f3f43692..1af5ba02 100644
--- a/app/src/main/res/values-v21/refs.xml
+++ b/app/src/main/res/values-v21/refs.xml
@@ -5,13 +5,23 @@
-->
<resources>
- <drawable name="ic_menu_close_clear_cancel">@drawable/ic_close_white_24dp</drawable>
- <drawable name="ic_menu_play">@drawable/ic_play_arrow_white_24dp</drawable>
- <drawable name="ic_menu_pause">@drawable/ic_pause_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>
+ <drawable name="ic_menu_close_clear_cancel">@drawable/ic_close_white_24dp</drawable>
+ <drawable name="ic_menu_play">@drawable/ic_play_arrow_white_24dp</drawable>
+ <drawable name="ic_menu_pause">@drawable/ic_pause_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_copy">@drawable/ic_content_copy_white_24dp</drawable> -->
+ <drawable name="ic_menu_delete_grey">@drawable/ic_delete_grey600_24dp</drawable>
+ <drawable name="ic_menu_edit">@drawable/ic_edit_white_24dp</drawable>
+<!-- <drawable name="ic_menu_import">@drawable/ic_archive_white_24dp</drawable> -->
+ <drawable name="vpn_item_edit">@drawable/ic_edit_grey600_24dp</drawable>
+ <!--<drawable name="ic_menu_add">@drawable/ic_add_circle_outline_white_24dp</drawable>-->
+ <!-- <drawable name="ic_dialog_alert">@drawable/ic_warning_black_36dp</drawable>
+ <drawable name="ic_menu_add_grey">@drawable/ic_add_circle_outline_grey600_24dp</drawable>
+ <drawable name="ic_menu_import_grey">@drawable/ic_archive_grey600_24dp</drawable>
+ <drawable name="ic_receipt">@drawable/ic_receipt_white_24dp</drawable>
+ <drawable name="ic_sort">@drawable/ic_sort_white_24dp</drawable> -->
+</resources> \ No newline at end of file
diff --git a/app/src/main/res/values-vi/plurals-icsopenvpn.xml b/app/src/main/res/values-vi/plurals-icsopenvpn.xml
new file mode 100755
index 00000000..d355f594
--- /dev/null
+++ b/app/src/main/res/values-vi/plurals-icsopenvpn.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Generated by crowdin.com-->
+<resources>
+ <plurals name="months_left">
+ <item quantity="other">Còn lại %d tháng</item>
+ </plurals>
+ <plurals name="days_left">
+ <item quantity="other">Còn lại %d ngày</item>
+ </plurals>
+ <plurals name="hours_left">
+ <item quantity="other">Còn lại %d giờ</item>
+ </plurals>
+ <plurals name="minutes_left">
+ <item quantity="other">Còn lại %d phút</item>
+ </plurals>
+</resources>
diff --git a/app/src/main/res/values-vi/strings-icsopenvpn.xml b/app/src/main/res/values-vi/strings-icsopenvpn.xml
index 625ab34f..9ca9bc4c 100755
--- a/app/src/main/res/values-vi/strings-icsopenvpn.xml
+++ b/app/src/main/res/values-vi/strings-icsopenvpn.xml
@@ -44,13 +44,14 @@
<string name="duplicate_profile_name">Vui lòng nhập một tên hồ sơ duy nhất</string>
<string name="profilename">Tên hồ sơ</string>
<string name="no_keystore_cert_selected">Bạn phải chọn một chứng chỉ người dùng</string>
+ <string name="no_ca_cert_selected">Bạn phải chọn một chứng chỉ CA</string>
<string name="no_error_found">Không tìm thấy lỗi</string>
<string name="config_error_found">Lỗi trong cấu hình</string>
<string name="ipv4_format_error">Lỗi phân tích cú pháp địa chỉ IPv4</string>
<string name="custom_route_format_error">Lỗi phân tích cú pháp định tuyến tùy chỉnh</string>
<string name="pw_query_hint">(để trống để truy vấn theo yêu cầu)</string>
<string name="vpn_shortcut">Lối tắt Open VPN</string>
- <string name="vpn_launch_title">Kết nối đến VPN</string>
+ <string name="vpn_launch_title">Đang kết nối tới VPN&#8230;</string>
<string name="shortcut_profile_notfound">Hồ sơ quy định tại lối tắt không tìm thấy</string>
<string name="random_host_prefix">Tiền tố miền ngẫu nhiên</string>
<string name="random_host_summary">Thêm 6 ký tự ngẫu nhiên ở phía trước tên miền</string>
@@ -164,7 +165,7 @@
<string name="private_key_password">Khóa mật khẩu riêng tư</string>
<string name="password">Mật khẩu</string>
<string name="file_icon">biểu tượng tập tin</string>
- <string name="tls_authentication">Xác thực TLS</string>
+ <string name="tls_authentication">Xác thực/mã hoá TLS</string>
<string name="generated_config">Tạo cấu hình</string>
<string name="generalsettings">Cài đặt</string>
<string name="owner_fix_summary">Cố gắng thiết lập chủ sở hữu của /dev/tun vào hệ thống. Một vài ROM CM9 cần việc này để thực hiện thiết lập VPN API. Yêu cầu root.</string>
@@ -203,9 +204,8 @@
<string name="using_proxy">Đang sử dụng proxy %1$s %2$d</string>
<string name="use_system_proxy">Sử dụng proxy hệ thống</string>
<string name="use_system_proxy_summary">Sử dụng các cấu hình hệ thống rộng cho HTTP/HTTPS proxy để kết nối.</string>
- <string name="donatewithpaypal">Bạn có thể &lt;a href=\"https://www.paypal.com/cgi-bin/webscr?hosted_button_id=R2M6ZP9AF25LS&amp;amp;cmd=_s-xclick\"&gt;ủng hộ cho ứng dụng với PayPal&lt;/a&gt; </string>
- <string name="onbootrestartsummary">OpenVPN sẽ kết nối lại VPN nếu nó đã hoạt động khi hệ thống khởi động lại/tắt máy. Xin vui lòng đọc phần cảnh báo kết nối trong các câu hỏi thường gặp trước khi sử dụng tùy chọn này.</string>
- <string name="onbootrestart">Kết nối lại khi khởi động lại máy</string>
+ <string name="onbootrestartsummary">OpenVPN sẽ kết nối VPN xác định nếu nó đã hoạt động trên hệ thống khởi động. Xin vui lòng đọc hướng dẫn cảnh báo kết nối trước khi sử dụng tùy chọn này trên Android &lt; 5.0.</string>
+ <string name="onbootrestart">Kết nối khi khởi động</string>
<string name="ignore">Bỏ qua</string>
<string name="restart">Khởi động lại</string>
<string name="restart_vpn_after_change">Cấu hình sẽ được áp dụng sau khi khởi động lại VPN. (Khởi động) bắt đầu VPN lại ngay bây giờ?</string>
@@ -252,7 +252,7 @@
<string name="state_tcp_connect">Đang kết nối (TCP)</string>
<string name="state_auth_failed">Chứng thực không thành công</string>
<string name="state_nonetwork">Đang đợi mạng khả dụng</string>
- <string name="statusline_bytecount">↓%2$s/s %1$s - ↑%4$s/s %3$s</string>
+ <string name="statusline_bytecount">↓ %2$s %1$s - ↑ %4$s %3$s</string>
<string name="notifcation_title_notconnect">Không kết nối</string>
<string name="start_vpn_title">Đang kết nối VPN %s</string>
<string name="start_vpn_ticker">Đang kết nối VPN %s</string>
@@ -323,6 +323,7 @@
<string name="import_log">Nhập bản ghi:</string>
<string name="ip_looks_like_subnet">Cấu trúc VPN \"%3$s\" quy định nhưng ifconfig %1$s %2$s trông giống như một địa chỉ IP với một mặt nạ mạng. Giả định cấu trúc liên kết \"mạng con\".</string>
<string name="mssfix_invalid_value">Các giá trị MSS phải là một số nguyên từ 0 đến 9000</string>
+ <string name="mtu_invalid_value">Các giá trị MTU phải là một số nguyên từ 64 đến 9000</string>
<string name="mssfix_value_dialog">Thông báo với các phiên TCP đang chạy thông qua đường truyền mà chúng nên hạn chế gửi kích cỡ gói dữ liệu sau khi Open VPN đã đóng gói nó, kết quả kích thước gói dữ liệu UDP mà OpenVPN gửi tới sẽ không vượt qua số byte này. (Mặc định là 1450)</string>
<string name="mssfix_checkbox">Ghi đè lên giá trị MSS của TCP payload</string>
<string name="mssfix_dialogtitle">Đặt MSS của TCP payload</string>
@@ -392,7 +393,30 @@
<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>
+ <string name="permission_revoked">cho phép VPN bị thu hồi bởi hệ điều hành (ví dụ như chương trình VPN khác bắt đầu), dừng VPN</string>
+ <string name="pushpeerinfo">Đẩy thông tin ngang nhau</string>
+ <string name="pushpeerinfosummary">Gửi thông tin đến máy chủ, ví dụ như phiên bản SSL và phiên bản Android</string>
+ <string name="pw_request_dialog_title">Cần thêm %1$s</string>
+ <string name="pw_request_dialog_prompt">Vui lòng nhập mật khẩu cho %1$s</string>
+ <string name="menu_use_inline_data">Sử dụng dữ liệu nội tuyến</string>
+ <string name="export_config_chooser_title">Xuất tập tin cấu hình</string>
+ <string name="missing_tlsauth">tập tin tls-auth bị mất tích</string>
+ <string name="missing_certificates">Thiếu chứng chỉ người dùng hoặc chứng chỉ tập tin</string>
+ <string name="missing_ca_certificate">Thiếu chứng chỉ CA</string>
+ <string name="crl_title">Danh sách chứng chỉ thu hồi (tùy chọn)</string>
+ <string name="reread_log">Đọc lại (%d) mục đăng nhập từ tập tin bộ nhớ cache đăng nhập</string>
+ <string name="samsung_broken">Even though Samsung phones are among the most selling Android phones, Samsung\'s firmware are also among the most buggy Android firmwares. The bugs are not limited to the VPN operation on these devices but many of them can be workarounded. In the following some of these bugs are described.\n\nDNS does not work unless the DNS server in the VPN range.\n\nOn many Samsung 5.x devices the allowed/disallowed apps feature does not work.\nOn Samsung 6.x VPN is reported not to work unless the VPN app is exempted from Powersave features.</string>
+ <string name="samsung_broken_title">Điện thoại Samsung</string>
+ <string name="novpn_selected">Không VPN được chọn.</string>
+ <string name="defaultvpn">VPN mặc định</string>
+ <string name="defaultvpnsummary">VPN được sử dụng ở những nơi mà một mặc định VPN cần thiết. Chúng hiện đang khởi động, Luôn-Bật và vào Cài Đặt Nhanh.</string>
+ <string name="vpnselected">VPN hiện được chọn: \'%s\'</string>
+ <string name="reconnect">Kết nối lại</string>
+ <string name="qs_title">Bật tắt VPN</string>
+ <string name="qs_connect">Kết nối đến %s</string>
+ <string name="qs_disconnect">Ngắt kết nối đến %s</string>
+ <string name="connectretrymaxmessage">Hãy nhập tối đa thời gian giữa các kết nối lại. OpenVPN sẽ dần dần tăng thời gian chờ đợi của mình sau khi cố kết nối không thành công đến giá trị này. Mặc định là hệ thống 300.</string>
+ <string name="connectretrymaxtitle">Thời gian tối đa giữa kết nối lại</string>
+ <string name="state_waitconnectretry">Vui lòng chờ %ss giây để kết nối</string>
+ <string name="sort">Sắp xếp</string>
</resources>
diff --git a/app/src/main/res/values-zh-rCN/plurals-icsopenvpn.xml b/app/src/main/res/values-zh-rCN/plurals-icsopenvpn.xml
new file mode 100755
index 00000000..70489fbc
--- /dev/null
+++ b/app/src/main/res/values-zh-rCN/plurals-icsopenvpn.xml
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Generated by crowdin.com-->
+<resources></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 2a3aac46..d37b9b57 100755
--- a/app/src/main/res/values-zh-rCN/strings-icsopenvpn.xml
+++ b/app/src/main/res/values-zh-rCN/strings-icsopenvpn.xml
@@ -6,32 +6,31 @@
-->
<resources>
- <string name="address">服务器地址:</string>
- <string name="port">服务器端口:</string>
- <string name="location">地点</string>
+ <string name="address">服务器地址</string>
+ <string name="port">Server Port:</string>
+ <string name="location">位置</string>
<string name="cant_read_folder">无法读取目录</string>
<string name="select">选择</string>
<string name="cancel">取消</string>
<string name="no_data">未收到数据</string>
<string name="useLZO">启用 LZO 压缩算法</string>
- <string name="client_no_certificate">无客户端证书</string>
+ <string name="client_no_certificate">没有证书</string>
<string name="client_certificate_title">客户端证书</string>
<string name="client_key_title">客户端证书密钥</string>
- <string name="client_pkcs12_title">PKCS12 文件</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">本程序使用以下组件,请在 Licenses 查看源码获取更详细内容。</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 身份验证</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="file_nothing_selected">你必须选择一个文件</string>
+ <string name="useTLSAuth">使用 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="ipv4_address">IPv4 地址</string>
<string name="ipv6_address">IPv6 地址</string>
<string name="custom_option_warning">请谨慎输入 OpenVPN 的自定义选项。此外请注意许多与 tun 模块有关的 OpenVPN 设置由于系统 VPN 功能的设计而不能得到支持。如果您觉得缺少一个很重要的选项,请与作者联系。</string>
@@ -40,68 +39,37 @@
<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="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="pw_query_hint">(根据需求留空)</string>
<string name="vpn_shortcut">OpenVPN 主屏幕快捷方式</string>
- <string name="vpn_launch_title">连接至 VPN</string>
- <string name="shortcut_profile_notfound">未找到快捷方式中指定的配置文件</string>
- <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="route_rejected">Android 拒绝了路由</string>
- <string name="cancel_connection">断开</string>
- <string name="cancel_connection_long">断开连接</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="cancel_connection_long">断开VPN</string>
+ <string name="title_cancel">确认取消</string>
<string name="check_remote_tlscert">检查服务器是否使用 TLS 服务器端扩展 (--remote-cert-tlsserver server)</string>
<string name="check_remote_tlscert_title">需要 TLS 服务器证书</string>
<string name="remote_tlscn_check_summary">检查远程服务器证书的 DN 属性</string>
<string name="remote_tlscn_check_title">证书主机名检查</string>
<string name="enter_tlscn_dialog">勾选此项将验证远程证书的 DN 属性(例:C=DE, L=Paderborn, OU=Avian IP Carriers, CN=openvpn.blinkt.de)\n\n输入完整的 DN 或者 RDN 以便进行验证。\n\nRDN前缀 \"Server\" 可以匹配 \"Server-1\" 以及 \"SERVER-2\"\n\n若留空则将仅验证 RDN 而不验证主机名。\n\n有关更多信息请查看 OpenVPN 2.3.1+ 参考手册的 --verify-x509-name 小节</string>
<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">从服务器请求 IP 地址、 路由规则和计时选项。</string>
<string name="pull_off_summary">没有从服务器请求信息。设置需要在下方被指定。</string>
<string name="use_pull">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">备用 DNS 服务器</string>
- <string name="ignored_pushed_routes">忽略推送路由</string>
- <string name="ignore_routes_summary">忽略服务器推送的路由</string>
+ <string name="secondary_dns_message">无法使用主 DNS 服务器时会使用辅助 DNS 服务器。</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 格式地址。</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="custom_route_message">输入自定义路由。目标地址只能用CIDR格式。\"10.0.0.0/8 2002::/16\" 将会通过VPN重定向到10.0.0.0/8 和 2002::/16 网络。</string>
+ <string name="custom_route_message_excluded">不应该通过VPN路由的路线。使用自定义路由相同的语法。</string>
+ <string name="custom_routes_title_excluded">排除的路线</string>
+ <string name="float_title">允许不固定服务器</string>
<string name="remove_vpn_query">移除 VPN 配置文件 \'%s\' 吗?</string>
- <string name="tun_error_helpful">在某些自定义 ICS 版本上,/dev/tun 的权限可能会有错误,或者根本就没有该文件。CM9 用户请尝试通过本程序的设置功能修复权限</string>
- <string name="tun_open_error">未能打开 tun 模块</string>
- <string name="error">错误</string>
- <string name="clear">清除</string>
+ <string name="tun_error_helpful">在某些自定义 ICS 系统版本上,/dev/tun 的权限可能会有错误,或者根本就没有该文件。CM9 系统用户请尝试通过本程序设置中的修复选项进行权限修复。</string>
+ <string name="tun_open_error">打开 tun 接口失败</string>
+ <string name="error">错误:</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>
@@ -110,107 +78,48 @@
<string name="route_not_cidr">无法将 %1$s 和 %2$s 作为 CIDR 形式的路由,将使用 /32 的子网掩码。</string>
<string name="route_not_netip">纠正路由 %1$s/%2$s 为 %3$s/%2$s</string>
<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">Tap 模式在未 root 的机器上不可用。因此本程序无法提供 tap 模块支持</string>
<string name="tap_faq2">还来? 您在开玩笑嘛? tap 连接模式是不支持的,不要再发邮件问这些问题了。</string>
<string name="tap_faq3">这已经是第三次有人问这个问题了。好吧,虽然确实可以在 TAP 设备上写一个 TAP 模拟器,给发送出去的数据包添加第二层网络头,并去掉收到的数据包中的第二层网络头,但是这个 TAP 模拟器可能还需要实现 ARP 甚至 DHCP 客户端功能。我目前不知道有谁在做这方面的工作。如果你想开展这方面的编码工作的话,请联系我。</string>
- <string name="faq">常见问题</string>
- <string name="copying_log_entries">复制日志条目</string>
<string name="faq_copying">若要复制单条日志请在相应条目上轻按即可。若要复制/发送全部日志请使用发送日志功能。如果该功能在界面中没有显示,请使用设备原生的菜单按钮。</string>
- <string name="faq_shortcut">启动快捷方式</string>
<string name="faq_howto_shortcut">你可以在桌面上放置一个启动 OpenVPN 的图标。如果你的桌面程序支持,你可以在桌面上放置 OpenVPN 的启动图标,或者是 OpenVPN 的桌面挂件</string>
<string name="no_vpn_support_image">很遗憾,您目前的系统不支持 VPN 服务接口</string>
- <string name="encryption">加密</string>
- <string name="cipher_dialog_title">输入加密方法</string>
<string name="chipher_dialog_message">输入 OpenVPN 所使用的加密密码算法。留空以使用默认算法。</string>
<string name="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">[[内联文件数据]]</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 是非常注重安全的,所以在此提供一些安全方面的建议。所有保存在存储卡上的数据都是不安全的,任何应用都可以读取存储卡上的文件,即使这个应用没有‘写入存储卡’的权限也是如此。应用自身的数据只能被应用自己读取。在选择 CA 证书、证书文件或者密钥文件的时候请使用导入功能,这样这些数据就会保存在 OpenVPN 自身的数据文件中,保证不会被其他的应用恶意读取。当然导入证书之后记得要把证书从存储卡上删除掉。不过,虽然这些数据不能被其他应用读取,但是这些数据是明文保存的,如果你的系统是 rooted 的,那么这些数据将能够被任何拥有 root 权限的应用轻松地读取。保存在 OpenVPN 中的密码也是以明文保存的,如果设备被 rooted 了,这些密码也有可能被其他应用恶意读取。强烈建议使用 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 以上的系统不可能出现该问题,因为这是标准的系统功能。可能您当前 ROM 中的证书存储已经损坏。</string>
- <string name="ipv4">IPv4</string>
- <string name="ipv6">IPv6</string>
- <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_faq">&lt;p&gt;HTC官方固件可能存在异常的路由问题并会导致数据流不通过隧道传输(详见BUG追踪&lt;a href=\"http://code.google.com/p/ics-openvpn/issues/detail?id=18\"&gt;Issue 18&lt;/a&gt;)。&lt;/p&gt;&lt;p&gt;据报导,旧版的SONY Xperia Arc S和Xperia Ray的官方固件完全不包含VPNService(详见BUG追踪&lt;a href=\"http://code.google.com/p/ics-openvpn/issues/detail?id=29\"&gt;Issue 29&lt;/a&gt;)。&lt;/p&gt;&lt;p&gt;在自制固件中,tun
模块可能会有缺失,或是未被设置正确的权限。部分CM9固件需要启用“特定设备HACKS”项下的“修复/dev/tun的权限”的选项。&lt;/p&gt;&lt;p&gt;最重要的是:若您的设备的固件存在问题,请直接向您的设备供应商反馈。越多人向供应商反映问题,问题越有可能得到解决。&lt;/p&gt;</string>
- <string name="pkcs12_file_encryption_key">PKCS12 文件加密密钥</string>
- <string name="private_key_password">私钥密码</string>
- <string name="password">密码</string>
- <string name="file_icon">文件图标</string>
- <string name="tls_authentication">TLS 认证</string>
- <string name="generated_config">已生成的配置</string>
<string name="generalsettings">设置</string>
<string name="owner_fix_summary">尝试设定 /dev/tun 的属主为 system。一些 CM9 ROM 需要它以使 VPNService API 工作。本操作需要 root 权限。</string>
<string name="owner_fix">修复 /dev/tun 的权限</string>
- <string name="generated_config_summary">显示已生成的 OpenVPN 配置文件</string>
- <string name="edit_profile_title">编辑 %s</string>
- <string name="building_configration">正在生成配置</string>
- <string name="netchange_summary">启用该选项以在网络变化(例如从蜂窝数据到 WiFi)时强制重新连接</string>
- <string name="netchange">当转换网络时重新连接</string>
- <string name="netstatus">网络状态: %s</string>
+ <string name="netchange_summary">启用该选项以在网络变化(例如在蜂窝数据和 WiFi 之间切换)时强制重新连接</string>
<string name="extracahint">Android 密钥库通常会自带 CA 证书。如果您获取的证书发生验证错误,请单独指定一个证书。</string>
- <string name="select_file">选择</string>
<string name="keychain_nocacert">在 Android 密钥库中未找到任何 CA 证书。可能验证失败。</string>
<string name="show_log_summary">连接时显示日志窗口。日志窗口可始终从通知栏访问。</string>
- <string name="show_log_window">显示日志窗口</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">与 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>
<string name="translationby">中文翻译:Christopher Meng
&lt;trans@cicku.me&gt;</string>
- <string name="ipdns">IP 和 DNS 设置</string>
- <string name="basic">基本</string>
- <string name="routing">路由设置</string>
- <string name="obscure">其他 OpenVPN 设置,一般不需要修改。</string>
- <string name="advanced">高级设置</string>
<string name="export_config_title">ICS Openvpn 配置</string>
<string name="warn_no_dns">没有使用 DNS 服务器,无法解析域名,请考虑设置一个 DNS 服务器。请注意,即使你没有设置 DNS 服务器,你为移动网络以及 Wi-Fi 设置的代理服务器配置也是有效的。</string>
<string name="dns_add_error">无法添加 DNS 服务器 \"%1$s\",%2$s 拒绝了您的操作。</string>
<string name="ip_add_error">无法配置 IP 地址 %1$s,被系统拒绝:%2$s</string>
<string name="faq_howto">&lt;p&gt;获取你的 VPN 配置文件,可以是在电脑上正在使用的 OpenVPN 客户端配置文件,也可以向你的 VPN 服务商索取配置文件。&lt;/p&gt;&lt;p&gt;如果配置文件只有一个,可以把配置文件发到你自己的邮箱然后从手机上下载。如果配置文件有很多个,可以将它们复制到存储卡内。&lt;/p&gt;&lt;p&gt;从邮件中下载附件,或者在 VPN 列表中点击文件夹图标来导入配置文件。&lt;/p&gt;&lt;p&gt;如果提示找不到文件,那就将缺失的文件复制到存储卡内。&lt;/p&gt;&lt;p&gt;点击保存,将配置文件保存到你的 VPN 列表中。&lt;/p&gt;&lt;p&gt;在 VPN 列表中点击 VPN 的连接的名字,就可以连接到 VPN 了。&lt;/p&gt;&lt;p&gt;如果发生错误,可以看日志窗口中的日志,然后设法解决问题。&lt;/p&gt; </string>
- <string name="faq_howto_title">快速入门</string>
- <string name="setting_loadtun_summary">尝试在连接之前加载 tun.ko 内核模块。需要 root 权限。</string>
- <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>
<string name="use_system_proxy_summary">使用系统设置连接 HTTP/HTTPS 代理服务器。</string>
- <string name="donatewithpaypal">您可以 &lt;a href=\"https://www.paypal.com/cgi-bin/webscr?hosted_button_id=R2M6ZP9AF25LS&amp;amp;cmd=_s-xclick\"&gt; 通过 PayPal 捐助&lt;/a&gt;</string>
- <string name="onbootrestartsummary">OpenVPN 将会在重启后自动重新连接 VPN。请在启用该选项前先阅读连接警告的常见问题解答。</string>
- <string name="onbootrestart">重启时重新连接</string>
- <string name="ignore">忽略</string>
- <string name="restart">重启</string>
+ <string name="onbootrestartsummary">如果在系统启动时OpenVPN处于活动状态,那么它会连接指定的VPN。在Android 5.0上使用这个选项前,请阅读连接警告的常见问题。</string>
+ <string name="onbootrestart">启动时连接</string>
<string name="restart_vpn_after_change">配置的变更将在重启 VPN 后生效,是否立即重启?</string>
- <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 及其连接不被关闭,OpenVPN 服务会以较高的优先级运行,而为了以较高的优先级运行,OpenVPN 必须在状态栏显示一个图标。正如前面的问题中说过的,系统的“钥匙”图标是系统内建的,仅仅显示这个“钥匙”图标并不能让 OpenVPN 以更高的优先级运行。</string>
@@ -220,8 +129,6 @@
<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+确实使用策略路由。使用route / ifconfig命令不会显示已安装的路径。而使用IP规则,iptables的-t轧-L</string>
- <string name="persisttun_summary">当 OpenVPN 重连时,也一直使用 VPN 连接。</string>
- <string name="persistent_tun_title">保持 tun 通道</string>
<string name="openvpn_log">OpenVPN 日志</string>
<string name="import_config">导入 OpenVPN 配置文件</string>
<string name="battery_consumption_title">电池消耗</string>
@@ -253,7 +160,6 @@
<string name="state_tcp_connect">连接中(TCP)</string>
<string name="state_auth_failed">验证失败</string>
<string name="state_nonetwork">等待可用网络</string>
- <string name="statusline_bytecount">↓%2$s/s %1$s - ↑%4$s/s %3$s</string>
<string name="notifcation_title_notconnect">未连接</string>
<string name="start_vpn_title">正在连接 VPN %s</string>
<string name="start_vpn_ticker">正在连接 VPN %s</string>
@@ -359,16 +265,61 @@
<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_not_route_to_vpn">The configured client IP and the IPs in its network mask are not routed to the VPN. OpenVPN works around this bug by explicitly adding a route that corrosponds to the client IP and its netmask</string>
+ <string name="ab_persist_tun">Opening a tun device while another tun device is active, which is used for persist-tun support, crashes the VPNServices on the device. A reboot is required to make VPN work again. OpenVPN for Android tries to avoid reopening the tun device and if really needed first closes the current TUN before opening the new TUN device to avoid to crash. This may lead to a short window where packets are sent over the non-VPN connection. Even with this workaround the VPNServices sometimes crashes and requires a reboot of the device.</string>
+ <string name="ab_secondary_users">对于次级用户而言,VPN是不会起作用的。</string>
+ <string name="ab_kitkat_reconnect">有多个用户报告说,在使用VPN应用时,移动连接/移动数据连接经常会掉线。该行为似乎只影响一些移动运营商/设备组合,目前为止尚未确定原因及bug解决方案。</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">非Android平板的主用户</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警报 握手失败</string>
+ <string name="tls_cipher_alert">较新的OpenVPN for Android版本 (0.6.29/2015年3月) 为 (tls-cipher \"DEFAULT:!EXP:!PSK:!SRP:!kRSA\") 密码套件使用更安全的默认设置。不幸的是,省略了不太安全的加密套件和导出加密套件,尤其是完全正向保密密码套件 (差分哈夫曼编码) 的缺失会导致一些问题。这通常是由用心良苦但执行力很差的家伙试图通过设置服务器上的TLS套件或在一些嵌入式操作系统 (如软路由系统Mikro Tik) 上定制SSL以加强TLS安全性导致。\n 要解决导致这个问题需要在服务器上把TLS-CIPHER配置为合理的默认值,比如tls-cipher \"DEFAULT:!EXP:!PSK:!SRP:!kRSA\"。如果你搞不定系统管理员,可以在客户端解决,在Android客户端添加自定义选项 tls-cipher DEFAULT即可。</string>
+ <string name="message_no_user_edit">此档案已从外部程序 (%s) 加载并被标记为不可用户编辑。</string>
<string name="crl_file">证书吊销列表</string>
+ <string name="service_restarted">重新启动OpenVPN服务中 (应用程序崩溃-可能是真崩溃或由于内存不够用被kill)</string>
+ <string name="import_config_error">导入配置时出了点错,无法保存</string>
<string name="Search">搜索</string>
+ <string name="lastdumpdate">(最后转储 %1$d:%2$dh old (%3$s))</string>
<string name="clear_log_on_connect">建立新连接时清空日志</string>
<string name="connect_timeout">连接超时</string>
+ <string name="no_allowed_app">没有允许的应用程序被添加。加入本应用 (%s) 以保证允许的应用程序列表中至少有一个应用程序从而禁止其他所有应用</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="permission_revoked">VPN权限被操作系统撤销 (比如其他VPN程序启动了) ,VPN停止中</string>
+ <string name="pushpeerinfo">推送客户端信息</string>
+ <string name="pushpeerinfosummary">将额外的信息发送到服务器,例如 SSL 版本和 Android 版本</string>
+ <string name="pw_request_dialog_title">需要 %1$s</string>
+ <string name="pw_request_dialog_prompt">请为配置文件 %1$s 输入密码</string>
+ <string name="menu_use_inline_data">使用内联数据</string>
+ <string name="export_config_chooser_title">导出配置文件</string>
+ <string name="missing_tlsauth">tls-auth 文件丢失</string>
+ <string name="missing_certificates">缺少用户证书或用户证书密钥文件</string>
+ <string name="missing_ca_certificate">缺少CA证书</string>
+ <string name="crl_title">证书吊销列表 (可选)</string>
+ <string name="reread_log">从日志缓存文件重读 (%d) 日志项目</string>
+ <string name="samsung_broken">三星手机几乎是最热销的安卓机,同时三星的固件也是bug最多的 Android 固件。Bug 并不局限于运行在这些设备上的VPN,但其中许多可以是可以想办法绕开的。下面列出几个已知Bug:\n\nDNS 不工作,除非其在VPN 地址池内.\n\n很多三星5.X设备上 允许/禁止 应用程序的特性并不能工作。 \n在三星 6.x 机器上只有VPN应用被加入省电模式白名单之后VPN才能工作。</string>
+ <string name="samsung_broken_title">三星手机</string>
+ <string name="novpn_selected">没有选定的 VPN。</string>
+ <string name="reconnect">重新连接</string>
+ <string name="qs_title">VPN切换</string>
+ <string name="qs_connect">连接到%s</string>
+ <string name="qs_disconnect">断开%s</string>
+ <string name="connectretrymaxmessage">输入连接重试时间间隔的最大值。OpenVPN在每次不成功的连接尝试后都会慢慢提高等待时间,直到提高到这个值后停止。默认值300秒。</string>
+ <string name="connectretrymaxtitle">连接重试最长间隔</string>
+ <string name="state_waitconnectretry">连接重试期间已等待 %s 秒</string>
</resources>
diff --git a/app/src/main/res/values-zh-rTW/plurals-icsopenvpn.xml b/app/src/main/res/values-zh-rTW/plurals-icsopenvpn.xml
new file mode 100755
index 00000000..70489fbc
--- /dev/null
+++ b/app/src/main/res/values-zh-rTW/plurals-icsopenvpn.xml
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Generated by crowdin.com-->
+<resources></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 c9dfeee5..8ca37880 100755
--- a/app/src/main/res/values-zh-rTW/strings-icsopenvpn.xml
+++ b/app/src/main/res/values-zh-rTW/strings-icsopenvpn.xml
@@ -6,73 +6,74 @@
-->
<resources>
- <string name="address">伺服器地址:</string>
+ <string name="address">伺服器地址:</string>
<string name="port">伺服器端口:</string>
<string name="location">位置</string>
- <string name="cant_read_folder">目法讀取檔案目錄</string>
+ <string name="cant_read_folder">無法讀取檔案目錄</string>
<string name="select">選擇</string>
<string name="cancel">取消</string>
<string name="no_data">沒有資料</string>
- <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="useLZO">LZO 壓縮</string>
+ <string name="client_no_certificate">沒有憑證</string>
+ <string name="client_certificate_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">源代碼和問題跟踪器可在https://github.com/schwabe/ics-openvpn/</string>
- <string name="copyright_others">該方案採用了以下組件; 看到源代碼的許可證的全部細節</string>
- <string name="about">左右</string>
- <string name="vpn_list_title">簡介</string>
+ <string name="ca_title">CA 憑證</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">選擇...</string>
- <string name="file_nothing_selected">你必須選擇一個文件</string>
- <string name="useTLSAuth">使用TLS認證</string>
- <string name="tls_direction">TLS方向</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選項。請謹慎使用。另外請注意,許多囤地的相關OpenVPN的設置不能被VPNSettings的設計支持。如果您認為一個重要的選擇缺少聯繫作者</string>
- <string name="auth_username">用戶名</string>
+ <string name="pkcs12pwquery">PKCS12 密碼</string>
+ <string name="file_select">選擇&#8230;</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="ipv4_address">IPv4 位址</string>
+ <string name="ipv6_address">IPv6 地址</string>
+ <string name="custom_option_warning">輸入自訂的 OpenVPN 選項。請謹慎使用。另外請注意,VPNSettings 的設計並不支援許多 tun 通道相關 OpenVPN 設定 。如果您認為有缺少重要的設定選項,請聯絡作者。</string>
+ <string name="auth_username">用戶名稱</string>
<string name="auth_pwquery">密碼</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="pw_query_hint">(留空按需查詢)</string>
- <string name="vpn_shortcut">OpenVPN捷徑</string>
- <string name="vpn_launch_title">連線到VPN</string>
- <string name="shortcut_profile_notfound">在快捷方式找不到指定的設定檔</string>
- <string name="random_host_prefix">隨機主機名稱字首</string>
- <string name="random_host_summary">在主機名稱前加入6個隨機字符</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_ca_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="pw_query_hint">(如需查詢,請留空)</string>
+ <string name="vpn_shortcut">OpenVPN 捷徑</string>
+ <string name="vpn_launch_title">正在連線到 VPN...</string>
+ <string name="shortcut_profile_notfound">在捷徑中找不到指定的設定檔</string>
+ <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="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="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="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="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="enter_tlscn_title">遠端憑證主旨</string>
+ <string name="tls_key_auth">啟用 TLS 密鑰認證</string>
+ <string name="tls_auth_file">TLS 驗證檔</string>
+ <string name="pull_on_summary">向伺服器請求 IP 地址,、路由和時間資訊</string>
+ <string name="pull_off_summary">沒有來自伺服器的資訊,需要在下面指定設定。</string>
<string name="use_pull">拉設置</string>
<string name="dns">DNS</string>
<string name="override_dns">覆蓋的DNS設置服務器</string>
@@ -82,45 +83,45 @@
<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="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="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="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="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">在一些自訂的 Android 4.0 (ICS) 中,/dev/tun 的權限也許是錯誤的或是完全沒有 tun 模組。對 CM9 來說,試著在全域設定中,修改擁有者的權限選項。</string>
+ <string name="tun_open_error">無法開啟 Tun 通道介面</string>
+ <string name="error">"錯誤: "</string>
<string name="clear">清除</string>
- <string name="last_openvpn_tun_config">打開TUN接口:</string>
- <string name="local_ip_info">本地IPv4:%1$s / %2$d的IPv6:%3$s MTU:%4$d</string>
- <string name="dns_server_info">DNS服務器:%1$s,域名:%2$s</string>
- <string name="routes_info_incl">路線:%1$s %2$s</string>
- <string name="routes_info_excl">路線排除:%1$s %2$s</string>
- <string name="routes_debug">安裝VpnService路線:%1$s %2$s</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="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">點擊模式</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">點擊模式是不可能的非根VPN API。因此,該應用程序不能提供自來水的支持</string>
- <string name="tap_faq2">了嗎?你在開玩笑吧?不,攻牙模式真的不支持和發送更多的郵件,詢問是否將支持也無濟於事。</string>
+ <string name="tap_faq2">再一次?你在開玩笑吧?這真的不支援 tap 模式,就算再寄電子郵件詢問能不能支援也是沒用的。</string>
<string name="faq">FAQ</string>
- <string name="copying_log_entries">複製記錄檔條目</string>
- <string name="faq_copying">要複製單個日誌條目按住上的日誌條目。若要複製/發送全部日誌請使用發送日誌選項。使用硬件菜單按鈕時,如果按鈕沒有在GUI可見。</string>
+ <string name="copying_log_entries">複製記錄項目</string>
+ <string name="faq_copying">若要複製單筆記錄,在此記錄項目上點選。若要複製/送出整筆記錄,使用送出記錄選項。如果這個按鈕在畫面中無法顯示,請使用實體的選單按鈕。</string>
<string name="faq_shortcut">以快捷方式啟動</string>
<string name="faq_howto_shortcut">您可以將快捷方式啟動 OpenVPN 在您的桌面上。根據您的主畫面程式必須添加一個快捷方式或小部件。</string>
<string name="no_vpn_support_image">你的Android ROM不支援VPN服務API,抱歉了。 :(</string>
@@ -134,8 +135,8 @@
<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="opentun_no_ipaddr">拒絕開啟 tun 沒有 IP 資訊的裝置</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>
@@ -156,16 +157,16 @@
<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="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="tls_authentication">TLS 驗證/加密</string>
<string name="generated_config">生成的設定檔</string>
- <string name="generalsettings">設置</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>
@@ -177,11 +178,11 @@
<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_summary">連接時顯示記錄視窗。記錄視窗可以隨時從通知列中存取。</string>
<string name="show_log_window">顯示記錄視窗</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">系統的 VPN 連線警告說明這個應用程式可以攔截所有流量,這是防止 VPNService API 被濫用。\n為了提示正在進行的 VPN 連線, Android 系統會產生通知 (鑰匙符號) ,在一些系統中,會發出提示聲。\nAndroid 這麼做是為了確保你的安全。</string>
<string name="faq_system_dialogs_title">連線警告和通知時發出音效</string>
<string name="translationby">繁體中文</string>
<string name="ipdns">IP和DNS</string>
@@ -195,103 +196,209 @@
<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="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>
<string name="use_system_proxy_summary">使用系統配置的 HTTP/HTTPS 代理伺服器進行連線。</string>
- <string name="donatewithpaypal">你可以透過 &lt;a href=\"https://www.paypal.com/cgi-bin/webscr?hosted_button_id=R2M6ZP9AF25LS&amp;amp;cmd=_s-xclick\"&gt;PayPal&lt;/a&gt; 提供捐助</string>
- <string name="onbootrestartsummary">如果在重新開機或關機前正連線VPN,開機時自動重新連線。在使用這個選項之前請先閱讀連線警告FAQ。</string>
- <string name="onbootrestart">開機時重新連線</string>
+ <string name="onbootrestartsummary">OpenVPN 將會在系統啟動時連線到特定的 VPN。在 Android &lt; 5.0 上使用這個設定前,請閱讀連線警告 FAQ。</string>
+ <string name="onbootrestart">啟動時連線</string>
<string name="ignore">忽略</string>
<string name="restart">重置</string>
<string name="restart_vpn_after_change">配置變更只會在重新啟動VPN時才生效,現在要(重新)啟動VPN嗎?</string>
<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="faq_duplicate_notification">如果 Android 在系統記憶體 (RAM) 壓力下,會從現用的記憶體中移除在當下不需要的應用程式和服務。這將中止正在進行的 VPN 連線。為了確保連線/OpenVPN 不被終止,因此,此應用程式必須顯示在通知列中,才將具有較高優先的順序執行。如之前常見問題中說明的,鑰匙圖示是系統產生的,這不能當作是應用程式為了以更高的執行順序。</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="persisttun_summary">當 OpenVPN 重新連線時,持續使用 VPN 連線。</string>
+ <string name="persistent_tun_title">保持 tun 通道</string>
<string name="openvpn_log">OpenVPN 運作記錄</string>
<string name="import_config">匯入 OpenVPN 配置</string>
<string name="battery_consumption_title">電池消耗</string>
- <string name="vpn_tethering_title">VPN與可攜式無線基地台</string>
- <string name="connection_retries">重新連線次數</string>
+ <string name="faq_tethering">網路共用的功能 (透過 Wi-Fi、USB 或藍牙) 和 VPNService API (此程式使用) 不一起作用。更多細節請看 &lt;a href=\"https://github.com/schwabe/ics-openvpn/issues/34\"&gt;issue #34&lt;/a&gt;</string>
+ <string name="vpn_tethering_title">VPN 與網路共用</string>
+ <string name="connection_retries">連線重試次數</string>
<string name="reconnection_settings">重新連線設定</string>
<string name="connectretrymessage">嘗試重新連線之間的等待秒數。</string>
<string name="connectretrywait">重新連線的間隔時間</string>
- <string name="minidump_generated">OpenVPN非預期地崩潰,你或者會考慮在主選單下傳送Minidump給開發人員。</string>
- <string name="send_minidump">向開發人員傳送Minidump</string>
+ <string name="minidump_generated">OpenVPN 發生非預期的異常,你可以使用在主選單中的發送異常傾印選項,將資訊提供給開發人員。</string>
+ <string name="send_minidump">向開發人員傳送異常傾印</string>
+ <string name="send_minidump_summary">傳送程式上一個異常停止的除錯資訊給開發人員</string>
+ <string name="notifcation_title">OpenVPN - %s</string>
+ <string name="session_ipv4string">%1$s - %2$s</string>
+ <string name="session_ipv6string">%1$s - %3$s, %2$s</string>
<string name="state_connecting">連線中</string>
+ <string name="state_wait">等待伺服器回覆</string>
+ <string name="state_auth">身份驗證</string>
+ <string name="state_get_config">取得客戶端配置</string>
+ <string name="state_assign_ip">分配 IP 位址</string>
+ <string name="state_add_routes">添加路由</string>
<string name="state_connected">已連線</string>
<string name="state_disconnected">中斷連線</string>
<string name="state_reconnecting">正在重新連線</string>
+ <string name="state_exiting">退出</string>
+ <string name="state_noprocess">不在執行</string>
+ <string name="state_resolve">解析主機名稱</string>
<string name="state_tcp_connect">連線中 (TCP)</string>
+ <string name="state_auth_failed">身份驗證失敗</string>
+ <string name="state_nonetwork">等待可使用的網路</string>
<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="jelly_keystore_alphanumeric_bug">如果,密鑰憑證的名稱包含非字母數字字元 (如空白、底線、破折號),在某些 Android 4.1 版本可能會出現問題。請嘗試重新匯入不含特殊字元的憑證。</string>
+ <string name="encryption_cipher">加密密鑰</string>
+ <string name="packet_auth">封包驗證</string>
+ <string name="auth_dialog_title">輸入封包驗證方法</string>
+ <string name="built_by">由 %s 建立</string>
+ <string name="debug_build">除錯版本</string>
+ <string name="official_build">正式版本</string>
+ <string name="make_selection_inline">複製到設定檔</string>
+ <string name="crashdump">異常傾印</string>
+ <string name="add">添加</string>
+ <string name="send_config">發送配置檔</string>
+ <string name="complete_dn">完整的 DN</string>
+ <string name="remotetlsnote">你匯入的設定使用了已經過舊且不建議的 tls-remote 選項使用了不同的 DN 格式。</string>
+ <string name="rdn">RDN (common name)</string>
+ <string name="rdn_prefix">RDN 前綴</string>
+ <string name="tls_remote_deprecated">tls-remote (不建議使用)</string>
+ <string name="help_translate">您可以訪問
+http://crowdin.net/project/ics-openvpn/invite
+幫助我們翻譯本軟體</string>
+ <string name="prompt">%1$s 試圖控制 %2$s</string>
+ <string name="remote_warning">你正在提供這個應用程式完全控制 OpenVPN for Android 與攔截所有網路流量的權限,<b>不允許,除非信任此應用程式。</b>否則,你的資料會受到惡意軟體洩漏的風險。</string>
+ <string name="remote_trust">信任此應用程式</string>
+ <string name="no_external_app_allowed">不允許應用程式使用外部 API </string>
+ <string name="allowed_apps">允許的應用程式:%s</string>
+ <string name="clearappsdialog">清除允許外部應用程式的清單?\n目前的允許應用程式的清單:\n\n%s</string>
+ <string name="screenoff_summary">當螢幕關閉和 60 秒內的傳輸資料,小於 60 KB 的時,暫停 VPN。當 「保持 Tun 通道」選項開啟時,暫停 VPN 會讓你的裝置沒有網路連線。如果不使用「保持 Tun 通道」選項,這個裝置會沒有 VPN 連線/保護。</string>
+ <string name="screenoff_title">當螢幕關閉時暫停VPN連線</string>
+ <string name="screenoff_pause">螢幕在關閉狀態時暫停連線:少於 %1$s 在 %2$s 秒</string>
+ <string name="screen_nopersistenttun">警告:保持 tun 通道沒有在此 VPN 中開啟。當螢幕關閉時,將會使用一般的網際網路連線。</string>
+ <string name="save_password">記住密碼</string>
+ <string name="pauseVPN">暫停VPN</string>
+ <string name="resumevpn">恢復 VPN</string>
+ <string name="state_userpause">使用者要求暫停 VPN</string>
+ <string name="state_screenoff">VPN 暫停 - 螢幕關閉</string>
+ <string name="device_specific">裝置特定的 Hacks</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">\"從 Android 4.3 開始,VPN 確認防止「覆蓋應用程式」,會導致對話框觸碰時沒有反應。如果你的應用程式中有使用覆蓋應用程式的功能,可能或造成這個現象。如果,發現造成這個問題的應用程式,請聯絡這個此應用程式的作者。這個問題會影響到所有在 Android 4.3 及更高版本的 VPN 應用程式。另請參見:See also &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="keyChainAccessError">鑰匙圈存取錯誤:%s</string>
<string name="timestamp_short">短</string>
<string name="timestamp_iso">ISO</string>
- <string name="timestamps">時間戳</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="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="unhandled_exception">未處理的異常:%1$s \n\n %2$s</string>
+ <string name="unhandled_exception_context">%3$s:%1$s \n\n %2$s</string>
+ <string name="faq_system_dialog_xposed">如果你的 Android 裝置已取得 root 權限,你可以自行承擔風險安裝 &lt;a href=\"http://xposed.info/\"&gt;Xposed framework&lt;/a&gt; 和 &lt;a href=\"http://repo.xposed.info/module/de.blinkt.vpndialogxposed\"&gt;VPN Dialog confirm 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="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="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="mssfix_checkbox">覆寫TCP 裝載資料 (payload) 的最大分段大小 (MSS) 值</string>
+ <string name="mssfix_dialogtitle">設定 TCP 裝載資料 (payload) 的最大分段大小 (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="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="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">資料 (payload) 選項</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_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 版本在 TCP 連線中,設定錯誤的最大分段大小 (MSS) 值 (#61948)。試著開啟 mssfix 選項來繞開這個 bug。</string>
+ <string name="ab_proxy">Android 沒有 DNS 伺服器設定時,會繼續使用你指定的行動/Wi-Fi 連線代理設定。OpenVPN for Android 會在日誌中記錄警告訊息。<p>當 VPN 有設定 DNS 伺服器時,因為,Android API 中無法為 VPN 連線設定代理,所以,將不會使用代理設定。</p></string>
+ <string name="ab_lollipop_reinstall">當解除安裝或重新安裝,VPN 應用程式也會停止運作。詳細資訊起參閱 #80074</string>
+ <string name="ab_secondary_users">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="custom_connection_options_warng">指定自訂連線的特定選項,請小心使用</string>
+ <string name="custom_connection_options">自定義選項</string>
+ <string name="remove_connection_entry">刪除連線項目</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 握手失敗</string>
+ <string name="message_no_user_edit">這個設定檔已被從外部應用程式 (%s) 新增,並標記為使用者無法編輯。</string>
+ <string name="crl_file">憑證撤銷清單</string>
+ <string name="import_config_error">導入配置產生錯誤,無法保存</string>
+ <string name="Search">搜索</string>
+ <string name="lastdumpdate">(最後傾印是 %1$d:%2$dh 久 (%3$s))</string>
+ <string name="clear_log_on_connect">清除新連線的記錄</string>
+ <string name="connect_timeout">連線超時</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>
+ <string name="pushpeerinfo">發送端資訊</string>
+ <string name="pushpeerinfosummary">傳送額外的資訊到伺服器,例如 SSL 版本與 Android 版本</string>
+ <string name="pw_request_dialog_title">需要 %1$s</string>
+ <string name="pw_request_dialog_prompt">請輸入 %1$s 設定檔的密碼</string>
+ <string name="menu_use_inline_data">使用行內 (inline) 資料</string>
+ <string name="export_config_chooser_title">匯出設定檔</string>
+ <string name="missing_tlsauth">缺少 tls-auth 檔案</string>
+ <string name="missing_certificates">缺少使用者憑證或使用者憑證金鑰檔案</string>
+ <string name="missing_ca_certificate">缺少 CA 憑證</string>
+ <string name="crl_title">憑證撤銷清單 (可選)</string>
+ <string name="samsung_broken_title">三星手機</string>
+ <string name="novpn_selected">沒有 VPN 被選擇</string>
+ <string name="reconnect">重新連線</string>
+ <string name="qs_title">切換 VPN</string>
+ <string name="qs_connect">連線到 %s</string>
+ <string name="qs_disconnect">中斷連線 %s</string>
+ <string name="connectretrymaxtitle">連線嘗試最大間隔</string>
+ <string name="state_waitconnectretry">連線重試間,等待 %s 秒。</string>
+ <string name="change_sorting">更改排序</string>
+ <string name="sort">排序</string>
</resources>
diff --git a/app/src/main/res/values/colours.xml b/app/src/main/res/values/colours.xml
index d06bc233..cf4a2a7f 100644
--- a/app/src/main/res/values/colours.xml
+++ b/app/src/main/res/values/colours.xml
@@ -18,4 +18,7 @@
<color name="background_tab_pressed">#1AFFFFFF</color>
+
+ <color name="dataIn">#ff0000</color>
+ <color name="dataOut">#0000ff</color>
</resources> \ No newline at end of file
diff --git a/app/src/main/res/values/plurals-icsopenvpn.xml b/app/src/main/res/values/plurals-icsopenvpn.xml
new file mode 100644
index 00000000..1c5a03bc
--- /dev/null
+++ b/app/src/main/res/values/plurals-icsopenvpn.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<resources>
+ <plurals name="months_left">
+ <item quantity="one">One month left</item>
+ <item quantity="other">%d months left</item>
+ </plurals>
+ <plurals name="days_left">
+ <item quantity="one">One day left</item>
+ <item quantity="other">%d days left</item>
+ </plurals>
+ <plurals name="hours_left">
+ <item quantity="one">One hour left</item>
+ <item quantity="other">%d hours left</item>
+ </plurals>
+ <plurals name="minutes_left">
+ <item quantity="one">One minute left</item>
+ <item quantity="other">%d minutes left</item>
+ </plurals>
+</resources> \ No newline at end of file
diff --git a/app/src/main/res/values/refs.xml b/app/src/main/res/values/refs.xml
index 4d3c257a..2b00d5b5 100644
--- a/app/src/main/res/values/refs.xml
+++ b/app/src/main/res/values/refs.xml
@@ -5,12 +5,23 @@
-->
<resources>
- <drawable name="ic_menu_close_clear_cancel">@android:drawable/ic_menu_close_clear_cancel</drawable>
- <drawable name="ic_menu_play">@android:drawable/ic_media_play</drawable>
- <drawable name="ic_menu_pause">@android:drawable/ic_media_pause</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>
+ <drawable name="ic_menu_close_clear_cancel">@android:drawable/ic_menu_close_clear_cancel</drawable>
+ <drawable name="ic_menu_play">@android:drawable/ic_media_play</drawable>
+ <drawable name="ic_menu_pause">@android:drawable/ic_media_pause</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_import">@drawable/ic_menu_archive</drawable>-->
+ <!--<drawable name="vpn_item_edit">@drawable/vpn_item_settings </drawable>-->
+ <drawable name="ic_menu_add">@android:drawable/ic_menu_add</drawable>
+ <drawable name="ic_dialog_alert">@android:drawable/ic_dialog_alert</drawable>
+ <drawable name="ic_menu_add_grey">@android:drawable/ic_menu_add</drawable>
+ <!--<drawable name="ic_menu_import_grey">@drawable/ic_menu_archive</drawable>-->
+ <drawable name="ic_menu_delete_grey">@android:drawable/ic_menu_delete</drawable>
+ <!--<drawable name="ic_menu_copy">@drawable/ic_menu_copy_holo_light</drawable>-->
+ <!--<drawable name="ic_receipt">@drawable/ic_menu_log</drawable> -->
+ <drawable name="ic_sort">@android:drawable/ic_menu_sort_by_size</drawable>
+
+</resources> \ No newline at end of file
diff --git a/app/src/main/res/values/strings-icsopenvpn.xml b/app/src/main/res/values/strings-icsopenvpn.xml
index 3956604e..52abd9a5 100755
--- a/app/src/main/res/values/strings-icsopenvpn.xml
+++ b/app/src/main/res/values/strings-icsopenvpn.xml
@@ -42,13 +42,14 @@
<string name="duplicate_profile_name">Please enter a unique Profile Name</string>
<string name="profilename">Profile Name</string>
<string name="no_keystore_cert_selected">You must select a User certificate</string>
+ <string name="no_ca_cert_selected">You must select a CA certificate</string>
<string name="no_error_found">No error found</string>
<string name="config_error_found">Error in Configuration</string>
<string name="ipv4_format_error">Error parsing the IPv4 address</string>
<string name="custom_route_format_error">Error parsing the custom routes</string>
<string name="pw_query_hint">(leave empty to query on demand)</string>
<string name="vpn_shortcut">OpenVPN Shortcut</string>
- <string name="vpn_launch_title">Connect to VPN</string>
+ <string name="vpn_launch_title">Connecting to VPN…</string>
<string name="shortcut_profile_notfound">Profile specified in shortcut not found</string>
<string name="random_host_prefix">Random Host Prefix</string>
<string name="random_host_summary">Adds 6 random chars in front of hostname</string>
@@ -162,7 +163,7 @@
<string name="private_key_password">Private Key Password</string>
<string name="password">Password</string>
<string name="file_icon">file icon</string>
- <string name="tls_authentication">TLS Authentication</string>
+ <string name="tls_authentication">TLS Authentication/Encryption</string>
<string name="generated_config">Generated Config</string>
<string name="generalsettings">Settings</string>
<string name="owner_fix_summary">Tries to set the owner of /dev/tun to system. Some CM9 images need this to make the VPNService API work. Requires root.</string>
@@ -201,9 +202,8 @@
<string name="using_proxy">Using proxy %1$s %2$d</string>
<string name="use_system_proxy">Use system proxy</string>
<string name="use_system_proxy_summary">Use the system wide configuration for HTTP/HTTPS proxies to connect.</string>
- <string name="donatewithpaypal">You can &lt;a href=\"https://www.paypal.com/cgi-bin/webscr?hosted_button_id=R2M6ZP9AF25LS&amp;amp;cmd=_s-xclick\"&gt;donate with PayPal&lt;/a&gt; </string>
- <string name="onbootrestartsummary">OpenVPN will reconnect a VPN if it was active on system reboot/shutdown. Please read the Connection warning FAQ before using this option.</string>
- <string name="onbootrestart">Reconnect on reboot</string>
+ <string name="onbootrestartsummary">OpenVPN will connect the specified VPN if it was active on system boot. Please read the connection warning FAQ before using this option on Android &lt; 5.0.</string>
+ <string name="onbootrestart">Connect on boot</string>
<string name="ignore">Ignore</string>
<string name="restart">Restart</string>
<string name="restart_vpn_after_change">Configuration changes are applied after restarting the VPN. (Re)start the VPN now?</string>
@@ -250,7 +250,7 @@
<string name="state_tcp_connect">Connecting (TCP)</string>
<string name="state_auth_failed">Authentication failed</string>
<string name="state_nonetwork">Waiting for usable network</string>
- <string name="statusline_bytecount">↓%2$s/s %1$s - ↑%4$s/s %3$s</string>
+ <string name="statusline_bytecount">↓%2$s %1$s - ↑%4$s %3$s</string>
<string name="notifcation_title_notconnect">Not connected</string>
<string name="start_vpn_title">Connecting to VPN %s</string>
<string name="start_vpn_ticker">Connecting to VPN %s</string>
@@ -277,7 +277,7 @@
<string name="no_external_app_allowed">No app allowed to use external API</string>
<string name="allowed_apps">Allowed apps: %s</string>
<string name="clearappsdialog">Clear list of allowed external apps?\nCurrent list of allowed apps:\n\n%s</string>
- <string name="screenoff_summary">"Pause VPN when screen is off and less than 64 kB transferred data in 60s. When the \"Persistent Tun\" option is enabled pausing the VPN will leave your device with NO network connectivity. Without the \"Persistent Tun\" option the device will have no VPN connection/protection.</string>
+ <string name="screenoff_summary">Pause VPN when screen is off and less than 64 kB transferred data in 60s. When the \"Persistent Tun\" option is enabled pausing the VPN will leave your device with NO network connectivity. Without the \"Persistent Tun\" option the device will have no VPN connection/protection.</string>
<string name="screenoff_title">Pause VPN connection after screen off</string>
<string name="screenoff_pause">Pausing connection in screen off state: less than %1$s in %2$ss</string>
<string name="screen_nopersistenttun">Warning: Persistent tun not enabled for this VPN. Traffic will use the normal Internet connection when the screen is off.</string>
@@ -310,7 +310,7 @@
<string name="logview_options">View options</string>
<string name="unhandled_exception">Unhandled exception: %1$s\n\n%2$s</string>
<string name="unhandled_exception_context">%3$s: %1$s\n\n%2$s</string>
- <string name="faq_system_dialog_xposed">If you have rooted your Android device you can install the &lt;a href=\"http://xposed.info/\"&gt;Xposed framework&lt;/a&gt; and a the &lt;a href=\"http://repo.xposed.info/module/de.blinkt.vpndialogxposed\"&gt;VPN Dialog confirm module&lt;/a&gt; at your own risk"</string>
+ <string name="faq_system_dialog_xposed">If you have rooted your Android device you can install the &lt;a href=\"http://xposed.info/\"&gt;Xposed framework&lt;/a&gt; and the &lt;a href=\"http://repo.xposed.info/module/de.blinkt.vpndialogxposed\"&gt;VPN Dialog confirm module&lt;/a&gt; at your own risk"</string>
<string name="full_licenses">Full licenses</string>
<string name="blocklocal_summary">Networks directly connected to the local interfaces will not be routed over the VPN. Deselecting this option will redirect all traffic intented for local networks to the VPN.</string>
<string name="blocklocal_title">Bypass VPN for local networks</string>
@@ -321,6 +321,7 @@
<string name="import_log">Import log:</string>
<string name="ip_looks_like_subnet">Vpn topology \"%3$s\" specified but ifconfig %1$s %2$s looks more like an IP address with a network mask. Assuming \"subnet\" topology.</string>
<string name="mssfix_invalid_value">The MSS override value has to be a integer between 0 and 9000</string>
+ <string name="mtu_invalid_value">The MTU override value has to be a integer between 64 and 9000</string>
<string name="mssfix_value_dialog">Announce to TCP sessions running over the tunnel that they should limit their send packet sizes such that after OpenVPN has encapsulated them, the resulting UDP packet size that OpenVPN sends to its peer will not exceed this number of bytes. (default is 1450)</string>
<string name="mssfix_checkbox">Override MSS value of TCP payload</string>
<string name="mssfix_dialogtitle">Set MSS of TCP payload</string>
@@ -390,9 +391,6 @@
<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>
@@ -405,4 +403,49 @@
<string name="missing_ca_certificate">Missing CA certificate</string>
<string name="crl_title">Certifcate Revoke List (optional)</string>
<string name="reread_log">Reread (%d) log items from log cache file</string>
+ <string name="samsung_broken">Even though Samsung phones are among the most selling Android phones, Samsung\'s firmware are also among the most buggy Android firmwares. The bugs are not limited to the VPN operation on these devices but many of them can be workarounded. In the following some of these bugs are described.\n\nDNS does not work unless the DNS server in the VPN range.\n\nOn many Samsung 5.x devices the allowed/disallowed apps feature does not work.\nOn Samsung 6.x VPN is reported not to work unless the VPN app is exempted from Powersave features.</string>
+ <string name="samsung_broken_title">Samsung phones</string>
+ <string name="novpn_selected">No VPN selected.</string>
+ <string name="defaultvpn">Default VPN</string>
+ <string name="defaultvpnsummary">VPN used in places where a default VPN needed. These are currently on boot, for Always-On and the Quick Settings Tile.</string>
+ <string name="vpnselected">Currently selected VPN: \'%s\'</string>
+ <string name="reconnect">Reconnect</string>
+ <string name="qs_title">Toggle VPN</string>
+ <string name="qs_connect">Connect to %s</string>
+ <string name="qs_disconnect">Disconnect %s</string>
+ <string name="connectretrymaxmessage">Enter the maximum time between connection attempts. OpenVPN will slowly raise its waiting time after an unsuccessful connection attempt up to this value. Defaults to 300s.</string>
+ <string name="connectretrymaxtitle">Maximum time between connection attempts</string>
+ <string name="state_waitconnectretry">Waiting %ss seconds between connection attempt</string>
+ <string name="nought_alwayson_warning"><![CDATA[If you did not get a VPN confirmation dialog, you have \"Always on VPN\" enabled for another app. In that case only that app is allowed to connect to a VPN. Check under Settings-> Networks more .. -> VPNS]]></string>
+ <string name="management_socket_closed">Connection to OpenVPN closed (%s)</string>
+ <string name="change_sorting">Change sorting</string>
+ <string name="sort">Sort</string>
+ <string name="sorted_lru">Profiles sorted by last recently used</string>
+ <string name="sorted_az">Profiles sorted by name</string>
+ <string name="deprecated_tls_remote">Config uses option tls-remote that was deprecated in 2.3 and finally removed in 2.4</string>
+ <string name="auth_failed_behaviour">Behaviour on AUTH_FAILED</string>
+ <string name="graph">Graph</string>
+ <string name="use_logarithmic_scale">Use logarithmic scale</string>
+ <string name="notenoughdata">Not enough data</string>
+ <string name="avghour">Average per hour</string>
+ <string name="avgmin">Average per minute</string>
+ <string name="last5minutes">Last 5 minutes</string>
+ <string name="data_in">In</string>
+ <string name="data_out">Out</string>
+ <string name="bits_per_second">%.0f bit/s</string>
+ <string name="kbits_per_second">%.1f kbit/s</string>
+ <string name="mbits_per_second">%.1f Mbit/s</string>
+ <string name="gbits_per_second">%.1f Gbit/s</string>
+ <string name="weakmd">&lt;p>Starting with OpenSSL version 1.1, OpenSSL rejects weak signatures in certificates like MD5.&lt;/p>&lt;p>&lt;b>MD5 signatures are insecure and should not be used anymore.&lt;/b> MD5 collisions can be created in &lt;a href="https://natmchugh.blogspot.de/2015/02/create-your-own-md5-collisions.html">few hours at a minimal cost.&lt;/a>. You should update the VPN certificates as soon as possible.&lt;/p>&lt;p>Unfortunately, older easy-rsa distributions included the config option "default_md md5". If you are using an old easy-rsa version, update to the &lt;a href="https://github.com/OpenVPN/easy-rsa/releases">latest version&lt;/a>) or change md5 to sha256 and regenerate your certificates.&lt;/p>&lt;p>If you really want to use old and broken certificates use the custom configuration option tls-cipher "DEFAULT:@SECLEVEL=0" under advanced configuration or as additional line in your imported configuration&lt;/p></string>
+
+<string name="volume_byte">%.0f B</string>
+ <string name="volume_kbyte">%.1f kB</string>
+ <string name="volume_mbyte">%.1f MB</string>
+ <string name="volume_gbyte">%.1f GB</string>
+ <string name="channel_name_background">Connection statistics</string>
+ <string name="channel_description_background">Ongoing statistics of the established OpenVPN connection</string>
+ <string name="channel_name_status">Connection status change</string>
+ <string name="channel_description_status">Status changes of the OpenVPN connection (Connecting, authenticating,…)</string>
+ <string name="weakmd_title">Weak (MD5) hashes in certificate signature (SSL_CTX_use_certificate md too weak)</string>
+
</resources>
diff --git a/app/src/main/res/values/untranslatable.xml b/app/src/main/res/values/untranslatable.xml
index a73cad33..2d7f904b 100644
--- a/app/src/main/res/values/untranslatable.xml
+++ b/app/src/main/res/values/untranslatable.xml
@@ -2,7 +2,8 @@
<resources>
<string name="app" translatable="false">Bitmask</string>
<string name="app_name" translatable="false">Bitmask</string>
-
+ <string name="notifcation_title_bitmask">Bitmask - %s</string>
+
<string name="copyright_leapgui" translatable="false">Copyright 2012-2014\nLEAP Encryption Access Project &lt;info@leap.se></string>
<string name="opevpn_copyright" translatable="false">Copyright © 2002–2010 OpenVPN Technologies, Inc. &lt;sales@openvpn.net>\n
diff --git a/app/src/ovpn3/java/de/blinkt/openvpn/core/OpenVPNThreadv3.java b/app/src/ovpn3/java/de/blinkt/openvpn/core/OpenVPNThreadv3.java
index e595106c..850983a9 100644
--- a/app/src/ovpn3/java/de/blinkt/openvpn/core/OpenVPNThreadv3.java
+++ b/app/src/ovpn3/java/de/blinkt/openvpn/core/OpenVPNThreadv3.java
@@ -22,7 +22,7 @@ public class OpenVPNThreadv3 extends ClientAPI_OpenVPNClient implements Runnable
static {
/*System.loadLibrary("crypto");
System.loadLibrary("ssl");*/
- System.loadLibrary("polarssl-dynamic");
+ //System.loadLibrary("polarssl-dynamic");
System.loadLibrary("ovpn3");
}
@@ -77,7 +77,8 @@ public class OpenVPNThreadv3 extends ClientAPI_OpenVPNClient implements Runnable
statuspoller.stop();
}
- @Override
+
+ @Override
public boolean tun_builder_set_remote_address(String address, boolean ipv6) {
mService.setMtu(1500);
return true;
@@ -94,9 +95,8 @@ public class OpenVPNThreadv3 extends ClientAPI_OpenVPNClient implements Runnable
return true;
}
- @Override
- public boolean tun_builder_add_route(String address, int prefix_length,
- boolean ipv6) {
+ @Override
+ public boolean tun_builder_add_route(String address, int prefix_length, int metric, boolean ipv6) {
if (address.equals("remote_host"))
return false;
@@ -107,7 +107,20 @@ public class OpenVPNThreadv3 extends ClientAPI_OpenVPNClient implements Runnable
return true;
}
- @Override
+ @Override
+ public boolean tun_builder_exclude_route(String address, int prefix_length, int metric, boolean ipv6) {
+ if(ipv6)
+ mService.addRoutev6(address + "/" + prefix_length, "wifi0");
+ else {
+ //TODO
+ mService.addRoute(address, String.valueOf(prefix_length), "1.2.3.4" , "wifi0");
+ }
+ return true;
+ }
+
+
+
+ @Override
public boolean tun_builder_add_search_domain(String domain) {
mService.setDomain(domain);
return true;
@@ -126,15 +139,15 @@ public class OpenVPNThreadv3 extends ClientAPI_OpenVPNClient implements Runnable
- @Override
- public boolean tun_builder_add_address(String address, int prefix_length,
- boolean ipv6) {
- if(!ipv6)
- mService.setLocalIP(new CIDRIP(address, prefix_length));
- else
- mService.setLocalIPv6(address+ "/" + prefix_length);
- return true;
- }
+
+ @Override
+ public boolean tun_builder_add_address(String address, int prefix_length, String gateway, boolean ipv6, boolean net30) {
+ if(!ipv6)
+ mService.setLocalIP(new CIDRIP(address, prefix_length));
+ else
+ mService.setLocalIPv6(address+ "/" + prefix_length);
+ return true;
+ }
@Override
public boolean tun_builder_new() {
@@ -142,19 +155,19 @@ public class OpenVPNThreadv3 extends ClientAPI_OpenVPNClient implements Runnable
return true;
}
- @Override
- public boolean tun_builder_reroute_gw(String server_address,
- boolean server_address_ipv6, boolean ipv4, boolean ipv6, long flags) {
- // ignore
- return true;
- }
- @Override
- public boolean tun_builder_exclude_route(String address, int prefix_length,
- boolean ipv6) {
- //ignore
- return true;
- }
+ @Override
+ public boolean tun_builder_set_layer(int layer) {
+ return layer == 3;
+ }
+
+
+ @Override
+ public boolean tun_builder_reroute_gw(boolean ipv4, boolean ipv6, long flags) {
+ //ignore
+ return true;
+ }
+
private boolean setConfig(String vpnconfig) {
@@ -228,11 +241,20 @@ public class OpenVPNThreadv3 extends ClientAPI_OpenVPNClient implements Runnable
mService =openVpnService;
}
- @Override
- public void pause(pauseReason pauseReason)
- {
- pause();
- }
+
+ @Override
+ public boolean stopVPN(boolean replaceConnection) {
+ return false;
+ }
+
+ @Override
+ public void networkChange(boolean sameNetwork) {
+
+ }
+
+ @Override
+ public void setPauseCallback(PausedStateCallback callback) {
+ }
@Override
public void log(ClientAPI_LogInfo arg0) {
@@ -262,9 +284,10 @@ public class OpenVPNThreadv3 extends ClientAPI_OpenVPNClient implements Runnable
return true;
}
- public boolean stopVPN() {
- stop();
- return true;
+
+ @Override
+ public void stop() {
+ super.stop();
}
@Override
@@ -272,4 +295,9 @@ public class OpenVPNThreadv3 extends ClientAPI_OpenVPNClient implements Runnable
reconnect(1);
}
+ @Override
+ public void pause(pauseReason reason) {
+ super.pause(reason.toString());
+ }
+
}
diff --git a/app/src/production/java/se/leap/bitmaskclient/ProviderAPI.java b/app/src/production/java/se/leap/bitmaskclient/ProviderAPI.java
index b9b449f0..ff6c0d41 100644
--- a/app/src/production/java/se/leap/bitmaskclient/ProviderAPI.java
+++ b/app/src/production/java/se/leap/bitmaskclient/ProviderAPI.java
@@ -16,26 +16,63 @@
*/
package se.leap.bitmaskclient;
-import android.app.*;
-import android.content.*;
-import android.content.res.*;
-import android.os.*;
-import android.util.*;
-
-import java.io.*;
-import java.math.*;
-import java.net.*;
-import java.security.*;
-import java.security.cert.*;
-import java.security.interfaces.*;
-import java.util.*;
-
-import javax.net.ssl.*;
-
-import org.json.*;
-import org.thoughtcrime.ssl.pinning.util.*;
-
-import se.leap.bitmaskclient.eip.*;
+import android.app.IntentService;
+import android.content.Intent;
+import android.content.SharedPreferences;
+import android.content.res.Resources;
+import android.os.Bundle;
+import android.os.ResultReceiver;
+import android.util.Base64;
+
+import org.json.JSONException;
+import org.json.JSONObject;
+import org.thoughtcrime.ssl.pinning.util.PinningHelper;
+
+import java.io.DataOutputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.UnsupportedEncodingException;
+import java.math.BigInteger;
+import java.net.ConnectException;
+import java.net.CookieHandler;
+import java.net.CookieManager;
+import java.net.CookiePolicy;
+import java.net.MalformedURLException;
+import java.net.SocketTimeoutException;
+import java.net.URL;
+import java.net.URLConnection;
+import java.net.URLEncoder;
+import java.net.UnknownHostException;
+import java.security.KeyManagementException;
+import java.security.KeyStore;
+import java.security.KeyStoreException;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.security.SecureRandom;
+import java.security.cert.CertificateEncodingException;
+import java.security.cert.CertificateException;
+import java.security.cert.X509Certificate;
+import java.security.interfaces.RSAPrivateKey;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Locale;
+import java.util.Map;
+import java.util.NoSuchElementException;
+import java.util.Scanner;
+
+import javax.net.ssl.HostnameVerifier;
+import javax.net.ssl.HttpsURLConnection;
+import javax.net.ssl.KeyManager;
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.SSLHandshakeException;
+import javax.net.ssl.SSLSession;
+import javax.net.ssl.TrustManager;
+import javax.net.ssl.TrustManagerFactory;
+import javax.net.ssl.X509TrustManager;
+
+import se.leap.bitmaskclient.eip.Constants;
+import se.leap.bitmaskclient.eip.EIP;
import se.leap.bitmaskclient.userstatus.SessionDialog;
import se.leap.bitmaskclient.userstatus.User;
import se.leap.bitmaskclient.userstatus.UserStatus;
@@ -952,6 +989,7 @@ public class ProviderAPI extends IntentService {
}
}
+ //FIXME: don't save private keys in shared preferences! use the keystore
private boolean loadCertificate(String cert_string) {
try {
// API returns concatenated cert & key. Split them for OpenVPN options
diff --git a/app/src/test/java/de/blinkt/openvpn/core/TestConfigParser.java b/app/src/test/java/de/blinkt/openvpn/core/TestConfigParser.java
new file mode 100644
index 00000000..560d4fc8
--- /dev/null
+++ b/app/src/test/java/de/blinkt/openvpn/core/TestConfigParser.java
@@ -0,0 +1,37 @@
+/*
+ * 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 org.junit.Assert;
+import org.junit.Test;
+
+import java.io.IOException;
+import java.io.StringReader;
+
+import de.blinkt.openvpn.VpnProfile;
+
+/**
+ * Created by arne on 03.10.16.
+ */
+
+public class TestConfigParser {
+
+ String miniconfig = "client\nremote test.blinkt.de\n";
+
+ @Test
+ public void testHttpProxyPass() throws IOException, ConfigParser.ConfigParseError {
+ String httpproxypass = "<http-proxy-user-pass>\n" +
+ "foo\n" +
+ "bar\n" +
+ "</http-proxy-user-pass>\n";
+
+ ConfigParser cp = new ConfigParser();
+ cp.parseConfig(new StringReader(miniconfig + httpproxypass));
+ VpnProfile p = cp.convertProfile();
+ Assert.assertTrue(p.mCustomConfigOptions.contains(httpproxypass));
+
+ }
+}
diff --git a/app/src/test/java/de/blinkt/openvpn/core/TestIpParser.java b/app/src/test/java/de/blinkt/openvpn/core/TestIpParser.java
new file mode 100644
index 00000000..37f9fdcd
--- /dev/null
+++ b/app/src/test/java/de/blinkt/openvpn/core/TestIpParser.java
@@ -0,0 +1,38 @@
+/*
+ * 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 junit.framework.Assert;
+
+import org.junit.Test;
+
+import java.net.Inet6Address;
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+
+/**
+ * Created by arne on 23.07.16.
+ */
+
+public class TestIpParser {
+
+ @Test
+ public void parseIPv6Zeros() throws UnknownHostException {
+
+ testAddress("2020:0:1234::", 45, "2020:0:1234::/45");
+ testAddress("::", 0, "::/0");
+ testAddress("2a02:2e0:3fe:1001:302::", 128, "2a02:2e0:3fe:1001:302::/128");
+ testAddress("2a02:2e0:3fe:1001:302::70", 128, "2a02:2e0:3fe:1001:302:0:0:70/128");
+ }
+
+ void testAddress(String input, int mask, String output) throws UnknownHostException {
+ Inet6Address ip = (Inet6Address) InetAddress.getByName(input);
+
+ NetworkSpace.ipAddress netIp = new NetworkSpace.ipAddress(ip, mask, true);
+
+ Assert.assertEquals(output, netIp.toString());
+ }
+}
diff --git a/app/src/test/java/de/blinkt/openvpn/core/TestLogFileHandler.java b/app/src/test/java/de/blinkt/openvpn/core/TestLogFileHandler.java
index 476d8151..b32e5efa 100644
--- a/app/src/test/java/de/blinkt/openvpn/core/TestLogFileHandler.java
+++ b/app/src/test/java/de/blinkt/openvpn/core/TestLogFileHandler.java
@@ -1,137 +1,124 @@
+/*
+ * Copyright (c) 2012-2017 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 junit.framework.Assert;
-//
-//import org.junit.Before;
-//import org.junit.Ignore;
-//import org.junit.Test;
-//
-//import java.io.ByteArrayInputStream;
-//import java.io.ByteArrayOutputStream;
-//import java.io.IOException;
-//import java.io.InputStream;
-//import java.io.OutputStream;
-//import java.io.UnsupportedEncodingException;
-//import java.util.Arrays;
-
-/**
- * NOTE [@aguestuser|04.11.17]:
- *
- * As the tests below:
- *
- * (1) are testing the logic of library code (the openvpn class `LogFileHandler`)
- * -- thus making them low-value tests
- * (2) currently diverge from the signatures of the class under test (overriding non-existent methods, etc.)
- * -- thus failing to compile and breaking the build
- *
- * I am taking the liberty of commenting them out, and proposing we delete this file altogether
- * upon feedback from the team.
- *
- **/
-
-
-//@Ignore
-//public class TestLogFileHandler {
-//
-// byte[] testUnescaped = new byte[]{0x00, 0x55, -27, 0x00, 0x56, 0x10, -128, 0x55, 0x54};
-// byte[] expectedEscaped = new byte[]{0x55, 0x00, 0x00, 0x00, 0x09, 0x00, 0x56, 0x00, -27, 0x00, 0x56, 0x01, 0x10, -128, 0x56, 0x00, 0x54};
-// private TestingLogFileHandler lfh;
-//
-//
-// @Before
-// public void setup() {
-// lfh = new TestingLogFileHandler();
-// }
-//
-// @Test
-// public void testWriteByteArray() throws IOException {
-//
-// ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
-//
-// lfh.setLogFile(byteArrayOutputStream);
-//
-// lfh.writeEscapedBytes(testUnescaped);
-//
-// byte[] result = byteArrayOutputStream.toByteArray();
-// Assert.assertTrue(Arrays.equals(expectedEscaped, result));
-// }
-//
-// @Test
-// public void readByteArray() throws IOException {
-//
-// ByteArrayInputStream in = new ByteArrayInputStream(expectedEscaped);
-//
-// lfh.readCacheContents(in);
-//
-// Assert.assertTrue(Arrays.equals(testUnescaped, lfh.mRestoredByteArray));
-//
-// }
-//
-// @Test
-// public void testMarschal() throws UnsupportedEncodingException {
-// LogItem li = new LogItem(VpnStatus.LogLevel.DEBUG, 72, "foobar");
-// LogItem li2 = marschalAndBack(li);
-// testEquals(li, li2);
-// Assert.assertEquals(li, li2);
-// }
-//
-// @Test
-// public void testMarschalArgs() throws UnsupportedEncodingException {
-// LogItem li = new LogItem(VpnStatus.LogLevel.DEBUG, 72, 772, "sinnloser Text", 7723, 723.2f, 7.2);
-// LogItem li2 = marschalAndBack(li);
-// testEquals(li, li2);
-// Assert.assertEquals(li, li2);
-// }
-//
-// @Test
-// public void testMarschalString() throws UnsupportedEncodingException {
-// LogItem li = new LogItem(VpnStatus.LogLevel.DEBUG, "Nutzlose Nachricht");
-// LogItem li2 = marschalAndBack(li);
-// testEquals(li, li2);
-// Assert.assertEquals(li, li2);
-// }
-//
-//
-// private void testEquals(LogItem li, LogItem li2) {
-// Assert.assertEquals(li.getLogLevel(), li2.getLogLevel());
-// Assert.assertEquals(li.getLogtime(), li2.getLogtime());
-// Assert.assertEquals(li.getVerbosityLevel(), li2.getVerbosityLevel());
-// Assert.assertEquals(li.toString(), li2.toString());
-//
-// }
-//
-// private LogItem marschalAndBack(LogItem li) throws UnsupportedEncodingException {
-// byte[] bytes = li.getMarschaledBytes();
-//
-// return new LogItem(bytes, bytes.length);
-// }
-//
-//
-// @SuppressLint("HandlerLeak")
-// static class TestingLogFileHandler extends LogFileHandler {
-//
-// public byte[] mRestoredByteArray;
-//
-// public TestingLogFileHandler() {
-// super(null);
-// }
-//
-// public void setLogFile(OutputStream out) {
-// mLogFile = out;
-// }
-//
-// @Override
-// public void readCacheContents(InputStream in) throws IOException {
-// super.readCacheContents(in);
-// }
-//
-// @Override
-// protected void restoreLogItem(byte[] buf, int len) {
-// mRestoredByteArray = Arrays.copyOf(buf, len);
-// }
-// }
-//
-//
-//} \ No newline at end of file
+import android.annotation.SuppressLint;
+
+import junit.framework.Assert;
+
+import org.junit.Before;
+import org.junit.Test;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.UnsupportedEncodingException;
+import java.util.Arrays;
+
+public class TestLogFileHandler {
+
+ byte[] testUnescaped = new byte[]{0x00, 0x55, -27, 0x00, 0x56, 0x10, -128, 0x55, 0x54};
+ byte[] expectedEscaped = new byte[]{0x55, 0x00, 0x00, 0x00, 0x09, 0x00, 0x56, 0x00, -27, 0x00, 0x56, 0x01, 0x10, -128, 0x56, 0x00, 0x54};
+ private TestingLogFileHandler lfh;
+
+
+ @Before
+ public void setup() {
+ lfh = new TestingLogFileHandler();
+ }
+
+ @Test
+ public void testWriteByteArray() throws IOException {
+
+ ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
+
+ lfh.setLogFile(byteArrayOutputStream);
+
+ lfh.writeEscapedBytes(testUnescaped);
+
+ byte[] result = byteArrayOutputStream.toByteArray();
+ Assert.assertTrue(Arrays.equals(expectedEscaped, result));
+ }
+
+ @Test
+ public void readByteArray() throws IOException {
+
+ ByteArrayInputStream in = new ByteArrayInputStream(expectedEscaped);
+
+ lfh.readCacheContents(in);
+
+ Assert.assertTrue(Arrays.equals(testUnescaped, lfh.mRestoredByteArray));
+
+ }
+
+ @Test
+ public void testMarschal() throws UnsupportedEncodingException {
+ LogItem li = new LogItem(VpnStatus.LogLevel.DEBUG, 72, "foobar");
+ LogItem li2 = marschalAndBack(li);
+ testEquals(li, li2);
+ Assert.assertEquals(li, li2);
+ }
+
+ @Test
+ public void testMarschalArgs() throws UnsupportedEncodingException {
+ LogItem li = new LogItem(VpnStatus.LogLevel.DEBUG, 72, 772, "sinnloser Text", 7723, 723.2f, 7.2);
+ LogItem li2 = marschalAndBack(li);
+ testEquals(li, li2);
+ Assert.assertEquals(li, li2);
+ }
+
+ @Test
+ public void testMarschalString() throws UnsupportedEncodingException {
+ LogItem li = new LogItem(VpnStatus.LogLevel.DEBUG, "Nutzlose Nachricht");
+ LogItem li2 = marschalAndBack(li);
+ testEquals(li, li2);
+ Assert.assertEquals(li, li2);
+ }
+
+
+ private void testEquals(LogItem li, LogItem li2) {
+ Assert.assertEquals(li.getLogLevel(), li2.getLogLevel());
+ Assert.assertEquals(li.getLogtime(), li2.getLogtime());
+ Assert.assertEquals(li.getVerbosityLevel(), li2.getVerbosityLevel());
+ Assert.assertEquals(li.toString(), li2.toString());
+
+ }
+
+ private LogItem marschalAndBack(LogItem li) throws UnsupportedEncodingException {
+ byte[] bytes = li.getMarschaledBytes();
+
+ return new LogItem(bytes, bytes.length);
+ }
+
+
+ @SuppressLint("HandlerLeak")
+ static class TestingLogFileHandler extends LogFileHandler {
+
+ public byte[] mRestoredByteArray;
+
+ public TestingLogFileHandler() {
+ super(null);
+ }
+
+ public void setLogFile(OutputStream out) {
+ mLogFile = out;
+ }
+
+ @Override
+ public void readCacheContents(InputStream in) throws IOException {
+ super.readCacheContents(in);
+ }
+
+ @Override
+ protected void restoreLogItem(byte[] buf, int len) {
+ mRestoredByteArray = Arrays.copyOf(buf, len);
+ }
+ }
+
+
+} \ No newline at end of file