Compare commits

...

37 Commits

Author SHA1 Message Date
Jason A. Donenfeld e08d873cc3 version: bump
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
2020-07-24 09:50:31 +02:00
Jason A. Donenfeld 3748a1da88 AdminKnobs: allow enterprise admins to disable private key export
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
2020-07-23 17:35:47 +02:00
Jason A. Donenfeld 9597d719ac build: bump AGP to 4.0.1
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
2020-07-23 16:04:22 +02:00
Harsh Shandilya 041ce2134f build: upgrade to Gradle 6.5.1
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-07-10 15:07:54 +05:30
Harsh Shandilya 4c17fc51e7 gitignore: add gradlew.bat
We do not support building on Windows for now and deleting this file on every wrapper update is just lame

Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-06-25 01:36:31 +05:30
Harsh Shandilya 6cf7439053 gradle: upgrade to 6.5
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-06-25 01:36:30 +05:30
Harsh Shandilya 814ab4937d build: bump core-ktx, coroutines and fragments
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-06-25 01:30:00 +05:30
David Crawshaw 3d088411e2 libwg-go: use conn.Bind for socketfd peek
Signed-off-by: David Crawshaw <crawshaw@tailscale.com>
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
2020-06-22 02:24:55 -06:00
Jason A. Donenfeld 39e0c861e2 tools: bump versions
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
2020-06-07 01:58:02 -06:00
Harsh Shandilya d60efcd7c7 strings: sync translations
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-06-02 17:52:01 +05:30
Harsh Shandilya 4dff537d21 ui: address new databinding requirements
Layouts in differing configurations must agree on their root tags, so we give
both copies of main_activity the same root ID, and adjust the check for
two-pane layout to simply test for nullability. This also changes the inset
dispatch code to use ViewCompat and WindowInsetsCompat since they will adjust
insets based on the SDK level allowing us to abstract away that concern.

Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-05-29 12:25:52 +05:30
Harsh Shandilya 761c2ade4a build: bump to AGP 4.0.0
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-05-29 12:05:24 +05:30
Harsh Shandilya 115a87af32 ui: remove unneeded actionBarPopupTheme attribute
This caused inconsistencies between our overflow icon and actionbar title's tint

Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-05-09 15:49:43 +05:30
Harsh Shandilya c7ecaeb145 build: upgrade to gradle 6.4 and track checksum
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-05-09 13:15:57 +05:30
Jason A. Donenfeld 8e2d63db75 tunnel: add windows-style killswitch semantics for GoBackend
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
2020-05-04 02:30:44 -06:00
Harsh Shandilya 3208bac987 build: upgrade to mdc-android 1.2.0-alpha06
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-04-30 18:21:31 +05:30
Harsh Shandilya fc1f2132fe build: bump gradle wrapper version in task configuration
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-04-27 14:09:37 +05:30
Harsh Shandilya 09125e1e31 libwg-go: bump go version
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-04-26 04:33:41 +05:30
Harsh Shandilya 6b1164ad8d ui: switch up dark theme system bars colors
The status bar color had a subtle transparency applied which caused
inconsistencies, and the navigation bar color was the wrong shade of
gray.

Reported-by: Danny Lin <danny@kdrag0n.dev>
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-04-26 04:30:26 +05:30
Harsh Shandilya c68a5c776b build: bump threetenabp to 1.2.4
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-04-24 19:32:36 +05:30
Harsh Shandilya f3ac787f5a ToolsInstaller: update Magisk directory
/data/adb/modules has been the location for modules since v18.0 and nobody
should reasonably be on any older version anymore. This has continued to
work for this long because Magisk created symlinks for backwards compat. However,
these symlinks are not created anymore on Android 11, which is where this
problem	first surfaced.

Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-04-23 01:40:50 +05:30
Harsh Shandilya 751be2c469 build: don't obfuscate code in minify step
While Play Console correctly manages to deobfuscate stacktraces using the
ProGuard mapping, it makes user recorded logs useless which is rather
undesirable.

Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-04-21 21:36:59 +05:30
Harsh Shandilya cfb7f1b016 ui: tweak fab animation duration
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-04-19 02:17:27 +05:30
Harsh Shandilya 33e07628db build: remove unused cardview dependency
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-04-19 02:09:07 +05:30
Harsh Shandilya b1b7d1d90c build: upgrade AGP, Kotlin, and preference
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-04-19 02:08:41 +05:30
Harsh Shandilya 6cb9548f72 tunnel: disable LongLogTag lint
Should have been part of the patch that disabled this for ui/

Fixes: 8d128cf2e9 ("ui: disable LongLogTag lint")
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-04-19 01:59:51 +05:30
Harsh Shandilya 8207ae1e8d strings: sync translations
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-04-19 01:48:50 +05:30
Harsh Shandilya 48e0e427eb ui: animate fab scale rather than translation
Suggested-by: Jason A. Donenfeld <Jason@zx2c4.com>
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-04-16 23:14:35 +05:30
Jason A. Donenfeld 03e95d2dd3 ObservableTunnel: account for race in renulling stats
The stats might become null between these two checks, when a tunnel
flips off, resulting in a null pointer dereference:

at com.wireguard.android.model.ObservableTunnel.getStatisticsAsync (ObservableTunnel.java:103)
at com.wireguard.android.fragment.TunnelDetailFragment.updateStats (TunnelDetailFragment.java:108)
at com.wireguard.android.fragment.TunnelDetailFragment.access$updateStats (TunnelDetailFragment.java:27)
at com.wireguard.android.fragment.TunnelDetailFragment$onResume$1.run (TunnelDetailFragment.java:74)
at java.util.TimerThread.mainLoop (TimerThread.java:562)
at java.util.TimerThread.run (TimerThread.java:512)

Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
2020-04-15 01:57:55 -06:00
Harsh Shandilya 58b14cc650 ui: animate fab position in tunnel deletion flow
When tunnel deletion is triggered we don't bother with animation theatrics
because the resulting Snackbar needs this fab to be its anchor, which it can't
do if its outside the screen or busy animating.

Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-04-08 19:43:25 +05:30
Harsh Shandilya 3fa8e09545 tunnel: disable BuildConfig generation
We don't (and shouldn't) use BuildConfig values, but the class was
polluting our public API regardless which is undesirable.

Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-04-08 17:05:31 +05:30
Jason A. Donenfeld 9d76b354f0 version: bump
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
2020-04-08 00:02:37 -06:00
Harsh Shandilya 1856a50c56 strings: sync translations
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-04-08 03:37:01 +05:30
Harsh Shandilya ba0f3ece04 ui: tweak FABs to use the correct type
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-04-08 03:34:07 +05:30
Harsh Shandilya e8ad75d924 ui: codestyle nit
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-04-07 14:19:54 +05:30
Jason A. Donenfeld b858284b1e KernelModuleDisablerPreference: do not make synchronous calls to getBackend
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
2020-04-07 02:28:34 -06:00
Jason A. Donenfeld 3c6e06f8d5 ui: set proper content description for applications
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
2020-04-06 19:25:05 -06:00
49 changed files with 863 additions and 255 deletions
+1
View File
@@ -15,3 +15,4 @@ build/
*.iml
*.jks
keystore.properties
gradlew.bat
+10 -10
View File
@@ -8,27 +8,26 @@ allprojects {
buildscript {
ext {
agpVersion = '3.6.2'
agpVersion = '4.0.1'
annotationsVersion = '1.1.0'
appcompatVersion = '1.1.0'
bintrayPluginVersion = '1.8.4'
biometricVersion = '1.0.1'
cardviewVersion = '1.0.0'
collectionVersion = '1.1.0'
constraintLayoutVersion = '1.1.3'
coordinatorLayoutVersion = '1.1.0'
coreKtxVersion = '1.2.0'
coroutinesVersion = '1.3.5'
coreKtxVersion = '1.3.0'
coroutinesVersion = '1.3.7'
eddsaVersion = '0.3.0'
fragmentVersion = '1.2.4'
fragmentVersion = '1.2.5'
jsr305Version = '3.0.2'
junitVersion = '4.13'
kotlinVersion = '1.3.71'
materialComponentsVersion = '1.2.0-alpha05'
kotlinVersion = '1.3.72'
materialComponentsVersion = '1.2.0-alpha06'
mavenPluginVersion = '2.1'
preferenceVersion = '1.1.0'
preferenceVersion = '1.1.1'
streamsupportVersion = '1.7.2'
threetenabpVersion = '1.2.3'
threetenabpVersion = '1.2.4'
zxingEmbeddedVersion = '3.6.0'
groupName = 'com.wireguard.android'
@@ -51,8 +50,9 @@ task clean(type: Delete) {
tasks {
wrapper {
gradleVersion = "6.2.2"
gradleVersion = "6.5.1"
distributionType = Wrapper.DistributionType.ALL
distributionSha256Sum = "143a28f54f1ae93ef4f72d862dbc3c438050d81bb45b4601eb7076e998362920"
}
}
Binary file not shown.
+2 -1
View File
@@ -1,5 +1,6 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-6.3-all.zip
distributionSha256Sum=143a28f54f1ae93ef4f72d862dbc3c438050d81bb45b4601eb7076e998362920
distributionUrl=https\://services.gradle.org/distributions/gradle-6.5.1-all.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
Vendored
+2
View File
@@ -82,6 +82,7 @@ esac
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
# Determine the Java command to use to start the JVM.
if [ -n "$JAVA_HOME" ] ; then
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
@@ -129,6 +130,7 @@ fi
if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
APP_HOME=`cygpath --path --mixed "$APP_HOME"`
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
JAVACMD=`cygpath --unix "$JAVACMD"`
# We build the pattern for arguments to be converted via cygpath
+6
View File
@@ -21,6 +21,9 @@ android {
path 'tools/CMakeLists.txt'
}
}
libraryVariants.all {
it.generateBuildConfigProvider.configure { enabled = false }
}
testOptions.unitTests.all {
testLogging {
events 'passed', 'skipped', 'failed', 'standardOut', 'standardError'
@@ -42,6 +45,9 @@ android {
}
}
}
lintOptions {
disable('LongLogTag')
}
}
dependencies {
@@ -9,6 +9,7 @@ import android.content.Context;
import android.content.Intent;
import android.os.Build;
import android.os.ParcelFileDescriptor;
import android.system.OsConstants;
import android.util.Log;
import com.wireguard.android.backend.BackendException.Reason;
@@ -202,9 +203,19 @@ public final class GoBackend implements Backend {
for (final InetAddress addr : config.getInterface().getDnsServers())
builder.addDnsServer(addr.getHostAddress());
boolean sawDefaultRoute = false;
for (final Peer peer : config.getPeers()) {
for (final InetNetwork addr : peer.getAllowedIps())
for (final InetNetwork addr : peer.getAllowedIps()) {
if (addr.getMask() == 0)
sawDefaultRoute = true;
builder.addRoute(addr.getAddress(), addr.getMask());
}
}
// "Kill-switch" semantics
if (!(sawDefaultRoute && config.getPeers().size() == 1)) {
builder.allowFamily(OsConstants.AF_INET);
builder.allowFamily(OsConstants.AF_INET6);
}
builder.setMtu(config.getInterface().getMtu().orElse(1280));
@@ -143,12 +143,12 @@ public final class ToolsInstaller {
extract();
final StringBuilder script = new StringBuilder("set -ex; ");
script.append("trap 'rm -rf /sbin/.magisk/img/wireguard' INT TERM EXIT; ");
script.append(String.format("rm -rf /sbin/.magisk/img/wireguard/; mkdir -p /sbin/.magisk/img/wireguard%s; ", INSTALL_DIR));
script.append("printf 'name=WireGuard Command Line Tools\nversion=1.0\nversionCode=1\nauthor=zx2c4\ndescription=Command line tools for WireGuard\nminMagisk=1500\n' > /sbin/.magisk/img/wireguard/module.prop; ");
script.append("touch /sbin/.magisk/img/wireguard/auto_mount; ");
script.append("trap 'rm -rf /data/adb/moduleswireguard' INT TERM EXIT; ");
script.append(String.format("rm -rf /data/adb/modules/wireguard/; mkdir -p /data/adb/modules/wireguard%s; ", INSTALL_DIR));
script.append("printf 'name=WireGuard Command Line Tools\nversion=1.0\nversionCode=1\nauthor=zx2c4\ndescription=Command line tools for WireGuard\nminMagisk=1500\n' > /data/adb/modules/wireguard/module.prop; ");
script.append("touch /data/adb/modules/wireguard/auto_mount; ");
for (final String name : EXECUTABLES) {
final File destination = new File("/sbin/.magisk/img/wireguard" + INSTALL_DIR, name);
final File destination = new File("/data/adb/modules/wireguard" + INSTALL_DIR, name);
script.append(String.format("cp '%s' '%s'; chmod 755 '%s'; chcon 'u:object_r:system_file:s0' '%s' || true; ",
new File(localBinaryDir, name), destination, destination, destination));
}
@@ -191,7 +191,7 @@ public final class ToolsInstaller {
synchronized (lock) {
if (installAsMagiskModule == null) {
try {
installAsMagiskModule = rootShell.run(null, "[ -d /sbin/.magisk/mirror -a -d /sbin/.magisk/img -a ! -f /cache/.disable_magisk ]") == OsConstants.EXIT_SUCCESS;
installAsMagiskModule = rootShell.run(null, "[ -d /data/adb/modules -a ! -f /cache/.disable_magisk ]") == OsConstants.EXIT_SUCCESS;
} catch (final Exception ignored) {
installAsMagiskModule = false;
}
+1 -1
View File
@@ -14,7 +14,7 @@ target_link_libraries(libwg-quick.so -ldl)
file(GLOB WG_SOURCES wireguard-tools/src/*.c ndk-compat/compat.c)
add_executable(libwg.so ${WG_SOURCES})
target_include_directories(libwg.so PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/wireguard-tools/src/uapi/" "${CMAKE_CURRENT_SOURCE_DIR}/wireguard-tools/src/")
target_include_directories(libwg.so PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/wireguard-tools/src/uapi/linux/" "${CMAKE_CURRENT_SOURCE_DIR}/wireguard-tools/src/")
target_compile_options(libwg.so PUBLIC -O3 -std=gnu11 -D_GNU_SOURCE -include ${CMAKE_CURRENT_SOURCE_DIR}/ndk-compat/compat.h -DHAVE_VISIBILITY_HIDDEN -DRUNSTATEDIR=\"/data/data/${ANDROID_PACKAGE_NAME}/cache\")
add_custom_target(libwg-go.so WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/libwg-go" COMMENT "Building wireguard-go" VERBATIM COMMAND make
+3 -3
View File
@@ -20,11 +20,11 @@ export GOARCH := $(NDK_GO_ARCH_MAP_$(ANDROID_ARCH_NAME))
export GOOS := android
export CGO_ENABLED := 1
GO_VERSION := 1.14.1
GO_VERSION := 1.14.4
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 := 6632f9d53fd95632e431e8c34295349cca3f0a124e3a28b760ae5c42b32816e3
GO_HASH_linux-amd64 := 2f49eb17ce8b48c680cdb166ffd7389702c0dec6effa090c324804a5cac8a7f8
GO_HASH_darwin-amd64 := 3fa7ed8dc44fdd50c0bfe72676250cceca527d59950aef20af906a670cf88de2
GO_HASH_linux-amd64 := aed845e4185a0b2a3c3d5e1d0a35491702c55889192bb9c30e67a3de6849c067
default: $(DESTDIR)/libwg-go.so
+16 -6
View File
@@ -11,10 +11,6 @@ import "C"
import (
"bufio"
"golang.org/x/sys/unix"
"golang.zx2c4.com/wireguard/device"
"golang.zx2c4.com/wireguard/ipc"
"golang.zx2c4.com/wireguard/tun"
"bytes"
"log"
"math"
@@ -24,6 +20,12 @@ import (
"runtime"
"strings"
"unsafe"
"golang.org/x/sys/unix"
"golang.zx2c4.com/wireguard/conn"
"golang.zx2c4.com/wireguard/device"
"golang.zx2c4.com/wireguard/ipc"
"golang.zx2c4.com/wireguard/tun"
)
type AndroidLogger struct {
@@ -149,7 +151,11 @@ func wgGetSocketV4(tunnelHandle int32) int32 {
if !ok {
return -1
}
fd, err := handle.device.PeekLookAtSocketFd4()
bind, _ := handle.device.Bind().(conn.PeekLookAtSocketFd)
if bind == nil {
return -1
}
fd, err := bind.PeekLookAtSocketFd4()
if err != nil {
return -1
}
@@ -162,7 +168,11 @@ func wgGetSocketV6(tunnelHandle int32) int32 {
if !ok {
return -1
}
fd, err := handle.device.PeekLookAtSocketFd6()
bind, _ := handle.device.Bind().(conn.PeekLookAtSocketFd)
if bind == nil {
return -1
}
fd, err := bind.PeekLookAtSocketFd4()
if err != nil {
return -1
}
+5 -5
View File
@@ -1,10 +1,10 @@
module golang.zx2c4.com/wireguard/android
go 1.13
go 1.14
require (
golang.org/x/crypto v0.0.0-20200320181102-891825fb96df // indirect
golang.org/x/net v0.0.0-20200320220750-118fecf932d8 // indirect
golang.org/x/sys v0.0.0-20200321134203-328b4cd54aae
golang.zx2c4.com/wireguard v0.0.20200320
golang.org/x/crypto v0.0.0-20200604202706-70a84ac30bf9 // indirect
golang.org/x/net v0.0.0-20200602114024-627f9648deb9 // indirect
golang.org/x/sys v0.0.0-20200602225109-6fdc65e7d980
golang.zx2c4.com/wireguard v0.0.20200321-0.20200622004228-b84f1d4db25e
)
+12 -11
View File
@@ -1,19 +1,20 @@
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20191002192127-34f69633bfdc/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20200320181102-891825fb96df h1:lDWgvUvNnaTnNBc/dwOty86cFeKoKWbwy2wQj0gIxbU=
golang.org/x/crypto v0.0.0-20200320181102-891825fb96df/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20200429183012-4b2356b1ed79/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20200604202706-70a84ac30bf9 h1:vEg9joUBmeBcK9iSJftGNf3coIG4HqZElCPehJsfAYM=
golang.org/x/crypto v0.0.0-20200604202706-70a84ac30bf9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20191003171128-d98b1b443823/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200320220750-118fecf932d8 h1:1+zQlQqEEhUeStBTi653GZAnAuivZq/2hz+Iz+OP7rg=
golang.org/x/net v0.0.0-20200320220750-118fecf932d8/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
golang.org/x/net v0.0.0-20200602114024-627f9648deb9 h1:pNX+40auqi2JqRfOP1akLGtYcn15TUbkhwuCO3foqqM=
golang.org/x/net v0.0.0-20200602114024-627f9648deb9/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200321134203-328b4cd54aae h1:3tcmuaB7wwSZtelmiv479UjUB+vviwABz7a133ZwOKQ=
golang.org/x/sys v0.0.0-20200321134203-328b4cd54aae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200501145240-bc7a7d42d5c3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200602225109-6fdc65e7d980 h1:OjiUf46hAmXblsZdnoSXsEUSKU8r1UEzcL5RVZ4gO9Y=
golang.org/x/sys v0.0.0-20200602225109-6fdc65e7d980/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs=
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.zx2c4.com/wireguard v0.0.20200320 h1:1vE6zVeO7fix9cJX1Z9ZQ+ikPIIx7vIyU0o0tLDD88g=
golang.zx2c4.com/wireguard v0.0.20200320/go.mod h1:lDian4Sw4poJ04SgHh35nzMVwGSYlPumkdnHcucAQoY=
golang.zx2c4.com/wireguard v0.0.20200321-0.20200622004228-b84f1d4db25e h1:f8BS3yEMeIGx/zzJfihxDRedx6lT7EiJlfih4j6LY98=
golang.zx2c4.com/wireguard v0.0.20200321-0.20200622004228-b84f1d4db25e/go.mod h1:GJvYs5O24/ASlwPiRklVnjMx2xQzrOic0DuU6GvYJL4=
+2 -3
View File
@@ -21,8 +21,8 @@ android {
}
}
compileSdkVersion 29
dataBinding.enabled true
viewBinding.enabled true
buildFeatures.dataBinding = true
buildFeatures.viewBinding = true
defaultConfig {
applicationId 'com.wireguard.android'
minSdkVersion 21
@@ -68,7 +68,6 @@ dependencies {
implementation project(":tunnel")
implementation "androidx.annotation:annotation:$annotationsVersion"
implementation "androidx.appcompat:appcompat:$appcompatVersion"
implementation "androidx.cardview:cardview:$cardviewVersion"
implementation "androidx.constraintlayout:constraintlayout:$constraintLayoutVersion"
implementation "androidx.coordinatorlayout:coordinatorlayout:$coordinatorLayoutVersion"
implementation "androidx.biometric:biometric:$biometricVersion"
+3 -3
View File
@@ -2,9 +2,6 @@
# escalates them as errors.
-dontwarn sun.misc.Unsafe
# Retain some information to keep stacktraces usable
-keepattributes SourceFile,LineNumberTable
# Fragment 1.2.4 allows Fragment classes to be obfuscated but
# databinding references in XML seem to not be rewritten to
# match, so we preserve the names as 1.2.3 did.
@@ -12,3 +9,6 @@
-keep public class <1> {
public <init>();
}
# Don't obfuscate
-dontobfuscate
+3
View File
@@ -112,5 +112,8 @@
android:name="android.service.quicksettings.ACTIVE_TILE"
android:value="false" />
</service>
<meta-data android:name="android.content.APP_RESTRICTIONS"
android:resource="@xml/app_restrictions" />
</application>
</manifest>
@@ -9,8 +9,9 @@ import android.os.Bundle
import android.view.Menu
import android.view.MenuItem
import android.view.View
import android.widget.LinearLayout
import androidx.appcompat.app.ActionBar
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import androidx.fragment.app.FragmentManager
import androidx.fragment.app.FragmentTransaction
import com.wireguard.android.R
@@ -55,16 +56,15 @@ class MainActivity : BaseActivity(), FragmentManager.OnBackStackChangedListener
super.onCreate(savedInstanceState)
setContentView(R.layout.main_activity)
actionBar = supportActionBar
isTwoPaneLayout = findViewById<View>(R.id.master_detail_wrapper) is LinearLayout
isTwoPaneLayout = findViewById<View?>(R.id.master_detail_wrapper) != null
supportFragmentManager.addOnBackStackChangedListener(this)
onBackStackChanged()
// Dispatch insets on back stack change
// This is required to ensure replaced fragments are also able to consume insets
findViewById<View>(R.id.master_detail_wrapper).setOnApplyWindowInsetsListener { _, insets ->
val fragmentManager = supportFragmentManager
fragmentManager.addOnBackStackChangedListener {
fragmentManager.fragments.forEach {
it.requireView().dispatchApplyWindowInsets(insets)
findViewById<View>(R.id.main_activity_container).setOnApplyWindowInsetsListener { _, insets ->
supportFragmentManager.addOnBackStackChangedListener {
supportFragmentManager.fragments.forEach {
ViewCompat.dispatchApplyWindowInsets(it.requireView(), WindowInsetsCompat.toWindowInsetsCompat(insets))
}
}
insets
@@ -17,6 +17,7 @@ import androidx.preference.PreferenceFragmentCompat
import com.wireguard.android.Application
import com.wireguard.android.R
import com.wireguard.android.backend.WgQuickBackend
import com.wireguard.android.util.AdminKnobs
import com.wireguard.android.util.ModuleLoader
import java.util.ArrayList
import java.util.Arrays
@@ -87,6 +88,10 @@ class SettingsActivity : ThemeChangeAwareActivity() {
val remoteApps = preferenceManager.findPreference<Preference>("allow_remote_control_intents")
remoteApps?.parent?.removePreference(remoteApps)
}
if (AdminKnobs.disableConfigExport) {
val zipExporter = preferenceManager.findPreference<Preference>("zip_exporter")
zipExporter?.parent?.removePreference(zipExporter)
}
val wgQuickOnlyPrefs = arrayOf(
preferenceManager.findPreference("tools_installer"),
preferenceManager.findPreference("restore_on_boot"),
@@ -17,8 +17,10 @@ import java.lang.ref.WeakReference
/**
* A generic `RecyclerView.Adapter` backed by a `ObservableKeyedArrayList`.
*/
class ObservableKeyedRecyclerViewAdapter<K, E : Keyed<out K>> internal constructor(context: Context, private val layoutId: Int,
list: ObservableKeyedArrayList<K, E>?) : RecyclerView.Adapter<ObservableKeyedRecyclerViewAdapter.ViewHolder>() {
class ObservableKeyedRecyclerViewAdapter<K, E : Keyed<out K>> internal constructor(
context: Context, private val layoutId: Int,
list: ObservableKeyedArrayList<K, E>?
) : RecyclerView.Adapter<ObservableKeyedRecyclerViewAdapter.ViewHolder>() {
private val callback = OnListChangedCallback(this)
private val layoutInflater: LayoutInflater = LayoutInflater.from(context)
private var list: ObservableKeyedArrayList<K, E>? = null
@@ -26,6 +26,7 @@ import com.wireguard.android.databinding.TunnelEditorFragmentBinding
import com.wireguard.android.fragment.AppListDialogFragment.AppSelectionListener
import com.wireguard.android.model.ObservableTunnel
import com.wireguard.android.util.BiometricAuthenticator
import com.wireguard.android.util.AdminKnobs
import com.wireguard.android.util.ErrorMessages
import com.wireguard.android.viewmodel.ConfigProxy
import com.wireguard.android.widget.EdgeToEdge.setUpRoot
@@ -252,6 +253,7 @@ class TunnelEditorFragment : BaseFragment(), AppSelectionListener {
val edit = view as? EditText ?: return
if (edit.inputType == InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS or InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD) return
if (!haveShownKeys && edit.text.isNotEmpty()) {
if (AdminKnobs.disableConfigExport) return
showingAuthenticator = true
BiometricAuthenticator.authenticate(R.string.biometric_prompt_private_key_title, this) {
showingAuthenticator = false
@@ -17,6 +17,8 @@ import android.view.Menu
import android.view.MenuItem
import android.view.View
import android.view.ViewGroup
import android.view.animation.Animation
import android.view.animation.AnimationUtils
import androidx.appcompat.app.AppCompatActivity
import androidx.appcompat.view.ActionMode
import com.google.android.material.snackbar.Snackbar
@@ -314,6 +316,11 @@ class TunnelListFragment : BaseFragment() {
return when (item.itemId) {
R.id.menu_action_delete -> {
val copyCheckedItems = HashSet(checkedItems)
binding?.createFab?.apply {
visibility = View.VISIBLE
scaleX = 1f
scaleY = 1f
}
Application.getTunnelManager().tunnels.thenAccept { tunnels ->
val tunnelsToDelete = ArrayList<ObservableTunnel>()
for (position in copyCheckedItems) tunnelsToDelete.add(tunnels[position])
@@ -343,6 +350,7 @@ class TunnelListFragment : BaseFragment() {
if (activity != null) {
resources = activity!!.resources
}
animateFab(binding?.createFab, false)
mode.menuInflater.inflate(R.menu.tunnel_list_action_mode, menu)
binding?.tunnelList?.adapter?.notifyDataSetChanged()
return true
@@ -351,6 +359,7 @@ class TunnelListFragment : BaseFragment() {
override fun onDestroyActionMode(mode: ActionMode) {
actionMode = null
resources = null
animateFab(binding?.createFab, true)
checkedItems.clear()
binding!!.tunnelList.adapter!!.notifyDataSetChanged()
}
@@ -391,6 +400,26 @@ class TunnelListFragment : BaseFragment() {
mode.title = resources!!.getQuantityString(R.plurals.delete_title, count, count)
}
}
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
)
animation.setAnimationListener(object : Animation.AnimationListener {
override fun onAnimationRepeat(animation: Animation?) {
}
override fun onAnimationEnd(animation: Animation?) {
if (!show) view.visibility = View.GONE
}
override fun onAnimationStart(animation: Animation?) {
if (show) view.visibility = View.VISIBLE
}
})
view.startAnimation(animation)
}
}
companion object {
@@ -93,14 +93,14 @@ class ObservableTunnel internal constructor(
@get:Bindable
var statistics: Statistics? = null
get() {
if (field == null || field!!.isStale)
if (field == null || field?.isStale != false)
manager.getTunnelStatistics(this).whenComplete(ExceptionLoggers.E)
return field
}
private set
val statisticsAsync: CompletionStage<Statistics>
get() = if (statistics == null || statistics!!.isStale)
get() = if (statistics == null || statistics?.isStale != false)
manager.getTunnelStatistics(this)
else
CompletableFuture.completedFuture(statistics)
@@ -18,11 +18,18 @@ import java9.util.concurrent.CompletableFuture
import kotlin.system.exitProcess
class KernelModuleDisablerPreference(context: Context, attrs: AttributeSet?) : Preference(context, attrs) {
private var state = if (Application.getBackend() is WgQuickBackend) State.ENABLED else State.DISABLED
private var state = State.UNKNOWN
override fun getSummary() = context.getString(state.summaryResourceId)
init {
isVisible = false
Application.getBackendAsync().thenAccept { backend ->
setState(if (backend is WgQuickBackend) State.ENABLED else State.DISABLED)
}
}
override fun getTitle() = context.getString(state.titleResourceId)
override fun getSummary() = if (state == State.UNKNOWN) "" else context.getString(state.summaryResourceId)
override fun getTitle() = if (state == State.UNKNOWN) "" else context.getString(state.titleResourceId)
@SuppressLint("ApplySharedPref")
override fun onClick() {
@@ -51,13 +58,15 @@ class KernelModuleDisablerPreference(context: Context, attrs: AttributeSet?) : P
if (this.state == state) return
this.state = state
if (isEnabled != state.shouldEnableView) isEnabled = state.shouldEnableView
if (isVisible != state.visible) isVisible = state.visible
notifyChanged()
}
private enum class State(val titleResourceId: Int, val summaryResourceId: Int, val shouldEnableView: Boolean) {
ENABLED(R.string.module_disabler_enabled_title, R.string.module_disabler_enabled_summary, true),
DISABLED(R.string.module_disabler_disabled_title, R.string.module_disabler_disabled_summary, true),
ENABLING(R.string.module_disabler_disabled_title, R.string.success_application_will_restart, false),
DISABLING(R.string.module_disabler_enabled_title, R.string.success_application_will_restart, false);
private enum class State(val titleResourceId: Int, val summaryResourceId: Int, val shouldEnableView: Boolean, val visible: Boolean) {
UNKNOWN(0, 0, false, false),
ENABLED(R.string.module_disabler_enabled_title, R.string.module_disabler_enabled_summary, true, true),
DISABLED(R.string.module_disabler_disabled_title, R.string.module_disabler_disabled_summary, true, true),
ENABLING(R.string.module_disabler_disabled_title, R.string.success_application_will_restart, false, true),
DISABLING(R.string.module_disabler_enabled_title, R.string.success_application_will_restart, false, true);
}
}
@@ -16,6 +16,7 @@ import com.wireguard.android.R
import com.wireguard.android.model.ObservableTunnel
import com.wireguard.android.util.BiometricAuthenticator
import com.wireguard.android.util.DownloadsFileSaver
import com.wireguard.android.util.AdminKnobs
import com.wireguard.android.util.ErrorMessages
import com.wireguard.android.util.FragmentUtils
import java9.util.concurrent.CompletableFuture
@@ -82,6 +83,7 @@ class ZipExporterPreference(context: Context, attrs: AttributeSet?) : Preference
override fun getTitle() = context.getString(R.string.zip_export_title)
override fun onClick() {
if (AdminKnobs.disableConfigExport) return
val prefActivity = FragmentUtils.getPrefActivity(this)
val fragment = prefActivity.supportFragmentManager.fragments.first()
BiometricAuthenticator.authenticate(R.string.biometric_prompt_zip_exporter_title, fragment) {
@@ -0,0 +1,16 @@
/*
* Copyright © 2020 WireGuard LLC. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0
*/
package com.wireguard.android.util
import android.content.RestrictionsManager
import androidx.core.content.getSystemService
import com.wireguard.android.Application
object AdminKnobs {
private val restrictions: RestrictionsManager? = Application.get().getSystemService()
val disableConfigExport: Boolean
get() = restrictions?.applicationRestrictions?.getBoolean("disable_config_export", false) ?: false
}
@@ -12,7 +12,7 @@ import androidx.core.view.marginRight
import androidx.core.view.marginTop
import androidx.core.view.updateLayoutParams
import androidx.core.view.updatePadding
import com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton
import com.google.android.material.floatingactionbutton.FloatingActionButton
/**
* A utility for edge-to-edge display. It provides several features needed to make the app
@@ -27,7 +27,7 @@ object EdgeToEdge {
}
@JvmStatic
fun setUpScrollingContent(scrollingContent: ViewGroup, fab: ExtendedFloatingActionButton?) {
fun setUpScrollingContent(scrollingContent: ViewGroup, fab: FloatingActionButton?) {
val originalPaddingLeft = scrollingContent.paddingLeft
val originalPaddingRight = scrollingContent.paddingRight
val originalPaddingBottom = scrollingContent.paddingBottom
@@ -50,7 +50,7 @@ object EdgeToEdge {
}
@JvmStatic
fun setUpFAB(fab: ExtendedFloatingActionButton) {
fun setUpFAB(fab: FloatingActionButton) {
val originalMarginLeft = fab.marginLeft
val originalMarginRight = fab.marginRight
val originalMarginBottom = fab.marginBottom
+12
View File
@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >
<scale
android:duration="300"
android:fromXScale="1.0"
android:fromYScale="1.0"
android:interpolator="@android:anim/linear_interpolator"
android:pivotX="50%"
android:pivotY="50%"
android:toXScale="0"
android:toYScale="0" />
</set>
+12
View File
@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >
<scale
android:duration="300"
android:fromXScale="0"
android:fromYScale="0"
android:interpolator="@android:anim/linear_interpolator"
android:pivotX="50%"
android:pivotY="50%"
android:toXScale="1.0"
android:toYScale="1.0" />
</set>
@@ -1,6 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/main_activity_container"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".activity.MainActivity">
@@ -16,13 +16,12 @@
tools:itemCount="20"
tools:listitem="@layout/log_viewer_entry" />
<com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton
<com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/share_fab"
style="@style/Widget.MaterialComponents.ExtendedFloatingActionButton.Icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom|end"
android:layout_margin="@dimen/fab_margin"
app:icon="@drawable/ic_action_share_white" />
app:srcCompat="@drawable/ic_action_share_white" />
</androidx.coordinatorlayout.widget.CoordinatorLayout>
+1 -1
View File
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/master_detail_wrapper"
android:id="@+id/main_activity_container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
@@ -236,7 +236,7 @@
style="@style/DetailText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:contentDescription="@string/dns_servers"
android:contentDescription="@string/applications"
android:onClick="@{ClipboardUtils::copyTextView}"
android:text="@{config.interface.includedApplications.isEmpty() ? @plurals/n_excluded_applications(config.interface.excludedApplications.size(), config.interface.excludedApplications.size()) : @plurals/n_included_applications(config.interface.includedApplications.size(), config.interface.includedApplications.size())}"
android:visibility="@{config.interface.includedApplications.isEmpty() &amp;&amp; config.interface.excludedApplications.isEmpty() ? android.view.View.GONE : android.view.View.VISIBLE}"
@@ -66,14 +66,13 @@
android:textSize="20sp" />
</LinearLayout>
<com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton
<com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/create_fab"
style="@style/Widget.MaterialComponents.ExtendedFloatingActionButton.Icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom|end"
android:layout_margin="@dimen/fab_margin"
app:icon="@drawable/ic_action_add_white" />
app:srcCompat="@drawable/ic_action_add_white" />
</androidx.coordinatorlayout.widget.CoordinatorLayout>
</layout>
+60 -26
View File
@@ -24,14 +24,47 @@
<item quantity="one">%d ausgeschlossene Anwendung</item>
<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>
</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="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>
<plurals name="include_n_applications">
<item quantity="one">%d App einbeziehen</item>
<item quantity="other">%d App einbeziehen</item>
</plurals>
<plurals name="exclude_n_applications">
<item quantity="one">%d App ausschließen</item>
<item quantity="other">%d App ausschließen</item>
</plurals>
<plurals name="persistent_keepalive_seconds_unit">
<item quantity="one">jede Sekunde</item>
<item quantity="other">alle %d Sekunden</item>
</plurals>
<plurals name="persistent_keepalive_seconds_suffix">
<item quantity="one">Sekunde</item>
<item quantity="other">Sekunden</item>
</plurals>
<string name="use_all_applications">Alle Apps verwenden</string>
<string name="add_peer">Teilnehmer hinzufügen</string>
<string name="addresses">Adressen</string>
<string name="applications">Anwendungen</string>
<string name="allow_remote_control_intents_summary_off">Externe Apps dürfen keine Tunnel umschalten (empfohlen)</string>
<string name="allow_remote_control_intents_summary_on">Externe Apps dürfen Tunnel umschalten (erweitert)</string>
<string name="allow_remote_control_intents_title">Erlaube Steuerung über externe Apps</string>
<string name="allowed_ips">Erlaubte IPs</string>
<string name="app_name">WireGuard</string>
<string name="bad_config_context">%1$ss %2$s</string>
<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>
@@ -40,8 +73,8 @@
<string name="bad_config_reason_invalid_key">Ungültiger Schlüssel</string>
<string name="bad_config_reason_invalid_number">Ungültige Zahl</string>
<string name="bad_config_reason_invalid_value">Ungültiger Wert</string>
<string name="bad_config_reason_missing_attribute">Attribut fehlt</string>
<string name="bad_config_reason_missing_section">Fehlende Sektion</string>
<string name="bad_config_reason_missing_attribute">Fehlendes Attribut</string>
<string name="bad_config_reason_missing_section">Fehlender Abschnitt</string>
<string name="bad_config_reason_syntax_error">Syntaxfehler</string>
<string name="bad_config_reason_unknown_attribute">Unbekanntes Attribut</string>
<string name="bad_config_reason_unknown_section">Unbekannter Abschnitt</string>
@@ -56,22 +89,22 @@
<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="create_activity_title">WireGuard-Tunnel erstellen</string>
<string name="create_bin_dir_error">Lokales Anwendungsverzeichnis konnte nicht erstellt werden</string>
<string name="create_downloads_file_error">Datei konnte im Download-Verzeichnis nicht erstellt werden</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_from_file">Aus Datei oder Archiv importieren</string>
<string name="create_from_qr_code">Vom QR-Code scannen</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 konnte nicht erstellt werden</string>
<string name="create_temp_dir_error">Lokales temporäres Verzeichnis kann nicht erstellt werden</string>
<string name="create_tunnel">Tunnel erstellen</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_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="delete">Entfernen</string>
<string name="dns_servers">DNS-Server</string>
<string name="edit">Bearbeiten</string>
<string name="endpoint">Endpunkt</string>
<string name="error_down">Fehler beim Herunterfahren des Tunnels: %s</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_up">Fehler beim Starten des Tunnels: %s</string>
@@ -87,38 +120,38 @@
<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">Schnittstelle</string>
<string name="key_contents_error">Falsche Zeichen in Schlüssel</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_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="log_export_error">Fehler beim Exportieren des Logs: %s</string>
<string name="log_export_subject">WireGuard Android Log Datei</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">Log speichern</string>
<string name="log_viewer_pref_summary">Logs können beim Debuggen helfen</string>
<string name="log_viewer_pref_title">Protokoll der Anwendung anzeigen</string>
<string name="log_viewer_title">Loggen</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_title">Anwendungs-Protokoll anzeigen</string>
<string name="log_viewer_title">Protokoll</string>
<string name="logcat_error">Konnte logcat nicht ausführen: </string>
<string name="module_disabler_disabled_summary">Das experimentelle Kernelmodul kann die Leistung verbessern</string>
<string name="module_disabler_disabled_title">Kernelmodul-Backend aktivieren</string>
<string name="module_disabler_enabled_summary">Das langsamere Userspace-Backend kann die Stabilität verbessern</string>
<string name="module_disabler_enabled_title">Kernelmodul-Backend deaktivieren</string>
<string name="module_installer_error">Es ist etwas schief gelaufen. Bitte versuchen Sie es später erneut</string>
<string name="module_installer_error">Es ist ein Fehler aufgetreten. Bitte versuchen Sie es erneut</string>
<string name="module_installer_initial">Das experimentelle Kernelmodul kann die Leistung verbessern</string>
<string name="module_installer_not_found">Für Ihr Gerät sind keine Module verfügbar</string>
<string name="module_installer_title">Kernelmodul herunterladen und installieren</string>
<string name="module_installer_working">Herunterladen und Installieren…</string>
<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">Einschalten eines Tunnels wird andere ausschalten</string>
<string name="multiple_tunnels_summary_on">Mehrere Tunnel können gleichzeitig aktiviert werden</string>
<string name="multiple_tunnels_title">Erlaube mehrere Tunnel gleichzeitig</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="name">Name</string>
<string name="no_config_error">Versucht einen Tunnel ohne Konfiguration zu starten</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>
<string name="no_tunnels_error">Keine Tunnel vorhanden</string>
<string name="parse_error_generic">String (Zeichenkette)</string>
@@ -132,11 +165,12 @@
<string name="permission_label">WireGuard-Tunnel steuern</string>
<string name="persistent_keepalive">Dauerhafte Erhaltung</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 &lt; tunnel.conf` generieren.</string>
<string name="restore_on_boot_summary_off">Wird aktivierte Tunnel beim Systemstart nicht automatisch starten</string>
<string name="restore_on_boot_summary_on">Wird aktivierte Tunnel beim Systemstart automatisch wieder starten</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>
+229
View File
@@ -0,0 +1,229 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<plurals name="delete_error">
<item quantity="one">Impossible de supprimer %d tunnel : %s</item>
<item quantity="other">Impossible de supprimer %d tunnels : %s</item>
</plurals>
<plurals name="delete_success">
<item quantity="one">Supprimé avec succès %d tunnel</item>
<item quantity="other">Supprimé avec succès %d tunnels</item>
</plurals>
<plurals name="delete_title">
<item quantity="one">%d tunnel sélectionné</item>
<item quantity="other">%d tunnels sélectionnés</item>
</plurals>
<plurals name="import_partial_success">
<item quantity="one">%1$d de %2$d tunnels importés</item>
<item quantity="other">%1$d de %2$d tunnels importés</item>
</plurals>
<plurals name="import_total_success">
<item quantity="one">%d tunnel importé</item>
<item quantity="other">%d tunnels importés</item>
</plurals>
<plurals name="set_excluded_applications">
<item quantity="one">%d application exclue</item>
<item quantity="other">%d applications exclues</item>
</plurals>
<plurals name="set_included_applications">
<item quantity="one">%d application incluse</item>
<item quantity="other">%d applications incluses</item>
</plurals>
<plurals name="n_excluded_applications">
<item quantity="one">%d exclue</item>
<item quantity="other">%d exclues</item>
</plurals>
<plurals name="n_included_applications">
<item quantity="one">%d incluse</item>
<item quantity="other">%d incluses</item>
</plurals>
<string name="all_applications">Toutes les Applications</string>
<string name="exclude_from_tunnel">Exclure</string>
<string name="include_in_tunnel">Inclure uniquement</string>
<plurals name="include_n_applications">
<item quantity="one">Inclure %d application</item>
<item quantity="other">Inclure %d applications</item>
</plurals>
<plurals name="exclude_n_applications">
<item quantity="one">Exclure %d application</item>
<item quantity="other">Exclure %d applications</item>
</plurals>
<plurals name="persistent_keepalive_seconds_unit">
<item quantity="one">chaque seconde</item>
<item quantity="other">tous les %d secondes</item>
</plurals>
<plurals name="persistent_keepalive_seconds_suffix">
<item quantity="one">seconde</item>
<item quantity="other">secondes</item>
</plurals>
<string name="use_all_applications">Utiliser toutes les applications</string>
<string name="add_peer">Ajouter un pair</string>
<string name="addresses">Adresses</string>
<string name="applications">Applications</string>
<string name="allow_remote_control_intents_summary_off">Les applications externes ne peuvent pas activer les tunnels (recommandé)</string>
<string name="allow_remote_control_intents_summary_on">Les applications externes peuvent activer les tunnels (avancés)</string>
<string name="allow_remote_control_intents_title">Autoriser les applications de contrôle à distance</string>
<string name="allowed_ips">Adresses IP autorisées</string>
<string name="app_name">WireGuard</string>
<string name="bad_config_context">%1$s de %2$s</string>
<string name="bad_config_context_top_level">%s</string>
<string name="bad_config_error">%1$s dans %2$s</string>
<string name="bad_config_explanation_pka">: Doit être positif et ne pas dépasser 65535</string>
<string name="bad_config_explanation_positive_number">: Doit être positif</string>
<string name="bad_config_explanation_udp_port">: Doit être un numéro de port UDP valide</string>
<string name="bad_config_reason_invalid_key">Clef invalide</string>
<string name="bad_config_reason_invalid_number">Numéro invalide</string>
<string name="bad_config_reason_invalid_value">Valeur invalide</string>
<string name="bad_config_reason_missing_attribute">Attribut manquant</string>
<string name="bad_config_reason_missing_section">Section manquante</string>
<string name="bad_config_reason_syntax_error">Erreur de syntaxe</string>
<string name="bad_config_reason_unknown_attribute">Attribut inconnu</string>
<string name="bad_config_reason_unknown_section">Section inconnue</string>
<string name="bad_config_reason_value_out_of_range">Valeur hors limite</string>
<string name="bad_extension_error">Le fichier doit être .conf ou .zip</string>
<string name="cancel">Annuler</string>
<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="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_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>
<string name="dark_theme_summary_off">Utilisation en cours du thème clair (jour)</string>
<string name="dark_theme_summary_on">Utilisation en cours du thème sombre (nuit)</string>
<string name="dark_theme_title">Utilisez le thème sombre</string>
<string name="delete">Supprimer</string>
<string name="dns_servers">Serveurs DNS</string>
<string name="edit">Modifier</string>
<string name="endpoint">Point de terminaison</string>
<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_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>
<string name="generic_error">Erreur inconnue « %s »</string>
<string name="hint_automatic">(auto)</string>
<string name="hint_generated">(généré)</string>
<string name="hint_optional">(facultatif)</string>
<string name="hint_optional_discouraged">(facultatif, non recommandé)</string>
<string name="hint_random">(aléatoire)</string>
<string name="illegal_filename_error">Nom de fichier invalide “%s”</string>
<string name="import_error">Impossible d\'importer le tunnel : %s</string>
<string name="import_from_qr_code">Importer un tunnel depuis un QR-code</string>
<string name="import_success">Importé «%s »</string>
<string name="interface_title">Interface</string>
<string name="key_contents_error">Mauvais caractères dans la clé</string>
<string name="key_length_error">Longueur de la clé incorrecte</string>
<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="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>
<string name="log_export_success">Enregistré dans « %s »</string>
<string name="log_export_title">Exporter le fichier journal</string>
<string name="log_saver_activity_label">Enregistrer le journal</string>
<string name="log_viewer_pref_summary">Les journaux peuvent aider au débogage</string>
<string name="log_viewer_pref_title">Afficher le journal de l\'application</string>
<string name="log_viewer_title">Journal</string>
<string name="logcat_error">Impossible d\'exécuter logcat : </string>
<string name="module_disabler_disabled_summary">Le module expérimental du noyau peut améliorer les performances</string>
<string name="module_disabler_disabled_title">Activer le backend du module du noyau</string>
<string name="module_disabler_enabled_summary">Le backend plus lent de l\'espace utilisateur peut améliorer la stabilité</string>
<string name="module_disabler_enabled_title">Désactiver le backend du module du noyau</string>
<string name="module_installer_error">Une erreur est survenue. Veuillez réessayer</string>
<string name="module_installer_initial">Le module expérimental du noyau peut améliorer les performances</string>
<string name="module_installer_not_found">Aucun module n\'est disponible pour votre appareil</string>
<string name="module_installer_title">Télécharger et installer le module du noyau</string>
<string name="module_installer_working">Téléchargement et installation en cours…</string>
<string name="module_version_error">Impossible de déterminer la version du module noyau</string>
<string name="mtu">MTU</string>
<string name="multiple_tunnels_summary_off">Activer un tunnel éteindra les autres</string>
<string name="multiple_tunnels_summary_on">Plusieurs tunnels peuvent être activés simultanément</string>
<string name="multiple_tunnels_title">Autoriser plusieurs tunnels simultanés</string>
<string name="name">Nom</string>
<string name="no_config_error">Tentative d\'établir un tunnel sans configuration</string>
<string name="no_configs_error">Aucune configuration trouvée</string>
<string name="no_tunnels_error">Aucun tunnel existant</string>
<string name="parse_error_generic">chaîne de caractères</string>
<string name="parse_error_inet_address">Adresse IP</string>
<string name="parse_error_inet_endpoint">point de terminaison</string>
<string name="parse_error_inet_network">Réseau IP</string>
<string name="parse_error_integer">nombre</string>
<string name="parse_error_reason">Impossible d\'analyser %1$s “%2$s”</string>
<string name="peer">Pair</string>
<string name="permission_description">contrôler les tunnels WireGuard, activer et désactiver les tunnels à volonté, potentiellement détourner le trafic Internet</string>
<string name="permission_label">contrôler les tunnels WireGuard</string>
<string name="persistent_keepalive">Maintien de connexion permanente</string>
<string name="pre_shared_key">Clé pré-partagée</string>
<string name="pre_shared_key_enabled">activée</string>
<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 &lt; tunnel.conf\".</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>
<string name="save">Enregistrer</string>
<string name="select_all">Tout sélectionner</string>
<string name="settings">Paramètres</string>
<string name="shell_exit_status_read_error">L\'interpréteur de commande ne peut pas lire l\'état de sortie</string>
<string name="shell_marker_count_error">L\'interpréteur de commandes attendait 4 marqueurs, %d reçus</string>
<string name="shell_start_error">L\'interpréteur de commande n\'a pas pu démarrer : %d</string>
<string name="success_application_will_restart">Succès. L\'application va redémarrer maintenant…</string>
<string name="toggle_all">Tout basculer</string>
<string name="toggle_error">Erreur lors de l\'activation du tunnel WireGuard : %s</string>
<string name="tools_installer_already">wg et wg-quick sont déjà installés</string>
<string name="tools_installer_failure">Impossible d\'installer les outils en ligne de commande (pas de root?)</string>
<string name="tools_installer_initial">Installer les outils optionnels pour le script</string>
<string name="tools_installer_initial_magisk">Installer les outils optionnels pour le script en tant que module Magisk</string>
<string name="tools_installer_initial_system">Installer les outils optionnels pour le script dans la partition système</string>
<string name="tools_installer_success_magisk">wg et wg-quick installés en tant que module Magisk (redémarrage requis)</string>
<string name="tools_installer_success_system">wg et wg-quick installés dans la partition système</string>
<string name="tools_installer_title">Installer les outils de ligne de commande</string>
<string name="tools_installer_working">Installation de wg et wg-quick</string>
<string name="tools_unavailable_error">Outils requis indisponibles</string>
<string name="transfer">Transférer</string>
<string name="transfer_bytes">%d Octets</string>
<string name="transfer_gibibytes">%.2f Go</string>
<string name="transfer_kibibytes">%.2f Ko</string>
<string name="transfer_mibibytes">%.2f Mo</string>
<string name="transfer_rx_tx">rx: %1$s, tx: %2$s</string>
<string name="transfer_tibibytes">%.2f To</string>
<string name="tun_create_error">Impossible de créer le périphérique tun</string>
<string name="tunnel_config_error">Impossible de configurer le tunnel (wg-quick a retourné %d)</string>
<string name="tunnel_create_error">Impossible de créer le tunnel : %s</string>
<string name="tunnel_create_success">Tunnel «%s » créé avec succès</string>
<string name="tunnel_error_already_exists">Le tunnel « %s » existe déjà</string>
<string name="tunnel_error_invalid_name">Nom invalide</string>
<string name="tunnel_list_placeholder">Ajouter un tunnel en utilisant le bouton bleu</string>
<string name="tunnel_name">Nom du tunnel</string>
<string name="tunnel_on_error">Impossible d\'activer le tunnel (wgTurnOn a retourné %d)</string>
<string name="tunnel_rename_error">Impossible de renommer le tunnel : %s</string>
<string name="tunnel_rename_success">Tunnel renommé avec succès en «%s »</string>
<string name="type_name_go_userspace">Nom de l\'espace utilisateur</string>
<string name="type_name_kernel_module">Module noyau</string>
<string name="unknown_error">Erreur inconnue</string>
<string name="version_summary">%1$s backend v%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>
<string name="version_title">WireGuard pour Android v%s</string>
<string name="vpn_not_authorized_error">Service VPN non autorisé par l\'utilisateur</string>
<string name="vpn_start_error">Impossible de démarrer le service VPN Android</string>
<string name="zip_export_error">Impossible d\'exporter les tunnels : %s</string>
<string name="zip_export_success">Enregistré dans « %s »</string>
<string name="zip_export_summary">L\'archive zip sera sauvegardée dans le dossier de téléchargement</string>
<string name="zip_export_title">Exporter les tunnels vers le fichier zip</string>
<string name="biometric_prompt_zip_exporter_title">S\'authentifier pour exporter des tunnels</string>
<string name="biometric_prompt_private_key_title">S\'authentifier pour voir la clé privée</string>
<string name="biometric_auth_error">Échec de l\'authentification</string>
<string name="biometric_auth_error_reason">Échec de l\'authentification : %s</string>
</resources>
+32 -5
View File
@@ -18,10 +18,36 @@
<plurals name="set_excluded_applications">
<item quantity="other">%d Aplikasi Dikecualikan</item>
</plurals>
<plurals name="set_included_applications">
<item quantity="other">%d Aplikasi Dikecualikan</item>
</plurals>
<plurals name="n_excluded_applications">
<item quantity="other">%d dikecualikan</item>
</plurals>
<plurals name="n_included_applications">
<item quantity="other">%d termasuk</item>
</plurals>
<string name="all_applications">Semua aplikasi</string>
<string name="exclude_from_tunnel">Kecualikan</string>
<string name="include_in_tunnel">Berlaku hanya untuk</string>
<plurals name="include_n_applications">
<item quantity="other">Aplikasi %d yang disertakan</item>
</plurals>
<plurals name="exclude_n_applications">
<item quantity="other">Aplikasi %d yang disertakan</item>
</plurals>
<plurals name="persistent_keepalive_seconds_unit">
<item quantity="other">setiap 10 detik</item>
</plurals>
<plurals name="persistent_keepalive_seconds_suffix">
<item quantity="other">detik</item>
</plurals>
<string name="use_all_applications">Gunakan semua aplikasi</string>
<string name="add_peer">Tambahkan rekan</string>
<string name="addresses">Alamat</string>
<string name="allow_remote_control_intents_summary_off">Apl eksternal tidak dapat mengalihkan terowongan (disarankan)</string>
<string name="allow_remote_control_intents_summary_on">Apl eksternal dapat mengalihkan terowongan (lanjutan)</string>
<string name="applications">Aplikasi</string>
<string name="allow_remote_control_intents_summary_off">Apl eksternal tidak dapat mengalihkan tunnel (disarankan)</string>
<string name="allow_remote_control_intents_summary_on">Apl eksternal dapat mengalihkan tunnel (lanjutan)</string>
<string name="allow_remote_control_intents_title">Izinkan apl kendali jarak jauh</string>
<string name="allowed_ips">IP diizinkan</string>
<string name="app_name">WireGuard</string>
@@ -64,11 +90,11 @@
<string name="delete">Hapus</string>
<string name="dns_servers">Server DNS</string>
<string name="edit">Edit</string>
<string name="endpoint">Titik akhir</string>
<string name="error_down">Kesalahan mengurangi tunel: %s</string>
<string name="endpoint">Endpoint</string>
<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_up">Kesalahan menambahkan 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>
<string name="generic_error">Eror “%s” Tidak diketahui</string>
@@ -126,6 +152,7 @@
<string name="permission_label">Kontrol tunel WireGuard</string>
<string name="persistent_keepalive">Keepalive persisten</string>
<string name="pre_shared_key">Kunci Pra-bersama</string>
<string name="pre_shared_key_enabled">diaktifkan</string>
<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 &lt; tunnel.conf`.</string>
+34
View File
@@ -24,8 +24,41 @@
<item quantity="one">%d applicazione esclusa</item>
<item quantity="other">%d applicazioni escluse</item>
</plurals>
<plurals name="set_included_applications">
<item quantity="one">%d applicazione esclusa</item>
<item quantity="other">%d applicazioni incluse</item>
</plurals>
<plurals name="n_excluded_applications">
<item quantity="one">%d escluse</item>
<item quantity="other">%d escluse</item>
</plurals>
<plurals name="n_included_applications">
<item quantity="one">%d escluse</item>
<item quantity="other">%d incluse</item>
</plurals>
<string name="all_applications">Tutte le applicazioni</string>
<string name="exclude_from_tunnel">Escludi</string>
<string name="include_in_tunnel">Includi solo</string>
<plurals name="include_n_applications">
<item quantity="one">Includi %d applicazione</item>
<item quantity="other">Includi %d applicazioni</item>
</plurals>
<plurals name="exclude_n_applications">
<item quantity="one">Escludi %d applicazione</item>
<item quantity="other">Escludi %d applicazioni</item>
</plurals>
<plurals name="persistent_keepalive_seconds_unit">
<item quantity="one">ogni secondo</item>
<item quantity="other">ogni %d secondi</item>
</plurals>
<plurals name="persistent_keepalive_seconds_suffix">
<item quantity="one">secondo</item>
<item quantity="other">secondi</item>
</plurals>
<string name="use_all_applications">Utilizza tutte le applicazioni</string>
<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>
@@ -132,6 +165,7 @@
<string name="permission_label">controlla tunnel WireGuard</string>
<string name="persistent_keepalive">Tieni sempre attivo</string>
<string name="pre_shared_key">Chiave condivisa (PSK)</string>
<string name="pre_shared_key_enabled">abilitata</string>
<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 &lt; tunnel.conf`.</string>
+28 -1
View File
@@ -18,8 +18,34 @@
<plurals name="set_excluded_applications">
<item quantity="other">除外アプリ %d 個</item>
</plurals>
<plurals name="set_included_applications">
<item quantity="other">トンネリング対象アプリ %d 個</item>
</plurals>
<plurals name="n_excluded_applications">
<item quantity="other">対象外アプリ %d 個</item>
</plurals>
<plurals name="n_included_applications">
<item quantity="other">トンネル対象アプリ %d 個</item>
</plurals>
<string name="all_applications">すべてのアプリがトンネル対象</string>
<string name="exclude_from_tunnel">トンネルしない</string>
<string name="include_in_tunnel">トンネルする</string>
<plurals name="include_n_applications">
<item quantity="other">%d アプリが対象</item>
</plurals>
<plurals name="exclude_n_applications">
<item quantity="other">%d アプリを除外</item>
</plurals>
<plurals name="persistent_keepalive_seconds_unit">
<item quantity="other">%d 秒ごと</item>
</plurals>
<plurals name="persistent_keepalive_seconds_suffix">
<item quantity="other">秒</item>
</plurals>
<string name="use_all_applications">全アプリをトンネル対象にする</string>
<string name="add_peer">ピアを追加する</string>
<string name="addresses">アドレス</string>
<string name="applications">アプリ</string>
<string name="allow_remote_control_intents_summary_off">外部アプリはトンネルを制御できない(推奨)</string>
<string name="allow_remote_control_intents_summary_on">外部アプリにトンネルの制御を許可(上級者向け)</string>
<string name="allow_remote_control_intents_title">外部アプリからの制御</string>
@@ -126,6 +152,7 @@
<string name="permission_label">WireGuard トンネルの制御</string>
<string name="persistent_keepalive">持続的キープアライブ</string>
<string name="pre_shared_key">事前共有鍵</string>
<string name="pre_shared_key_enabled">有効</string>
<string name="private_key">秘密鍵</string>
<string name="public_key">公開鍵</string>
<string name="qr_code_hint">Tip: `qrencode -t ansiutf8 &lt; tunnel.conf` で生成できます</string>
@@ -139,7 +166,7 @@
<string name="shell_marker_count_error">シェルは 4 マーカーを期待していますが、 %d マーカーを受け取りました</string>
<string name="shell_start_error">シェルの起動に失敗しました: %d</string>
<string name="success_application_will_restart">成功。アプリケーションは再起動します…</string>
<string name="toggle_all">すべてのトンネルの状態を切り替え</string>
<string name="toggle_all">すべての状態を切り替え</string>
<string name="toggle_error">WireGuard トンネルの状態切り替え時にエラー: %s</string>
<string name="tools_installer_already">wg および wg-quick はインストール済みです</string>
<string name="tools_installer_failure">コマンドラインツールをインストールできません(root権限がない?)</string>
+2 -2
View File
@@ -12,8 +12,8 @@
<!-- Theme variables -->
<color name="list_multiselect_background">#1aeeeeee</color>
<color name="status_bar_color">#21242424</color>
<color name="navigation_bar_color">#aa242424</color>
<color name="status_bar_color">@color/primary_color</color>
<color name="navigation_bar_color">#aa212121</color>
<!-- Log viewer tag colors -->
<color name="debug_tag_color">#aaaaaa</color>
+54 -6
View File
@@ -2,31 +2,31 @@
<resources>
<plurals name="delete_error">
<item quantity="one">Не удалось удалить %d туннель: %s</item>
<item quantity="few">Не удалось удалить %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="one">Успешно удален %d туннель</item>
<item quantity="few">Успешно удалено %d туннелей</item>
<item quantity="few">Успешно удалено %d туннеля</item>
<item quantity="many">Успешно удалено %d туннелей</item>
<item quantity="other">Успешно удалено %d туннелей</item>
</plurals>
<plurals name="delete_title">
<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>
<plurals name="import_partial_success">
<item quantity="one">Импортирован %1$d из %2$d туннелей</item>
<item quantity="few">Импортировано %1$d из %2$d туннелей</item>
<item quantity="few">Импортировано %1$d из %2$d туннеля</item>
<item quantity="many">Импортировано %1$d из %2$d туннелей</item>
<item quantity="other">Импортировано %1$d из %2$d туннелей</item>
</plurals>
<plurals name="import_total_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>
@@ -36,8 +36,55 @@
<item quantity="many">%d Исключенных приложений</item>
<item quantity="other">%d Исключенных приложений</item>
</plurals>
<plurals name="set_included_applications">
<item quantity="one">%d Включенное приложение</item>
<item quantity="few">%d Включенных приложений</item>
<item quantity="many">%d Включенных приложений</item>
<item quantity="other">%d Включенных приложений</item>
</plurals>
<plurals name="n_excluded_applications">
<item quantity="one">%d исключен</item>
<item quantity="few">%d исключено</item>
<item quantity="many">%d исключено</item>
<item quantity="other">%d исключено</item>
</plurals>
<plurals name="n_included_applications">
<item quantity="one">%d влючен</item>
<item quantity="few">%d включено</item>
<item quantity="many">%d включено</item>
<item quantity="other">%d включено</item>
</plurals>
<string name="all_applications">Все приложения</string>
<string name="exclude_from_tunnel">Исключить</string>
<string name="include_in_tunnel">Только включить</string>
<plurals name="include_n_applications">
<item quantity="one">Включить %d приложение</item>
<item quantity="few">Включить %d приложения</item>
<item quantity="many">Включить %d приложений</item>
<item quantity="other">Включить %d приложений</item>
</plurals>
<plurals name="exclude_n_applications">
<item quantity="one">Исключить %d приложение</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="one">каждую %d секунду</item>
<item quantity="few">каждые %d секунды</item>
<item quantity="many">каждые %d секунд</item>
<item quantity="other">каждые %d секунд</item>
</plurals>
<plurals name="persistent_keepalive_seconds_suffix">
<item quantity="one">секунда</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">IP-адреса</string>
<string name="applications">Приложения</string>
<string name="allow_remote_control_intents_summary_off">Сторонние приложения не могут переключать туннели (рекомендуется)</string>
<string name="allow_remote_control_intents_summary_on">Сторонние приложения могут переключать туннели (дополнительно)</string>
<string name="allow_remote_control_intents_title">Доступ к другим приложениям</string>
@@ -128,7 +175,7 @@
<string name="mtu">MTU</string>
<string name="multiple_tunnels_summary_off">Только один туннель, выключит другие</string>
<string name="multiple_tunnels_summary_on">Могут быть включены несколько туннелей одновременно</string>
<string name="multiple_tunnels_title">Несколько одновременных туннелей</string>
<string name="multiple_tunnels_title">Несколько туннелей</string>
<string name="name">Имя</string>
<string name="no_config_error">Попытка поднять туннель без конфигурации</string>
<string name="no_configs_error">Конфигурации не найдены</string>
@@ -144,6 +191,7 @@
<string name="permission_label">управлять туннелями WireGuard</string>
<string name="persistent_keepalive">Постоянное соединение</string>
<string name="pre_shared_key">Общий ключ</string>
<string name="pre_shared_key_enabled">включено</string>
<string name="private_key">Приватный ключ</string>
<string name="public_key">Публичный ключ</string>
<string name="qr_code_hint">Совет: генерировать с `qrencode -t ansiutf8 &lt; tunnel.conf`.</string>
+175 -127
View File
@@ -1,10 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<plurals name="delete_error">
<item quantity="one">%d Tunela ni bilo mogoče izbrisati: %s</item>
<item quantity="two">%d Tunelov ni bilo mogoče izbrisati: %s</item>
<item quantity="few">%d Tunelov ni bilo mogoče izbrisati: %s</item>
<item quantity="other">%d Tunelov ni bilo mogoče izbrisati: %s</item>
<item quantity="one">%d tunela ni bilo mogoče izbrisati: %s</item>
<item quantity="two">%d tunelov ni bilo mogoče izbrisati: %s</item>
<item quantity="few">%d tunelov ni bilo mogoče izbrisati: %s</item>
<item quantity="other">%d tunelov ni bilo mogoče izbrisati: %s</item>
</plurals>
<plurals name="delete_success">
<item quantity="one">%d tunel uspešno izbrisan</item>
@@ -19,16 +19,16 @@
<item quantity="other">%d tunelov izbranih</item>
</plurals>
<plurals name="import_partial_success">
<item quantity="one">%1$d od %2$d tunelov uvožen</item>
<item quantity="two">%1$d od %2$d tunelov uvožena</item>
<item quantity="few">%1$d od %2$d tunelov uvoženi</item>
<item quantity="other">%1$d od %2$d tunelov uvoženih</item>
<item quantity="one">%1$d tunel od %2$d uvožen</item>
<item quantity="two">%1$d tunela od %2$d uvožena</item>
<item quantity="few">%1$d tuneli od %2$d uvoženi</item>
<item quantity="other">%1$d tunelov od %2$d uvoženih</item>
</plurals>
<plurals name="import_total_success">
<item quantity="one">%d Tunel uvožen</item>
<item quantity="two">%d Tunela uvožena </item>
<item quantity="few">%d Tuneli uvoženi </item>
<item quantity="other">%d Tunelov uvoženih </item>
<item quantity="one">%d tunel uvožen</item>
<item quantity="two">%d tunela uvožena</item>
<item quantity="few">%d tuneli uvoženi</item>
<item quantity="other">%d tunelov uvoženih</item>
</plurals>
<plurals name="set_excluded_applications">
<item quantity="one">%d izvzeta aplikacija</item>
@@ -36,172 +36,220 @@
<item quantity="few">%d izvzete aplikacije</item>
<item quantity="other">%d izvzetih aplikacij</item>
</plurals>
<string name="add_peer">Dodaj soležnike</string>
<plurals name="set_included_applications">
<item quantity="one">%d vključena aplikacija</item>
<item quantity="two">%d vključeni aplikaciji</item>
<item quantity="few">%d vključene aplikacije</item>
<item quantity="other">%d vključenih aplikacij</item>
</plurals>
<plurals name="n_excluded_applications">
<item quantity="one">%d izvzeta</item>
<item quantity="two">%d izvzeti</item>
<item quantity="few">%d izvzete</item>
<item quantity="other">%d izvzetih</item>
</plurals>
<plurals name="n_included_applications">
<item quantity="one">%d vključena</item>
<item quantity="two">%d vključeni</item>
<item quantity="few">%d vključene</item>
<item quantity="other">%d vključenih</item>
</plurals>
<string name="all_applications">Vse aplikacije</string>
<string name="exclude_from_tunnel">Izvzemi</string>
<string name="include_in_tunnel">Vključi samo za</string>
<plurals name="include_n_applications">
<item quantity="one">Vključi za %d aplikacijo</item>
<item quantity="two">Vključi za %d aplikaciji</item>
<item quantity="few">Vključi za %d aplikacije</item>
<item quantity="other">Vključi za %d aplikacij</item>
</plurals>
<plurals name="exclude_n_applications">
<item quantity="one">Izvzemi %d aplikacijo</item>
<item quantity="two">Izvzemi %d aplikaciji</item>
<item quantity="few">Izvzemi %d aplikacije</item>
<item quantity="other">Izvzemi %d aplikacij</item>
</plurals>
<plurals name="persistent_keepalive_seconds_unit">
<item quantity="one">vsako %d sekundo</item>
<item quantity="two">vsaki %d sekundi</item>
<item quantity="few">vsake %d sekunde</item>
<item quantity="other">vsakih %d sekund</item>
</plurals>
<plurals name="persistent_keepalive_seconds_suffix">
<item quantity="one">sekunda</item>
<item quantity="two">sekundi</item>
<item quantity="few">sekunde</item>
<item quantity="other">sekund</item>
</plurals>
<string name="use_all_applications">Vse aplikacije</string>
<string name="add_peer">Dodaj vrstnike</string>
<string name="addresses">Naslovi</string>
<string name="allow_remote_control_intents_summary_off">Zunanjim aplikacijam ni dovoljeno preklopiti tunela (priporočeno) </string>
<string name="allow_remote_control_intents_summary_on">Zunanje aplikacije lahko preklopijo tunel (napredno)</string>
<string name="allow_remote_control_intents_title">Dovoljeno upravljanje preko zunanji aplikacij</string>
<string name="allowed_ips">Dovoljeni IP naslovi</string>
<string name="applications">Aplikacije</string>
<string name="allow_remote_control_intents_summary_off">Zunanjim aplikacijam ni dovoljeno preklapljati tunelov (priporočeno)</string>
<string name="allow_remote_control_intents_summary_on">Zunanje aplikacije lahko preklapljajo tunele (napredno)</string>
<string name="allow_remote_control_intents_title">Dovoljeno upravljanje preko zunanjih aplikacij</string>
<string name="allowed_ips">Dovoljeni naslovi IP</string>
<string name="app_name">WireGuard</string>
<string name="bad_config_context">%1$ss %2$s</string>
<string name="bad_config_context">%1$s-ov %2$s</string>
<string name="bad_config_context_top_level">%s</string>
<string name="bad_config_error">%1$s v %2$s</string>
<string name="bad_config_explanation_pka">: Zahtevano pozitivno število, manjše ali enako 65535</string>
<string name="bad_config_explanation_positive_number">: Zahtevano pozitivno število</string>
<string name="bad_config_explanation_udp_port">: Zahtevana veljavna številka UDP vrat</string>
<string name="bad_config_explanation_pka">: Mora biti pozitivno in ne večje od 65535</string>
<string name="bad_config_explanation_positive_number">: Mora biti pozitivno</string>
<string name="bad_config_explanation_udp_port">: Mora biti veljavna številka vrat UDP</string>
<string name="bad_config_reason_invalid_key">Neveljaven ključ</string>
<string name="bad_config_reason_invalid_number">Neveljavno število</string>
<string name="bad_config_reason_invalid_value">Neveljavna vrednost</string>
<string name="bad_config_reason_missing_attribute">Manjka atribut</string>
<string name="bad_config_reason_missing_section">Manjkajoča sekcija</string>
<string name="bad_config_reason_missing_section">Manjka odsek</string>
<string name="bad_config_reason_syntax_error">Sintaktična napaka</string>
<string name="bad_config_reason_unknown_attribute">Neznan atribut</string>
<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">Končnica mora biti .conf ali .zip</string>
<string name="bad_extension_error">Datoteka mora biti .conf ali .zip</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>
<string name="config_exists_error">Konfiguracija za „%s“ že obstaja</string>
<string name="config_file_exists_error">Konfiguracijska datoteka za „%s“ že obstaja</string>
<string name="config_not_found_error">Konfiguracijske datoteke za „%s“ ni bilo mogoče najti</string>
<string name="config_rename_error">Konfiguracijske datoteke za „%s“ ni bilo mogoče preimenovati</string>
<string name="config_rename_error">Konfiguracijske datoteke „%s“ ni bilo mogoče preimenovati</string>
<string name="config_save_error">Konfiguracijske datoteke za „%1$s“ ni bilo mogoče shraniti: %2$s</string>
<string name="config_save_success">Konfiguracijska datoteka za „%s“ uspešno shranjena</string>
<string name="create_activity_title">Ustvarite WireGuard tunel</string>
<string name="create_bin_dir_error">Lokalnega imenika za aplikacijo ni bilo mogoče kreirati</string>
<string name="create_downloads_file_error">Datoteke ni bilo mogoče shraniti v mapi Prenosi</string>
<string name="create_activity_title">Ustvarite tunel WireGuard</string>
<string name="create_bin_dir_error">Lokalnega imenika za aplikacijo ni bilo mogoče ustvariti</string>
<string name="create_downloads_file_error">Datoteke v mapi prenosov ni bilo mogoče ustvariti</string>
<string name="create_empty">Ustvari na novo</string>
<string name="create_from_file">Uvoz iz arhiva ali datoteke</string>
<string name="create_from_qr_code">Skreniraj s QR kode</string>
<string name="create_output_dir_error">Ni bilo mogoče kreirati imenika za izvoz</string>
<string name="create_temp_dir_error">Ni bilo mogoče kreirati začasnega lokalnega imenikaLokales</string>
<string name="create_from_file">Uvozi iz datoteke ali arhiva</string>
<string name="create_from_qr_code">Skreniraj kodo QR</string>
<string name="create_output_dir_error">Izhodnega imenika ni bilo mogoče ustvariti</string>
<string name="create_temp_dir_error">Lokalnega začasnega imenika ni bilo mogoče ustvariti</string>
<string name="create_tunnel">Ustvari tunel</string>
<string name="dark_theme_summary_off">V uporabi svetla (Dan) tema</string>
<string name="dark_theme_summary_on">V uporabi temna (Noč) tema</string>
<string name="dark_theme_title">Uporabi temnejšo temo</string>
<string name="delete">Odstrani</string>
<string name="dns_servers">DNS-strežnik</string>
<string name="dark_theme_summary_off">V uporabi svetla (dnevna) tema</string>
<string name="dark_theme_summary_on">V uporabi temna (nočna) tema</string>
<string name="dark_theme_title">Uporabi temno temo</string>
<string name="delete">Izbriši</string>
<string name="dns_servers">Strežniki DNS</string>
<string name="edit">Uredi</string>
<string name="endpoint">Končna točka</string>
<string name="error_down">Napaka pri zapiranju tunela: %s</string>
<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 root dostop in poskusite ponovno</string>
<string name="error_root">Prosim omogočite dostop root in poskusite ponovno</string>
<string name="error_up">Napaka pri vzpostavitvi tunela: %s</string>
<string name="exclude_private_ips">Izključitev privatnih IP naslovov</string>
<string name="generate_new_private_key">Generiraj nov privatni ključ</string>
<string name="exclude_private_ips">Izvzemi zasebne naslove IP</string>
<string name="generate_new_private_key">Izdelaj nov zasebni ključ</string>
<string name="generic_error">Neznana napaka „%s“</string>
<string name="hint_automatic">(samodejno)</string>
<string name="hint_generated">(generirano)</string>
<string name="hint_optional">(opcijsko)</string>
<string name="hint_generated">(izdelano)</string>
<string name="hint_optional">(izbirno)</string>
<string name="hint_optional_discouraged">(izbirno, ni priporočljivo)</string>
<string name="hint_random">(naključno)</string>
<string name="illegal_filename_error">Neveljavno ime datoteke \"%s\"</string>
<string name="import_error">Ne morem uvoziti tunela: %s</string>
<string name="import_from_qr_code">Uvoz tunela iz QR kode</string>
<string name="illegal_filename_error">Neveljavno ime datoteke „%s“</string>
<string name="import_error">Tunela ni bilo mogoče uvoziti: %s</string>
<string name="import_from_qr_code">Uvozi tunel iz kode QR</string>
<string name="import_success">„%s“ uvožen</string>
<string name="interface_title">Vmesnik</string>
<string name="key_contents_error">Napačni znaki v ključu</string>
<string name="key_length_error">Napačna dolžina ključa</string>
<string name="key_length_explanation_base64">: WireGuard base64-ključi morajo vsebovati 44 znakov (32 bytov)</string>
<string name="key_length_explanation_binary">: WireGuard-ključi morajo biti veliki 32 bytov</string>
<string name="key_length_explanation_hex">: WireGuard Hex-ključi morajo biti veliki 64 znakov (32 bytov)</string>
<string name="listen_port">Vrata na katerih se posluša</string>
<string name="log_export_error">Napaka pri izvozu dnevnika: %s</string>
<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="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>
<string name="log_export_success">Shranjena v „%s“</string>
<string name="log_export_title">Izvoz dnevniške datoteke</string>
<string name="log_saver_activity_label">Shrani dnevniško datoteko</string>
<string name="log_viewer_pref_summary">Dnevniške datoteke lahko pomagajo pri razhroščevanju</string>
<string name="log_viewer_pref_title">Prikaži dnevniško datoteko aplikacije</string>
<string name="log_viewer_title">Beleženje</string>
<string name="logcat_error">Ni bilo mogoče izvesti \"logcat\": </string>
<string name="module_disabler_disabled_summary">Eksperimentalni modul v jedru lahko izboljša delovanje</string>
<string name="module_disabler_disabled_title">Aktiviranje modula v jedru</string>
<string name="module_disabler_enabled_summary">Počasnejše uporabniško zaledje (Userspace-Backend) lahko izboljša stabilnost</string>
<string name="module_disabler_enabled_title">Deaktiviranje modula v jedru</string>
<string name="module_installer_error">Nekaj je šlo narobe, prosimo poizkusite znova</string>
<string name="module_installer_initial">Eksperimentalni modul v jedru lahko izboljša delovanje</string>
<string name="module_installer_not_found">Za vašo napravo modulov ni razpoložljivih modulov</string>
<string name="module_installer_title">Prenos in namestitev modula</string>
<string name="module_installer_working">Prenašanje in nameščanje...</string>
<string name="module_version_error">Ni bilo mogoče pridobiti verzije modula</string>
<string name="log_export_success">Shranjeno v „%s“</string>
<string name="log_export_title">Izvozi dnevniško datoteko</string>
<string name="log_saver_activity_label">Shrani dnevnik</string>
<string name="log_viewer_pref_summary">Dnevniki lahko pomagajo pri razhroščevanju</string>
<string name="log_viewer_pref_title">Prikaži dnevnik aplikacije</string>
<string name="log_viewer_title">Dnevnik</string>
<string name="logcat_error">Ukaza logcat ni bilo mogoče izvesti: </string>
<string name="module_disabler_disabled_summary">Eksperimentalni modul jedra lahko izboljša zmogljivost</string>
<string name="module_disabler_disabled_title">Omogoči zaledje za modul jedra</string>
<string name="module_disabler_enabled_summary">Počasnejše uporabniško zaledje lahko izboljša stabilnost</string>
<string name="module_disabler_enabled_title">Onemogoči zaledje za modul jedra</string>
<string name="module_installer_error">Nekaj je šlo narobe, prosimo poskusite znova</string>
<string name="module_installer_initial">Eksperimentalni modul jedra lahko izboljša zmogljivost</string>
<string name="module_installer_not_found">Za vašo napravo ni razpoložljivih modulov</string>
<string name="module_installer_title">Prenesi in namesti modul jedra</string>
<string name="module_installer_working">Prenašanje in nameščanje …</string>
<string name="module_version_error">Verzije modula jedra ni bilo mogoče določiti</string>
<string name="mtu">MTU</string>
<string name="multiple_tunnels_summary_off">Vklop enega tunela, bo druge izklopil</string>
<string name="multiple_tunnels_summary_on">Več tunelov je lahko aktiviranih istočasno</string>
<string name="multiple_tunnels_title">Dovoljeno več istočasnih tunelov</string>
<string name="multiple_tunnels_summary_off">Vklop enega tunela bo izklopil druge</string>
<string name="multiple_tunnels_summary_on">Več tunelov je lahko aktiviranih sočasno</string>
<string name="multiple_tunnels_title">Dovoli več sočasnih tunelov</string>
<string name="name">Ime</string>
<string name="no_config_error">Poskus vzpostavitve tunel brez konfiguracije</string>
<string name="no_configs_error">Ni bilo mogoče najti konfiguracijo</string>
<string name="no_tunnels_error">Ni razporožljivih tunelov</string>
<string name="parse_error_generic">Niz</string>
<string name="no_config_error">Poskus vzpostavitve tunela brez konfiguracije</string>
<string name="no_configs_error">Ni najdenih konfiguracij</string>
<string name="no_tunnels_error">Ni tunelov</string>
<string name="parse_error_generic">niz</string>
<string name="parse_error_inet_address">Naslov IP</string>
<string name="parse_error_inet_endpoint">končna točka</string>
<string name="parse_error_inet_network">IP omrežje</string>
<string name="parse_error_inet_network">Omrežje IP</string>
<string name="parse_error_integer">število</string>
<string name="parse_error_reason">Ni mogoče obdelati %1$s “%2$s”</string>
<string name="peer">Soležnik (Peer)</string>
<string name="permission_description">Upravljanje z Wireguard tunelom, aktivacija in deaktivacija tunela, zaradi česar bo internetni prometno mogoče napačno usmerjen</string>
<string name="permission_label">Upravljanje z Wireguard tunelom</string>
<string name="persistent_keepalive">Trajna povezava (Keepalive)</string>
<string name="pre_shared_key">Vnaprej deljen ključ</string>
<string name="private_key">Privatni ključ</string>
<string name="parse_error_reason">Ni mogoče razčleniti %1$s „%2$s“</string>
<string name="peer">Vrstnik</string>
<string name="permission_description">upravljanje tunelov WireGuard, aktivacija in deaktivacija tunela, zaradi česar bo internetni promet mogoče napačno usmerjen</string>
<string name="permission_label">upravljanje tunelov WireGuard</string>
<string name="persistent_keepalive">Trajno ohranjanje povezave</string>
<string name="pre_shared_key">Ključ v skupni rabi</string>
<string name="pre_shared_key_enabled">omogočeno</string>
<string name="private_key">Zasebni ključ</string>
<string name="public_key">Javni ključ</string>
<string name="qr_code_hint">Namig: Generirajte z `qrencode -t ansiutf8 &lt; tunnel.conf`.</string>
<string name="restore_on_boot_summary_off">Pri vklopu telefona, aktivirani tuneli ne bodo avtimatično vzpostavljeni</string>
<string name="restore_on_boot_summary_on">Pri vklopu telefona bodo aktivirani tuneli avtimatično vzpostavljeni</string>
<string name="restore_on_boot_title">Ponovna vzpostavitev pri ponovnem zagonu</string>
<string name="qr_code_hint">Namig: izdelajte z `qrencode -t ansiutf8 &lt; tunnel.conf`.</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>
<string name="save">Shrani</string>
<string name="select_all">Izbor vseh</string>
<string name="select_all">Izberi vse</string>
<string name="settings">Nastavitve</string>
<string name="shell_exit_status_read_error">Lupina ne more prebrati izhodnega statusa</string>
<string name="shell_marker_count_error">Lupina je pričakovala 4 markerje, dobila pa je %d</string>
<string name="shell_marker_count_error">Lupina je pričakovala 4 oznake, dobila pa je %d</string>
<string name="shell_start_error">Lupina se ni mogla zagnati: %d</string>
<string name="success_application_will_restart">Uspešno. Aplikacija se bo znova zagnala...</string>
<string name="toggle_all">Prestavi vse</string>
<string name="toggle_error">Napaka pri prestavljanju Wireguard tunela: %s</string>
<string name="success_application_will_restart">Uspešno. Aplikacija se bo znova zagnala …</string>
<string name="toggle_all">Preklopi vse</string>
<string name="toggle_error">Napaka pri preklopu tunela WireGuard: %s</string>
<string name="tools_installer_already">wg in wg-quick sta že nameščena</string>
<string name="tools_installer_failure">Orodja ukazne lupina niso bila nameščena (Ni root dostopa?)</string>
<string name="tools_installer_failure">Orodij ukazne vrstice ni bilo mogoče namestiti (ni dostopa root?)</string>
<string name="tools_installer_initial">Namestitev izbirnih orodij za skripte</string>
<string name="tools_installer_initial_magisk">Namestitev izbirnih orodij za skripte preko Magisk modula</string>
<string name="tools_installer_initial_system">Namestitev izbirnih orodij za skripte na sistemski particiji</string>
<string name="tools_installer_success_magisk">wg in wg-quick kot Magisk modul nameščen (Zahtevan ponovni zagon)</string>
<string name="tools_installer_success_system">wg und wg-quick nameščena na sistemski particiji</string>
<string name="tools_installer_title">Namestitev orodij za ukazno vrstico</string>
<string name="tools_installer_initial_magisk">Namestitev izbirnih orodij za skripte kot modula Magisk</string>
<string name="tools_installer_initial_system">Namestitev izbirnih orodij za skripte na sistemsko particijo</string>
<string name="tools_installer_success_magisk">wg in wg-quick kot modul Magisk nameščen (zahtevan ponovni zagon)</string>
<string name="tools_installer_success_system">wg und wg-quick nameščena na sistemsko particijo</string>
<string name="tools_installer_title">Namesti orodja za ukazno vrstico</string>
<string name="tools_installer_working">Nameščam wg in wg-quick</string>
<string name="tools_unavailable_error">Zahtevana orodja niso razpoložljiva</string>
<string name="transfer">Premik (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="tools_unavailable_error">Zahtevana orodja niso na voljo</string>
<string name="transfer">Prenos</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">prejeto: %1$s, poslano: %2$s</string>
<string name="transfer_tibibytes">%.2f TiB</string>
<string name="tun_create_error">Ni bilo mogoče ustvariti tun naprave</string>
<string name="tunnel_config_error">Tunela ni bilo mogoče konfigurirati (wg-quick je vrnil %d)</string>
<string name="tunnel_create_error">Ne morem ustvariti tunela: %s</string>
<string name="tunnel_create_success">Tunel „%s “ uspešno ustvarjen</string>
<string name="tunnel_error_already_exists">Tunel „%s “ že obstaja</string>
<string name="transfer_tibibytes">%.2f TiB</string>
<string name="tun_create_error">Naprave tun ni bilo mogoče ustvariti</string>
<string name="tunnel_config_error">Tunela ni bilo mogoče nastaviti (wg-quick je vrnil %d)</string>
<string name="tunnel_create_error">Tunela ni bilo mogoče ustvariti: %s</string>
<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 klikom na modri gumb</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_rename_error">Ne morem preimenovati tunela: %s</string>
<string name="tunnel_rename_success">Tunnel uspešno preimenovan v „%s “</string>
<string name="type_name_go_userspace">Go userspace</string>
<string name="type_name_kernel_module">Jedrni modul</string>
<string name="unknown_error">Neznanna napaka</string>
<string name="version_summary">%1$s različica aplikacij v%2$s</string>
<string name="version_summary_checking">Preverjam %s različico aplikacije</string>
<string name="version_summary_unknown">Neznana %s različica</string>
<string name="tunnel_rename_error">Tunela ni bilo mogoče preimenovati: %s</string>
<string name="tunnel_rename_success">Tunel uspešno preimenovan v „%s“</string>
<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="version_summary">Zaledje %1$s v%2$s</string>
<string name="version_summary_checking">Preverjam verzijo zaledja %s</string>
<string name="version_summary_unknown">Neznana verzija %s</string>
<string name="version_title">WireGuard za Android v%s</string>
<string name="vpn_not_authorized_error">VPN-storitev ni bila odobrena s strani uporabnika</string>
<string name="vpn_start_error">Android VPN-storitve ni bilo mogoče zagnati</string>
<string name="zip_export_error">Ne morem izvoziti tunela: %s</string>
<string name="zip_export_success">Shranjeno pod “%s”</string>
<string name="zip_export_summary">Zip datoteka je bila shranjena v mapi Prenosi</string>
<string name="zip_export_title">Izvoz tunela kot Zip datoteka</string>
<string name="vpn_not_authorized_error">Uporabnik ni odobril storitve VPN</string>
<string name="vpn_start_error">Storitve Android VPN ni bilo mogoče zagnati</string>
<string name="zip_export_error">Tunelov ni bilo mogoče izvoziti: %s</string>
<string name="zip_export_success">Shranjeno v „%s“</string>
<string name="zip_export_summary">Datoteka zip je bila shranjena v mapo Prenosi</string>
<string name="zip_export_title">Izvozi tunele v datoteko zip</string>
<string name="biometric_prompt_zip_exporter_title">Za izvoz tunelov se prijavite</string>
<string name="biometric_prompt_private_key_title">Za privatni ključ se prijavite</string>
<string name="biometric_auth_error">Napaka pri avtentikaciji</string>
<string name="biometric_auth_error_reason">Napaka pri avtentikaciji: %s</string>
<string name="biometric_prompt_private_key_title">Za ogled zasebnega ključa se prijavite</string>
<string name="biometric_auth_error">Napaka pri overovljanju</string>
<string name="biometric_auth_error_reason">Napaka pri overovljanju: %s</string>
</resources>
-1
View File
@@ -20,7 +20,6 @@
<item name="android:windowBackground">@color/primary_color</item>
<item name="alertDialogTheme">@style/AppTheme.Dialog</item>
<item name="materialAlertDialogTheme">@style/AppTheme.Dialog</item>
<item name="actionBarPopupTheme">@style/ThemeOverlay.MaterialComponents.ActionBar</item>
<item name="textInputStyle">@style/TextInputLayoutBase</item>
<item name="materialCardViewStyle">@style/AppTheme.MaterialCardView</item>
</style>
-1
View File
@@ -23,7 +23,6 @@
<item name="android:windowBackground">@color/primary_color</item>
<item name="alertDialogTheme">@style/AppTheme.Dialog</item>
<item name="materialAlertDialogTheme">@style/AppTheme.Dialog</item>
<item name="actionBarPopupTheme">@style/ThemeOverlay.MaterialComponents.ActionBar</item>
<item name="textInputStyle">@style/TextInputLayoutBase</item>
<item name="materialCardViewStyle">@style/AppTheme.MaterialCardView</item>
</style>
+29 -2
View File
@@ -16,10 +16,36 @@
<item quantity="other">导入了 %d 项</item>
</plurals>
<plurals name="set_excluded_applications">
<item quantity="other">%d 个排除应用</item>
<item quantity="other">对 %d 个应用不生效</item>
</plurals>
<plurals name="set_included_applications">
<item quantity="other">对 %d 个应用生效</item>
</plurals>
<plurals name="n_excluded_applications">
<item quantity="other">对 %d 个应用不生效</item>
</plurals>
<plurals name="n_included_applications">
<item quantity="other">对 %d 个应用生效</item>
</plurals>
<string name="all_applications">对全部应用生效</string>
<string name="exclude_from_tunnel">不生效</string>
<string name="include_in_tunnel">生效</string>
<plurals name="include_n_applications">
<item quantity="other">设定 %d 个应用</item>
</plurals>
<plurals name="exclude_n_applications">
<item quantity="other">设定 %d 个应用</item>
</plurals>
<plurals name="persistent_keepalive_seconds_unit">
<item quantity="other">每隔 %d 秒</item>
</plurals>
<plurals name="persistent_keepalive_seconds_suffix">
<item quantity="other">秒</item>
</plurals>
<string name="use_all_applications">不设定过滤</string>
<string name="add_peer">添加节点</string>
<string name="addresses">局域网 IP 地址</string>
<string name="applications">应用过滤</string>
<string name="allow_remote_control_intents_summary_off">外部应用当前不能控制隧道(不建议勾选)</string>
<string name="allow_remote_control_intents_summary_on">外部应用当前能够控制隧道(面向高级用户)</string>
<string name="allow_remote_control_intents_title">授权外部控制</string>
@@ -126,6 +152,7 @@
<string name="permission_label">控制 WireGuard 隧道</string>
<string name="persistent_keepalive">连接保活间隔</string>
<string name="pre_shared_key">预共享密钥</string>
<string name="pre_shared_key_enabled">已启用</string>
<string name="private_key">私钥</string>
<string name="public_key">公钥</string>
<string name="qr_code_hint">提示:使用命令 `qrencode -t ansiutf8 &lt; tunnel.conf` 生成二维码</string>
@@ -182,7 +209,7 @@
<string name="zip_export_success">已保存至 “%s”</string>
<string name="zip_export_summary">zip 压缩包将保存至下载文件夹</string>
<string name="zip_export_title">导出隧道配置</string>
<string name="biometric_prompt_zip_exporter_title">导出隧道需要认证指纹</string>
<string name="biometric_prompt_zip_exporter_title">导出配置需要认证指纹</string>
<string name="biometric_prompt_private_key_title">查看私钥需要认证指纹</string>
<string name="biometric_auth_error">认证失败</string>
<string name="biometric_auth_error_reason">认证失败:%s</string>
+2
View File
@@ -101,6 +101,8 @@
<string name="dark_theme_summary_on">Currently using dark (night) theme</string>
<string name="dark_theme_title">Use dark theme</string>
<string name="delete">Delete</string>
<string name="disable_config_export_title">Disable config exporting</string>
<string name="disable_config_export_description">Disabling config exporting makes private keys less accessible</string>
<string name="dns_servers">DNS servers</string>
<string name="edit">Edit</string>
<string name="endpoint">Endpoint</string>
-1
View File
@@ -19,7 +19,6 @@
<item name="android:windowBackground">@color/primary_color</item>
<item name="alertDialogTheme">@style/AppTheme.Dialog</item>
<item name="materialAlertDialogTheme">@style/AppTheme.Dialog</item>
<item name="actionBarPopupTheme">@style/ThemeOverlay.MaterialComponents.ActionBar</item>
<item name="textInputStyle">@style/TextInputLayoutBase</item>
<item name="materialCardViewStyle">@style/AppTheme.MaterialCardView</item>
</style>
+13
View File
@@ -0,0 +1,13 @@
<!--
~ Copyright © 2020 WireGuard LLC. All Rights Reserved.
~ SPDX-License-Identifier: Apache-2.0
-->
<restrictions xmlns:android="http://schemas.android.com/apk/res/android">
<restriction
android:defaultValue="false"
android:description="@string/disable_config_export_description"
android:key="disable_config_export"
android:restrictionType="bool"
android:title="@string/disable_config_export_title" />
</restrictions>
+2 -2
View File
@@ -1,6 +1,6 @@
buildscript {
ext {
wireguardVersionCode = 473
wireguardVersionName = '1.0.20200406'
wireguardVersionCode = 475
wireguardVersionName = '1.0.20200724'
}
}