mirror of
https://github.com/amnezia-vpn/amneziawg-android.git
synced 2026-07-03 14:05:13 +02:00
Compare commits
68 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 452a339b37 | |||
| 7c743534a5 | |||
| 4df25dd567 | |||
| 4510fa7482 | |||
| 6aab7cccf9 | |||
| e7d9beaef8 | |||
| bd0967e36e | |||
| de2338a470 | |||
| c9353a89d4 | |||
| fb115b4079 | |||
| 0740e86cb2 | |||
| 9c0bafad17 | |||
| d7242288bb | |||
| 3e1bf5f9e9 | |||
| 55d6ad6c95 | |||
| 0a8de709b6 | |||
| 83c382b6cc | |||
| 9453b6c0e2 | |||
| 8390553850 | |||
| db7f70736f | |||
| d4c8f1dfdd | |||
| db52515dc6 | |||
| 0be12b8d07 | |||
| 56be913fa4 | |||
| 82bcac55fb | |||
| 04e503c9db | |||
| 434534ac59 | |||
| 0f77af85d3 | |||
| 58789d6372 | |||
| adefd16f7e | |||
| e4a49a5356 | |||
| 353679801e | |||
| 58ec110360 | |||
| a7ce5ad42a | |||
| 52c0d1ea29 | |||
| a5b4b9c428 | |||
| e744ce4569 | |||
| adfd8e247b | |||
| e9243c403a | |||
| fbcbfbd311 | |||
| dc1d294a82 | |||
| 2abd426cdc | |||
| c536f5cc7f | |||
| 37a892a2da | |||
| f2d166a6a4 | |||
| d883802178 | |||
| 8d990be204 | |||
| 5fa2e6164f | |||
| 9972d9607e | |||
| 6a72194106 | |||
| 254e6164d7 | |||
| 675386241b | |||
| 8671acc1a6 | |||
| fb08bb6bd4 | |||
| 70f8e5ab3a | |||
| e53a8d76f9 | |||
| e0b4551bca | |||
| 7b9757bf3b | |||
| 4156b83b84 | |||
| f829b8abe0 | |||
| 838e0bd6b0 | |||
| c3f6906309 | |||
| 5cafd1ebe4 | |||
| 51991324a9 | |||
| 33a8a51962 | |||
| 40eaa54cf0 | |||
| a3bfa6f1ab | |||
| 7778ff63b5 |
Generated
+1
@@ -468,6 +468,7 @@
|
||||
</codeStyleSettings>
|
||||
<codeStyleSettings language="kotlin">
|
||||
<option name="CODE_STYLE_DEFAULTS" value="KOTLIN_OFFICIAL" />
|
||||
<option name="RIGHT_MARGIN" value="160" />
|
||||
</codeStyleSettings>
|
||||
</code_scheme>
|
||||
</component>
|
||||
+2
-2
@@ -7,7 +7,7 @@ plugins {
|
||||
|
||||
tasks {
|
||||
wrapper {
|
||||
gradleVersion = "8.1.1"
|
||||
distributionSha256Sum = "e111cb9948407e26351227dabce49822fb88c37ee72f1d1582a69c68af2e702f"
|
||||
gradleVersion = "8.14"
|
||||
distributionSha256Sum = "61ad310d3c7d3e5da131b76bbf22b5a4c0786e9d892dae8c1658d4b484de3caa"
|
||||
}
|
||||
}
|
||||
|
||||
+2
-26
@@ -1,5 +1,5 @@
|
||||
wireguardVersionCode=502
|
||||
wireguardVersionName=1.0.20230504
|
||||
wireguardVersionCode=511
|
||||
wireguardVersionName=1.0.20250515
|
||||
wireguardPackageName=com.wireguard.android
|
||||
|
||||
# When configured, Gradle will run in incubating parallel mode.
|
||||
@@ -22,38 +22,15 @@ org.gradle.jvmargs=-Xmx1536m
|
||||
# Turn off AP discovery in compile path to enable compile avoidance
|
||||
kapt.include.compile.classpath=false
|
||||
|
||||
# Enable non-transitive R class namespacing where each library only contains
|
||||
# references to the resources it declares instead of declarations plus all
|
||||
# transitive dependency references.
|
||||
android.nonTransitiveRClass=true
|
||||
|
||||
# Experimental AGP flags
|
||||
# Generate compile-time only R class for app modules.
|
||||
android.enableAppCompileTimeRClass=true
|
||||
# Keep AAPT2 daemons alive between incremental builds.
|
||||
android.keepWorkerActionServicesBetweenBuilds=true
|
||||
# Make R fields non-final to improve build speeds.
|
||||
# http://tools.android.com/tips/non-constant-fields
|
||||
android.nonFinalResIds=true
|
||||
# Enable the newly refactored resource shrinker.
|
||||
android.experimental.enableNewResourceShrinker=true
|
||||
# Enable precise shrinking in the new resource shrinker.
|
||||
android.experimental.enableNewResourceShrinker.preciseShrinking=true
|
||||
# Generate manifest class as a .class directly rather than a Java source file.
|
||||
android.generateManifestClass=true
|
||||
# Generate the text map of source sets and absolute paths to allow
|
||||
# generating relative paths from absolute paths later in the build.
|
||||
android.experimental.enableSourceSetPathsMap=true
|
||||
# Use relative paths for better Gradle caching of library build tasks
|
||||
android.experimental.cacheCompileLibResources=true
|
||||
|
||||
# Default Android build features
|
||||
# Disable BuildConfig generation by default
|
||||
android.defaults.buildfeatures.buildconfig=false
|
||||
# Disable AIDL stub generation by default
|
||||
android.defaults.buildfeatures.aidl=false
|
||||
# Disable RenderScript compilation by default
|
||||
android.defaults.buildfeatures.renderscript=false
|
||||
# Disable resource values generation by default in libraries
|
||||
android.defaults.buildfeatures.resvalues=false
|
||||
# Disable shader compilation by default
|
||||
@@ -63,7 +40,6 @@ android.library.defaults.buildfeatures.androidresources=false
|
||||
|
||||
# Suppress warnings for some features that aren't yet stabilized
|
||||
android.suppressUnsupportedOptionWarnings=android.keepWorkerActionServicesBetweenBuilds,\
|
||||
android.experimental.enableNewResourceShrinker.preciseShrinking,\
|
||||
android.enableAppCompileTimeRClass,\
|
||||
android.suppressUnsupportedOptionWarnings
|
||||
|
||||
|
||||
+16
-16
@@ -1,25 +1,25 @@
|
||||
[versions]
|
||||
agp = "8.0.1"
|
||||
kotlin = "1.8.21"
|
||||
agp = "8.9.2"
|
||||
kotlin = "2.1.20"
|
||||
|
||||
[libraries]
|
||||
androidx-activity-ktx = "androidx.activity:activity-ktx:1.7.1"
|
||||
androidx-annotation = "androidx.annotation:annotation:1.6.0"
|
||||
androidx-appcompat = "androidx.appcompat:appcompat:1.6.1"
|
||||
androidx-activity-ktx = "androidx.activity:activity-ktx:1.10.1"
|
||||
androidx-annotation = "androidx.annotation:annotation:1.9.1"
|
||||
androidx-appcompat = "androidx.appcompat:appcompat:1.7.0"
|
||||
androidx-biometric = "androidx.biometric:biometric:1.1.0"
|
||||
androidx-collection = "androidx.collection:collection:1.2.0"
|
||||
androidx-constraintlayout = "androidx.constraintlayout:constraintlayout:2.1.4"
|
||||
androidx-coordinatorlayout = "androidx.coordinatorlayout:coordinatorlayout:1.2.0"
|
||||
androidx-core-ktx = "androidx.core:core-ktx:1.10.0"
|
||||
androidx-datastore-preferences = "androidx.datastore:datastore-preferences:1.0.0"
|
||||
androidx-fragment-ktx = "androidx.fragment:fragment-ktx:1.5.7"
|
||||
androidx-lifecycle-runtime-ktx = "androidx.lifecycle:lifecycle-runtime-ktx:2.6.1"
|
||||
androidx-preference-ktx = "androidx.preference:preference-ktx:1.2.0"
|
||||
desugarJdkLibs = "com.android.tools:desugar_jdk_libs:2.0.3"
|
||||
google-material = "com.google.android.material:material:1.8.0"
|
||||
androidx-collection = "androidx.collection:collection:1.5.0"
|
||||
androidx-constraintlayout = "androidx.constraintlayout:constraintlayout:2.2.1"
|
||||
androidx-coordinatorlayout = "androidx.coordinatorlayout:coordinatorlayout:1.3.0"
|
||||
androidx-core-ktx = "androidx.core:core-ktx:1.16.0"
|
||||
androidx-datastore-preferences = "androidx.datastore:datastore-preferences:1.1.6"
|
||||
androidx-fragment-ktx = "androidx.fragment:fragment-ktx:1.8.6"
|
||||
androidx-lifecycle-runtime-ktx = "androidx.lifecycle:lifecycle-runtime-ktx:2.9.0"
|
||||
androidx-preference-ktx = "androidx.preference:preference-ktx:1.2.1"
|
||||
desugarJdkLibs = "com.android.tools:desugar_jdk_libs:2.1.5"
|
||||
google-material = "com.google.android.material:material:1.12.0"
|
||||
jsr305 = "com.google.code.findbugs:jsr305:3.0.2"
|
||||
junit = "junit:junit:4.13.2"
|
||||
kotlinx-coroutines-android = "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4"
|
||||
kotlinx-coroutines-android = "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3"
|
||||
zxing-android-embedded = "com.journeyapps:zxing-android-embedded:4.3.0"
|
||||
|
||||
[plugins]
|
||||
|
||||
Vendored
BIN
Binary file not shown.
+3
-2
@@ -1,7 +1,8 @@
|
||||
distributionBase=GRADLE_USER_HOME
|
||||
distributionPath=wrapper/dists
|
||||
distributionSha256Sum=e111cb9948407e26351227dabce49822fb88c37ee72f1d1582a69c68af2e702f
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.1.1-bin.zip
|
||||
distributionSha256Sum=61ad310d3c7d3e5da131b76bbf22b5a4c0786e9d892dae8c1658d4b484de3caa
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.14-bin.zip
|
||||
networkTimeout=10000
|
||||
validateDistributionUrl=true
|
||||
zipStoreBase=GRADLE_USER_HOME
|
||||
zipStorePath=wrapper/dists
|
||||
|
||||
@@ -15,6 +15,8 @@
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
#
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#
|
||||
|
||||
##############################################################################
|
||||
#
|
||||
@@ -55,7 +57,7 @@
|
||||
# Darwin, MinGW, and NonStop.
|
||||
#
|
||||
# (3) This script is generated from the Groovy template
|
||||
# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
|
||||
# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
|
||||
# within the Gradle project.
|
||||
#
|
||||
# You can find Gradle at https://github.com/gradle/gradle/.
|
||||
@@ -83,7 +85,9 @@ done
|
||||
# This is normally unused
|
||||
# shellcheck disable=SC2034
|
||||
APP_BASE_NAME=${0##*/}
|
||||
APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit
|
||||
# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036)
|
||||
APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s
|
||||
' "$PWD" ) || exit
|
||||
|
||||
# Use the maximum available, or set MAX_FD != -1 to use that value.
|
||||
MAX_FD=maximum
|
||||
@@ -130,10 +134,13 @@ location of your Java installation."
|
||||
fi
|
||||
else
|
||||
JAVACMD=java
|
||||
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
|
||||
if ! command -v java >/dev/null 2>&1
|
||||
then
|
||||
die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
|
||||
|
||||
Please set the JAVA_HOME variable in your environment to match the
|
||||
location of your Java installation."
|
||||
fi
|
||||
fi
|
||||
|
||||
# Increase the maximum file descriptors if we can.
|
||||
@@ -141,7 +148,7 @@ if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
|
||||
case $MAX_FD in #(
|
||||
max*)
|
||||
# In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked.
|
||||
# shellcheck disable=SC3045
|
||||
# shellcheck disable=SC2039,SC3045
|
||||
MAX_FD=$( ulimit -H -n ) ||
|
||||
warn "Could not query maximum file descriptor limit"
|
||||
esac
|
||||
@@ -149,7 +156,7 @@ if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
|
||||
'' | soft) :;; #(
|
||||
*)
|
||||
# In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked.
|
||||
# shellcheck disable=SC3045
|
||||
# shellcheck disable=SC2039,SC3045
|
||||
ulimit -n "$MAX_FD" ||
|
||||
warn "Could not set maximum file descriptor limit to $MAX_FD"
|
||||
esac
|
||||
@@ -198,11 +205,11 @@ fi
|
||||
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
|
||||
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
|
||||
|
||||
# Collect all arguments for the java command;
|
||||
# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of
|
||||
# shell script including quotes and variable substitutions, so put them in
|
||||
# double quotes to make sure that they get re-expanded; and
|
||||
# * put everything else in single quotes, so that it's not re-expanded.
|
||||
# Collect all arguments for the java command:
|
||||
# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments,
|
||||
# and any embedded shellness will be escaped.
|
||||
# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be
|
||||
# treated as '${Hostname}' itself on the command line.
|
||||
|
||||
set -- \
|
||||
"-Dorg.gradle.appname=$APP_BASE_NAME" \
|
||||
|
||||
+1
-1
@@ -9,7 +9,7 @@ pluginManagement {
|
||||
}
|
||||
|
||||
dependencyResolutionManagement {
|
||||
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
|
||||
repositoriesMode = RepositoriesMode.FAIL_ON_PROJECT_REPOS
|
||||
repositories {
|
||||
google()
|
||||
mavenCentral()
|
||||
|
||||
+7
-1
@@ -1,4 +1,10 @@
|
||||
#!/bin/bash
|
||||
if [[ $# -ne 1 ]]; then
|
||||
echo "Download https://crowdin.com/backend/download/project/wireguard.zip and provide path as argument"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
set -ex
|
||||
curl -Lo - https://crowdin.com/backend/download/project/wireguard.zip | bsdtar -C ui/src/main/res -x -f - --strip-components 5 wireguard-android
|
||||
|
||||
bsdtar -C ui/src/main/res -x -f "$1" --strip-components 5 wireguard-android
|
||||
find ui/src/main/res -name strings.xml -exec bash -c '[[ $(xmllint --xpath "count(//resources/*)" {}) -ne 0 ]] || rm -rf "$(dirname {})"' \;
|
||||
|
||||
+15
-17
@@ -1,4 +1,5 @@
|
||||
@file:Suppress("UnstableApiUsage")
|
||||
|
||||
import org.gradle.api.tasks.testing.logging.TestLogEvent
|
||||
|
||||
val pkg: String = providers.gradleProperty("wireguardPackageName").get()
|
||||
@@ -10,7 +11,7 @@ plugins {
|
||||
}
|
||||
|
||||
android {
|
||||
compileSdk = 33
|
||||
compileSdk = 36
|
||||
compileOptions {
|
||||
sourceCompatibility = JavaVersion.VERSION_17
|
||||
targetCompatibility = JavaVersion.VERSION_17
|
||||
@@ -50,9 +51,6 @@ android {
|
||||
}
|
||||
}
|
||||
}
|
||||
create("googleplay") {
|
||||
initWith(getByName("release"))
|
||||
}
|
||||
}
|
||||
lint {
|
||||
disable += "LongLogTag"
|
||||
@@ -83,30 +81,30 @@ publishing {
|
||||
from(components["release"])
|
||||
}
|
||||
pom {
|
||||
name.set("WireGuard Tunnel Library")
|
||||
description.set("Embeddable tunnel library for WireGuard for Android")
|
||||
url.set("https://www.wireguard.com/")
|
||||
name = "WireGuard Tunnel Library"
|
||||
description = "Embeddable tunnel library for WireGuard for Android"
|
||||
url = "https://www.wireguard.com/"
|
||||
|
||||
licenses {
|
||||
license {
|
||||
name.set("The Apache Software License, Version 2.0")
|
||||
url.set("http://www.apache.org/licenses/LICENSE-2.0.txt")
|
||||
distribution.set("repo")
|
||||
name = "The Apache Software License, Version 2.0"
|
||||
url = "http://www.apache.org/licenses/LICENSE-2.0.txt"
|
||||
distribution = "repo"
|
||||
}
|
||||
}
|
||||
scm {
|
||||
connection.set("scm:git:https://git.zx2c4.com/wireguard-android")
|
||||
developerConnection.set("scm:git:https://git.zx2c4.com/wireguard-android")
|
||||
url.set("https://git.zx2c4.com/wireguard-android")
|
||||
connection = "scm:git:https://git.zx2c4.com/wireguard-android"
|
||||
developerConnection = "scm:git:https://git.zx2c4.com/wireguard-android"
|
||||
url = "https://git.zx2c4.com/wireguard-android"
|
||||
}
|
||||
developers {
|
||||
organization {
|
||||
name.set("WireGuard")
|
||||
url.set("https://www.wireguard.com/")
|
||||
name = "WireGuard"
|
||||
url = "https://www.wireguard.com/"
|
||||
}
|
||||
developer {
|
||||
name.set("WireGuard")
|
||||
email.set("team@wireguard.com")
|
||||
name = "WireGuard"
|
||||
email = "team@wireguard.com"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -21,31 +21,7 @@ import androidx.annotation.Nullable;
|
||||
*/
|
||||
@NonNullForAll
|
||||
public class Statistics {
|
||||
|
||||
// TODO: switch to Java Record class once R8 supports desugaring those.
|
||||
public final class PeerStats {
|
||||
public final long rxBytes, txBytes, latestHandshakeEpochMillis;
|
||||
|
||||
PeerStats(final long rxBytes, final long txBytes, final long latestHandshakeEpochMillis) {
|
||||
this.rxBytes = rxBytes;
|
||||
this.txBytes = txBytes;
|
||||
this.latestHandshakeEpochMillis = latestHandshakeEpochMillis;
|
||||
}
|
||||
|
||||
@Override public boolean equals(final Object o) {
|
||||
if (this == o)
|
||||
return true;
|
||||
if (o == null || getClass() != o.getClass())
|
||||
return false;
|
||||
final PeerStats stats = (PeerStats) o;
|
||||
return rxBytes == stats.rxBytes && txBytes == stats.txBytes && latestHandshakeEpochMillis == stats.latestHandshakeEpochMillis;
|
||||
}
|
||||
|
||||
@Override public int hashCode() {
|
||||
return Objects.hash(rxBytes, txBytes, latestHandshakeEpochMillis);
|
||||
}
|
||||
}
|
||||
|
||||
public record PeerStats(long rxBytes, long txBytes, long latestHandshakeEpochMillis) { }
|
||||
private final Map<Key, PeerStats> stats = new HashMap<>();
|
||||
private long lastTouched = SystemClock.elapsedRealtime();
|
||||
|
||||
@@ -85,7 +61,7 @@ public class Statistics {
|
||||
*/
|
||||
@Nullable
|
||||
public PeerStats peer(final Key peer) {
|
||||
return this.stats.get(peer);
|
||||
return stats.get(peer);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -46,8 +46,8 @@ public class RootShell {
|
||||
final String packageName = context.getPackageName();
|
||||
if (packageName.contains("'"))
|
||||
throw new RuntimeException("Impossibly invalid package name contains a single quote");
|
||||
preamble = String.format("export CALLING_PACKAGE=%s PATH=\"%s:$PATH\" TMPDIR='%s'; magisk --sqlite \"UPDATE policies SET notification=0, logging=0 WHERE package_name='%s'\" >/dev/null 2>&1; id -u\n",
|
||||
packageName, localBinaryDir, localTemporaryDir, packageName);
|
||||
preamble = String.format("export CALLING_PACKAGE='%s' PATH=\"%s:$PATH\" TMPDIR='%s'; magisk --sqlite \"UPDATE policies SET notification=0, logging=0 WHERE uid=%d\" >/dev/null 2>&1; id -u\n",
|
||||
packageName, localBinaryDir, localTemporaryDir, android.os.Process.myUid());
|
||||
}
|
||||
|
||||
private static boolean isExecutableInPath(final String name) {
|
||||
|
||||
@@ -20,12 +20,12 @@ export GOARCH := $(NDK_GO_ARCH_MAP_$(ANDROID_ARCH_NAME))
|
||||
export GOOS := android
|
||||
export CGO_ENABLED := 1
|
||||
|
||||
GO_VERSION := 1.20.3
|
||||
GO_VERSION := 1.24.3
|
||||
GO_PLATFORM := $(shell uname -s | tr '[:upper:]' '[:lower:]')-$(NDK_GO_ARCH_MAP_$(shell uname -m))
|
||||
GO_TARBALL := go$(GO_VERSION).$(GO_PLATFORM).tar.gz
|
||||
GO_HASH_darwin-amd64 := c1e1161d6d859deb576e6cfabeb40e3d042ceb1c6f444f617c3c9d76269c3565
|
||||
GO_HASH_darwin-arm64 := 86b0ed0f2b2df50fa8036eea875d1cf2d76cefdacf247c44639a1464b7e36b95
|
||||
GO_HASH_linux-amd64 := 979694c2c25c735755bf26f4f45e19e64e4811d661dd07b8c010f7a8e18adfca
|
||||
GO_HASH_darwin-amd64 := 13e6fe3fcf65689d77d40e633de1e31c6febbdbcb846eb05fc2434ed2213e92b
|
||||
GO_HASH_darwin-arm64 := 64a3fa22142f627e78fac3018ce3d4aeace68b743eff0afda8aae0411df5e4fb
|
||||
GO_HASH_linux-amd64 := 3333f6ea53afa971e9078895eaa4ac7204a8c6b5c68c10e6bc9a33e8e391bdd8
|
||||
|
||||
default: $(DESTDIR)/libwg-go.so
|
||||
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
module golang.zx2c4.com/wireguard/android
|
||||
|
||||
go 1.20
|
||||
go 1.23.1
|
||||
|
||||
require (
|
||||
golang.org/x/sys v0.6.0
|
||||
golang.zx2c4.com/wireguard v0.0.0-20230223181233-21636207a675
|
||||
golang.org/x/sys v0.33.0
|
||||
golang.zx2c4.com/wireguard v0.0.0-20250515145403-1571e0fbae8e
|
||||
)
|
||||
|
||||
require (
|
||||
golang.org/x/crypto v0.7.0 // indirect
|
||||
golang.org/x/net v0.8.0 // indirect
|
||||
golang.org/x/crypto v0.38.0 // indirect
|
||||
golang.org/x/net v0.40.0 // indirect
|
||||
golang.zx2c4.com/wintun v0.0.0-20230126152724-0fa3db229ce2 // indirect
|
||||
)
|
||||
|
||||
@@ -1,10 +1,18 @@
|
||||
golang.org/x/crypto v0.7.0 h1:AvwMYaRytfdeVt3u6mLaxYtErKYjxA2OXjJ1HHq6t3A=
|
||||
golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU=
|
||||
golang.org/x/net v0.8.0 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ=
|
||||
golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc=
|
||||
golang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ=
|
||||
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
github.com/google/btree v1.1.2 h1:xf4v41cLI2Z6FxbKm+8Bu+m8ifhj15JuZ9sa0jZCMUU=
|
||||
github.com/google/btree v1.1.2/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4=
|
||||
golang.org/x/crypto v0.38.0 h1:jt+WWG8IZlBnVbomuhg2Mdq0+BBQaHbtqHEFEigjUV8=
|
||||
golang.org/x/crypto v0.38.0/go.mod h1:MvrbAqul58NNYPKnOra203SB9vpuZW0e+RRZV+Ggqjw=
|
||||
golang.org/x/net v0.40.0 h1:79Xs7wF06Gbdcg4kdCCIQArK11Z1hr5POQ6+fIYHNuY=
|
||||
golang.org/x/net v0.40.0/go.mod h1:y0hY0exeL2Pku80/zKK7tpntoX23cqL3Oa6njdgRtds=
|
||||
golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw=
|
||||
golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
|
||||
golang.org/x/time v0.7.0 h1:ntUhktv3OPE6TgYxXWv9vKvUSJyIFJlyohwbkEwPrKQ=
|
||||
golang.org/x/time v0.7.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
|
||||
golang.zx2c4.com/wintun v0.0.0-20230126152724-0fa3db229ce2 h1:B82qJJgjvYKsXS9jeunTOisW56dUokqW/FOteYJJ/yg=
|
||||
golang.zx2c4.com/wintun v0.0.0-20230126152724-0fa3db229ce2/go.mod h1:deeaetjYA+DHMHg+sMSMI58GrEteJUUzzw7en6TJQcI=
|
||||
golang.zx2c4.com/wireguard v0.0.0-20230223181233-21636207a675 h1:/J/RVnr7ng4fWPRH3xa4WtBJ1Jp+Auu4YNLmGiPv5QU=
|
||||
golang.zx2c4.com/wireguard v0.0.0-20230223181233-21636207a675/go.mod h1:whfbyDBt09xhCYQWtO2+3UVjlaq6/9hDZrjg2ZE6SyA=
|
||||
golang.zx2c4.com/wireguard v0.0.0-20250515144814-842888ac5c93 h1:7ZEIuxqu71NkNE9klltGsEqv3tiXkUHlZ6aapRGhwwg=
|
||||
golang.zx2c4.com/wireguard v0.0.0-20250515144814-842888ac5c93/go.mod h1:rpwXGsirqLqN2L0JDJQlwOboGHmptD5ZD6T2VmcqhTw=
|
||||
golang.zx2c4.com/wireguard v0.0.0-20250515145403-1571e0fbae8e h1:ZB5hAWug6qfyDjed7y2uJB6f1ufSJfJok753/GQ1kCA=
|
||||
golang.zx2c4.com/wireguard v0.0.0-20250515145403-1571e0fbae8e/go.mod h1:rpwXGsirqLqN2L0JDJQlwOboGHmptD5ZD6T2VmcqhTw=
|
||||
gvisor.dev/gvisor v0.0.0-20250503011706-39ed1f5ac29c h1:m/r7OM+Y2Ty1sgBQ7Qb27VgIMBW8ZZhT4gLnUyDIhzI=
|
||||
gvisor.dev/gvisor v0.0.0-20250503011706-39ed1f5ac29c/go.mod h1:3r5CMtNQMKIvBlrmM9xWUNamjKBYPOWyXOjmg5Kts3g=
|
||||
|
||||
+9
-5
@@ -1,4 +1,5 @@
|
||||
@file:Suppress("UnstableApiUsage")
|
||||
|
||||
import org.jetbrains.kotlin.gradle.dsl.JvmTarget
|
||||
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
|
||||
|
||||
@@ -11,7 +12,7 @@ plugins {
|
||||
}
|
||||
|
||||
android {
|
||||
compileSdk = 33
|
||||
compileSdk = 36
|
||||
buildFeatures {
|
||||
buildConfig = true
|
||||
dataBinding = true
|
||||
@@ -21,11 +22,10 @@ android {
|
||||
defaultConfig {
|
||||
applicationId = pkg
|
||||
minSdk = 21
|
||||
targetSdk = 33
|
||||
targetSdk = 36
|
||||
versionCode = providers.gradleProperty("wireguardVersionCode").get().toInt()
|
||||
versionName = providers.gradleProperty("wireguardVersionName").get()
|
||||
buildConfigField("int", "MIN_SDK_VERSION", minSdk.toString())
|
||||
buildConfigField("boolean", "IS_GOOGLE_PLAY", false.toString())
|
||||
}
|
||||
compileOptions {
|
||||
sourceCompatibility = JavaVersion.VERSION_17
|
||||
@@ -41,6 +41,7 @@ android {
|
||||
resources {
|
||||
excludes += "DebugProbesKt.bin"
|
||||
excludes += "kotlin-tooling-metadata.json"
|
||||
excludes += "META-INF/*.version"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -50,9 +51,12 @@ android {
|
||||
}
|
||||
create("googleplay") {
|
||||
initWith(getByName("release"))
|
||||
buildConfigField("boolean", "IS_GOOGLE_PLAY", true.toString())
|
||||
matchingFallbacks += "release"
|
||||
}
|
||||
}
|
||||
androidResources {
|
||||
generateLocaleConfig = true
|
||||
}
|
||||
lint {
|
||||
disable += "LongLogTag"
|
||||
warning += "MissingTranslation"
|
||||
@@ -85,5 +89,5 @@ tasks.withType<JavaCompile>().configureEach {
|
||||
}
|
||||
|
||||
tasks.withType<KotlinCompile>().configureEach {
|
||||
compilerOptions.jvmTarget.set(JvmTarget.JVM_17)
|
||||
compilerOptions.jvmTarget = JvmTarget.JVM_17
|
||||
}
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:tools="http://schemas.android.com/tools">
|
||||
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" tools:node="remove" />
|
||||
<application>
|
||||
<receiver android:name=".updater.Updater$AppUpdatedReceiver" tools:node="remove" />
|
||||
</application>
|
||||
|
||||
<uses-permission
|
||||
android:name="android.permission.REQUEST_INSTALL_PACKAGES"
|
||||
tools:node="remove" />
|
||||
</manifest>
|
||||
|
||||
@@ -7,6 +7,9 @@
|
||||
<uses-permission android:name="android.permission.INTERNET" />
|
||||
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
|
||||
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
|
||||
<uses-permission
|
||||
android:name="android.permission.SYSTEM_ALERT_WINDOW"
|
||||
android:minSdkVersion="34" />
|
||||
<uses-permission
|
||||
android:name="android.permission.WRITE_EXTERNAL_STORAGE"
|
||||
android:maxSdkVersion="28"
|
||||
@@ -45,10 +48,12 @@
|
||||
|
||||
<activity
|
||||
android:name=".activity.TunnelToggleActivity"
|
||||
android:theme="@style/NoBackgroundTheme"
|
||||
android:excludeFromRecents="true"/>
|
||||
android:excludeFromRecents="true"
|
||||
android:theme="@style/NoBackgroundTheme" />
|
||||
|
||||
<activity android:name=".activity.MainActivity" android:exported="true">
|
||||
<activity
|
||||
android:name=".activity.MainActivity"
|
||||
android:exported="true">
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.MAIN" />
|
||||
|
||||
@@ -62,8 +67,8 @@
|
||||
|
||||
<activity
|
||||
android:name=".activity.TvMainActivity"
|
||||
android:theme="@style/TvTheme"
|
||||
android:exported="true">
|
||||
android:exported="true"
|
||||
android:theme="@style/TvTheme">
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.MAIN" />
|
||||
<category android:name="android.intent.category.LEANBACK_LAUNCHER" />
|
||||
@@ -87,8 +92,8 @@
|
||||
|
||||
<activity
|
||||
android:name=".activity.LogViewerActivity"
|
||||
android:label="@string/log_viewer_title"
|
||||
android:exported="false">
|
||||
android:exported="false"
|
||||
android:label="@string/log_viewer_title">
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.MAIN" />
|
||||
</intent-filter>
|
||||
@@ -100,14 +105,18 @@
|
||||
android:exported="false"
|
||||
android:grantUriPermissions="true" />
|
||||
|
||||
<receiver android:name=".BootShutdownReceiver" android:exported="true">
|
||||
<receiver
|
||||
android:name=".BootShutdownReceiver"
|
||||
android:exported="true">
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.ACTION_SHUTDOWN" />
|
||||
<action android:name="android.intent.action.BOOT_COMPLETED" />
|
||||
</intent-filter>
|
||||
</receiver>
|
||||
|
||||
<receiver android:name=".updater.Updater$AppUpdatedReceiver" android:exported="true">
|
||||
<receiver
|
||||
android:name=".updater.Updater$AppUpdatedReceiver"
|
||||
android:exported="true">
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.MY_PACKAGE_REPLACED" />
|
||||
</intent-filter>
|
||||
@@ -115,8 +124,8 @@
|
||||
|
||||
<receiver
|
||||
android:name=".model.TunnelManager$IntentReceiver"
|
||||
android:permission="${applicationId}.permission.CONTROL_TUNNELS"
|
||||
android:exported="true">
|
||||
android:exported="true"
|
||||
android:permission="${applicationId}.permission.CONTROL_TUNNELS">
|
||||
<intent-filter>
|
||||
<action android:name="com.wireguard.android.action.REFRESH_TUNNEL_STATES" />
|
||||
<action android:name="com.wireguard.android.action.SET_TUNNEL_UP" />
|
||||
@@ -126,9 +135,9 @@
|
||||
|
||||
<service
|
||||
android:name=".QuickTileService"
|
||||
android:exported="true"
|
||||
android:icon="@drawable/ic_tile"
|
||||
android:permission="android.permission.BIND_QUICK_SETTINGS_TILE"
|
||||
android:exported="true">
|
||||
android:permission="android.permission.BIND_QUICK_SETTINGS_TILE">
|
||||
|
||||
<intent-filter>
|
||||
<action android:name="android.service.quicksettings.action.QS_TILE" />
|
||||
@@ -137,6 +146,10 @@
|
||||
<meta-data
|
||||
android:name="android.service.quicksettings.ACTIVE_TILE"
|
||||
android:value="false" />
|
||||
|
||||
<meta-data
|
||||
android:name="android.service.quicksettings.TOGGLEABLE_TILE"
|
||||
android:value="true" />
|
||||
</service>
|
||||
|
||||
<meta-data
|
||||
|
||||
@@ -4,12 +4,15 @@
|
||||
*/
|
||||
package com.wireguard.android
|
||||
|
||||
import android.app.PendingIntent
|
||||
import android.content.Intent
|
||||
import android.graphics.Bitmap
|
||||
import android.graphics.Canvas
|
||||
import android.graphics.drawable.Icon
|
||||
import android.net.Uri
|
||||
import android.os.Build
|
||||
import android.os.IBinder
|
||||
import android.provider.Settings
|
||||
import android.service.quicksettings.Tile
|
||||
import android.service.quicksettings.TileService
|
||||
import android.util.Log
|
||||
@@ -49,32 +52,42 @@ class QuickTileService : TileService() {
|
||||
}
|
||||
|
||||
override fun onClick() {
|
||||
if (tunnel != null) {
|
||||
unlockAndRun {
|
||||
val tile = qsTile
|
||||
if (tile != null) {
|
||||
tile.icon = if (tile.icon == iconOn) iconOff else iconOn
|
||||
tile.updateTile()
|
||||
when (val tunnel = tunnel) {
|
||||
null -> {
|
||||
val intent = Intent(this, MainActivity::class.java)
|
||||
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) {
|
||||
startActivityAndCollapse(PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_IMMUTABLE))
|
||||
} else {
|
||||
@Suppress("DEPRECATION")
|
||||
startActivityAndCollapse(intent)
|
||||
}
|
||||
applicationScope.launch {
|
||||
try {
|
||||
tunnel!!.setStateAsync(Tunnel.State.TOGGLE)
|
||||
updateTile()
|
||||
} catch (_: Throwable) {
|
||||
val toggleIntent = Intent(this@QuickTileService, TunnelToggleActivity::class.java)
|
||||
toggleIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
|
||||
startActivity(toggleIntent)
|
||||
}
|
||||
else -> {
|
||||
unlockAndRun {
|
||||
applicationScope.launch {
|
||||
try {
|
||||
tunnel.setStateAsync(Tunnel.State.TOGGLE)
|
||||
updateTile()
|
||||
} catch (_: Throwable) {
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE && !Settings.canDrawOverlays(this@QuickTileService)) {
|
||||
val permissionIntent = Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse("package:$packageName"))
|
||||
permissionIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
|
||||
startActivityAndCollapse(PendingIntent.getActivity(this@QuickTileService, 0, permissionIntent, PendingIntent.FLAG_IMMUTABLE))
|
||||
return@launch
|
||||
}
|
||||
val toggleIntent = Intent(this@QuickTileService, TunnelToggleActivity::class.java)
|
||||
toggleIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
|
||||
startActivity(toggleIntent)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
val intent = Intent(this, MainActivity::class.java)
|
||||
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
|
||||
startActivityAndCollapse(intent)
|
||||
}
|
||||
}
|
||||
|
||||
override fun onCreate() {
|
||||
isAdded = true
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
|
||||
iconOn = Icon.createWithResource(this, R.drawable.ic_tile)
|
||||
iconOff = iconOn
|
||||
@@ -84,55 +97,64 @@ class QuickTileService : TileService() {
|
||||
icon.setAnimationEnabled(false) /* Unfortunately we can't have animations, since Icons are marshaled. */
|
||||
icon.setSlashed(false)
|
||||
var b = Bitmap.createBitmap(icon.intrinsicWidth, icon.intrinsicHeight, Bitmap.Config.ARGB_8888)
|
||||
?: return
|
||||
var c = Canvas(b)
|
||||
icon.setBounds(0, 0, c.width, c.height)
|
||||
icon.draw(c)
|
||||
iconOn = Icon.createWithBitmap(b)
|
||||
icon.setSlashed(true)
|
||||
b = Bitmap.createBitmap(icon.intrinsicWidth, icon.intrinsicHeight, Bitmap.Config.ARGB_8888)
|
||||
?: return
|
||||
c = Canvas(b)
|
||||
icon.setBounds(0, 0, c.width, c.height)
|
||||
icon.draw(c)
|
||||
iconOff = Icon.createWithBitmap(b)
|
||||
}
|
||||
|
||||
override fun onDestroy() {
|
||||
super.onDestroy()
|
||||
isAdded = false
|
||||
}
|
||||
|
||||
override fun onStartListening() {
|
||||
Application.getTunnelManager().addOnPropertyChangedCallback(onTunnelChangedCallback)
|
||||
if (tunnel != null) tunnel!!.addOnPropertyChangedCallback(onStateChangedCallback)
|
||||
tunnel?.addOnPropertyChangedCallback(onStateChangedCallback)
|
||||
updateTile()
|
||||
}
|
||||
|
||||
override fun onStopListening() {
|
||||
if (tunnel != null) tunnel!!.removeOnPropertyChangedCallback(onStateChangedCallback)
|
||||
tunnel?.removeOnPropertyChangedCallback(onStateChangedCallback)
|
||||
Application.getTunnelManager().removeOnPropertyChangedCallback(onTunnelChangedCallback)
|
||||
}
|
||||
|
||||
override fun onTileAdded() {
|
||||
isAdded = true
|
||||
}
|
||||
|
||||
override fun onTileRemoved() {
|
||||
isAdded = false
|
||||
}
|
||||
|
||||
private fun updateTile() {
|
||||
// Update the tunnel.
|
||||
val newTunnel = Application.getTunnelManager().lastUsedTunnel
|
||||
if (newTunnel != tunnel) {
|
||||
if (tunnel != null) tunnel!!.removeOnPropertyChangedCallback(onStateChangedCallback)
|
||||
tunnel?.removeOnPropertyChangedCallback(onStateChangedCallback)
|
||||
tunnel = newTunnel
|
||||
if (tunnel != null) tunnel!!.addOnPropertyChangedCallback(onStateChangedCallback)
|
||||
tunnel?.addOnPropertyChangedCallback(onStateChangedCallback)
|
||||
}
|
||||
// Update the tile contents.
|
||||
val label: String
|
||||
val state: Int
|
||||
val tile = qsTile
|
||||
if (tunnel != null) {
|
||||
label = tunnel!!.name
|
||||
state = if (tunnel!!.state == Tunnel.State.UP) Tile.STATE_ACTIVE else Tile.STATE_INACTIVE
|
||||
} else {
|
||||
label = getString(R.string.app_name)
|
||||
state = Tile.STATE_INACTIVE
|
||||
}
|
||||
if (tile == null) return
|
||||
tile.label = label
|
||||
if (tile.state != state) {
|
||||
tile.icon = if (state == Tile.STATE_ACTIVE) iconOn else iconOff
|
||||
tile.state = state
|
||||
val tile = qsTile ?: return
|
||||
|
||||
when (val tunnel = tunnel) {
|
||||
null -> {
|
||||
tile.label = getString(R.string.app_name)
|
||||
tile.state = Tile.STATE_INACTIVE
|
||||
tile.icon = iconOff
|
||||
}
|
||||
else -> {
|
||||
tile.label = tunnel.name
|
||||
tile.state = if (tunnel.state == Tunnel.State.UP) Tile.STATE_ACTIVE else Tile.STATE_INACTIVE
|
||||
tile.icon = if (tunnel.state == Tunnel.State.UP) iconOn else iconOff
|
||||
}
|
||||
}
|
||||
tile.updateTile()
|
||||
}
|
||||
@@ -143,19 +165,23 @@ class QuickTileService : TileService() {
|
||||
sender.removeOnPropertyChangedCallback(this)
|
||||
return
|
||||
}
|
||||
if (propertyId != 0 && propertyId != BR.state) return
|
||||
if (propertyId != 0 && propertyId != BR.state)
|
||||
return
|
||||
updateTile()
|
||||
}
|
||||
}
|
||||
|
||||
private inner class OnTunnelChangedCallback : OnPropertyChangedCallback() {
|
||||
override fun onPropertyChanged(sender: Observable, propertyId: Int) {
|
||||
if (propertyId != 0 && propertyId != BR.lastUsedTunnel) return
|
||||
if (propertyId != 0 && propertyId != BR.lastUsedTunnel)
|
||||
return
|
||||
updateTile()
|
||||
}
|
||||
}
|
||||
|
||||
companion object {
|
||||
private const val TAG = "WireGuard/QuickTileService"
|
||||
var isAdded: Boolean = false
|
||||
private set
|
||||
}
|
||||
}
|
||||
|
||||
@@ -67,7 +67,8 @@ abstract class BaseActivity : AppCompatActivity() {
|
||||
protected abstract fun onSelectedTunnelChanged(oldTunnel: ObservableTunnel?, newTunnel: ObservableTunnel?): Boolean
|
||||
|
||||
fun removeOnSelectedTunnelChangedListener(
|
||||
listener: OnSelectedTunnelChangedListener) {
|
||||
listener: OnSelectedTunnelChangedListener
|
||||
) {
|
||||
selectionChangeRegistry.remove(listener)
|
||||
}
|
||||
|
||||
@@ -77,17 +78,17 @@ abstract class BaseActivity : AppCompatActivity() {
|
||||
|
||||
private class SelectionChangeNotifier : NotifierCallback<OnSelectedTunnelChangedListener, ObservableTunnel, ObservableTunnel>() {
|
||||
override fun onNotifyCallback(
|
||||
listener: OnSelectedTunnelChangedListener,
|
||||
oldTunnel: ObservableTunnel?,
|
||||
ignored: Int,
|
||||
newTunnel: ObservableTunnel?
|
||||
listener: OnSelectedTunnelChangedListener,
|
||||
oldTunnel: ObservableTunnel?,
|
||||
ignored: Int,
|
||||
newTunnel: ObservableTunnel?
|
||||
) {
|
||||
listener.onSelectedTunnelChanged(oldTunnel, newTunnel)
|
||||
}
|
||||
}
|
||||
|
||||
private class SelectionChangeRegistry :
|
||||
CallbackRegistry<OnSelectedTunnelChangedListener, ObservableTunnel, ObservableTunnel>(SelectionChangeNotifier())
|
||||
CallbackRegistry<OnSelectedTunnelChangedListener, ObservableTunnel, ObservableTunnel>(SelectionChangeNotifier())
|
||||
|
||||
companion object {
|
||||
private const val KEY_SELECTED_TUNNEL = "selected_tunnel"
|
||||
|
||||
@@ -112,19 +112,21 @@ class LogViewerActivity : AppCompatActivity() {
|
||||
}
|
||||
|
||||
binding.shareFab.setOnClickListener {
|
||||
revokeLastUri()
|
||||
val key = KeyPair().privateKey.toHex()
|
||||
LOGS[key] = rawLogBytes()
|
||||
lastUri = Uri.parse("content://${BuildConfig.APPLICATION_ID}.exported-log/$key")
|
||||
val shareIntent = ShareCompat.IntentBuilder(this)
|
||||
lifecycleScope.launch {
|
||||
revokeLastUri()
|
||||
val key = KeyPair().privateKey.toHex()
|
||||
LOGS[key] = rawLogBytes()
|
||||
lastUri = Uri.parse("content://${BuildConfig.APPLICATION_ID}.exported-log/$key")
|
||||
val shareIntent = ShareCompat.IntentBuilder(this@LogViewerActivity)
|
||||
.setType("text/plain")
|
||||
.setSubject(getString(R.string.log_export_subject))
|
||||
.setStream(lastUri)
|
||||
.setChooserTitle(R.string.log_export_title)
|
||||
.createChooserIntent()
|
||||
.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
|
||||
grantUriPermission("android", lastUri, Intent.FLAG_GRANT_READ_URI_PERMISSION)
|
||||
revokeLastActivityResultLauncher.launch(shareIntent)
|
||||
grantUriPermission("android", lastUri, Intent.FLAG_GRANT_READ_URI_PERMISSION)
|
||||
revokeLastActivityResultLauncher.launch(shareIntent)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -140,22 +142,26 @@ class LogViewerActivity : AppCompatActivity() {
|
||||
finish()
|
||||
true
|
||||
}
|
||||
|
||||
R.id.save_log -> {
|
||||
saveButton?.isEnabled = false
|
||||
lifecycleScope.launch { saveLog() }
|
||||
true
|
||||
}
|
||||
|
||||
else -> super.onOptionsItemSelected(item)
|
||||
}
|
||||
}
|
||||
|
||||
private val downloadsFileSaver = DownloadsFileSaver(this)
|
||||
|
||||
private fun rawLogBytes() : ByteArray {
|
||||
private suspend fun rawLogBytes(): ByteArray {
|
||||
val builder = StringBuilder()
|
||||
for (i in 0 until rawLogLines.size()) {
|
||||
builder.append(rawLogLines[i])
|
||||
builder.append('\n')
|
||||
withContext(Dispatchers.IO) {
|
||||
for (i in 0 until rawLogLines.size()) {
|
||||
builder.append(rawLogLines[i])
|
||||
builder.append('\n')
|
||||
}
|
||||
}
|
||||
return builder.toString().toByteArray(Charsets.UTF_8)
|
||||
}
|
||||
@@ -175,12 +181,14 @@ class LogViewerActivity : AppCompatActivity() {
|
||||
saveButton?.isEnabled = true
|
||||
if (outputFile == null)
|
||||
return
|
||||
Snackbar.make(findViewById(android.R.id.content),
|
||||
if (exception == null) getString(R.string.log_export_success, outputFile?.fileName)
|
||||
else getString(R.string.log_export_error, ErrorMessages[exception]),
|
||||
if (exception == null) Snackbar.LENGTH_SHORT else Snackbar.LENGTH_LONG)
|
||||
.setAnchorView(binding.shareFab)
|
||||
.show()
|
||||
Snackbar.make(
|
||||
findViewById(android.R.id.content),
|
||||
if (exception == null) getString(R.string.log_export_success, outputFile?.fileName)
|
||||
else getString(R.string.log_export_error, ErrorMessages[exception]),
|
||||
if (exception == null) Snackbar.LENGTH_SHORT else Snackbar.LENGTH_LONG
|
||||
)
|
||||
.setAnchorView(binding.shareFab)
|
||||
.show()
|
||||
}
|
||||
|
||||
private suspend fun streamingLog() = withContext(Dispatchers.IO) {
|
||||
@@ -215,7 +223,7 @@ class LogViewerActivity : AppCompatActivity() {
|
||||
} else {
|
||||
if (bufferedLogLines.isNotEmpty()) {
|
||||
bufferedLogLines.last().msg += "\n$line"
|
||||
} else if (!logLines.isEmpty) {
|
||||
} else if (!logLines.isEmpty()) {
|
||||
logLines[logLines.size() - 1].msg += "\n$line"
|
||||
priorModified = true
|
||||
}
|
||||
@@ -283,7 +291,8 @@ class LogViewerActivity : AppCompatActivity() {
|
||||
*
|
||||
* <pre>05-26 11:02:36.886 5689 5689 D AndroidRuntime: CheckJNI is OFF.</pre>
|
||||
*/
|
||||
private val THREADTIME_LINE: Pattern = Pattern.compile("^(\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}.\\d{3})(?:\\s+[0-9A-Za-z]+)?\\s+(\\d+)\\s+(\\d+)\\s+([A-Z])\\s+(.+?)\\s*: (.*)$")
|
||||
private val THREADTIME_LINE: Pattern =
|
||||
Pattern.compile("^(\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}.\\d{3})(?:\\s+[0-9A-Za-z]+)?\\s+(\\d+)\\s+(\\d+)\\s+([A-Z])\\s+(.+?)\\s*: (.*)$")
|
||||
private val LOGS: MutableMap<String, ByteArray> = ConcurrentHashMap()
|
||||
private const val TAG = "WireGuard/LogViewerActivity"
|
||||
}
|
||||
@@ -306,7 +315,7 @@ class LogViewerActivity : AppCompatActivity() {
|
||||
|
||||
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
|
||||
val view = LayoutInflater.from(parent.context)
|
||||
.inflate(R.layout.log_viewer_entry, parent, false)
|
||||
.inflate(R.layout.log_viewer_entry, parent, false)
|
||||
return ViewHolder(view)
|
||||
}
|
||||
|
||||
@@ -317,8 +326,10 @@ class LogViewerActivity : AppCompatActivity() {
|
||||
else
|
||||
SpannableString("${line.tag}: ${line.msg}").apply {
|
||||
setSpan(StyleSpan(BOLD), 0, "${line.tag}:".length, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
|
||||
setSpan(ForegroundColorSpan(levelToColor(line.level)),
|
||||
0, "${line.tag}:".length, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
|
||||
setSpan(
|
||||
ForegroundColorSpan(levelToColor(line.level)),
|
||||
0, "${line.tag}:".length, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
|
||||
)
|
||||
}
|
||||
holder.layout.apply {
|
||||
findViewById<MaterialTextView>(R.id.log_date).text = line.time.toString()
|
||||
@@ -340,11 +351,11 @@ class LogViewerActivity : AppCompatActivity() {
|
||||
override fun insert(uri: Uri, values: ContentValues?): Uri? = null
|
||||
|
||||
override fun query(uri: Uri, projection: Array<out String>?, selection: String?, selectionArgs: Array<out String>?, sortOrder: String?): Cursor? =
|
||||
logForUri(uri)?.let {
|
||||
val m = MatrixCursor(arrayOf(android.provider.OpenableColumns.DISPLAY_NAME, android.provider.OpenableColumns.SIZE), 1)
|
||||
m.addRow(arrayOf("wireguard-log.txt", it.size.toLong()))
|
||||
m
|
||||
}
|
||||
logForUri(uri)?.let {
|
||||
val m = MatrixCursor(arrayOf(android.provider.OpenableColumns.DISPLAY_NAME, android.provider.OpenableColumns.SIZE), 1)
|
||||
m.addRow(arrayOf<Any>("wireguard-log.txt", it.size.toLong()))
|
||||
m
|
||||
}
|
||||
|
||||
override fun onCreate(): Boolean = true
|
||||
|
||||
@@ -354,7 +365,8 @@ class LogViewerActivity : AppCompatActivity() {
|
||||
|
||||
override fun getType(uri: Uri): String? = logForUri(uri)?.let { "text/plain" }
|
||||
|
||||
override fun getStreamTypes(uri: Uri, mimeTypeFilter: String): Array<String>? = getType(uri)?.let { if (compareMimeTypes(it, mimeTypeFilter)) arrayOf(it) else null }
|
||||
override fun getStreamTypes(uri: Uri, mimeTypeFilter: String): Array<String>? =
|
||||
getType(uri)?.let { if (compareMimeTypes(it, mimeTypeFilter)) arrayOf(it) else null }
|
||||
|
||||
override fun openFile(uri: Uri, mode: String): ParcelFileDescriptor? {
|
||||
if (mode != "r") return null
|
||||
|
||||
@@ -77,6 +77,7 @@ class MainActivity : BaseActivity(), FragmentManager.OnBackStackChangedListener
|
||||
onBackPressedDispatcher.onBackPressed()
|
||||
true
|
||||
}
|
||||
|
||||
R.id.menu_action_edit -> {
|
||||
supportFragmentManager.commit {
|
||||
replace(R.id.detail_container, TunnelEditorFragment())
|
||||
@@ -91,12 +92,15 @@ class MainActivity : BaseActivity(), FragmentManager.OnBackStackChangedListener
|
||||
startActivity(Intent(this, SettingsActivity::class.java))
|
||||
true
|
||||
}
|
||||
|
||||
else -> super.onOptionsItemSelected(item)
|
||||
}
|
||||
}
|
||||
|
||||
override fun onSelectedTunnelChanged(oldTunnel: ObservableTunnel?,
|
||||
newTunnel: ObservableTunnel?): Boolean {
|
||||
override fun onSelectedTunnelChanged(
|
||||
oldTunnel: ObservableTunnel?,
|
||||
newTunnel: ObservableTunnel?
|
||||
): Boolean {
|
||||
val fragmentManager = supportFragmentManager
|
||||
if (fragmentManager.isStateSaved) {
|
||||
return false
|
||||
|
||||
@@ -7,13 +7,20 @@ package com.wireguard.android.activity
|
||||
import android.content.Intent
|
||||
import android.os.Build
|
||||
import android.os.Bundle
|
||||
import android.view.LayoutInflater
|
||||
import android.view.MenuItem
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import androidx.appcompat.app.AppCompatActivity
|
||||
import androidx.core.view.ViewCompat
|
||||
import androidx.core.view.WindowInsetsCompat
|
||||
import androidx.core.view.updateLayoutParams
|
||||
import androidx.fragment.app.commit
|
||||
import androidx.lifecycle.lifecycleScope
|
||||
import androidx.preference.Preference
|
||||
import androidx.preference.PreferenceFragmentCompat
|
||||
import com.wireguard.android.Application
|
||||
import com.wireguard.android.QuickTileService
|
||||
import com.wireguard.android.R
|
||||
import com.wireguard.android.backend.WgQuickBackend
|
||||
import com.wireguard.android.preference.PreferencesPreferenceDataStore
|
||||
@@ -44,10 +51,34 @@ class SettingsActivity : AppCompatActivity() {
|
||||
}
|
||||
|
||||
class SettingsFragment : PreferenceFragmentCompat() {
|
||||
|
||||
// Since this is pretty much abandoned by androidx, it never got updated for proper EdgeToEdge support,
|
||||
// which is enabled everywhere for API 35. So handle the insets manually here.
|
||||
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
|
||||
val view = super.onCreateView(inflater, container, savedInstanceState)
|
||||
ViewCompat.setOnApplyWindowInsetsListener(view) { v, windowInsets ->
|
||||
val insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars())
|
||||
v.updateLayoutParams<ViewGroup.MarginLayoutParams> {
|
||||
leftMargin = insets.left
|
||||
bottomMargin = insets.bottom
|
||||
rightMargin = insets.right
|
||||
topMargin = insets.top
|
||||
}
|
||||
WindowInsetsCompat.CONSUMED
|
||||
}
|
||||
return view
|
||||
}
|
||||
|
||||
override fun onCreatePreferences(savedInstanceState: Bundle?, key: String?) {
|
||||
preferenceManager.preferenceDataStore = PreferencesPreferenceDataStore(lifecycleScope, Application.getPreferencesDataStore())
|
||||
addPreferencesFromResource(R.xml.preferences)
|
||||
preferenceScreen.initialExpandedChildrenCount = 4
|
||||
preferenceScreen.initialExpandedChildrenCount = 5
|
||||
|
||||
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU || QuickTileService.isAdded) {
|
||||
val quickTile = preferenceManager.findPreference<Preference>("quick_tile")
|
||||
quickTile?.parent?.removePreference(quickTile)
|
||||
--preferenceScreen.initialExpandedChildrenCount
|
||||
}
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
|
||||
val darkTheme = preferenceManager.findPreference<Preference>("dark_theme")
|
||||
darkTheme?.parent?.removePreference(darkTheme)
|
||||
@@ -62,9 +93,9 @@ class SettingsActivity : AppCompatActivity() {
|
||||
zipExporter?.parent?.removePreference(zipExporter)
|
||||
}
|
||||
val wgQuickOnlyPrefs = arrayOf(
|
||||
preferenceManager.findPreference("tools_installer"),
|
||||
preferenceManager.findPreference("restore_on_boot"),
|
||||
preferenceManager.findPreference<Preference>("multiple_tunnels")
|
||||
preferenceManager.findPreference("tools_installer"),
|
||||
preferenceManager.findPreference("restore_on_boot"),
|
||||
preferenceManager.findPreference<Preference>("multiple_tunnels")
|
||||
).filterNotNull()
|
||||
wgQuickOnlyPrefs.forEach { it.isVisible = false }
|
||||
lifecycleScope.launch {
|
||||
|
||||
@@ -24,7 +24,8 @@ import kotlinx.coroutines.launch
|
||||
|
||||
@RequiresApi(Build.VERSION_CODES.N)
|
||||
class TunnelToggleActivity : AppCompatActivity() {
|
||||
private val permissionActivityResultLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { toggleTunnelWithPermissionsResult() }
|
||||
private val permissionActivityResultLauncher =
|
||||
registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { toggleTunnelWithPermissionsResult() }
|
||||
|
||||
private fun toggleTunnelWithPermissionsResult() {
|
||||
val tunnel = Application.getTunnelManager().lastUsedTunnel ?: return
|
||||
|
||||
@@ -211,12 +211,13 @@ class TvMainActivity : AppCompatActivity() {
|
||||
try {
|
||||
tunnelFileImportResultLauncher.launch("*/*")
|
||||
} catch (_: Throwable) {
|
||||
MaterialAlertDialogBuilder(binding.root.context).setMessage(R.string.tv_no_file_picker).setCancelable(false).setPositiveButton(android.R.string.ok) { _, _ ->
|
||||
try {
|
||||
startActivity(Intent(Intent.ACTION_VIEW, Uri.parse("market://webstoreredirect")))
|
||||
} catch (_: Throwable) {
|
||||
}
|
||||
}.show()
|
||||
MaterialAlertDialogBuilder(binding.root.context).setMessage(R.string.tv_no_file_picker).setCancelable(false)
|
||||
.setPositiveButton(android.R.string.ok) { _, _ ->
|
||||
try {
|
||||
startActivity(Intent(Intent.ACTION_VIEW, Uri.parse("market://webstoreredirect")))
|
||||
} catch (_: Throwable) {
|
||||
}
|
||||
}.show()
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -359,6 +360,7 @@ class TvMainActivity : AppCompatActivity() {
|
||||
binding.tunnelList.requestFocus()
|
||||
}
|
||||
}
|
||||
|
||||
filesRoot.get()?.isNotEmpty() == true -> {
|
||||
files.clear()
|
||||
filesRoot.set("")
|
||||
@@ -372,7 +374,7 @@ class TvMainActivity : AppCompatActivity() {
|
||||
private suspend fun updateStats() {
|
||||
binding.tunnelList.forEach { viewItem ->
|
||||
val listItem = DataBindingUtil.findBinding<TvTunnelListItemBinding>(viewItem)
|
||||
?: return@forEach
|
||||
?: return@forEach
|
||||
try {
|
||||
val tunnel = listItem.item!!
|
||||
if (tunnel.state != Tunnel.State.UP || isDeleting.get()) {
|
||||
|
||||
@@ -40,9 +40,9 @@ class FileConfigStore(private val context: Context) : ConfigStore {
|
||||
|
||||
override fun enumerate(): Set<String> {
|
||||
return context.fileList()
|
||||
.filter { it.endsWith(".conf") }
|
||||
.map { it.substring(0, it.length - ".conf".length) }
|
||||
.toSet()
|
||||
.filter { it.endsWith(".conf") }
|
||||
.map { it.substring(0, it.length - ".conf".length) }
|
||||
.toSet()
|
||||
}
|
||||
|
||||
private fun fileFor(name: String): File {
|
||||
|
||||
@@ -47,9 +47,11 @@ object BindingAdapters {
|
||||
|
||||
@JvmStatic
|
||||
@BindingAdapter("items", "layout", "fragment")
|
||||
fun <E> setItems(view: LinearLayout,
|
||||
oldList: ObservableList<E>?, oldLayoutId: Int, @Suppress("UNUSED_PARAMETER") oldFragment: Fragment?,
|
||||
newList: ObservableList<E>?, newLayoutId: Int, newFragment: Fragment?) {
|
||||
fun <E> setItems(
|
||||
view: LinearLayout,
|
||||
oldList: ObservableList<E>?, oldLayoutId: Int, @Suppress("UNUSED_PARAMETER") oldFragment: Fragment?,
|
||||
newList: ObservableList<E>?, newLayoutId: Int, newFragment: Fragment?
|
||||
) {
|
||||
if (oldList === newList && oldLayoutId == newLayoutId)
|
||||
return
|
||||
var listener: ItemChangeListener<E>? = ListenerUtil.getListener(view, R.id.item_change_listener)
|
||||
@@ -73,9 +75,11 @@ object BindingAdapters {
|
||||
|
||||
@JvmStatic
|
||||
@BindingAdapter("items", "layout")
|
||||
fun <E> setItems(view: LinearLayout,
|
||||
oldList: Iterable<E>?, oldLayoutId: Int,
|
||||
newList: Iterable<E>?, newLayoutId: Int) {
|
||||
fun <E> setItems(
|
||||
view: LinearLayout,
|
||||
oldList: Iterable<E>?, oldLayoutId: Int,
|
||||
newList: Iterable<E>?, newLayoutId: Int
|
||||
) {
|
||||
if (oldList === newList && oldLayoutId == newLayoutId)
|
||||
return
|
||||
view.removeAllViews()
|
||||
@@ -93,11 +97,13 @@ object BindingAdapters {
|
||||
|
||||
@JvmStatic
|
||||
@BindingAdapter(requireAll = false, value = ["items", "layout", "configurationHandler"])
|
||||
fun <K, E : Keyed<out K>> setItems(view: RecyclerView,
|
||||
oldList: ObservableKeyedArrayList<K, E>?, oldLayoutId: Int,
|
||||
@Suppress("UNUSED_PARAMETER") oldRowConfigurationHandler: RowConfigurationHandler<*, *>?,
|
||||
newList: ObservableKeyedArrayList<K, E>?, newLayoutId: Int,
|
||||
newRowConfigurationHandler: RowConfigurationHandler<*, *>?) {
|
||||
fun <K, E : Keyed<out K>> setItems(
|
||||
view: RecyclerView,
|
||||
oldList: ObservableKeyedArrayList<K, E>?, oldLayoutId: Int,
|
||||
@Suppress("UNUSED_PARAMETER") oldRowConfigurationHandler: RowConfigurationHandler<*, *>?,
|
||||
newList: ObservableKeyedArrayList<K, E>?, newLayoutId: Int,
|
||||
newRowConfigurationHandler: RowConfigurationHandler<*, *>?
|
||||
) {
|
||||
if (view.layoutManager == null)
|
||||
view.layoutManager = LinearLayoutManager(view.context, RecyclerView.VERTICAL, false)
|
||||
if (oldList === newList && oldLayoutId == newLayoutId)
|
||||
@@ -123,16 +129,20 @@ object BindingAdapters {
|
||||
|
||||
@JvmStatic
|
||||
@BindingAdapter("onBeforeCheckedChanged")
|
||||
fun setOnBeforeCheckedChanged(view: ToggleSwitch,
|
||||
listener: OnBeforeCheckedChangeListener?) {
|
||||
fun setOnBeforeCheckedChanged(
|
||||
view: ToggleSwitch,
|
||||
listener: OnBeforeCheckedChangeListener?
|
||||
) {
|
||||
view.setOnBeforeCheckedChangeListener(listener)
|
||||
}
|
||||
|
||||
@JvmStatic
|
||||
@BindingAdapter("onFocusChange")
|
||||
fun setOnFocusChange(view: EditText,
|
||||
listener: View.OnFocusChangeListener?) {
|
||||
view.setOnFocusChangeListener(listener)
|
||||
fun setOnFocusChange(
|
||||
view: EditText,
|
||||
listener: View.OnFocusChangeListener?
|
||||
) {
|
||||
view.onFocusChangeListener = listener
|
||||
}
|
||||
|
||||
@JvmStatic
|
||||
|
||||
@@ -61,8 +61,10 @@ internal class ItemChangeListener<T>(private val container: ViewGroup, private v
|
||||
}
|
||||
}
|
||||
|
||||
override fun onItemRangeChanged(sender: ObservableList<T>, positionStart: Int,
|
||||
itemCount: Int) {
|
||||
override fun onItemRangeChanged(
|
||||
sender: ObservableList<T>, positionStart: Int,
|
||||
itemCount: Int
|
||||
) {
|
||||
val listener = weakListener.get()
|
||||
if (listener != null) {
|
||||
for (i in positionStart until positionStart + itemCount) {
|
||||
@@ -75,8 +77,10 @@ internal class ItemChangeListener<T>(private val container: ViewGroup, private v
|
||||
}
|
||||
}
|
||||
|
||||
override fun onItemRangeInserted(sender: ObservableList<T>, positionStart: Int,
|
||||
itemCount: Int) {
|
||||
override fun onItemRangeInserted(
|
||||
sender: ObservableList<T>, positionStart: Int,
|
||||
itemCount: Int
|
||||
) {
|
||||
val listener = weakListener.get()
|
||||
if (listener != null) {
|
||||
for (i in positionStart until positionStart + itemCount)
|
||||
@@ -86,8 +90,10 @@ internal class ItemChangeListener<T>(private val container: ViewGroup, private v
|
||||
}
|
||||
}
|
||||
|
||||
override fun onItemRangeMoved(sender: ObservableList<T>, fromPosition: Int,
|
||||
toPosition: Int, itemCount: Int) {
|
||||
override fun onItemRangeMoved(
|
||||
sender: ObservableList<T>, fromPosition: Int,
|
||||
toPosition: Int, itemCount: Int
|
||||
) {
|
||||
val listener = weakListener.get()
|
||||
if (listener != null) {
|
||||
val views = arrayOfNulls<View>(itemCount)
|
||||
@@ -99,8 +105,10 @@ internal class ItemChangeListener<T>(private val container: ViewGroup, private v
|
||||
}
|
||||
}
|
||||
|
||||
override fun onItemRangeRemoved(sender: ObservableList<T>, positionStart: Int,
|
||||
itemCount: Int) {
|
||||
override fun onItemRangeRemoved(
|
||||
sender: ObservableList<T>, positionStart: Int,
|
||||
itemCount: Int
|
||||
) {
|
||||
val listener = weakListener.get()
|
||||
if (listener != null) {
|
||||
listener.container.removeViews(positionStart, itemCount)
|
||||
|
||||
@@ -48,8 +48,9 @@ class AppListDialogFragment : DialogFragment() {
|
||||
val packageInfos = getPackagesHoldingPermissions(pm, arrayOf(Manifest.permission.INTERNET))
|
||||
packageInfos.forEach {
|
||||
val packageName = it.packageName
|
||||
val appInfo = it.applicationInfo
|
||||
val appData = ApplicationData(appInfo.loadIcon(pm), appInfo.loadLabel(pm).toString(), packageName, currentlySelectedApps.contains(packageName))
|
||||
val appInfo = it.applicationInfo ?: return@forEach
|
||||
val appData =
|
||||
ApplicationData(appInfo.loadIcon(pm), appInfo.loadLabel(pm).toString(), packageName, currentlySelectedApps.contains(packageName))
|
||||
applicationData.add(appData)
|
||||
appData.addOnPropertyChangedCallback(object : Observable.OnPropertyChangedCallback() {
|
||||
override fun onPropertyChanged(sender: Observable?, propertyId: Int) {
|
||||
@@ -143,10 +144,12 @@ class AppListDialogFragment : DialogFragment() {
|
||||
selectedApps.add(data.packageName)
|
||||
}
|
||||
}
|
||||
setFragmentResult(REQUEST_SELECTION, bundleOf(
|
||||
setFragmentResult(
|
||||
REQUEST_SELECTION, bundleOf(
|
||||
KEY_SELECTED_APPS to selectedApps.toTypedArray(),
|
||||
KEY_IS_EXCLUDED to (tabs?.selectedTabPosition == 0)
|
||||
))
|
||||
)
|
||||
)
|
||||
dismiss()
|
||||
}
|
||||
|
||||
|
||||
@@ -99,8 +99,8 @@ abstract class BaseFragment : Fragment(), OnSelectedTunnelChangedListener {
|
||||
val view = view
|
||||
if (view != null)
|
||||
Snackbar.make(view, message, Snackbar.LENGTH_LONG)
|
||||
.setAnchorView(view.findViewById(R.id.create_fab))
|
||||
.show()
|
||||
.setAnchorView(view.findViewById(R.id.create_fab))
|
||||
.show()
|
||||
else
|
||||
Toast.makeText(activity, message, Toast.LENGTH_LONG).show()
|
||||
Log.e(TAG, message, e)
|
||||
|
||||
@@ -37,6 +37,7 @@ class ConfigNamingDialogFragment : DialogFragment() {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
val configText = requireArguments().getString(KEY_CONFIG_TEXT)
|
||||
|
||||
@@ -40,8 +40,10 @@ class TunnelDetailFragment : BaseFragment(), MenuProvider {
|
||||
menuInflater.inflate(R.menu.tunnel_detail, menu)
|
||||
}
|
||||
|
||||
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
|
||||
savedInstanceState: Bundle?): View? {
|
||||
override fun onCreateView(
|
||||
inflater: LayoutInflater, container: ViewGroup?,
|
||||
savedInstanceState: Bundle?
|
||||
): View? {
|
||||
super.onCreateView(inflater, container, savedInstanceState)
|
||||
binding = TunnelDetailFragmentBinding.inflate(inflater, container, false)
|
||||
binding?.executePendingBindings()
|
||||
@@ -110,16 +112,18 @@ class TunnelDetailFragment : BaseFragment(), MenuProvider {
|
||||
val statistics = tunnel.getStatisticsAsync()
|
||||
for (i in 0 until binding.peersLayout.childCount) {
|
||||
val peer: TunnelDetailPeerBinding = DataBindingUtil.getBinding(binding.peersLayout.getChildAt(i))
|
||||
?: continue
|
||||
?: continue
|
||||
val publicKey = peer.item!!.publicKey
|
||||
val peerStats = statistics.peer(publicKey)
|
||||
if (peerStats == null || (peerStats.rxBytes == 0L && peerStats.txBytes == 0L)) {
|
||||
peer.transferLabel.visibility = View.GONE
|
||||
peer.transferText.visibility = View.GONE
|
||||
} else {
|
||||
peer.transferText.text = getString(R.string.transfer_rx_tx,
|
||||
peer.transferText.text = getString(
|
||||
R.string.transfer_rx_tx,
|
||||
QuantityFormatter.formatBytes(peerStats.rxBytes),
|
||||
QuantityFormatter.formatBytes(peerStats.txBytes))
|
||||
QuantityFormatter.formatBytes(peerStats.txBytes)
|
||||
)
|
||||
peer.transferLabel.visibility = View.VISIBLE
|
||||
peer.transferText.visibility = View.VISIBLE
|
||||
}
|
||||
@@ -135,7 +139,7 @@ class TunnelDetailFragment : BaseFragment(), MenuProvider {
|
||||
} catch (e: Throwable) {
|
||||
for (i in 0 until binding.peersLayout.childCount) {
|
||||
val peer: TunnelDetailPeerBinding = DataBindingUtil.getBinding(binding.peersLayout.getChildAt(i))
|
||||
?: continue
|
||||
?: continue
|
||||
peer.transferLabel.visibility = View.GONE
|
||||
peer.transferText.visibility = View.GONE
|
||||
peer.latestHandshakeLabel.visibility = View.GONE
|
||||
|
||||
@@ -5,7 +5,6 @@
|
||||
package com.wireguard.android.fragment
|
||||
|
||||
import android.content.Context
|
||||
import android.os.Build
|
||||
import android.os.Bundle
|
||||
import android.text.InputType
|
||||
import android.util.Log
|
||||
@@ -67,16 +66,14 @@ class TunnelEditorFragment : BaseFragment(), MenuProvider {
|
||||
}
|
||||
}
|
||||
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
}
|
||||
|
||||
override fun onCreateMenu(menu: Menu, menuInflater: MenuInflater) {
|
||||
menuInflater.inflate(R.menu.config_editor, menu)
|
||||
}
|
||||
|
||||
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
|
||||
savedInstanceState: Bundle?): View? {
|
||||
override fun onCreateView(
|
||||
inflater: LayoutInflater, container: ViewGroup?,
|
||||
savedInstanceState: Bundle?
|
||||
): View? {
|
||||
super.onCreateView(inflater, container, savedInstanceState)
|
||||
binding = TunnelEditorFragmentBinding.inflate(inflater, container, false)
|
||||
binding?.apply {
|
||||
@@ -103,8 +100,10 @@ class TunnelEditorFragment : BaseFragment(), MenuProvider {
|
||||
val focusedView = activity.currentFocus
|
||||
if (focusedView != null) {
|
||||
val inputManager = activity.getSystemService(Context.INPUT_METHOD_SERVICE) as? InputMethodManager
|
||||
inputManager?.hideSoftInputFromWindow(focusedView.windowToken,
|
||||
InputMethodManager.HIDE_NOT_ALWAYS)
|
||||
inputManager?.hideSoftInputFromWindow(
|
||||
focusedView.windowToken,
|
||||
InputMethodManager.HIDE_NOT_ALWAYS
|
||||
)
|
||||
}
|
||||
parentFragmentManager.popBackStackImmediate()
|
||||
|
||||
@@ -138,6 +137,7 @@ class TunnelEditorFragment : BaseFragment(), MenuProvider {
|
||||
onTunnelCreated(null, e)
|
||||
}
|
||||
}
|
||||
|
||||
tunnel!!.name != binding!!.name -> {
|
||||
Log.d(TAG, "Attempting to rename tunnel to " + binding!!.name)
|
||||
try {
|
||||
@@ -147,6 +147,7 @@ class TunnelEditorFragment : BaseFragment(), MenuProvider {
|
||||
onTunnelRenamed(tunnel!!, newConfig, e)
|
||||
}
|
||||
}
|
||||
|
||||
else -> {
|
||||
Log.d(TAG, "Attempting to save config of " + tunnel!!.name)
|
||||
try {
|
||||
@@ -202,8 +203,10 @@ class TunnelEditorFragment : BaseFragment(), MenuProvider {
|
||||
super.onSaveInstanceState(outState)
|
||||
}
|
||||
|
||||
override fun onSelectedTunnelChanged(oldTunnel: ObservableTunnel?,
|
||||
newTunnel: ObservableTunnel?) {
|
||||
override fun onSelectedTunnelChanged(
|
||||
oldTunnel: ObservableTunnel?,
|
||||
newTunnel: ObservableTunnel?
|
||||
) {
|
||||
tunnel = newTunnel
|
||||
if (binding == null) return
|
||||
binding!!.config = ConfigProxy()
|
||||
@@ -240,8 +243,10 @@ class TunnelEditorFragment : BaseFragment(), MenuProvider {
|
||||
}
|
||||
}
|
||||
|
||||
private suspend fun onTunnelRenamed(renamedTunnel: ObservableTunnel, newConfig: Config,
|
||||
throwable: Throwable?) {
|
||||
private suspend fun onTunnelRenamed(
|
||||
renamedTunnel: ObservableTunnel, newConfig: Config,
|
||||
throwable: Throwable?
|
||||
) {
|
||||
val ctx = activity ?: Application.get()
|
||||
if (throwable == null) {
|
||||
val message = ctx.getString(R.string.tunnel_rename_success, renamedTunnel.name)
|
||||
@@ -298,13 +303,15 @@ class TunnelEditorFragment : BaseFragment(), MenuProvider {
|
||||
haveShownKeys = true
|
||||
showPrivateKey(edit)
|
||||
}
|
||||
|
||||
is BiometricAuthenticator.Result.Failure -> {
|
||||
Snackbar.make(
|
||||
binding!!.mainContainer,
|
||||
it.message,
|
||||
Snackbar.LENGTH_SHORT
|
||||
binding!!.mainContainer,
|
||||
it.message,
|
||||
Snackbar.LENGTH_SHORT
|
||||
).show()
|
||||
}
|
||||
|
||||
is BiometricAuthenticator.Result.Cancelled -> {}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -81,6 +81,8 @@ class TunnelListFragment : BaseFragment() {
|
||||
}
|
||||
}
|
||||
|
||||
private val snackbarUpdateShower = SnackbarUpdateShower(this)
|
||||
|
||||
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
||||
super.onViewCreated(view, savedInstanceState)
|
||||
if (savedInstanceState != null) {
|
||||
@@ -91,8 +93,10 @@ class TunnelListFragment : BaseFragment() {
|
||||
}
|
||||
}
|
||||
|
||||
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
|
||||
savedInstanceState: Bundle?): View? {
|
||||
override fun onCreateView(
|
||||
inflater: LayoutInflater, container: ViewGroup?,
|
||||
savedInstanceState: Bundle?
|
||||
): View? {
|
||||
super.onCreateView(inflater, container, savedInstanceState)
|
||||
binding = TunnelListFragmentBinding.inflate(inflater, container, false)
|
||||
val bottomSheet = AddTunnelsSheet()
|
||||
@@ -105,26 +109,29 @@ class TunnelListFragment : BaseFragment() {
|
||||
AddTunnelsSheet.REQUEST_CREATE -> {
|
||||
startActivity(Intent(requireActivity(), TunnelCreatorActivity::class.java))
|
||||
}
|
||||
|
||||
AddTunnelsSheet.REQUEST_IMPORT -> {
|
||||
tunnelFileImportResultLauncher.launch("*/*")
|
||||
}
|
||||
|
||||
AddTunnelsSheet.REQUEST_SCAN -> {
|
||||
qrImportResultLauncher.launch(ScanOptions()
|
||||
qrImportResultLauncher.launch(
|
||||
ScanOptions()
|
||||
.setOrientationLocked(false)
|
||||
.setBeepEnabled(false)
|
||||
.setPrompt(getString(R.string.qr_code_hint)))
|
||||
.setPrompt(getString(R.string.qr_code_hint))
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
bottomSheet.showNow(childFragmentManager, "BOTTOM_SHEET")
|
||||
}
|
||||
executePendingBindings()
|
||||
snackbarUpdateShower.attach(mainContainer, createFab)
|
||||
}
|
||||
backPressedCallback = requireActivity().onBackPressedDispatcher.addCallback(this) { actionMode?.finish() }
|
||||
backPressedCallback?.isEnabled = false
|
||||
|
||||
SnackbarUpdateShower.attachToActivity(requireActivity(), binding?.mainContainer!!, binding?.createFab)
|
||||
|
||||
return binding?.root
|
||||
}
|
||||
|
||||
@@ -191,8 +198,8 @@ class TunnelListFragment : BaseFragment() {
|
||||
val binding = binding
|
||||
if (binding != null)
|
||||
Snackbar.make(binding.mainContainer, message, Snackbar.LENGTH_LONG)
|
||||
.setAnchorView(binding.createFab)
|
||||
.show()
|
||||
.setAnchorView(binding.createFab)
|
||||
.show()
|
||||
else
|
||||
Toast.makeText(activity ?: Application.get(), message, Toast.LENGTH_SHORT).show()
|
||||
}
|
||||
@@ -234,6 +241,7 @@ class TunnelListFragment : BaseFragment() {
|
||||
mode.finish()
|
||||
true
|
||||
}
|
||||
|
||||
R.id.menu_action_select_all -> {
|
||||
lifecycleScope.launch {
|
||||
val tunnels = Application.getTunnelManager().getTunnels()
|
||||
@@ -243,6 +251,7 @@ class TunnelListFragment : BaseFragment() {
|
||||
}
|
||||
true
|
||||
}
|
||||
|
||||
else -> false
|
||||
}
|
||||
}
|
||||
@@ -308,7 +317,7 @@ class TunnelListFragment : BaseFragment() {
|
||||
private fun animateFab(view: View?, show: Boolean) {
|
||||
view ?: return
|
||||
val animation = AnimationUtils.loadAnimation(
|
||||
context, if (show) R.anim.scale_up else R.anim.scale_down
|
||||
context, if (show) R.anim.scale_up else R.anim.scale_down
|
||||
)
|
||||
animation.setAnimationListener(object : Animation.AnimationListener {
|
||||
override fun onAnimationRepeat(animation: Animation?) {
|
||||
|
||||
@@ -21,10 +21,10 @@ import kotlinx.coroutines.withContext
|
||||
* Encapsulates the volatile and nonvolatile state of a WireGuard tunnel.
|
||||
*/
|
||||
class ObservableTunnel internal constructor(
|
||||
private val manager: TunnelManager,
|
||||
private var name: String,
|
||||
config: Config?,
|
||||
state: Tunnel.State
|
||||
private val manager: TunnelManager,
|
||||
private var name: String,
|
||||
config: Config?,
|
||||
state: Tunnel.State
|
||||
) : BaseObservable(), Keyed<String>, Tunnel {
|
||||
override val key
|
||||
get() = name
|
||||
|
||||
@@ -140,7 +140,8 @@ class TunnelManager(private val configStore: ConfigStore) : BaseObservable() {
|
||||
if (previouslyRunning.isEmpty()) return
|
||||
withContext(Dispatchers.IO) {
|
||||
try {
|
||||
tunnelMap.filter { previouslyRunning.contains(it.name) }.map { async(Dispatchers.IO + SupervisorJob()) { setTunnelState(it, Tunnel.State.UP) } }.awaitAll()
|
||||
tunnelMap.filter { previouslyRunning.contains(it.name) }.map { async(Dispatchers.IO + SupervisorJob()) { setTunnelState(it, Tunnel.State.UP) } }
|
||||
.awaitAll()
|
||||
} catch (e: Throwable) {
|
||||
Log.e(TAG, Log.getStackTraceString(e))
|
||||
}
|
||||
|
||||
@@ -12,8 +12,8 @@ import android.util.AttributeSet
|
||||
import android.widget.Toast
|
||||
import androidx.preference.Preference
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder
|
||||
import com.wireguard.android.BuildConfig
|
||||
import com.wireguard.android.R
|
||||
import com.wireguard.android.updater.Updater
|
||||
import com.wireguard.android.util.ErrorMessages
|
||||
|
||||
class DonatePreference(context: Context, attrs: AttributeSet?) : Preference(context, attrs) {
|
||||
@@ -23,7 +23,7 @@ class DonatePreference(context: Context, attrs: AttributeSet?) : Preference(cont
|
||||
|
||||
override fun onClick() {
|
||||
/* Google Play Store forbids links to our donation page. */
|
||||
if (BuildConfig.IS_GOOGLE_PLAY) {
|
||||
if (Updater.installerIsGooglePlay(context)) {
|
||||
MaterialAlertDialogBuilder(context)
|
||||
.setTitle(R.string.donate_title)
|
||||
.setMessage(R.string.donate_google_play_disappointment)
|
||||
|
||||
@@ -0,0 +1,50 @@
|
||||
/*
|
||||
* Copyright © 2017-2023 WireGuard LLC. All Rights Reserved.
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
|
||||
package com.wireguard.android.preference
|
||||
|
||||
import android.app.StatusBarManager
|
||||
import android.content.ComponentName
|
||||
import android.content.Context
|
||||
import android.graphics.drawable.Icon
|
||||
import android.os.Build
|
||||
import android.util.AttributeSet
|
||||
import android.widget.Toast
|
||||
import androidx.annotation.RequiresApi
|
||||
import androidx.preference.Preference
|
||||
import com.wireguard.android.QuickTileService
|
||||
import com.wireguard.android.R
|
||||
|
||||
@RequiresApi(Build.VERSION_CODES.TIRAMISU)
|
||||
class QuickTilePreference(context: Context, attrs: AttributeSet?) : Preference(context, attrs) {
|
||||
override fun getSummary() = context.getString(R.string.quick_settings_tile_add_summary)
|
||||
|
||||
override fun getTitle() = context.getString(R.string.quick_settings_tile_add_title)
|
||||
|
||||
override fun onClick() {
|
||||
val statusBarManager = context.getSystemService(StatusBarManager::class.java)
|
||||
statusBarManager.requestAddTileService(
|
||||
ComponentName(context, QuickTileService::class.java),
|
||||
context.getString(R.string.quick_settings_tile_action),
|
||||
Icon.createWithResource(context, R.drawable.ic_tile),
|
||||
context.mainExecutor
|
||||
) {
|
||||
when (it) {
|
||||
StatusBarManager.TILE_ADD_REQUEST_RESULT_TILE_ALREADY_ADDED,
|
||||
StatusBarManager.TILE_ADD_REQUEST_RESULT_TILE_ADDED -> {
|
||||
parent?.removePreference(this)
|
||||
--preferenceManager.preferenceScreen.initialExpandedChildrenCount
|
||||
}
|
||||
StatusBarManager.TILE_ADD_REQUEST_ERROR_MISMATCHED_PACKAGE,
|
||||
StatusBarManager.TILE_ADD_REQUEST_ERROR_REQUEST_IN_PROGRESS,
|
||||
StatusBarManager.TILE_ADD_REQUEST_ERROR_BAD_COMPONENT,
|
||||
StatusBarManager.TILE_ADD_REQUEST_ERROR_NOT_CURRENT_USER,
|
||||
StatusBarManager.TILE_ADD_REQUEST_ERROR_APP_NOT_IN_FOREGROUND,
|
||||
StatusBarManager.TILE_ADD_REQUEST_ERROR_NO_STATUS_BAR_SERVICE ->
|
||||
Toast.makeText(context, context.getString(R.string.quick_settings_tile_add_failure, it), Toast.LENGTH_SHORT).show()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -70,14 +70,16 @@ class ZipExporterPreference(context: Context, attrs: AttributeSet?) : Preference
|
||||
val message = context.getString(R.string.zip_export_error, error)
|
||||
Log.e(TAG, message, e)
|
||||
Snackbar.make(
|
||||
activity.findViewById(android.R.id.content),
|
||||
message, Snackbar.LENGTH_LONG).show()
|
||||
activity.findViewById(android.R.id.content),
|
||||
message, Snackbar.LENGTH_LONG
|
||||
).show()
|
||||
isEnabled = true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
override fun getSummary() = if (exportedFilePath == null) context.getString(R.string.zip_export_summary) else context.getString(R.string.zip_export_success, exportedFilePath)
|
||||
override fun getSummary() =
|
||||
if (exportedFilePath == null) context.getString(R.string.zip_export_summary) else context.getString(R.string.zip_export_success, exportedFilePath)
|
||||
|
||||
override fun getTitle() = context.getString(R.string.zip_export_title)
|
||||
|
||||
@@ -91,13 +93,15 @@ class ZipExporterPreference(context: Context, attrs: AttributeSet?) : Preference
|
||||
isEnabled = false
|
||||
exportZip()
|
||||
}
|
||||
|
||||
is BiometricAuthenticator.Result.Failure -> {
|
||||
Snackbar.make(
|
||||
activity.findViewById(android.R.id.content),
|
||||
it.message,
|
||||
Snackbar.LENGTH_SHORT
|
||||
activity.findViewById(android.R.id.content),
|
||||
it.message,
|
||||
Snackbar.LENGTH_SHORT
|
||||
).show()
|
||||
}
|
||||
|
||||
is BiometricAuthenticator.Result.Cancelled -> {}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,13 +5,16 @@
|
||||
|
||||
package com.wireguard.android.updater
|
||||
|
||||
import android.content.Intent
|
||||
import android.net.Uri
|
||||
import android.view.View
|
||||
import android.widget.Toast
|
||||
import androidx.activity.result.contract.ActivityResultContracts
|
||||
import androidx.fragment.app.FragmentActivity
|
||||
import androidx.fragment.app.Fragment
|
||||
import androidx.lifecycle.lifecycleScope
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder
|
||||
import com.google.android.material.snackbar.BaseTransientBottomBar
|
||||
import com.google.android.material.snackbar.Snackbar
|
||||
import com.wireguard.android.BuildConfig
|
||||
import com.wireguard.android.R
|
||||
import com.wireguard.android.util.ErrorMessages
|
||||
import com.wireguard.android.util.QuantityFormatter
|
||||
@@ -21,15 +24,20 @@ import kotlinx.coroutines.flow.onEach
|
||||
import kotlinx.coroutines.launch
|
||||
import kotlin.time.Duration.Companion.seconds
|
||||
|
||||
object SnackbarUpdateShower {
|
||||
private class SwapableSnackbar(activity: FragmentActivity, view: View, anchor: View?) {
|
||||
val actionSnackbar = makeSnackbar(activity, view, anchor)
|
||||
val statusSnackbar = makeSnackbar(activity, view, anchor)
|
||||
var showingAction: Boolean = false
|
||||
var showingStatus: Boolean = false
|
||||
class SnackbarUpdateShower(private val fragment: Fragment) {
|
||||
private var lastUserIntervention: Updater.Progress.NeedsUserIntervention? = null
|
||||
private val intentLauncher = fragment.registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {
|
||||
lastUserIntervention?.markAsDone()
|
||||
}
|
||||
|
||||
private fun makeSnackbar(activity: FragmentActivity, view: View, anchor: View?): Snackbar {
|
||||
val snackbar = Snackbar.make(activity, view, "", Snackbar.LENGTH_INDEFINITE)
|
||||
private class SwapableSnackbar(fragment: Fragment, view: View, anchor: View?) {
|
||||
private val actionSnackbar = makeSnackbar(fragment, view, anchor)
|
||||
private val statusSnackbar = makeSnackbar(fragment, view, anchor)
|
||||
private var showingAction: Boolean = false
|
||||
private var showingStatus: Boolean = false
|
||||
|
||||
private fun makeSnackbar(fragment: Fragment, view: View, anchor: View?): Snackbar {
|
||||
val snackbar = Snackbar.make(fragment.requireContext(), view, "", Snackbar.LENGTH_INDEFINITE)
|
||||
if (anchor != null)
|
||||
snackbar.anchorView = anchor
|
||||
snackbar.setTextMaxLines(6)
|
||||
@@ -42,11 +50,10 @@ object SnackbarUpdateShower {
|
||||
override fun onDismissed(snackbar: Snackbar?, @DismissEvent event: Int) {
|
||||
super.onDismissed(snackbar, event)
|
||||
if (event == DISMISS_EVENT_MANUAL || event == DISMISS_EVENT_ACTION ||
|
||||
(snackbar == actionSnackbar && !showingAction) ||
|
||||
(snackbar == statusSnackbar && !showingStatus)
|
||||
(snackbar == actionSnackbar && !showingAction) || (snackbar == statusSnackbar && !showingStatus)
|
||||
)
|
||||
return
|
||||
activity.lifecycleScope.launch {
|
||||
fragment.lifecycleScope.launch {
|
||||
delay(5.seconds)
|
||||
snackbar?.show()
|
||||
}
|
||||
@@ -88,17 +95,9 @@ object SnackbarUpdateShower {
|
||||
}
|
||||
}
|
||||
|
||||
fun attachToActivity(activity: FragmentActivity, view: View, anchor: View?) {
|
||||
if (BuildConfig.IS_GOOGLE_PLAY)
|
||||
return
|
||||
|
||||
val snackbar = SwapableSnackbar(activity, view, anchor)
|
||||
val context = activity.applicationContext
|
||||
|
||||
var lastUserIntervention: Updater.Progress.NeedsUserIntervention? = null
|
||||
val intentLauncher = activity.registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {
|
||||
lastUserIntervention?.markAsDone()
|
||||
}
|
||||
fun attach(view: View, anchor: View?) {
|
||||
val snackbar = SwapableSnackbar(fragment, view, anchor)
|
||||
val context = fragment.requireContext()
|
||||
|
||||
Updater.state.onEach { progress ->
|
||||
when (progress) {
|
||||
@@ -106,10 +105,7 @@ object SnackbarUpdateShower {
|
||||
snackbar.dismiss()
|
||||
|
||||
is Updater.Progress.Available ->
|
||||
snackbar.showAction(
|
||||
context.getString(R.string.updater_avalable),
|
||||
context.getString(R.string.updater_action)
|
||||
) {
|
||||
snackbar.showAction(context.getString(R.string.updater_avalable), context.getString(R.string.updater_action)) {
|
||||
progress.update()
|
||||
}
|
||||
|
||||
@@ -145,16 +141,33 @@ object SnackbarUpdateShower {
|
||||
}
|
||||
|
||||
is Updater.Progress.Failure -> {
|
||||
snackbar.showText(
|
||||
context.getString(
|
||||
R.string.updater_failure,
|
||||
ErrorMessages[progress.error]
|
||||
)
|
||||
)
|
||||
snackbar.showText(context.getString(R.string.updater_failure, ErrorMessages[progress.error]))
|
||||
delay(5.seconds)
|
||||
progress.retry()
|
||||
}
|
||||
|
||||
is Updater.Progress.Corrupt -> {
|
||||
MaterialAlertDialogBuilder(context)
|
||||
.setTitle(R.string.updater_corrupt_title)
|
||||
.setMessage(R.string.updater_corrupt_message)
|
||||
.setPositiveButton(R.string.updater_corrupt_navigate) { _, _ ->
|
||||
val intent = Intent(Intent.ACTION_VIEW)
|
||||
intent.data = Uri.parse(progress.downloadUrl)
|
||||
try {
|
||||
context.startActivity(intent)
|
||||
} catch (e: Throwable) {
|
||||
Toast.makeText(context, ErrorMessages[e], Toast.LENGTH_SHORT).show()
|
||||
}
|
||||
}.setCancelable(false).setOnDismissListener {
|
||||
val intent = Intent(Intent.ACTION_MAIN)
|
||||
intent.addCategory(Intent.CATEGORY_HOME)
|
||||
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK)
|
||||
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
|
||||
context.startActivity(intent)
|
||||
System.exit(0)
|
||||
}.show()
|
||||
}
|
||||
}
|
||||
}.launchIn(activity.lifecycleScope)
|
||||
}.launchIn(fragment.lifecycleScope)
|
||||
}
|
||||
}
|
||||
@@ -4,12 +4,14 @@
|
||||
*/
|
||||
package com.wireguard.android.updater
|
||||
|
||||
import android.Manifest
|
||||
import android.app.PendingIntent
|
||||
import android.content.BroadcastReceiver
|
||||
import android.content.Context
|
||||
import android.content.Intent
|
||||
import android.content.IntentFilter
|
||||
import android.content.pm.PackageInstaller
|
||||
import android.content.pm.PackageManager
|
||||
import android.os.Build
|
||||
import android.util.Base64
|
||||
import android.util.Log
|
||||
@@ -19,6 +21,7 @@ import com.wireguard.android.Application
|
||||
import com.wireguard.android.BuildConfig
|
||||
import com.wireguard.android.activity.MainActivity
|
||||
import com.wireguard.android.util.UserKnobs
|
||||
import com.wireguard.android.util.applicationScope
|
||||
import kotlinx.coroutines.CoroutineScope
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.Job
|
||||
@@ -44,22 +47,35 @@ import kotlin.time.Duration.Companion.seconds
|
||||
|
||||
object Updater {
|
||||
private const val TAG = "WireGuard/Updater"
|
||||
private const val LATEST_VERSION_URL =
|
||||
"https://download.wireguard.com/android-client/latest.sig"
|
||||
private const val APK_PATH_URL = "https://download.wireguard.com/android-client/%s"
|
||||
private val APK_NAME_PREFIX = BuildConfig.APPLICATION_ID.removeSuffix(".debug") + "-"
|
||||
private const val UPDATE_URL_FMT = "https://download.wireguard.com/android-client/%s"
|
||||
private const val APK_NAME_PREFIX = BuildConfig.APPLICATION_ID + "-"
|
||||
private const val APK_NAME_SUFFIX = ".apk"
|
||||
private const val RELEASE_PUBLIC_KEY_BASE64 =
|
||||
"RWTAzwGRYr3EC9px0Ia3fbttz8WcVN6wrOwWp2delz4el6SI8XmkKSMp"
|
||||
private val CURRENT_VERSION = Version(BuildConfig.VERSION_NAME.removeSuffix("-debug"))
|
||||
private const val LATEST_FILE = "latest.sig"
|
||||
private const val RELEASE_PUBLIC_KEY_BASE64 = "RWTAzwGRYr3EC9px0Ia3fbttz8WcVN6wrOwWp2delz4el6SI8XmkKSMp"
|
||||
private val CURRENT_VERSION by lazy { Version(BuildConfig.VERSION_NAME) }
|
||||
|
||||
private val updaterScope = CoroutineScope(Job() + Dispatchers.IO)
|
||||
|
||||
private fun installer(context: Context): String = try {
|
||||
val packageName = context.packageName
|
||||
val pm = context.packageManager
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
|
||||
pm.getInstallSourceInfo(packageName).installingPackageName ?: ""
|
||||
} else {
|
||||
@Suppress("DEPRECATION")
|
||||
pm.getInstallerPackageName(packageName) ?: ""
|
||||
}
|
||||
} catch (_: Throwable) {
|
||||
""
|
||||
}
|
||||
|
||||
fun installerIsGooglePlay(context: Context): Boolean = installer(context) == "com.android.vending"
|
||||
|
||||
sealed class Progress {
|
||||
object Complete : Progress()
|
||||
class Available(val version: String) : Progress() {
|
||||
fun update() {
|
||||
Application.getCoroutineScope().launch {
|
||||
applicationScope.launch {
|
||||
UserKnobs.setUpdaterNewerVersionConsented(version)
|
||||
}
|
||||
}
|
||||
@@ -83,7 +99,7 @@ object Updater {
|
||||
}
|
||||
|
||||
fun markAsDone() {
|
||||
Application.getCoroutineScope().launch {
|
||||
applicationScope.launch {
|
||||
if (installerActive())
|
||||
return@launch
|
||||
delay(7.seconds)
|
||||
@@ -101,6 +117,11 @@ object Updater {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class Corrupt(private val betterFile: String?) : Progress() {
|
||||
val downloadUrl: String
|
||||
get() = UPDATE_URL_FMT.format(betterFile ?: "")
|
||||
}
|
||||
}
|
||||
|
||||
private val mutableState = MutableStateFlow<Progress>(Progress.Complete)
|
||||
@@ -200,7 +221,7 @@ object Updater {
|
||||
}
|
||||
|
||||
private fun checkForUpdates(): Update? {
|
||||
val connection = URL(LATEST_VERSION_URL).openConnection() as HttpURLConnection
|
||||
val connection = URL(UPDATE_URL_FMT.format(LATEST_FILE)).openConnection() as HttpURLConnection
|
||||
connection.setRequestProperty("User-Agent", Application.USER_AGENT)
|
||||
connection.connect()
|
||||
if (connection.responseCode != HttpURLConnection.HTTP_OK)
|
||||
@@ -219,12 +240,7 @@ object Updater {
|
||||
val receiver = InstallReceiver()
|
||||
val context = Application.get().applicationContext
|
||||
val pendingIntent = withContext(Dispatchers.Main) {
|
||||
ContextCompat.registerReceiver(
|
||||
context,
|
||||
receiver,
|
||||
IntentFilter(receiver.sessionId),
|
||||
ContextCompat.RECEIVER_NOT_EXPORTED
|
||||
)
|
||||
ContextCompat.registerReceiver(context, receiver, IntentFilter(receiver.sessionId), ContextCompat.RECEIVER_NOT_EXPORTED)
|
||||
PendingIntent.getBroadcast(
|
||||
context,
|
||||
0,
|
||||
@@ -241,24 +257,20 @@ object Updater {
|
||||
}
|
||||
|
||||
emitProgress(Progress.Downloading(0UL, 0UL), true)
|
||||
val connection =
|
||||
URL(APK_PATH_URL.format(update.fileName)).openConnection() as HttpURLConnection
|
||||
val connection = URL(UPDATE_URL_FMT.format(update.fileName)).openConnection() as HttpURLConnection
|
||||
connection.setRequestProperty("User-Agent", Application.USER_AGENT)
|
||||
connection.connect()
|
||||
if (connection.responseCode != HttpURLConnection.HTTP_OK)
|
||||
throw IOException("Update could not be fetched: ${connection.responseCode}")
|
||||
|
||||
var downloadedByteLen: ULong = 0UL
|
||||
val totalByteLen =
|
||||
(if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) connection.contentLengthLong else connection.contentLength).toLong()
|
||||
.toULong()
|
||||
val totalByteLen = (if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) connection.contentLengthLong else connection.contentLength).toLong().toULong()
|
||||
val fileBytes = ByteArray(1024 * 32 /* 32 KiB */)
|
||||
val digest = MessageDigest.getInstance("SHA-256")
|
||||
emitProgress(Progress.Downloading(downloadedByteLen, totalByteLen), true)
|
||||
|
||||
val installer = context.packageManager.packageInstaller
|
||||
val params =
|
||||
PackageInstaller.SessionParams(PackageInstaller.SessionParams.MODE_FULL_INSTALL)
|
||||
val params = PackageInstaller.SessionParams(PackageInstaller.SessionParams.MODE_FULL_INSTALL)
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S)
|
||||
params.setRequireUserAction(PackageInstaller.SessionParams.USER_ACTION_NOT_REQUIRED)
|
||||
params.setAppPackageName(context.packageName) /* Enforces updates; disallows new apps. */
|
||||
@@ -300,13 +312,18 @@ object Updater {
|
||||
session.close()
|
||||
}
|
||||
|
||||
private var updating = false
|
||||
private suspend fun downloadAndUpdateWrapErrors() {
|
||||
if (updating)
|
||||
return
|
||||
updating = true
|
||||
try {
|
||||
downloadAndUpdate()
|
||||
} catch (e: Throwable) {
|
||||
Log.e(TAG, "Update failure", e)
|
||||
emitProgress(Progress.Failure(e))
|
||||
}
|
||||
updating = false
|
||||
}
|
||||
|
||||
private class InstallReceiver : BroadcastReceiver() {
|
||||
@@ -316,25 +333,17 @@ object Updater {
|
||||
if (sessionId != intent.action)
|
||||
return
|
||||
|
||||
when (val status =
|
||||
intent.getIntExtra(
|
||||
PackageInstaller.EXTRA_STATUS,
|
||||
PackageInstaller.STATUS_FAILURE_INVALID
|
||||
)) {
|
||||
when (val status = intent.getIntExtra(PackageInstaller.EXTRA_STATUS, PackageInstaller.STATUS_FAILURE_INVALID)) {
|
||||
PackageInstaller.STATUS_PENDING_USER_ACTION -> {
|
||||
val id = intent.getIntExtra(PackageInstaller.EXTRA_SESSION_ID, 0)
|
||||
val userIntervention = IntentCompat.getParcelableExtra(
|
||||
intent,
|
||||
Intent.EXTRA_INTENT,
|
||||
Intent::class.java
|
||||
)!!
|
||||
Application.getCoroutineScope().launch {
|
||||
val userIntervention = IntentCompat.getParcelableExtra(intent, Intent.EXTRA_INTENT, Intent::class.java)!!
|
||||
applicationScope.launch {
|
||||
emitProgress(Progress.NeedsUserIntervention(userIntervention, id))
|
||||
}
|
||||
}
|
||||
|
||||
PackageInstaller.STATUS_SUCCESS -> {
|
||||
Application.getCoroutineScope().launch {
|
||||
applicationScope.launch {
|
||||
emitProgress(Progress.Complete)
|
||||
}
|
||||
context.applicationContext.unregisterReceiver(this)
|
||||
@@ -346,10 +355,8 @@ object Updater {
|
||||
context.applicationContext.packageManager.packageInstaller.abandonSession(id)
|
||||
} catch (_: SecurityException) {
|
||||
}
|
||||
val message =
|
||||
intent.getStringExtra(PackageInstaller.EXTRA_STATUS_MESSAGE)
|
||||
?: "Installation error $status"
|
||||
Application.getCoroutineScope().launch {
|
||||
val message = intent.getStringExtra(PackageInstaller.EXTRA_STATUS_MESSAGE) ?: "Installation error $status"
|
||||
applicationScope.launch {
|
||||
val e = Exception(message)
|
||||
Log.e(TAG, "Update failure", e)
|
||||
emitProgress(Progress.Failure(e))
|
||||
@@ -361,13 +368,36 @@ object Updater {
|
||||
}
|
||||
|
||||
fun monitorForUpdates() {
|
||||
if (BuildConfig.IS_GOOGLE_PLAY)
|
||||
if (BuildConfig.DEBUG)
|
||||
return
|
||||
|
||||
val context = Application.get()
|
||||
|
||||
if (installerIsGooglePlay(context))
|
||||
return
|
||||
|
||||
if (if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) {
|
||||
@Suppress("DEPRECATION")
|
||||
context.packageManager.getPackageInfo(context.packageName, PackageManager.GET_PERMISSIONS)
|
||||
} else {
|
||||
context.packageManager.getPackageInfo(context.packageName, PackageManager.PackageInfoFlags.of(PackageManager.GET_PERMISSIONS.toLong()))
|
||||
}.requestedPermissions?.contains(Manifest.permission.REQUEST_INSTALL_PACKAGES) != true
|
||||
) {
|
||||
if (installer(context).isNotEmpty()) {
|
||||
updaterScope.launch {
|
||||
val update = try {
|
||||
checkForUpdates()
|
||||
} catch (_: Throwable) {
|
||||
null
|
||||
}
|
||||
emitProgress(Progress.Corrupt(update?.fileName))
|
||||
}
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
updaterScope.launch {
|
||||
if (UserKnobs.updaterNewerVersionSeen.firstOrNull()
|
||||
?.let { Version(it) > CURRENT_VERSION } == true
|
||||
)
|
||||
if (UserKnobs.updaterNewerVersionSeen.firstOrNull()?.let { Version(it) > CURRENT_VERSION } == true)
|
||||
return@launch
|
||||
|
||||
var waitTime = 15
|
||||
@@ -387,41 +417,28 @@ object Updater {
|
||||
}
|
||||
|
||||
UserKnobs.updaterNewerVersionSeen.onEach { ver ->
|
||||
if (ver != null && Version(ver) > CURRENT_VERSION && UserKnobs.updaterNewerVersionConsented.firstOrNull()
|
||||
?.let { Version(it) > CURRENT_VERSION } != true
|
||||
if (
|
||||
ver != null &&
|
||||
Version(ver) > CURRENT_VERSION &&
|
||||
UserKnobs.updaterNewerVersionConsented.firstOrNull()?.let { Version(it) > CURRENT_VERSION } != true
|
||||
)
|
||||
emitProgress(Progress.Available(ver))
|
||||
}.launchIn(Application.getCoroutineScope())
|
||||
}.launchIn(applicationScope)
|
||||
|
||||
UserKnobs.updaterNewerVersionConsented.onEach { ver ->
|
||||
if (ver != null && Version(ver) > CURRENT_VERSION)
|
||||
updaterScope.launch {
|
||||
downloadAndUpdateWrapErrors()
|
||||
}
|
||||
}.launchIn(Application.getCoroutineScope())
|
||||
}.launchIn(applicationScope)
|
||||
}
|
||||
|
||||
class AppUpdatedReceiver : BroadcastReceiver() {
|
||||
override fun onReceive(context: Context, intent: Intent) {
|
||||
if (BuildConfig.IS_GOOGLE_PLAY)
|
||||
return
|
||||
|
||||
if (intent.action != Intent.ACTION_MY_PACKAGE_REPLACED)
|
||||
return
|
||||
|
||||
val installer = try {
|
||||
val packageName = context.packageName
|
||||
val pm = context.packageManager
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
|
||||
pm.getInstallSourceInfo(packageName).installingPackageName ?: ""
|
||||
} else {
|
||||
@Suppress("DEPRECATION")
|
||||
pm.getInstallerPackageName(packageName) ?: ""
|
||||
}
|
||||
} catch (_: Throwable) {
|
||||
""
|
||||
}
|
||||
if (installer != context.packageName)
|
||||
if (installer(context) != context.packageName)
|
||||
return
|
||||
|
||||
/* TODO: does not work because of restrictions placed on broadcast receivers. */
|
||||
@@ -431,4 +448,4 @@ object Updater {
|
||||
context.startActivity(start)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,5 +13,5 @@ object AdminKnobs {
|
||||
private val restrictions: RestrictionsManager? = Application.get().getSystemService()
|
||||
val disableConfigExport: Boolean
|
||||
get() = restrictions?.applicationRestrictions?.getBoolean("disable_config_export", false)
|
||||
?: false
|
||||
?: false
|
||||
}
|
||||
|
||||
@@ -31,25 +31,29 @@ object BiometricAuthenticator {
|
||||
}
|
||||
|
||||
fun authenticate(
|
||||
@StringRes dialogTitleRes: Int,
|
||||
fragment: Fragment,
|
||||
callback: (Result) -> Unit
|
||||
@StringRes dialogTitleRes: Int,
|
||||
fragment: Fragment,
|
||||
callback: (Result) -> Unit
|
||||
) {
|
||||
val authCallback = object : BiometricPrompt.AuthenticationCallback() {
|
||||
override fun onAuthenticationError(errorCode: Int, errString: CharSequence) {
|
||||
super.onAuthenticationError(errorCode, errString)
|
||||
Log.d(TAG, "BiometricAuthentication error: errorCode=$errorCode, msg=$errString")
|
||||
callback(when (errorCode) {
|
||||
BiometricPrompt.ERROR_CANCELED, BiometricPrompt.ERROR_USER_CANCELED,
|
||||
BiometricPrompt.ERROR_NEGATIVE_BUTTON -> {
|
||||
Result.Cancelled
|
||||
callback(
|
||||
when (errorCode) {
|
||||
BiometricPrompt.ERROR_CANCELED, BiometricPrompt.ERROR_USER_CANCELED,
|
||||
BiometricPrompt.ERROR_NEGATIVE_BUTTON -> {
|
||||
Result.Cancelled
|
||||
}
|
||||
|
||||
BiometricPrompt.ERROR_HW_NOT_PRESENT, BiometricPrompt.ERROR_HW_UNAVAILABLE,
|
||||
BiometricPrompt.ERROR_NO_BIOMETRICS, BiometricPrompt.ERROR_NO_DEVICE_CREDENTIAL -> {
|
||||
Result.HardwareUnavailableOrDisabled
|
||||
}
|
||||
|
||||
else -> Result.Failure(errorCode, fragment.getString(R.string.biometric_auth_error_reason, errString))
|
||||
}
|
||||
BiometricPrompt.ERROR_HW_NOT_PRESENT, BiometricPrompt.ERROR_HW_UNAVAILABLE,
|
||||
BiometricPrompt.ERROR_NO_BIOMETRICS, BiometricPrompt.ERROR_NO_DEVICE_CREDENTIAL -> {
|
||||
Result.HardwareUnavailableOrDisabled
|
||||
}
|
||||
else -> Result.Failure(errorCode, fragment.getString(R.string.biometric_auth_error_reason, errString))
|
||||
})
|
||||
)
|
||||
}
|
||||
|
||||
override fun onAuthenticationFailed() {
|
||||
@@ -64,9 +68,9 @@ object BiometricAuthenticator {
|
||||
}
|
||||
val biometricPrompt = BiometricPrompt(fragment, { Handler(Looper.getMainLooper()).post(it) }, authCallback)
|
||||
val promptInfo = BiometricPrompt.PromptInfo.Builder()
|
||||
.setTitle(fragment.getString(dialogTitleRes))
|
||||
.setAllowedAuthenticators(allowedAuthenticators)
|
||||
.build()
|
||||
.setTitle(fragment.getString(dialogTitleRes))
|
||||
.setAllowedAuthenticators(allowedAuthenticators)
|
||||
.build()
|
||||
if (BiometricManager.from(fragment.requireContext()).canAuthenticate(allowedAuthenticators) == BiometricManager.BIOMETRIC_SUCCESS) {
|
||||
biometricPrompt.authenticate(promptInfo)
|
||||
} else {
|
||||
|
||||
@@ -6,6 +6,7 @@ package com.wireguard.android.util
|
||||
|
||||
import android.content.ClipData
|
||||
import android.content.ClipboardManager
|
||||
import android.os.Build
|
||||
import android.view.View
|
||||
import android.widget.TextView
|
||||
import androidx.core.content.getSystemService
|
||||
@@ -29,6 +30,8 @@ object ClipboardUtils {
|
||||
}
|
||||
val service = view.context.getSystemService<ClipboardManager>() ?: return
|
||||
service.setPrimaryClip(ClipData.newPlainText(data.second, data.first))
|
||||
Snackbar.make(view, view.context.getString(R.string.copied_to_clipboard, data.second), Snackbar.LENGTH_LONG).show()
|
||||
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) {
|
||||
Snackbar.make(view, view.context.getString(R.string.copied_to_clipboard, data.second), Snackbar.LENGTH_LONG).show()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -46,9 +46,9 @@ class DownloadsFileSaver(private val context: ComponentActivity) {
|
||||
contentValues.put(MediaColumns.DISPLAY_NAME, name)
|
||||
contentValues.put(MediaColumns.MIME_TYPE, mimeType)
|
||||
val contentUri = contentResolver.insert(MediaStore.Downloads.EXTERNAL_CONTENT_URI, contentValues)
|
||||
?: throw IOException(context.getString(R.string.create_downloads_file_error))
|
||||
?: throw IOException(context.getString(R.string.create_downloads_file_error))
|
||||
val contentStream = contentResolver.openOutputStream(contentUri)
|
||||
?: throw IOException(context.getString(R.string.create_downloads_file_error))
|
||||
?: throw IOException(context.getString(R.string.create_downloads_file_error))
|
||||
@Suppress("DEPRECATION") var cursor = contentResolver.query(contentUri, arrayOf(MediaColumns.DATA), null, null, null)
|
||||
var path: String? = null
|
||||
if (cursor != null) {
|
||||
|
||||
@@ -22,47 +22,47 @@ import java.net.InetAddress
|
||||
|
||||
object ErrorMessages {
|
||||
private val BCE_REASON_MAP = mapOf(
|
||||
BadConfigException.Reason.INVALID_KEY to R.string.bad_config_reason_invalid_key,
|
||||
BadConfigException.Reason.INVALID_NUMBER to R.string.bad_config_reason_invalid_number,
|
||||
BadConfigException.Reason.INVALID_VALUE to R.string.bad_config_reason_invalid_value,
|
||||
BadConfigException.Reason.MISSING_ATTRIBUTE to R.string.bad_config_reason_missing_attribute,
|
||||
BadConfigException.Reason.MISSING_SECTION to R.string.bad_config_reason_missing_section,
|
||||
BadConfigException.Reason.SYNTAX_ERROR to R.string.bad_config_reason_syntax_error,
|
||||
BadConfigException.Reason.UNKNOWN_ATTRIBUTE to R.string.bad_config_reason_unknown_attribute,
|
||||
BadConfigException.Reason.UNKNOWN_SECTION to R.string.bad_config_reason_unknown_section
|
||||
BadConfigException.Reason.INVALID_KEY to R.string.bad_config_reason_invalid_key,
|
||||
BadConfigException.Reason.INVALID_NUMBER to R.string.bad_config_reason_invalid_number,
|
||||
BadConfigException.Reason.INVALID_VALUE to R.string.bad_config_reason_invalid_value,
|
||||
BadConfigException.Reason.MISSING_ATTRIBUTE to R.string.bad_config_reason_missing_attribute,
|
||||
BadConfigException.Reason.MISSING_SECTION to R.string.bad_config_reason_missing_section,
|
||||
BadConfigException.Reason.SYNTAX_ERROR to R.string.bad_config_reason_syntax_error,
|
||||
BadConfigException.Reason.UNKNOWN_ATTRIBUTE to R.string.bad_config_reason_unknown_attribute,
|
||||
BadConfigException.Reason.UNKNOWN_SECTION to R.string.bad_config_reason_unknown_section
|
||||
)
|
||||
private val BE_REASON_MAP = mapOf(
|
||||
BackendException.Reason.UNKNOWN_KERNEL_MODULE_NAME to R.string.module_version_error,
|
||||
BackendException.Reason.WG_QUICK_CONFIG_ERROR_CODE to R.string.tunnel_config_error,
|
||||
BackendException.Reason.TUNNEL_MISSING_CONFIG to R.string.no_config_error,
|
||||
BackendException.Reason.VPN_NOT_AUTHORIZED to R.string.vpn_not_authorized_error,
|
||||
BackendException.Reason.UNABLE_TO_START_VPN to R.string.vpn_start_error,
|
||||
BackendException.Reason.TUN_CREATION_ERROR to R.string.tun_create_error,
|
||||
BackendException.Reason.GO_ACTIVATION_ERROR_CODE to R.string.tunnel_on_error,
|
||||
BackendException.Reason.DNS_RESOLUTION_FAILURE to R.string.tunnel_dns_failure
|
||||
BackendException.Reason.UNKNOWN_KERNEL_MODULE_NAME to R.string.module_version_error,
|
||||
BackendException.Reason.WG_QUICK_CONFIG_ERROR_CODE to R.string.tunnel_config_error,
|
||||
BackendException.Reason.TUNNEL_MISSING_CONFIG to R.string.no_config_error,
|
||||
BackendException.Reason.VPN_NOT_AUTHORIZED to R.string.vpn_not_authorized_error,
|
||||
BackendException.Reason.UNABLE_TO_START_VPN to R.string.vpn_start_error,
|
||||
BackendException.Reason.TUN_CREATION_ERROR to R.string.tun_create_error,
|
||||
BackendException.Reason.GO_ACTIVATION_ERROR_CODE to R.string.tunnel_on_error,
|
||||
BackendException.Reason.DNS_RESOLUTION_FAILURE to R.string.tunnel_dns_failure
|
||||
)
|
||||
private val KFE_FORMAT_MAP = mapOf(
|
||||
Key.Format.BASE64 to R.string.key_length_explanation_base64,
|
||||
Key.Format.BINARY to R.string.key_length_explanation_binary,
|
||||
Key.Format.HEX to R.string.key_length_explanation_hex
|
||||
Key.Format.BASE64 to R.string.key_length_explanation_base64,
|
||||
Key.Format.BINARY to R.string.key_length_explanation_binary,
|
||||
Key.Format.HEX to R.string.key_length_explanation_hex
|
||||
)
|
||||
private val KFE_TYPE_MAP = mapOf(
|
||||
KeyFormatException.Type.CONTENTS to R.string.key_contents_error,
|
||||
KeyFormatException.Type.LENGTH to R.string.key_length_error
|
||||
KeyFormatException.Type.CONTENTS to R.string.key_contents_error,
|
||||
KeyFormatException.Type.LENGTH to R.string.key_length_error
|
||||
)
|
||||
private val PE_CLASS_MAP = mapOf(
|
||||
InetAddress::class.java to R.string.parse_error_inet_address,
|
||||
InetEndpoint::class.java to R.string.parse_error_inet_endpoint,
|
||||
InetNetwork::class.java to R.string.parse_error_inet_network,
|
||||
Int::class.java to R.string.parse_error_integer
|
||||
InetAddress::class.java to R.string.parse_error_inet_address,
|
||||
InetEndpoint::class.java to R.string.parse_error_inet_endpoint,
|
||||
InetNetwork::class.java to R.string.parse_error_inet_network,
|
||||
Int::class.java to R.string.parse_error_integer
|
||||
)
|
||||
private val RSE_REASON_MAP = mapOf(
|
||||
RootShellException.Reason.NO_ROOT_ACCESS to R.string.error_root,
|
||||
RootShellException.Reason.SHELL_MARKER_COUNT_ERROR to R.string.shell_marker_count_error,
|
||||
RootShellException.Reason.SHELL_EXIT_STATUS_READ_ERROR to R.string.shell_exit_status_read_error,
|
||||
RootShellException.Reason.SHELL_START_ERROR to R.string.shell_start_error,
|
||||
RootShellException.Reason.CREATE_BIN_DIR_ERROR to R.string.create_bin_dir_error,
|
||||
RootShellException.Reason.CREATE_TEMP_DIR_ERROR to R.string.create_temp_dir_error
|
||||
RootShellException.Reason.NO_ROOT_ACCESS to R.string.error_root,
|
||||
RootShellException.Reason.SHELL_MARKER_COUNT_ERROR to R.string.shell_marker_count_error,
|
||||
RootShellException.Reason.SHELL_EXIT_STATUS_READ_ERROR to R.string.shell_exit_status_read_error,
|
||||
RootShellException.Reason.SHELL_START_ERROR to R.string.shell_start_error,
|
||||
RootShellException.Reason.CREATE_BIN_DIR_ERROR to R.string.create_bin_dir_error,
|
||||
RootShellException.Reason.CREATE_TEMP_DIR_ERROR to R.string.create_temp_dir_error
|
||||
)
|
||||
|
||||
operator fun get(throwable: Throwable?): String {
|
||||
@@ -80,21 +80,27 @@ object ErrorMessages {
|
||||
val explanation = getBadConfigExceptionExplanation(resources, rootCause)
|
||||
resources.getString(R.string.bad_config_error, reason, context) + explanation
|
||||
}
|
||||
|
||||
rootCause is BackendException -> {
|
||||
resources.getString(BE_REASON_MAP.getValue(rootCause.reason), *rootCause.format)
|
||||
}
|
||||
|
||||
rootCause is RootShellException -> {
|
||||
resources.getString(RSE_REASON_MAP.getValue(rootCause.reason), *rootCause.format)
|
||||
}
|
||||
|
||||
rootCause is NotFoundException -> {
|
||||
resources.getString(R.string.error_no_qr_found)
|
||||
}
|
||||
|
||||
rootCause is ChecksumException -> {
|
||||
resources.getString(R.string.error_qr_checksum)
|
||||
}
|
||||
|
||||
rootCause.localizedMessage != null -> {
|
||||
rootCause.localizedMessage!!
|
||||
}
|
||||
|
||||
else -> {
|
||||
val errorType = rootCause.javaClass.simpleName
|
||||
resources.getString(R.string.generic_error, errorType)
|
||||
@@ -102,8 +108,10 @@ object ErrorMessages {
|
||||
}
|
||||
}
|
||||
|
||||
private fun getBadConfigExceptionExplanation(resources: Resources,
|
||||
bce: BadConfigException): String {
|
||||
private fun getBadConfigExceptionExplanation(
|
||||
resources: Resources,
|
||||
bce: BadConfigException
|
||||
): String {
|
||||
if (bce.cause is KeyFormatException) {
|
||||
val kfe = bce.cause as KeyFormatException?
|
||||
if (kfe!!.type == KeyFormatException.Type.LENGTH) return resources.getString(KFE_FORMAT_MAP.getValue(kfe.format))
|
||||
@@ -120,8 +128,10 @@ object ErrorMessages {
|
||||
return ""
|
||||
}
|
||||
|
||||
private fun getBadConfigExceptionReason(resources: Resources,
|
||||
bce: BadConfigException): String {
|
||||
private fun getBadConfigExceptionReason(
|
||||
resources: Resources,
|
||||
bce: BadConfigException
|
||||
): String {
|
||||
if (bce.cause is KeyFormatException) {
|
||||
val kfe = bce.cause as KeyFormatException?
|
||||
return resources.getString(KFE_TYPE_MAP.getValue(kfe!!.type))
|
||||
@@ -137,7 +147,8 @@ object ErrorMessages {
|
||||
var cause = throwable
|
||||
while (cause.cause != null) {
|
||||
if (cause is BadConfigException || cause is BackendException ||
|
||||
cause is RootShellException) break
|
||||
cause is RootShellException
|
||||
) break
|
||||
val nextCause = cause.cause!!
|
||||
if (nextCause is RemoteException) break
|
||||
cause = nextCause
|
||||
|
||||
@@ -25,7 +25,7 @@ val Any.applicationScope: CoroutineScope
|
||||
|
||||
val Preference.activity: SettingsActivity
|
||||
get() = context as? SettingsActivity
|
||||
?: throw IllegalStateException("Failed to resolve SettingsActivity")
|
||||
?: throw IllegalStateException("Failed to resolve SettingsActivity")
|
||||
|
||||
val Preference.lifecycleScope: CoroutineScope
|
||||
get() = activity.lifecycleScope
|
||||
|
||||
@@ -55,11 +55,13 @@ class QrCodeFromFileScanner(
|
||||
multFactor = originalWidth.toFloat() / originalHeight.toFloat()
|
||||
newWidth = (newHeight * multFactor).toInt()
|
||||
}
|
||||
|
||||
originalWidth > originalHeight -> {
|
||||
newWidth = scaledSize
|
||||
multFactor = originalHeight.toFloat() / originalWidth.toFloat()
|
||||
newHeight = (newWidth * multFactor).toInt()
|
||||
}
|
||||
|
||||
originalHeight == originalWidth -> {
|
||||
newHeight = scaledSize
|
||||
newWidth = scaledSize
|
||||
|
||||
@@ -15,7 +15,6 @@ import com.wireguard.android.Application
|
||||
import com.wireguard.android.R
|
||||
import java.util.Locale
|
||||
import kotlin.time.Duration.Companion.seconds
|
||||
import kotlin.time.DurationUnit
|
||||
|
||||
object QuantityFormatter {
|
||||
fun formatBytes(bytes: Long): String {
|
||||
|
||||
@@ -24,7 +24,6 @@ import java.io.BufferedReader
|
||||
import java.io.ByteArrayInputStream
|
||||
import java.io.InputStreamReader
|
||||
import java.nio.charset.StandardCharsets
|
||||
import java.util.ArrayList
|
||||
import java.util.zip.ZipEntry
|
||||
import java.util.zip.ZipInputStream
|
||||
|
||||
@@ -135,12 +134,16 @@ object TunnelImporter {
|
||||
message = context.getString(R.string.import_success, tunnels[0].name)
|
||||
else if (tunnels.isEmpty() && throwables.size == 1)
|
||||
else if (throwables.isEmpty())
|
||||
message = context.resources.getQuantityString(R.plurals.import_total_success,
|
||||
tunnels.size, tunnels.size)
|
||||
message = context.resources.getQuantityString(
|
||||
R.plurals.import_total_success,
|
||||
tunnels.size, tunnels.size
|
||||
)
|
||||
else if (!throwables.isEmpty())
|
||||
message = context.resources.getQuantityString(R.plurals.import_partial_success,
|
||||
tunnels.size + throwables.size,
|
||||
tunnels.size, tunnels.size + throwables.size)
|
||||
message = context.resources.getQuantityString(
|
||||
R.plurals.import_partial_success,
|
||||
tunnels.size + throwables.size,
|
||||
tunnels.size, tunnels.size + throwables.size
|
||||
)
|
||||
|
||||
messageCallback(message)
|
||||
}
|
||||
|
||||
@@ -55,9 +55,9 @@ class ConfigProxy : Parcelable {
|
||||
val resolvedPeers: MutableCollection<Peer> = ArrayList()
|
||||
peers.forEach { resolvedPeers.add(it.resolve()) }
|
||||
return Config.Builder()
|
||||
.setInterface(`interface`.resolve())
|
||||
.addPeers(resolvedPeers)
|
||||
.build()
|
||||
.setInterface(`interface`.resolve())
|
||||
.addPeers(resolvedPeers)
|
||||
.build()
|
||||
}
|
||||
|
||||
override fun writeToParcel(dest: Parcel, flags: Int) {
|
||||
|
||||
@@ -16,8 +16,6 @@ import com.wireguard.config.Attribute
|
||||
import com.wireguard.config.BadConfigException
|
||||
import com.wireguard.config.Peer
|
||||
import java.lang.ref.WeakReference
|
||||
import java.util.ArrayList
|
||||
import java.util.LinkedHashSet
|
||||
|
||||
class PeerProxy : BaseObservable, Parcelable {
|
||||
private val dnsRoutes: MutableList<String?> = ArrayList()
|
||||
@@ -240,24 +238,32 @@ class PeerProxy : BaseObservable, Parcelable {
|
||||
peerProxy.setTotalPeers(sender.size)
|
||||
}
|
||||
|
||||
override fun onItemRangeChanged(sender: ObservableList<PeerProxy?>,
|
||||
positionStart: Int, itemCount: Int) {
|
||||
override fun onItemRangeChanged(
|
||||
sender: ObservableList<PeerProxy?>,
|
||||
positionStart: Int, itemCount: Int
|
||||
) {
|
||||
// Do nothing.
|
||||
}
|
||||
|
||||
override fun onItemRangeInserted(sender: ObservableList<PeerProxy?>,
|
||||
positionStart: Int, itemCount: Int) {
|
||||
override fun onItemRangeInserted(
|
||||
sender: ObservableList<PeerProxy?>,
|
||||
positionStart: Int, itemCount: Int
|
||||
) {
|
||||
onChanged(sender)
|
||||
}
|
||||
|
||||
override fun onItemRangeMoved(sender: ObservableList<PeerProxy?>,
|
||||
fromPosition: Int, toPosition: Int,
|
||||
itemCount: Int) {
|
||||
override fun onItemRangeMoved(
|
||||
sender: ObservableList<PeerProxy?>,
|
||||
fromPosition: Int, toPosition: Int,
|
||||
itemCount: Int
|
||||
) {
|
||||
// Do nothing.
|
||||
}
|
||||
|
||||
override fun onItemRangeRemoved(sender: ObservableList<PeerProxy?>,
|
||||
positionStart: Int, itemCount: Int) {
|
||||
override fun onItemRangeRemoved(
|
||||
sender: ObservableList<PeerProxy?>,
|
||||
positionStart: Int, itemCount: Int
|
||||
) {
|
||||
onChanged(sender)
|
||||
}
|
||||
}
|
||||
@@ -276,12 +282,12 @@ class PeerProxy : BaseObservable, Parcelable {
|
||||
@JvmField
|
||||
val CREATOR: Parcelable.Creator<PeerProxy> = PeerProxyCreator()
|
||||
private val IPV4_PUBLIC_NETWORKS = setOf(
|
||||
"0.0.0.0/5", "8.0.0.0/7", "11.0.0.0/8", "12.0.0.0/6", "16.0.0.0/4", "32.0.0.0/3",
|
||||
"64.0.0.0/2", "128.0.0.0/3", "160.0.0.0/5", "168.0.0.0/6", "172.0.0.0/12",
|
||||
"172.32.0.0/11", "172.64.0.0/10", "172.128.0.0/9", "173.0.0.0/8", "174.0.0.0/7",
|
||||
"176.0.0.0/4", "192.0.0.0/9", "192.128.0.0/11", "192.160.0.0/13", "192.169.0.0/16",
|
||||
"192.170.0.0/15", "192.172.0.0/14", "192.176.0.0/12", "192.192.0.0/10",
|
||||
"193.0.0.0/8", "194.0.0.0/7", "196.0.0.0/6", "200.0.0.0/5", "208.0.0.0/4"
|
||||
"0.0.0.0/5", "8.0.0.0/7", "11.0.0.0/8", "12.0.0.0/6", "16.0.0.0/4", "32.0.0.0/3",
|
||||
"64.0.0.0/2", "128.0.0.0/3", "160.0.0.0/5", "168.0.0.0/6", "172.0.0.0/12",
|
||||
"172.32.0.0/11", "172.64.0.0/10", "172.128.0.0/9", "173.0.0.0/8", "174.0.0.0/7",
|
||||
"176.0.0.0/4", "192.0.0.0/9", "192.128.0.0/11", "192.160.0.0/13", "192.169.0.0/16",
|
||||
"192.170.0.0/15", "192.172.0.0/14", "192.176.0.0/12", "192.192.0.0/10",
|
||||
"193.0.0.0/8", "194.0.0.0/7", "196.0.0.0/6", "200.0.0.0/5", "208.0.0.0/4"
|
||||
)
|
||||
private val IPV4_WILDCARD = setOf("0.0.0.0/0")
|
||||
}
|
||||
|
||||
@@ -13,10 +13,12 @@ import com.wireguard.crypto.Key
|
||||
* InputFilter for entering WireGuard private/public keys encoded with base64.
|
||||
*/
|
||||
class KeyInputFilter : InputFilter {
|
||||
override fun filter(source: CharSequence,
|
||||
sStart: Int, sEnd: Int,
|
||||
dest: Spanned,
|
||||
dStart: Int, dEnd: Int): CharSequence? {
|
||||
override fun filter(
|
||||
source: CharSequence,
|
||||
sStart: Int, sEnd: Int,
|
||||
dest: Spanned,
|
||||
dStart: Int, dEnd: Int
|
||||
): CharSequence? {
|
||||
var replacement: SpannableStringBuilder? = null
|
||||
var rIndex = 0
|
||||
val dLength = dest.length
|
||||
@@ -26,8 +28,9 @@ class KeyInputFilter : InputFilter {
|
||||
// Restrict characters to the base64 character set.
|
||||
// Ensure adding this character does not push the length over the limit.
|
||||
if ((dIndex + 1 < Key.Format.BASE64.length && isAllowed(c) ||
|
||||
dIndex + 1 == Key.Format.BASE64.length && c == '=') &&
|
||||
dLength + (sIndex - sStart) < Key.Format.BASE64.length) {
|
||||
dIndex + 1 == Key.Format.BASE64.length && c == '=') &&
|
||||
dLength + (sIndex - sStart) < Key.Format.BASE64.length
|
||||
) {
|
||||
++rIndex
|
||||
} else {
|
||||
if (replacement == null) replacement = SpannableStringBuilder(source, sStart, sEnd)
|
||||
|
||||
@@ -11,10 +11,10 @@ import android.widget.RelativeLayout
|
||||
import com.wireguard.android.R
|
||||
|
||||
class MultiselectableRelativeLayout @JvmOverloads constructor(
|
||||
context: Context? = null,
|
||||
attrs: AttributeSet? = null,
|
||||
defStyleAttr: Int = 0,
|
||||
defStyleRes: Int = 0
|
||||
context: Context? = null,
|
||||
attrs: AttributeSet? = null,
|
||||
defStyleAttr: Int = 0,
|
||||
defStyleRes: Int = 0
|
||||
) : RelativeLayout(context, attrs, defStyleAttr, defStyleRes) {
|
||||
private var multiselected = false
|
||||
|
||||
|
||||
@@ -13,10 +13,12 @@ import com.wireguard.android.backend.Tunnel
|
||||
* InputFilter for entering WireGuard configuration names (Linux interface names).
|
||||
*/
|
||||
class NameInputFilter : InputFilter {
|
||||
override fun filter(source: CharSequence,
|
||||
sStart: Int, sEnd: Int,
|
||||
dest: Spanned,
|
||||
dStart: Int, dEnd: Int): CharSequence? {
|
||||
override fun filter(
|
||||
source: CharSequence,
|
||||
sStart: Int, sEnd: Int,
|
||||
dest: Spanned,
|
||||
dStart: Int, dEnd: Int
|
||||
): CharSequence? {
|
||||
var replacement: SpannableStringBuilder? = null
|
||||
var rIndex = 0
|
||||
val dLength = dest.length
|
||||
@@ -26,7 +28,8 @@ class NameInputFilter : InputFilter {
|
||||
// Restrict characters to those valid in interfaces.
|
||||
// Ensure adding this character does not push the length over the limit.
|
||||
if (dIndex < Tunnel.NAME_MAX_LENGTH && isAllowed(c) &&
|
||||
dLength + (sIndex - sStart) < Tunnel.NAME_MAX_LENGTH) {
|
||||
dLength + (sIndex - sStart) < Tunnel.NAME_MAX_LENGTH
|
||||
) {
|
||||
++rIndex
|
||||
} else {
|
||||
if (replacement == null) replacement = SpannableStringBuilder(source, sStart, sEnd)
|
||||
|
||||
@@ -35,10 +35,10 @@ class SlashDrawable(private val mDrawable: Drawable) : Drawable() {
|
||||
val radiusX = scale(CORNER_RADIUS, width)
|
||||
val radiusY = scale(CORNER_RADIUS, height)
|
||||
updateRect(
|
||||
scale(LEFT, width),
|
||||
scale(TOP, height),
|
||||
scale(RIGHT, width),
|
||||
scale(TOP + mCurrentSlashLength, height)
|
||||
scale(LEFT, width),
|
||||
scale(TOP, height),
|
||||
scale(RIGHT, width),
|
||||
scale(TOP + mCurrentSlashLength, height)
|
||||
)
|
||||
mPath.reset()
|
||||
// Draw the slash vertically
|
||||
@@ -69,6 +69,7 @@ class SlashDrawable(private val mDrawable: Drawable) : Drawable() {
|
||||
|
||||
override fun getIntrinsicWidth() = mDrawable.intrinsicWidth
|
||||
|
||||
@Deprecated("Deprecated in API level 29")
|
||||
override fun getOpacity() = PixelFormat.OPAQUE
|
||||
|
||||
override fun onBoundsChange(bounds: Rect) {
|
||||
|
||||
@@ -8,8 +8,7 @@
|
||||
app:state_multiselected="true">
|
||||
<color android:color="?attr/colorSurfaceVariant" />
|
||||
</item>
|
||||
<item
|
||||
android:state_activated="true">
|
||||
<item android:state_activated="true">
|
||||
<color android:color="?attr/colorControlHighlight" />
|
||||
</item>
|
||||
</selector>
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto">
|
||||
|
||||
<data>
|
||||
|
||||
<import type="com.wireguard.android.widget.NameInputFilter" />
|
||||
</data>
|
||||
|
||||
@@ -24,7 +25,8 @@
|
||||
android:imeOptions="actionDone"
|
||||
android:inputType="textNoSuggestions|textVisiblePassword"
|
||||
app:filter="@{NameInputFilter.newInstance()}">
|
||||
<requestFocus/>
|
||||
|
||||
<requestFocus />
|
||||
</com.google.android.material.textfield.TextInputEditText>
|
||||
|
||||
</com.google.android.material.textfield.TextInputLayout>
|
||||
|
||||
@@ -60,11 +60,11 @@
|
||||
android:src="@mipmap/ic_launcher" />
|
||||
|
||||
<TextView
|
||||
android:layout_marginStart="@dimen/tunnel_list_placeholder_margin"
|
||||
android:layout_marginEnd="@dimen/tunnel_list_placeholder_margin"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center"
|
||||
android:layout_marginStart="@dimen/tunnel_list_placeholder_margin"
|
||||
android:layout_marginEnd="@dimen/tunnel_list_placeholder_margin"
|
||||
android:text="@string/tunnel_list_placeholder"
|
||||
android:textSize="20sp" />
|
||||
</LinearLayout>
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
unqualifiedResLocale=en-US
|
||||
@@ -1,5 +1,13 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<plurals name="delete_error">
|
||||
<item quantity="zero">غير قادر على حذف %d النفق: %s</item>
|
||||
<item quantity="one">غير قادر على حذف %d النفق: %s</item>
|
||||
<item quantity="two">غير قادر على حذف %d النفق: %s</item>
|
||||
<item quantity="few">غير قادر على حذف %d أنفاق: %s</item>
|
||||
<item quantity="many">غير قادر على حذف %d أنفاق: %s</item>
|
||||
<item quantity="other">غير قادر على حذف %d أنفاق: %s</item>
|
||||
</plurals>
|
||||
<plurals name="delete_success">
|
||||
<item quantity="zero">تم حذف %d من الأنفاق بنجاح</item>
|
||||
<item quantity="one">تم حذف %d من الأنفاق بنجاح</item>
|
||||
@@ -24,6 +32,30 @@
|
||||
<item quantity="many">تم استيراد %1$d من %2$d من الأنفاق</item>
|
||||
<item quantity="other">تم استيراد %1$d من %2$d من الأنفاق</item>
|
||||
</plurals>
|
||||
<plurals name="import_total_success">
|
||||
<item quantity="zero">تم استيراد %d نفق</item>
|
||||
<item quantity="one">تم استيراد %d نفق</item>
|
||||
<item quantity="two">تم استيراد نفقين</item>
|
||||
<item quantity="few">تم استيراد %d أنفاق</item>
|
||||
<item quantity="many">تم استيراد %d أنفاق</item>
|
||||
<item quantity="other">تم استيراد %d أنفاق</item>
|
||||
</plurals>
|
||||
<plurals name="set_excluded_applications">
|
||||
<item quantity="zero">%d تطبيقات مستبعدة</item>
|
||||
<item quantity="one">%d تطبيق مستبعد</item>
|
||||
<item quantity="two">تطبيقين مستبعدين</item>
|
||||
<item quantity="few">%d تطبيقات مستبعدة</item>
|
||||
<item quantity="many">%d تطبيقات مستبعدة</item>
|
||||
<item quantity="other">%d تطبيقات مستبعدة</item>
|
||||
</plurals>
|
||||
<plurals name="set_included_applications">
|
||||
<item quantity="zero">%d تطبيق مضمن</item>
|
||||
<item quantity="one">%d تطبيق مضمن</item>
|
||||
<item quantity="two">تطبيقين مضمننين</item>
|
||||
<item quantity="few">%d تطبيقات مضمنة</item>
|
||||
<item quantity="many">%d تطبيقات مضمنة</item>
|
||||
<item quantity="other">%d تطبيقات مضمنة</item>
|
||||
</plurals>
|
||||
<plurals name="n_excluded_applications">
|
||||
<item quantity="zero">تم استبعاد %d</item>
|
||||
<item quantity="one">تم استبعاد %d</item>
|
||||
@@ -51,6 +83,14 @@
|
||||
<item quantity="many">تضمين %d من التطبيقات</item>
|
||||
<item quantity="other">تضمين %d من التطبيقات</item>
|
||||
</plurals>
|
||||
<plurals name="exclude_n_applications">
|
||||
<item quantity="zero">استبعاد %d تطبيقات</item>
|
||||
<item quantity="one">استبعاد %d تطبيقات</item>
|
||||
<item quantity="two">استبعاد طبيقين</item>
|
||||
<item quantity="few">استبعاد %d تطبيقات</item>
|
||||
<item quantity="many">استبعاد %d تطبيقات</item>
|
||||
<item quantity="other">استبعاد %d تطبيقات</item>
|
||||
</plurals>
|
||||
<plurals name="persistent_keepalive_seconds_unit">
|
||||
<item quantity="zero">كل %d ثانية</item>
|
||||
<item quantity="one">كل ثانية</item>
|
||||
@@ -59,6 +99,14 @@
|
||||
<item quantity="many">كل %d ثوانٍ</item>
|
||||
<item quantity="other">كل %d ثوانٍ</item>
|
||||
</plurals>
|
||||
<plurals name="persistent_keepalive_seconds_suffix">
|
||||
<item quantity="zero">لا ثانية</item>
|
||||
<item quantity="one">ثانية</item>
|
||||
<item quantity="two">ثنيتين</item>
|
||||
<item quantity="few">ثواني</item>
|
||||
<item quantity="many">ثواني</item>
|
||||
<item quantity="other">ثوان</item>
|
||||
</plurals>
|
||||
<string name="use_all_applications">استخدام جميع التطبيقات</string>
|
||||
<string name="add_peer">إضافة ند</string>
|
||||
<string name="addresses">العناوين</string>
|
||||
@@ -113,6 +161,7 @@
|
||||
<string name="tv_add_tunnel_get_started">أضف نفقاً لتبدأ</string>
|
||||
<string name="donate_title">♥️ تبرع لمشروع وايرجارد</string>
|
||||
<string name="donate_summary">كل مساهمة تساعد</string>
|
||||
<string name="donate_google_play_disappointment">شكرًا لك على دعم مشروع\n\nWireGuard! للأسف، نظرًا لسياسات Google، لا يُسمح لنا بالارتباط بجزء من صفحة الويب الخاصة بالمشروع حيث يمكنك التبرع. نأمل أن تتمكن من معرفة ذلك!\n\nشكرًا مرة أخرى على مساهمتك.</string>
|
||||
<string name="disable_config_export_title">تعطيل تصدير التكوين</string>
|
||||
<string name="disable_config_export_description">تعطيل تصدير الإعدادات يجعل المفاتيح الخاصة غير متاحة</string>
|
||||
<string name="dns_servers">خوادم DNS</string>
|
||||
@@ -142,6 +191,8 @@
|
||||
<string name="key_length_explanation_base64">: مفاتيح وايرجارد في الأساس 64 (base64) يجب أن تكون 44 حرفاً (32 بايت)</string>
|
||||
<string name="key_length_explanation_binary">: مفاتيح وايرجارد يجب أن تكون 32 بايت</string>
|
||||
<string name="key_length_explanation_hex">: مفاتيح وايرجارد في نظام عد ستة عشري (hexadecimal) يجب أن تكون 64 حرفاً (32 بايت)</string>
|
||||
<string name="latest_handshake">أحدث مصافحة</string>
|
||||
<string name="latest_handshake_ago">منذ %s</string>
|
||||
<string name="listen_port">منفذ الاستماع</string>
|
||||
<string name="log_export_error">غير قادر على تصدير السجل: %s</string>
|
||||
<string name="log_export_subject">ملف سجل اندرويد وايرجارد</string>
|
||||
@@ -177,6 +228,7 @@
|
||||
<string name="parse_error_integer">رقم</string>
|
||||
<string name="parse_error_reason">لا يمكن تحليل %1$s \"%2$s\"</string>
|
||||
<string name="peer">ند</string>
|
||||
<string name="permission_description">التحكم في أنفاق WireGuard، وتمكين الأنفاق وتعطيلها حسب الرغبة، مما قد يؤدي إلى تضليل حركة مرور الإنترنت</string>
|
||||
<string name="permission_label">التحكم في أنفاق وايرجارد</string>
|
||||
<string name="persistent_keepalive">الحفاظ المستمر</string>
|
||||
<string name="pre_shared_key">مفتاح مسبق التشارك (Pre-shared key)</string>
|
||||
@@ -184,6 +236,10 @@
|
||||
<string name="private_key">مفتاح خاص</string>
|
||||
<string name="public_key">مفتاح عام</string>
|
||||
<string name="qr_code_hint">نصيحة: إنشاء بواسطة `qrencode -t ansiutf8 < tunnel.conf`.</string>
|
||||
<string name="quick_settings_tile_add_title">إضافة بلاطة إلى لوحة الإعدادات السريعة</string>
|
||||
<string name="quick_settings_tile_add_summary">بلاطة الاختصار تستبدل أحدث نفق</string>
|
||||
<string name="quick_settings_tile_add_failure">تعذر إضافة لوحة الاختصار: خطأ %d</string>
|
||||
<string name="quick_settings_tile_action">تبديل النفق</string>
|
||||
<string name="restore_on_boot_summary_off">لن تجلب الأنفاق المفعلة عند التمهيد</string>
|
||||
<string name="restore_on_boot_summary_on">سوف تجلب الأنفاق المفعلة عند التمهيد</string>
|
||||
<string name="restore_on_boot_title">الإستعادة عند تشغيل الجهاز</string>
|
||||
@@ -211,6 +267,7 @@
|
||||
<string name="transfer_gibibytes">%.2f جيبي بايت</string>
|
||||
<string name="transfer_kibibytes">%.2f كيبيبايت</string>
|
||||
<string name="transfer_mibibytes">%.2f مبيبايت</string>
|
||||
<string name="transfer_rx_tx">rx: %1$s, tx: %2$s</string>
|
||||
<string name="transfer_tibibytes">%.2f تيبي بايت</string>
|
||||
<string name="tun_create_error">غير قادر على إنشاء جهاز tun</string>
|
||||
<string name="tunnel_config_error">غير قادر على تكوين النفق (wg-quick أعاد %d)</string>
|
||||
@@ -224,8 +281,19 @@
|
||||
<string name="tunnel_dns_failure">غير قادر على حل اسم مضيف نظام أسماء النطاقات (DNS hostname): \"%s\"</string>
|
||||
<string name="tunnel_rename_error">غير قادر على إعادة تسمية النفق: %s</string>
|
||||
<string name="tunnel_rename_success">تمت إعادة تسمية النفق بنجاح إلى \"%s\"</string>
|
||||
<string name="type_name_go_userspace">انتقل مساحة المستخدمين</string>
|
||||
<string name="type_name_kernel_module">وحدة النواة</string>
|
||||
<string name="unknown_error">خطأ غير معروف</string>
|
||||
<string name="updater_avalable">يتوفر تحديث للتطبيق. الرجاء التحديث الآن.</string>
|
||||
<string name="updater_action">تنزيل & تحديث</string>
|
||||
<string name="updater_rechecking">جارِ جلب تحديث البيانات الوصفية…</string>
|
||||
<string name="updater_download_progress">جارِ تنزيل التحديث: %1$s / %2$s (%3$.2f%%)</string>
|
||||
<string name="updater_download_progress_nototal">جارِ تنزيل التحديث: %s</string>
|
||||
<string name="updater_installing">جارِ تثبيت التحديث…</string>
|
||||
<string name="updater_failure">فشل التحديث: %s. ستتم إعادة المحاولة للحظات…</string>
|
||||
<string name="updater_corrupt_title">التطبيق تالف</string>
|
||||
<string name="updater_corrupt_message">هذا التطبيق تالف. يرجى إعادة تنزيل APK من موقع الويب المرتبط أدناه. بعد ذلك، قم بإلغاء تثبيت هذا التطبيق، وأعِد تثبيته من ملف APK الذي تم تنزيله.</string>
|
||||
<string name="updater_corrupt_navigate">فتح الموقع</string>
|
||||
<string name="version_summary">%1$s خلفية %2$s</string>
|
||||
<string name="version_summary_checking">التحقق من إصدار خلفية %s</string>
|
||||
<string name="version_summary_unknown">إصدار %s غير معروف</string>
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<plurals name="delete_error">
|
||||
<item quantity="one">No s\'ha pogut esborrar %d túnel: %s</item>
|
||||
<item quantity="one">No s\'han pogut esborrar els túnels:</item>
|
||||
<item quantity="other">No s\'han pogut esborrar %d túnels: %s</item>
|
||||
</plurals>
|
||||
<plurals name="delete_success">
|
||||
@@ -79,6 +79,8 @@
|
||||
<string name="bad_config_reason_unknown_section">Secció desconeguda</string>
|
||||
<string name="bad_config_reason_value_out_of_range">Valor fora de rang</string>
|
||||
<string name="bad_extension_error">El fitxer ha de ser .conf o .zip</string>
|
||||
<string name="error_no_qr_found">No s\'ha trobat cap codi QR en la imatge</string>
|
||||
<string name="error_qr_checksum">Ha fallat la verificació de la suma de comprovació del codi QR</string>
|
||||
<string name="cancel">Cancel·la</string>
|
||||
<string name="config_delete_error">No es pot esborrar fitxer de configuració %s</string>
|
||||
<string name="config_exists_error">Configuració per \"%s\" ja existeix</string>
|
||||
@@ -105,14 +107,19 @@
|
||||
<string name="tv_select_a_storage_drive">Seleccioneu un disc d\'emmagatzematge</string>
|
||||
<string name="tv_no_file_picker">Si us plau, instsleu un gestor de fitxers per navegar pels arxius</string>
|
||||
<string name="tv_add_tunnel_get_started">Afegeix un túnel per començar</string>
|
||||
<string name="donate_title">♥ Donar al Projecte WireGuard</string>
|
||||
<string name="donate_summary">Totes les contribucions ajuden</string>
|
||||
<string name="donate_google_play_disappointment">Gràcies per donar suport al Projecte WireGuard!\n\nMalauradament, a causa de les polítiques de Google, no estem permesos a enllaçar a la part del web del projecte on pots realitzar una donació. Esperem que puguis trobar-ho!\n\nGràcies de nou per la teva contribució.</string>
|
||||
<string name="disable_config_export_title">Desactiva l\'exportació de configuracions</string>
|
||||
<string name="disable_config_export_description">Desactivar l\'exportacio de configuracions fa que les claus privades siguin menys accessibles</string>
|
||||
<string name="dns_servers">Servidors DNS</string>
|
||||
<string name="dns_search_domains">Cercar dominis</string>
|
||||
<string name="edit">Edita</string>
|
||||
<string name="endpoint">Extrem</string>
|
||||
<string name="error_down">Error desactivant el túnel: %s</string>
|
||||
<string name="error_fetching_apps">Error obtenint llista d\'aplicacions: %s</string>
|
||||
<string name="error_root">Si us plau, obteniu accés root i torneu a intentar</string>
|
||||
<string name="error_prepare">Error preparant el túnel: %s</string>
|
||||
<string name="error_up">Error activant túnel: %s</string>
|
||||
<string name="exclude_private_ips">Exclou IPs privades</string>
|
||||
<string name="generate_new_private_key">Genera nova clau privada</string>
|
||||
@@ -132,6 +139,8 @@
|
||||
<string name="key_length_explanation_base64">: Les claus en base64 a WireGuard han de tenir 44 caràcters (32 bytes)</string>
|
||||
<string name="key_length_explanation_binary">: Les claus WireGuard han de ser de 32 bytes</string>
|
||||
<string name="key_length_explanation_hex">: Les claus en hexadecimal a WireGuard han de tenir 64 caràcters (32 bytes)</string>
|
||||
<string name="latest_handshake">Últim handshake</string>
|
||||
<string name="latest_handshake_ago">fa %s</string>
|
||||
<string name="listen_port">Port d\'escolta</string>
|
||||
<string name="log_export_error">No s\'ha estat capaç d\'exportar el registre: %s</string>
|
||||
<string name="log_export_subject">WireGuard Android Log File</string>
|
||||
@@ -144,8 +153,10 @@
|
||||
<string name="logcat_error">No es pot executar logcat: </string>
|
||||
<string name="module_enabler_disabled_summary">El mòdul experimental del kernel pot millorar el rendiment</string>
|
||||
<string name="module_enabler_disabled_title">Activa el backend del mòdul del kernel</string>
|
||||
<string name="module_enabler_enabled_summary">El backend més lent de l\'espai d\'usuari pot millorar l\'estabilitat</string>
|
||||
<string name="module_enabler_enabled_title">Desactiva el backend del mòdul del kernel</string>
|
||||
<string name="module_installer_error">Alguna cosa ha anat malament. Si us plau, prova de nou</string>
|
||||
<string name="module_installer_initial">El mòdul experimental del kernel pot millorar el rendiment</string>
|
||||
<string name="module_installer_not_found">El vostre dispositiu no té mòduls disponibles</string>
|
||||
<string name="module_installer_title">Descàrega i instala el mòdul kernel</string>
|
||||
<string name="module_installer_working">Descarregant i instalant…</string>
|
||||
@@ -158,6 +169,7 @@
|
||||
<string name="no_config_error">Intentant activar un túnel que no té configuració</string>
|
||||
<string name="no_configs_error">No s\'ha trobat cap configuració</string>
|
||||
<string name="no_tunnels_error">No existeixen túnels</string>
|
||||
<string name="parse_error_generic">cadena</string>
|
||||
<string name="parse_error_inet_address">Adreça IP</string>
|
||||
<string name="parse_error_inet_endpoint">extrem</string>
|
||||
<string name="parse_error_inet_network">Xarxa IP</string>
|
||||
@@ -172,6 +184,10 @@
|
||||
<string name="private_key">Clau privada</string>
|
||||
<string name="public_key">Clau pública</string>
|
||||
<string name="qr_code_hint">Consell: generar amb `qrencode -t ansiutf8 < tunnel.conf`.</string>
|
||||
<string name="quick_settings_tile_add_title">Afegir mosaic al tauler de configuració ràpida</string>
|
||||
<string name="quick_settings_tile_add_summary">L\'accés directe al mosaic alterna el túnel més recent</string>
|
||||
<string name="quick_settings_tile_add_failure">No s\'ha pogut afegir el mosaic de l\'accés directe: error %d</string>
|
||||
<string name="quick_settings_tile_action">Alternar túnel</string>
|
||||
<string name="restore_on_boot_summary_off">No s\'activaran els túnels seleccionats al arrancar el sistema</string>
|
||||
<string name="restore_on_boot_summary_on">S\'activaran els túnels seleccionats al arrancar el sistema</string>
|
||||
<string name="restore_on_boot_title">Restableix a l\'inici</string>
|
||||
@@ -186,6 +202,9 @@
|
||||
<string name="toggle_error">Error al canviar el túnel WireGuard: %s</string>
|
||||
<string name="tools_installer_already">wg i wg-quick ja estan instalats</string>
|
||||
<string name="tools_installer_failure">No s\'ha pogut instalar les eines de linia de comandes (ets root?)</string>
|
||||
<string name="tools_installer_initial">Instal·lar eines opcionals per l\'scripting</string>
|
||||
<string name="tools_installer_initial_magisk">Instal·lar eines opcionals per l\'scripting com el mòdul Magisk</string>
|
||||
<string name="tools_installer_initial_system">Instal·lar eines opcionals per l\'scripting a la partició del sistema</string>
|
||||
<string name="tools_installer_success_magisk">wg i wg-quick instalats com a mòdul de Magisk (es necessita reinicar)</string>
|
||||
<string name="tools_installer_success_system">wg i wg-quick instalats a la partició de sistema</string>
|
||||
<string name="tools_installer_title">Instala les eines de la línia d\'ordres</string>
|
||||
@@ -204,13 +223,27 @@
|
||||
<string name="tunnel_create_success">El túnel \"%s\" s\'ha creat correctament</string>
|
||||
<string name="tunnel_error_already_exists">El túnel \"%s\" ja existeix</string>
|
||||
<string name="tunnel_error_invalid_name">Nom no vàlid</string>
|
||||
<string name="tunnel_list_placeholder">Afegiu un túnel utilitzant el botó inferior</string>
|
||||
<string name="tunnel_name">Nom del túnel</string>
|
||||
<string name="tunnel_on_error">No s\'ha estat capaç d\'activar el túnel (wgTurnOn ha retornat %d)</string>
|
||||
<string name="tunnel_dns_failure">Impossible resoldre el nom del domini \"%s\"</string>
|
||||
<string name="tunnel_rename_error">No s\'ha pogut renombrar el túnel: %s</string>
|
||||
<string name="tunnel_rename_success">El nom del túnel s\'ha canviat correctament a \"%s\"</string>
|
||||
<string name="type_name_go_userspace">Anar a l\'espai d\'usuari</string>
|
||||
<string name="type_name_kernel_module">Mòdul del kernel</string>
|
||||
<string name="unknown_error">Error desconegut</string>
|
||||
<string name="updater_avalable">Hi ha una actualització disponible. Si us plau, actualitzi ara.</string>
|
||||
<string name="updater_action">Descarregar & Actualitzar</string>
|
||||
<string name="updater_rechecking">Obtenint metadades de l\'actualització…</string>
|
||||
<string name="updater_download_progress">Descarregant actualització: %1$s / %2$s (%3$.2f%%)</string>
|
||||
<string name="updater_download_progress_nototal">Descarregant actualització: %s</string>
|
||||
<string name="updater_installing">Instal·lant actualització…</string>
|
||||
<string name="updater_failure">Error en actualitzar: %s. S\'intentarà de nou en uns instants…</string>
|
||||
<string name="updater_corrupt_title">Aplicació corrupta</string>
|
||||
<string name="updater_corrupt_message">L\'aplicació és corrupta. Si us plau, descarregui de nou l\'APK des del lloc web enllaçat a continuació. A continuació, desinstal·li i reinstal·li-la de l\'APK descarregat.</string>
|
||||
<string name="updater_corrupt_navigate">Obrir el lloc web</string>
|
||||
<string name="version_summary">%1$s backend %2$s</string>
|
||||
<string name="version_summary_checking">Comprovant la versió de backend %s</string>
|
||||
<string name="version_summary_unknown">Versió de %s desconeguda</string>
|
||||
<string name="version_title">WireGuard per a Android v%s</string>
|
||||
<string name="vpn_not_authorized_error">Servei de VPN no autoritzat per l\'usuari</string>
|
||||
|
||||
@@ -105,6 +105,8 @@
|
||||
<string name="bad_config_reason_unknown_section">Neznámá sekce</string>
|
||||
<string name="bad_config_reason_value_out_of_range">Hodnota je mimo rozsah</string>
|
||||
<string name="bad_extension_error">Soubor musí být .conf nebo .zip</string>
|
||||
<string name="error_no_qr_found">V obrázku nebyl nalezen QR kód</string>
|
||||
<string name="error_qr_checksum">Ověření kontrolního součtu QR kódu selhalo</string>
|
||||
<string name="cancel">Zrušit</string>
|
||||
<string name="config_delete_error">Nelze smazat konfigurační soubor %s</string>
|
||||
<string name="config_exists_error">Konfigurace pro „%s“ již existuje</string>
|
||||
@@ -114,13 +116,70 @@
|
||||
<string name="config_save_error">Nelze uložit konfiguraci pro „%1$s“: %2$s</string>
|
||||
<string name="config_save_success">Konfigurace pro „%s“ byla úspěšně uložena</string>
|
||||
<string name="create_activity_title">Vytvořit WireGuard tunel</string>
|
||||
<string name="create_bin_dir_error">Nelze vytvořit místní adresář pro binární soubory</string>
|
||||
<string name="create_downloads_file_error">Nelze vytvořit soubor ve složce Stažené</string>
|
||||
<string name="create_empty">Vytvořit od začátku</string>
|
||||
<string name="create_from_file">Importovat ze souboru nebo archivu</string>
|
||||
<string name="create_from_qr_code">Skenovat z QR kódu</string>
|
||||
<string name="create_output_dir_error">Nelze vytvořit výstupní adresář</string>
|
||||
<string name="create_temp_dir_error">Nelze vytvořit místní dočasný adresář</string>
|
||||
<string name="create_tunnel">Vytvořit tunel</string>
|
||||
<string name="copied_to_clipboard">%s zkopírováno do schránky</string>
|
||||
<string name="dark_theme_summary_off">Aktuálně používáte světlé (denní) téma</string>
|
||||
<string name="dark_theme_summary_on">Aktuálně používáte tmavé (noční) téma</string>
|
||||
<string name="dark_theme_title">Použít tmavé téma</string>
|
||||
<string name="delete">Smazat</string>
|
||||
<string name="tv_delete">Vyberte tunel k odstranění</string>
|
||||
<string name="tv_select_a_storage_drive">Vyberte úložný disk</string>
|
||||
<string name="tv_no_file_picker">Prosím nainstalujte nástroj pro správu souborů pro procházení souborů</string>
|
||||
<string name="tv_add_tunnel_get_started">Přidejte tunel, abyste mohli začít</string>
|
||||
<string name="donate_title">♥ Přispět na projekt WireGuard</string>
|
||||
<string name="donate_summary">Každý příspěvek pomáhá</string>
|
||||
<string name="donate_google_play_disappointment">Děkujeme, že podporujete projekt WireGuard!\n\nBohužel, kvůli pravidlům Googlu, nám není dovoleno odkazovat na část webové stránky projektu, kde můžete provést dar. Doufáme, že to zvládnete nějakým způsobem!\n\nJeště jednou děkujeme za váš příspěvek.</string>
|
||||
<string name="disable_config_export_title">Zakázat export konfigurace</string>
|
||||
<string name="disable_config_export_description">Zakázání exportu konfigurace ztíží přístup k privátním klíčům</string>
|
||||
<string name="dns_servers">DNS servery</string>
|
||||
<string name="dns_search_domains">Hledat domény</string>
|
||||
<string name="edit">Upravit</string>
|
||||
<string name="endpoint">Endpoint</string>
|
||||
<string name="error_down">Chyba při vypínání tunelu: %s</string>
|
||||
<string name="error_fetching_apps">Chyba při načítání seznamu aplikací: %s</string>
|
||||
<string name="error_root">Prosím získejte root přístup a zkuste to znovu</string>
|
||||
<string name="error_prepare">Chyba při přípravě tunelu: %s</string>
|
||||
<string name="error_up">Chyba při zapínání tunelu: %s</string>
|
||||
<string name="exclude_private_ips">Vyloučit soukromé IP adresy</string>
|
||||
<string name="generate_new_private_key">Generovat nový privátní klíč</string>
|
||||
<string name="generic_error">Neznámá chyba „%s“</string>
|
||||
<string name="hint_automatic">(auto)</string>
|
||||
<string name="hint_generated">(vygenerováno)</string>
|
||||
<string name="hint_optional">(volitelné)</string>
|
||||
<string name="hint_optional_discouraged">(volitelné, nedoporučuje se)</string>
|
||||
<string name="hint_random">(náhodné)</string>
|
||||
<string name="illegal_filename_error">Neplatný název souboru „%s“</string>
|
||||
<string name="import_error">Nelze importovat tunel: %s</string>
|
||||
<string name="import_from_qr_code">Importovat tunel z QR kódu</string>
|
||||
<string name="import_success">Importováno „%s“</string>
|
||||
<string name="interface_title">Rozhraní</string>
|
||||
<string name="key_contents_error">Špatné znaky v klíči</string>
|
||||
<string name="key_length_error">Nesprávná délka klíče</string>
|
||||
<string name="key_length_explanation_base64">: Klíče WireGuard ve formátu base64 musí mít 44 znaků (32 bajtů)</string>
|
||||
<string name="key_length_explanation_binary">: Klíče WireGuard musí mít 32 bajtů</string>
|
||||
<string name="key_length_explanation_hex">: Klíče WireGuard ve formátu hex musí mít 64 znaků (32 bajtů)</string>
|
||||
<string name="latest_handshake">Poslední handshake</string>
|
||||
<string name="latest_handshake_ago">před %s</string>
|
||||
<string name="listen_port">Port pro naslouchání</string>
|
||||
<string name="log_export_error">Nelze exportovat protokol: %s</string>
|
||||
<string name="log_export_subject">Soubor protokolu Android WireGuard</string>
|
||||
<string name="log_export_success">Uloženo do „%s“</string>
|
||||
<string name="log_export_title">Exportovat soubor protokolu</string>
|
||||
<string name="log_saver_activity_label">Uložit protokol</string>
|
||||
<string name="log_viewer_pref_summary">Logy mohou pomoci s debuggingem</string>
|
||||
<string name="log_viewer_pref_title">Zobrazit log aplikace</string>
|
||||
<string name="log_viewer_title">Log</string>
|
||||
<string name="logcat_error">Nelze spustit logcat: </string>
|
||||
<string name="module_enabler_disabled_summary">Experimentální kernel modul může zlepšit výkon</string>
|
||||
<string name="module_enabler_disabled_title">Povolit backend kernel modulu</string>
|
||||
<string name="module_enabler_enabled_summary">Pomalejší uživatelský prostor může zlepšit stabilitu</string>
|
||||
<string name="module_enabler_enabled_title">Vypnout backend kernel modulu</string>
|
||||
<string name="module_installer_error">Něco se pokazilo. Zkuste to prosím znovu</string>
|
||||
<string name="module_installer_initial">Experimentální kernel modul může zlepšit výkon</string>
|
||||
@@ -133,4 +192,94 @@
|
||||
<string name="multiple_tunnels_summary_on">Více tunelů může být zapnuto najednou</string>
|
||||
<string name="multiple_tunnels_title">Povolit více simultánních tunelů</string>
|
||||
<string name="name">Název</string>
|
||||
<string name="no_config_error">Snažím se zapnout tunel bez konfigurace</string>
|
||||
<string name="no_configs_error">Nenalezeny žádné konfigurace</string>
|
||||
<string name="no_tunnels_error">Žádné tunely neexistují</string>
|
||||
<string name="parse_error_generic">řetězec</string>
|
||||
<string name="parse_error_inet_address">IP adresa</string>
|
||||
<string name="parse_error_inet_endpoint">koncový bod</string>
|
||||
<string name="parse_error_inet_network">IP síť</string>
|
||||
<string name="parse_error_integer">číslo</string>
|
||||
<string name="parse_error_reason">Nelze analyzovat %1$s “%2$s“</string>
|
||||
<string name="peer">Peer</string>
|
||||
<string name="permission_description">ovládání tunelů WireGuard, libovolné povolování a zakazování tunelů, což může vést k nesprávnému směrování internetového provozu</string>
|
||||
<string name="permission_label">spravovat WireGuard tunely</string>
|
||||
<string name="persistent_keepalive">Udržování spojení</string>
|
||||
<string name="pre_shared_key">Předsdílený klíč</string>
|
||||
<string name="pre_shared_key_enabled">povoleno</string>
|
||||
<string name="private_key">Privátní klíč</string>
|
||||
<string name="public_key">Veřejný klíč</string>
|
||||
<string name="qr_code_hint">Tip: generujte pomocí `qrencode -t ansiutf8 < tunel.conf`.</string>
|
||||
<string name="quick_settings_tile_add_title">Přidat dlaždici do panelu rychlého nastavení</string>
|
||||
<string name="quick_settings_tile_add_summary">Dlaždice zkratek přepíná nejnovější tunel</string>
|
||||
<string name="quick_settings_tile_add_failure">Nelze přidat dlaždici zástupce: chyba %d</string>
|
||||
<string name="quick_settings_tile_action">Přepnout tunel</string>
|
||||
<string name="restore_on_boot_summary_off">Při spuštění systému se nezapnou povolené tunely</string>
|
||||
<string name="restore_on_boot_summary_on">Při spuštění systému se zapnou povolené tunely</string>
|
||||
<string name="restore_on_boot_title">Obnovit při spuštění</string>
|
||||
<string name="save">Uložit</string>
|
||||
<string name="select_all">Vybrat vše</string>
|
||||
<string name="settings">Nastavení</string>
|
||||
<string name="shell_exit_status_read_error">Shell nemůže přečíst stav ukončení</string>
|
||||
<string name="shell_marker_count_error">Shell očekával 4 značky, obdržel %d</string>
|
||||
<string name="shell_start_error">Shell se nepodařilo spustit: %d</string>
|
||||
<string name="success_application_will_restart">Úspěch. Aplikace se nyní restartuje…</string>
|
||||
<string name="toggle_all">Přepnout vše</string>
|
||||
<string name="toggle_error">Chyba při přepínání tunelu WireGuard: %s</string>
|
||||
<string name="tools_installer_already">wg a wg-quick jsou již nainstalovány</string>
|
||||
<string name="tools_installer_failure">Nelze nainstalovat nástroje příkazového řádku (bez roota?)</string>
|
||||
<string name="tools_installer_initial">Instalace volitelných nástrojů pro skriptování</string>
|
||||
<string name="tools_installer_initial_magisk">Instalace volitelných nástrojů pro skriptování jako modul Magisk</string>
|
||||
<string name="tools_installer_initial_system">Instalovat volitelné nástroje pro skriptování do systémového oddílu</string>
|
||||
<string name="tools_installer_success_magisk">wg a wg-quick nainstalované jako modul Magisk (nutný restart)</string>
|
||||
<string name="tools_installer_success_system">wg a wg-quick nainstalovány do systémového oddílu</string>
|
||||
<string name="tools_installer_title">Nainstalujte nástroje příkazového řádku</string>
|
||||
<string name="tools_installer_working">Instaluji wg a wg-quick</string>
|
||||
<string name="tools_unavailable_error">Požadované nástroje nejsou k dispozici</string>
|
||||
<string name="transfer">Přenos</string>
|
||||
<string name="transfer_bytes">%d B</string>
|
||||
<string name="transfer_gibibytes">%.2f GiB</string>
|
||||
<string name="transfer_kibibytes">%.2f KiB</string>
|
||||
<string name="transfer_mibibytes">%.2f MiB</string>
|
||||
<string name="transfer_rx_tx">rx: %1$s, tx: %2$s</string>
|
||||
<string name="transfer_tibibytes">%.2f TiB</string>
|
||||
<string name="tun_create_error">Nelze vytvořit tun zařízení</string>
|
||||
<string name="tunnel_config_error">Nelze nakonfigurovat tunel (wg-quick vrátil %d)</string>
|
||||
<string name="tunnel_create_error">Nelze vytvořit tunel: %s</string>
|
||||
<string name="tunnel_create_success">Tunel „%s“ byl úspěšně vytvořen</string>
|
||||
<string name="tunnel_error_already_exists">Tunel „%s“ již existuje</string>
|
||||
<string name="tunnel_error_invalid_name">Neplatný název</string>
|
||||
<string name="tunnel_list_placeholder">Přidejte tunel pomocí tlačítka níže</string>
|
||||
<string name="tunnel_name">Název tunelu</string>
|
||||
<string name="tunnel_on_error">Nelze zapnout tunel (wgTurnOn vrátil %d)</string>
|
||||
<string name="tunnel_dns_failure">Nelze vyřešit DNS hostname: „%s“</string>
|
||||
<string name="tunnel_rename_error">Nelze přejmenovat tunel: %s</string>
|
||||
<string name="tunnel_rename_success">Tunel byl úspěšně přejmenován na „%s“</string>
|
||||
<string name="type_name_go_userspace">Přejít do uživatelského prostoru</string>
|
||||
<string name="type_name_kernel_module">Modul jádra</string>
|
||||
<string name="unknown_error">Neznámá chyba</string>
|
||||
<string name="updater_avalable">Aktualizace aplikace je k dispozici. Aktualizujte nyní.</string>
|
||||
<string name="updater_action">Stáhnout & Aktualizovat</string>
|
||||
<string name="updater_rechecking">Načítání metadat pro aktualizaci…</string>
|
||||
<string name="updater_download_progress">Stahování aktualizace: %1$s / %2$s (%3$.2f%%)</string>
|
||||
<string name="updater_download_progress_nototal">Stahování aktualizace: %s</string>
|
||||
<string name="updater_installing">Instalování aktualizace…</string>
|
||||
<string name="updater_failure">Chyba při aktualizaci: %s. Pokusím se znovu za chvíli…</string>
|
||||
<string name="updater_corrupt_title">Aplikace je poškozená</string>
|
||||
<string name="updater_corrupt_message">Tato aplikace je poškozená. Prosím, znovu stáhněte APK soubor z webové stránky uvedené níže. Poté odinstalujte tuto aplikaci a znovu ji nainstalujte z nově staženého APK souboru.</string>
|
||||
<string name="updater_corrupt_navigate">Otevřít webovou stránku</string>
|
||||
<string name="version_summary">%1$s backend %2$s</string>
|
||||
<string name="version_summary_checking">Kontroluji verzi %s backendu</string>
|
||||
<string name="version_summary_unknown">Neznámá verze %s</string>
|
||||
<string name="version_title">WireGuard pro Android v%s</string>
|
||||
<string name="vpn_not_authorized_error">Služba VPN není autorizována uživatelem</string>
|
||||
<string name="vpn_start_error">Nelze spustit službu VPN pro Android</string>
|
||||
<string name="zip_export_error">Nelze exportovat tunely: %s</string>
|
||||
<string name="zip_export_success">Uloženo do „%s“</string>
|
||||
<string name="zip_export_summary">Zip soubor bude uložen do složky stahování</string>
|
||||
<string name="zip_export_title">Exportovat tunely do souboru zip</string>
|
||||
<string name="biometric_prompt_zip_exporter_title">Ověřte se pro export tunelů</string>
|
||||
<string name="biometric_prompt_private_key_title">Ověřte se pro zobrazení privátního klíče</string>
|
||||
<string name="biometric_auth_error">Ověření selhalo</string>
|
||||
<string name="biometric_auth_error_reason">Chyba ověřování: %s</string>
|
||||
</resources>
|
||||
|
||||
@@ -20,6 +20,14 @@
|
||||
<item quantity="one">Importeret %d tunnel</item>
|
||||
<item quantity="other">Importeret %d tunneler</item>
|
||||
</plurals>
|
||||
<plurals name="set_excluded_applications">
|
||||
<item quantity="one">%d Ekskluderet Applikation</item>
|
||||
<item quantity="other">%d Ekskluderet Applikationer</item>
|
||||
</plurals>
|
||||
<plurals name="set_included_applications">
|
||||
<item quantity="one">%d Inkluderet Applikation</item>
|
||||
<item quantity="other">%d Inkluderet Applikationer</item>
|
||||
</plurals>
|
||||
<plurals name="n_excluded_applications">
|
||||
<item quantity="one">%d ekskluderet</item>
|
||||
<item quantity="other">%d ekskluderet</item>
|
||||
@@ -51,14 +59,20 @@
|
||||
<string name="add_peer">Tilføj modpart</string>
|
||||
<string name="addresses">Adresser</string>
|
||||
<string name="applications">Applikationer</string>
|
||||
<string name="allow_remote_control_intents_summary_off">Eksterne apps kan ikke slå tunneler til/fra (Anbefales)</string>
|
||||
<string name="allow_remote_control_intents_summary_on">Eksterne apps må slå tunneler til/fra (Avanceret)</string>
|
||||
<string name="allow_remote_control_intents_title">Tillad fjernstyring fra eksterne apps</string>
|
||||
<string name="allowed_ips">Tilladte IP-adresser</string>
|
||||
<string name="bad_config_context">%1$s\'s %2$s</string>
|
||||
<string name="bad_config_context_top_level">%s</string>
|
||||
<string name="bad_config_error">%1$s i %2$s</string>
|
||||
<string name="bad_config_explanation_pka">: Skal være positiv og højst 65535</string>
|
||||
<string name="bad_config_explanation_positive_number">: Skal være positiv</string>
|
||||
<string name="bad_config_explanation_udp_port">: Skal være et gyldigt UDP portnummer</string>
|
||||
<string name="bad_config_reason_invalid_key">Ugyldig nøgle</string>
|
||||
<string name="bad_config_reason_invalid_number">Ugyldigt nummer</string>
|
||||
<string name="bad_config_reason_invalid_value">Ugyldig værdi</string>
|
||||
<string name="bad_config_reason_missing_attribute">Manglende attribut</string>
|
||||
<string name="bad_config_reason_missing_section">Mangler sektion</string>
|
||||
<string name="bad_config_reason_syntax_error">Syntaksfejl</string>
|
||||
<string name="bad_config_reason_unknown_attribute">Ukendt egenskab</string>
|
||||
@@ -66,6 +80,7 @@
|
||||
<string name="bad_config_reason_value_out_of_range">Værdi udenfor området</string>
|
||||
<string name="bad_extension_error">Filen skal være .conf eller .zip</string>
|
||||
<string name="error_no_qr_found">QR-kode ikke fundet i billede</string>
|
||||
<string name="error_qr_checksum">QR kode checksum verifikation fejlede</string>
|
||||
<string name="cancel">Annullér</string>
|
||||
<string name="config_delete_error">Kunne ikke slette konfigurationsfilen %s</string>
|
||||
<string name="config_exists_error">Konfiguration for \"%s\" findes allerede</string>
|
||||
@@ -75,21 +90,35 @@
|
||||
<string name="config_save_error">Kan ikke gemme konfigurationen for \"%1$s\": %2$s</string>
|
||||
<string name="config_save_success">Konfiguration for \"%s\" blev gemt</string>
|
||||
<string name="create_activity_title">Opret WireGuard tunnel</string>
|
||||
<string name="create_bin_dir_error">Kan ikke oprette lokal binær mappe</string>
|
||||
<string name="create_downloads_file_error">Kan ikke oprette fil i download-mappen</string>
|
||||
<string name="create_empty">Opret fra ny</string>
|
||||
<string name="create_from_file">Importér fra fil eller arkiv</string>
|
||||
<string name="create_from_qr_code">Scan fra QR-kode</string>
|
||||
<string name="create_output_dir_error">Kan ikke oprette output mappe</string>
|
||||
<string name="create_temp_dir_error">Kan ikke oprette lokal midlertidig mappe</string>
|
||||
<string name="create_tunnel">Opret Tunnel</string>
|
||||
<string name="copied_to_clipboard">%s kopieret til udklipsholder</string>
|
||||
<string name="dark_theme_summary_off">Bruger lige nu lyst (dag) tema</string>
|
||||
<string name="dark_theme_summary_on">Bruger lige nu mørkt (nat) tema</string>
|
||||
<string name="dark_theme_title">Brug mørkt tema</string>
|
||||
<string name="delete">Slet</string>
|
||||
<string name="tv_delete">Vælg tunnel du vil slette</string>
|
||||
<string name="tv_select_a_storage_drive">Vælg et lagerdrev</string>
|
||||
<string name="tv_no_file_picker">Installér venligst et filhåndteringsværktøj til at gennemse filer</string>
|
||||
<string name="tv_add_tunnel_get_started">Tilføj en tunnel for at komme i gang</string>
|
||||
<string name="donate_title">♥ Donér til WireGuard projektet</string>
|
||||
<string name="donate_summary">Et hvert bidrag hjælper</string>
|
||||
<string name="donate_google_play_disappointment">Tak fordi du støttede WireGuard-projektet!\n\nDesværre, på grund af Googles politikker, har vi ikke tilladelse til at linke til den del af projektets webside, hvor du kan donere. Forhåbentlig kan du finde frem til dette!\n\nVi takker igen for dit bidrag.</string>
|
||||
<string name="disable_config_export_title">Deaktivér eksportering af konfiguration</string>
|
||||
<string name="disable_config_export_description">Deaktivering af config eksport gør private nøgler mindre tilgængelige</string>
|
||||
<string name="dns_servers">DNS-servere</string>
|
||||
<string name="dns_search_domains">DNS-søgedomæner</string>
|
||||
<string name="edit">Redigér</string>
|
||||
<string name="endpoint">Slutpunkt</string>
|
||||
<string name="error_down">Fejl ved nedbringelse af tunnel: %s</string>
|
||||
<string name="error_fetching_apps">Fejl under hentning af app-liste: %s</string>
|
||||
<string name="error_root">Få root-adgang og prøv igen</string>
|
||||
<string name="error_prepare">Fejl ved forberedelse af tunnel: %s</string>
|
||||
<string name="error_up">Fejl under aktivering af tunnel: %s</string>
|
||||
<string name="exclude_private_ips">Eksludér private IP-adresser</string>
|
||||
@@ -107,6 +136,11 @@
|
||||
<string name="interface_title">Grænseflade</string>
|
||||
<string name="key_contents_error">Ugyldige tegn i nøgle</string>
|
||||
<string name="key_length_error">Forkert længde på nøgle</string>
|
||||
<string name="key_length_explanation_base64">: WireGuard base64 nøgler skal være 44 tegn (32 bytes)</string>
|
||||
<string name="key_length_explanation_binary">: WireGuard nøgler skal være 32 bytes</string>
|
||||
<string name="key_length_explanation_hex">: WireGuard hex-nøgler skal være 64 tegn (32 bytes)</string>
|
||||
<string name="latest_handshake">Seneste håndtryk</string>
|
||||
<string name="latest_handshake_ago">%s siden</string>
|
||||
<string name="listen_port">Lytteport</string>
|
||||
<string name="log_export_error">Kunne ikke eksportere log: %s</string>
|
||||
<string name="log_export_subject">WireGuard Android Log-fil</string>
|
||||
@@ -117,12 +151,22 @@
|
||||
<string name="log_viewer_pref_title">Vis applikationslog</string>
|
||||
<string name="log_viewer_title">Log</string>
|
||||
<string name="logcat_error">Kunne ikke køre logcat: </string>
|
||||
<string name="module_enabler_disabled_summary">Det eksperimentelle kerne modul kan forbedre ydeevnen</string>
|
||||
<string name="module_enabler_disabled_title">Aktiver kernemodul backend</string>
|
||||
<string name="module_enabler_enabled_summary">Det langsommere brugerområde backend kan forbedre stabiliteten</string>
|
||||
<string name="module_enabler_enabled_title">Deaktiver Kerne Module bacnkend</string>
|
||||
<string name="module_installer_error">Noget gik galt. Forsøg venligst igen</string>
|
||||
<string name="module_installer_initial">Det eksperimentelle kerne modul kan forbedre ydeevnen</string>
|
||||
<string name="module_installer_not_found">Ingen moduler er tilgængelige for din enhed</string>
|
||||
<string name="module_installer_title">Hent og installér kerne-modul</string>
|
||||
<string name="module_installer_working">Henter og installerer…</string>
|
||||
<string name="module_version_error">Kan ikke afgøre kernemodul version</string>
|
||||
<string name="mtu">MTU</string>
|
||||
<string name="multiple_tunnels_summary_off">Aktivering af en tunnel vil lukke andre tunneler</string>
|
||||
<string name="multiple_tunnels_summary_on">Flere tunneler kan tændes samtidigt</string>
|
||||
<string name="multiple_tunnels_title">Tillad flere samtidige tunneler</string>
|
||||
<string name="name">Navn</string>
|
||||
<string name="no_config_error">Forsøger at skabe en tunnel uden konfiguration</string>
|
||||
<string name="no_configs_error">Ingen konfigurationer fundet</string>
|
||||
<string name="no_tunnels_error">Ingen tilgængelige tunneler</string>
|
||||
<string name="parse_error_generic">streng</string>
|
||||
@@ -130,18 +174,42 @@
|
||||
<string name="parse_error_inet_endpoint">slutpunkt</string>
|
||||
<string name="parse_error_inet_network">IP netværk</string>
|
||||
<string name="parse_error_integer">nummer</string>
|
||||
<string name="parse_error_reason">Kan ikke parse %1$s “%2$s”</string>
|
||||
<string name="peer">Modpart</string>
|
||||
<string name="permission_description">kontrollere WireGuard-tunnellerne, ved at aktivere og deaktivere tunneller, kan det potentielt vildlede internettrafikken</string>
|
||||
<string name="permission_label">håndtér WireGuard-tunneler</string>
|
||||
<string name="persistent_keepalive">Vedvarende keepalive</string>
|
||||
<string name="pre_shared_key">Forhåndsdelt nøgle</string>
|
||||
<string name="pre_shared_key_enabled">aktiveret</string>
|
||||
<string name="private_key">Privat nøgle</string>
|
||||
<string name="public_key">Offentlig nøgle</string>
|
||||
<string name="qr_code_hint">Tip: generere med `qrencode -t ansiutf8 < tunnel.conf`.</string>
|
||||
<string name="quick_settings_tile_add_title">Tilføj genvej til hurtig-indstillingspanelet</string>
|
||||
<string name="quick_settings_tile_add_summary">Genvejstasten aktivere den seneste tunnel</string>
|
||||
<string name="quick_settings_tile_add_failure">Kan ikke tilføje genvej: fejl %d</string>
|
||||
<string name="quick_settings_tile_action">Slå tunnel til/fra</string>
|
||||
<string name="restore_on_boot_summary_off">Vil ikke aktivere tændte tunneler ved opstart</string>
|
||||
<string name="restore_on_boot_summary_on">Vil tænde aktiverede tunneler ved opstart</string>
|
||||
<string name="restore_on_boot_title">Gendan ved opstart</string>
|
||||
<string name="save">Gem</string>
|
||||
<string name="select_all">Vælg alle</string>
|
||||
<string name="settings">Indstillinger</string>
|
||||
<string name="shell_exit_status_read_error">Shell kan ikke læse exit-status</string>
|
||||
<string name="shell_marker_count_error">Shell forventede 4 markører, modtog %d</string>
|
||||
<string name="shell_start_error">Shell kunne ikke startes: %d</string>
|
||||
<string name="success_application_will_restart">Succes. Applikationen vil nu genstarte…</string>
|
||||
<string name="toggle_all">Vælg/Fravælg Alle</string>
|
||||
<string name="toggle_error">Fejl under aktivering af WireGuard-tunnel: %s</string>
|
||||
<string name="tools_installer_already">wg og wg-quick er allerede installeret</string>
|
||||
<string name="tools_installer_failure">Kan ikke installere kommandolinjeværktøjer (ingen root?)</string>
|
||||
<string name="tools_installer_initial">Installér valgfrie værktøjer til scripting</string>
|
||||
<string name="tools_installer_initial_magisk">Installér valgfrie værktøjer til scripting som Magisk modul</string>
|
||||
<string name="tools_installer_initial_system">Installér valgfrie værktøjer til scripting i systempartitionen</string>
|
||||
<string name="tools_installer_success_magisk">wg og wg-quick installeret som et Magisk modul (genstart påkrævet)</string>
|
||||
<string name="tools_installer_success_system">wg og wg-quick installeret i systempartitionen</string>
|
||||
<string name="tools_installer_title">Installér kommandolinjeværktøjer</string>
|
||||
<string name="tools_installer_working">Installerer wg og wg-quick</string>
|
||||
<string name="tools_unavailable_error">Påkrævede værktøjer er ikke tilgængelige</string>
|
||||
<string name="transfer">Overførsel</string>
|
||||
<string name="transfer_bytes">%d B</string>
|
||||
<string name="transfer_gibibytes">%.2f GiB</string>
|
||||
@@ -157,16 +225,35 @@
|
||||
<string name="tunnel_error_invalid_name">Ugyldigt navn</string>
|
||||
<string name="tunnel_list_placeholder">Tilføj en tunnel ved hjælp af knappen nedenfor</string>
|
||||
<string name="tunnel_name">Tunnel Navn</string>
|
||||
<string name="tunnel_on_error">Kan ikke aktivere tunnelen (wgTurnOn returnerede %d)</string>
|
||||
<string name="tunnel_dns_failure">Kunne ikke opslå DNS adresse: \"%s\"</string>
|
||||
<string name="tunnel_rename_error">Kan ikke omdøbe tunnel: %s</string>
|
||||
<string name="tunnel_rename_success">Tunnel blev succesfuldt omdøbt til \"%s\"</string>
|
||||
<string name="type_name_go_userspace">Go userspace</string>
|
||||
<string name="type_name_kernel_module">Kerne modul</string>
|
||||
<string name="unknown_error">Ukendt fejl</string>
|
||||
<string name="updater_avalable">En applikationsopdatering er tilgængelig. Opdatér venligst nu.</string>
|
||||
<string name="updater_action">Hent & Opdatér</string>
|
||||
<string name="updater_rechecking">Henter opdateringsmetadata…</string>
|
||||
<string name="updater_download_progress">Henter opdatering: %1$s / %2$s (%3$.2f%%)</string>
|
||||
<string name="updater_download_progress_nototal">Henter opdatering: %s</string>
|
||||
<string name="updater_installing">Installerer opdatering…</string>
|
||||
<string name="updater_failure">Opdateringsfejl: %s. Vil prøve igen om lidt…</string>
|
||||
<string name="updater_corrupt_title">Applikation Korrupt</string>
|
||||
<string name="updater_corrupt_message">Denne applikation er korrupt. Download venligst APK fra websted linket nedenfor. Afinstaller denne applikation, og geninstaller den fra den downloadede APK.</string>
|
||||
<string name="updater_corrupt_navigate">Åbn webside</string>
|
||||
<string name="version_summary">%1$s backend %2$s</string>
|
||||
<string name="version_summary_checking">Kontrollerer %s backend version</string>
|
||||
<string name="version_summary_unknown">Ukendt %s version</string>
|
||||
<string name="version_title">WireGuard for Android v%s</string>
|
||||
<string name="vpn_not_authorized_error">VPN-tjeneste ikke godkendt af bruger</string>
|
||||
<string name="vpn_start_error">Kan ikke starte Android VPN-tjeneste</string>
|
||||
<string name="zip_export_error">Ikke i stand til at eksportere tunneler: %s</string>
|
||||
<string name="zip_export_success">Gemt til \"%s\"</string>
|
||||
<string name="zip_export_summary">Zip-filen vil blive gemt i download-mappen</string>
|
||||
<string name="zip_export_title">Eksportér tunneler til zip-fil</string>
|
||||
<string name="biometric_prompt_zip_exporter_title">Godkend til eksport af tunneller</string>
|
||||
<string name="biometric_prompt_private_key_title">Godkend for at se privat nøgle</string>
|
||||
<string name="biometric_auth_error">Fejl ved godkendelse</string>
|
||||
<string name="biometric_auth_error_reason">Fejl ved godkendelse: %s</string>
|
||||
</resources>
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<plurals name="delete_error">
|
||||
<item quantity="one">%d Tunnel konnten nicht gelöscht werden: %s</item>
|
||||
<item quantity="one">%d Tunnel konnte nicht gelöscht werden: %s</item>
|
||||
<item quantity="other">%d Tunnel konnten nicht gelöscht werden: %s</item>
|
||||
</plurals>
|
||||
<plurals name="delete_success">
|
||||
@@ -14,7 +14,7 @@
|
||||
</plurals>
|
||||
<plurals name="import_partial_success">
|
||||
<item quantity="one">%1$d von %2$d Tunnel importiert</item>
|
||||
<item quantity="other">%1$d von %2$d Tunnel importiert</item>
|
||||
<item quantity="other">%1$d von %2$d Tunneln importiert</item>
|
||||
</plurals>
|
||||
<plurals name="import_total_success">
|
||||
<item quantity="one">%d Tunnel importiert</item>
|
||||
@@ -25,27 +25,27 @@
|
||||
<item quantity="other">%d ausgeschlossene Anwendungen</item>
|
||||
</plurals>
|
||||
<plurals name="set_included_applications">
|
||||
<item quantity="one">%d einbezogene Anwendung</item>
|
||||
<item quantity="other">%d einbezogene Anwendungen</item>
|
||||
<item quantity="one">%d eingeschlossene Anwendung</item>
|
||||
<item quantity="other">%d eingeschlossene Anwendungen</item>
|
||||
</plurals>
|
||||
<plurals name="n_excluded_applications">
|
||||
<item quantity="one">%d ausgeschlossen</item>
|
||||
<item quantity="other">%d ausgeschlossen</item>
|
||||
</plurals>
|
||||
<plurals name="n_included_applications">
|
||||
<item quantity="one">%d einbezogen</item>
|
||||
<item quantity="one">%d eingeschlossen</item>
|
||||
<item quantity="other">%d einbezogen</item>
|
||||
</plurals>
|
||||
<string name="all_applications">Alle Anwendungen</string>
|
||||
<string name="exclude_from_tunnel">Ausschließen</string>
|
||||
<string name="include_in_tunnel">Nur einbeziehen</string>
|
||||
<string name="include_in_tunnel">Nur einschließen</string>
|
||||
<plurals name="include_n_applications">
|
||||
<item quantity="one">%d App einbeziehen</item>
|
||||
<item quantity="other">%d App einbeziehen</item>
|
||||
<item quantity="one">%d App einschließen</item>
|
||||
<item quantity="other">%d Apps einschließen</item>
|
||||
</plurals>
|
||||
<plurals name="exclude_n_applications">
|
||||
<item quantity="one">%d App ausschließen</item>
|
||||
<item quantity="other">%d App ausschließen</item>
|
||||
<item quantity="other">%d Apps ausschließen</item>
|
||||
</plurals>
|
||||
<plurals name="persistent_keepalive_seconds_unit">
|
||||
<item quantity="one">jede Sekunde</item>
|
||||
@@ -66,7 +66,7 @@
|
||||
<string name="bad_config_context">%2$s des %1$s</string>
|
||||
<string name="bad_config_context_top_level">%s</string>
|
||||
<string name="bad_config_error">%1$s in %2$s</string>
|
||||
<string name="bad_config_explanation_pka">: Muss positiv sein und nicht größer als 65535</string>
|
||||
<string name="bad_config_explanation_pka">: Muss positiv und nicht größer als 65535 sein</string>
|
||||
<string name="bad_config_explanation_positive_number">: Muss positiv sein</string>
|
||||
<string name="bad_config_explanation_udp_port">: Muss eine gültige UDP-Portnummer sein</string>
|
||||
<string name="bad_config_reason_invalid_key">Ungültiger Schlüssel</string>
|
||||
@@ -80,71 +80,74 @@
|
||||
<string name="bad_config_reason_value_out_of_range">Wert ist außerhalb des gültigen Bereichs</string>
|
||||
<string name="bad_extension_error">Dateiendung muss .conf oder .zip sein</string>
|
||||
<string name="error_no_qr_found">Es wurde kein QR-Code im Bild gefunden</string>
|
||||
<string name="error_qr_checksum">Die QR-Code Prüfsummenkontrolle ist fehlgeschlagen</string>
|
||||
<string name="error_qr_checksum">Die Prüfsummenkontrolle des QR-Codes ist fehlgeschlagen</string>
|
||||
<string name="cancel">Abbrechen</string>
|
||||
<string name="config_delete_error">Konfigurationsdatei %s kann nicht gelöscht werden</string>
|
||||
<string name="config_exists_error">Konfiguration für „%s“ existiert bereits</string>
|
||||
<string name="config_file_exists_error">Konfigurationsdatei „%s“ existiert bereits</string>
|
||||
<string name="config_not_found_error">Konfigurationsdatei „%s“ nicht gefunden</string>
|
||||
<string name="config_rename_error">Konfigurationsdatei „%s “ kann nicht umbenannt werden</string>
|
||||
<string name="config_rename_error">Konfigurationsdatei „%s“ kann nicht umbenannt werden</string>
|
||||
<string name="config_save_error">Konfiguration für „%1$s“ kann nicht gespeichert werden: %2$s</string>
|
||||
<string name="config_save_success">Konfiguration für „%s ” erfolgreich gespeichert</string>
|
||||
<string name="config_save_success">Konfiguration für „%s” erfolgreich gespeichert</string>
|
||||
<string name="create_activity_title">WireGuard-Tunnel erstellen</string>
|
||||
<string name="create_bin_dir_error">Lokales Anwendungsverzeichnis kann nicht erstellt werden</string>
|
||||
<string name="create_downloads_file_error">Datei kann im Download-Verzeichnis nicht erstellt werden</string>
|
||||
<string name="create_empty">Neu erstellen</string>
|
||||
<string name="create_bin_dir_error">Lokales Binärverzeichnis kann nicht erstellt werden</string>
|
||||
<string name="create_downloads_file_error">Datei konnte im Download-Verzeichnis nicht erstellt werden</string>
|
||||
<string name="create_empty">Von Grund auf erstellen</string>
|
||||
<string name="create_from_file">Aus Datei oder Archiv importieren</string>
|
||||
<string name="create_from_qr_code">Von QR-Code scannen</string>
|
||||
<string name="create_output_dir_error">Konnte das Ausgabeverzeichnis nicht erstellen</string>
|
||||
<string name="create_temp_dir_error">Lokales temporäres Verzeichnis kann nicht erstellt werden</string>
|
||||
<string name="create_temp_dir_error">Lokales temporäres Verzeichnis konnte nicht erstellt werden</string>
|
||||
<string name="create_tunnel">Tunnel erstellen</string>
|
||||
<string name="copied_to_clipboard">%s in die Zwischenanlage kopiert</string>
|
||||
<string name="dark_theme_summary_off">Verwende helles Design (Tag)</string>
|
||||
<string name="dark_theme_summary_on">Verwende dunkles Design (Nacht)</string>
|
||||
<string name="dark_theme_title">Dunkles Design verwenden</string>
|
||||
<string name="copied_to_clipboard">%s in die Zwischenablage kopiert</string>
|
||||
<string name="dark_theme_summary_off">Helles (Tag) Design in Verwendung</string>
|
||||
<string name="dark_theme_summary_on">Dunkles (Nacht) Design in Verwendung</string>
|
||||
<string name="dark_theme_title">Dunkles Farbschema verwenden</string>
|
||||
<string name="delete">Entfernen</string>
|
||||
<string name="tv_delete">Wählen Sie den zu löschenden Tunnel aus</string>
|
||||
<string name="tv_select_a_storage_drive">Wählen Sie ein Speicherlaufwerk</string>
|
||||
<string name="tv_delete">Einen Tunnel zum Löschen auswählen</string>
|
||||
<string name="tv_select_a_storage_drive">Speicherlaufwerk auswählen</string>
|
||||
<string name="tv_no_file_picker">Bitte installieren Sie ein Dateiverwaltungsprogramm, um Dateien zu durchsuchen</string>
|
||||
<string name="tv_add_tunnel_get_started">Fügen Sie einen Tunnel hinzu, um loszulegen</string>
|
||||
<string name="donate_title">♥ Spende an das WireGuard Projekt</string>
|
||||
<string name="donate_title">♥ Spende an das WireGuard-Projekt</string>
|
||||
<string name="donate_summary">Jeder Beitrag hilft</string>
|
||||
<string name="donate_google_play_disappointment">Vielen Dank für Ihre Unterstützung des WireGuard-Projekts!\n\nLeider ist es uns aufgrund der Google-Richtlinien nicht gestattet, einen Link zu dem Teil der Projekt-Webseite zu setzen, auf dem Sie eine Spende tätigen können. Hoffentlich finden Sie das heraus!\n\nNochmals vielen Dank für Ihren Beitrag.</string>
|
||||
<string name="disable_config_export_title">Deaktivieren Sie den Konfigurationsexport</string>
|
||||
<string name="disable_config_export_description">Durch Deaktivieren des Konfigurationsexports werden private Schlüssel weniger zugänglich</string>
|
||||
<string name="dns_servers">Nameserver</string>
|
||||
<string name="donate_google_play_disappointment">Vielen Dank für Ihre Unterstützung des WireGuard-Projekts!\n\nLeider ist es uns aufgrund der Google-Richtlinien nicht gestattet, den Abschnitt der Projekt-Webseite zu verlinken, wo Sie hätten spenden können. Hoffentlich finden Sie das heraus!\n\nNochmals vielen Dank für Ihren Beitrag.</string>
|
||||
<string name="disable_config_export_title">Konfigurationsexport deaktivieren</string>
|
||||
<string name="disable_config_export_description">Durch Deaktivieren des Konfigurationsexports werden private Schlüssel unzugänglicher</string>
|
||||
<string name="dns_servers">DNS-Server</string>
|
||||
<string name="dns_search_domains">Suchdomäne</string>
|
||||
<string name="edit">Bearbeiten</string>
|
||||
<string name="endpoint">Endpunkt</string>
|
||||
<string name="error_down">Fehler beim Abschalten des Tunnels: %s</string>
|
||||
<string name="error_fetching_apps">Fehler beim Abrufen der App-Liste: %s</string>
|
||||
<string name="error_root">Bitte root-Zugriff anfordern und erneut versuchen</string>
|
||||
<string name="error_prepare">Fehler beim Vorbereiten des Tunnels: %s</string>
|
||||
<string name="error_up">Fehler beim Starten des Tunnels: %s</string>
|
||||
<string name="exclude_private_ips">Private IPs ausschließen</string>
|
||||
<string name="generate_new_private_key">Neuen privaten Schlüssel generieren</string>
|
||||
<string name="generic_error">Unbekannter „%s“ Fehler</string>
|
||||
<string name="hint_automatic">(auto)</string>
|
||||
<string name="hint_generated">(erzeugt)</string>
|
||||
<string name="hint_generated">(generiert)</string>
|
||||
<string name="hint_optional">(optional)</string>
|
||||
<string name="hint_optional_discouraged">(optional, nicht empfohlen)</string>
|
||||
<string name="hint_random">(zufällig)</string>
|
||||
<string name="illegal_filename_error">Ungültiger Dateiname „%s“</string>
|
||||
<string name="illegal_filename_error">Unzulässiger Dateiname „%s“</string>
|
||||
<string name="import_error">Kann Tunnel nicht importieren: %s</string>
|
||||
<string name="import_from_qr_code">Tunnel aus QR-Code importieren</string>
|
||||
<string name="import_success">„%s” importiert</string>
|
||||
<string name="interface_title">Interface</string>
|
||||
<string name="key_contents_error">Unzulässige Zeichen im Schlüssel</string>
|
||||
<string name="key_length_error">Falsche Schlüssellänge</string>
|
||||
<string name="key_length_error">Ungültige Schlüssellänge</string>
|
||||
<string name="key_length_explanation_base64">: WireGuard base64-Schlüssel müssen 44 Zeichen enthalten (32 Bytes)</string>
|
||||
<string name="key_length_explanation_binary">: WireGuard-Schlüssel müssen 32 Bytes groß sein</string>
|
||||
<string name="key_length_explanation_hex">: WireGuard Hex-Schlüssel müssen 64 Zeichen (32 Bytes) groß sein</string>
|
||||
<string name="listen_port">Eingangs-Port</string>
|
||||
<string name="latest_handshake">Letzter Handshake</string>
|
||||
<string name="latest_handshake_ago">vor %s</string>
|
||||
<string name="listen_port">Eingangsport</string>
|
||||
<string name="log_export_error">Konnte Protokoll nicht exportieren: %s</string>
|
||||
<string name="log_export_subject">WireGuard Android Protokolldatei</string>
|
||||
<string name="log_export_success">Gespeichert in „%s”</string>
|
||||
<string name="log_export_title">Logdatei exportieren</string>
|
||||
<string name="log_saver_activity_label">Protokoll speichern</string>
|
||||
<string name="log_viewer_pref_summary">Protokolle können beim Debuggen helfen</string>
|
||||
<string name="log_viewer_pref_summary">Protokolle könnten beim Debuggen helfen</string>
|
||||
<string name="log_viewer_pref_title">Anwendungs-Protokoll anzeigen</string>
|
||||
<string name="log_viewer_title">Protokoll</string>
|
||||
<string name="logcat_error">Konnte logcat nicht ausführen: </string>
|
||||
@@ -159,9 +162,9 @@
|
||||
<string name="module_installer_working">Lade herunter und installiere…</string>
|
||||
<string name="module_version_error">Konnte Version des Kernel-Moduls nicht ermitteln</string>
|
||||
<string name="mtu">MTU</string>
|
||||
<string name="multiple_tunnels_summary_off">Das einschalten eines Tunnels wird andere ausschalten</string>
|
||||
<string name="multiple_tunnels_summary_on">Mehrere Tunnel können gleichzeitig aktiviert sein</string>
|
||||
<string name="multiple_tunnels_title">Erlaube mehrere gleichzeitige Tunnel</string>
|
||||
<string name="multiple_tunnels_summary_off">Beim Einschalten eines Tunnels werden andere ausgeschaltet</string>
|
||||
<string name="multiple_tunnels_summary_on">Mehrere Tunnel können gleichzeitig eingeschaltet sein</string>
|
||||
<string name="multiple_tunnels_title">Erlaube mehrere Tunnel gleichzeitig</string>
|
||||
<string name="name">Name</string>
|
||||
<string name="no_config_error">Es wurde versucht, einen Tunnel ohne Konfiguration zu starten</string>
|
||||
<string name="no_configs_error">Keine Konfigurationen gefunden</string>
|
||||
@@ -171,23 +174,27 @@
|
||||
<string name="parse_error_inet_endpoint">Endpunkt</string>
|
||||
<string name="parse_error_inet_network">IP-Netzwerk</string>
|
||||
<string name="parse_error_integer">Zahl</string>
|
||||
<string name="parse_error_reason">Kann %1$s “%2$s ” nicht verarbeiten</string>
|
||||
<string name="peer">Teilnehmer</string>
|
||||
<string name="parse_error_reason">Kann %1$s “%2$s” nicht verarbeiten</string>
|
||||
<string name="peer">Peer</string>
|
||||
<string name="permission_description">WireGuard-Tunnel steuern, Tunnel aktivieren und nach Belieben deaktivieren, wodurch der Internetverkehr möglicherweise falsch geleitet wird</string>
|
||||
<string name="permission_label">WireGuard-Tunnel steuern</string>
|
||||
<string name="persistent_keepalive">Dauerhafte Erhaltung</string>
|
||||
<string name="persistent_keepalive">Dauerhaftes Keepalive</string>
|
||||
<string name="pre_shared_key">Vorab geteilter Schlüssel</string>
|
||||
<string name="pre_shared_key_enabled">aktiviert</string>
|
||||
<string name="private_key">Privater Schlüssel</string>
|
||||
<string name="public_key">Öffentlicher Schlüssel</string>
|
||||
<string name="qr_code_hint">Tipp: Mit `qrencode -t ansiutf8 < tunnel.conf` generieren.</string>
|
||||
<string name="quick_settings_tile_add_title">Kachel zu Schnelleinstellungen hinzufügen</string>
|
||||
<string name="quick_settings_tile_add_summary">Die Verknüpfung schaltet den letzten Tunnel um</string>
|
||||
<string name="quick_settings_tile_add_failure">Verknüpfung kann nicht hinzugefügt werden: Fehler %d</string>
|
||||
<string name="quick_settings_tile_action">Tunnel umschalten</string>
|
||||
<string name="restore_on_boot_summary_off">Aktivierte Tunnel beim Systemstart nicht automatisch starten</string>
|
||||
<string name="restore_on_boot_summary_on">Aktivierte Tunnel beim Systemstart automatisch wieder starten</string>
|
||||
<string name="restore_on_boot_title">Beim Neustart wiederherstellen</string>
|
||||
<string name="save">Speichern</string>
|
||||
<string name="select_all">Alle auswählen</string>
|
||||
<string name="settings">Einstellungen</string>
|
||||
<string name="shell_exit_status_read_error">Shell kann den Exit-Status nicht lesen</string>
|
||||
<string name="shell_exit_status_read_error">Shell kann den Exit-Status nicht auslesen</string>
|
||||
<string name="shell_marker_count_error">Die Shell erwartete 4 Marker, erhielt aber %d</string>
|
||||
<string name="shell_start_error">Shell konnte nicht gestartet werden: %d</string>
|
||||
<string name="success_application_will_restart">Erfolgreich. Die Anwendung wird nun neu starten…</string>
|
||||
@@ -195,40 +202,51 @@
|
||||
<string name="toggle_error">Fehler beim Umschalten des WireGuard-Tunnels: %s</string>
|
||||
<string name="tools_installer_already">wg und wg-quick sind bereits installiert</string>
|
||||
<string name="tools_installer_failure">Kommandozeilenwerkzeuge konnten nicht installiert werden (kein Root?)</string>
|
||||
<string name="tools_installer_initial">Optionale Tools für Skripte installieren</string>
|
||||
<string name="tools_installer_initial">Optionale Hilfsprogramme für Skripte installieren</string>
|
||||
<string name="tools_installer_initial_magisk">Optionale Werkzeuge für das Skripten als Magisk-Modul installieren</string>
|
||||
<string name="tools_installer_initial_system">Optionale Werkzeuge für Skripte auf der Systempartition installieren</string>
|
||||
<string name="tools_installer_initial_system">Optionale Hilfsprogramme für Skripte auf der Systempartition installieren</string>
|
||||
<string name="tools_installer_success_magisk">wg und wg-quick als Magisk-Modul installiert (Neustart erforderlich)</string>
|
||||
<string name="tools_installer_success_system">wg und wg-quick auf der Systempartition installiert</string>
|
||||
<string name="tools_installer_title">Kommandozeilenwerkzeuge installieren</string>
|
||||
<string name="tools_installer_title">Hilfsprogramme für Kommandozeile installieren</string>
|
||||
<string name="tools_installer_working">Installiere wg und wg-quick</string>
|
||||
<string name="tools_unavailable_error">Erforderliche Tools nicht verfügbar</string>
|
||||
<string name="transfer">Transfer</string>
|
||||
<string name="tools_unavailable_error">Erforderliche Hilfsprogramme nicht verfügbar</string>
|
||||
<string name="transfer">Übertragung</string>
|
||||
<string name="transfer_bytes">%d B</string>
|
||||
<string name="transfer_gibibytes">%.2f GiB</string>
|
||||
<string name="transfer_kibibytes">%.2f KiB</string>
|
||||
<string name="transfer_mibibytes">%.2f MiB</string>
|
||||
<string name="transfer_rx_tx">empfangen: %1$s, gesendet: %2$s</string>
|
||||
<string name="transfer_tibibytes">%.2f TiB</string>
|
||||
<string name="tun_create_error">Konnte tun Gerät nicht erstellen</string>
|
||||
<string name="tun_create_error">Konnte kein tun-Gerät erstellen</string>
|
||||
<string name="tunnel_config_error">Tunnel konnte nicht konfiguriert werden (wg-quick gab %d zurück)</string>
|
||||
<string name="tunnel_create_error">Kann Tunnel nicht erstellen: %s</string>
|
||||
<string name="tunnel_create_success">Tunnel „%s “ erfolgreich erstellt</string>
|
||||
<string name="tunnel_create_success">Tunnel „%s“ erfolgreich erstellt</string>
|
||||
<string name="tunnel_error_already_exists">Tunnel „%s“ existiert bereits</string>
|
||||
<string name="tunnel_error_invalid_name">Ungültiger Name</string>
|
||||
<string name="tunnel_list_placeholder">Füge einen Tunnel über die Schaltfläche unten hinzu</string>
|
||||
<string name="tunnel_name">Tunnelname</string>
|
||||
<string name="tunnel_on_error">Tunnel kann nicht eingeschaltet werden (wgTurnOn gab %d zurück)</string>
|
||||
<string name="tunnel_dns_failure">DNS-Hostname kann nicht aufgelöst werden: „%s“</string>
|
||||
<string name="tunnel_rename_error">Kann Tunnel nicht umbenennen: %s</string>
|
||||
<string name="tunnel_rename_success">Tunnel erfolgreich in „%s “ umbenannt</string>
|
||||
<string name="tunnel_rename_success">Tunnel erfolgreich in „%s“ umbenannt</string>
|
||||
<string name="type_name_go_userspace">Go userspace</string>
|
||||
<string name="type_name_kernel_module">Kernelmodul</string>
|
||||
<string name="unknown_error">Unbekannter Fehler</string>
|
||||
<string name="version_summary">%1$s backend %2$s</string>
|
||||
<string name="updater_avalable">Ein Anwendungsupdate ist verfügbar. Bitte jetzt aktualisieren.</string>
|
||||
<string name="updater_action">Herunterladen und aktualisieren</string>
|
||||
<string name="updater_rechecking">Rufe Update-Metadaten ab…</string>
|
||||
<string name="updater_download_progress">Update wird heruntergeladen: %1$s / %2$s (%3$.2f%%)</string>
|
||||
<string name="updater_download_progress_nototal">Update wird heruntergeladen: %s</string>
|
||||
<string name="updater_installing">Installiere Update…</string>
|
||||
<string name="updater_failure">Fehler beim Aktualisieren: %s. Es wird in Kürze erneut versucht…</string>
|
||||
<string name="updater_corrupt_title">Anwendung beschädigt</string>
|
||||
<string name="updater_corrupt_message">Diese Anwendung ist beschädigt. Bitte laden Sie die APK erneut von der unten verlinkten Website herunter. Deinstallieren Sie danach diese Anwendung und installieren Sie sie mit der heruntergeladenen APK neu.</string>
|
||||
<string name="updater_corrupt_navigate">Webseite aufrufen</string>
|
||||
<string name="version_summary">%1$s Backend %2$s</string>
|
||||
<string name="version_summary_checking">Überprüfe %s Backend-Version</string>
|
||||
<string name="version_summary_unknown">Unbekannte %s Version</string>
|
||||
<string name="version_title">WireGuard für Android v%s</string>
|
||||
<string name="vpn_not_authorized_error">VPN-Dienst nicht vom Benutzer autorisiert</string>
|
||||
<string name="vpn_not_authorized_error">VPN-Dienst durch Nutzer nicht autorisiert</string>
|
||||
<string name="vpn_start_error">Android VPN-Dienst konnte nicht gestartet werden</string>
|
||||
<string name="zip_export_error">Kann Tunnel nicht exportieren: %s</string>
|
||||
<string name="zip_export_success">Gespeichert unter “%s”</string>
|
||||
|
||||
@@ -79,11 +79,15 @@
|
||||
<string name="error_no_qr_found">Δεν βρέθηκε κωδικός QR στην εικόνα</string>
|
||||
<string name="error_qr_checksum">Αποτυχία επαλήθευσης checksum κωδικού QR</string>
|
||||
<string name="cancel">Ακύρωση</string>
|
||||
<string name="create_activity_title">Δημιουργία διόδου WireGuard</string>
|
||||
<string name="create_empty">Δημιουργία από την αρχή</string>
|
||||
<string name="create_from_file">Εισαγωγή από αρχείο ή αρχειοθήκη</string>
|
||||
<string name="create_from_qr_code">Σάρωση από κωδικό QR</string>
|
||||
<string name="create_tunnel">Δημιουργία διόδου</string>
|
||||
<string name="copied_to_clipboard">Το %s αντιγράφηκε στο πρόχειρο</string>
|
||||
<string name="dark_theme_title">Χρήση σκούρου θέματος</string>
|
||||
<string name="delete">Διαγραφή</string>
|
||||
<string name="tv_delete">Επιλέξτε δίοδο προς διαγραφή</string>
|
||||
<string name="dns_servers">Διακομιστές DNS</string>
|
||||
<string name="dns_search_domains">Αναζήτηση τομέων</string>
|
||||
<string name="edit">Επεξεργασία</string>
|
||||
@@ -92,9 +96,12 @@
|
||||
<string name="generic_error">Άγνωστο σφάλμα «%s»</string>
|
||||
<string name="hint_automatic">(αυτόματο)</string>
|
||||
<string name="hint_optional">(προαιρετικό)</string>
|
||||
<string name="hint_random">(τυχαίο)</string>
|
||||
<string name="key_contents_error">Μη έγκυροι χαρακτήρες στο κλειδί</string>
|
||||
<string name="key_length_error">Εσφαλμένο μήκος κλειδιού</string>
|
||||
<string name="key_length_explanation_binary">: Τα κλειδιά του WireGuard πρέπει να είναι 32 bytes</string>
|
||||
<string name="latest_handshake_ago">πριν από %s</string>
|
||||
<string name="listen_port">Θύρα ακρόασης</string>
|
||||
<string name="log_export_title">Εξαγωγή αρχείου καταγραφής</string>
|
||||
<string name="log_saver_activity_label">Αποθήκευση αρχείου καταγραφής</string>
|
||||
<string name="log_viewer_title">Αρχείο καταγραφής</string>
|
||||
@@ -106,10 +113,14 @@
|
||||
<string name="peer">Peer</string>
|
||||
<string name="private_key">Ιδιωτικό κλειδί</string>
|
||||
<string name="public_key">Δημόσιο κλειδί</string>
|
||||
<string name="restore_on_boot_title">Επαναφορά κατά την εκκίνηση</string>
|
||||
<string name="save">Αποθήκευση</string>
|
||||
<string name="select_all">Επιλογή όλων</string>
|
||||
<string name="settings">Ρυθμίσεις</string>
|
||||
<string name="tools_installer_already">Τα wg και wg-quick έχουν ήδη εγκατασταθεί</string>
|
||||
<string name="tools_installer_title">Εγκατάσταση εργαλείων γραμμής εντολών</string>
|
||||
<string name="tools_installer_working">Εγκατάσταση των wg και wg-quick</string>
|
||||
<string name="tools_unavailable_error">Τα απαραίτητα εργαλεία δεν είναι διαθέσιμα</string>
|
||||
<string name="transfer">Μεταφορά</string>
|
||||
<string name="transfer_bytes">%d B</string>
|
||||
<string name="transfer_gibibytes">%.2f GiB</string>
|
||||
@@ -118,7 +129,14 @@
|
||||
<string name="transfer_rx_tx">rx: %1$s, tx: %2$s</string>
|
||||
<string name="transfer_tibibytes">%.2f TiB</string>
|
||||
<string name="tunnel_error_invalid_name">Μη έγκυρο όνομα</string>
|
||||
<string name="tunnel_name">Όνομα διόδου</string>
|
||||
<string name="unknown_error">Άγνωστο σφάλμα</string>
|
||||
<string name="updater_action">Λήψη και ενημέρωση</string>
|
||||
<string name="updater_download_progress">Λήψη ενημέρωσης: %1$s / %2$s (%3$.2f%%)</string>
|
||||
<string name="updater_download_progress_nototal">Λήψη ενημέρωσης: %s</string>
|
||||
<string name="updater_installing">Εγκατάσταση ενημέρωσης…</string>
|
||||
<string name="updater_corrupt_title">Κατεστραμμένη εφαρμογή</string>
|
||||
<string name="updater_corrupt_navigate">Άνοιγμα ιστοτόπου</string>
|
||||
<string name="version_summary_unknown">Άγνωστη έκδοση %s</string>
|
||||
<string name="version_title">WireGuard για Android v%s</string>
|
||||
<string name="biometric_auth_error">Αποτυχία ελέγχου ταυτότητας</string>
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
<resources>
|
||||
<plurals name="delete_error">
|
||||
<item quantity="one">Imposible eliminar %d túnel: %s</item>
|
||||
<item quantity="other">Imposible eliminar %d túnels: %s</item>
|
||||
<item quantity="other">Imposible eliminar %d túneles: %s</item>
|
||||
</plurals>
|
||||
<plurals name="delete_success">
|
||||
<item quantity="one">Túnel eliminado correctamente %d</item>
|
||||
@@ -29,12 +29,12 @@
|
||||
<item quantity="other">%d Aplicaciones Incluidas</item>
|
||||
</plurals>
|
||||
<plurals name="n_excluded_applications">
|
||||
<item quantity="one">%d excluido</item>
|
||||
<item quantity="other">%d excluidos</item>
|
||||
<item quantity="one">%d excluida</item>
|
||||
<item quantity="other">%d excluidas</item>
|
||||
</plurals>
|
||||
<plurals name="n_included_applications">
|
||||
<item quantity="one">%d incluído</item>
|
||||
<item quantity="other">%d incluidos</item>
|
||||
<item quantity="one">%d Incluida</item>
|
||||
<item quantity="other">%d incluidas</item>
|
||||
</plurals>
|
||||
<string name="all_applications">Todas las Aplicaciones</string>
|
||||
<string name="exclude_from_tunnel">Excluir</string>
|
||||
@@ -49,7 +49,7 @@
|
||||
</plurals>
|
||||
<plurals name="persistent_keepalive_seconds_unit">
|
||||
<item quantity="one">cada segundo</item>
|
||||
<item quantity="other">cada %d segundos</item>
|
||||
<item quantity="other">cada %d segundos</item>
|
||||
</plurals>
|
||||
<plurals name="persistent_keepalive_seconds_suffix">
|
||||
<item quantity="one">segundo</item>
|
||||
@@ -184,6 +184,10 @@
|
||||
<string name="private_key">Clave privada</string>
|
||||
<string name="public_key">Clave pública</string>
|
||||
<string name="qr_code_hint">Consejo: generar con `qrencode -t ansiutf8 < tunnel.conf`.</string>
|
||||
<string name="quick_settings_tile_add_title">Añadir mosaico al panel de configuración rápida</string>
|
||||
<string name="quick_settings_tile_add_summary">El acceso directo de mosaico alterna al túnel más reciente</string>
|
||||
<string name="quick_settings_tile_add_failure">No se puede agregar el título del acceso directo: error %d</string>
|
||||
<string name="quick_settings_tile_action">Alternar túnel</string>
|
||||
<string name="restore_on_boot_summary_off">No mostrará túneles habilitados al arrancar</string>
|
||||
<string name="restore_on_boot_summary_on">Mostrará túneles habilitados al arrancar</string>
|
||||
<string name="restore_on_boot_title">Restaurar al arrancar</string>
|
||||
@@ -228,6 +232,16 @@
|
||||
<string name="type_name_go_userspace">Ir al espacio de usuario</string>
|
||||
<string name="type_name_kernel_module">Módulo Kernel</string>
|
||||
<string name="unknown_error">Error desconocido</string>
|
||||
<string name="updater_avalable">Una actualización de la aplicación está disponible. Por favor, actualice ahora.</string>
|
||||
<string name="updater_action">Descargar & Actualizar</string>
|
||||
<string name="updater_rechecking">Obteniendo metadatos de actualización…</string>
|
||||
<string name="updater_download_progress">Descargando actualización: %1$s / %2$s (%3$.2f%%)</string>
|
||||
<string name="updater_download_progress_nototal">Descargando actualización: %s</string>
|
||||
<string name="updater_installing">Instalando actualización…</string>
|
||||
<string name="updater_failure">Error de actualización: %s. Se volverá a intentar en un momento…</string>
|
||||
<string name="updater_corrupt_title">Aplicación dañada</string>
|
||||
<string name="updater_corrupt_message">Esta aplicación está dañada. Por favor, vuelva a descargar el APK desde el sitio web enlazado a continuación. Después, desinstale esta aplicación y vuelva a instalarla desde el APK descargado.</string>
|
||||
<string name="updater_corrupt_navigate">Abrir sitio web</string>
|
||||
<string name="version_summary">%1$s backend %2$s</string>
|
||||
<string name="version_summary_checking">Comprobando versión de backend %s</string>
|
||||
<string name="version_summary_unknown">Versión %s desconocida</string>
|
||||
|
||||
@@ -185,6 +185,7 @@ Aitäh veelkord sinu panuse eest.</string>
|
||||
<string name="private_key">Privaatvõti</string>
|
||||
<string name="public_key">Avalik võti</string>
|
||||
<string name="qr_code_hint">Vihje: tekita käsuga `qrencode -t ansiutf8 < tunnel.conf`.</string>
|
||||
<string name="quick_settings_tile_action">Lülita tunnel</string>
|
||||
<string name="restore_on_boot_summary_off">Ei lülita seadme käivitumisel lubatud tunneleid sisse</string>
|
||||
<string name="restore_on_boot_summary_on">Lülitab seadme käivitumisel lubatud tunnelid sisse</string>
|
||||
<string name="restore_on_boot_title">Taasta seadme käivitumisel</string>
|
||||
@@ -229,6 +230,16 @@ Aitäh veelkord sinu panuse eest.</string>
|
||||
<string name="type_name_go_userspace">Go kasutajamaa</string>
|
||||
<string name="type_name_kernel_module">Tuumamoodul</string>
|
||||
<string name="unknown_error">Tundmatu viga</string>
|
||||
<string name="updater_avalable">Rakenduse uuendus on saadaval. Palun uuenda nüüd.</string>
|
||||
<string name="updater_action">Laadi alla ja uuenda</string>
|
||||
<string name="updater_rechecking">Uuenduse andmete laadimine…</string>
|
||||
<string name="updater_download_progress">Uuenduse allalaadimine: %1$s / %2$s (%3$.2f%%)</string>
|
||||
<string name="updater_download_progress_nototal">Uuenduse allalaadimine: %s</string>
|
||||
<string name="updater_installing">Uuenduse paigaldamine…</string>
|
||||
<string name="updater_failure">Uuendamine ebaõnnestus: %s. Uus katse hetke pärast…</string>
|
||||
<string name="updater_corrupt_title">Rakendus rikutud</string>
|
||||
<string name="updater_corrupt_message">See rakendus on rikutud. Palun laadi APK uuesti allpool lingitud veebilehelt. Pärast seda desinstalli rakendus ja installi allalaaditud APK uuesti.</string>
|
||||
<string name="updater_corrupt_navigate">Ava veebileht</string>
|
||||
<string name="version_summary">%1$s taustsüsteem %2$s</string>
|
||||
<string name="version_summary_checking">Kontrollin %s taustsüsteemi versiooni</string>
|
||||
<string name="version_summary_unknown">Tundmatu %s versioon</string>
|
||||
|
||||
@@ -99,7 +99,7 @@
|
||||
<string name="create_output_dir_error">نمیتوان دایرکتوری خروجی را ایجاد کرد</string>
|
||||
<string name="create_temp_dir_error">نمیتوان دایرکتوری موقت محلی را ساخت</string>
|
||||
<string name="create_tunnel">ساختن تونل</string>
|
||||
<string name="copied_to_clipboard">متن در کلیپبورد کپی شد</string>
|
||||
<string name="copied_to_clipboard">%s در کلیپبورد کپی شد</string>
|
||||
<string name="dark_theme_summary_off">اکنون از پوسته روشن(روز) استفاده میشود</string>
|
||||
<string name="dark_theme_summary_on">اکنون از پوسته تاریک(شب) استفاده میشود</string>
|
||||
<string name="dark_theme_title">استفاده از پوسته تاریک</string>
|
||||
@@ -108,15 +108,19 @@
|
||||
<string name="tv_select_a_storage_drive">حافظه ذخیره سازی موردنظر را انتخاب کنید</string>
|
||||
<string name="tv_no_file_picker">برای مدیریت پوشه های حافظه، یک برنامه مدیریت فایل نصب کنید</string>
|
||||
<string name="tv_add_tunnel_get_started">یک پروفایل تونل برای شروع انتخاب کنید</string>
|
||||
<string name="disable_config_export_title">غیرفعال سازی خروجی گرفتن از کانفیگ ها</string>
|
||||
<string name="disable_config_export_description">غیرفعال سازی خروجی گرفتن، دسترسی کلیدهای خصوصی را کم می کند</string>
|
||||
<string name="donate_title">♥ کمک مالی به پروژه WireGuard</string>
|
||||
<string name="donate_summary">هر کمک شما تاثیرگذار است</string>
|
||||
<string name="donate_google_play_disappointment">از اینکه از پروژه WireGuard حمایت میکنید متشکریم!\n\nمتأسفانه، به دلیل خطمشیهای Google، ما مجاز به پیوند دادن به بخشی از صفحه وب پروژه که میتوانید در آن کمک مالی کنید، نداریم. امیدواریم بتوانید این را درک کنید!\n\nباز هم از مشارکت شما سپاسگزاریم.</string>
|
||||
<string name="disable_config_export_title">غیرفعال سازی خروجی گرفتن از پیکربندی ها</string>
|
||||
<string name="disable_config_export_description">غیرفعال سازی خروجی گرفتن، دسترسی به کلیدهای خصوصی را کم می کند</string>
|
||||
<string name="dns_servers">سرورهای DNS</string>
|
||||
<string name="dns_search_domains">جستوجوی دامنهها</string>
|
||||
<string name="dns_search_domains">جستوجوی دامنهها</string>
|
||||
<string name="edit">ویرایش</string>
|
||||
<string name="endpoint">نقطه پایان</string>
|
||||
<string name="error_down">خطا هنگام بستن تونل: %s</string>
|
||||
<string name="error_fetching_apps">خطا هنگام واکشی فهرست برنامهها: %s</string>
|
||||
<string name="error_root">لطفا دسترسی روت را فراهمکرده و دوباره تلاش کنید</string>
|
||||
<string name="error_prepare">خطا هنگام راهاندازی تونل: %s</string>
|
||||
<string name="error_up">خطا هنگام راهاندازی تونل: %s</string>
|
||||
<string name="exclude_private_ips">مستثنی کردن IPهای خصوصی</string>
|
||||
<string name="generate_new_private_key">تولید کلید خصوصی جدید</string>
|
||||
@@ -136,6 +140,8 @@
|
||||
<string name="key_length_explanation_base64">: کلیدهای WireGuard base64 باید دارای ۴۴ نویسه باشند ( ۳۲ بایت)</string>
|
||||
<string name="key_length_explanation_binary">: کلیدهای WireGuard باید ۳۲ بایت باشند</string>
|
||||
<string name="key_length_explanation_hex">: کلیدهای هگز WireGuard باید دارای ۶۴ نویسه باشند ( ۳۲ بایت)</string>
|
||||
<string name="latest_handshake">آخرین handshake</string>
|
||||
<string name="latest_handshake_ago">%s پیش</string>
|
||||
<string name="listen_port">شنود پورت</string>
|
||||
<string name="log_export_error">نمیتوان گزارش رویداد را برونبرد: %s</string>
|
||||
<string name="log_export_subject">پرونده گزارش رویداد WireGuard اندروید</string>
|
||||
@@ -146,13 +152,13 @@
|
||||
<string name="log_viewer_pref_title">نمایش گزارش رویداد برنامه</string>
|
||||
<string name="log_viewer_title">گزارش رویداد</string>
|
||||
<string name="logcat_error">نمیتوان logcat را اجرا کرد: </string>
|
||||
<string name="module_enabler_disabled_summary">ماژول آزمایشیِ کرنل می تواند کارایی را افزایش دهد</string>
|
||||
<string name="module_enabler_disabled_title">فعالسازی ماژول کرنل ِبک اند</string>
|
||||
<string name="module_enabler_enabled_summary">فضای کاربری کند ممکن است پایداری را بهبود ببخشد</string>
|
||||
<string name="module_enabler_enabled_title">غیرفعالسازی پسزمینه واحد هسته</string>
|
||||
<string name="module_enabler_disabled_summary">ماژول آزمایشی کرنل می تواند کارایی را افزایش دهد</string>
|
||||
<string name="module_enabler_disabled_title">فعالسازی kernel module backend</string>
|
||||
<string name="module_enabler_enabled_summary">کند بودن userspace backend میتواند پایداری را بهبود ببخشد</string>
|
||||
<string name="module_enabler_enabled_title">غیرفعالسازی kernel module backend</string>
|
||||
<string name="module_installer_error">مشکلی پیش آمد. لطفا دوباره تلاش کنید</string>
|
||||
<string name="module_installer_initial">ماژول آزمایشیِ کرنل می تواند کارایی را افزایش دهد</string>
|
||||
<string name="module_installer_not_found">هیچ واحدی برای دستگاه شما در دسترس نیست</string>
|
||||
<string name="module_installer_initial">ماژول آزمایشی کرنل می تواند کارایی را افزایش دهد</string>
|
||||
<string name="module_installer_not_found">هیچ ماژولی برای دستگاه شما در دسترس نیست</string>
|
||||
<string name="module_installer_title">واحد هسته را بارگیری و نصب کن</string>
|
||||
<string name="module_installer_working">در حال بارگیری و نصب…</string>
|
||||
<string name="module_version_error">نمیتوان نگارش واحد هسته را مشخص کرد</string>
|
||||
@@ -179,6 +185,10 @@
|
||||
<string name="private_key">کلید خصوصی</string>
|
||||
<string name="public_key">کلید عمومی</string>
|
||||
<string name="qr_code_hint">نکته: با `qrencode -t ansiutf8 < tunnel.conf` تولید کنید.</string>
|
||||
<string name="quick_settings_tile_add_title">افزودن ایکون برنامه به نوار اطلاع رسانی گوشی</string>
|
||||
<string name="quick_settings_tile_add_summary">ایکون برنامه در نوار اطلاع رسانی، جدید ترین تونل را فعال یا غیرفعال میکند</string>
|
||||
<string name="quick_settings_tile_add_failure">خطا در اضافه کردن ایکون برنامه در نوار اطلاع رسانی</string>
|
||||
<string name="quick_settings_tile_action">فعال یا غیرفعال کردن تونل</string>
|
||||
<string name="restore_on_boot_summary_off">تونل های فعال در لحظه بالا آمدن سیستم، روشن نخواهند شد</string>
|
||||
<string name="restore_on_boot_summary_on">تونل های فعال در لحظه بالا آمدن سیستم، روشن خواهند شد</string>
|
||||
<string name="restore_on_boot_title">بازگردانی در بوت</string>
|
||||
@@ -215,6 +225,7 @@
|
||||
<string name="tunnel_create_success">تونل “%s” با موفقیت ساخته شد</string>
|
||||
<string name="tunnel_error_already_exists">تونل “%s” از قبل وجود دارد</string>
|
||||
<string name="tunnel_error_invalid_name">نام نامعتبر</string>
|
||||
<string name="tunnel_list_placeholder">بهوسیله دکمه زیر تونلی بیفزایید</string>
|
||||
<string name="tunnel_name">نام تونل</string>
|
||||
<string name="tunnel_on_error">روشن کردن تونل امکان پذیر نیست (wgTurnOn برگشت %d )</string>
|
||||
<string name="tunnel_dns_failure">ناتوان در یافتن DNS نام میزبان: \"%s\"</string>
|
||||
@@ -223,6 +234,16 @@
|
||||
<string name="type_name_go_userspace">رفتن به فضای کاربر</string>
|
||||
<string name="type_name_kernel_module">واحد هسته</string>
|
||||
<string name="unknown_error">خطای نامشخص</string>
|
||||
<string name="updater_avalable">یک بروزرسانی برای برنامه موجود است. لطفا اکنون بروزرسانی کنید.</string>
|
||||
<string name="updater_action">دانلود & بروزرسانی</string>
|
||||
<string name="updater_rechecking">در حال دریافت فراداده ی بروزرسانی…</string>
|
||||
<string name="updater_download_progress">در حال دانلود بروزرسانی %1$s از %2$s (%3$.2f%%)</string>
|
||||
<string name="updater_download_progress_nototal">در حال دانلود بروزرسانی: %s</string>
|
||||
<string name="updater_installing">در حال نصب بروزسانی …</string>
|
||||
<string name="updater_failure">خطا در بروزرسانی: %s. مجددا تلاش خواهد شد…</string>
|
||||
<string name="updater_corrupt_title">برنامه خراب</string>
|
||||
<string name="updater_corrupt_message">این برنامه خراب است. لطفا مجدد فایل نصبی APK برنامه را از وبسایت های زیر دانلود کنید. سپس، این برنامه را حذف، و از طریق فایل APK برنامه سالم را نصب کنید.</string>
|
||||
<string name="updater_corrupt_navigate">باز کردن تارنما</string>
|
||||
<string name="version_summary">%1$s بک اند %2$s</string>
|
||||
<string name="version_summary_checking">در حال بررسی نگارش پسزمینه %s</string>
|
||||
<string name="version_summary_unknown">نگارش %s ناشناخته</string>
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
</plurals>
|
||||
<plurals name="delete_success">
|
||||
<item quantity="one">Suppression réussie du tunnel %d</item>
|
||||
<item quantity="other">Supprimé avec succès %d tunnels</item>
|
||||
<item quantity="other">%d tunnels supprimés avec succès</item>
|
||||
</plurals>
|
||||
<plurals name="delete_title">
|
||||
<item quantity="one">%d tunnel sélectionné</item>
|
||||
@@ -85,16 +85,16 @@
|
||||
<string name="config_delete_error">Impossible de supprimer le fichier de configuration %s</string>
|
||||
<string name="config_exists_error">La configuration de « %s » existe déjà</string>
|
||||
<string name="config_file_exists_error">Le fichier de configuration « %s » existe déjà</string>
|
||||
<string name="config_not_found_error">Fichier de configuration «%s» introuvable</string>
|
||||
<string name="config_rename_error">Impossible de renommer le fichier de configuration «%s»</string>
|
||||
<string name="config_save_error">Impossible d’enregistrer la configuration pour «%1$s» : %2$s</string>
|
||||
<string name="config_save_success">Configuration enregistrée avec succès pour “%s”</string>
|
||||
<string name="config_not_found_error">Fichier de configuration « %s » introuvable</string>
|
||||
<string name="config_rename_error">Impossible de renommer le fichier de configuration « %s »</string>
|
||||
<string name="config_save_error">Impossible d’enregistrer la configuration pour « %1$s » : %2$s</string>
|
||||
<string name="config_save_success">Configuration enregistrée avec succès pour « %s »</string>
|
||||
<string name="create_activity_title">Créer un tunnel WireGuard</string>
|
||||
<string name="create_bin_dir_error">Impossible de créer le répertoire binaire local</string>
|
||||
<string name="create_downloads_file_error">Impossible de créer le fichier dans le répertoire des téléchargements</string>
|
||||
<string name="create_empty">Créer à partir de zéro</string>
|
||||
<string name="create_from_file">Importer depuis un fichier ou une archive</string>
|
||||
<string name="create_from_qr_code">Créer avec un scan de QR code</string>
|
||||
<string name="create_from_qr_code">Importer depuis un QR code</string>
|
||||
<string name="create_output_dir_error">Impossible de créer le répertoire de sortie</string>
|
||||
<string name="create_temp_dir_error">Impossible de créer le répertoire temporaire local</string>
|
||||
<string name="create_tunnel">Créer un tunnel</string>
|
||||
@@ -109,6 +109,7 @@
|
||||
<string name="tv_add_tunnel_get_started">Ajouter un tunnel pour commencer</string>
|
||||
<string name="donate_title">♥ Faire un don au projet WireGuard</string>
|
||||
<string name="donate_summary">Chaque contribution aide</string>
|
||||
<string name="donate_google_play_disappointment">Merci de votre soutien au projet WireGuard !\n\nMalheureusement, en raisons des politiques de Google, nous ne pouvons pas vous rediriger vers la page vous permettant de faire un don. Heureusement, vous pouvez le trouver par vous-même !\n\nMerci encore pour votre soutien.</string>
|
||||
<string name="disable_config_export_title">Désactiver l\'export de configuration</string>
|
||||
<string name="disable_config_export_description">La désactivation de l\'export de configuration rend les clés privées moins accessibles</string>
|
||||
<string name="dns_servers">Serveurs DNS</string>
|
||||
@@ -118,6 +119,7 @@
|
||||
<string name="error_down">Erreur lors de la désactivation du tunnel : %s</string>
|
||||
<string name="error_fetching_apps">Erreur lors de la récupération de la liste d\'applications : %s</string>
|
||||
<string name="error_root">Veuillez obtenir l\'accès root et essayez à nouveau</string>
|
||||
<string name="error_prepare">Erreur lors de la préparation du tunnel : %s</string>
|
||||
<string name="error_up">Erreur lors de la mise en place du tunnel : %s</string>
|
||||
<string name="exclude_private_ips">Exclure les IPs privées</string>
|
||||
<string name="generate_new_private_key">Générer une nouvelle clé privée</string>
|
||||
@@ -137,6 +139,8 @@
|
||||
<string name="key_length_explanation_base64">: Les clés base64 WireGuard doivent comporter 44 caractères (32 octets)</string>
|
||||
<string name="key_length_explanation_binary">: Les clés WireGuard doivent comporter 32 octets</string>
|
||||
<string name="key_length_explanation_hex">: Les clés hexadécimales WireGuard doivent comporter 64 caractères (32 octets)</string>
|
||||
<string name="latest_handshake">Dernière liaison</string>
|
||||
<string name="latest_handshake_ago">Il y a %s</string>
|
||||
<string name="listen_port">Port d\'écoute</string>
|
||||
<string name="log_export_error">Impossible d\'exporter le journal : %s</string>
|
||||
<string name="log_export_subject">Fichier journal d\'Android WireGuard</string>
|
||||
@@ -180,6 +184,10 @@
|
||||
<string name="private_key">Clé privée</string>
|
||||
<string name="public_key">Clé publique</string>
|
||||
<string name="qr_code_hint">Astuce : générez avec \"qrencode -t ansiutf8 < tunnel.conf\".</string>
|
||||
<string name="quick_settings_tile_add_title">Ajouter une bascule au volet des paramètres</string>
|
||||
<string name="quick_settings_tile_add_summary">Cette bascule active le dernier tunnel utilisé</string>
|
||||
<string name="quick_settings_tile_add_failure">Impossible d\'ajouter la bascule : erreur %d</string>
|
||||
<string name="quick_settings_tile_action">Activer le tunnel</string>
|
||||
<string name="restore_on_boot_summary_off">N\'affichera pas les tunnels activés au démarrage</string>
|
||||
<string name="restore_on_boot_summary_on">Les tunnels activés seront affichés au démarrage</string>
|
||||
<string name="restore_on_boot_title">Restaurer au démarrage</string>
|
||||
@@ -224,6 +232,16 @@
|
||||
<string name="type_name_go_userspace">Implémentation Go en espace utilisateur</string>
|
||||
<string name="type_name_kernel_module">Module noyau</string>
|
||||
<string name="unknown_error">Erreur inconnue</string>
|
||||
<string name="updater_avalable">Une mise à jour est disponible. Veuillez mettre l\'application à jour.</string>
|
||||
<string name="updater_action">Télécharger & Mettre à jour</string>
|
||||
<string name="updater_rechecking">Récupération des métadonnées de la mise à jour…</string>
|
||||
<string name="updater_download_progress">Téléchargement de la mise à jour : %1$s / %2$s (%3$.2f%%)</string>
|
||||
<string name="updater_download_progress_nototal">Téléchargement de la mise à jour : %s</string>
|
||||
<string name="updater_installing">Installation de la mise à jour…</string>
|
||||
<string name="updater_failure">Erreur lors de la mise à jour : %s. Nous réessaierons dans un instant…</string>
|
||||
<string name="updater_corrupt_title">Application corrompue</string>
|
||||
<string name="updater_corrupt_message">Cette application est corrompue. Veuillez réinstaller le fichier APK depuis le site ci-dessous. Ensuite, désinstallez cette application puis réinstallez-la à l\'aide du fichier APK téléchargé.</string>
|
||||
<string name="updater_corrupt_navigate">Accéder au site internet</string>
|
||||
<string name="version_summary">%1$s backend %2$s</string>
|
||||
<string name="version_summary_checking">Vérification de la version %s du backend</string>
|
||||
<string name="version_summary_unknown">Version %s inconnue</string>
|
||||
|
||||
@@ -0,0 +1,106 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="all_applications">Minden alkalmazás</string>
|
||||
<string name="exclude_from_tunnel">Kizárás</string>
|
||||
<string name="use_all_applications">Minden alkalmazás használata</string>
|
||||
<string name="addresses">Címek</string>
|
||||
<string name="applications">Alkalmazások</string>
|
||||
<string name="allowed_ips">Engedélyezett IP-k</string>
|
||||
<string name="bad_config_context_top_level">%s</string>
|
||||
<string name="bad_config_error">%1$s a %2$s-ben</string>
|
||||
<string name="bad_config_explanation_pka">: Legyen pozitív szám és ne legyen több mint 65535</string>
|
||||
<string name="bad_config_explanation_positive_number">Pozitív számnak kell lennie</string>
|
||||
<string name="bad_config_explanation_udp_port">Létező UDP port számot kell megadni</string>
|
||||
<string name="bad_config_reason_invalid_key">Érvénytelen kulcs</string>
|
||||
<string name="bad_config_reason_invalid_number">Érvénytelen szám</string>
|
||||
<string name="bad_config_reason_invalid_value">Helytelen érték</string>
|
||||
<string name="bad_config_reason_missing_attribute">Hiányzó tulajdonság</string>
|
||||
<string name="bad_config_reason_missing_section">Hiányzó szakasz</string>
|
||||
<string name="bad_config_reason_syntax_error">Szintaktikai hiba</string>
|
||||
<string name="bad_config_reason_unknown_attribute">Ismeretlen tulajdonság</string>
|
||||
<string name="bad_config_reason_unknown_section">Ismeretlen szekció</string>
|
||||
<string name="bad_config_reason_value_out_of_range">Az érték a megengedett tartományon kívül van</string>
|
||||
<string name="bad_extension_error">A fájl .conf vagy .zip legyen</string>
|
||||
<string name="error_no_qr_found">QR kód nem található a képen</string>
|
||||
<string name="error_qr_checksum">QR kód ellenőrzösszeg ellenőrzési hiba</string>
|
||||
<string name="cancel">Mégse</string>
|
||||
<string name="config_delete_error">A %s konfigurációs fájl nem törölhető</string>
|
||||
<string name="config_exists_error">A konfiguráció “%s”-hoz már létezik</string>
|
||||
<string name="config_file_exists_error">A %s konfigurációs állomány már létezik</string>
|
||||
<string name="config_not_found_error">Konfigurációs állomány \"%s\" nem található meg</string>
|
||||
<string name="config_rename_error">A %s konfigurációs állomány nem nevezhető át</string>
|
||||
<string name="config_save_success">Sikerült elmenteni a “%s” nevű konfigurációt</string>
|
||||
<string name="create_activity_title">WireGuard alagút létrehozása</string>
|
||||
<string name="create_bin_dir_error">Nem lehet létrehozni helyi bináris könyvtárat</string>
|
||||
<string name="create_downloads_file_error">Nem lehet létrehozni a fájlt a letöltések könyvtárban</string>
|
||||
<string name="create_empty">Létrehozás az alapoktól</string>
|
||||
<string name="create_from_file">Fájlból vagy tömörített állományból importálás</string>
|
||||
<string name="create_from_qr_code">Beolvasás QR kódból</string>
|
||||
<string name="create_output_dir_error">Nem lehet kimeneti könyvtárat létrehozni</string>
|
||||
<string name="create_temp_dir_error">Nem lehet létrehozni helyi átmeneti könyvtárat</string>
|
||||
<string name="create_tunnel">Alagút létrehozása</string>
|
||||
<string name="copied_to_clipboard">%s a vágólapra másolva</string>
|
||||
<string name="dark_theme_summary_off">A \"light\" azaz világos téma van használatban</string>
|
||||
<string name="dark_theme_summary_on">A \"dark\" azaz sötét téma van használatban</string>
|
||||
<string name="dark_theme_title">A sötét téma használata</string>
|
||||
<string name="delete">Törlés</string>
|
||||
<string name="tv_delete">Alagút kiválasztása törlésre</string>
|
||||
<string name="tv_select_a_storage_drive">Jelöjle ki a mentéshez a meghatjót</string>
|
||||
<string name="tv_no_file_picker">Kérem installáljon egy fájlkezelőt az állományok használatához</string>
|
||||
<string name="tv_add_tunnel_get_started">Add hozzá az indításhoz az alagutat</string>
|
||||
<string name="donate_title">♥ Kérlek támogasd a WireGuard Projectet</string>
|
||||
<string name="donate_summary">Minden hozzájárulás segítség</string>
|
||||
<string name="donate_google_play_disappointment">Köszönjük hogy támogatja a WireGuard projektet!\n\nSajnos a Google szabályai miatt, sajnos nem adhatjuk itt meg a támogatásokat fogadó weboldal linkjét. Remélem ezt ki tudod deríteni!\n\nMégegyszer köszönjük a támogatásod.</string>
|
||||
<string name="disable_config_export_title">A konfiguráció exportálásának tiltása</string>
|
||||
<string name="disable_config_export_description">Ha letiltja a konfiguráció exportját akkor a privát kulcsok nem lesznek hozzáférhetőek</string>
|
||||
<string name="dns_servers">DNS szerverek</string>
|
||||
<string name="dns_search_domains">Domain keresés</string>
|
||||
<string name="edit">Szerkesztés</string>
|
||||
<string name="endpoint">Végpont</string>
|
||||
<string name="generic_error">Ismeretlen hiba: “%s”</string>
|
||||
<string name="hint_automatic">(automatikus)</string>
|
||||
<string name="hint_generated">(generált)</string>
|
||||
<string name="hint_optional">(választható)</string>
|
||||
<string name="hint_optional_discouraged">(választható, nem ajánlott)</string>
|
||||
<string name="hint_random">(véletlenszerű)</string>
|
||||
<string name="illegal_filename_error">Nem használható fájlnév: “%s”</string>
|
||||
<string name="import_error">Nem importálható az alagút: %s</string>
|
||||
<string name="import_from_qr_code">Alagút importálása QR kódból</string>
|
||||
<string name="import_success">Importálva “%s”</string>
|
||||
<string name="interface_title">Felület</string>
|
||||
<string name="latest_handshake">Utolsó kézfogás</string>
|
||||
<string name="listen_port">Figyelő port</string>
|
||||
<string name="log_export_title">Log exportálása fájlba</string>
|
||||
<string name="log_saver_activity_label">Log mentése</string>
|
||||
<string name="log_viewer_pref_title">Alkalmazás log megtekintése</string>
|
||||
<string name="log_viewer_title">Log</string>
|
||||
<string name="mtu">MTU</string>
|
||||
<string name="multiple_tunnels_title">Több párhuzamos alagút engedélyezése</string>
|
||||
<string name="name">Név</string>
|
||||
<string name="no_config_error">Alagutat akar indítani konfiguráció nélkül</string>
|
||||
<string name="no_configs_error">Konfiguráció nem található</string>
|
||||
<string name="no_tunnels_error">Nincs létező alagút</string>
|
||||
<string name="parse_error_generic">Karakterlánc</string>
|
||||
<string name="parse_error_inet_address">IP cím</string>
|
||||
<string name="parse_error_inet_endpoint">végpont</string>
|
||||
<string name="parse_error_inet_network">IP hálózat</string>
|
||||
<string name="parse_error_integer">szám</string>
|
||||
<string name="pre_shared_key">Előre megosztott kulcs</string>
|
||||
<string name="pre_shared_key_enabled">engedélyezve</string>
|
||||
<string name="private_key">Privát kulcs</string>
|
||||
<string name="public_key">Nyilvános kulcs</string>
|
||||
<string name="quick_settings_tile_action">Csatorna átkapcsolása</string>
|
||||
<string name="restore_on_boot_title">Helyreállítás bootolás alatt</string>
|
||||
<string name="save">Mentés</string>
|
||||
<string name="select_all">Összes kijelölése</string>
|
||||
<string name="settings">Beállítások</string>
|
||||
<string name="toggle_all">Összes átkapcsolása</string>
|
||||
<string name="tools_installer_already">wg és a wg-quick már installálva van</string>
|
||||
<string name="tools_installer_failure">Nem lehet installálni a parancssori alkalmazásokat (nincs root-olva?)</string>
|
||||
<string name="tunnel_error_already_exists">A(z) “%s” alagút már létezik</string>
|
||||
<string name="tunnel_error_invalid_name">Érvénytelen név</string>
|
||||
<string name="tunnel_name">Csatorna neve</string>
|
||||
<string name="type_name_kernel_module">Kernel modul</string>
|
||||
<string name="unknown_error">Ismeretlen hiba</string>
|
||||
<string name="updater_corrupt_navigate">Weboldal megnyitása</string>
|
||||
</resources>
|
||||
@@ -94,6 +94,9 @@
|
||||
<string name="tv_select_a_storage_drive">Pilih lokasi penyimpanan</string>
|
||||
<string name="tv_no_file_picker">Silakan instal aplikasi file manajer untuk memilih file</string>
|
||||
<string name="tv_add_tunnel_get_started">Tambahkan tunnel untuk memulai</string>
|
||||
<string name="donate_title">Donasi ke Proyek WireGuard</string>
|
||||
<string name="donate_summary">Setiap kontribusi anda sangat membantu</string>
|
||||
<string name="donate_google_play_disappointment">Terima kasih telah mendung Proyek WireGuard!\n\nAkan tetapi, dikarenakan kebijakan Google, Kami tidak diizinkan untuk menautkan bagian halaman website yang dapat digunakan untuk melakukan donasi. Semoga anda dapat menemukan solusi untuk kendala ini!\n\nTerima kasih sekali lagi atas kontribusi anda.</string>
|
||||
<string name="disable_config_export_title">Nonaktifkan ekspor konfigurasi</string>
|
||||
<string name="disable_config_export_description">Menonaktifkan ekspor konfigurasi akan membuat kunci pribadi sulit diakses</string>
|
||||
<string name="dns_servers">Server DNS</string>
|
||||
@@ -103,6 +106,7 @@
|
||||
<string name="error_down">Kesalahan pada tunel: %s</string>
|
||||
<string name="error_fetching_apps">Kesalahan mengambil daftar aplikasi: %s</string>
|
||||
<string name="error_root">Izinkan akses root dan coba lagi</string>
|
||||
<string name="error_prepare">Kesalahan mempersiapkan tunel: %s</string>
|
||||
<string name="error_up">Kesalahan pada tunel: %s</string>
|
||||
<string name="exclude_private_ips">Kecualikan IP pribadi</string>
|
||||
<string name="generate_new_private_key">Buat kunci privat baru</string>
|
||||
@@ -122,6 +126,8 @@
|
||||
<string name="key_length_explanation_base64">: Kunci WireGuard base64 harus terdiri dari 44 karakter (32 bit)</string>
|
||||
<string name="key_length_explanation_binary">: Kunci WireGuard harus terdiri dari 32 bit</string>
|
||||
<string name="key_length_explanation_hex">: Kunci hex WireGuard Harus terdiri dari 64 karakter (32 bit)</string>
|
||||
<string name="latest_handshake">Handshake terakhir</string>
|
||||
<string name="latest_handshake_ago">%s yang lalu</string>
|
||||
<string name="listen_port">Isi port</string>
|
||||
<string name="log_export_error">Log tidak bisa diekspor: %s</string>
|
||||
<string name="log_export_subject">Berkas Log WireGuard Android</string>
|
||||
@@ -165,6 +171,10 @@
|
||||
<string name="private_key">Kunci pribadi</string>
|
||||
<string name="public_key">Kunci publik</string>
|
||||
<string name="qr_code_hint">Tips: generate dengan `qrencode -t ansiutf8 < tunnel.conf`.</string>
|
||||
<string name="quick_settings_tile_add_title">Tambah ubin untuk akses panel pengaturan cepat</string>
|
||||
<string name="quick_settings_tile_add_summary">Pintasan ubin mengalihkan ke tunel terbaru</string>
|
||||
<string name="quick_settings_tile_add_failure">Tidak dapat menambahkan pintasan: error %d</string>
|
||||
<string name="quick_settings_tile_action">Beralih tunel</string>
|
||||
<string name="restore_on_boot_summary_off">Tunel yang diaktifkan tidak akan ditampilkan saat boot</string>
|
||||
<string name="restore_on_boot_summary_on">Tunel yang diaktifkan akan dimunculkan saat boot</string>
|
||||
<string name="restore_on_boot_title">Pulihkan saat boot</string>
|
||||
@@ -200,6 +210,7 @@
|
||||
<string name="tunnel_create_success">Tunel “%s” Berhasil dibuat</string>
|
||||
<string name="tunnel_error_already_exists">Tunel “%s” sudah ada</string>
|
||||
<string name="tunnel_error_invalid_name">Nama tidak valid</string>
|
||||
<string name="tunnel_list_placeholder">Tambah tunel menggunakan tombol di bawah</string>
|
||||
<string name="tunnel_name">Nama tunel</string>
|
||||
<string name="tunnel_on_error">Tidak dapat mengaktifkan tunel (wgTurnOn %d dikembalikan)</string>
|
||||
<string name="tunnel_dns_failure">Tidak bisa mencari nama host DNS \"%s\"</string>
|
||||
@@ -208,6 +219,16 @@
|
||||
<string name="type_name_go_userspace">Ke userspace</string>
|
||||
<string name="type_name_kernel_module">Modul kernel</string>
|
||||
<string name="unknown_error">Eror tidak diketahui</string>
|
||||
<string name="updater_avalable">Pembaruan aplikasi tersedia. Perbarui sekarang.</string>
|
||||
<string name="updater_action">Unduh & Pembaruan</string>
|
||||
<string name="updater_rechecking">Mengambil pembaharuan metadata…</string>
|
||||
<string name="updater_download_progress">Mengunduh pembaruan: %1$s / %2$s (%3$.2f%%)</string>
|
||||
<string name="updater_download_progress_nototal">Mengunduh pembaruan: %s</string>
|
||||
<string name="updater_installing">Gagal menginstall…</string>
|
||||
<string name="updater_failure">Pembaruan gagal. %s. akan dicoba kembali sementara waktu…</string>
|
||||
<string name="updater_corrupt_title">Aplikasi Rusak</string>
|
||||
<string name="updater_corrupt_message">Aplikasi ini rusak. Silahkan unduh ulang APK-nya di website bawah ini. Setelah itu, Hapus instalan aplikasi ini dan install ulang dari APK yang telah diunduh.</string>
|
||||
<string name="updater_corrupt_navigate">Buka Website</string>
|
||||
<string name="version_summary">%1$s dengan v%2$s</string>
|
||||
<string name="version_summary_checking">Mengecek versi backend %s</string>
|
||||
<string name="version_summary_unknown">Versi %s Tidak diketahui</string>
|
||||
|
||||
@@ -59,9 +59,9 @@
|
||||
<string name="add_peer">Aggiungi peer</string>
|
||||
<string name="addresses">Indirizzi</string>
|
||||
<string name="applications">Applicazioni</string>
|
||||
<string name="allow_remote_control_intents_summary_off">Le applicazioni esterne non possono attivare tunnel (consigliato)</string>
|
||||
<string name="allow_remote_control_intents_summary_on">Le applicazioni esterne possono attivare tunnel (avanzato)</string>
|
||||
<string name="allow_remote_control_intents_title">Consenti applicazioni di controllo remoto</string>
|
||||
<string name="allow_remote_control_intents_summary_off">Le app esterne non possono attivare tunnel (consigliato)</string>
|
||||
<string name="allow_remote_control_intents_summary_on">Le app esterne possono attivare tunnel (avanzato)</string>
|
||||
<string name="allow_remote_control_intents_title">Consenti app di controllo remoto</string>
|
||||
<string name="allowed_ips">IP consentiti</string>
|
||||
<string name="bad_config_context">%2$s di %1$s</string>
|
||||
<string name="bad_config_context_top_level">%s</string>
|
||||
@@ -94,7 +94,7 @@
|
||||
<string name="create_downloads_file_error">Impossibile creare il file nella cartella di download</string>
|
||||
<string name="create_empty">Crea da zero</string>
|
||||
<string name="create_from_file">Importa da file o archivio</string>
|
||||
<string name="create_from_qr_code">Scansione da codice QR</string>
|
||||
<string name="create_from_qr_code">Scansiona da codice QR</string>
|
||||
<string name="create_output_dir_error">Impossibile creare la cartella di output</string>
|
||||
<string name="create_temp_dir_error">Impossibile creare la cartella locale temporanea</string>
|
||||
<string name="create_tunnel">Crea tunnel</string>
|
||||
@@ -107,6 +107,9 @@
|
||||
<string name="tv_select_a_storage_drive">Seleziona un\'unità di archiviazione</string>
|
||||
<string name="tv_no_file_picker">Installa un\'utilità di gestione file per sfogliare i file</string>
|
||||
<string name="tv_add_tunnel_get_started">Aggiungi un tunnel per iniziare</string>
|
||||
<string name="donate_title">♥ Dona al progetto WireGuard</string>
|
||||
<string name="donate_summary">Ogni contributo aiuta</string>
|
||||
<string name="donate_google_play_disappointment">Grazie per il sostegno al progetto WireGuard!\n\nPurtroppo, a causa delle politiche di Google, non siamo autorizzati a linkare la pagina del progetto dove puoi fare una donazione. Speriamo che la troverai!\n\nGrazie ancora per il tuo contributo.</string>
|
||||
<string name="disable_config_export_title">Disattiva esportazione config</string>
|
||||
<string name="disable_config_export_description">Disabilitare l\'esportazione della configurazione rende le chiavi private meno accessibili</string>
|
||||
<string name="dns_servers">Server DNS</string>
|
||||
@@ -116,13 +119,14 @@
|
||||
<string name="error_down">Errore di disattivazione del tunnel: %s</string>
|
||||
<string name="error_fetching_apps">Errore di recupero dell\'elenco applicazioni: %s</string>
|
||||
<string name="error_root">Accedi come root e riprova</string>
|
||||
<string name="error_prepare">Errore di preparazione del tunnel: %s</string>
|
||||
<string name="error_up">Errore di attivazione del tunnel: %s</string>
|
||||
<string name="exclude_private_ips">Escludi IP privati</string>
|
||||
<string name="generate_new_private_key">Genera nuova chiave privata</string>
|
||||
<string name="generic_error">Errore “%s” sconosciuto</string>
|
||||
<string name="hint_automatic">(auto)</string>
|
||||
<string name="hint_generated">(generato)</string>
|
||||
<string name="hint_optional">(facoltativo)</string>
|
||||
<string name="hint_generated">(generata)</string>
|
||||
<string name="hint_optional">(facoltativa)</string>
|
||||
<string name="hint_optional_discouraged">(facoltativo, non consigliato)</string>
|
||||
<string name="hint_random">(casuale)</string>
|
||||
<string name="illegal_filename_error">Nome file “%s” non valido</string>
|
||||
@@ -135,6 +139,8 @@
|
||||
<string name="key_length_explanation_base64">: le chiavi base64 di WireGuard devono essere di 44 caratteri (32 byte)</string>
|
||||
<string name="key_length_explanation_binary">: le chiavi di WireGuard devono essere di 32 byte</string>
|
||||
<string name="key_length_explanation_hex">: le chiavi esadecimali di WireGuard devono essere di 64 caratteri (32 byte)</string>
|
||||
<string name="latest_handshake">Ultima negoziazione</string>
|
||||
<string name="latest_handshake_ago">%s fa</string>
|
||||
<string name="listen_port">Porta in ascolto</string>
|
||||
<string name="log_export_error">Impossibile esportare il log: %s</string>
|
||||
<string name="log_export_subject">File di log WireGuard Android</string>
|
||||
@@ -178,6 +184,10 @@
|
||||
<string name="private_key">Chiave privata</string>
|
||||
<string name="public_key">Chiave pubblica</string>
|
||||
<string name="qr_code_hint">Suggerimento: genera con `qrencode -t ansiutf8 < tunnel.conf`.</string>
|
||||
<string name="quick_settings_tile_add_title">Aggiungi riquadro ale impostazioni rapide</string>
|
||||
<string name="quick_settings_tile_add_summary">La scorciatoia attiva/disattiva il tunnel più recente</string>
|
||||
<string name="quick_settings_tile_add_failure">Impossibile aggiungere la scorciatoia: errore %d</string>
|
||||
<string name="quick_settings_tile_action">Attiva/disattiva tunnel</string>
|
||||
<string name="restore_on_boot_summary_off">Non attiverà i tunnel configurati all\'avvio</string>
|
||||
<string name="restore_on_boot_summary_on">Attiverà i tunnel configurati all\'avvio</string>
|
||||
<string name="restore_on_boot_title">Ripristina all\'avvio</string>
|
||||
@@ -213,6 +223,7 @@
|
||||
<string name="tunnel_create_success">Tunnel “%s” creato correttamente</string>
|
||||
<string name="tunnel_error_already_exists">Il tunnel “%s” esiste già</string>
|
||||
<string name="tunnel_error_invalid_name">Nome non valido</string>
|
||||
<string name="tunnel_list_placeholder">Aggiungi un tunnel usando il pulsante sotto</string>
|
||||
<string name="tunnel_name">Nome tunnel</string>
|
||||
<string name="tunnel_on_error">Impossibile attivare il tunnel (wgTurnOn ha risposto %d)</string>
|
||||
<string name="tunnel_dns_failure">Impossibile risolve il nome di domino: \"%s\"</string>
|
||||
@@ -221,6 +232,16 @@
|
||||
<string name="type_name_go_userspace">Spazio utente Go</string>
|
||||
<string name="type_name_kernel_module">Modulo kernel</string>
|
||||
<string name="unknown_error">Errore sconosciuto</string>
|
||||
<string name="updater_avalable">È disponibile un aggiornamento dell\'app. Si prega di aggiornare ora.</string>
|
||||
<string name="updater_action">Scarica e aggiorna</string>
|
||||
<string name="updater_rechecking">Recupero metadati aggiornamento…</string>
|
||||
<string name="updater_download_progress">Scaricamento aggiornamento: %1$s / %2$s (%3$.2f%%)</string>
|
||||
<string name="updater_download_progress_nototal">Scaricamento aggiornamento: %s</string>
|
||||
<string name="updater_installing">Installazione aggiornamento…</string>
|
||||
<string name="updater_failure">Aggiornamento fallito: %s. Riprovo momentaneamente…</string>
|
||||
<string name="updater_corrupt_title">Applicazione danneggiata</string>
|
||||
<string name="updater_corrupt_message">Questa applicazione è danneggiata. Riscarica l\'APK dal sito collegato qui sotto. Dopo, disinstalla questa applicazione e reinstallala dall\'APK scaricato.</string>
|
||||
<string name="updater_corrupt_navigate">Apri sito web</string>
|
||||
<string name="version_summary">Backend %1$s %2$s</string>
|
||||
<string name="version_summary_checking">Controllo versione backend %s</string>
|
||||
<string name="version_summary_unknown">Versione %s sconosciuta</string>
|
||||
|
||||
@@ -96,10 +96,11 @@
|
||||
<string name="tv_add_tunnel_get_started">トンネルを追加して開始する</string>
|
||||
<string name="donate_title">♥ WireGuard プロジェクトに寄付する</string>
|
||||
<string name="donate_summary">すべての貢献が役立ちます</string>
|
||||
<string name="donate_google_play_disappointment">WireGuard プロジェクトを支援していただきありがとうございます!\n\n残念ながら、Google のポリシーの影響で寄付のページへのリンクを記載することができません。見つけていただけることを願っています。\n\nもう一度、あなたの貢献に深く感謝します。</string>
|
||||
<string name="disable_config_export_title">設定のエクスポートを無効にする</string>
|
||||
<string name="disable_config_export_description">設定のエクスポートを無効にすると、秘密鍵にアクセスされにくくなります</string>
|
||||
<string name="dns_servers">DNS サーバ</string>
|
||||
<string name="dns_search_domains">サーチドメイン</string>
|
||||
<string name="dns_search_domains">検索ドメイン</string>
|
||||
<string name="edit">編集</string>
|
||||
<string name="endpoint">エンドポイント</string>
|
||||
<string name="error_down">トンネル停止時エラー: %s</string>
|
||||
@@ -170,6 +171,10 @@
|
||||
<string name="private_key">秘密鍵</string>
|
||||
<string name="public_key">公開鍵</string>
|
||||
<string name="qr_code_hint">Tip: `qrencode -t ansiutf8 < tunnel.conf` で生成できます</string>
|
||||
<string name="quick_settings_tile_add_title">クイック設定パネルを追加</string>
|
||||
<string name="quick_settings_tile_add_summary">ショートカット・タイルを使用すると、最新のトンネルに切り替わります</string>
|
||||
<string name="quick_settings_tile_add_failure">ショートカット・タイルを追加できません: エラー %d</string>
|
||||
<string name="quick_settings_tile_action">トンネルを切り替え</string>
|
||||
<string name="restore_on_boot_summary_off">起動時にトンネルを有効化しない</string>
|
||||
<string name="restore_on_boot_summary_on">起動時に、前回有効だったトンネルを有効化する</string>
|
||||
<string name="restore_on_boot_title">起動時に復元</string>
|
||||
@@ -208,12 +213,22 @@
|
||||
<string name="tunnel_list_placeholder">下のボタンを使用してトンネルを追加</string>
|
||||
<string name="tunnel_name">トンネル名</string>
|
||||
<string name="tunnel_on_error">トンネルを有効にできません (wgTurnOn が %d を返却)</string>
|
||||
<string name="tunnel_dns_failure">DNSホスト名を解決できませんでした: “%s”</string>
|
||||
<string name="tunnel_dns_failure">ホスト名 “%s” を名前解決できませんでした</string>
|
||||
<string name="tunnel_rename_error">トンネル名を変更できません: %s</string>
|
||||
<string name="tunnel_rename_success">トンネル名を “%s” に変更しました</string>
|
||||
<string name="type_name_go_userspace">Go ユーザースペース</string>
|
||||
<string name="type_name_kernel_module">カーネルモジュール</string>
|
||||
<string name="unknown_error">未知のエラー</string>
|
||||
<string name="updater_avalable">アプリを更新できます。今すぐ更新してください。</string>
|
||||
<string name="updater_action">ダウンロードして更新</string>
|
||||
<string name="updater_rechecking">更新のメタデータを取得しています…</string>
|
||||
<string name="updater_download_progress">更新のダウンロード中: %1$s / %2$s (%3$.2f%%)</string>
|
||||
<string name="updater_download_progress_nototal">更新のダウンロード中: %s</string>
|
||||
<string name="updater_installing">更新をインストール中…</string>
|
||||
<string name="updater_failure">更新に失敗しました: %s. 一定時間後に再試行します…</string>
|
||||
<string name="updater_corrupt_title">アプリケーションが破損しています</string>
|
||||
<string name="updater_corrupt_message">このアプリケーションは破損しています。下記のリンク先のウェブサイトから APK を再ダウンロードしてください。その後、このアプリケーションをアンインストールし、ダウンロードした APK から再インストールしてください。</string>
|
||||
<string name="updater_corrupt_navigate">ウェブサイトを開く</string>
|
||||
<string name="version_summary">%1$s バックエンド %2$s</string>
|
||||
<string name="version_summary_checking">%s バックエンドのバージョンを確認中</string>
|
||||
<string name="version_summary_unknown">未知の %s バージョン</string>
|
||||
|
||||
@@ -94,6 +94,9 @@
|
||||
<string name="tv_select_a_storage_drive">저장소를 선택</string>
|
||||
<string name="tv_no_file_picker">파일을 찾는 데 사용할 파일 관리자를 설치하시오</string>
|
||||
<string name="tv_add_tunnel_get_started">시작하려면 터널을 추가하시오</string>
|
||||
<string name="donate_title">♥ WireGuard 프로젝트에 기부해주세요</string>
|
||||
<string name="donate_summary">모든 기여가 도움이 됩니다</string>
|
||||
<string name="donate_google_play_disappointment">WireGuard 프로젝트를 지원해 주셔서 감사합니다!\n\n안타깝게도 Google 정책으로 인해 프로젝트 웹페이지에서 기부할 수 있는 부분에 대한 링크가 허용되지 않습니다. 이 문제를 해결할 수 있기를 바랍니다!\n\n기여해 주셔서 다시 한번 감사드립니다.</string>
|
||||
<string name="disable_config_export_title">설정 내보내기 기능을 중지</string>
|
||||
<string name="disable_config_export_description">설정 내보내기 기능을 중지하면 개인키 유출을 줄일 수 있음</string>
|
||||
<string name="dns_servers">DNS 서버</string>
|
||||
@@ -103,6 +106,7 @@
|
||||
<string name="error_down">터널 중단 시 오류 발생: %s</string>
|
||||
<string name="error_fetching_apps">앱 목록을 받는 도중 오류 발생: %s</string>
|
||||
<string name="error_root">관리자 권한이 필요함</string>
|
||||
<string name="error_prepare">터널 준비 오류: %s</string>
|
||||
<string name="error_up">터널을 시작 시 오류 발생: %s</string>
|
||||
<string name="exclude_private_ips">사설 IP 제외</string>
|
||||
<string name="generate_new_private_key">새로운 개인 키 만들기</string>
|
||||
@@ -122,6 +126,8 @@
|
||||
<string name="key_length_explanation_base64">: WireGuard의 base64 키는 반드시 44 글자(32 바이트)임</string>
|
||||
<string name="key_length_explanation_binary">: WireGuard의 키는 반드시 32 바이트임</string>
|
||||
<string name="key_length_explanation_hex">: WireGuard의 16진수 키는 반드시 64 글자(32 바이트)임</string>
|
||||
<string name="latest_handshake">마지막 정보교환</string>
|
||||
<string name="latest_handshake_ago">%s 전에</string>
|
||||
<string name="listen_port">수신 대기 포트</string>
|
||||
<string name="log_export_error">로그를 내보낼 수 없음: %s</string>
|
||||
<string name="log_export_subject">WireGuard 안드로이드 로그 파일</string>
|
||||
@@ -165,6 +171,10 @@
|
||||
<string name="private_key">개인 키</string>
|
||||
<string name="public_key">공개 키</string>
|
||||
<string name="qr_code_hint">팁: `qrencode -t ansiutf8 < tunnel.conf` 로 생성가능함.</string>
|
||||
<string name="quick_settings_tile_add_title">빠른 설정 패널에 타일 추가</string>
|
||||
<string name="quick_settings_tile_add_summary">바로가기 타일은 가장 최근 터널을 전환합니다</string>
|
||||
<string name="quick_settings_tile_add_failure">바로가기 타일을 추가할 수 없음: 오류 %d</string>
|
||||
<string name="quick_settings_tile_action">터널 전환</string>
|
||||
<string name="restore_on_boot_summary_off">부팅 시 활성화된 터널들을 켜지 않음</string>
|
||||
<string name="restore_on_boot_summary_on">부팅 시 활성화된 터널들을 켬</string>
|
||||
<string name="restore_on_boot_title">부트 후 복구</string>
|
||||
@@ -200,13 +210,26 @@
|
||||
<string name="tunnel_create_success">터널 \"%s\"을 성공적으로 생성함</string>
|
||||
<string name="tunnel_error_already_exists">터널 \"%s\"가 이미 존재함</string>
|
||||
<string name="tunnel_error_invalid_name">잘못된 이름</string>
|
||||
<string name="tunnel_list_placeholder">아래 버튼을 사용하여 터널을 추가하세요</string>
|
||||
<string name="tunnel_name">터널 이름</string>
|
||||
<string name="tunnel_on_error">터널을 켤 수 없음 (wgTurnOn이 %d를 반환함)</string>
|
||||
<string name="tunnel_dns_failure">DNS 호스트 이름을 확인할 수 없음: “%s”</string>
|
||||
<string name="tunnel_rename_error">터널 이름을 바꿀 수 없음: %s</string>
|
||||
<string name="tunnel_rename_success">터널 이름을 \"%s\"로 변경 성공</string>
|
||||
<string name="type_name_go_userspace">Go userspace</string>
|
||||
<string name="type_name_kernel_module">커널 모듈</string>
|
||||
<string name="unknown_error">알 수 없는 오류</string>
|
||||
<string name="updater_avalable">애플리케이션 업데이트를 사용할 수 있습니다. 지금 업데이트하세요.</string>
|
||||
<string name="updater_action">다운로드 & 업데이트</string>
|
||||
<string name="updater_rechecking">업데이트 메타데이터를 가져오는 중…</string>
|
||||
<string name="updater_download_progress">업데이트 다운로드 중: %1$s / %2$s (%3$.2f%%)</string>
|
||||
<string name="updater_download_progress_nototal">업데이트 다운로드 중: %s</string>
|
||||
<string name="updater_installing">업데이트 설치 중…</string>
|
||||
<string name="updater_failure">업데이트 실패: %s. 잠시 후 다시 시도합니다…</string>
|
||||
<string name="updater_corrupt_title">애플리케이션 손상</string>
|
||||
<string name="updater_corrupt_message">이 응용 프로그램이 손상되었습니다. 아래 링크된 웹사이트에서 APK를 다시 다운로드하세요. 그런 다음 이 애플리케이션을 제거하고 다운로드한 APK에서 다시 설치하세요.</string>
|
||||
<string name="updater_corrupt_navigate">웹사이트 열기</string>
|
||||
<string name="version_summary">%1$s 백엔드 %2$s</string>
|
||||
<string name="version_summary_checking">%s 백엔드 버전 확인 중</string>
|
||||
<string name="version_summary_unknown">알 수 없는 버전: %s</string>
|
||||
<string name="version_title">WireGuard for 안드로이드 v%s</string>
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
|
||||
<resources>
|
||||
|
||||
<style name="WireGuardTheme" parent="Theme.Material3.Dark">
|
||||
<item name="colorPrimary">@color/md_theme_dark_primary</item>
|
||||
<item name="colorOnPrimary">@color/md_theme_dark_onPrimary</item>
|
||||
|
||||
@@ -4,6 +4,10 @@
|
||||
<item quantity="one">Kan %d tunnel niet verwijderen: %s</item>
|
||||
<item quantity="other">Kan %d tunnels niet verwijderen: %s</item>
|
||||
</plurals>
|
||||
<plurals name="delete_success">
|
||||
<item quantity="one">%d tunnel succesvol verwijderd</item>
|
||||
<item quantity="other">%d tunnels succesvol verwijderd</item>
|
||||
</plurals>
|
||||
<plurals name="delete_title">
|
||||
<item quantity="one">%d tunnel geselecteerd</item>
|
||||
<item quantity="other">%d tunnels geselecteerd</item>
|
||||
@@ -12,4 +16,236 @@
|
||||
<item quantity="one">%1$d van %2$d tunnels geïmporteerd</item>
|
||||
<item quantity="other">%1$d van de %2$d tunnels geïmporteerd</item>
|
||||
</plurals>
|
||||
<plurals name="import_total_success">
|
||||
<item quantity="one">%d tunnel geïmporteerd</item>
|
||||
<item quantity="other">%d tunnels geïmporteerd</item>
|
||||
</plurals>
|
||||
<plurals name="set_excluded_applications">
|
||||
<item quantity="one">%d uitgesloten applicatie(s)</item>
|
||||
<item quantity="other">%d uitgesloten applicaties</item>
|
||||
</plurals>
|
||||
<plurals name="set_included_applications">
|
||||
<item quantity="one">%d inbegrepen applicatie</item>
|
||||
<item quantity="other">%d inbegrepen applicaties</item>
|
||||
</plurals>
|
||||
<plurals name="n_excluded_applications">
|
||||
<item quantity="one">%d uitgesloten</item>
|
||||
<item quantity="other">%d uitgesloten</item>
|
||||
</plurals>
|
||||
<plurals name="n_included_applications">
|
||||
<item quantity="one">%d inbegrepen</item>
|
||||
<item quantity="other">%d inbegrepen</item>
|
||||
</plurals>
|
||||
<string name="all_applications">Alle applicaties</string>
|
||||
<string name="exclude_from_tunnel">Uitsluiten</string>
|
||||
<string name="include_in_tunnel">Alleen opnemen</string>
|
||||
<plurals name="include_n_applications">
|
||||
<item quantity="one">Neem %d app op</item>
|
||||
<item quantity="other">Voeg %d apps toe</item>
|
||||
</plurals>
|
||||
<plurals name="exclude_n_applications">
|
||||
<item quantity="one">%d app uitsluiten</item>
|
||||
<item quantity="other">%d apps uitsluiten</item>
|
||||
</plurals>
|
||||
<plurals name="persistent_keepalive_seconds_unit">
|
||||
<item quantity="one">iedere seconde</item>
|
||||
<item quantity="other">iedere %d seconden</item>
|
||||
</plurals>
|
||||
<plurals name="persistent_keepalive_seconds_suffix">
|
||||
<item quantity="one">seconde</item>
|
||||
<item quantity="other">seconden</item>
|
||||
</plurals>
|
||||
<string name="use_all_applications">Gebruik alle applicaties</string>
|
||||
<string name="add_peer">Peer toevoegen</string>
|
||||
<string name="addresses">Adressen</string>
|
||||
<string name="applications">Applicaties</string>
|
||||
<string name="allow_remote_control_intents_summary_off">Externe apps kunnen mogelijk geen tunnels in-/uitschakelen (aanbevolen)</string>
|
||||
<string name="allow_remote_control_intents_summary_on">Externe apps kunnen tunnels in-/uitschakelen (geavanceerd)</string>
|
||||
<string name="allow_remote_control_intents_title">Controle door externe besturingsapps toestaan</string>
|
||||
<string name="allowed_ips">Toegestane IP-adressen</string>
|
||||
<string name="bad_config_context">%1$s\'s %2$s</string>
|
||||
<string name="bad_config_context_top_level">%s</string>
|
||||
<string name="bad_config_error">%1$s in %2$s</string>
|
||||
<string name="bad_config_explanation_pka">: moet positief zijn en niet meer dan 65535</string>
|
||||
<string name="bad_config_explanation_positive_number">: Moet positief zijn</string>
|
||||
<string name="bad_config_explanation_udp_port">: Moet een geldig UDP poortnummer zijn</string>
|
||||
<string name="bad_config_reason_invalid_key">Ongeldige sleutel</string>
|
||||
<string name="bad_config_reason_invalid_number">Ongeldig nummer</string>
|
||||
<string name="bad_config_reason_invalid_value">Ongeldige waarde</string>
|
||||
<string name="bad_config_reason_missing_attribute">Attribuut ontbreekt</string>
|
||||
<string name="bad_config_reason_missing_section">Ontbrekende sectie</string>
|
||||
<string name="bad_config_reason_syntax_error">Syntaxfout</string>
|
||||
<string name="bad_config_reason_unknown_attribute">Onbekend attribuut</string>
|
||||
<string name="bad_config_reason_unknown_section">Onbekende sectie</string>
|
||||
<string name="bad_config_reason_value_out_of_range">Waarde buiten bereik</string>
|
||||
<string name="bad_extension_error">Bestand moet .conf of .zip zijn</string>
|
||||
<string name="error_no_qr_found">QR-code niet gevonden in afbeelding</string>
|
||||
<string name="error_qr_checksum">QR-code checksum verificatie mislukt</string>
|
||||
<string name="cancel">Annuleren</string>
|
||||
<string name="config_delete_error">Kan configuratiebestand %s niet verwijderen</string>
|
||||
<string name="config_exists_error">Configuratie voor \"%s\" bestaat al</string>
|
||||
<string name="config_file_exists_error">Configuratiebestand \"%s\" bestaat al</string>
|
||||
<string name="config_not_found_error">Configuratiebestand \"%s\" niet gevonden</string>
|
||||
<string name="config_rename_error">Kan configuratiebestand \"%s\" \" niet hernoemen</string>
|
||||
<string name="config_save_error">Kan de configuratie voor \"%1$s\" niet opslaan: %2$s</string>
|
||||
<string name="config_save_success">Configuratie succesvol opgeslagen voor \"%s\"</string>
|
||||
<string name="create_activity_title">WireGuard tunnel aanmaken</string>
|
||||
<string name="create_bin_dir_error">Kan geen lokale \'bin\' map aanmaken</string>
|
||||
<string name="create_downloads_file_error">Kan bestand niet maken in downloadmap</string>
|
||||
<string name="create_empty">Begin met lege configuratie</string>
|
||||
<string name="create_from_file">Importeren uit bestand of archief</string>
|
||||
<string name="create_from_qr_code">Scan van QR code</string>
|
||||
<string name="create_output_dir_error">Kan de output map niet aanmaken</string>
|
||||
<string name="create_temp_dir_error">Kan geen tijdelijke map aanmaken</string>
|
||||
<string name="create_tunnel">Maak nieuwe tunnel</string>
|
||||
<string name="copied_to_clipboard">%s gekopieerd naar klembord</string>
|
||||
<string name="dark_theme_summary_off">Momenteel wordt licht (dag) thema gebruikt</string>
|
||||
<string name="dark_theme_summary_on">Momenteel wordt donker (nacht) thema gebruikt</string>
|
||||
<string name="dark_theme_title">Gebruik donker thema</string>
|
||||
<string name="delete">Verwijder</string>
|
||||
<string name="tv_delete">Selecteer tunnel om te verwijderen</string>
|
||||
<string name="tv_select_a_storage_drive">Selecteer een opslaglocatie</string>
|
||||
<string name="tv_no_file_picker">Installeer een bestandsbeheer applicatie</string>
|
||||
<string name="tv_add_tunnel_get_started">Voeg een tunnel toe om te beginnen</string>
|
||||
<string name="donate_title">♥️ Doneer aan het WireGuard Project</string>
|
||||
<string name="donate_summary">Elke bijdrage helpt</string>
|
||||
<string name="donate_google_play_disappointment">Bedankt voor het steunen van het WireGuard Project!\n\nHelaas, als gevolg van Google beleid, We mogen niet linken naar de webpagina van het project waar u een donatie kunt doen. Hopelijk kunt u deze zelf wel vinden!\n\nNogmaals bedankt voor uw bijdrage.</string>
|
||||
<string name="disable_config_export_title">Config export uitschakelen</string>
|
||||
<string name="disable_config_export_description">Het uitschakelen van configuratie export maakt privésleutels minder toegankelijk</string>
|
||||
<string name="dns_servers">DNS-servers</string>
|
||||
<string name="dns_search_domains">DNS-zoekdomeinen</string>
|
||||
<string name="edit">Bewerken</string>
|
||||
<string name="endpoint">Eindpunt</string>
|
||||
<string name="error_down">Fout bij stoppen tunnel: %s</string>
|
||||
<string name="error_fetching_apps">Fout bij ophalen van apps-lijst: %s</string>
|
||||
<string name="error_root">Verkrijg root toegang en probeer het opnieuw</string>
|
||||
<string name="error_prepare">Fout bij voorbereiden tunnel: %s</string>
|
||||
<string name="error_up">Fout bij het starten van tunnel: %s</string>
|
||||
<string name="exclude_private_ips">Privé-IP\'s uitsluiten</string>
|
||||
<string name="generate_new_private_key">Nieuwe privésleutel genereren</string>
|
||||
<string name="generic_error">Onbekend fout: \"%s\"</string>
|
||||
<string name="hint_automatic">(auto)</string>
|
||||
<string name="hint_generated">(gegenereerd)</string>
|
||||
<string name="hint_optional">(optioneel)</string>
|
||||
<string name="hint_optional_discouraged">(optioneel, niet aanbevolen)</string>
|
||||
<string name="hint_random">(willekeurig)</string>
|
||||
<string name="illegal_filename_error">Ongeldige bestandsnaam \"%s\" \"</string>
|
||||
<string name="import_error">Kan tunnel niet importeren: %s</string>
|
||||
<string name="import_from_qr_code">Importeer Tunnel uit QR Code</string>
|
||||
<string name="import_success">Geïmporteerd \"%s\"</string>
|
||||
<string name="interface_title">Interface</string>
|
||||
<string name="key_contents_error">Slechte tekens in de veld</string>
|
||||
<string name="key_length_error">Onjuiste sleutellengte</string>
|
||||
<string name="key_length_explanation_base64">: WireGuard base64 sleutels moeten 44 tekens zijn (32 bytes)</string>
|
||||
<string name="key_length_explanation_binary">: WireGuard sleutels moeten 32 bytes zijn</string>
|
||||
<string name="key_length_explanation_hex">: WireGuard hex sleutels moeten 64 tekens zijn (32 bytes)</string>
|
||||
<string name="latest_handshake">Recentste uitwisseling</string>
|
||||
<string name="latest_handshake_ago">%s geleden</string>
|
||||
<string name="listen_port">Luister op poort</string>
|
||||
<string name="log_export_error">Kan logboek niet exporteren: %s</string>
|
||||
<string name="log_export_subject">WireGuard Android logbestand</string>
|
||||
<string name="log_export_success">Opgeslagen in \"%s\"</string>
|
||||
<string name="log_export_title">Exporteer logboek naar bestand</string>
|
||||
<string name="log_saver_activity_label">Logboek opslaan</string>
|
||||
<string name="log_viewer_pref_summary">Logboeken kunnen helpen bij het debuggen</string>
|
||||
<string name="log_viewer_pref_title">Bekijk applicatielogboek</string>
|
||||
<string name="log_viewer_title">Log</string>
|
||||
<string name="logcat_error">Kan logcat niet uitvoeren: </string>
|
||||
<string name="module_enabler_disabled_summary">De experimentele kernel module kan de prestaties verbeteren</string>
|
||||
<string name="module_enabler_disabled_title">Kernel module backend inschakelen</string>
|
||||
<string name="module_enabler_enabled_summary">De langzamere userspace backend kan de stabiliteit verbeteren</string>
|
||||
<string name="module_enabler_enabled_title">Uitschakelen kernel module backend</string>
|
||||
<string name="module_installer_error">Er ging iets mis. Probeer het nog eens</string>
|
||||
<string name="module_installer_initial">De experimentele kernel module kan de prestaties verbeteren</string>
|
||||
<string name="module_installer_not_found">Er zijn geen modules beschikbaar voor uw apparaat</string>
|
||||
<string name="module_installer_title">Download en installeer kernel module</string>
|
||||
<string name="module_installer_working">Downloaden en installeren…</string>
|
||||
<string name="module_version_error">Niet in staat om kernel module versie te bepalen</string>
|
||||
<string name="mtu">MTU</string>
|
||||
<string name="multiple_tunnels_summary_off">Het inschakelen van één tunnel zal anderen uitzetten</string>
|
||||
<string name="multiple_tunnels_summary_on">Meerdere tunnels kunnen tegelijkertijd actief zijn</string>
|
||||
<string name="multiple_tunnels_title">Meerdere gelijktijdige tunnels toestaan</string>
|
||||
<string name="name">Naam</string>
|
||||
<string name="no_config_error">Probeer een tunnel zonder configuratie te starten</string>
|
||||
<string name="no_configs_error">Geen configuraties gevonden</string>
|
||||
<string name="no_tunnels_error">Geen tunnels gedefinieerd</string>
|
||||
<string name="parse_error_generic">string</string>
|
||||
<string name="parse_error_inet_address">IP-adres</string>
|
||||
<string name="parse_error_inet_endpoint">eindpunt</string>
|
||||
<string name="parse_error_inet_network">IP netwerk</string>
|
||||
<string name="parse_error_integer">nummer</string>
|
||||
<string name="parse_error_reason">Kan %1$s%2$s niet parsen</string>
|
||||
<string name="peer">Peer</string>
|
||||
<string name="permission_description">beheer WireGuard tunnels, zet tunnels naar keuze aan en uit, en misleid mogelijk het Internetverkeer</string>
|
||||
<string name="permission_label">WireGuard tunnels beheren</string>
|
||||
<string name="persistent_keepalive">Voortdurende verbindingstest</string>
|
||||
<string name="pre_shared_key">Gedeelde sleutel</string>
|
||||
<string name="pre_shared_key_enabled">ingeschakeld</string>
|
||||
<string name="private_key">Privésleutel</string>
|
||||
<string name="public_key">Publieke sleutel</string>
|
||||
<string name="qr_code_hint">Tip: genereer met `qrencode -t ansiutf8 < tunnel.conf`.</string>
|
||||
<string name="quick_settings_tile_add_title">Voeg tegel toe aan snelle instellingen</string>
|
||||
<string name="quick_settings_tile_add_summary">De sneltoets schakelt de meest recente tunnel aan</string>
|
||||
<string name="quick_settings_tile_add_failure">Kan geen sneltoets toevoegen: fout %d</string>
|
||||
<string name="quick_settings_tile_action">tunnel in-/uitschakelen</string>
|
||||
<string name="restore_on_boot_summary_off">Zal ingeschakelde tunnels niet aanzetten bij opstarten</string>
|
||||
<string name="restore_on_boot_summary_on">Zal ingeschakelde tunnels aanzetten bij opstarten</string>
|
||||
<string name="restore_on_boot_title">Tunnel starten bij herstart</string>
|
||||
<string name="save">Opslaan</string>
|
||||
<string name="select_all">Selecteer alles</string>
|
||||
<string name="settings">Instellingen</string>
|
||||
<string name="shell_exit_status_read_error">Shell kan de exitstatus niet lezen</string>
|
||||
<string name="shell_marker_count_error">Shell verwachtte 4 markeringen, ontving er %d</string>
|
||||
<string name="shell_start_error">Shell kon niet starten: %d</string>
|
||||
<string name="success_application_will_restart">Succes. De toepassing zal nu herstarten…</string>
|
||||
<string name="toggle_all">Alles wisselen</string>
|
||||
<string name="toggle_error">Fout bij omschakelen Wireguard tunnel: %s</string>
|
||||
<string name="tools_installer_already">wg and wg-quick zijn al geïnstalleerd</string>
|
||||
<string name="tools_installer_failure">Kan de command-line tools niet installeren (geen root?)</string>
|
||||
<string name="tools_installer_initial">Optionele tools voor scripts installeren</string>
|
||||
<string name="tools_installer_initial_magisk">Optionele tools voor het scripting als Magisk module installeren</string>
|
||||
<string name="tools_installer_initial_system">Optionele tools voor scripting in de systeempartitie installeren</string>
|
||||
<string name="tools_installer_success_magisk">wg en wg-quick installeren als een Magisk-module (herstart vereist)</string>
|
||||
<string name="tools_installer_success_system">\"Wg en wg-quick\" geïnstalleerd in de systeempartitie</string>
|
||||
<string name="tools_installer_title">Installeer command line tools</string>
|
||||
<string name="tools_installer_working">Installeren van wg en wg-quick</string>
|
||||
<string name="tools_unavailable_error">Vereiste tools niet beschikbaar</string>
|
||||
<string name="transfer">Transfer</string>
|
||||
<string name="transfer_bytes">%d B</string>
|
||||
<string name="transfer_gibibytes">%.2f GiB</string>
|
||||
<string name="transfer_kibibytes">%.2f KiB</string>
|
||||
<string name="transfer_mibibytes">%.2f MiB</string>
|
||||
<string name="transfer_rx_tx">ontvangen: %1$s, verzonden: %2$s</string>
|
||||
<string name="transfer_tibibytes">%.2f TiB</string>
|
||||
<string name="tun_create_error">Kan tun apparaat niet aanmaken</string>
|
||||
<string name="tunnel_create_error">Kan tunnel %s niet creëren</string>
|
||||
<string name="tunnel_create_success">Tunnel succesvol aangemaakt \"%s\"</string>
|
||||
<string name="tunnel_error_already_exists">Tunnel \"%s\" bestaat al</string>
|
||||
<string name="tunnel_error_invalid_name">Ongeldige naam</string>
|
||||
<string name="tunnel_list_placeholder">Voeg een tunnel toe met de knop hieronder</string>
|
||||
<string name="tunnel_name">Tunnelnaam</string>
|
||||
<string name="tunnel_rename_error">Kan tunnel niet hernoemen: %s</string>
|
||||
<string name="tunnel_rename_success">Tunnel succesvol hernoemd naar \"%s\"</string>
|
||||
<string name="type_name_go_userspace">Go userspace</string>
|
||||
<string name="type_name_kernel_module">Kernel module</string>
|
||||
<string name="unknown_error">Onbekende fout</string>
|
||||
<string name="updater_avalable">Er is een nieuwe versie beschikbaar. Update a.u.b.</string>
|
||||
<string name="updater_action">Download & installeer updates</string>
|
||||
<string name="updater_rechecking">Update metadata downloaden…</string>
|
||||
<string name="updater_download_progress">Ophalen nieuwe versie: %1$s / %2$s (%3$.2f%%)</string>
|
||||
<string name="updater_download_progress_nototal">Updates downloaden: %s</string>
|
||||
<string name="updater_installing">Update wordt geïnstalleerd…</string>
|
||||
<string name="updater_failure">Bijwerken mislukt: %s. Zal het zo opnieuw proberen…</string>
|
||||
<string name="updater_corrupt_title">Toepassing beschadigd</string>
|
||||
<string name="updater_corrupt_message">De toepassing is beschadigd. Download de APK opnieuw van de onderstaande website. De-installeer daarna het programma, en herinstalleer het met de gedownloade APK.</string>
|
||||
<string name="updater_corrupt_navigate">Open website</string>
|
||||
<string name="version_summary_unknown">Onbekende versie: %s</string>
|
||||
<string name="version_title">WireGuard voor Android v%s</string>
|
||||
<string name="vpn_not_authorized_error">VPN-service niet geautoriseerd door gebruiker</string>
|
||||
<string name="zip_export_summary">Zip-bestand wordt opgeslagen in de downloadmap</string>
|
||||
<string name="zip_export_title">Exporteer tunnels naar zip-bestand</string>
|
||||
<string name="biometric_prompt_zip_exporter_title">Authenticeer om de tunnel configuratie te exporteren</string>
|
||||
<string name="biometric_prompt_private_key_title">Authenticeer om de persoonlijke sleutel te bekijken</string>
|
||||
<string name="biometric_auth_error">Authenticatiefout</string>
|
||||
<string name="biometric_auth_error_reason">Authenticatiefout: %s</string>
|
||||
</resources>
|
||||
|
||||
@@ -139,6 +139,8 @@
|
||||
<string name="key_length_explanation_base64">: WireGuard base64-nøkler må være 44 tegn (32 byte)</string>
|
||||
<string name="key_length_explanation_binary">: WireGuard nøkler må være 32 byte</string>
|
||||
<string name="key_length_explanation_hex">: WireGuard hex-nøkler må være 64 tegn (32 byte)</string>
|
||||
<string name="latest_handshake">Siste håndtrykk</string>
|
||||
<string name="latest_handshake_ago">for %s siden</string>
|
||||
<string name="listen_port">Lytt på port</string>
|
||||
<string name="log_export_error">Kan ikke eksportere logg: %s</string>
|
||||
<string name="log_export_subject">WireGuard Android loggfil</string>
|
||||
@@ -182,6 +184,10 @@
|
||||
<string name="private_key">Privat Nøkkel</string>
|
||||
<string name="public_key">Offentlig nøkkel</string>
|
||||
<string name="qr_code_hint">Tips: generer med `qrencode -t ansiutf8 < tunnel.conf`.</string>
|
||||
<string name="quick_settings_tile_add_title">Legge til i hurtiginnstillingspanelet</string>
|
||||
<string name="quick_settings_tile_add_summary">Snarveien i hurtiginstillinger viser den siste tilkoblede tunnelen</string>
|
||||
<string name="quick_settings_tile_add_failure">Kunne ikke legge til snarveis: feil %d</string>
|
||||
<string name="quick_settings_tile_action">Koble til tunnel</string>
|
||||
<string name="restore_on_boot_summary_off">Vil ikke ta opp aktive tunneler ved oppstart</string>
|
||||
<string name="restore_on_boot_summary_on">Vil ta opp aktive tunneler ved oppstart</string>
|
||||
<string name="restore_on_boot_title">Gjenopprett ved oppstart</string>
|
||||
@@ -226,6 +232,16 @@
|
||||
<string name="type_name_go_userspace">Bruk userspace</string>
|
||||
<string name="type_name_kernel_module">Kjernemodul</string>
|
||||
<string name="unknown_error">Ukjent feil</string>
|
||||
<string name="updater_avalable">En programoppdatering er tilgjengelig. Oppdater nå.</string>
|
||||
<string name="updater_action">Last ned & oppdatering</string>
|
||||
<string name="updater_rechecking">Henter metadata for oppdatering…</string>
|
||||
<string name="updater_download_progress">Laster ned oppdatering: %1$s / %2$s (%3$.2f%%)</string>
|
||||
<string name="updater_download_progress_nototal">Laster ned oppdatering: %s</string>
|
||||
<string name="updater_installing">Installler oppdatering…</string>
|
||||
<string name="updater_failure">Oppdateringen feilet: %s. Vil prøve igjen øyeblikkelig…</string>
|
||||
<string name="updater_corrupt_title">Applikasjonen feilet</string>
|
||||
<string name="updater_corrupt_message">Dette programmet feilet. Last ned APK på nytt fra nettstedet koblet til nedenfor. Avinstaller dette programmet og installer den nedlastede APK.</string>
|
||||
<string name="updater_corrupt_navigate">Åpne nettsiden</string>
|
||||
<string name="version_summary">%1$s backend %2$s</string>
|
||||
<string name="version_summary_checking">Sjekker %s backend versjon</string>
|
||||
<string name="version_summary_unknown">Ukjent %s versjon</string>
|
||||
|
||||
@@ -79,6 +79,8 @@
|
||||
<string name="bad_config_reason_unknown_section">ਅਣਪਛਾਤਾ ਭਾਗ</string>
|
||||
<string name="bad_config_reason_value_out_of_range">ਮੁੱਲ ਹੱਦ ਤੋਂ ਬਾਹਰ ਹੈ</string>
|
||||
<string name="bad_extension_error">ਫ਼ਾਇਲ .conf ਜਾਂ .zip ਹੋਣੀ ਚਾਹੀਦੀ ਹੈ</string>
|
||||
<string name="error_no_qr_found">ਚਿੱਤਰ ਵਿੱਚ QR ਕੋਡ ਨਹੀਂ ਲੱਭਿਆ</string>
|
||||
<string name="error_qr_checksum">QR ਕੋਡ ਚੈਕ-ਸਮ ਤਸਦੀਕ ਅਸਫ਼ਲ ਹੋਈ</string>
|
||||
<string name="cancel">ਰੱਦ ਕਰੋ</string>
|
||||
<string name="config_delete_error">ਸੰਰਚਨਾ ਫ਼ਾਇਲ %s ਹਟਾਈ ਨਹੀਂ ਜਾ ਸਕਦੀ ਹੈ</string>
|
||||
<string name="config_exists_error">“%s” ਲਈ ਸੰਰਚਨਾ ਪਹਿਲਾਂ ਹੀ ਮੌਜੂਦ ਹੈ</string>
|
||||
@@ -105,14 +107,19 @@
|
||||
<string name="tv_select_a_storage_drive">ਸਟੋਰੇਜ਼ ਡਰਾਈਵ ਚੁਣੋ</string>
|
||||
<string name="tv_no_file_picker">ਫਾਇਲਾਂ ਬਰਾਊਜ਼ ਕਰਨ ਲਈ ਫਾਇਲ ਪਰਬੰਧਕੀ ਸਹੂਲਤ ਇੰਸਟਾਲ ਕਰੋ</string>
|
||||
<string name="tv_add_tunnel_get_started">ਸ਼ੁਰੂ ਕਰਨ ਲਈ ਟਨਲ ਜੋੜੋ</string>
|
||||
<string name="donate_title">♥ ਵਾਇਰਗਾਰਡ ਪਰੋਜੈਕਟ ਨੂੰ ਦਾਨ ਦਿਓ</string>
|
||||
<string name="donate_summary">ਹਰ ਯੋਗਦਾਨ ਮਦਦਗਾਰ ਹੈ</string>
|
||||
<string name="donate_google_play_disappointment">ਵਾਇਰਗਾਰਡ (WireGuard) ਪ੍ਰੋਜੈਕਟ ਦੀ ਮਦਦ ਕਰਨ ਲਈ ਤੁਹਾਡਾ ਧੰਨਵਾਦ ਹੈ!\n\nਅਫ਼ਸੋਸ ਹੈ ਕਿ Google ਦੀਆਂ ਨੀਤੀਆਂ ਕਰਕੇ ਪ੍ਰੋਜੈਕਟ ਦੇ ਵੈੱਬ-ਸਫ਼ੇ, ਜਿੱਥੇ ਤੁਸੀਂ ਦਾਨ ਦੇ ਸਕਦੇ ਹੋ, ਸਾਨੂੰ ਇੱਥੇ ਨਹੀਂ ਲਿੰਕ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ। ਆਸ ਕਰਦੇ ਹਾਂ ਕਿ ਤੁਸੀਂ ਇਹ ਲੱਭ ਲਵੋਗੇ!\n\nਤੁਹਾਡੇ ਯੋਗਦਾਨ ਵਾਸਤੇ ਇੱਕ ਵਾਰ ਫੇਰ ਧੰਨਵਾਦ ਹੈ।</string>
|
||||
<string name="disable_config_export_title">ਸੰਰਚਨਾ ਐਕਸਪੋਰਟ ਕਰਨ ਨੂੰ ਅਸਮਰੱਥ ਕਰੋ</string>
|
||||
<string name="disable_config_export_description">ਸੰਰਚਨਾ ਐਕਸਪੋਰਟ ਕਰਨ ਉੱਤੇ ਰੋਕ ਲਾਉਣ ਨਾਲ ਪ੍ਰਾਈਵੇਟ ਕੁੰਜੀਆਂ ਲਈ ਪਹੁੰਚ ਘਟੇਗੀ</string>
|
||||
<string name="dns_servers">DNS ਸਰਵਰ</string>
|
||||
<string name="dns_search_domains">ਡੋਮੇਨਾਂ ਲੱਭੋ</string>
|
||||
<string name="edit">ਸੋਧੋ</string>
|
||||
<string name="endpoint">ਐਂਡ-ਪੁਆਇੰਟ</string>
|
||||
<string name="error_down">ਟਨਲ ਬੰਦ ਕਰਨ ਦੌਰਾਨ ਗ਼ਲਤੀ: %s</string>
|
||||
<string name="error_fetching_apps">ਐਪ ਸੂਚੀ ਲੈਣ ਦੌਰਾਨ ਗ਼ਲਤੀ: %s</string>
|
||||
<string name="error_root">ਰੂਟ ਪਹੁੰਚ ਲਵੋ ਅਤੇ ਮੁੜ ਕੋਸ਼ਿਸ਼ ਕਰੋ</string>
|
||||
<string name="error_prepare">ਟਨਲ ਤਿਆਰ ਕਰਨ ਦੌਰਾਨ ਗਲਤੀ: %s</string>
|
||||
<string name="error_up">ਟਨਲ ਚਾਲੂ ਕਰਨ ਦੌਰਾਨ ਗ਼ਲਤੀ: %s</string>
|
||||
<string name="exclude_private_ips">ਪ੍ਰਾਈਵੇਟ IP ਅਲਹਿਦਾ ਰੱਖੋ</string>
|
||||
<string name="generate_new_private_key">ਨਵੀਂ ਪ੍ਰਾਈਵੇਟ ਕੁੰਜੀ ਬਣਾਓ</string>
|
||||
@@ -132,6 +139,8 @@
|
||||
<string name="key_length_explanation_base64">: WireGuard base64 ਕੁੰਜੀਆਂ ਵਿੱਚ 44 ਅੱਖਰ ਹੋਣੇ ਚਾਹੀਦੇ ਹਨ (32 ਬਾਈਟ)</string>
|
||||
<string name="key_length_explanation_binary">: WireGuard ਕੁੰਜੀਆਂ 32 ਬਾਈਟ ਹੋਣੀਆਂ ਚਾਹੀਦੀਆਂ ਹਨ</string>
|
||||
<string name="key_length_explanation_hex">: WireGuard ਹੈਕਸਾ ਕੁੰਜੀਆਂ ਵਿੱਚ 64 ਅੱਖਰ ਹੋਣੇ ਚਾਹੀਦੇ ਹਨ (32 ਬਾਈਟ)</string>
|
||||
<string name="latest_handshake">ਆਖਰੀ ਹੈਂਡ-ਸ਼ੇਕ</string>
|
||||
<string name="latest_handshake_ago">%s ਪਹਿਲਾਂ</string>
|
||||
<string name="listen_port">ਸੁਣਨ ਵਾਲੀ ਪੋਰਟ</string>
|
||||
<string name="log_export_error">ਲਾਗ ਐਕਸਪੋਰਟ ਕਰਨ ਲਈ ਅਸਮਰੱਥ: %s</string>
|
||||
<string name="log_export_subject">ਵਾਇਰਗਾਰਡ ਐਂਡਰਾਈਡ ਲਾਗ ਫ਼ਾਇਲ</string>
|
||||
@@ -175,6 +184,10 @@
|
||||
<string name="private_key">ਪ੍ਰਾਈਵੇਟ ਕੁੰਜੀ</string>
|
||||
<string name="public_key">ਪਬਲਿਕ ਕੁੰਜੀ</string>
|
||||
<string name="qr_code_hint">ਟੋਟਕਾ: `qrencode -t ansiutf8 < tunnel.conf` ਨਾਲ ਤਿਆਰ ਕਰੋ।</string>
|
||||
<string name="quick_settings_tile_add_title">ਫ਼ੌਰੀ ਸੈਟਿੰਗਾਂ ਪੈਨਲ ਵਿੱਚ ਟਾਈਲ ਜੋੜੋ</string>
|
||||
<string name="quick_settings_tile_add_summary">ਸ਼ਾਰਟਕੱਟ ਟਾਈਲ ਸਭ ਤੋਂ ਸੱਜਰੀ ਟਨਲ ਨੂੰ ਬਦਲਦੀ ਹੈ</string>
|
||||
<string name="quick_settings_tile_add_failure">ਸ਼ਾਰਟਕ਼ਟ ਟਾਈਲ ਜੋੜਨ ਲਈ ਅਸਮਰੱਥ: ਗਲਤੀ %d</string>
|
||||
<string name="quick_settings_tile_action">ਟਨਲ ਨੂੰ ਬਦਲੋ</string>
|
||||
<string name="restore_on_boot_summary_off">ਬੂਟ ਕਰਨ ਸਮੇਂ ਸਮਰੱਥ ਕੀਤੀਆਂ ਟਨਲਾਂ ਨੂੰ ਚਾਲੂ ਨਹੀਂ ਕੀਤਾ ਜਾਵੇਗਾ</string>
|
||||
<string name="restore_on_boot_summary_on">ਬੂਟ ਕਰਨ ਸਮੇਂ ਸਮਰੱਥ ਕੀਤੀਆਂ ਟਨਲਾਂ ਨੂੰ ਚਾਲੂ ਕੀਤਾ ਜਾਵੇਗਾ</string>
|
||||
<string name="restore_on_boot_title">ਬੂਟ ਕਰਨ ਉੱਤੇ ਬਹਾਲ ਕਰੋ</string>
|
||||
@@ -210,13 +223,26 @@
|
||||
<string name="tunnel_create_success">“%s” ਟਨਲ ਕਾਮਯਾਬੀ ਨਾਲ ਬਣਾਈ</string>
|
||||
<string name="tunnel_error_already_exists">ਟਨਲ “%s” ਪਹਿਲਾਂ ਹੀ ਮੌਜੂਦ ਹੈ</string>
|
||||
<string name="tunnel_error_invalid_name">ਅਯੋਗ ਨਾਂ</string>
|
||||
<string name="tunnel_list_placeholder">ਹੇਠਾਂ ਦਿੱਤੇ ਬਟਨ ਨੂੰ ਵਰਤ ਕੇ ਟਨਲ ਜੋੜੋ</string>
|
||||
<string name="tunnel_name">ਟਨਲ ਦਾ ਨਾਂ</string>
|
||||
<string name="tunnel_on_error">ਟਨਲ ਚਾਲੂ ਕਰਨ ਲਈ ਅਸਮਰੱਥ (wgTurnOn ਨੇ %d ਵਾਪਸ ਕੀਤਾ)</string>
|
||||
<string name="tunnel_dns_failure">DNS ਹੋਸਟ-ਨਾਂ ਹੱਲ ਕਰਨ ਲਈ ਅਸਮਰੱਥ: “%s”</string>
|
||||
<string name="tunnel_rename_error">ਟਨਲ ਨਾਂ-ਬਦਲਣ ਲਈ ਅਸਮਰੱਥ: %s</string>
|
||||
<string name="tunnel_rename_success">ਟਨਲ ਦਾ ਨਾਂ \"%s\" ਵਜੋਂ ਕਾਮਯਾਬੀ ਨਾਲ ਬਦਲਿਆ ਗਿਆ</string>
|
||||
<string name="type_name_go_userspace">ਵਰਤੋਂ-ਸਪੇਸ ਤੇ ਜਾਓ</string>
|
||||
<string name="type_name_kernel_module">ਕਰਨਲ ਮੋਡੀਊਲ</string>
|
||||
<string name="unknown_error">ਅਣਪਛਾਤੀ ਗਲਤੀ</string>
|
||||
<string name="updater_avalable">ਐਪਲੀਕੇਸ਼ਨ ਅੱਪਡੇਟ ਮੌਜੂਦ ਹੈ। ਹੁਣੇ ਅੱਪਡੇਟ ਕਰੋ।</string>
|
||||
<string name="updater_action">ਡਾਊਨਲੋਡ ਤੇ ਅੱਪਡੇਟ ਕਰੋ</string>
|
||||
<string name="updater_rechecking">ਅੱਪਡੇਟ ਮੇਟਾਡਾਟਾ ਲਿਆ ਜਾ ਰਿਹਾ ਹੈ…</string>
|
||||
<string name="updater_download_progress">ਅੱਪਡੇਟ ਡਾਊਨਲੋਡ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ: %1$s / %2$s (%3$.2f%%)</string>
|
||||
<string name="updater_download_progress_nototal">ਅਪਡੇਟ ਡਾਊਨਲੋਡ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ: %s</string>
|
||||
<string name="updater_installing">ਅੱਪਡੇਟ ਇੰਸਟਾਲ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ…</string>
|
||||
<string name="updater_failure">ਅੱਪਡੇਟ ਅਸਫ਼ਲ: %s। ਕੁਝ ਕੁ ਪਲਾਂ ਵਿੱਚ ਫੇਰ ਕੋਸ਼ਿਸ਼ ਕਰਾਂਗੇ…</string>
|
||||
<string name="updater_corrupt_title">ਐਪਲੀਕੇਸ਼ਨ ਖ਼ਰਾਬ ਹੈ</string>
|
||||
<string name="updater_corrupt_message">ਇਹ ਐਪਲੀਕੇਸ਼ਨ ਖ਼ਰਾਬ ਹੋ ਗਈ ਹੈ। ਹੇਠ ਦਿੱਤੇ ਵੈੱਬਸਾਈਟ ਦੇ ਲਿੰਕ ਤੋਂ APK ਨੂੰ ਫੇਰ ਡਾਊਨਲੋਡ ਕਰੋ। ਇਸ ਐਪਲੀਕੇਸ਼ਨ ਨੂੰ ਅਣ-ਇੰਸਟਾਲ ਕਰਨ ਅਤੇ ਫੇਰ ਡਾਊਨਲੋਡ ਕੀਤੀ APK ਤੋਂ ਮੁੜ-ਇੰਸਟਾਲ ਕਰੋ।</string>
|
||||
<string name="updater_corrupt_navigate">ਵੈੱਬਸਾਈਟ ਖੋਲ੍ਹੋ</string>
|
||||
<string name="version_summary">%1$s ਬੈਕਐਂਡ %2$s</string>
|
||||
<string name="version_summary_checking">%s ਬੈਕਐਂਡ ਵਰਜ਼ਨ ਦੀ ਜਾਂਚ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ</string>
|
||||
<string name="version_summary_unknown">ਅਣਪਛਾਤਾ %s ਵਰਜਨ</string>
|
||||
<string name="version_title">Android ਲਈ WireGuard v%s</string>
|
||||
|
||||
@@ -82,7 +82,7 @@
|
||||
<item quantity="other">sekundy</item>
|
||||
</plurals>
|
||||
<string name="use_all_applications">Użyj wszystkich</string>
|
||||
<string name="add_peer">Dodaj klienta</string>
|
||||
<string name="add_peer">Dodaj peera</string>
|
||||
<string name="addresses">Adresy</string>
|
||||
<string name="applications">Aplikacje</string>
|
||||
<string name="allow_remote_control_intents_summary_off">Zewnętrzne aplikacje nie mogą przełączać tuneli (zalecane)</string>
|
||||
@@ -133,6 +133,9 @@
|
||||
<string name="tv_select_a_storage_drive">Wybierz dysk pamięci</string>
|
||||
<string name="tv_no_file_picker">Zainstaluj narzędzie do zarządzania plikami, aby przeglądać pliki</string>
|
||||
<string name="tv_add_tunnel_get_started">Dodaj tunel, aby rozpocząć</string>
|
||||
<string name="donate_title">♥ Wpłać na rzecz projektu WireGuard</string>
|
||||
<string name="donate_summary">Każdy wkład pomaga</string>
|
||||
<string name="donate_google_play_disappointment">Dziękujemy za wsparcie projektu WireGuard!\n\nNiestety, ze względu na zasady Google, nie możemy umieszczać linków do części strony projektu, w której możesz przekazać darowiznę. Mamy nadzieję, że uda Ci się to rozgryźć!\n\nJeszcze raz dziękujemy za Twój wkład.</string>
|
||||
<string name="disable_config_export_title">Wyłącz eksportowanie konfiguracji</string>
|
||||
<string name="disable_config_export_description">Wyłączenie eksportowania konfiguracji sprawi, że klucze prywatne będą mniej dostępne</string>
|
||||
<string name="dns_servers">Serwery DNS</string>
|
||||
@@ -141,7 +144,8 @@
|
||||
<string name="endpoint">Punkt końcowy</string>
|
||||
<string name="error_down">Błąd podczas zamykania tunelu: %s</string>
|
||||
<string name="error_fetching_apps">Błąd podczas pobierania listy aplikacji: %s</string>
|
||||
<string name="error_root">Proszę uzyskać dostęp do root-a i spróbować ponownie</string>
|
||||
<string name="error_root">Uzyskaj dostęp do roota i spróbuj ponownie</string>
|
||||
<string name="error_prepare">Błąd podczas przygotowywania tunelu: %s</string>
|
||||
<string name="error_up">Błąd podczas otwierania tunelu: %s</string>
|
||||
<string name="exclude_private_ips">Wyklucz prywatne adresy IP</string>
|
||||
<string name="generate_new_private_key">Wygeneruj nowy klucz prywatny</string>
|
||||
@@ -158,9 +162,11 @@
|
||||
<string name="interface_title">Interfejs</string>
|
||||
<string name="key_contents_error">Nieprawidłowe znaki w kluczu</string>
|
||||
<string name="key_length_error">Nieprawidłowa długość klucza</string>
|
||||
<string name="key_length_explanation_base64">: Klucze Base64 WireGuard-a muszą mieć długość 44 znaków (32 bajty)</string>
|
||||
<string name="key_length_explanation_binary">: Klucze WireGuard-a muszą mieć wielkość 32 bajtów</string>
|
||||
<string name="key_length_explanation_hex">: Klucze Hex WireGuard-a muszą mieć długość 64 znaków (32 bajty)</string>
|
||||
<string name="key_length_explanation_base64">: Klucze base64 WireGuard muszą mieć długość 44 znaków (32 bajty)</string>
|
||||
<string name="key_length_explanation_binary">: Klucze WireGuard muszą mieć wielkość 32 bajtów</string>
|
||||
<string name="key_length_explanation_hex">: Klucze hex WireGuard muszą mieć długość 64 znaków (32 bajty)</string>
|
||||
<string name="latest_handshake">Ostatnie uzgadnianie</string>
|
||||
<string name="latest_handshake_ago">%s temu</string>
|
||||
<string name="listen_port">Port nasłuchu</string>
|
||||
<string name="log_export_error">Nie można wyeksportować logu: %s</string>
|
||||
<string name="log_export_subject">Plik logu programu WireGuard dla systemu Android</string>
|
||||
@@ -195,7 +201,7 @@
|
||||
<string name="parse_error_inet_network">Sieć IP</string>
|
||||
<string name="parse_error_integer">liczba</string>
|
||||
<string name="parse_error_reason">Nie można przetworzyć %1$s „%2$s”</string>
|
||||
<string name="peer">Klient</string>
|
||||
<string name="peer">Peer</string>
|
||||
<string name="permission_description">kontrolowanie tuneli WireGuard, włączanie i wyłączanie tuneli, potencjalnie błędne kierowanie ruchem internetowym</string>
|
||||
<string name="permission_label">sterowanie tunelami WireGuard</string>
|
||||
<string name="persistent_keepalive">Utrzymanie połączenia</string>
|
||||
@@ -204,6 +210,10 @@
|
||||
<string name="private_key">Klucz prywatny</string>
|
||||
<string name="public_key">Klucz publiczny</string>
|
||||
<string name="qr_code_hint">Wskazówka: wygeneruj za pomocą `qrencode -t ansiutf8 < tunnel.conf`.</string>
|
||||
<string name="quick_settings_tile_add_title">Dodaj kafelek do panelu szybkich ustawień</string>
|
||||
<string name="quick_settings_tile_add_summary">Kafelek skrótu przełącza najnowszy tunel</string>
|
||||
<string name="quick_settings_tile_add_failure">Nie można dodać kafelka skrótu: błąd %d</string>
|
||||
<string name="quick_settings_tile_action">Przełącz tunel</string>
|
||||
<string name="restore_on_boot_summary_off">Włączone tunele nie zostaną przywrócone podczas uruchamiania</string>
|
||||
<string name="restore_on_boot_summary_on">Włączone tunele zostaną przywrócone podczas uruchamiania</string>
|
||||
<string name="restore_on_boot_title">Przywróć podczas uruchamiania</string>
|
||||
@@ -217,7 +227,7 @@
|
||||
<string name="toggle_all">Przełącz wszystkie</string>
|
||||
<string name="toggle_error">Błąd podczas przełączania tunelu WireGuard: %s</string>
|
||||
<string name="tools_installer_already">Narzędzia wg i wg-quick są już zainstalowane</string>
|
||||
<string name="tools_installer_failure">Nie można zainstalować narzędzi wiersza poleceń (brak root-a?)</string>
|
||||
<string name="tools_installer_failure">Nie można zainstalować narzędzi wiersza poleceń (brak roota?)</string>
|
||||
<string name="tools_installer_initial">Zainstaluj opcjonalne narzędzia do tworzenia skryptów</string>
|
||||
<string name="tools_installer_initial_magisk">Zainstaluj opcjonalne narzędzia do tworzenia skryptów jako moduł Magisk</string>
|
||||
<string name="tools_installer_initial_system">Zainstaluj opcjonalne narzędzia do tworzenia skryptów na partycji systemowej</string>
|
||||
@@ -239,6 +249,7 @@
|
||||
<string name="tunnel_create_success">Pomyślnie utworzono tunel „%s”</string>
|
||||
<string name="tunnel_error_already_exists">Tunel \"%s\" już istnieje</string>
|
||||
<string name="tunnel_error_invalid_name">Nieprawidłowa nazwa</string>
|
||||
<string name="tunnel_list_placeholder">Dodaj tunel za pomocą przycisku poniżej</string>
|
||||
<string name="tunnel_name">Nazwa tunelu</string>
|
||||
<string name="tunnel_on_error">Nie można włączyć tunelu (wgTurnOn zwróciło %d)</string>
|
||||
<string name="tunnel_dns_failure">Nie można odnaleźć nazwy hosta DNS: “%s”</string>
|
||||
@@ -247,6 +258,16 @@
|
||||
<string name="type_name_go_userspace">Przestrzeń użytkownika Go</string>
|
||||
<string name="type_name_kernel_module">Moduł jądra</string>
|
||||
<string name="unknown_error">Nieznany błąd</string>
|
||||
<string name="updater_avalable">Dostępna jest aktualizacja aplikacji. Zaktualizuj teraz.</string>
|
||||
<string name="updater_action">Pobierz i zaktualizuj</string>
|
||||
<string name="updater_rechecking">Pobieranie metadanych aktualizacji…</string>
|
||||
<string name="updater_download_progress">Pobieranie aktualizacji: %1$s / %2$s (%3$.2f%%)</string>
|
||||
<string name="updater_download_progress_nototal">Pobieranie aktualizacji: %s</string>
|
||||
<string name="updater_installing">Instalowanie aktualizacji…</string>
|
||||
<string name="updater_failure">Błąd aktualizacji: %s. Ponowienie próby za chwilę…</string>
|
||||
<string name="updater_corrupt_title">Aplikacja uszkodzona</string>
|
||||
<string name="updater_corrupt_message">Ta aplikacja jest uszkodzona. Pobierz ponownie plik APK z witryny, do której link znajduje się poniżej. Następnie odinstaluj tę aplikację i zainstaluj ją ponownie z pobranego pliku APK.</string>
|
||||
<string name="updater_corrupt_navigate">Otwórz witrynę</string>
|
||||
<string name="version_summary">%1$s backend %2$s</string>
|
||||
<string name="version_summary_checking">Sprawdzanie wersji implementacji: %s</string>
|
||||
<string name="version_summary_unknown">Nieznana wersja %s</string>
|
||||
|
||||
@@ -24,12 +24,40 @@
|
||||
<item quantity="one">Aplicação %d Excluída</item>
|
||||
<item quantity="other">Aplicações %d Excluídas</item>
|
||||
</plurals>
|
||||
<plurals name="set_included_applications">
|
||||
<item quantity="one">%d Aplicação Incluída</item>
|
||||
<item quantity="other">%d Aplicações Incluídas</item>
|
||||
</plurals>
|
||||
<plurals name="n_excluded_applications">
|
||||
<item quantity="one">%d retirada</item>
|
||||
<item quantity="other">%d retiradas</item>
|
||||
</plurals>
|
||||
<plurals name="n_included_applications">
|
||||
<item quantity="one">%d incluída</item>
|
||||
<item quantity="other">%d incluídas</item>
|
||||
</plurals>
|
||||
<string name="all_applications">Todos as aplicativos</string>
|
||||
<string name="exclude_from_tunnel">Retirar</string>
|
||||
<string name="include_in_tunnel">Incluir somente</string>
|
||||
<plurals name="include_n_applications">
|
||||
<item quantity="one">Incluir %d app</item>
|
||||
<item quantity="other">Incluir %d aplicações</item>
|
||||
</plurals>
|
||||
<plurals name="exclude_n_applications">
|
||||
<item quantity="one">Retirar %d app</item>
|
||||
<item quantity="other">Retirar %d apps</item>
|
||||
</plurals>
|
||||
<plurals name="persistent_keepalive_seconds_unit">
|
||||
<item quantity="one">a cada segundo</item>
|
||||
<item quantity="other">a cada %d segundos</item>
|
||||
</plurals>
|
||||
<plurals name="persistent_keepalive_seconds_suffix">
|
||||
<item quantity="one">segundo</item>
|
||||
<item quantity="other">segundos</item>
|
||||
</plurals>
|
||||
<string name="use_all_applications">Usar todas aplicações</string>
|
||||
<string name="add_peer">Adicionar Par</string>
|
||||
<string name="addresses">Endereço:</string>
|
||||
<string name="addresses">Endereço</string>
|
||||
<string name="applications">Aplicativo</string>
|
||||
<string name="allow_remote_control_intents_summary_off">Aplicativos externos podem não alternar túneis (recomendado)</string>
|
||||
<string name="allow_remote_control_intents_summary_on">Aplicativos externos podem alternar túneis (avançado)</string>
|
||||
@@ -79,6 +107,9 @@
|
||||
<string name="tv_select_a_storage_drive">Selecione uma unidade de armazenamento</string>
|
||||
<string name="tv_no_file_picker">Por favor, instale um utilitário de gerenciamento de arquivos para procurar arquivos</string>
|
||||
<string name="tv_add_tunnel_get_started">Adicione um túnel para começar</string>
|
||||
<string name="donate_title">♥️ Doar para o projeto WireGuard</string>
|
||||
<string name="donate_summary">Todas as contribuições ajudam</string>
|
||||
<string name="donate_google_play_disappointment">Obrigado por apoiar o Projeto WireGuard!\n\nInfelizmente, devido às políticas do Google, não temos permissão para vincular a parte da página do projeto onde você pode fazer uma doação. Esperamos que você consiga descobrir isso!\n\nObrigado novamente pela sua contribuição.</string>
|
||||
<string name="disable_config_export_title">Desativar exportação de configuração</string>
|
||||
<string name="disable_config_export_description">Desativar a exportação de configuração torna as chaves privadas menos acessíveis</string>
|
||||
<string name="dns_servers">Servidores DNS</string>
|
||||
@@ -88,6 +119,7 @@
|
||||
<string name="error_down">Erro ao derrubar o túnel: %s</string>
|
||||
<string name="error_fetching_apps">Erro ao obter lista de apps: %s</string>
|
||||
<string name="error_root">Por favor, obtenha acesso root e tente novamente</string>
|
||||
<string name="error_prepare">Erro ao preparar o túnel: %s</string>
|
||||
<string name="error_up">Erro ao criar túnel: %s</string>
|
||||
<string name="exclude_private_ips">Excluir IPs privados</string>
|
||||
<string name="generate_new_private_key">Gerar uma nova chave privada</string>
|
||||
@@ -107,6 +139,8 @@
|
||||
<string name="key_length_explanation_base64">: Chaves base64 do WireGuard devem ter 44 caracteres (32 bytes)</string>
|
||||
<string name="key_length_explanation_binary">: Chaves do WireGuard devem ter 32 bytes</string>
|
||||
<string name="key_length_explanation_hex">: Chaves hex do WireGuard devem ter 64 caracteres (32 bytes)</string>
|
||||
<string name="latest_handshake">Último handshake</string>
|
||||
<string name="latest_handshake_ago">%s atrás</string>
|
||||
<string name="listen_port">Porta de escuta</string>
|
||||
<string name="log_export_error">Não foi possível exportar o log: %s</string>
|
||||
<string name="log_export_subject">Arquivo de log do WireGuard Android</string>
|
||||
@@ -139,7 +173,9 @@
|
||||
<string name="parse_error_inet_address">Endereço IP</string>
|
||||
<string name="parse_error_inet_endpoint">endpoint</string>
|
||||
<string name="parse_error_inet_network">Rede IP</string>
|
||||
<string name="parse_error_integer">número</string>
|
||||
<string name="parse_error_reason">Não é possível analisar %1$s “%2$s”</string>
|
||||
<string name="peer">Par</string>
|
||||
<string name="permission_description">permite controlar túneis do WireGuard, ativando e desativando túneis a vontade, potencialmente desviando o tráfego na Internet</string>
|
||||
<string name="permission_label">controlar túneis do WireGuard</string>
|
||||
<string name="persistent_keepalive">Keepalive persistente</string>
|
||||
@@ -148,6 +184,12 @@
|
||||
<string name="private_key">Chave Privada</string>
|
||||
<string name="public_key">Chave pública</string>
|
||||
<string name="qr_code_hint">Dica: gerar com `qrencode -t ansiutf8 < tunnel.conf`.</string>
|
||||
<string name="quick_settings_tile_add_title">Adicionar botão ao painel de configurações rápidas</string>
|
||||
<string name="quick_settings_tile_add_summary">A tecla de atalho alterna o túnel mais recente</string>
|
||||
<string name="quick_settings_tile_add_failure">Não foi possível adicionar o atalho de botão: erro %d</string>
|
||||
<string name="quick_settings_tile_action">Ativar/Desativar túnel</string>
|
||||
<string name="restore_on_boot_summary_off">Não irá criar túneis habilitados na inicialização</string>
|
||||
<string name="restore_on_boot_summary_on">Irá criar túneis habilitados na inicialização</string>
|
||||
<string name="restore_on_boot_title">Restaurar na inicialização</string>
|
||||
<string name="save">Salvar</string>
|
||||
<string name="select_all">Selecionar tudo</string>
|
||||
@@ -156,16 +198,19 @@
|
||||
<string name="shell_marker_count_error">Shell esperava 4 marcadores, mas recebeu apenas %d</string>
|
||||
<string name="shell_start_error">Shell falhou ao iniciar: %d</string>
|
||||
<string name="success_application_will_restart">Sucesso. O aplicativo irá reiniciar agora…</string>
|
||||
<string name="toggle_all">Alternar Todos</string>
|
||||
<string name="toggle_error">Erro ao ativar o túnel do WireGuard: %s</string>
|
||||
<string name="tools_installer_already">wg e wg-quick já estão instalados</string>
|
||||
<string name="tools_installer_failure">Não foi possível instalar ferramentas de linha de comando (sem root?)</string>
|
||||
<string name="tools_installer_initial">Instalar ferramentas opcionais para scripting</string>
|
||||
<string name="tools_installer_initial_magisk">Instalar ferramentas opcionais para scripting como o módulo Magisk</string>
|
||||
<string name="tools_installer_initial_system">Instalar ferramentas opcionais para escrever na partição do sistema</string>
|
||||
<string name="tools_installer_success_magisk">wg e wg-quick instalado como um módulo Magisk (é necessário reiniciar)</string>
|
||||
<string name="tools_installer_success_system">wg e wg-quick instalados na partição do sistema</string>
|
||||
<string name="tools_installer_title">Instalar ferramentas de linha de comando</string>
|
||||
<string name="tools_installer_working">Instalando wg e wg-quick</string>
|
||||
<string name="tools_unavailable_error">Ferramentas necessárias indisponíveis</string>
|
||||
<string name="transfer">Transferir</string>
|
||||
<string name="transfer_bytes">%d B</string>
|
||||
<string name="transfer_gibibytes">%.2f GiB</string>
|
||||
<string name="transfer_kibibytes">%.2f KiB</string>
|
||||
@@ -178,8 +223,29 @@
|
||||
<string name="tunnel_create_success">Túnel criado com sucesso “%s”</string>
|
||||
<string name="tunnel_error_already_exists">Túnel “%s” já existe</string>
|
||||
<string name="tunnel_error_invalid_name">Nome inválido</string>
|
||||
<string name="tunnel_list_placeholder">Adicionar um túnel usando o botão abaixo</string>
|
||||
<string name="tunnel_name">Nome do túnel</string>
|
||||
<string name="tunnel_on_error">Não foi possível ativar o túnel (wgTurnOn retornou %d)</string>
|
||||
<string name="tunnel_dns_failure">Não foi possível resolver host DNS: \"%s\"</string>
|
||||
<string name="tunnel_rename_error">Não foi possível renomear o túnel: %s</string>
|
||||
<string name="tunnel_rename_success">Renomeado com sucesso o túnel para “%s”</string>
|
||||
<string name="type_name_go_userspace">Espaço do usuário Go</string>
|
||||
<string name="type_name_kernel_module">Modo de Kernel</string>
|
||||
<string name="unknown_error">Erro desconhecido</string>
|
||||
<string name="updater_avalable">Uma atualização do aplicativo está disponível. Pôr favor atualize agora.</string>
|
||||
<string name="updater_action">Baixar & Atualizar</string>
|
||||
<string name="updater_rechecking">Obtendo metadados de atualização…</string>
|
||||
<string name="updater_download_progress">Baixando a atualização: %1$s / %2$s (%3$.2f%%)</string>
|
||||
<string name="updater_download_progress_nototal">Baixando atualização: %s</string>
|
||||
<string name="updater_installing">Instalando atualização…</string>
|
||||
<string name="updater_failure">Falha na atualização: %s. Tentaremos novamente em breve…</string>
|
||||
<string name="updater_corrupt_title">Aplicativo corrompido</string>
|
||||
<string name="updater_corrupt_message">Este aplicativo está corrompido. Por favor, baixe novamente o APK do site vinculado abaixo. Depois disso, desinstale o aplicativo e reinstale-o a partir do APK baixado.</string>
|
||||
<string name="updater_corrupt_navigate">Abrir site</string>
|
||||
<string name="version_summary">Backend do %1$s %2$s</string>
|
||||
<string name="version_summary_checking">Verificando a versão do backend %s</string>
|
||||
<string name="version_summary_unknown">Versão %s desconhecida</string>
|
||||
<string name="version_title">WireGuard para Android v%s</string>
|
||||
<string name="vpn_not_authorized_error">Serviço de VPN não autorizado pelo usuário</string>
|
||||
<string name="vpn_start_error">Não foi possível iniciar o serviço de VPN do Android</string>
|
||||
<string name="zip_export_error">Não foi possível exportar túneis: %s</string>
|
||||
|
||||
@@ -79,6 +79,7 @@
|
||||
<string name="bad_config_reason_unknown_section">Secção desconhecida</string>
|
||||
<string name="bad_config_reason_value_out_of_range">Valor fora do intervalo</string>
|
||||
<string name="bad_extension_error">O ficheiro tem que ser do tipo .conf ou .zip</string>
|
||||
<string name="error_no_qr_found">Código QR não encontrado na imagem</string>
|
||||
<string name="cancel">Cancelar</string>
|
||||
<string name="config_delete_error">Não é possível apagar arquivo de configuração %s</string>
|
||||
<string name="config_exists_error">A configuração para \"%s\" já existe</string>
|
||||
|
||||
@@ -120,6 +120,9 @@
|
||||
<string name="tv_select_a_storage_drive">Selectează o unitate de stocare</string>
|
||||
<string name="tv_no_file_picker">Instalează un serviciu de administrare a fișierelor pentru a căuta fișiere</string>
|
||||
<string name="tv_add_tunnel_get_started">Adaugă un tunel pentru a începe</string>
|
||||
<string name="donate_title">♥ Donează pentru proiectul WireGuard</string>
|
||||
<string name="donate_summary">Fiecare contribuţie ajută</string>
|
||||
<string name="donate_google_play_disappointment">Vă mulțumim pentru sprijinul acordat Proiectului WireGuard!\n\nDin păcate, din cauza politicilor Google, nu avem voie să punem un link către pagina web a proiectului unde poți face o donație. Sperăm că vă puteți descurca!\n\nMulțumim din nou pentru contribuție.</string>
|
||||
<string name="disable_config_export_title">Dezactivează exportarea configurației</string>
|
||||
<string name="disable_config_export_description">Dezactivarea exportării configurației face mai puțin accesibile cheile private</string>
|
||||
<string name="dns_servers">Servere DNS</string>
|
||||
@@ -129,6 +132,7 @@
|
||||
<string name="error_down">Eroare la oprirea tunelului: %s</string>
|
||||
<string name="error_fetching_apps">Eroare la preluarea listei de aplicații: %s</string>
|
||||
<string name="error_root">Obține acces root și încearcă din nou</string>
|
||||
<string name="error_prepare">Eroare la pregătirea tunelului: %s</string>
|
||||
<string name="error_up">Eroare la pornirea tunelului: %s</string>
|
||||
<string name="exclude_private_ips">Excludere IP-uri private</string>
|
||||
<string name="generate_new_private_key">Generare cheie privată nouă</string>
|
||||
@@ -148,6 +152,8 @@
|
||||
<string name="key_length_explanation_base64">: Cheile base64 ale WireGuard trebuie să aibă 44 de caractere (32 de octeți)</string>
|
||||
<string name="key_length_explanation_binary">: Cheile WireGuard trebuie să aibă 32 de octeți</string>
|
||||
<string name="key_length_explanation_hex">: Cheile hex WireGuard trebuie să aibă 64 de caractere (32 de octeți)</string>
|
||||
<string name="latest_handshake">Cea mai recentă negociere</string>
|
||||
<string name="latest_handshake_ago">%s în urmă</string>
|
||||
<string name="listen_port">Port de ascultare</string>
|
||||
<string name="log_export_error">Jurnalul nu poate fi exportat: %s</string>
|
||||
<string name="log_export_subject">Fișier de jurnal Android WireGuard</string>
|
||||
@@ -191,6 +197,8 @@
|
||||
<string name="private_key">Cheie privată</string>
|
||||
<string name="public_key">Cheie publică</string>
|
||||
<string name="qr_code_hint">Sfat: generează cu `qrencode -t ansiutf8 < tunnel.conf`.</string>
|
||||
<string name="quick_settings_tile_add_title">Adaugă secțiune la panoul de setări rapide</string>
|
||||
<string name="quick_settings_tile_add_summary">Comanda rapidă comută cel mai recent tunel</string>
|
||||
<string name="restore_on_boot_summary_off">Tunelurile activate nu vor fi pornite odată cu pornirea dispozitivului</string>
|
||||
<string name="restore_on_boot_summary_on">Tunelurile activate vor fi pornite odată cu pornirea dispozitivului</string>
|
||||
<string name="restore_on_boot_title">Restaurare la pornire</string>
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
</plurals>
|
||||
<plurals name="delete_success">
|
||||
<item quantity="one">Успешно удален %d туннель</item>
|
||||
<item quantity="few">Успешно удалено %d туннеля</item>
|
||||
<item quantity="few">Успешно удалены %d туннеля</item>
|
||||
<item quantity="many">Успешно удалено %d туннелей</item>
|
||||
<item quantity="other">Успешно удалено %d туннелей</item>
|
||||
</plurals>
|
||||
@@ -70,7 +70,7 @@
|
||||
<item quantity="other">Исключить %d приложений</item>
|
||||
</plurals>
|
||||
<plurals name="persistent_keepalive_seconds_unit">
|
||||
<item quantity="one">каждую секунду</item>
|
||||
<item quantity="one">каждую %d секунду</item>
|
||||
<item quantity="few">каждые %d секунды</item>
|
||||
<item quantity="many">каждые %d секунд</item>
|
||||
<item quantity="other">каждые %d секунд</item>
|
||||
@@ -89,12 +89,12 @@
|
||||
<string name="allow_remote_control_intents_summary_on">Внешние приложения могут переключать туннели (продвинутые)</string>
|
||||
<string name="allow_remote_control_intents_title">Разрешить управление через внешние приложения</string>
|
||||
<string name="allowed_ips">Разрешенные IP-адреса</string>
|
||||
<string name="bad_config_context">%1$s из %2$s</string>
|
||||
<string name="bad_config_context">%2$s в %1$s</string>
|
||||
<string name="bad_config_context_top_level">%s</string>
|
||||
<string name="bad_config_error">%1$s в %2$s</string>
|
||||
<string name="bad_config_explanation_pka">: Значение должно быть больше нуля, но меньше 65535</string>
|
||||
<string name="bad_config_explanation_positive_number">: Значение должно быть больше нуля</string>
|
||||
<string name="bad_config_explanation_udp_port">: Должен быть действительный номер порта UDP</string>
|
||||
<string name="bad_config_explanation_udp_port">: Должен быть допустимым UDP-портом</string>
|
||||
<string name="bad_config_reason_invalid_key">Неправильный ключ</string>
|
||||
<string name="bad_config_reason_invalid_number">Неправильный номер</string>
|
||||
<string name="bad_config_reason_invalid_value">Недопустимое значение</string>
|
||||
@@ -142,7 +142,7 @@
|
||||
<string name="dns_search_domains">Домены поиска</string>
|
||||
<string name="edit">Изменить</string>
|
||||
<string name="endpoint">Конечная точка</string>
|
||||
<string name="error_down">Ошибка при выходе из туннеля: %s</string>
|
||||
<string name="error_down">Ошибка при отключении туннеля: %s</string>
|
||||
<string name="error_fetching_apps">Ошибка при получении списка приложений: %s</string>
|
||||
<string name="error_root">Пожалуйста, получите root-доступ и попробуйте снова</string>
|
||||
<string name="error_prepare">Ошибка при подготовке туннеля: %s</string>
|
||||
@@ -202,7 +202,7 @@
|
||||
<string name="parse_error_integer">число</string>
|
||||
<string name="parse_error_reason">Невозможно разобрать %1$s “%2$s”</string>
|
||||
<string name="peer">Пир</string>
|
||||
<string name="permission_description">управлять туннелями WireGuard, включая и отключая туннели по желанию, потенциально перенаправляя интернет-трафик</string>
|
||||
<string name="permission_description">контроль над туннелями WireGuard, включение и отключение туннелей по своему усмотрению, возможность неправильного управления сетевым трафиком</string>
|
||||
<string name="permission_label">управлять туннелями WireGuard</string>
|
||||
<string name="persistent_keepalive">Постоянное соединение</string>
|
||||
<string name="pre_shared_key">Общий ключ</string>
|
||||
@@ -210,6 +210,10 @@
|
||||
<string name="private_key">Приватный ключ</string>
|
||||
<string name="public_key">Публичный ключ</string>
|
||||
<string name="qr_code_hint">Совет: генерировать с “qrencode -t ansiutf8 < tunnel.conf”.</string>
|
||||
<string name="quick_settings_tile_add_title">Добавить элемент в панель быстрых настроек</string>
|
||||
<string name="quick_settings_tile_add_summary">Элемент переключает последний активный туннель</string>
|
||||
<string name="quick_settings_tile_add_failure">Не удается добавить ярлык: ошибка %d</string>
|
||||
<string name="quick_settings_tile_action">Переключить туннель</string>
|
||||
<string name="restore_on_boot_summary_off">Не поднимать ранее выбранные туннели при загрузке</string>
|
||||
<string name="restore_on_boot_summary_on">Поднимать ранее выбранные туннели при загрузке</string>
|
||||
<string name="restore_on_boot_title">Восстановить при загрузке</string>
|
||||
@@ -251,10 +255,20 @@
|
||||
<string name="tunnel_dns_failure">Не удалось определить DNS имя: “%s”</string>
|
||||
<string name="tunnel_rename_error">Не удалось переименовать туннель: %s</string>
|
||||
<string name="tunnel_rename_success">Туннель успешно переименован в “%s”</string>
|
||||
<string name="type_name_go_userspace">Пользовательское пространство Go</string>
|
||||
<string name="type_name_go_userspace">Go в пользовательском пространстве</string>
|
||||
<string name="type_name_kernel_module">Модуль ядра</string>
|
||||
<string name="unknown_error">Неизвестная ошибка</string>
|
||||
<string name="version_summary">%1$s бэкенд %2$s</string>
|
||||
<string name="updater_avalable">Доступно обновление приложения. Пожалуйста, обновите.</string>
|
||||
<string name="updater_action">Загрузить и установить</string>
|
||||
<string name="updater_rechecking">Получение метаданных обновления…</string>
|
||||
<string name="updater_download_progress">Загрузка обновления: %1$s / %2$s (%3$.2f%%)</string>
|
||||
<string name="updater_download_progress_nototal">Загрузка обновления: %s</string>
|
||||
<string name="updater_installing">Установка обновления…</string>
|
||||
<string name="updater_failure">Ошибка обновления: %s. Повторите попытку…</string>
|
||||
<string name="updater_corrupt_title">Приложение повреждено</string>
|
||||
<string name="updater_corrupt_message">Приложение повреждено. Загрузите APK с сайта, указанного ниже, затем удалите это приложение и установите из загруженного APK.</string>
|
||||
<string name="updater_corrupt_navigate">Открыть сайт</string>
|
||||
<string name="version_summary">Бэкенд: %1$s %2$s</string>
|
||||
<string name="version_summary_checking">Проверка версии бэкэнда %s</string>
|
||||
<string name="version_summary_unknown">Неизвестная версия %s</string>
|
||||
<string name="version_title">WireGuard для Android v%s</string>
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
<string name="addresses">Adresy</string>
|
||||
<string name="applications">Aplikácie</string>
|
||||
<string name="allow_remote_control_intents_summary_off">Externé aplikácie nemôžu spustiť tunely (odporúčané)</string>
|
||||
<string name="allow_remote_control_intents_summary_on">Externé aplikácie môžu spustiť tunely (odporúčané)</string>
|
||||
<string name="allow_remote_control_intents_summary_on">Externé aplikácie môžu spustiť tunely (pokročilé)</string>
|
||||
<string name="allow_remote_control_intents_title">Povoliť aplikáciám vzdialenú správu</string>
|
||||
<string name="allowed_ips">Povolené IP adresy</string>
|
||||
<string name="bad_config_context_top_level">%s</string>
|
||||
@@ -20,8 +20,8 @@
|
||||
<string name="bad_config_reason_invalid_number">Neplatné číslo</string>
|
||||
<string name="bad_config_reason_invalid_value">Neplatná hodnota</string>
|
||||
<string name="bad_config_reason_missing_attribute">Chýbajúci atribút</string>
|
||||
<string name="bad_config_reason_missing_section">Chýbajúc sekcia</string>
|
||||
<string name="bad_config_reason_syntax_error">Chyba syntaxu</string>
|
||||
<string name="bad_config_reason_missing_section">Chýbajúca sekcia</string>
|
||||
<string name="bad_config_reason_syntax_error">Chyba syntaxe</string>
|
||||
<string name="bad_config_reason_unknown_attribute">Neznámy atribút</string>
|
||||
<string name="bad_config_reason_unknown_section">Neznáma sekcia</string>
|
||||
<string name="bad_config_reason_value_out_of_range">Hodnota mimo povoleného rozsahu</string>
|
||||
@@ -31,12 +31,12 @@
|
||||
<string name="config_exists_error">Konfigurácia pre “%s” už existuje</string>
|
||||
<string name="config_file_exists_error">Konfiguračný súbor pre “%s” už existuje</string>
|
||||
<string name="config_not_found_error">Konfiguračný súbor “%s” sa nenašiel</string>
|
||||
<string name="config_rename_error">Nemôžete premenovať konfiguračný súbor “%s”</string>
|
||||
<string name="config_save_error">Nemôžete uložiť konfiguráciu pre “%1$s”: %2$s</string>
|
||||
<string name="config_rename_error">Nepodarilo sa premenovať konfiguračný súbor “%s”</string>
|
||||
<string name="config_save_error">Nepodarilo sa uložiť konfiguráciu pre “%1$s”: %2$s</string>
|
||||
<string name="config_save_success">Úspešne sa podarilo uložiť konfiguráciu pre “%s”</string>
|
||||
<string name="create_activity_title">Vytvoriť WireGuard tunel</string>
|
||||
<string name="create_bin_dir_error">Nemôžete vytvoriť lokálny binárny súbor</string>
|
||||
<string name="create_downloads_file_error">Nemôžete vytvoriť súbor v priečinku downloads</string>
|
||||
<string name="create_bin_dir_error">Nepodarilo sa vytvoriť lokálny priečinok pre binárne súbory</string>
|
||||
<string name="create_downloads_file_error">Nepodarilo sa vytvoriť súbor v priečinku stiahnuté</string>
|
||||
<string name="create_empty">Vytvoriť od počiatku</string>
|
||||
<string name="create_from_file">Importovať zo súboru alebo archívu</string>
|
||||
<string name="create_from_qr_code">Skenovať z QR kódu</string>
|
||||
@@ -50,10 +50,10 @@
|
||||
<string name="delete">Odstrániť</string>
|
||||
<string name="tv_delete">Vyberte tunel na odstránenie</string>
|
||||
<string name="tv_select_a_storage_drive">Vyberte úložnú jednotku</string>
|
||||
<string name="tv_no_file_picker">Prosím nainštalujte manažéra súbor aby ste mohli prehliadať súbory</string>
|
||||
<string name="tv_no_file_picker">Prosím nainštalujte manažéra súborov aby ste mohli prehliadať súbory</string>
|
||||
<string name="tv_add_tunnel_get_started">Pridajte tunel aby ste mohli začať</string>
|
||||
<string name="disable_config_export_title">Zakázať export konfigurácie</string>
|
||||
<string name="disable_config_export_description">Zakázanie exportu konfigurácii spôsobí, že prístup k súkromným kľúčom sa stáva zložitým</string>
|
||||
<string name="disable_config_export_description">Zakázanie exportu konfigurácie spôsobí, že prístup k súkromným kľúčom sa stáva zložitým</string>
|
||||
<string name="dns_servers">Servery DNS</string>
|
||||
<string name="dns_search_domains">Prehľadávať domény</string>
|
||||
<string name="edit">Upraviť</string>
|
||||
@@ -61,46 +61,46 @@
|
||||
<string name="error_down">Chyba pri vypínaní tunela: %s</string>
|
||||
<string name="error_fetching_apps">Chyba pri načítaní zoznamu aplikácií: %s</string>
|
||||
<string name="error_root">Získajte prístup root a skúste znova</string>
|
||||
<string name="error_up">Chyba pri vyvolávaní tunela: %s</string>
|
||||
<string name="exclude_private_ips">Vynechať privátne IP</string>
|
||||
<string name="generate_new_private_key">Generovať nový privátny kľúč</string>
|
||||
<string name="error_up">Chyba pri zapínaní tunela: %s</string>
|
||||
<string name="exclude_private_ips">Vynechať súkromné IP</string>
|
||||
<string name="generate_new_private_key">Generovať nový súkromný kľúč</string>
|
||||
<string name="generic_error">Neznáma “%s” chyba</string>
|
||||
<string name="hint_automatic">(automatické)</string>
|
||||
<string name="hint_generated">(generované)</string>
|
||||
<string name="hint_optional">(voliteľné)</string>
|
||||
<string name="hint_optional_discouraged">(voliteľné, neodporúča sa)</string>
|
||||
<string name="hint_random">(náhodné)</string>
|
||||
<string name="illegal_filename_error">Ilegálne meno súboru “%s”</string>
|
||||
<string name="illegal_filename_error">Nepovolené meno súboru “%s”</string>
|
||||
<string name="import_error">Nepodarilo sa importovať tunel: %s</string>
|
||||
<string name="import_from_qr_code">Importovať tunel z QR kódu</string>
|
||||
<string name="import_success">Podarilo sa importovať “%s”</string>
|
||||
<string name="interface_title">Rozhranie</string>
|
||||
<string name="key_contents_error">Nepovolené charaktery v kľúči</string>
|
||||
<string name="key_contents_error">Nepovolené znaky v kľúči</string>
|
||||
<string name="key_length_error">Nesprávna dĺžka kľúču</string>
|
||||
<string name="key_length_explanation_base64">: WireGuard base64 kľúče musia mať 44 charakterov (32 bytes)</string>
|
||||
<string name="key_length_explanation_base64">: WireGuard base64 kľúče musia mať 44 znakov (32 bytes)</string>
|
||||
<string name="key_length_explanation_binary">: WireGuard kľúče musia byť 32 bytové</string>
|
||||
<string name="key_length_explanation_hex">: WireGuard hex kľúče musia mať 64 charakterov (32 bytes)</string>
|
||||
<string name="key_length_explanation_hex">: WireGuard hex kľúče musia mať 64 znakov (32 bytes)</string>
|
||||
<string name="listen_port">Otvorený port</string>
|
||||
<string name="log_export_error">Nepodarilo sa exportovať log: %s</string>
|
||||
<string name="log_export_subject">WireGuard Android Záznam</string>
|
||||
<string name="log_export_subject">WireGuard Android Denník udalostí</string>
|
||||
<string name="log_export_success">Uložené do “%s”</string>
|
||||
<string name="log_export_title">Exportovať denník udalostí</string>
|
||||
<string name="log_saver_activity_label">Uložiť denník udalostí</string>
|
||||
<string name="log_viewer_pref_summary">Denník udalosti môžu byt nápomocné pri ladení aplikácie</string>
|
||||
<string name="log_viewer_pref_summary">Denníky udalostí môžu byt nápomocné pri ladení aplikácie</string>
|
||||
<string name="log_viewer_pref_title">Zobraziť denník udalostí aplikácie</string>
|
||||
<string name="log_viewer_title">Denník udalostí</string>
|
||||
<string name="logcat_error">Nepodarilo sa prehrať logcat: </string>
|
||||
<string name="module_enabler_enabled_summary">Pomalšie užívatelské prostredie môže zlepšiť stabilitu</string>
|
||||
<string name="logcat_error">Nepodarilo sa spustiť logcat: </string>
|
||||
<string name="module_enabler_enabled_summary">Pomalší userspace backend môže zlepšiť stabilitu</string>
|
||||
<string name="module_installer_error">Niečo sa pokazilo. Prosím, skúste znova</string>
|
||||
<string name="module_installer_not_found">Pre vaše zariadenie nie sú k dispozícii žiadne moduly</string>
|
||||
<string name="module_installer_title">Stiahni a nainštaluj kernel modul</string>
|
||||
<string name="module_installer_working">Sťahuje a inštalujem…</string>
|
||||
<string name="module_installer_title">Stiahnutie a inštalácia kernelového modulu</string>
|
||||
<string name="module_installer_working">Sťahuje sa a inštaluje sa…</string>
|
||||
<string name="mtu">Maximálna prenosová jednotka</string>
|
||||
<string name="multiple_tunnels_summary_off">Zapnutím jedného tunela vypnete ostatné</string>
|
||||
<string name="multiple_tunnels_summary_on">Môžu byť zapnuté viaceré tunele naraz</string>
|
||||
<string name="multiple_tunnels_title">Povoliť niekoľko tunel naraz</string>
|
||||
<string name="multiple_tunnels_summary_on">Môžu byť zapnuté viaceré tunely naraz</string>
|
||||
<string name="multiple_tunnels_title">Povoliť viacero tunelov naraz</string>
|
||||
<string name="name">Názov</string>
|
||||
<string name="no_config_error">Pokúšam sa vyvolať tunel bez konfigurácie</string>
|
||||
<string name="no_config_error">Pokúšam sa zapnúť tunel bez konfigurácie</string>
|
||||
<string name="no_configs_error">Nenašli sa žiadne konfigurácie</string>
|
||||
<string name="no_tunnels_error">Neexistujú žiadne tunely</string>
|
||||
<string name="parse_error_generic">reťazec</string>
|
||||
@@ -108,7 +108,7 @@
|
||||
<string name="parse_error_inet_endpoint">koncový bod</string>
|
||||
<string name="parse_error_inet_network">IP sieť</string>
|
||||
<string name="parse_error_integer">číslo</string>
|
||||
<string name="parse_error_reason">Nedá sa rozobrať %1$s “%2$s”</string>
|
||||
<string name="parse_error_reason">Nedá sa parsovať %1$s “%2$s”</string>
|
||||
<string name="pre_shared_key">Vopred zdieľaný kľúč</string>
|
||||
<string name="pre_shared_key_enabled">povolené</string>
|
||||
<string name="private_key">Súkromný kľúč</string>
|
||||
@@ -121,10 +121,10 @@
|
||||
<string name="toggle_all">Prepnúť všetko</string>
|
||||
<string name="tools_installer_already">wg a wg-quick už sú nainštalované</string>
|
||||
<string name="tools_installer_initial">Nainštalovať voliteľné nástroje pre skriptovanie</string>
|
||||
<string name="tools_installer_initial_magisk">Nainštalovať voliteľné nástroje pre skriptovanie ako Magisk module</string>
|
||||
<string name="tools_installer_initial_magisk">Nainštalovať voliteľné nástroje pre skriptovanie ako Magisk modul</string>
|
||||
<string name="tools_installer_success_magisk">wg a wg-quick sú nainštalované ako Magisk modul (reštart požadovaný)</string>
|
||||
<string name="tools_installer_title">Inštalácia nástrojov príkazového riadku</string>
|
||||
<string name="tools_installer_working">Inštalácia wg a wg-quick</string>
|
||||
<string name="tools_installer_working">Inštaluje sa wg a wg-quick</string>
|
||||
<string name="tools_unavailable_error">Potrebné nástroje nie sú k dispozícii</string>
|
||||
<string name="transfer">Prenos</string>
|
||||
<string name="transfer_bytes">%d B</string>
|
||||
@@ -141,7 +141,7 @@
|
||||
<string name="tunnel_name">Meno tunelu</string>
|
||||
<string name="tunnel_rename_error">Nepodarilo sa premenovať tunel: %s</string>
|
||||
<string name="tunnel_rename_success">Úspešne premenovaný tunel na “%s”</string>
|
||||
<string name="type_name_kernel_module">Modul jadra</string>
|
||||
<string name="type_name_kernel_module">Kernelový modul</string>
|
||||
<string name="unknown_error">Neznáma chyba</string>
|
||||
<string name="version_summary_unknown">Neznáma %s verzia</string>
|
||||
<string name="version_title">WireGuard pre Android v%s</string>
|
||||
@@ -149,10 +149,10 @@
|
||||
<string name="vpn_start_error">Nepodarilo sa spustiť Android VPN službu</string>
|
||||
<string name="zip_export_error">Nepodarilo sa exportovať tunely: %s</string>
|
||||
<string name="zip_export_success">Uložené ako “%s”</string>
|
||||
<string name="zip_export_summary">Zip súbor bude uložený do priečinka na sťahovanie</string>
|
||||
<string name="zip_export_summary">Zip súbor bude uložený do priečinka stiahnuté</string>
|
||||
<string name="zip_export_title">Export tunelov do zip súboru</string>
|
||||
<string name="biometric_prompt_zip_exporter_title">Overovanie pre export tunelov</string>
|
||||
<string name="biometric_prompt_private_key_title">Overovanie pre zobrazenie privátneho kľúča</string>
|
||||
<string name="biometric_prompt_private_key_title">Authenticate to view private key</string>
|
||||
<string name="biometric_auth_error">Overovanie zlyhalo</string>
|
||||
<string name="biometric_auth_error_reason">Overovanie zlyhalo: %s</string>
|
||||
</resources>
|
||||
|
||||
@@ -105,6 +105,8 @@
|
||||
<string name="bad_config_reason_unknown_section">Neznani odsek</string>
|
||||
<string name="bad_config_reason_value_out_of_range">Vrednost je zunaj veljavnega območja</string>
|
||||
<string name="bad_extension_error">Datoteka mora biti .conf ali .zip</string>
|
||||
<string name="error_no_qr_found">Ne najdem kode QR v sliki</string>
|
||||
<string name="error_qr_checksum">Napaka pri preverjanju kontrolne vsote kode QR</string>
|
||||
<string name="cancel">Prekliči</string>
|
||||
<string name="config_delete_error">Konfiguracijske datoteke %s ni bilo mogoče izbrisati</string>
|
||||
<string name="config_exists_error">Konfiguracija za „%s“ že obstaja</string>
|
||||
@@ -131,6 +133,9 @@
|
||||
<string name="tv_select_a_storage_drive">Izberite podatkovni pogon</string>
|
||||
<string name="tv_no_file_picker">Prosim namesti orodje za upravljanje datotek za njihov ogled</string>
|
||||
<string name="tv_add_tunnel_get_started">Za začetek dodaj tunel</string>
|
||||
<string name="donate_title">♥ Doniraj za projekt WireGuard</string>
|
||||
<string name="donate_summary">Vsak prispevek šteje</string>
|
||||
<string name="donate_google_play_disappointment">Hvala, ker podpirate projekt WireGuard!\n\nŽal zaradi Googlove politike ne smemo objaviti povezave na del spletne strani projekta, kjer lahko opravite donacijo. Upamo, da se boste lahko znašli sami!\n\nŠe enkrat hvala za vaš prispevek.</string>
|
||||
<string name="disable_config_export_title">Onemogoči izvoz nastavitev</string>
|
||||
<string name="disable_config_export_description">Onemogočenje nastavitev za izvoz nastavitev naredi zasebne ključe manj dostopne</string>
|
||||
<string name="dns_servers">Strežniki DNS</string>
|
||||
@@ -140,6 +145,7 @@
|
||||
<string name="error_down">Napaka pri zaključevanju tunela: %s</string>
|
||||
<string name="error_fetching_apps">Napaka pri poizvedovanju seznama aplikacij: %s</string>
|
||||
<string name="error_root">Prosim omogočite dostop root in poskusite ponovno</string>
|
||||
<string name="error_prepare">Napaka pri pripravi tunela: %s</string>
|
||||
<string name="error_up">Napaka pri vzpostavitvi tunela: %s</string>
|
||||
<string name="exclude_private_ips">Izvzemi zasebne naslove IP</string>
|
||||
<string name="generate_new_private_key">Izdelaj nov zasebni ključ</string>
|
||||
@@ -159,6 +165,8 @@
|
||||
<string name="key_length_explanation_base64">: WireGuardovi ključi base64 morajo vsebovati 44 znakov (32 bajtov)</string>
|
||||
<string name="key_length_explanation_binary">: WireGuardovi ključi morajo biti veliki 32 bajtov</string>
|
||||
<string name="key_length_explanation_hex">: WireGuardovi ključi hex morajo biti veliki 64 znakov (32 bajtov)</string>
|
||||
<string name="latest_handshake">Zadnje rokovanje</string>
|
||||
<string name="latest_handshake_ago">%s nazaj</string>
|
||||
<string name="listen_port">Vrata poslušanja</string>
|
||||
<string name="log_export_error">Dnevnika ni bilo mogoče izvoziti: %s</string>
|
||||
<string name="log_export_subject">Dnevniška datoteka WireGuard za Android</string>
|
||||
@@ -202,6 +210,10 @@
|
||||
<string name="private_key">Zasebni ključ</string>
|
||||
<string name="public_key">Javni ključ</string>
|
||||
<string name="qr_code_hint">Namig: izdelajte z `qrencode -t ansiutf8 < tunnel.conf`.</string>
|
||||
<string name="quick_settings_tile_add_title">Dodaj ikono v panel hitrih nastavitev</string>
|
||||
<string name="quick_settings_tile_add_summary">Bližnjica z ikono preklopi zadnji uporabljani tunel</string>
|
||||
<string name="quick_settings_tile_add_failure">Napaka pri dodajanju ikone z bližnjico: napaka %d</string>
|
||||
<string name="quick_settings_tile_action">Preklopi tunel</string>
|
||||
<string name="restore_on_boot_summary_off">Pri zagonu telefona omogočeni tuneli ne bodo aktivirani</string>
|
||||
<string name="restore_on_boot_summary_on">Pri zagonu telefona bodo omogočeni tuneli aktivirani</string>
|
||||
<string name="restore_on_boot_title">Ponovna vzpostavitev ob zagonu</string>
|
||||
@@ -237,6 +249,7 @@
|
||||
<string name="tunnel_create_success">Tunel „%s“ uspešno ustvarjen</string>
|
||||
<string name="tunnel_error_already_exists">Tunel „%s“ že obstaja</string>
|
||||
<string name="tunnel_error_invalid_name">Neveljavno ime</string>
|
||||
<string name="tunnel_list_placeholder">Dodaj tunel s spodnjim gumbom</string>
|
||||
<string name="tunnel_name">Ime tunela</string>
|
||||
<string name="tunnel_on_error">Tunela ni bilo mogoče vključiti (wgTurnOn je vrnil %d)</string>
|
||||
<string name="tunnel_dns_failure">Imena DNS gostitelja ni bilo mogoče razrešiti: \"%s\"</string>
|
||||
@@ -245,6 +258,16 @@
|
||||
<string name="type_name_go_userspace">Uporabniški prostor Go</string>
|
||||
<string name="type_name_kernel_module">Modul jedra</string>
|
||||
<string name="unknown_error">Neznana napaka</string>
|
||||
<string name="updater_avalable">Na voljo je posodobitev aplikacije. Prosimo, posodobite zdaj.</string>
|
||||
<string name="updater_action">Prenesi in posodobi</string>
|
||||
<string name="updater_rechecking">Pridobivanje metapodatkov o posodobitvi …</string>
|
||||
<string name="updater_download_progress">Prenašanje posodobitve: %1$s / %2$s (%3$.2f %%)</string>
|
||||
<string name="updater_download_progress_nototal">Prenašanje posodobitve: %s</string>
|
||||
<string name="updater_installing">Nameščanje posodobitve …</string>
|
||||
<string name="updater_failure">Posodobitev ni uspela: %s. Ponovni poskus kmalu …</string>
|
||||
<string name="updater_corrupt_title">Pokvarjena aplikacija</string>
|
||||
<string name="updater_corrupt_message">Ta aplikacija je pokvarjena. Prosimo, ponovno prenesite APK s spletne strani na spodnji povezavi. Po tem odstranite to aplikacijo in jo ponovno namestite s prenesenim APK-jem.</string>
|
||||
<string name="updater_corrupt_navigate">Odpri spletno stran</string>
|
||||
<string name="version_summary">Zaledje %1$s %2$s</string>
|
||||
<string name="version_summary_checking">Preverjam verzijo zaledja %s</string>
|
||||
<string name="version_summary_unknown">Neznana verzija %s</string>
|
||||
|
||||
@@ -107,6 +107,9 @@
|
||||
<string name="tv_select_a_storage_drive">Välj en lagringsenhet</string>
|
||||
<string name="tv_no_file_picker">Installera ett filhanteringsverktyg för att bläddra bland filer</string>
|
||||
<string name="tv_add_tunnel_get_started">Lägg till en tunnel för att komma igång</string>
|
||||
<string name="donate_title">♥ Donera till WireGuard projektet</string>
|
||||
<string name="donate_summary">Varje bidrag hjälper</string>
|
||||
<string name="donate_google_play_disappointment">Tack för att du stödjer WireGuard projektet!\n\nPå grund av Googles policyer får vi dessvärre inte länka till den del av projektets webbsida där du kan göra en donation. Förhoppningsvis kan du hitta dit ändå!\n\nTack igen för ditt bidrag.</string>
|
||||
<string name="disable_config_export_title">Inaktivera export av konfiguration</string>
|
||||
<string name="disable_config_export_description">Inaktivering av konfigurationsexport gör privata nycklar mindre tillgängliga</string>
|
||||
<string name="dns_servers">DNS-servrar</string>
|
||||
@@ -116,6 +119,7 @@
|
||||
<string name="error_down">Fel vid nedtagning av tunnel: %s</string>
|
||||
<string name="error_fetching_apps">Fel vid hämtning av applista: %s</string>
|
||||
<string name="error_root">Vänligen få rootbehörighet och försök igen</string>
|
||||
<string name="error_prepare">Fel vid förberedelse av tunnel: %s</string>
|
||||
<string name="error_up">Fel vid uppstart av tunnel: %s</string>
|
||||
<string name="exclude_private_ips">Uteslut privata IP-adresser</string>
|
||||
<string name="generate_new_private_key">Skapa ny privat nyckel</string>
|
||||
@@ -135,6 +139,8 @@
|
||||
<string name="key_length_explanation_base64">: WireGuard base64 nycklar måste vara 44 tecken (32 bytes)</string>
|
||||
<string name="key_length_explanation_binary">: WireGuard nycklar måste vara 32 bytes</string>
|
||||
<string name="key_length_explanation_hex">: WireGuard hex nycklar måste vara 64 tecken (32 bytes)</string>
|
||||
<string name="latest_handshake">Senaste handskakning</string>
|
||||
<string name="latest_handshake_ago">%s sedan</string>
|
||||
<string name="listen_port">Lyssningsport</string>
|
||||
<string name="log_export_error">Kan inte exportera loggen: %s</string>
|
||||
<string name="log_export_subject">WireGuard Android loggfil</string>
|
||||
@@ -147,7 +153,7 @@
|
||||
<string name="logcat_error">Kunde inte köra logcat: </string>
|
||||
<string name="module_enabler_disabled_summary">Den experimentella kärnmodulen kan förbättra prestanda</string>
|
||||
<string name="module_enabler_disabled_title">Aktivera backend för kärnmodul</string>
|
||||
<string name="module_enabler_enabled_summary">Den långsammare backend för användarrymden kan förbättra stabiliteten</string>
|
||||
<string name="module_enabler_enabled_summary">Det långsammare icke-kernel implementationen kan förbättra stabiliteten</string>
|
||||
<string name="module_enabler_enabled_title">Inaktivera backend för kärnmodul</string>
|
||||
<string name="module_installer_error">Något gick fel. Vänligen försök igen</string>
|
||||
<string name="module_installer_initial">Den experimentella kärnmodulen kan förbättra prestanda</string>
|
||||
@@ -178,6 +184,10 @@
|
||||
<string name="private_key">Privat nyckel</string>
|
||||
<string name="public_key">Offentlig nyckel</string>
|
||||
<string name="qr_code_hint">Tips: generera med `qrencode -t ansiutf8 < tunnel.conf`.</string>
|
||||
<string name="quick_settings_tile_add_title">Lägg till tile i snabbinställningarna</string>
|
||||
<string name="quick_settings_tile_add_summary">Tilen växlar din senaste tunnel mellan på och av</string>
|
||||
<string name="quick_settings_tile_add_failure">Misslyckades med att skapa tile: fel %d</string>
|
||||
<string name="quick_settings_tile_action">Växla tunnel på/av</string>
|
||||
<string name="restore_on_boot_summary_off">Kommer inte ta upp aktiverade tunnlar vid uppstart</string>
|
||||
<string name="restore_on_boot_summary_on">Kommer ta upp aktiverade tunnlar vid uppstart</string>
|
||||
<string name="restore_on_boot_title">Återställ vid uppstart</string>
|
||||
@@ -213,14 +223,25 @@
|
||||
<string name="tunnel_create_success">Lyckades skapa tunnel “%s”</string>
|
||||
<string name="tunnel_error_already_exists">Tunnel ”%s” finns redan</string>
|
||||
<string name="tunnel_error_invalid_name">Ogiltigt namn</string>
|
||||
<string name="tunnel_list_placeholder">Lägg till en tunnel med knappen nedan</string>
|
||||
<string name="tunnel_name">Tunnelns namn</string>
|
||||
<string name="tunnel_on_error">Kunde inte aktivera tunneln (wgTurnOn returnerade %d)</string>
|
||||
<string name="tunnel_dns_failure">Det går inte att lösa DNS-värdnamn: ”%s”</string>
|
||||
<string name="tunnel_rename_error">Kan inte byta namn på tunnel: %s</string>
|
||||
<string name="tunnel_rename_success">Lyckades döpa om tunnel till “%s”</string>
|
||||
<string name="type_name_go_userspace">Användarutrymme för Go</string>
|
||||
<string name="type_name_go_userspace">Go userspace</string>
|
||||
<string name="type_name_kernel_module">Kärnmodul</string>
|
||||
<string name="unknown_error">Okänt fel</string>
|
||||
<string name="updater_avalable">Det finns en uppdatering till appen. Vänligen uppdatera nu.</string>
|
||||
<string name="updater_action">Ladda ner & uppdatera</string>
|
||||
<string name="updater_rechecking">Hämtar uppdateringens metadata…</string>
|
||||
<string name="updater_download_progress">Laddar ner uppdatering: %1$s / %2$s (%3$.2f%%)</string>
|
||||
<string name="updater_download_progress_nototal">Laddar ner uppdatering: %s</string>
|
||||
<string name="updater_installing">Installerar uppdatering…</string>
|
||||
<string name="updater_failure">Uppdatering misslyckades: %s. Försöker igen inom kort…</string>
|
||||
<string name="updater_corrupt_title">Applikationen är korrupt</string>
|
||||
<string name="updater_corrupt_message">Applikationen är korrupt. Vänligen ladda ner en APK från hemsidan länkad nedan. Avinstallera därefter denna applikation och installera den nerladdade APKn.</string>
|
||||
<string name="updater_corrupt_navigate">Öppna hemsida</string>
|
||||
<string name="version_summary">%1$s bakstycke %2$s</string>
|
||||
<string name="version_summary_checking">Kontrollerar %s backstycke utgåva</string>
|
||||
<string name="version_summary_unknown">Okänd %s utgåva</string>
|
||||
|
||||
@@ -1,16 +1,16 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<plurals name="delete_error">
|
||||
<item quantity="one">%d tüneli silinemiyor: %s</item>
|
||||
<item quantity="other">%d tünelleri silinemiyor: %s</item>
|
||||
<item quantity="one">%d tünel silinemedi: %s</item>
|
||||
<item quantity="other">%d tünel silinemedi: %s</item>
|
||||
</plurals>
|
||||
<plurals name="delete_success">
|
||||
<item quantity="one">%d tüneli başarıyla silindi</item>
|
||||
<item quantity="other">%d tünelleri başarıyla silindi</item>
|
||||
<item quantity="one">%d tünel başarıyla silindi</item>
|
||||
<item quantity="other">%d tünel başarıyla silindi</item>
|
||||
</plurals>
|
||||
<plurals name="delete_title">
|
||||
<item quantity="one">%d tüneli seçildi</item>
|
||||
<item quantity="other">%d tünelleri seçildi</item>
|
||||
<item quantity="one">%d tünel seçildi</item>
|
||||
<item quantity="other">%d tünel seçildi</item>
|
||||
</plurals>
|
||||
<plurals name="import_partial_success">
|
||||
<item quantity="one">%1$d/%2$d tünel içe aktarıldı</item>
|
||||
@@ -21,31 +21,31 @@
|
||||
<item quantity="other">%d tünel içe aktarıldı</item>
|
||||
</plurals>
|
||||
<plurals name="set_excluded_applications">
|
||||
<item quantity="one">%d Hariç Tutulan Uygulama</item>
|
||||
<item quantity="other">%d Hariç Tutulan Uygulamalar</item>
|
||||
<item quantity="one">%d uygulama hariç tutuldu</item>
|
||||
<item quantity="other">%d uygulama hariç tutuldu</item>
|
||||
</plurals>
|
||||
<plurals name="set_included_applications">
|
||||
<item quantity="one">%d Dahil Edilen Uygulama</item>
|
||||
<item quantity="other">%d Dahil Edilen Uygulamalar</item>
|
||||
<item quantity="one">%d uygulama dahil edildi</item>
|
||||
<item quantity="other">%d uygulama dahil edildi</item>
|
||||
</plurals>
|
||||
<plurals name="n_excluded_applications">
|
||||
<item quantity="one">%d hariç tutuldu</item>
|
||||
<item quantity="other">%d hariç tutuldu</item>
|
||||
<item quantity="one">%d uygulama hariç</item>
|
||||
<item quantity="other">%d uygulama hariç</item>
|
||||
</plurals>
|
||||
<plurals name="n_included_applications">
|
||||
<item quantity="one">%d dahil edildi</item>
|
||||
<item quantity="other">%d dahil edildi</item>
|
||||
<item quantity="one">%d uygulama dahil</item>
|
||||
<item quantity="other">%d uygulama dahil</item>
|
||||
</plurals>
|
||||
<string name="all_applications">Tüm Uygulamalar</string>
|
||||
<string name="exclude_from_tunnel">Hariç</string>
|
||||
<string name="include_in_tunnel">Yalnızca dahil</string>
|
||||
<string name="all_applications">Tüm uygulamalar</string>
|
||||
<string name="exclude_from_tunnel">Hariç tut</string>
|
||||
<string name="include_in_tunnel">Dahil et</string>
|
||||
<plurals name="include_n_applications">
|
||||
<item quantity="one">%d uygulamasını dahil et</item>
|
||||
<item quantity="other">%d uygulamalarını dahil et</item>
|
||||
<item quantity="one">%d uygulamayı dahil et</item>
|
||||
<item quantity="other">%d uygulamayı dahil et</item>
|
||||
</plurals>
|
||||
<plurals name="exclude_n_applications">
|
||||
<item quantity="one">%d uygulamasını hariç tut</item>
|
||||
<item quantity="other">%d uygulamalarını hariç tut</item>
|
||||
<item quantity="one">%d uygulamayı hariç tut</item>
|
||||
<item quantity="other">%d uygulamayı hariç tut</item>
|
||||
</plurals>
|
||||
<plurals name="persistent_keepalive_seconds_unit">
|
||||
<item quantity="one">her saniye</item>
|
||||
@@ -59,16 +59,16 @@
|
||||
<string name="add_peer">Eş ekle</string>
|
||||
<string name="addresses">Adresler</string>
|
||||
<string name="applications">Uygulamalar</string>
|
||||
<string name="allow_remote_control_intents_summary_off">Harici uygulamalar tünelleri değiştiremez (önerilir)</string>
|
||||
<string name="allow_remote_control_intents_summary_on">Harici uygulamalar tünelleri değiştirebilir (gelişmiş)</string>
|
||||
<string name="allow_remote_control_intents_summary_off">Dış uygulamalar tünelleri açıp kapatamaz (önerilir)</string>
|
||||
<string name="allow_remote_control_intents_summary_on">Dış uygulamalar tünelleri açıp kapatabilir (ileri düzey)</string>
|
||||
<string name="allow_remote_control_intents_title">Uzaktan kontrol uygulamalarına izin ver</string>
|
||||
<string name="allowed_ips">İzin verilen IP\'ler</string>
|
||||
<string name="bad_config_context">%1$s\'in %2$s</string>
|
||||
<string name="allowed_ips">İzin verilen IP’ler</string>
|
||||
<string name="bad_config_context">%1$s - %2$s</string>
|
||||
<string name="bad_config_context_top_level">%s</string>
|
||||
<string name="bad_config_error">%2$s içinde %1$s</string>
|
||||
<string name="bad_config_explanation_pka">: Pozitif olmalı ve 65535\'ten fazla olmamalıdır</string>
|
||||
<string name="bad_config_explanation_positive_number">: Pozitif olmalıdır</string>
|
||||
<string name="bad_config_explanation_udp_port">: Geçerli bir UDP Port numarası olmalıdır</string>
|
||||
<string name="bad_config_explanation_udp_port">: Geçerli bir UDP port numarası olmalıdır</string>
|
||||
<string name="bad_config_reason_invalid_key">Geçersiz anahtar</string>
|
||||
<string name="bad_config_reason_invalid_number">Geçersiz numara</string>
|
||||
<string name="bad_config_reason_invalid_value">Geçersiz değer</string>
|
||||
@@ -77,48 +77,49 @@
|
||||
<string name="bad_config_reason_syntax_error">Sözdizimi hatası</string>
|
||||
<string name="bad_config_reason_unknown_attribute">Bilinmeyen öznitelik</string>
|
||||
<string name="bad_config_reason_unknown_section">Bilinmeyen bölüm</string>
|
||||
<string name="bad_config_reason_value_out_of_range">Aralık dışı değer</string>
|
||||
<string name="bad_config_reason_value_out_of_range">Değer sınır dışında</string>
|
||||
<string name="bad_extension_error">Dosya .conf veya .zip olmalıdır</string>
|
||||
<string name="error_no_qr_found">Görselde QR kod bulunamadı</string>
|
||||
<string name="error_qr_checksum">QR kod doğrulaması başarısız</string>
|
||||
<string name="error_no_qr_found">Görselde QR kodu bulunamadı</string>
|
||||
<string name="error_qr_checksum">QR kodunun sağlaması başarısız oldu</string>
|
||||
<string name="cancel">İptal</string>
|
||||
<string name="config_delete_error">%s konfigürasyon dosyası silinemiyor</string>
|
||||
<string name="config_exists_error">“%s” için konfigürasyon zaten var</string>
|
||||
<string name="config_file_exists_error">“%s“ için konfigürasyon dosyası zaten var</string>
|
||||
<string name="config_not_found_error">“%s“ konfigürasyon dosyası bulunamadı</string>
|
||||
<string name="config_rename_error">“%s” konfigürasyon dosyası yeniden adlandırılamıyor</string>
|
||||
<string name="config_save_error">“%1$s” için konfigürasyon kaydedilemiyor: %2$s</string>
|
||||
<string name="config_save_success">“%s“ için konfigürasyon başarıyla kaydedildi</string>
|
||||
<string name="create_activity_title">WireGuard Tüneli Yarat</string>
|
||||
<string name="create_bin_dir_error">Yerel ikili dizin oluşturulamıyor</string>
|
||||
<string name="config_delete_error">%s yapılandırma dosyası silinemedi</string>
|
||||
<string name="config_exists_error">“%s” yapılandırması zaten mevcut</string>
|
||||
<string name="config_file_exists_error">“%s“ yapılandırma dosyası zaten mevcut</string>
|
||||
<string name="config_not_found_error">“%s“ yapılandırma dosyası bulunamadı</string>
|
||||
<string name="config_rename_error">“%s” yapılandırma dosyası yeniden adlandırılamadı</string>
|
||||
<string name="config_save_error">“%1$s” yapılandırması kaydedilemedi: %2$s</string>
|
||||
<string name="config_save_success">“%s“ yapılandırması başarıyla kaydedildi</string>
|
||||
<string name="create_activity_title">WireGuard tüneli oluştur</string>
|
||||
<string name="create_bin_dir_error">Yerel ikili dizin oluşturulamadı</string>
|
||||
<string name="create_downloads_file_error">İndirilenler klasöründe dosya oluşturulamadı</string>
|
||||
<string name="create_empty">Sıfırdan oluştur</string>
|
||||
<string name="create_from_file">Dosya veya arşivden ekle</string>
|
||||
<string name="create_from_qr_code">QR Kodu Tara</string>
|
||||
<string name="create_output_dir_error">Çıktı klasörü oluşturulamıyor</string>
|
||||
<string name="create_temp_dir_error">Yerel geçici dizin oluşturulamıyor</string>
|
||||
<string name="create_tunnel">Tünel Oluştur</string>
|
||||
<string name="create_from_file">Dosyadan veya arşivden içe aktar</string>
|
||||
<string name="create_from_qr_code">QR kodu okut</string>
|
||||
<string name="create_output_dir_error">Çıktı klasörü oluşturulamadı</string>
|
||||
<string name="create_temp_dir_error">Yerel geçici dizin oluşturulamadı</string>
|
||||
<string name="create_tunnel">Tünel oluştur</string>
|
||||
<string name="copied_to_clipboard">%s panoya kopyalandı</string>
|
||||
<string name="dark_theme_summary_off">Şu anda açık (gündüz) teması kullanılıyor</string>
|
||||
<string name="dark_theme_summary_on">Şu anda karanlık (gece) teması kullanılıyor</string>
|
||||
<string name="dark_theme_title">Koyu tema kullan</string>
|
||||
<string name="dark_theme_summary_off">Şu anda açık (gündüz) tema kullanılıyor</string>
|
||||
<string name="dark_theme_summary_on">Şu anda koyu (gece) tema kullanılıyor</string>
|
||||
<string name="dark_theme_title">Koyu temayı kullan</string>
|
||||
<string name="delete">Sil</string>
|
||||
<string name="tv_delete">Silinecek tüneli seçin</string>
|
||||
<string name="tv_select_a_storage_drive">Bir depolama sürücüsü seçin</string>
|
||||
<string name="tv_no_file_picker">Dosyalara göz atmak için lütfen bir dosya yönetim aracı yükleyin</string>
|
||||
<string name="tv_add_tunnel_get_started">Başlamak için bir tünel ekleyin</string>
|
||||
<string name="donate_title">♥ WireGuard Projesine Bağış Yapın</string>
|
||||
<string name="donate_summary">Her katkı yardımcı olur</string>
|
||||
<string name="donate_google_play_disappointment">WireGuard Projesini desteklediğiniz için teşekkür ederiz!\n\nNe yazık ki, Google\'ın politikaları nedeniyle, proje web sayfasının bağış yapabileceğiniz bölümüne bağlantı vermemize izin verilmiyor. Umarım bunu çözebilirsin!\n\nKatkılarınız için tekrar teşekkürler.</string>
|
||||
<string name="disable_config_export_title">Ayarları dışa aktarmayı kapa</string>
|
||||
<string name="disable_config_export_description">Ayarları dışa aktarmayı kapamak gizli anahtarları daha az erişilebilir kılar</string>
|
||||
<string name="donate_title">♥ WireGuard projesine bağış yap</string>
|
||||
<string name="donate_summary">Tüm bağışlarınız bizim için değerli</string>
|
||||
<string name="donate_google_play_disappointment">WireGuard projesini desteklediğiniz için teşekkür ederiz!\n\nNe yazık ki Google\'ın politikaları nedeniyle web sitemizin bağış yapabileceğiniz bölümüne bağlantı veremiyoruz. Umarız ilgili sayfayı kendiniz bulabilirsiniz.\n\nKatkılarınız için tekrar teşekkür ederiz.</string>
|
||||
<string name="disable_config_export_title">Yapılandırmayı dışa aktarmayı devre dışı bırak</string>
|
||||
<string name="disable_config_export_description">Yapıalandırmayı dışa aktarmayı devre dışı bırakırsanız özel anahtarlara erişmek zorlaşır</string>
|
||||
<string name="dns_servers">DNS sunucuları</string>
|
||||
<string name="dns_search_domains">Alan adı ara</string>
|
||||
<string name="edit">Düzenle</string>
|
||||
<string name="endpoint">Uç nokta</string>
|
||||
<string name="error_down">Tünel kapatılırken hata oluştu: %s</string>
|
||||
<string name="error_fetching_apps">Uygulama listesi getirilirken hata oluştu: %s</string>
|
||||
<string name="error_root">Lütfen root erişimi elde edin ve tekrar deneyin</string>
|
||||
<string name="error_root">Lütfen root erişimi elde edip yeniden deneyin</string>
|
||||
<string name="error_prepare">Tünel hazırlanırken hata oluştu: %s</string>
|
||||
<string name="error_up">Tünel açılırken hata oluştu: %s</string>
|
||||
<string name="exclude_private_ips">Özel IP’leri hariç tut</string>
|
||||
<string name="generate_new_private_key">Yeni özel anahtar oluştur</string>
|
||||
@@ -128,115 +129,131 @@
|
||||
<string name="hint_optional">(isteğe bağlı)</string>
|
||||
<string name="hint_optional_discouraged">(isteğe bağlı, önerilmez)</string>
|
||||
<string name="hint_random">(rastgele)</string>
|
||||
<string name="illegal_filename_error">Geçersiz dosya ismi “%s”</string>
|
||||
<string name="import_error">Tünel içeri aktarılamıyor: %s</string>
|
||||
<string name="import_from_qr_code">Tüneli QR Kod ile İçe Aktar</string>
|
||||
<string name="import_success">İçe aktarıldı “%s”</string>
|
||||
<string name="interface_title">Arayüz</string>
|
||||
<string name="key_contents_error">Anahtardaki yanlış karakterler</string>
|
||||
<string name="key_length_error">Yanlış anahtar uzunluğu</string>
|
||||
<string name="illegal_filename_error">“%s” dosya adı geçersiz</string>
|
||||
<string name="import_error">Tünel içe aktarılamadı: %s</string>
|
||||
<string name="import_from_qr_code">Tüneli QR kodundan içe aktar</string>
|
||||
<string name="import_success">“%s” içe aktarıldı</string>
|
||||
<string name="interface_title">Arabirim</string>
|
||||
<string name="key_contents_error">Anahtarda yanlış karakterler var</string>
|
||||
<string name="key_length_error">Anahtar uzunluğu yanlış</string>
|
||||
<string name="key_length_explanation_base64">: WireGuard base64 anahtarları 44 karakter (32 bayt) olmalıdır</string>
|
||||
<string name="key_length_explanation_binary">: WireGuard anahtarları 32 bayt olmalıdır</string>
|
||||
<string name="key_length_explanation_hex">: WireGuard onaltılık anahtarları 64 karakter (32 bayt) olmalıdır</string>
|
||||
<string name="key_length_explanation_hex">: WireGuard on altılık anahtarları 64 karakter (32 bayt) olmalıdır</string>
|
||||
<string name="latest_handshake">En son el sıkışma</string>
|
||||
<string name="latest_handshake_ago">%s önce</string>
|
||||
<string name="listen_port">Dinlenen port</string>
|
||||
<string name="log_export_error">Günlük dışa aktarılamıyor: %s</string>
|
||||
<string name="log_export_error">Günlük dışa aktarılamadı: %s</string>
|
||||
<string name="log_export_subject">WireGuard Android Günlük Dosyası</string>
|
||||
<string name="log_export_success">“%s” ’e kaydedildi</string>
|
||||
<string name="log_export_success">“%s” dosyasına kaydedildi</string>
|
||||
<string name="log_export_title">Günlük dosyasını dışa aktar</string>
|
||||
<string name="log_saver_activity_label">Günlüğü kaydet</string>
|
||||
<string name="log_viewer_pref_summary">Günlükler hata ayıklamaya yardımcı olabilir</string>
|
||||
<string name="log_viewer_pref_title">Uygulama günlüğünü görüntüle</string>
|
||||
<string name="log_viewer_title">Günlük</string>
|
||||
<string name="logcat_error">Logcat çalıştırılamıyor: </string>
|
||||
<string name="logcat_error">Logcat çalıştırılamadı: </string>
|
||||
<string name="module_enabler_disabled_summary">Deneysel çekirdek modülü performansı artırabilir</string>
|
||||
<string name="module_enabler_disabled_title">Çekirdek modülü arka ucunu etkinleştir</string>
|
||||
<string name="module_enabler_enabled_summary">Daha yavaş kullanıcı alanı arka ucu kararlılığı artırabilir</string>
|
||||
<string name="module_enabler_enabled_summary">Daha yavaş kullanıcı uzayı arka ucu, kararlılığı artırabilir</string>
|
||||
<string name="module_enabler_enabled_title">Çekirdek modülü arka ucunu devre dışı bırak</string>
|
||||
<string name="module_installer_error">Bir şeyler yanlış gitti. Lütfen tekrar deneyin</string>
|
||||
<string name="module_installer_error">Bir sorun oluştu. Lütfen yeniden deneyin</string>
|
||||
<string name="module_installer_initial">Deneysel çekirdek modülü performansı artırabilir</string>
|
||||
<string name="module_installer_not_found">Cihazınız için uygun modül yok</string>
|
||||
<string name="module_installer_title">Çekirdek modülünü indir ve yükle</string>
|
||||
<string name="module_installer_working">İndiriliyor ve yükleniyor…</string>
|
||||
<string name="module_version_error">Çekirdek modülü sürümü belirlenemiyor</string>
|
||||
<string name="module_version_error">Çekirdek modülü sürümü belirlenemedi</string>
|
||||
<string name="mtu">MTU</string>
|
||||
<string name="multiple_tunnels_summary_off">Bir tüneli açmak diğerlerini kapatır</string>
|
||||
<string name="multiple_tunnels_summary_off">Bir tüneli açtığınızda diğer tüneller kapatılır</string>
|
||||
<string name="multiple_tunnels_summary_on">Aynı anda birden fazla tünel açılabilir</string>
|
||||
<string name="multiple_tunnels_title">Birden çok eşzamanlı tünele izin verin</string>
|
||||
<string name="multiple_tunnels_title">Birden çok eş zamanlı tünele izin ver</string>
|
||||
<string name="name">İsim</string>
|
||||
<string name="no_config_error">Konfigürasyonsuz bir tünel açmaya çalışılıyor</string>
|
||||
<string name="no_configs_error">Konfigürasyon bulunamadı</string>
|
||||
<string name="no_tunnels_error">Tünel yok</string>
|
||||
<string name="parse_error_generic">dizi</string>
|
||||
<string name="no_config_error">Yapılandırmasız bir tünel açılmaya çalışılıyor</string>
|
||||
<string name="no_configs_error">Yapılandırma bulunamadı</string>
|
||||
<string name="no_tunnels_error">Hiç tünel yok</string>
|
||||
<string name="parse_error_generic">dize</string>
|
||||
<string name="parse_error_inet_address">IP adresi</string>
|
||||
<string name="parse_error_inet_endpoint">uç nokta</string>
|
||||
<string name="parse_error_inet_network">IP ağı</string>
|
||||
<string name="parse_error_integer">numara</string>
|
||||
<string name="parse_error_integer">sayı</string>
|
||||
<string name="parse_error_reason">%1$s “%2$s” ayrıştırılamıyor</string>
|
||||
<string name="peer">Eş</string>
|
||||
<string name="permission_description">WireGuard tünellerini kontrol edin, tünelleri istediğiniz zaman etkinleştirin ve devre dışı bırakın, İnternet trafiğini potansiyel olarak yanlış yönlendirin</string>
|
||||
<string name="permission_label">WireGuard tünellerini kontrol edin</string>
|
||||
<string name="persistent_keepalive">Kalıcı canlı tutma</string>
|
||||
<string name="permission_description">WireGuard tünellerini yöneterek tünelleri istendiği anda açma ve kapatma. İnternet trafiğini potansiyel olarak yanlış yönlendirebilir</string>
|
||||
<string name="permission_label">WireGuard tünellerini yönet</string>
|
||||
<string name="persistent_keepalive">Sürekli keepalive</string>
|
||||
<string name="pre_shared_key">Önceden paylaşılan anahtar</string>
|
||||
<string name="pre_shared_key_enabled">etkinleştirildi</string>
|
||||
<string name="pre_shared_key_enabled">etkin</string>
|
||||
<string name="private_key">Özel anahtar</string>
|
||||
<string name="public_key">Genel anahtar</string>
|
||||
<string name="qr_code_hint">İpucu: `qrencode -t ansiutf8 < tunnel.conf` ile oluşturun.</string>
|
||||
<string name="restore_on_boot_summary_off">Önyüklemede etkin tünelleri açmayacak</string>
|
||||
<string name="restore_on_boot_summary_on">Önyüklemede etkin tünelleri açacak</string>
|
||||
<string name="restore_on_boot_title">Cihaz açılırken başlat</string>
|
||||
<string name="public_key">Ortak anahtar</string>
|
||||
<string name="qr_code_hint">İpucu: `qrencode -t ansiutf8 < tunnel.conf` ile oluşturabilirsiniz.</string>
|
||||
<string name="quick_settings_tile_add_title">Hızlı ayarlar paneline simge ekle</string>
|
||||
<string name="quick_settings_tile_add_summary">Kısayol simgesi son kullandığınız tüneli açıp kapatır</string>
|
||||
<string name="quick_settings_tile_add_failure">Kısayol simgesi eklenemedi: hata %d</string>
|
||||
<string name="quick_settings_tile_action">Tüneli aç/kapat</string>
|
||||
<string name="restore_on_boot_summary_off">Etkin tüneller sistem açılışında başlatılmayacaktır</string>
|
||||
<string name="restore_on_boot_summary_on">Etkin tüneller sistem açılışında başlatılacaktır</string>
|
||||
<string name="restore_on_boot_title">Sistem açılışında başlat</string>
|
||||
<string name="save">Kaydet</string>
|
||||
<string name="select_all">Tümünü seç</string>
|
||||
<string name="settings">Ayarlar</string>
|
||||
<string name="shell_exit_status_read_error">Kabuk, çıktı durumunu okuyamıyor</string>
|
||||
<string name="shell_marker_count_error">Kabuk 4 işaret bekledi, %d aldı</string>
|
||||
<string name="shell_exit_status_read_error">Kabuk, çıkış durumunu okuyamıyor</string>
|
||||
<string name="shell_marker_count_error">Kabuk 4 işaret bekliyordu, %d aldı</string>
|
||||
<string name="shell_start_error">Kabuk başlatılamadı: %d</string>
|
||||
<string name="success_application_will_restart">Başarı. Uygulama şimdi yeniden başlayacak…</string>
|
||||
<string name="toggle_all">Tümünü Değiştir</string>
|
||||
<string name="toggle_error">WireGuard tüneli değiştirilirken hata oluştu: %s</string>
|
||||
<string name="tools_installer_already">wg ve wg-quick zaten kurulu</string>
|
||||
<string name="tools_installer_failure">Komut satırı araçları yüklenemiyor (root yok mu?)</string>
|
||||
<string name="tools_installer_initial">Komut dosyası oluşturmak için isteğe bağlı araçları yükleyin</string>
|
||||
<string name="tools_installer_initial_magisk">Magisk modülü olarak komut dosyası oluşturmak için isteğe bağlı araçları yükleyin</string>
|
||||
<string name="tools_installer_initial_system">Sistem bölümüne komut dosyası oluşturmak için isteğe bağlı araçlar yükleyin</string>
|
||||
<string name="tools_installer_success_magisk">wg ve wg-quick bir Magisk modülü olarak kuruldu (yeniden başlatma gerekir)</string>
|
||||
<string name="success_application_will_restart">İşlem başarılı. Uygulama şimdi yeniden başlayacak…</string>
|
||||
<string name="toggle_all">Tümünü aç/kapat</string>
|
||||
<string name="toggle_error">WireGuard tüneli açılırken/kapatılırken hata oluştu: %s</string>
|
||||
<string name="tools_installer_already">wg ve wg-quick zaten yüklenmiş</string>
|
||||
<string name="tools_installer_failure">Komut satırı araçları yüklenemiyor (root erişiminiz olmayabilir)</string>
|
||||
<string name="tools_installer_initial">Scripting için isteğe bağlı araçları yükle</string>
|
||||
<string name="tools_installer_initial_magisk">Scripting için isteğe bağlı araçları Magisk modülü olarak yükle</string>
|
||||
<string name="tools_installer_initial_system">Scripting için isteğe bağlı araçları sistem bölümüne yükle</string>
|
||||
<string name="tools_installer_success_magisk">wg ve wg-quick, Magisk modülü olarak yüklendi (Yeniden başlatma gerekir)</string>
|
||||
<string name="tools_installer_success_system">wg ve wg-quick, sistem bölümüne yüklendi</string>
|
||||
<string name="tools_installer_title">Komut satırı araçlarını yükleyin</string>
|
||||
<string name="tools_installer_working">wg ve wg-quick kuruluyor</string>
|
||||
<string name="tools_installer_title">Komut satırı araçlarını yükle</string>
|
||||
<string name="tools_installer_working">wg ve wg-quick yükleniyor</string>
|
||||
<string name="tools_unavailable_error">Gerekli araçlar mevcut değil</string>
|
||||
<string name="transfer">Transfer</string>
|
||||
<string name="transfer">Aktarım</string>
|
||||
<string name="transfer_bytes">%d B</string>
|
||||
<string name="transfer_gibibytes">%.2f GiB</string>
|
||||
<string name="transfer_kibibytes">%.2f KiB</string>
|
||||
<string name="transfer_mibibytes">%.2f MiB</string>
|
||||
<string name="transfer_rx_tx">rx: %1$s, tx: %2$s</string>
|
||||
<string name="transfer_tibibytes">%.2f TiB</string>
|
||||
<string name="tun_create_error">Tun cihazı oluşturulamıyor</string>
|
||||
<string name="tunnel_config_error">Tünel yapılandırılamıyor (wg-quick döndürdü: %d)</string>
|
||||
<string name="tunnel_create_error">Tünel oluşturulamıyor: %s</string>
|
||||
<string name="tunnel_create_success">Tünel başarıyla oluşturuldu “%s”</string>
|
||||
<string name="tun_create_error">Tun aygıtı oluşturulamadı</string>
|
||||
<string name="tunnel_config_error">Tünel yapılandırılamadı (wg-quick %d döndürdü)</string>
|
||||
<string name="tunnel_create_error">Tünel oluşturulamadı: %s</string>
|
||||
<string name="tunnel_create_success">“%s” tüneli başarıyla oluşturuldu</string>
|
||||
<string name="tunnel_error_already_exists">“%s” tüneli zaten mevcut</string>
|
||||
<string name="tunnel_error_invalid_name">Geçersiz isim</string>
|
||||
<string name="tunnel_list_placeholder">Aşağıdaki düğmeyi kullanarak bir tünel ekleyin</string>
|
||||
<string name="tunnel_name">Tünel İsmi</string>
|
||||
<string name="tunnel_on_error">Tünel aktif edilemiyor (wgTornOn döndürdü: %d)</string>
|
||||
<string name="tunnel_dns_failure">DNS adı çözülemedi: \"%s\"</string>
|
||||
<string name="tunnel_rename_error">Tünel yeniden adlandırılamıyor: %s</string>
|
||||
<string name="tunnel_rename_success">Tünel başarıyla yeniden adlandırıldı “%s”</string>
|
||||
<string name="type_name_go_userspace">Kullanıcı alanına git</string>
|
||||
<string name="tunnel_list_placeholder">Aşağıdaki düğmeyi kullanarak tünel ekleyebilirsiniz</string>
|
||||
<string name="tunnel_name">Tünel adı</string>
|
||||
<string name="tunnel_on_error">Tünel açılamadı (wgTornOn %d döndürdü)</string>
|
||||
<string name="tunnel_dns_failure">DNS ana makinesi çözülemedi: \"%s\"</string>
|
||||
<string name="tunnel_rename_error">Tünel yeniden adlandırılamadı: %s</string>
|
||||
<string name="tunnel_rename_success">Tünelin adı “%s” olarak değiştirildi</string>
|
||||
<string name="type_name_go_userspace">Go kullanıcı uzayı</string>
|
||||
<string name="type_name_kernel_module">Çekirdek modülü</string>
|
||||
<string name="unknown_error">Bilinmeyen hata</string>
|
||||
<string name="version_summary">%1$s arka uç %2$s</string>
|
||||
<string name="updater_avalable">Uygulama güncellemesi mevcut. Lütfen şimdi güncelleyin.</string>
|
||||
<string name="updater_action">İndir ve güncelle</string>
|
||||
<string name="updater_rechecking">Güncellemenin meta verileri alınıyor…</string>
|
||||
<string name="updater_download_progress">Güncelleme indiriliyor: %1$s / %2$s (%3$.2f%%)</string>
|
||||
<string name="updater_download_progress_nototal">Güncelleme indiriliyor: %s</string>
|
||||
<string name="updater_installing">Güncelleme yükleniyor…</string>
|
||||
<string name="updater_failure">Güncelleme hatası: %s. Birazdan yeniden denenecek…</string>
|
||||
<string name="updater_corrupt_title">Uygulama hasar görmüş</string>
|
||||
<string name="updater_corrupt_message">Bu uygulama hasarlı. Lütfen APK dosyasını aşağıdaki web sitesinden yeniden indirin. Daha sonra bu uygulamayı kaldırın ve indirdiğiniz APK\'den yeniden yükleyin.</string>
|
||||
<string name="updater_corrupt_navigate">Web sitesini aç</string>
|
||||
<string name="version_summary">%1$s arka ucu %2$s</string>
|
||||
<string name="version_summary_checking">%s arka uç sürümü kontrol ediliyor</string>
|
||||
<string name="version_summary_unknown">Bilinmeyen %s sürümü</string>
|
||||
<string name="version_title">Android için WireGuard v%s</string>
|
||||
<string name="vpn_not_authorized_error">VPN hizmeti kullanıcı tarafından yetkilendirilmemiş</string>
|
||||
<string name="vpn_start_error">Android VPN hizmeti başlatılamıyor</string>
|
||||
<string name="zip_export_error">Tüneller dışa aktarılamıyor: %s</string>
|
||||
<string name="zip_export_success">“%s” ’e kaydedildi</string>
|
||||
<string name="zip_export_summary">Zip dosyası indirilenler klasörüne kaydedilecek</string>
|
||||
<string name="vpn_start_error">Android VPN hizmeti başlatılamadı</string>
|
||||
<string name="zip_export_error">Tüneller dışa aktarılamadı: %s</string>
|
||||
<string name="zip_export_success">“%s” dosyasına kaydedildi</string>
|
||||
<string name="zip_export_summary">Zip dosyası indirilenler klasörüne kaydedilecektir</string>
|
||||
<string name="zip_export_title">Tünelleri zip dosyasına aktar</string>
|
||||
<string name="biometric_prompt_zip_exporter_title">Tünelleri dışa aktarmak için kimlik doğrulama</string>
|
||||
<string name="biometric_prompt_private_key_title">Özel anahtarı görüntülemek için kimlik doğrulaması</string>
|
||||
<string name="biometric_prompt_zip_exporter_title">Tünelleri dışa aktarmak için kimliğinizi doğrulayın</string>
|
||||
<string name="biometric_prompt_private_key_title">Özel anahtarı görmek için kimliğinizi doğrulayın</string>
|
||||
<string name="biometric_auth_error">Kimlik doğrulama hatası</string>
|
||||
<string name="biometric_auth_error_reason">Kimlik doğrulama hatası: %s</string>
|
||||
</resources>
|
||||
|
||||
@@ -135,6 +135,7 @@
|
||||
<string name="tv_add_tunnel_get_started">Додайте тунель, щоб почати</string>
|
||||
<string name="donate_title">♥️ Пожертвуйте на проект WireGuard</string>
|
||||
<string name="donate_summary">Кожен внесок допомагає</string>
|
||||
<string name="donate_google_play_disappointment">Дякуємо за підтримку проекту WireGuard!\n\nНа жаль, через політику Google нам заборонено розміщувати посилання на веб-сторінку проекту, де можна зробити пожертву. Сподіваємося на розуміння!\n\nЩе раз дякую за ваш внесок.</string>
|
||||
<string name="disable_config_export_title">Вимкнути експорт конфігурації</string>
|
||||
<string name="disable_config_export_description">Вимкнення експорту налаштувань робить приватні ключі менш доступними</string>
|
||||
<string name="dns_servers">DNS-сервери</string>
|
||||
@@ -209,6 +210,10 @@
|
||||
<string name="private_key">Приватний ключ</string>
|
||||
<string name="public_key">Публічний ключ</string>
|
||||
<string name="qr_code_hint">Порада: згенеруйте за допомогою `qrencode -t ansiutf8 < tunnel.conf`.</string>
|
||||
<string name="quick_settings_tile_add_title">Додати плитку для панелі швидких налаштувань</string>
|
||||
<string name="quick_settings_tile_add_summary">Плитка швидкого доступу перемикає останній тунель</string>
|
||||
<string name="quick_settings_tile_add_failure">Неможливо додати плитку (ярлик) швидкого доступу. Код помилки: %d</string>
|
||||
<string name="quick_settings_tile_action">Перемкнути тунель</string>
|
||||
<string name="restore_on_boot_summary_off">Не піднімати увімкнені тунелі при запуску</string>
|
||||
<string name="restore_on_boot_summary_on">Піднімати увімкнені тунелі при запуску</string>
|
||||
<string name="restore_on_boot_title">Відновлювати при запуску</string>
|
||||
@@ -253,6 +258,16 @@
|
||||
<string name="type_name_go_userspace">Go userspace</string>
|
||||
<string name="type_name_kernel_module">Модуль ядра</string>
|
||||
<string name="unknown_error">Невідома помилка</string>
|
||||
<string name="updater_avalable">Доступне оновлення додатка. Будь ласка, оновіть.</string>
|
||||
<string name="updater_action">Завантажити та оновити</string>
|
||||
<string name="updater_rechecking">Отримання оновлених метаданих…</string>
|
||||
<string name="updater_download_progress">Завантаження оновлення: %1$s / %2$s (%3$.2f%%)</string>
|
||||
<string name="updater_download_progress_nototal">Завантаження оновлення: %s</string>
|
||||
<string name="updater_installing">Встановдення оновлення…</string>
|
||||
<string name="updater_failure">Помилка оновлення: %s. За мить спробуємо знову…</string>
|
||||
<string name="updater_corrupt_title">Додаток пошкоджено</string>
|
||||
<string name="updater_corrupt_message">Цей додаток пошкоджений. Будь ласка, повторно завантажте APK-файл із сайту нижче. Після цього, видаліть цей додаток і перевстановіть його з завантаженого APK.</string>
|
||||
<string name="updater_corrupt_navigate">Перейти на сайт</string>
|
||||
<string name="version_summary">%1$s backend %2$s</string>
|
||||
<string name="version_summary_checking">Перевірка %s backend версії</string>
|
||||
<string name="version_summary_unknown">Невідома версія %s</string>
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
|
||||
<style name="AppTheme" parent="AppThemeBase">
|
||||
<item name="android:statusBarColor">?android:colorBackground</item>
|
||||
<item name="android:windowLightStatusBar">@bool/light_status_bar</item>
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
|
||||
<style name="AppTheme" parent="AppThemeBase">
|
||||
<item name="android:statusBarColor">?android:colorBackground</item>
|
||||
<item name="android:windowLightStatusBar">@bool/light_status_bar</item>
|
||||
|
||||
@@ -94,6 +94,9 @@
|
||||
<string name="tv_select_a_storage_drive">Chọn bộ lưu trữ</string>
|
||||
<string name="tv_no_file_picker">Vui lòng cài đặt tệp tiện ích lưu trữ để tìm kiếm các tệp</string>
|
||||
<string name="tv_add_tunnel_get_started">Thêm một tunnel để bắt đầu</string>
|
||||
<string name="donate_title">❤️ Đóng góp cho Dự án Wireguard</string>
|
||||
<string name="donate_summary">Mọi đóng góp đều giúp ích</string>
|
||||
<string name="donate_google_play_disappointment">Cảm ơn bạn đã ủng hộ WireGuard!\n\nThật tiếc, dựa trên điều khoản của Google, chúng tôi không thể đưa vào liên kết dẫn đến trang đóng góp ở trang chủ của dự án. Mong rằng bạn có thể tìm cách cho việc này!\n\nXin cảm ơn bạn một lần nữa vì đã đóng góp.</string>
|
||||
<string name="disable_config_export_title">Vô hiệu hóa xuất cấu hình</string>
|
||||
<string name="disable_config_export_description">Vô hiệu hóa xuất cấu hình sẽ giúp giảm khả năng truy cập vào private keys</string>
|
||||
<string name="dns_servers">DNS servers</string>
|
||||
@@ -103,9 +106,34 @@
|
||||
<string name="error_down">Có lỗi khi tắt tunnel: %s</string>
|
||||
<string name="error_fetching_apps">Lỗi khi lấy danh sách ứng dụng: %s</string>
|
||||
<string name="error_root">Vui lòng truy cập bằng quyền root và thử lại</string>
|
||||
<string name="error_prepare">Lỗi khi chuẩn bị tunnel: %s</string>
|
||||
<string name="error_up">Có lỗi khi bật tunnel: %s</string>
|
||||
<string name="exclude_private_ips">Loại trừ IPs private</string>
|
||||
<string name="generate_new_private_key">Tạo private key mới</string>
|
||||
<string name="generic_error">Lỗi \"%s\" không xác định</string>
|
||||
<string name="hint_automatic">(tự động)</string>
|
||||
<string name="hint_generated">(được tạo tự động)</string>
|
||||
<string name="hint_optional">(tùy chọn)</string>
|
||||
<string name="hint_optional_discouraged">(tùy chọn, không khuyến khích)</string>
|
||||
<string name="hint_random">(ngẫu nhiên)</string>
|
||||
<string name="illegal_filename_error">Tên file không hợp lệ \"%s\"</string>
|
||||
<string name="import_error">Không thể nhập tunnel: %s</string>
|
||||
<string name="import_from_qr_code">Nhập tunnel từ mã QR</string>
|
||||
<string name="import_success">Đã nhập \"%s\"</string>
|
||||
<string name="interface_title">Giao diện</string>
|
||||
<string name="key_contents_error">Kí tự không hợp lệ trong khoá</string>
|
||||
<string name="key_length_error">Độ dài khoá không hợp lệ</string>
|
||||
<string name="key_length_explanation_base64">: Khoá WireGuard base64 phải đủ 44 ký tự (32 bytes)</string>
|
||||
<string name="key_length_explanation_binary">: Khoá WireGuard phải đủ 32 bytes</string>
|
||||
<string name="key_length_explanation_hex">: Khoá WireGuard hex phải đủ 64 ký tự (32 bytes)</string>
|
||||
<string name="latest_handshake">Lần bắt tay cuối</string>
|
||||
<string name="latest_handshake_ago">%s giây trước</string>
|
||||
<string name="listen_port">Cổng</string>
|
||||
<string name="log_export_error">Không thể xuất nhật ký: %s</string>
|
||||
<string name="log_export_subject">File nhật ký WireGuard Android</string>
|
||||
<string name="log_export_success">Đã lưu vào \"%s\"</string>
|
||||
<string name="log_export_title">Xuất file nhật ký</string>
|
||||
<string name="log_saver_activity_label">Lưu nhật ký</string>
|
||||
<string name="parse_error_inet_address">Địa chỉ IP</string>
|
||||
<string name="peer">Đồng trang lứa</string>
|
||||
</resources>
|
||||
|
||||
@@ -171,6 +171,10 @@
|
||||
<string name="private_key">私钥</string>
|
||||
<string name="public_key">公钥</string>
|
||||
<string name="qr_code_hint">提示:使用命令 `qrencode -t ansiutf8 < tunnel.conf` 生成二维码</string>
|
||||
<string name="quick_settings_tile_add_title">添加磁贴到快速设置面板</string>
|
||||
<string name="quick_settings_tile_add_summary">通过快捷磁贴开启/关闭上次使用的隧道</string>
|
||||
<string name="quick_settings_tile_add_failure">无法添加快捷磁贴:错误 %d</string>
|
||||
<string name="quick_settings_tile_action">开启/关闭隧道</string>
|
||||
<string name="restore_on_boot_summary_off">未启用</string>
|
||||
<string name="restore_on_boot_summary_on">设备启动时自动开启上次使用的隧道</string>
|
||||
<string name="restore_on_boot_title">启动时恢复</string>
|
||||
@@ -215,6 +219,16 @@
|
||||
<string name="type_name_go_userspace">Go userspace</string>
|
||||
<string name="type_name_kernel_module">Kernel module</string>
|
||||
<string name="unknown_error">未知错误</string>
|
||||
<string name="updater_avalable">WireGuard 可以更新了,请立即更新。</string>
|
||||
<string name="updater_action">下载 & 更新</string>
|
||||
<string name="updater_rechecking">正在获取更新元数据…</string>
|
||||
<string name="updater_download_progress">正在下载更新:%1$s / %2$s (%3$.2f%%)</string>
|
||||
<string name="updater_download_progress_nototal">正在下载更新:%s</string>
|
||||
<string name="updater_installing">正在安装更新…</string>
|
||||
<string name="updater_failure">更新失败:%s。将在稍后重试…</string>
|
||||
<string name="updater_corrupt_title">应用损坏</string>
|
||||
<string name="updater_corrupt_message">此应用已损坏。请从下方链接的网站中重新下载 APK,然后卸载此应用并重新安装。</string>
|
||||
<string name="updater_corrupt_navigate">打开网站</string>
|
||||
<string name="version_summary">%1$s backend %2$s</string>
|
||||
<string name="version_summary_checking">正在检查 %s backend 版本</string>
|
||||
<string name="version_summary_unknown">未知的 %s 版本</string>
|
||||
|
||||
@@ -94,6 +94,9 @@
|
||||
<string name="tv_select_a_storage_drive">選擇一個儲存裝置</string>
|
||||
<string name="tv_no_file_picker">請安裝一個檔案管理程式以便瀏覽檔案</string>
|
||||
<string name="tv_add_tunnel_get_started">新增第一個通道</string>
|
||||
<string name="donate_title">♥ 捐贈給 WireGuard 專案</string>
|
||||
<string name="donate_summary">任何的貢獻都能幫助我們</string>
|
||||
<string name="donate_google_play_disappointment">感謝您支援 Wireguard 計畫!\n\n由於 Google 的政策不允許我們將計畫官網的捐款連結放在應用程式中,希望您能自行造訪我們的官網來進行捐款!\n\n再次感謝您的貢獻。</string>
|
||||
<string name="disable_config_export_title">禁止匯出設定檔</string>
|
||||
<string name="disable_config_export_description">禁止匯出設定檔可以降低私鑰被存取的機會</string>
|
||||
<string name="dns_servers">DNS 伺服器</string>
|
||||
@@ -103,6 +106,7 @@
|
||||
<string name="error_down">徹下通道錯誤: %s</string>
|
||||
<string name="error_fetching_apps">汲取應用程式清單錯誤: %s</string>
|
||||
<string name="error_root">請取得 root 存取權後再試一次</string>
|
||||
<string name="error_prepare">啟動通道錯誤: %s</string>
|
||||
<string name="error_up">啟動通道錯誤: %s</string>
|
||||
<string name="exclude_private_ips">排除私有 IPs</string>
|
||||
<string name="generate_new_private_key">產生新的私鑰</string>
|
||||
@@ -122,6 +126,8 @@
|
||||
<string name="key_length_explanation_base64">: WireGuard 的 base64 密鑰必須是 44 個字元 (32 個位元組)</string>
|
||||
<string name="key_length_explanation_binary">: WireGuard 密鑰必須是 32 個位元組</string>
|
||||
<string name="key_length_explanation_hex">: WireGuard 的16進位密鑰必須是 64 個字元 (32 個位元組)</string>
|
||||
<string name="latest_handshake">上次交握時間</string>
|
||||
<string name="latest_handshake_ago">%s 之前</string>
|
||||
<string name="listen_port">監聽連接埠</string>
|
||||
<string name="log_export_error">無法匯出日誌: %s</string>
|
||||
<string name="log_export_subject">WireGuard Android 日誌檔</string>
|
||||
@@ -165,6 +171,10 @@
|
||||
<string name="private_key">私鑰</string>
|
||||
<string name="public_key">公鑰</string>
|
||||
<string name="qr_code_hint">提示: 使用 `qrencode -t ansiutf8 < tunnel.conf` 來產生</string>
|
||||
<string name="quick_settings_tile_add_title">新增至快捷設定選單</string>
|
||||
<string name="quick_settings_tile_add_summary">透過快捷設定來開啟 / 關閉最近使用的通道</string>
|
||||
<string name="quick_settings_tile_add_failure">無法新增快捷設定:錯誤 %d</string>
|
||||
<string name="quick_settings_tile_action">開啟 / 關閉通道</string>
|
||||
<string name="restore_on_boot_summary_off">開機時不會啟動已啟用的通道</string>
|
||||
<string name="restore_on_boot_summary_on">開機時啟動已啟用的通道</string>
|
||||
<string name="restore_on_boot_title">開機時復原</string>
|
||||
@@ -200,14 +210,25 @@
|
||||
<string name="tunnel_create_success">成功建立通道 \"%s\"</string>
|
||||
<string name="tunnel_error_already_exists">通道 \"%s\" 已經存在</string>
|
||||
<string name="tunnel_error_invalid_name">無效的名稱</string>
|
||||
<string name="tunnel_list_placeholder">使用下方按鈕添加通道</string>
|
||||
<string name="tunnel_name">通道名稱</string>
|
||||
<string name="tunnel_on_error">無法開啟通道 (wgTurnOn 回傳值: %d)</string>
|
||||
<string name="tunnel_dns_failure">無法解析 DNS 主機名稱: \"%s\"</string>
|
||||
<string name="tunnel_rename_error">無法重新命名通道: %s</string>
|
||||
<string name="tunnel_rename_success">成功重新命名通道 \"%s\"</string>
|
||||
<string name="type_name_go_userspace">去用戶空間</string>
|
||||
<string name="type_name_go_userspace">Go 使用者空間</string>
|
||||
<string name="type_name_kernel_module">核心模組</string>
|
||||
<string name="unknown_error">未知的錯誤</string>
|
||||
<string name="updater_avalable">已有新的更新,請立刻更新。</string>
|
||||
<string name="updater_action">下載 & 更新</string>
|
||||
<string name="updater_rechecking">正在下載更新描述檔...</string>
|
||||
<string name="updater_download_progress">正在下載更新:%1$s / %2$s (%3$.2f%%)</string>
|
||||
<string name="updater_download_progress_nototal">正在下載更新:%s</string>
|
||||
<string name="updater_installing">安裝更新中</string>
|
||||
<string name="updater_failure">更新失敗:%s。稍後將自動重試...</string>
|
||||
<string name="updater_corrupt_title">應用程式已損毀</string>
|
||||
<string name="updater_corrupt_message">此應用程式已損毀。請從下方的網站連結重新下載 APK 安裝檔。在解除安裝此應用程式後,再使用下載的 APK 安裝檔重新安裝。</string>
|
||||
<string name="updater_corrupt_navigate">開啟網站</string>
|
||||
<string name="version_summary">%1$s 後端 %2$s</string>
|
||||
<string name="version_summary_checking">檢查 %s 後端版本</string>
|
||||
<string name="version_summary_unknown">未知的版本 %s</string>
|
||||
|
||||
@@ -185,6 +185,10 @@
|
||||
<string name="private_key">Private key</string>
|
||||
<string name="public_key">Public key</string>
|
||||
<string name="qr_code_hint">Tip: generate with `qrencode -t ansiutf8 < tunnel.conf`.</string>
|
||||
<string name="quick_settings_tile_add_title">Add tile to quick settings panel</string>
|
||||
<string name="quick_settings_tile_add_summary">The shortcut tile toggles the most recent tunnel</string>
|
||||
<string name="quick_settings_tile_add_failure">Unable to add shortcut tile: error %d</string>
|
||||
<string name="quick_settings_tile_action">Toggle tunnel</string>
|
||||
<string name="restore_on_boot_summary_off">Will not bring up enabled tunnels at boot</string>
|
||||
<string name="restore_on_boot_summary_on">Will bring up enabled tunnels at boot</string>
|
||||
<string name="restore_on_boot_title">Restore on boot</string>
|
||||
@@ -236,6 +240,9 @@
|
||||
<string name="updater_download_progress_nototal">Downloading update: %s</string>
|
||||
<string name="updater_installing">Installing update…</string>
|
||||
<string name="updater_failure">Update failure: %s. Will retry momentarily…</string>
|
||||
<string name="updater_corrupt_title">Application Corrupt</string>
|
||||
<string name="updater_corrupt_message">This application is corrupt. Please re-download the APK from the website linked below. After, uninstall this application, and reinstall it from the downloaded APK.</string>
|
||||
<string name="updater_corrupt_navigate">Open Website</string>
|
||||
<string name="version_summary">%1$s backend %2$s</string>
|
||||
<string name="version_summary_checking">Checking %s backend version</string>
|
||||
<string name="version_summary_unknown">Unknown %s version</string>
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
|
||||
<resources>
|
||||
|
||||
<style name="WireGuardTheme" parent="Theme.Material3.Light">
|
||||
<item name="colorPrimary">@color/md_theme_light_primary</item>
|
||||
<item name="colorOnPrimary">@color/md_theme_light_onPrimary</item>
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
android:summaryOn="@string/restore_on_boot_summary_on"
|
||||
android:title="@string/restore_on_boot_title" />
|
||||
<com.wireguard.android.preference.ZipExporterPreference android:key="zip_exporter" />
|
||||
<com.wireguard.android.preference.QuickTilePreference android:key="quick_tile" />
|
||||
<Preference
|
||||
android:key="log_viewer"
|
||||
android:singleLineTitle="false"
|
||||
@@ -40,6 +41,5 @@
|
||||
android:summaryOff="@string/allow_remote_control_intents_summary_off"
|
||||
android:summaryOn="@string/allow_remote_control_intents_summary_on"
|
||||
android:title="@string/allow_remote_control_intents_title" />
|
||||
<com.wireguard.android.preference.DonatePreference
|
||||
android:singleLineTitle="false" />
|
||||
<com.wireguard.android.preference.DonatePreference android:singleLineTitle="false" />
|
||||
</androidx.preference.PreferenceScreen>
|
||||
|
||||
Reference in New Issue
Block a user