mirror of
https://github.com/amnezia-vpn/amneziawg-android.git
synced 2026-07-03 14:05:13 +02:00
Compare commits
31 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| e08d873cc3 | |||
| 3748a1da88 | |||
| 9597d719ac | |||
| 041ce2134f | |||
| 4c17fc51e7 | |||
| 6cf7439053 | |||
| 814ab4937d | |||
| 3d088411e2 | |||
| 39e0c861e2 | |||
| d60efcd7c7 | |||
| 4dff537d21 | |||
| 761c2ade4a | |||
| 115a87af32 | |||
| c7ecaeb145 | |||
| 8e2d63db75 | |||
| 3208bac987 | |||
| fc1f2132fe | |||
| 09125e1e31 | |||
| 6b1164ad8d | |||
| c68a5c776b | |||
| f3ac787f5a | |||
| 751be2c469 | |||
| cfb7f1b016 | |||
| 33e07628db | |||
| b1b7d1d90c | |||
| 6cb9548f72 | |||
| 8207ae1e8d | |||
| 48e0e427eb | |||
| 03e95d2dd3 | |||
| 58b14cc650 | |||
| 3fa8e09545 |
@@ -15,3 +15,4 @@ build/
|
||||
*.iml
|
||||
*.jks
|
||||
keystore.properties
|
||||
gradlew.bat
|
||||
|
||||
+10
-10
@@ -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"
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Vendored
BIN
Binary file not shown.
+2
-1
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
)
|
||||
|
||||
@@ -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=
|
||||
|
||||
Submodule tunnel/tools/wireguard-tools updated: e189f9942d...eb4665ecf0
+2
-3
@@ -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"
|
||||
|
||||
Vendored
+3
-3
@@ -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
|
||||
|
||||
@@ -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"),
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
}
|
||||
@@ -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>
|
||||
@@ -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">
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
<item quantity="other">%d ausgeschlossene Anwendungen</item>
|
||||
</plurals>
|
||||
<plurals name="set_included_applications">
|
||||
<item quantity="one">%d ausgeschlossene Anwendung</item>
|
||||
<item quantity="one">%d einbezogene Anwendung</item>
|
||||
<item quantity="other">%d einbezogene Anwendungen</item>
|
||||
</plurals>
|
||||
<plurals name="n_excluded_applications">
|
||||
@@ -53,18 +53,18 @@
|
||||
</plurals>
|
||||
<plurals name="persistent_keepalive_seconds_suffix">
|
||||
<item quantity="one">Sekunde</item>
|
||||
<item quantity="other">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">Applikationen</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>
|
||||
@@ -73,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>
|
||||
@@ -89,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>
|
||||
@@ -120,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>
|
||||
|
||||
@@ -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 < 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>
|
||||
@@ -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 < tunnel.conf`.</string>
|
||||
|
||||
@@ -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 < tunnel.conf`.</string>
|
||||
|
||||
@@ -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 < 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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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 < tunnel.conf`.</string>
|
||||
|
||||
@@ -235,7 +235,7 @@
|
||||
<string name="tunnel_on_error">Tunela ni bilo mogoče vključiti (wgTurnOn je vrnil %d)</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">Go userspace</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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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
@@ -1,6 +1,6 @@
|
||||
buildscript {
|
||||
ext {
|
||||
wireguardVersionCode = 474
|
||||
wireguardVersionName = '1.0.20200407'
|
||||
wireguardVersionCode = 475
|
||||
wireguardVersionName = '1.0.20200724'
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user