Compare commits

...

17 Commits

Author SHA1 Message Date
Jason A. Donenfeld 0750c29c7f version: bump
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
2021-02-11 16:40:34 +01:00
Jason A. Donenfeld 639ee6b5b2 tunnel: add developer information to pom xml
Otherwise sonatype gets upset.

Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
2021-02-11 16:40:34 +01:00
Jason A. Donenfeld f764f2aaa9 build: update AGP to 4.1.2
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
2021-02-11 16:11:57 +01:00
Jason A. Donenfeld d2a9c56d9c gradle: remove bad checksum from properties
The hash was wrong, causing crashes. Android studio told me to remove it
so I did. I don't quite like that, but I don't know how Harsh came up
with the previous hash.

Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
2021-02-11 16:10:28 +01:00
Jason A. Donenfeld 4c3289aa52 tunnel: bump all tools
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
2021-02-11 16:00:28 +01:00
Jason A. Donenfeld 79376bca64 tunnel: sign using gpg-agent
This way we don't have to have a separate java universe.

Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
2021-02-11 15:55:20 +01:00
Harsh Shandilya b709d36c01 tunnel: switch publishing to MavenCentral
Since MavenCentral requires GPG signed artifacts, we'll need to configure
some things on the machine running the deployment. Specifically, these
three Gradle properties need to be set (preferably in ~/.gradle/gradle.properties)

```
signing.keyId= // Duh
signing.password= // I have absolutely no idea how this will work with HSMs
signing.secretKeyRingFile= // $HOME/.gnupg/... you know the deal
```

The BINTRAY_USER and BINTRAY_KEY variables are replaced by SONATYPE_USER
and SONATYPE_PASSWORD to better reflect their new contents.

Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2021-02-11 01:58:41 +05:30
L.W.Reek 0301c85e2c build: include org.jetbrains.trove4j from jcenter
mavenCentral does not have org.jetbrains.trove4j which causes the
build to fail.

* What went wrong:
Execution failed for task ':tunnel:extractReleaseAnnotations'.
> Could not resolve all files for configuration ':tunnel:lintClassPath'.
   > Could not find org.jetbrains.trove4j:trove4j:20160824.
     Searched in the following locations:
       - https://dl.google.com/dl/android/maven2/org/jetbrains/trove4j/
         trove4j/20160824/trove4j-20160824.pom
       - https://repo.maven.apache.org/maven2/org/jetbrains/trove4j/
         trove4j/20160824/trove4j-20160824.pom
     Required by:
         project :tunnel > com.android.tools.lint:lint-gradle:27.1.1 >
                  com.android.tools:sdk-common:27.1.1
         project :tunnel > com.android.tools.lint:lint-gradle:27.1.1 >
                  com.android.tools.external.com-intellij:intellij-core:27.1.1

Fixes: 13cc4436ca ("build: switch to mavenCentral as the main repository")
Signed-off-by: L.W.Reek <syphyr@gmail.com>
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2021-02-10 18:31:36 +05:30
Harsh Shandilya 7e979817e2 build: upgrade to Gradle 6.8.2
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2021-02-05 22:25:52 +05:30
Harsh Shandilya 13cc4436ca build: switch to mavenCentral as the main repository
Retain JCenter but restrict it the single dependency we require off it

Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2021-02-05 22:25:38 +05:30
Harsh Shandilya bcfbf37ed1 build: update fragment to 1.3.0-rc02
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2021-02-03 13:33:47 +05:30
Jason A. Donenfeld 74ff870cf5 tunnel: bump libwg-go and use newer logging function
We also plug a memory leak. C.CString was calling malloc, and these were
never freed.

Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
2021-01-27 01:10:48 +01:00
Harsh Shandilya b4f54e8958 strings: sync translations
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2021-01-23 14:59:00 +05:30
L.W.Reek d179a3af15 libwg-go: update to go 1.15.6
Signed-off-by: L.W.Reek <syphyr@gmail.com>
2021-01-23 14:42:46 +05:30
Harsh Shandilya 2bac2feeb5 build: upgrade runtime dependencies
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2021-01-23 14:33:00 +05:30
Harsh Shandilya 261236c8ce gradle: bump wrapper to v6.8.1
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2021-01-23 14:01:44 +05:30
Jason A. Donenfeld 4a7969ef24 ClipboardUtils: localize clipboard notification snack
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
2021-01-01 16:34:03 +01:00
14 changed files with 334 additions and 103 deletions
+18 -10
View File
@@ -1,7 +1,7 @@
buildscript {
ext {
activityVersion = '1.2.0-beta02'
agpVersion = '4.1.1'
activityVersion = '1.2.0-rc01'
agpVersion = '4.1.2'
annotationsVersion = '1.1.0'
appcompatVersion = '1.2.0'
biometricVersion = '1.1.0-rc01'
@@ -12,12 +12,12 @@ buildscript {
coroutinesVersion = '1.4.2'
datastoreVersion = '1.0.0-alpha02'
desugarVersion = '1.0.10'
fragmentVersion = '1.3.0-beta02'
fragmentVersion = '1.3.0-rc02'
jsr305Version = '3.0.2'
junitVersion = '4.13.1'
kotlinVersion = '1.4.21'
lifecycleRuntimeKtxVersion = '2.3.0-beta01'
materialComponentsVersion = '1.3.0-beta01'
kotlinVersion = '1.4.21-2'
lifecycleRuntimeKtxVersion = '2.3.0-rc01'
materialComponentsVersion = '1.3.0-rc01'
preferenceVersion = '1.1.1'
zxingEmbeddedVersion = '3.6.0'
@@ -29,7 +29,7 @@ buildscript {
}
repositories {
google()
jcenter()
mavenCentral()
}
}
@@ -69,7 +69,15 @@ task crowdin(type: Copy, dependsOn: ['extractCrowdin']) {
allprojects {
repositories {
google()
jcenter()
mavenCentral()
jcenter() {
content {
// https://github.com/journeyapps/zxing-android-embedded/issues/606
includeModule("com.journeyapps", "zxing-android-embedded")
// https://youtrack.jetbrains.com/issue/IDEA-261387
includeModule("org.jetbrains.trove4j", "trove4j")
}
}
}
}
@@ -79,9 +87,9 @@ task clean(type: Delete) {
tasks {
wrapper {
gradleVersion = "6.7.1"
gradleVersion = "6.8.2"
distributionType = Wrapper.DistributionType.ALL
distributionSha256Sum = "22449f5231796abd892c98b2a07c9ceebe4688d192cd2d6763f8e3bf8acbedeb"
distributionSha256Sum = "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
}
}
+2 -2
View File
@@ -1,6 +1,6 @@
#Thu Feb 11 16:09:16 CET 2021
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionSha256Sum=22449f5231796abd892c98b2a07c9ceebe4688d192cd2d6763f8e3bf8acbedeb
distributionUrl=https\://services.gradle.org/distributions/gradle-6.7.1-all.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-6.8.2-all.zip
+14 -4
View File
@@ -1,4 +1,5 @@
apply plugin: 'maven-publish'
apply plugin: 'signing'
afterEvaluate {
publishing {
@@ -35,17 +36,21 @@ afterEvaluate {
name = 'WireGuard'
url = 'https://www.wireguard.com/'
}
developer {
name = 'WireGuard'
email = 'team@wireguard.com'
}
}
}
}
}
repositories {
maven {
name = "bintray"
url = uri("https://api.bintray.com/maven/wireguard/wireguard-android/wireguard-android/;publish=1;override=0")
name = "sonatype"
url = uri("https://oss.sonatype.org/service/local/staging/deploy/maven2/")
credentials {
username = hasProperty('BINTRAY_USER') ? getProperty('BINTRAY_USER') : System.getenv('BINTRAY_USER')
password = hasProperty('BINTRAY_KEY') ? getProperty('BINTRAY_KEY') : System.getenv('BINTRAY_KEY')
username = hasProperty('SONATYPE_USER') ? getProperty('SONATYPE_USER') : System.getenv('SONATYPE_USER')
password = hasProperty('SONATYPE_PASSWORD') ? getProperty('SONATYPE_PASSWORD') : System.getenv('SONATYPE_PASSWORD')
}
}
}
@@ -70,3 +75,8 @@ android.libraryVariants.all { variant ->
}
}
}
signing {
useGpgCmd()
sign publishing.publications
}
+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.15.2
GO_VERSION := 1.15.6
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 := 9bd39600d9fa1fa4a5ccce8761d249f7421cffe671376f791293c4138f3d7c62
GO_HASH_linux-amd64 := b49fda1ca29a1946d6bb2a5a6982cf07ccd2aba849289508ee0f9918f6bb4552
GO_HASH_darwin-amd64 := 940a73b45993a3bae5792cf324140dded34af97c548af4864d22fd6d49f3bd9f
GO_HASH_linux-amd64 := 3918e6cc85e7eaaa6f859f1bdbaac772e7a825b0eb423c63d3ae68b21f84b844
default: $(DESTDIR)/libwg-go.so
+42 -33
View File
@@ -10,15 +10,12 @@ package main
import "C"
import (
"bufio"
"bytes"
"log"
"fmt"
"math"
"net"
"os"
"os/signal"
"runtime"
"strings"
"unsafe"
"golang.org/x/sys/unix"
@@ -29,13 +26,21 @@ import (
)
type AndroidLogger struct {
level C.int
interfaceName string
level C.int
tag *C.char
}
func (l AndroidLogger) Write(p []byte) (int, error) {
C.__android_log_write(l.level, C.CString("WireGuard/GoBackend/"+l.interfaceName), C.CString(string(p)))
return len(p), nil
func cstring(s string) *C.char {
b, err := unix.BytePtrFromString(s)
if err != nil {
b := [1]C.char{}
return &b[0]
}
return (*C.char)(unsafe.Pointer(b))
}
func (l AndroidLogger) Printf(format string, args ...interface{}) {
C.__android_log_write(l.level, l.tag, cstring(fmt.Sprintf(format, args...)))
}
type TunnelHandle struct {
@@ -55,39 +60,38 @@ func init() {
select {
case <-signals:
n := runtime.Stack(buf, true)
if n == len(buf) {
n--
}
buf[n] = 0
C.__android_log_write(C.ANDROID_LOG_ERROR, C.CString("WireGuard/GoBackend/Stacktrace"), (*C.char)(unsafe.Pointer(&buf[0])))
C.__android_log_write(C.ANDROID_LOG_ERROR, cstring("WireGuard/GoBackend/Stacktrace"), (*C.char)(unsafe.Pointer(&buf[0])))
}
}
}()
}
//export wgTurnOn
func wgTurnOn(ifnameRef string, tunFd int32, settings string) int32 {
interfaceName := string([]byte(ifnameRef))
func wgTurnOn(interfaceName string, tunFd int32, settings string) int32 {
tag := cstring("WireGuard/GoBackend/" + interfaceName)
logger := &device.Logger{
Debug: log.New(&AndroidLogger{level: C.ANDROID_LOG_DEBUG, interfaceName: interfaceName}, "", 0),
Info: log.New(&AndroidLogger{level: C.ANDROID_LOG_INFO, interfaceName: interfaceName}, "", 0),
Error: log.New(&AndroidLogger{level: C.ANDROID_LOG_ERROR, interfaceName: interfaceName}, "", 0),
Verbosef: AndroidLogger{level: C.ANDROID_LOG_DEBUG, tag: tag}.Printf,
Errorf: AndroidLogger{level: C.ANDROID_LOG_ERROR, tag: tag}.Printf,
}
logger.Debug.Println("Debug log enabled")
tun, name, err := tun.CreateUnmonitoredTUNFromFD(int(tunFd))
if err != nil {
unix.Close(int(tunFd))
logger.Error.Println(err)
logger.Errorf("CreateUnmonitoredTUNFromFD: %v", err)
return -1
}
logger.Info.Println("Attaching to interface", name)
logger.Verbosef("Attaching to interface %v", name)
device := device.NewDevice(tun, logger)
setError := device.IpcSetOperation(bufio.NewReader(strings.NewReader(settings)))
if setError != nil {
err = device.IpcSet(settings)
if err != nil {
unix.Close(int(tunFd))
logger.Error.Println(setError)
logger.Errorf("IpcSet: %v", err)
return -1
}
device.DisableSomeRoamingForBrokenMobileSemantics()
@@ -96,12 +100,12 @@ func wgTurnOn(ifnameRef string, tunFd int32, settings string) int32 {
uapiFile, err := ipc.UAPIOpen(name)
if err != nil {
logger.Error.Println(err)
logger.Errorf("UAPIOpen: %v", err)
} else {
uapi, err = ipc.UAPIListen(name, uapiFile)
if err != nil {
uapiFile.Close()
logger.Error.Println(err)
logger.Errorf("UAPIListen: %v", err)
} else {
go func() {
for {
@@ -115,8 +119,14 @@ func wgTurnOn(ifnameRef string, tunFd int32, settings string) int32 {
}
}
device.Up()
logger.Info.Println("Device started")
err = device.Up()
if err != nil {
logger.Errorf("Unable to bring up device: %v", err)
uapiFile.Close()
device.Close()
return -1
}
logger.Verbosef("Device started")
var i int32
for i = 0; i < math.MaxInt32; i++ {
@@ -125,7 +135,9 @@ func wgTurnOn(ifnameRef string, tunFd int32, settings string) int32 {
}
}
if i == math.MaxInt32 {
unix.Close(int(tunFd))
logger.Errorf("Unable to find empty handle")
uapiFile.Close()
device.Close()
return -1
}
tunnelHandles[i] = TunnelHandle{device: device, uapi: uapi}
@@ -185,14 +197,11 @@ func wgGetConfig(tunnelHandle int32) *C.char {
if !ok {
return nil
}
settings := new(bytes.Buffer)
writer := bufio.NewWriter(settings)
err := handle.device.IpcGetOperation(writer)
settings, err := handle.device.IpcGet()
if err != nil {
return nil
}
writer.Flush()
return C.CString(settings.String())
return C.CString(settings)
}
//export wgVersion
+3 -4
View File
@@ -3,8 +3,7 @@ module golang.zx2c4.com/wireguard/android
go 1.15
require (
golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad // indirect
golang.org/x/net v0.0.0-20201216054612-986b41b23924 // indirect
golang.org/x/sys v0.0.0-20201223074533-0d417f636930
golang.zx2c4.com/wireguard v0.0.20201119-0.20201223215156-09728dc6b340
golang.org/x/net v0.0.0-20210119194325-5f4716e94777 // indirect
golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c
golang.zx2c4.com/wireguard v0.0.0-20210211144856-ef8115f63b22
)
+10 -12
View File
@@ -1,24 +1,22 @@
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20201124201722-c8d3bf9c5392/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad h1:DN0cp81fZ3njFcrLCytUHRSUkqBjfTo4Tx9RJTWs0EY=
golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
golang.org/x/net v0.0.0-20201216054612-986b41b23924 h1:QsnDpLLOKwHBBDa8nDws4DYNc/ryVW2vCpxCs09d4PY=
golang.org/x/net v0.0.0-20201216054612-986b41b23924/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
golang.org/x/net v0.0.0-20201224014010-6772e930b67b h1:iFwSg7t5GZmB/Q5TjiEAsdoLDrdJRC1RiF2WhuV29Qw=
golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
golang.org/x/net v0.0.0-20210119194325-5f4716e94777 h1:003p0dJM77cxMSyCPFphvZf/Y5/NXf5fzg6ufd1/Oew=
golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
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-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20201126233918-771906719818/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20201223074533-0d417f636930 h1:vRgIt+nup/B/BwIS0g2oC0haq0iqbV3ZA+u6+0TlNCo=
golang.org/x/sys v0.0.0-20201223074533-0d417f636930/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210105210732-16f7687f5001 h1:/dSxr6gT0FNI1MO5WLJo8mTmItROeOKTkDn+7OwWBos=
golang.org/x/sys v0.0.0-20210105210732-16f7687f5001/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c h1:VwygUrnw9jn88c4u8GD3rZQbqrP/tgas88tPUbBxQrk=
golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.zx2c4.com/wireguard v0.0.20201119-0.20201223215156-09728dc6b340 h1:X6jrf2sUEj3n+q2oB/I3C088vQFKREz2UzgVJ8wENtI=
golang.zx2c4.com/wireguard v0.0.20201119-0.20201223215156-09728dc6b340/go.mod h1:ITsWNpkFv78VPB7f8MiyuxeEMcHR4jfxHGCJLPP3GHs=
golang.zx2c4.com/wireguard v0.0.0-20210211144856-ef8115f63b22 h1:7Ct1Jps4o4u2hBFWrg8Rt65VmXfMPTeR0OSXxdq8gMk=
golang.zx2c4.com/wireguard v0.0.0-20210211144856-ef8115f63b22/go.mod h1:r0ExowOoGFfDoLDxx+M9SYbNVsoZ0xviLL+K4f2mt+A=
@@ -11,6 +11,7 @@ import android.widget.TextView
import androidx.core.content.getSystemService
import com.google.android.material.snackbar.Snackbar
import com.google.android.material.textfield.TextInputEditText
import com.wireguard.android.R
/**
* Standalone utilities for interacting with the system clipboard.
@@ -28,6 +29,6 @@ object ClipboardUtils {
}
val service = view.context.getSystemService<ClipboardManager>() ?: return
service.setPrimaryClip(ClipData.newPlainText(data.second, data.first))
Snackbar.make(view, "${data.second} copied to clipboard", Snackbar.LENGTH_LONG).show()
Snackbar.make(view, view.context.getString(R.string.copied_to_clipboard, data.second), Snackbar.LENGTH_LONG).show()
}
}
+17 -17
View File
@@ -32,7 +32,7 @@
</plurals>
<plurals name="set_excluded_applications">
<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>
@@ -56,7 +56,7 @@
</plurals>
<string name="all_applications">Все приложения</string>
<string name="exclude_from_tunnel">Исключить</string>
<string name="include_in_tunnel">Только включить</string>
<string name="include_in_tunnel">Только включено</string>
<plurals name="include_n_applications">
<item quantity="one">Включить %d приложение</item>
<item quantity="few">Включить %d приложения</item>
@@ -82,12 +82,12 @@
<item quantity="other">секунд</item>
</plurals>
<string name="use_all_applications">Использовать все приложения</string>
<string name="add_peer">Добавить пира</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>
<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>
<string name="allowed_ips">Разрешенные IP-адреса</string>
<string name="app_name">WireGuard</string>
<string name="bad_config_context">%1$s из %2$s</string>
@@ -153,18 +153,18 @@
<string name="key_length_explanation_binary">: Ключи WireGuard должны быть 32 байта</string>
<string name="key_length_explanation_hex">: HEX ключи WireGuard должны содержать 64 символа (32 байта)</string>
<string name="listen_port">Порт</string>
<string name="log_export_error">Не удалось экспортировать логи: %s</string>
<string name="log_export_subject">Файл логов WireGuard Android</string>
<string name="log_export_error">Не удалось экспортировать журнал: %s</string>
<string name="log_export_subject">Файл журнала WireGuard Android</string>
<string name="log_export_success">Сохранено в “%s”</string>
<string name="log_export_title">Экспорт логов в файл</string>
<string name="log_saver_activity_label">Сохранить логи</string>
<string name="log_viewer_pref_summary">Логи могут помочь с отладкой</string>
<string name="log_viewer_pref_title">Просмотр логов приложения</string>
<string name="log_viewer_title">Логи</string>
<string name="log_export_title">Экспорт журнала в файл</string>
<string name="log_saver_activity_label">Сохранить журнал</string>
<string name="log_viewer_pref_summary">Журналы могут помочь при отладке</string>
<string name="log_viewer_pref_title">Просмотр журналов приложения</string>
<string name="log_viewer_title">Журнал</string>
<string name="logcat_error">Не удалось запустить logcat: </string>
<string name="module_disabler_disabled_summary">Экспериментальный модуль ядра приоритетнее и улучшает производительность</string>
<string name="module_disabler_disabled_title">Включить модуль ядра</string>
<string name="module_disabler_enabled_summary">Пользовательское пространство немного медленнее и улучшает стабильность</string>
<string name="module_disabler_enabled_summary">Более медленный бэкэнд пользовательского пространства может улучшить стабильность</string>
<string name="module_disabler_enabled_title">Выключить модуль ядра</string>
<string name="module_installer_error">Что-то пошло не так. Пожалуйста, попробуйте еще раз</string>
<string name="module_installer_initial">Экспериментальный модуль ядра может улучшить производительность</string>
@@ -176,7 +176,7 @@
<string name="multiple_tunnels_summary_off">Только один туннель, выключит другие</string>
<string name="multiple_tunnels_summary_on">Могут быть включены несколько туннелей одновременно</string>
<string name="multiple_tunnels_title">Несколько туннелей</string>
<string name="name">Имя</string>
<string name="name">Название</string>
<string name="no_config_error">Попытка поднять туннель без конфигурации</string>
<string name="no_configs_error">Конфигурации не найдены</string>
<string name="no_tunnels_error">Туннелей не существует</string>
@@ -229,13 +229,13 @@
<string name="tunnel_create_error">Не удалось создать туннель: %s</string>
<string name="tunnel_create_success">Успешно созданный туннель “%s”</string>
<string name="tunnel_error_already_exists">Туннель “%s” уже существует</string>
<string name="tunnel_error_invalid_name">Неправильное имя</string>
<string name="tunnel_error_invalid_name">Некорректное название</string>
<string name="tunnel_list_placeholder">Добавьте туннель с помощью синей кнопки</string>
<string name="tunnel_name">Название туннеля</string>
<string name="tunnel_on_error">Не удалось включить туннель (wgTurnOn вернул %d)</string>
<string name="tunnel_rename_error">Не удалось переименовать туннель: %s</string>
<string name="tunnel_rename_success">Туннель успешно переименован в “%s”</string>
<string name="type_name_go_userspace">Пользовательское пространство</string>
<string name="type_name_go_userspace">Перейти в пользовательское пространство</string>
<string name="type_name_kernel_module">Модуль ядра</string>
<string name="unknown_error">Неизвестная ошибка</string>
<string name="version_summary">%1$s v%2$s</string>
+218 -13
View File
@@ -1,24 +1,229 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<plurals name="delete_error">
<item quantity="one">%d tüneli silinemiyor: %s</item>
<item quantity="other">%d tünelleri silinemiyor: %s</item>
</plurals>
<plurals name="delete_success">
<item quantity="one">%d tüneli başarıyla silindi</item>
<item quantity="other">%d tünelleri başarıyla silindi</item>
</plurals>
<plurals name="delete_title">
<item quantity="one">%d tüneli seçildi</item>
<item quantity="other">%d tünelleri seçildi</item>
</plurals>
<plurals name="import_partial_success">
<item quantity="one">%1$d/%2$d tünel içe aktarıldı</item>
<item quantity="other">%1$d/%2$d tünel içe aktarıldı</item>
</plurals>
<plurals name="import_total_success">
<item quantity="one">%d tünel içe aktarıldı</item>
<item quantity="other">%d tünel içe aktarıldı</item>
</plurals>
<plurals name="set_excluded_applications">
<item quantity="one">%d Hariç Tutulan Uygulama</item>
<item quantity="other">%d Hariç Tutulan Uygulamalar</item>
</plurals>
<plurals name="set_included_applications">
<item quantity="one">%d Dahil Edilen Uygulama</item>
<item quantity="other">%d Dahil Edilen Uygulamalar</item>
</plurals>
<plurals name="n_excluded_applications">
<item quantity="one">%d hariç tutuldu</item>
<item quantity="other">%d hariç tutuldu</item>
</plurals>
<plurals name="n_included_applications">
<item quantity="one">%d dahil edildi</item>
<item quantity="other">%d dahil edildi</item>
</plurals>
<string name="all_applications">Tüm Uygulamalar</string>
<string name="exclude_from_tunnel">Hariç</string>
<string name="include_in_tunnel">Yalnızca dahil</string>
<plurals name="include_n_applications">
<item quantity="one">%d uygulamasını dahil et</item>
<item quantity="other">%d uygulamalarını dahil et</item>
</plurals>
<plurals name="exclude_n_applications">
<item quantity="one">%d uygulamasını hariç tut</item>
<item quantity="other">%d uygulamalarını hariç tut</item>
</plurals>
<plurals name="persistent_keepalive_seconds_unit">
<item quantity="one">her saniye</item>
<item quantity="other">%d saniyede bir</item>
</plurals>
<plurals name="persistent_keepalive_seconds_suffix">
<item quantity="one">saniye</item>
<item quantity="other">saniye</item>
</plurals>
<string name="use_all_applications">Tüm uygulamaları kullan</string>
<string name="add_peer">Eş ekle</string>
<string name="addresses">Adresler</string>
<string name="applications">Uygulamalar</string>
<string name="allow_remote_control_intents_summary_off">Harici uygulamalar tünelleri değiştiremez (önerilir)</string>
<string name="allow_remote_control_intents_summary_on">Harici uygulamalar tünelleri değiştirebilir (gelişmiş)</string>
<string name="allow_remote_control_intents_title">Uzaktan kontrol uygulamalarına izin ver</string>
<string name="allowed_ips">İzin verilen IP\'ler</string>
<string name="app_name">WireGuard</string>
<string name="bad_config_context">%1$s\'in %2$s</string>
<string name="bad_config_context_top_level">%s</string>
<string name="bad_config_error">%2$s içinde %1$s</string>
<string name="bad_config_explanation_pka">: Pozitif olmalı ve 65535\'ten fazla olmamalıdır</string>
<string name="bad_config_explanation_positive_number">: Pozitif olmalıdır</string>
<string name="bad_config_explanation_udp_port">: Geçerli bir UDP Port numarası olmalıdır</string>
<string name="bad_config_reason_invalid_key">Geçersiz anahtar</string>
<string name="bad_config_reason_invalid_number">Geçersiz numara</string>
<string name="bad_config_reason_invalid_value">Geçersiz değer</string>
<string name="bad_config_reason_missing_attribute">Eksik öznitelik</string>
<string name="bad_config_reason_missing_section">Eksik bölüm</string>
<string name="bad_config_reason_syntax_error">Sözdizimi hatası</string>
<string name="bad_config_reason_unknown_attribute">Bilinmeyen öznitelik</string>
<string name="bad_config_reason_unknown_section">Bilinmeyen bölüm</string>
<string name="bad_config_reason_value_out_of_range">Aralık dışı değer</string>
<string name="bad_extension_error">Dosya .conf veya .zip olmalıdır</string>
<string name="cancel">İptal</string>
<string name="config_delete_error">%s konfigürasyon dosyası silinemiyor</string>
<string name="config_exists_error">“%s” için konfigürasyon zaten var</string>
<string name="config_file_exists_error">“%s“ için konfigürasyon dosyası zaten var</string>
<string name="config_not_found_error">“%s“ konfigürasyon dosyası bulunamadı</string>
<string name="config_rename_error">“%s” konfigürasyon dosyası yeniden adlandırılamıyor</string>
<string name="config_save_error">“%1$s” için konfigürasyon kaydedilemiyor: %2$s</string>
<string name="config_save_success">“%s“ için konfigürasyon başarıyla kaydedildi</string>
<string name="create_activity_title">WireGuard Tüneli Yarat</string>
<string name="create_downloads_file_error">İndirilenler klasöründe dosya yaratılamadı</string>
<string name="create_empty">Sıfırdan Yaratın</string>
<string name="create_from_file">Arşivden geri yükle</string>
<string name="create_from_qr_code">QR Kodu Tara</string>
<string name="create_output_dir_error">Çıkış klasörü yaratılamadı</string>
<string name="create_tunnel">Tünel Yarat</string>
<string name="dark_theme_title">Koyu renk Temayı Kullan</string>
<string name="create_bin_dir_error">Yerel ikili dizin oluşturulamıyor</string>
<string name="create_downloads_file_error">İndirilenler klasöründe dosya oluşturulamadı</string>
<string name="create_empty">Sıfırdan oluştur</string>
<string name="create_from_file">Dosya veya arşivden ekle</string>
<string name="create_from_qr_code">QR kodundan ekle</string>
<string name="create_output_dir_error">Çıktı klasörü oluşturulamıyor</string>
<string name="create_temp_dir_error">Yerel geçici dizin oluşturulamıyor</string>
<string name="create_tunnel">Tünel Oluştur</string>
<string name="dark_theme_summary_off">Şu anda açık (gündüz) teması kullanılıyor</string>
<string name="dark_theme_summary_on">Şu anda karanlık (gece) teması kullanılıyor</string>
<string name="dark_theme_title">Koyu tema kullan</string>
<string name="delete">Sil</string>
<string name="dns_servers">DNS sunucuları</string>
<string name="edit">Düzenle</string>
<string name="endpoint">Uç nokta</string>
<string name="error_down">Tünel kapatılırken hata oluştu: %s</string>
<string name="error_fetching_apps">Uygulama listesi getirilirken hata oluştu: %s</string>
<string name="error_root">Lütfen root erişimi elde edin ve tekrar deneyin</string>
<string name="error_up">Tünel açılırken hata oluştu: %s</string>
<string name="exclude_private_ips">Özel IP’leri hariç tut</string>
<string name="generate_new_private_key">Yeni özel anahtar oluştur</string>
<string name="generic_error">Bilinmeyen “%s” hatası</string>
<string name="hint_automatic">(otomatik)</string>
<string name="hint_generated">(oluşturuldu)</string>
<string name="hint_optional">(isteğe bağlı)</string>
<string name="hint_optional_discouraged">(İsteğe bağlı-Önerilmez)</string>
<string name="hint_random">(Rastgele)</string>
<string name="import_from_qr_code">Tüneli içeri QR ile al</string>
<string name="hint_optional_discouraged">(isteğe bağlı, önerilmez)</string>
<string name="hint_random">(rastgele)</string>
<string name="illegal_filename_error">Geçersiz dosya ismi “%s”</string>
<string name="import_error">Tünel içeri aktarılamıyor: %s</string>
<string name="import_from_qr_code">Tüneli QR Kod ile İçe Aktar</string>
<string name="import_success">İçe aktarıldı “%s”</string>
<string name="interface_title">Arayüz</string>
<string name="listen_port">Dinleme portu</string>
<string name="log_export_title">Dosyayı Dışarı Aktar</string>
<string name="key_contents_error">Anahtardaki yanlış karakterler</string>
<string name="key_length_error">Yanlış anahtar uzunluğu</string>
<string name="key_length_explanation_base64">: WireGuard base64 anahtarları 44 karakter (32 bayt) olmalıdır</string>
<string name="key_length_explanation_binary">: WireGuard anahtarları 32 bayt olmalıdır</string>
<string name="key_length_explanation_hex">: WireGuard onaltılık anahtarları 64 karakter (32 bayt) olmalıdır</string>
<string name="listen_port">Dinlenen port</string>
<string name="log_export_error">Günlük dışa aktarılamıyor: %s</string>
<string name="log_export_subject">WireGuard Android Günlük Dosyası</string>
<string name="log_export_success">“%s” ’e kaydedildi</string>
<string name="log_export_title">Günlük dosyasını dışa aktar</string>
<string name="log_saver_activity_label">Günlüğü kaydet</string>
<string name="log_viewer_pref_title">Uygulama günlüğüne bak</string>
<string name="log_viewer_pref_summary">Günlükler hata ayıklamaya yardımcı olabilir</string>
<string name="log_viewer_pref_title">Uygulama günlüğünü görüntüle</string>
<string name="log_viewer_title">Günlük</string>
<string name="logcat_error">Logcat çalıştırılamıyor: </string>
<string name="module_disabler_disabled_summary">Deneysel çekirdek modülü performansı artırabilir</string>
<string name="module_disabler_disabled_title">Çekirdek modülü arka ucunu etkinleştir</string>
<string name="module_disabler_enabled_summary">Daha yavaş kullanıcı alanı arka ucu kararlılığı artırabilir</string>
<string name="module_disabler_enabled_title">Çekirdek modülü arka ucunu devre dışı bırak</string>
<string name="module_installer_error">Bir şeyler yanlış gitti. Lütfen tekrar deneyin</string>
<string name="module_installer_initial">Deneysel çekirdek modülü performansı artırabilir</string>
<string name="module_installer_not_found">Cihazınız için uygun modül yok</string>
<string name="module_installer_title">Çekirdek modülünü indir ve yükle</string>
<string name="module_installer_working">İndiriliyor ve yükleniyor…</string>
<string name="module_version_error">Çekirdek modülü sürümü belirlenemiyor</string>
<string name="mtu">MTU</string>
<string name="multiple_tunnels_summary_off">Bir tüneli açmak diğerlerini kapatır</string>
<string name="multiple_tunnels_summary_on">Aynı anda birden fazla tünel açılabilir</string>
<string name="multiple_tunnels_title">Birden çok eşzamanlı tünele izin verin</string>
<string name="name">İsim</string>
<string name="no_config_error">Konfigürasyonsuz bir tünel açmaya çalışılıyor</string>
<string name="no_configs_error">Konfigürasyon bulunamadı</string>
<string name="no_tunnels_error">Tünel yok</string>
<string name="parse_error_generic">dizi</string>
<string name="parse_error_inet_address">IP adresi</string>
<string name="parse_error_inet_endpoint">uç nokta</string>
<string name="parse_error_inet_network">IP ağı</string>
<string name="parse_error_integer">numara</string>
<string name="parse_error_reason">%1$s “%2$s” ayrıştırılamıyor</string>
<string name="peer">Eş</string>
<string name="permission_description">WireGuard tünellerini kontrol edin, tünelleri istediğiniz zaman etkinleştirin ve devre dışı bırakın, İnternet trafiğini potansiyel olarak yanlış yönlendirin</string>
<string name="permission_label">WireGuard tünellerini kontrol edin</string>
<string name="persistent_keepalive">Kalıcı canlı tutma</string>
<string name="pre_shared_key">Önceden paylaşılan anahtar</string>
<string name="pre_shared_key_enabled">etkinleştirildi</string>
<string name="private_key">Özel anahtar</string>
<string name="public_key">Genel anahtar</string>
<string name="qr_code_hint">İpucu: `qrencode -t ansiutf8 &lt; tunnel.conf` ile oluşturun.</string>
<string name="restore_on_boot_summary_off">Önyüklemede etkin tünelleri açmayacak</string>
<string name="restore_on_boot_summary_on">Önyüklemede etkin tünelleri açacak</string>
<string name="restore_on_boot_title">Cihaz açılırken başlat</string>
<string name="save">Kaydet</string>
<string name="select_all">Tümünü seç</string>
<string name="settings">Ayarlar</string>
<string name="shell_exit_status_read_error">Kabuk, çıktı durumunu okuyamıyor</string>
<string name="shell_marker_count_error">Kabuk 4 işaret bekledi, %d aldı</string>
<string name="shell_start_error">Kabuk başlatılamadı: %d</string>
<string name="success_application_will_restart">Başarı. Uygulama şimdi yeniden başlayacak…</string>
<string name="toggle_all">Tümünü Değiştir</string>
<string name="toggle_error">WireGuard tüneli değiştirilirken hata oluştu: %s</string>
<string name="tools_installer_already">wg ve wg-quick zaten kurulu</string>
<string name="tools_installer_failure">Komut satırı araçları yüklenemiyor (root yok mu?)</string>
<string name="tools_installer_initial">Komut dosyası oluşturmak için isteğe bağlı araçları yükleyin</string>
<string name="tools_installer_initial_magisk">Magisk modülü olarak komut dosyası oluşturmak için isteğe bağlı araçları yükleyin</string>
<string name="tools_installer_initial_system">Sistem bölümüne komut dosyası oluşturmak için isteğe bağlı araçlar yükleyin</string>
<string name="tools_installer_success_magisk">wg ve wg-quick bir Magisk modülü olarak kuruldu (yeniden başlatma gerekir)</string>
<string name="tools_installer_success_system">wg ve wg-quick, sistem bölümüne yüklendi</string>
<string name="tools_installer_title">Komut satırı araçlarını yükleyin</string>
<string name="tools_installer_working">wg ve wg-quick kuruluyor</string>
<string name="tools_unavailable_error">Gerekli araçlar mevcut değil</string>
<string name="transfer">Transfer</string>
<string name="transfer_bytes">%d B</string>
<string name="transfer_gibibytes">%.2f GiB</string>
<string name="transfer_kibibytes">%.2f KiB</string>
<string name="transfer_mibibytes">%.2f MiB</string>
<string name="transfer_rx_tx">rx: %1$s, tx: %2$s</string>
<string name="transfer_tibibytes">%.2f TiB</string>
<string name="tun_create_error">Tun cihazı oluşturulamıyor</string>
<string name="tunnel_config_error">Tünel yapılandırılamıyor (wg-quick döndürdü: %d)</string>
<string name="tunnel_create_error">Tünel oluşturulamıyor: %s</string>
<string name="tunnel_create_success">Tünel başarıyla oluşturuldu “%s”</string>
<string name="tunnel_error_already_exists">“%s” tüneli zaten mevcut</string>
<string name="tunnel_error_invalid_name">Geçersiz isim</string>
<string name="tunnel_list_placeholder">Mavi düğmeyi kullanarak bir tünel ekleyin</string>
<string name="tunnel_name">Tünel İsmi</string>
<string name="tunnel_on_error">Tünel aktif edilemiyor (wgTornOn döndürdü: %d)</string>
<string name="tunnel_rename_error">Tünel yeniden adlandırılamıyor: %s</string>
<string name="tunnel_rename_success">Tünel başarıyla yeniden adlandırıldı “%s”</string>
<string name="type_name_go_userspace">Kullanıcı alanına git</string>
<string name="type_name_kernel_module">Çekirdek modülü</string>
<string name="unknown_error">Bilinmeyen hata</string>
<string name="version_summary">%1$s backend v%2$s</string>
<string name="version_summary_checking">%s arka uç sürümü kontrol ediliyor</string>
<string name="version_summary_unknown">Bilinmeyen %s sürümü</string>
<string name="version_title">Android için WireGuard v%s</string>
<string name="vpn_not_authorized_error">VPN hizmeti kullanıcı tarafından yetkilendirilmemiş</string>
<string name="vpn_start_error">Android VPN hizmeti başlatılamıyor</string>
<string name="zip_export_error">Tüneller dışa aktarılamıyor: %s</string>
<string name="zip_export_success">“%s” ’e kaydedildi</string>
<string name="zip_export_summary">Zip dosyası indirilenler klasörüne kaydedilecek</string>
<string name="zip_export_title">Tünelleri zip dosyasına aktar</string>
<string name="biometric_prompt_zip_exporter_title">Tünelleri dışa aktarmak için kimlik doğrulama</string>
<string name="biometric_prompt_private_key_title">Özel anahtarı görüntülemek için kimlik doğrulaması</string>
<string name="biometric_auth_error">Kimlik doğrulama hatası</string>
<string name="biometric_auth_error_reason">Kimlik doğrulama hatası: %s</string>
</resources>
+1 -1
View File
@@ -27,7 +27,7 @@
<plurals name="n_included_applications">
<item quantity="other">对 %d 个应用生效</item>
</plurals>
<string name="all_applications">对全部应用生效</string>
<string name="all_applications">全部应用程序</string>
<string name="exclude_from_tunnel">不生效</string>
<string name="include_in_tunnel">生效</string>
<plurals name="include_n_applications">
+1
View File
@@ -97,6 +97,7 @@
<string name="create_output_dir_error">Cannot create output directory</string>
<string name="create_temp_dir_error">Cannot create local temporary directory</string>
<string name="create_tunnel">Create Tunnel</string>
<string name="copied_to_clipboard">%s copied to clipboard</string>
<string name="dark_theme_summary_off">Currently using light (day) theme</string>
<string name="dark_theme_summary_on">Currently using dark (night) theme</string>
<string name="dark_theme_title">Use dark theme</string>
+2 -2
View File
@@ -1,6 +1,6 @@
buildscript {
ext {
wireguardVersionCode = 485
wireguardVersionName = '1.0.20201224'
wireguardVersionCode = 486
wireguardVersionName = '1.0.20210211'
}
}