Compare commits

...

36 Commits

Author SHA1 Message Date
Zane Schepke e269aa88d9 chore: bump verison to 4.0.2 2025-09-26 09:51:15 -04:00
Zane Schepke 7c3eabb19b fix: logs export bug, export file naming 2025-09-26 09:46:30 -04:00
Zane Schepke acdefd80fa fix: fdroid agp build issue, bump deps
closes #971
2025-09-26 08:31:17 -04:00
Zane Schepke 09fa9dabdd fix: tunnel on ethernet toggle
closes #978
2025-09-26 08:23:53 -04:00
Zane Schepke 33a02262a8 fix: pin lock crash bug
closes #967
2025-09-26 08:20:01 -04:00
Zane Schepke 14a7278747 chore: bump for patch version 2025-09-25 01:43:57 -04:00
Zane Schepke 8fd2d8f62f fix: ipv4 fallback, proxy search domain support and parser fix
#961
#960
2025-09-23 07:34:34 -04:00
Zane Schepke 7be051a664 fix: can't edit ping target bug
closes #959
2025-09-23 07:32:07 -04:00
Zane Schepke 88fff0b31c fix: logs export bug
#960
2025-09-23 03:58:19 -04:00
Zane Schepke 99a3fba97f chore: update issue template 2025-09-22 20:39:15 -04:00
Zane Schepke 1c220b57a8 chore: bump app version with notes (#955) 2025-09-22 20:18:46 -04:00
Zane Schepke 439dbf48a0 fix: qr code import bug 2025-09-22 19:48:07 -04:00
Zane Schepke 6e6f405535 fix: doh and stats not display bug 2025-09-22 18:21:31 -04:00
Zane Schepke 3d8254f738 docs: update readme and store descriptions 2025-09-21 06:12:09 -04:00
Zane Schepke 255877db3b fix: bump okhttp
fix: bump amnezia version for okhttp
2025-09-20 20:32:20 -04:00
Zane Schepke 2b8131da41 fix: location disclosure bug 2025-09-20 06:08:44 -04:00
Zane Schepke c8699f5610 refactor: cleanup old strings, optimize 2025-09-20 04:19:48 -04:00
Zane Schepke fe21c0eda3 chore: cleanup old changelogs 2025-09-20 03:34:07 -04:00
Weblate (bot) 144421987a Translations update from Hosted Weblate (#858)
Co-authored-by: Matthaiks <kitynska@gmail.com>
Co-authored-by: Kachelkaiser <kachelkaiser@htpst.de>
Co-authored-by: 大王叫我来巡山 <hamburger2048@users.noreply.hosted.weblate.org>
Co-authored-by: Faisal Gull <mail.faisalrehman.345@gmail.com>
Co-authored-by: solokot <solokot@gmail.com>
Co-authored-by: EESF-2 <eesf-2@users.noreply.hosted.weblate.org>
Co-authored-by: catelixor <catelixor+weblate@proton.me>
Co-authored-by: Priit Jõerüüt <jrthwlate@users.noreply.hosted.weblate.org>
Co-authored-by: ssantos <ssantos@web.de>
Co-authored-by: Ben Princen <ben.princen@gmail.com>
Co-authored-by: venstakee <venightigrok@gmail.com>
Co-authored-by: Войнов Артем Романович <voynovar@gmail.com>
Co-authored-by: seyhan <ardaseyhantemli1@gmail.com>
Co-authored-by: Patrik <patrik1305@binternet.eu>
Co-authored-by: DikozImpact <22dikoz22@gmail.com>
Co-authored-by: Andrei Shevchuk <shevchuk@users.noreply.hosted.weblate.org>
Co-authored-by: Federico Pierantoni <federico.pieranton@gmail.com>
Co-authored-by: François-Xavier Choinière <fx@efficks.com>
Co-authored-by: MouaisTe44 <r.craft.212121@gmail.com>
2025-09-20 03:27:31 -04:00
Zane Schepke 4b4a8cc273 fix: okhttp proguard bug 2025-09-20 03:11:58 -04:00
Zane Schepke fe9315b64a chore: bump deps 2025-09-19 04:40:44 -04:00
Zane Schepke 280c187c5b fix: build performance 2025-09-19 04:31:08 -04:00
Zane Schepke 41cfa8fcec fix: shizuku and root shell wifi command
closes #900
2025-09-19 02:42:29 -04:00
Zane Schepke 274e6aec0f fix: split tunnel sort checked to top
closes #882
2025-09-18 23:53:45 -04:00
Zane Schepke 1127db1c56 fix: make auto tunnel observe mode switches 2025-09-18 22:55:41 -04:00
Zane Schepke 5762a023a9 fix: nav to same screen bug 2025-09-18 22:13:14 -04:00
Zane Schepke 5b0cda2859 fix: tunnel start fail on proxy mode switch 2025-09-18 22:05:00 -04:00
dependabot[bot] 706b2e8d90 chore(deps): bump actions/checkout from 4 to 5 (#892)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-18 13:09:01 -04:00
dependabot[bot] 62b662950a chore(deps): bump actions/setup-java from 4 to 5 (#910)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-18 13:08:48 -04:00
Zane Schepke f90765ff38 chore(deps): bump 2025-09-18 13:07:52 -04:00
Zane Schepke 39fe7691e8 fix: tunnel status bug 2025-09-18 05:45:51 -04:00
Zane Schepke 2c6946cc76 fix: delete button hidden bug
closes #945
2025-09-18 05:15:03 -04:00
Zane Schepke 512d765c55 fix: delete button hidden bug
closes #945
2025-09-18 04:05:36 -04:00
Zane Schepke e5888a628d fix: export amnezia config bug 2025-09-18 03:10:59 -04:00
Zane Schepke 7a3fb037ee refactor: change support crypto options/update addresses 2025-09-17 23:28:26 -04:00
Zane Schepke 5356246eea refactor: repositories 2025-09-15 06:47:04 -04:00
200 changed files with 2220 additions and 3085 deletions
+1 -1
View File
@@ -15,7 +15,7 @@ A clear and concise description of what the bug is.
- Device: [e.g. Pixel 4a]
- Android Version: [e.g. Android 13]
- App Version [e.g. 3.3.3]
- Backend: [e.g. Kernel, Userspace]
- App mode: [e.g. Kernel, VPN, Proxy, Lockdown]
**To Reproduce**
Steps to reproduce the behavior:
+2 -2
View File
@@ -72,11 +72,11 @@ jobs:
outputs:
UPLOAD_DIR_ANDROID: ${{ env.UPLOAD_DIR_ANDROID }}
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v5
with:
fetch-depth: 0
- name: Set up JDK 17
uses: actions/setup-java@v4
uses: actions/setup-java@v5
with:
distribution: 'temurin'
java-version: '17'
+2 -2
View File
@@ -16,7 +16,7 @@ jobs:
has_new_commits: ${{ steps.check.outputs.new_commits }}
steps:
- name: Checkout Repository
uses: actions/checkout@v4
uses: actions/checkout@v5
- name: Check for new commits
id: check
env:
@@ -41,7 +41,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v5
- name: Install system dependencies
run: |
+2 -2
View File
@@ -10,9 +10,9 @@ jobs:
format_check:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v5
- name: Set up JDK 17
uses: actions/setup-java@v4
uses: actions/setup-java@v5
with:
distribution: 'temurin'
java-version: '17'
+3 -3
View File
@@ -72,7 +72,7 @@ jobs:
name: publish-github
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v5
with:
ref: ${{ github.event_name == 'push' && github.ref || 'main' }}
- name: Install system dependencies
@@ -189,9 +189,9 @@ jobs:
KEY_STORE_LOCATION: ${{ github.workspace }}/app/keystore/
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v5
- name: Set up JDK 17
uses: actions/setup-java@v4
uses: actions/setup-java@v5
with:
distribution: 'temurin'
java-version: '17'
+29 -29
View File
@@ -4,7 +4,7 @@ WG Tunnel
<div align="center">
An alternative Android client app for [WireGuard](https://www.wireguard.com/)
An alternative FOSS Android client for [WireGuard](https://www.wireguard.com/)
and [AmneziaWG](https://docs.amnezia.org/documentation/amnezia-wg/)
<br />
<br />
@@ -37,11 +37,11 @@ and [AmneziaWG](https://docs.amnezia.org/documentation/amnezia-wg/)
<summary>Table of Contents</summary>
- [About](#about)
- [Acknowledgements](#acknowledgements)
- [Screenshots](#screenshots)
- [Features](#features)
- [Building](#building)
- [Translation](#translation)
- [Acknowledgements](#acknowledgements)
- [Contributing](#contributing)
</details>
@@ -49,22 +49,13 @@ and [AmneziaWG](https://docs.amnezia.org/documentation/amnezia-wg/)
<div style="text-align: left;">
## About
Inspired by the official [wireguard-android](https://github.com/WireGuard/wireguard-android) app, WG Tunnel was created to address features and support missing from the official app. This app combines support for both [WireGuard](https://www.wireguard.com/)
and [AmneziaWG](https://docs.amnezia.org/documentation/amnezia-wg/), with its primary feature of auto-tunneling (on-demand tunneling).
WG Tunnel is an alternative Android client for WireGuard and AmneziaWG, inspired by the official WireGuard Android app. It fills gaps in the official client by adding advanced features like auto-tunneling (on-demand VPN activation), while seamlessly supporting both protocols across app modes—including Kernel (for direct WireGuard kernel integration; AmneziaWG not supported), VPN (standard system-level tunneling), Lockdown (a custom kill switch for leak prevention), and Proxy (built-in HTTP/SOCKS5 forwarding)—for enhanced privacy, censorship resistance, and flexibility.
</div>
<div style="text-align: left;">
## Acknowledgements
Thank you to the following:
- All of the users that have helped contribute to the project with ideas, translations, feedback, bug reports, testing, and donations.
- [WireGuard](https://www.wireguard.com/) - Jason A. Donenfeld (https://github.com/WireGuard/wireguard-android)
- [AmneziaWG](https://docs.amnezia.org/documentation/amnezia-wg/) - Amnezia Team (https://github.com/amnezia-vpn/amneziawg-android)
## Screenshots
</div>
@@ -79,26 +70,26 @@ Thank you to the following:
## Features
* Add tunnels via .conf file, zip, manual entry, clipboard, or QR code
* Auto-tunnel based on Wi-Fi SSID, ethernet, or mobile data
* Split tunneling by application with search
* Support for kernel and userspace modes
* Amnezia support for userspace mode for DPI/censorship protection
* Pre/Post Up/Down scripts support for all modes on a rooted device
* Always-On VPN support
* Export tunnels to zip
* Quick tile support for tunnel toggling, auto-tunneling
* Shortcuts support for tunnel toggling, auto-tunneling
* Intent automation support for all tunnels
* In app VPN kill switch with LAN bypass
* Automatic auto-tunneling service and/or tunnel restart after reboot or app update
* Battery preservation measures
* Restart tunnel on ping failure
- **Tunnel Import Methods**: Easily add tunnels using .conf files, ZIP archives, manual entry, or QR code scanning.
- **Auto-Tunneling**: Automatically activate tunnels based on Wi-Fi SSID, Ethernet connections, or mobile data networks.
- **Split Tunneling**: Flexible support for routing specific apps or traffic through the VPN.
- **WireGuard Modes**: Full compatibility with WireGuard in both kernel and userspace implementations.
- **AmneziaWG Integration**: Userspace mode for AmneziaWG, providing robust censorship evasion.
- **Always-On VPN**: Ensures continuous protection with Android's Always-On VPN feature.
- **Quick Controls**: Quick Settings tile and home screen shortcuts for easy VPN toggling.
- **Automation Support**: Intent-based automation for controlling tunnels.
- **Auto-Restore**: Seamlessly restores auto-tunneling and active tunnels after device restarts or app updates.
- **Proxying Options**: Built-in HTTP and SOCKS5 proxy support within tunnels.
- **Lockdown Mode**: Custom kill switch for maximum leak prevention and security.
- **Dynamic DNS Handling**: Detects and updates DNS changes without tunnel restarts.
- **Monitoring Tools**: Advanced tunnel monitoring features for tunnel performance monitoring.
- **Android TV Support**: Android TV support for secure streaming and browsing.
- **Advanced DNS**: DNS over HTTPS support for tunnel endpoint resolutions.
## Building
```sh
git clone https://github.com/zaneschepke/wgtunnel
git clone https://github.com/wgtunnel/wgtunnel
cd wgtunnel
```
@@ -114,6 +105,15 @@ Help translate WG Tunnel into your language
at [Hosted Weblate](https://hosted.weblate.org/engage/wg-tunnel/).\
[![Translation status](https://hosted.weblate.org/widgets/wg-tunnel/-/multi-auto.svg)](https://hosted.weblate.org/engage/wg-tunnel/)
## Acknowledgements
Thank you to the following:
- All of the users that have helped contribute to the project with ideas, translations, feedback, bug reports, testing, and donations.
- [WireGuard](https://www.wireguard.com/) - Jason A. Donenfeld (https://github.com/WireGuard/wireguard-android)
- [AmneziaWG](https://docs.amnezia.org/documentation/amnezia-wg/) - Amnezia Team (https://github.com/amnezia-vpn/amneziawg-android)
- [JetBrains](https://jetbrains.com) - For supporting open-source developers with free software licenses.
## Contributing
Any contributions in the form of feedback, issues, code, or translations are welcome and much
+3 -1
View File
@@ -9,7 +9,6 @@ plugins {
alias(libs.plugins.compose.compiler)
alias(libs.plugins.grgit)
alias(libs.plugins.licensee)
id("kotlin-parcelize")
}
android {
@@ -25,6 +24,9 @@ android {
ksp { arg("room.schemaLocation", "$projectDir/schemas") }
// fix okhttp proguard issue
packaging { resources { pickFirsts.add("okhttp3/internal/publicsuffix/publicsuffixes.gz") } }
defaultConfig {
applicationId = Constants.APP_ID
minSdk = Constants.MIN_SDK
@@ -103,8 +103,8 @@ class MainActivity : AppCompatActivity() {
@SuppressLint("BatteryLife")
override fun onCreate(savedInstanceState: Bundle?) {
enableEdgeToEdge(
statusBarStyle = SystemBarStyle.Companion.auto(Color.TRANSPARENT, Color.TRANSPARENT),
navigationBarStyle = SystemBarStyle.Companion.auto(Color.TRANSPARENT, Color.TRANSPARENT),
statusBarStyle = SystemBarStyle.auto(Color.TRANSPARENT, Color.TRANSPARENT),
navigationBarStyle = SystemBarStyle.auto(Color.TRANSPARENT, Color.TRANSPARENT),
)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
window.isNavigationBarContrastEnforced = false
@@ -126,14 +126,8 @@ class MainActivity : AppCompatActivity() {
val navController = rememberNavController()
val scope = rememberCoroutineScope()
var pinManagerInitialized by remember { mutableStateOf(false) }
LaunchedEffect(appState.isAppLoaded) {
if (appState.isAppLoaded) {
if (appState.pinLockEnabled && !pinManagerInitialized) {
PinManager.initialize(this@MainActivity)
pinManagerInitialized = true
}
appState.locale.let { LocaleUtil.changeLocale(it) }
}
}
@@ -197,7 +191,6 @@ class MainActivity : AppCompatActivity() {
requestingAppMode = Pair(sideEffect.requestingMode, sideEffect.config)
vpnActivity.launch(VpnService.prepare(this@MainActivity))
}
is GlobalSideEffect.ShareFile -> context.launchShareFile(sideEffect.file)
is GlobalSideEffect.Snackbar ->
scope.launch {
snackbar.showSnackbar(sideEffect.message.asString(context))
@@ -271,7 +264,10 @@ class MainActivity : AppCompatActivity() {
Route.Lock
else Route.TunnelsGraph,
) {
composable<Route.Lock> { PinLockScreen() }
composable<Route.Lock> {
PinManager.initialize(context = this@MainActivity)
PinLockScreen()
}
navigation<Route.TunnelsGraph>(
startDestination = Route.Tunnels
) {
@@ -317,9 +313,7 @@ class MainActivity : AppCompatActivity() {
}
navigation<Route.AutoTunnelGraph>(
startDestination =
if (appState.isLocationDisclosureShown) Route.AutoTunnel
else Route.LocationDisclosure
startDestination = Route.AutoTunnel
) {
composable<Route.LocationDisclosure> {
val viewModel =
@@ -11,9 +11,10 @@ import com.zaneschepke.wireguardautotunnel.core.tunnel.TunnelManager
import com.zaneschepke.wireguardautotunnel.core.worker.ServiceWorker
import com.zaneschepke.wireguardautotunnel.di.ApplicationScope
import com.zaneschepke.wireguardautotunnel.di.IoDispatcher
import com.zaneschepke.wireguardautotunnel.di.MainDispatcher
import com.zaneschepke.wireguardautotunnel.domain.enums.BackendMode
import com.zaneschepke.wireguardautotunnel.domain.repository.AppDataRepository
import com.zaneschepke.wireguardautotunnel.domain.repository.AppStateRepository
import com.zaneschepke.wireguardautotunnel.domain.repository.GeneralSettingRepository
import com.zaneschepke.wireguardautotunnel.domain.repository.TunnelRepository
import com.zaneschepke.wireguardautotunnel.util.ReleaseTree
import dagger.hilt.android.HiltAndroidApp
import javax.inject.Inject
@@ -39,11 +40,11 @@ class WireGuardAutoTunnel : Application(), Configuration.Provider {
@Inject lateinit var logReader: LogReader
@Inject lateinit var appDataRepository: AppDataRepository
@Inject @IoDispatcher lateinit var ioDispatcher: CoroutineDispatcher
@Inject @MainDispatcher lateinit var mainDispatcher: CoroutineDispatcher
@Inject lateinit var settingsRepository: GeneralSettingRepository
@Inject lateinit var tunnelsRepository: TunnelRepository
@Inject lateinit var appStateRepository: AppStateRepository
@Inject lateinit var notificationMonitor: NotificationMonitor
@@ -67,15 +68,15 @@ class WireGuardAutoTunnel : Application(), Configuration.Provider {
}
applicationScope.launch(ioDispatcher) {
launch { if (appDataRepository.appState.isLocalLogsEnabled()) logReader.start() }
launch { if (appStateRepository.isLocalLogsEnabled()) logReader.start() }
launch { notificationMonitor.handleApplicationNotifications() }
}
GoBackend.setAlwaysOnCallback {
applicationScope.launch {
val settings = appDataRepository.settings.get()
val settings = settingsRepository.get()
if (settings.isAlwaysOnVpnEnabled) {
val tunnel = appDataRepository.getPrimaryOrFirstTunnel()
val tunnel = tunnelsRepository.getDefaultTunnel()
tunnel?.let { tunnelManager.startTunnel(it) }
} else {
Timber.w("Always-on VPN is not enabled in app settings")
@@ -3,7 +3,6 @@ package com.zaneschepke.wireguardautotunnel.core.broadcast
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import com.zaneschepke.wireguardautotunnel.core.service.ServiceManager
import com.zaneschepke.wireguardautotunnel.core.tunnel.TunnelManager
import com.zaneschepke.wireguardautotunnel.di.ApplicationScope
import com.zaneschepke.wireguardautotunnel.domain.repository.TunnelRepository
@@ -19,8 +18,6 @@ class KernelReceiver : BroadcastReceiver() {
@Inject lateinit var tunnelRepository: TunnelRepository
@Inject lateinit var serviceManager: ServiceManager
@Inject lateinit var tunnelManager: TunnelManager
override fun onReceive(context: Context, intent: Intent) {
@@ -31,7 +28,6 @@ class KernelReceiver : BroadcastReceiver() {
val tunnel = tunnelRepository.findByTunnelName(name)
tunnel?.let { tunnelRepository.save(it.copy(isActive = true)) }
}
serviceManager.updateTunnelTile()
}
}
}
@@ -4,10 +4,10 @@ import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import com.zaneschepke.wireguardautotunnel.core.notification.NotificationManager
import com.zaneschepke.wireguardautotunnel.core.service.ServiceManager
import com.zaneschepke.wireguardautotunnel.core.tunnel.TunnelManager
import com.zaneschepke.wireguardautotunnel.di.ApplicationScope
import com.zaneschepke.wireguardautotunnel.domain.enums.NotificationAction
import com.zaneschepke.wireguardautotunnel.domain.repository.GeneralSettingRepository
import com.zaneschepke.wireguardautotunnel.domain.repository.TunnelRepository
import dagger.hilt.android.AndroidEntryPoint
import javax.inject.Inject
@@ -17,18 +17,19 @@ import kotlinx.coroutines.launch
@AndroidEntryPoint
class NotificationActionReceiver : BroadcastReceiver() {
@Inject lateinit var serviceManager: ServiceManager
@Inject lateinit var tunnelManager: TunnelManager
@Inject lateinit var tunnelRepository: TunnelRepository
@Inject lateinit var settingsRepository: GeneralSettingRepository
@Inject @ApplicationScope lateinit var applicationScope: CoroutineScope
override fun onReceive(context: Context, intent: Intent) {
applicationScope.launch {
when (intent.action) {
NotificationAction.AUTO_TUNNEL_OFF.name -> serviceManager.stopAutoTunnel()
NotificationAction.AUTO_TUNNEL_OFF.name ->
settingsRepository.updateAutoTunnelEnabled(false)
NotificationAction.TUNNEL_OFF.name -> {
val tunnelId = intent.getIntExtra(NotificationManager.EXTRA_ID, 0)
if (tunnelId == STOP_ALL_TUNNELS_ID)
@@ -3,10 +3,11 @@ package com.zaneschepke.wireguardautotunnel.core.broadcast
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import com.zaneschepke.wireguardautotunnel.core.service.ServiceManager
import com.zaneschepke.wireguardautotunnel.core.tunnel.TunnelManager
import com.zaneschepke.wireguardautotunnel.di.ApplicationScope
import com.zaneschepke.wireguardautotunnel.domain.repository.AppDataRepository
import com.zaneschepke.wireguardautotunnel.domain.repository.AppStateRepository
import com.zaneschepke.wireguardautotunnel.domain.repository.GeneralSettingRepository
import com.zaneschepke.wireguardautotunnel.domain.repository.TunnelRepository
import com.zaneschepke.wireguardautotunnel.util.Constants
import dagger.hilt.android.AndroidEntryPoint
import javax.inject.Inject
@@ -19,9 +20,9 @@ class RemoteControlReceiver : BroadcastReceiver() {
@Inject @ApplicationScope lateinit var applicationScope: CoroutineScope
@Inject lateinit var appDataRepository: AppDataRepository
@Inject lateinit var serviceManager: ServiceManager
@Inject lateinit var appStateRepository: AppStateRepository
@Inject lateinit var settingsRepository: GeneralSettingRepository
@Inject lateinit var tunnelsRepository: TunnelRepository
@Inject lateinit var tunnelManager: TunnelManager
@@ -52,10 +53,10 @@ class RemoteControlReceiver : BroadcastReceiver() {
val action = intent.action ?: return
val appAction = Action.fromAction(action) ?: return Timber.w("Unknown action $action")
applicationScope.launch {
if (!appDataRepository.appState.isRemoteControlEnabled())
if (!appStateRepository.isRemoteControlEnabled())
return@launch Timber.w("Remote control disabled")
val key =
appDataRepository.appState.getRemoteKey()
appStateRepository.getRemoteKey()
?: return@launch Timber.w("Remote control key missing")
if (key != intent.getStringExtra(EXTRA_KEY)?.trim())
return@launch Timber.w("Invalid remote control key")
@@ -64,7 +65,7 @@ class RemoteControlReceiver : BroadcastReceiver() {
val tunnelName =
intent.getStringExtra(EXTRA_TUN_NAME) ?: return@launch startDefaultTunnel()
val tunnel =
appDataRepository.tunnels.findByTunnelName(tunnelName)
tunnelsRepository.findByTunnelName(tunnelName)
?: return@launch startDefaultTunnel()
tunnelManager.startTunnel(tunnel)
}
@@ -73,20 +74,18 @@ class RemoteControlReceiver : BroadcastReceiver() {
intent.getStringExtra(EXTRA_TUN_NAME)
?: return@launch tunnelManager.stopActiveTunnels()
val tunnel =
appDataRepository.tunnels.findByTunnelName(tunnelName)
tunnelsRepository.findByTunnelName(tunnelName)
?: return@launch tunnelManager.stopActiveTunnels()
tunnelManager.stopTunnel(tunnel.id)
}
Action.START_AUTO_TUNNEL -> serviceManager.startAutoTunnel()
Action.STOP_AUTO_TUNNEL -> serviceManager.stopAutoTunnel()
Action.START_AUTO_TUNNEL -> settingsRepository.updateAutoTunnelEnabled(true)
Action.STOP_AUTO_TUNNEL -> settingsRepository.updateAutoTunnelEnabled(false)
}
}
}
private suspend fun startDefaultTunnel() {
appDataRepository.getPrimaryOrFirstTunnel()?.let { tunnel ->
tunnelManager.startTunnel(tunnel)
}
tunnelsRepository.getDefaultTunnel()?.let { tunnel -> tunnelManager.startTunnel(tunnel) }
}
companion object {
@@ -4,11 +4,9 @@ import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import com.zaneschepke.logcatter.LogReader
import com.zaneschepke.wireguardautotunnel.core.service.ServiceManager
import com.zaneschepke.wireguardautotunnel.core.tunnel.TunnelManager
import com.zaneschepke.wireguardautotunnel.di.ApplicationScope
import com.zaneschepke.wireguardautotunnel.di.IoDispatcher
import com.zaneschepke.wireguardautotunnel.domain.repository.AppDataRepository
import dagger.hilt.android.AndroidEntryPoint
import javax.inject.Inject
import kotlinx.coroutines.CoroutineDispatcher
@@ -18,13 +16,9 @@ import timber.log.Timber
@AndroidEntryPoint
class RestartReceiver : BroadcastReceiver() {
@Inject lateinit var appDataRepository: AppDataRepository
@Inject @ApplicationScope lateinit var applicationScope: CoroutineScope
@Inject lateinit var serviceManager: ServiceManager
// injecting this should let tunnelManger handle clean startup
@Inject lateinit var tunnelManager: TunnelManager
@Inject lateinit var logReader: LogReader
@@ -33,8 +27,6 @@ class RestartReceiver : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
Timber.d("RestartReceiver triggered with action: ${intent.action}")
serviceManager.updateTunnelTile()
serviceManager.updateAutoTunnelTile()
if (intent.action == Intent.ACTION_MY_PACKAGE_REPLACED)
applicationScope.launch(ioDispatcher) { logReader.deleteAndClearLogs() }
}
@@ -14,13 +14,11 @@ import com.zaneschepke.wireguardautotunnel.core.tunnel.TunnelMonitor
import com.zaneschepke.wireguardautotunnel.di.IoDispatcher
import com.zaneschepke.wireguardautotunnel.domain.enums.NotificationAction
import com.zaneschepke.wireguardautotunnel.domain.model.TunnelConf
import com.zaneschepke.wireguardautotunnel.domain.repository.AppDataRepository
import com.zaneschepke.wireguardautotunnel.domain.repository.TunnelRepository
import com.zaneschepke.wireguardautotunnel.util.extensions.distinctByKeys
import dagger.hilt.android.AndroidEntryPoint
import io.ktor.util.collections.*
import javax.inject.Inject
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.Job
import kotlinx.coroutines.launch
import timber.log.Timber
@@ -37,9 +35,7 @@ abstract class BaseTunnelForegroundService : LifecycleService(), TunnelService {
@Inject @IoDispatcher lateinit var ioDispatcher: CoroutineDispatcher
@Inject lateinit var appDataRepository: AppDataRepository
private val tunnelJobs = ConcurrentMap<Int, Job>()
@Inject lateinit var tunnelsRepository: TunnelRepository
protected abstract val fgsType: Int
@@ -74,13 +70,7 @@ abstract class BaseTunnelForegroundService : LifecycleService(), TunnelService {
lifecycleScope.launch(ioDispatcher) {
tunnelManager.activeTunnels.distinctByKeys().collect { activeTunnels ->
val activeTunConfigs = activeTunnels.keys
val obsoleteJobs = tunnelJobs.keys - activeTunConfigs
obsoleteJobs.forEach { tunId -> tunnelJobs[tunId]?.cancel() }
activeTunConfigs.forEach { tunId ->
if (tunnelJobs.contains(tunId)) return@forEach
tunnelJobs[tunId] = launch { tunnelMonitor.startMonitoring(tunId, true) }
}
val tunnels = appDataRepository.tunnels.getAll()
val tunnels = tunnelsRepository.getAll()
val activeConfigs = tunnels.filter { activeTunConfigs.contains(it.id) }
updateServiceNotification(activeConfigs)
}
@@ -105,13 +95,11 @@ abstract class BaseTunnelForegroundService : LifecycleService(), TunnelService {
override fun stop() {
Timber.d("Stop called")
tunnelJobs.forEach { it.value.cancel() }
ServiceCompat.stopForeground(this, ServiceCompat.STOP_FOREGROUND_REMOVE)
stopSelf()
}
override fun onDestroy() {
tunnelJobs.forEach { it.value.cancel() }
serviceManager.handleTunnelServiceDestroy()
ServiceCompat.stopForeground(this, ServiceCompat.STOP_FOREGROUND_REMOVE)
Timber.d("onDestroy")
@@ -10,7 +10,7 @@ import com.zaneschepke.wireguardautotunnel.core.service.autotunnel.AutoTunnelSer
import com.zaneschepke.wireguardautotunnel.data.model.AppMode
import com.zaneschepke.wireguardautotunnel.di.ApplicationScope
import com.zaneschepke.wireguardautotunnel.di.IoDispatcher
import com.zaneschepke.wireguardautotunnel.domain.repository.AppDataRepository
import com.zaneschepke.wireguardautotunnel.domain.repository.GeneralSettingRepository
import com.zaneschepke.wireguardautotunnel.util.extensions.requestAutoTunnelTileServiceUpdate
import com.zaneschepke.wireguardautotunnel.util.extensions.requestTunnelTileServiceStateUpdate
import jakarta.inject.Inject
@@ -30,7 +30,7 @@ constructor(
@IoDispatcher ioDispatcher: CoroutineDispatcher,
@ApplicationScope applicationScope: CoroutineScope,
private val mainDispatcher: CoroutineDispatcher,
private val appDataRepository: AppDataRepository,
private val settingsRepository: GeneralSettingRepository,
) {
private val autoTunnelMutex = Mutex()
@@ -41,6 +41,32 @@ constructor(
val autoTunnelService = _autoTunnelService.asStateFlow()
val tunnelService = _tunnelService.asStateFlow()
init {
applicationScope.launch(ioDispatcher) {
_autoTunnelService
.onEach { _ -> withContext(mainDispatcher) { updateAutoTunnelTile() } }
.launchIn(this)
}
applicationScope.launch(ioDispatcher) {
combine(
settingsRepository.flow.map { it.isAutoTunnelEnabled }.distinctUntilChanged(),
_autoTunnelService,
) { enabled, service ->
enabled to (service != null)
}
.collect { (enabled, isRunning) ->
when {
enabled && !isRunning -> {
autoTunnelMutex.withLock { startServiceInternal() }
}
!enabled && isRunning -> {
autoTunnelMutex.withLock { stopServiceInternal() }
}
}
}
}
}
private val tunnelServiceConnection =
object : ServiceConnection {
override fun onServiceConnected(name: ComponentName, service: IBinder) {
@@ -83,46 +109,24 @@ constructor(
}
}
init {
// Observe changes to the AutoTunnelService and trigger side effects
applicationScope.launch(ioDispatcher) {
_autoTunnelService
.onEach { service ->
withContext(mainDispatcher) { updateAutoTunnelTile() }
if (service == null) {
// The service is disconnected, update the DB state
val settings = appDataRepository.settings.get()
appDataRepository.settings.save(settings.copy(isAutoTunnelEnabled = false))
}
}
.launchIn(this)
}
}
fun hasVpnPermission(): Boolean {
return VpnService.prepare(context) == null
}
suspend fun startAutoTunnel() {
autoTunnelMutex.withLock {
if (_autoTunnelService.value != null) return
private fun startServiceInternal() {
val intent = Intent(context, AutoTunnelService::class.java)
context.startForegroundService(intent)
context.bindService(intent, autoTunnelServiceConnection, Context.BIND_AUTO_CREATE)
}
}
suspend fun stopAutoTunnel() =
autoTunnelMutex.withLock {
if (_autoTunnelService.value == null) return@withLock
_autoTunnelService.value?.let { service ->
service.stop()
private fun stopServiceInternal() {
_autoTunnelService.value?.stop()
try {
context.unbindService(autoTunnelServiceConnection)
} catch (e: Exception) {
Timber.e(e, "Failed to unbind AutoTunnelService")
}
}
_autoTunnelService.update { null }
}
suspend fun startTunnelService(appMode: AppMode) =
@@ -14,12 +14,12 @@ import com.zaneschepke.wireguardautotunnel.core.notification.NotificationManager
import com.zaneschepke.wireguardautotunnel.core.notification.WireGuardNotification
import com.zaneschepke.wireguardautotunnel.core.service.ServiceManager
import com.zaneschepke.wireguardautotunnel.core.tunnel.TunnelManager
import com.zaneschepke.wireguardautotunnel.core.tunnel.TunnelMonitor
import com.zaneschepke.wireguardautotunnel.di.IoDispatcher
import com.zaneschepke.wireguardautotunnel.domain.enums.NotificationAction
import com.zaneschepke.wireguardautotunnel.domain.events.AutoTunnelEvent
import com.zaneschepke.wireguardautotunnel.domain.model.GeneralSettings
import com.zaneschepke.wireguardautotunnel.domain.repository.AppDataRepository
import com.zaneschepke.wireguardautotunnel.domain.repository.GeneralSettingRepository
import com.zaneschepke.wireguardautotunnel.domain.repository.TunnelRepository
import com.zaneschepke.wireguardautotunnel.domain.state.AutoTunnelState
import com.zaneschepke.wireguardautotunnel.domain.state.NetworkState
import com.zaneschepke.wireguardautotunnel.util.Constants
@@ -40,8 +40,6 @@ class AutoTunnelService : LifecycleService() {
@Inject lateinit var networkMonitor: NetworkMonitor
@Inject lateinit var appDataRepository: Provider<AppDataRepository>
@Inject lateinit var notificationManager: NotificationManager
@Inject @IoDispatcher lateinit var ioDispatcher: CoroutineDispatcher
@@ -50,7 +48,8 @@ class AutoTunnelService : LifecycleService() {
@Inject lateinit var tunnelManager: TunnelManager
@Inject lateinit var tunnelMonitor: TunnelMonitor
@Inject lateinit var settingsRepository: Provider<GeneralSettingRepository>
@Inject lateinit var tunnelsRepository: TunnelRepository
private val defaultState = AutoTunnelState()
@@ -115,7 +114,7 @@ class AutoTunnelService : LifecycleService() {
this,
NotificationManager.AUTO_TUNNEL_NOTIFICATION_ID,
notification,
Constants.SYSTEM_EXEMPT_SERVICE_TYPE_ID,
Constants.SPECIAL_USE_SERVICE_TYPE_ID,
)
}
@@ -218,17 +217,14 @@ class AutoTunnelService : LifecycleService() {
old.isVpnKillSwitchEnabled == new.isVpnKillSwitchEnabled &&
old.isLanOnKillSwitchEnabled == new.isLanOnKillSwitchEnabled &&
old.isDisableKillSwitchOnTrustedEnabled == new.isDisableKillSwitchOnTrustedEnabled &&
old.isStopOnNoInternetEnabled == new.isStopOnNoInternetEnabled)
old.isStopOnNoInternetEnabled == new.isStopOnNoInternetEnabled &&
old.appMode == new.appMode)
}
private fun combineSettings(): Flow<Pair<GeneralSettings, Tunnels>> {
return combine(
appDataRepository
.get()
.settings
.flow
.distinctUntilChanged(::areAutoTunnelSettingsTheSame),
appDataRepository.get().tunnels.flow.map { tunnels ->
settingsRepository.get().flow.distinctUntilChanged(::areAutoTunnelSettingsTheSame),
tunnelsRepository.flow.map { tunnels ->
// isActive is ignored for equality checks so user can manually toggle off
// tunnel with auto-tunnel
tunnels.map { it.copy(isActive = false) }
@@ -343,7 +339,7 @@ class AutoTunnelService : LifecycleService() {
}
) {
is AutoTunnelEvent.Start ->
(event.tunnelConf ?: appDataRepository.get().getPrimaryOrFirstTunnel())?.let {
(event.tunnelConf ?: tunnelsRepository.getDefaultTunnel())?.let {
tunnelManager.startTunnel(it)
}
is AutoTunnelEvent.Stop -> tunnelManager.stopActiveTunnels()
@@ -354,9 +350,8 @@ class AutoTunnelService : LifecycleService() {
@OptIn(FlowPreview::class, ExperimentalCoroutinesApi::class)
private val debouncedConnectivityStateFlow: Flow<ConnectivityState> by lazy {
appDataRepository
settingsRepository
.get()
.settings
.flow
.map { it.debounceDelaySeconds.toMillis() }
.distinctUntilChanged()
@@ -9,7 +9,8 @@ import androidx.lifecycle.LifecycleOwner
import androidx.lifecycle.LifecycleRegistry
import androidx.lifecycle.lifecycleScope
import com.zaneschepke.wireguardautotunnel.core.service.ServiceManager
import com.zaneschepke.wireguardautotunnel.domain.repository.AppDataRepository
import com.zaneschepke.wireguardautotunnel.domain.repository.GeneralSettingRepository
import com.zaneschepke.wireguardautotunnel.domain.repository.TunnelRepository
import dagger.hilt.android.AndroidEntryPoint
import javax.inject.Inject
import kotlinx.coroutines.launch
@@ -17,7 +18,9 @@ import timber.log.Timber
@AndroidEntryPoint
class AutoTunnelControlTile : TileService(), LifecycleOwner {
@Inject lateinit var appDataRepository: AppDataRepository
@Inject lateinit var settingsRepository: GeneralSettingRepository
@Inject lateinit var tunnelsRepository: TunnelRepository
@Inject lateinit var serviceManager: ServiceManager
@@ -44,7 +47,7 @@ class AutoTunnelControlTile : TileService(), LifecycleOwner {
}
}
lifecycleScope.launch {
appDataRepository.tunnels.flow.collect {
tunnelsRepository.flow.collect {
if (it.isEmpty()) {
setUnavailable()
}
@@ -57,10 +60,10 @@ class AutoTunnelControlTile : TileService(), LifecycleOwner {
unlockAndRun {
lifecycleScope.launch {
if (serviceManager.autoTunnelService.value != null) {
serviceManager.stopAutoTunnel()
settingsRepository.updateAutoTunnelEnabled(false)
setInactive()
} else {
serviceManager.startAutoTunnel()
settingsRepository.updateAutoTunnelEnabled(true)
setActive()
}
}
@@ -13,7 +13,7 @@ import com.zaneschepke.wireguardautotunnel.R
import com.zaneschepke.wireguardautotunnel.WireGuardAutoTunnel
import com.zaneschepke.wireguardautotunnel.core.service.ServiceManager
import com.zaneschepke.wireguardautotunnel.core.tunnel.TunnelManager
import com.zaneschepke.wireguardautotunnel.domain.repository.AppDataRepository
import com.zaneschepke.wireguardautotunnel.domain.repository.TunnelRepository
import dagger.hilt.android.AndroidEntryPoint
import javax.inject.Inject
import kotlinx.coroutines.launch
@@ -21,7 +21,8 @@ import timber.log.Timber
@AndroidEntryPoint
class TunnelControlTile : TileService(), LifecycleOwner {
@Inject lateinit var appDataRepository: AppDataRepository
@Inject lateinit var tunnelsRepository: TunnelRepository
@Inject lateinit var serviceManager: ServiceManager
@@ -52,7 +53,7 @@ class TunnelControlTile : TileService(), LifecycleOwner {
private suspend fun updateTileState() {
try {
val tunnels = appDataRepository.tunnels.getAll()
val tunnels = tunnelsRepository.getAll()
if (tunnels.isEmpty()) {
setUnavailable()
return
@@ -68,7 +69,6 @@ class TunnelControlTile : TileService(), LifecycleOwner {
// multiple tunnels
// this would be better managed elsewhere
WireGuardAutoTunnel.setLastActiveTunnels(activeIds)
val tunnels = appDataRepository.tunnels.getAll()
val activeTunNames =
tunnels.filter { activeTunnels.keys.contains(it.id) }.map { it.tunName }
updateTileForActiveTunnels(activeTunNames)
@@ -93,14 +93,14 @@ class TunnelControlTile : TileService(), LifecycleOwner {
val lastActiveIds = WireGuardAutoTunnel.getLastActiveTunnels()
when {
lastActiveIds.isEmpty() -> {
appDataRepository.getStartTunnelConfig()?.let { config ->
tunnelsRepository.getStartTunnel()?.let { config ->
updateTile(config.tunName, false)
} ?: setUnavailable()
}
lastActiveIds.size > 1 -> updateTile(getString(R.string.multiple), false)
else -> {
val tunnelId = lastActiveIds.first()
appDataRepository.tunnels.getById(tunnelId)?.let { tunnel ->
tunnelsRepository.getById(tunnelId)?.let { tunnel ->
updateTile(tunnel.tunName, false)
} ?: setUnavailable()
}
@@ -115,10 +115,10 @@ class TunnelControlTile : TileService(), LifecycleOwner {
return@launch tunnelManager.stopActiveTunnels()
val lastActive = WireGuardAutoTunnel.getLastActiveTunnels()
if (lastActive.isEmpty()) {
appDataRepository.getStartTunnelConfig()?.let { tunnelManager.startTunnel(it) }
tunnelsRepository.getStartTunnel()?.let { tunnelManager.startTunnel(it) }
} else {
lastActive.forEach { id ->
appDataRepository.tunnels.getById(id)?.let { tunnelManager.startTunnel(it) }
tunnelsRepository.getById(id)?.let { tunnelManager.startTunnel(it) }
}
}
}
@@ -2,12 +2,12 @@ package com.zaneschepke.wireguardautotunnel.core.shortcut
import android.os.Bundle
import androidx.activity.ComponentActivity
import com.zaneschepke.wireguardautotunnel.core.service.ServiceManager
import com.zaneschepke.wireguardautotunnel.core.service.autotunnel.AutoTunnelService
import com.zaneschepke.wireguardautotunnel.core.tunnel.TunnelManager
import com.zaneschepke.wireguardautotunnel.core.tunnel.TunnelProvider
import com.zaneschepke.wireguardautotunnel.di.ApplicationScope
import com.zaneschepke.wireguardautotunnel.domain.repository.AppDataRepository
import com.zaneschepke.wireguardautotunnel.domain.repository.GeneralSettingRepository
import com.zaneschepke.wireguardautotunnel.domain.repository.TunnelRepository
import dagger.hilt.android.AndroidEntryPoint
import javax.inject.Inject
import kotlinx.coroutines.CoroutineScope
@@ -16,9 +16,9 @@ import timber.log.Timber
@AndroidEntryPoint
class ShortcutsActivity : ComponentActivity() {
@Inject lateinit var appDataRepository: AppDataRepository
@Inject lateinit var serviceManager: ServiceManager
@Inject lateinit var settingsRepository: GeneralSettingRepository
@Inject lateinit var tunnelsRepository: TunnelRepository
@Inject lateinit var tunnelManager: TunnelManager
@@ -27,7 +27,7 @@ class ShortcutsActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
applicationScope.launch {
val settings = appDataRepository.settings.get()
val settings = settingsRepository.get()
if (settings.isShortcutsEnabled) {
when (intent.getStringExtra(CLASS_NAME_EXTRA_KEY)) {
LEGACY_TUNNEL_SERVICE_NAME,
@@ -35,11 +35,8 @@ class ShortcutsActivity : ComponentActivity() {
val tunnelName = intent.getStringExtra(TUNNEL_NAME_EXTRA_KEY)
Timber.d("Tunnel name extra: $tunnelName")
val tunnelConfig =
tunnelName?.let {
appDataRepository.tunnels.getAll().firstOrNull {
it.tunName == tunnelName
}
} ?: appDataRepository.getStartTunnelConfig()
tunnelName?.let { tunnelsRepository.findByTunnelName(it) }
?: tunnelsRepository.getDefaultTunnel()
Timber.d("Shortcut action on name: ${tunnelConfig?.tunName}")
tunnelConfig?.let {
when (intent.action) {
@@ -52,8 +49,8 @@ class ShortcutsActivity : ComponentActivity() {
AutoTunnelService::class.java.simpleName,
LEGACY_AUTO_TUNNEL_SERVICE_NAME -> {
when (intent.action) {
Action.START.name -> serviceManager.startAutoTunnel()
Action.STOP.name -> serviceManager.stopAutoTunnel()
Action.START.name -> settingsRepository.updateAutoTunnelEnabled(true)
Action.STOP.name -> settingsRepository.updateAutoTunnelEnabled(false)
}
}
}
@@ -1,13 +1,11 @@
package com.zaneschepke.wireguardautotunnel.core.tunnel
import com.zaneschepke.wireguardautotunnel.core.service.ServiceManager
import com.zaneschepke.wireguardautotunnel.di.ApplicationScope
import com.zaneschepke.wireguardautotunnel.domain.enums.BackendMode
import com.zaneschepke.wireguardautotunnel.domain.enums.TunnelStatus
import com.zaneschepke.wireguardautotunnel.domain.events.BackendCoreException
import com.zaneschepke.wireguardautotunnel.domain.events.BackendMessage
import com.zaneschepke.wireguardautotunnel.domain.model.TunnelConf
import com.zaneschepke.wireguardautotunnel.domain.repository.AppDataRepository
import com.zaneschepke.wireguardautotunnel.domain.state.LogHealthState
import com.zaneschepke.wireguardautotunnel.domain.state.PingState
import com.zaneschepke.wireguardautotunnel.domain.state.TunnelState
@@ -23,11 +21,8 @@ import kotlinx.coroutines.sync.withLock
import org.amnezia.awg.crypto.Key
import timber.log.Timber
abstract class BaseTunnel(
@ApplicationScope protected val applicationScope: CoroutineScope,
protected val appDataRepository: AppDataRepository,
protected val serviceManager: ServiceManager,
) : TunnelProvider {
abstract class BaseTunnel(@ApplicationScope protected val applicationScope: CoroutineScope) :
TunnelProvider {
protected val errors = MutableSharedFlow<Pair<String, BackendCoreException>>()
override val errorEvents = errors.asSharedFlow()
@@ -52,10 +47,6 @@ abstract class BaseTunnel(
abstract override fun getStatistics(tunnelId: Int): TunnelStatistics?
override fun hasVpnPermission(): Boolean {
return serviceManager.hasVpnPermission()
}
override suspend fun updateTunnelStatus(
tunnelId: Int,
status: TunnelStatus?,
@@ -114,7 +105,6 @@ abstract class BaseTunnel(
try {
tunnelStateFlow(tunnelConf).collect { status ->
updateTunnelStatus(tunnelConf.id, status)
serviceManager.updateTunnelTile()
}
} catch (e: BackendCoreException) {
errors.emit(tunnelConf.tunName to e)
@@ -3,14 +3,12 @@ package com.zaneschepke.wireguardautotunnel.core.tunnel
import com.wireguard.android.backend.Backend
import com.wireguard.android.backend.BackendException
import com.wireguard.android.backend.Tunnel as WgTunnel
import com.zaneschepke.wireguardautotunnel.core.service.ServiceManager
import com.zaneschepke.wireguardautotunnel.di.ApplicationScope
import com.zaneschepke.wireguardautotunnel.di.Kernel
import com.zaneschepke.wireguardautotunnel.domain.enums.BackendMode
import com.zaneschepke.wireguardautotunnel.domain.enums.TunnelStatus
import com.zaneschepke.wireguardautotunnel.domain.events.BackendCoreException
import com.zaneschepke.wireguardautotunnel.domain.model.TunnelConf
import com.zaneschepke.wireguardautotunnel.domain.repository.AppDataRepository
import com.zaneschepke.wireguardautotunnel.domain.state.TunnelStatistics
import com.zaneschepke.wireguardautotunnel.domain.state.WireGuardStatistics
import com.zaneschepke.wireguardautotunnel.util.extensions.asTunnelState
@@ -30,10 +28,8 @@ class KernelTunnel
@Inject
constructor(
@ApplicationScope applicationScope: CoroutineScope,
serviceManager: ServiceManager,
appDataRepository: AppDataRepository,
@Kernel private val backend: Backend,
) : BaseTunnel(applicationScope, appDataRepository, serviceManager) {
) : BaseTunnel(applicationScope) {
private val runtimeTunnels = ConcurrentHashMap<Int, WgTunnel>()
@@ -9,11 +9,13 @@ import com.zaneschepke.wireguardautotunnel.domain.events.BackendCoreException
import com.zaneschepke.wireguardautotunnel.domain.events.BackendMessage
import com.zaneschepke.wireguardautotunnel.domain.model.GeneralSettings
import com.zaneschepke.wireguardautotunnel.domain.model.TunnelConf
import com.zaneschepke.wireguardautotunnel.domain.repository.AppDataRepository
import com.zaneschepke.wireguardautotunnel.domain.repository.GeneralSettingRepository
import com.zaneschepke.wireguardautotunnel.domain.repository.TunnelRepository
import com.zaneschepke.wireguardautotunnel.domain.state.LogHealthState
import com.zaneschepke.wireguardautotunnel.domain.state.PingState
import com.zaneschepke.wireguardautotunnel.domain.state.TunnelState
import com.zaneschepke.wireguardautotunnel.domain.state.TunnelStatistics
import java.util.concurrent.ConcurrentHashMap
import javax.inject.Inject
import kotlin.concurrent.atomics.AtomicBoolean
import kotlin.concurrent.atomics.AtomicReference
@@ -32,11 +34,15 @@ constructor(
@Userspace private val userspaceTunnel: TunnelProvider,
@ProxyUserspace private val proxyUserspaceTunnel: TunnelProvider,
private val serviceManager: ServiceManager,
private val appDataRepository: AppDataRepository,
@ApplicationScope applicationScope: CoroutineScope,
@IoDispatcher ioDispatcher: CoroutineDispatcher,
private val settingsRepository: GeneralSettingRepository,
private val tunnelsRepository: TunnelRepository,
private val tunnelMonitor: TunnelMonitor,
@ApplicationScope private val applicationScope: CoroutineScope,
@IoDispatcher private val ioDispatcher: CoroutineDispatcher,
) : TunnelProvider {
private val monitoringJobs = ConcurrentHashMap<Int, Job>()
private data class SideEffectState(
val activeTuns: Map<Int, TunnelState>,
val tuns: List<TunnelConf>,
@@ -57,7 +63,7 @@ constructor(
val currentSettings = AtomicReference(GeneralSettings())
val initialEmit = AtomicBoolean(true)
appDataRepository.settings.flow
settingsRepository.flow
.filterNotNull()
// ignore default state
.filterNot { it == GeneralSettings() }
@@ -115,7 +121,7 @@ constructor(
),
SideEffectWithCondition(
effect = { s ->
handleActiveTunnelsChange(s.previouslyActive, s.activeTuns, s.tuns)
handleTunnelsActiveChange(s.previouslyActive, s.activeTuns, s.tuns)
},
condition = { s -> s.activeTuns.size != s.previouslyActive.size },
),
@@ -128,6 +134,12 @@ constructor(
} && s.settings.appMode != AppMode.KERNEL
},
),
SideEffectWithCondition(
effect = { s ->
handleFullTunnelMonitoring(s.activeTuns, s.tuns, s.settings)
},
condition = { s -> s.activeTuns.keys != s.previouslyActive.keys },
),
)
applicationScope.launch(ioDispatcher) {
@@ -150,8 +162,8 @@ constructor(
combine(
backend.activeTunnels,
appDataRepository.tunnels.flow,
appDataRepository.settings.flow.filterNotNull(),
tunnelsRepository.flow,
settingsRepository.flow.filterNotNull(),
) { activeTuns, tuns, settings ->
Triple(activeTuns, tuns, settings)
}
@@ -191,10 +203,6 @@ constructor(
replay = 0,
)
override fun hasVpnPermission(): Boolean {
return userspaceTunnel.hasVpnPermission()
}
override fun getStatistics(tunnelId: Int): TunnelStatistics? {
return tunnelProviderFlow.value.getStatistics(tunnelId)
}
@@ -253,13 +261,14 @@ constructor(
if (activeTuns.isEmpty()) serviceManager.stopTunnelService()
if (activeTuns.isNotEmpty() && serviceManager.tunnelService.value == null)
serviceManager.startTunnelService(appMode)
serviceManager.updateTunnelTile()
}
private fun handleLockDownModeInit(withLanBypass: Boolean) {
val allowedIps = if (withLanBypass) TunnelConf.IPV4_PUBLIC_NETWORKS else emptySet()
try {
// TODO handle situation where they don't have vpn permission, request it
if (hasVpnPermission()) {
if (serviceManager.hasVpnPermission()) {
proxyUserspaceTunnel.setBackendMode(BackendMode.KillSwitch(allowedIps))
}
} catch (e: BackendCoreException) {
@@ -279,15 +288,13 @@ constructor(
}
private suspend fun handleStateRestore() {
val settings = appDataRepository.settings.flow.first()
val settings = settingsRepository.flow.first()
if (settings.isRestoreOnBootEnabled) {
// if auto tun enabled, reset active and restore auto tun, letting it start appropriate
// tuns
if (settings.isAutoTunnelEnabled) {
appDataRepository.tunnels.resetActiveTunnels()
return serviceManager.startAutoTunnel()
tunnelsRepository.resetActiveTunnels()
return settingsRepository.updateAutoTunnelEnabled(true)
}
val tunnels = appDataRepository.tunnels.flow.first()
val tunnels = tunnelsRepository.flow.first()
when (settings.appMode) {
// TODO eventually, lockdown/proxy can support multi
AppMode.VPN,
@@ -297,7 +304,7 @@ constructor(
.firstOrNull { it.isActive }
?.let {
// clear any duplicates
appDataRepository.tunnels.resetActiveTunnels()
tunnelsRepository.resetActiveTunnels()
startTunnel(it)
}
// kernel supports multi
@@ -334,7 +341,7 @@ constructor(
}
}
private suspend fun handleActiveTunnelsChange(
private suspend fun handleTunnelsActiveChange(
previousActiveTuns: Map<Int, TunnelState>,
activeTuns: Map<Int, TunnelState>,
tuns: List<TunnelConf>,
@@ -350,17 +357,47 @@ constructor(
tuns
.find { it.id == tunnelId }
?.let { dbTunnelConf ->
appDataRepository.tunnels.save(dbTunnelConf.copy(isActive = true))
tunnelsRepository.save(dbTunnelConf.copy(isActive = true))
}
}
wasActive && !isActiveNow -> {
tuns
.find { it.id == tunnelId }
?.let { dbTunnelConf ->
appDataRepository.tunnels.save(dbTunnelConf.copy(isActive = false))
tunnelsRepository.save(dbTunnelConf.copy(isActive = false))
}
}
}
}
}
private suspend fun handleFullTunnelMonitoring(
activeTuns: Map<Int, TunnelState>,
configs: List<TunnelConf>,
settings: GeneralSettings,
) {
val activeIds = activeTuns.keys
val obsoleteIds = monitoringJobs.keys - activeIds
obsoleteIds.forEach { id ->
monitoringJobs[id]?.cancel()
monitoringJobs.remove(id)
}
activeIds.forEach { id ->
if (monitoringJobs.contains(id)) return@forEach
configs.find { it.id == id } ?: return@forEach
val tunStateFlow = activeTunnels.map { it[id] }.stateIn(applicationScope + ioDispatcher)
monitoringJobs[id] =
applicationScope.launch(ioDispatcher) {
tunnelMonitor.startMonitoring(
id,
withLogs = settings.appMode != AppMode.KERNEL,
tunStateFlow = tunStateFlow,
getStatistics = { tunnelId -> getStatistics(tunnelId) },
updateTunnelStatus = { tid, status, stats, pings, logHealth ->
updateTunnelStatus(tid, null, stats, pings, logHealth)
},
)
}
}
}
}
@@ -5,10 +5,13 @@ import com.zaneschepke.networkmonitor.NetworkMonitor
import com.zaneschepke.wireguardautotunnel.data.model.AppMode
import com.zaneschepke.wireguardautotunnel.domain.enums.TunnelStatus
import com.zaneschepke.wireguardautotunnel.domain.model.TunnelConf
import com.zaneschepke.wireguardautotunnel.domain.repository.AppDataRepository
import com.zaneschepke.wireguardautotunnel.domain.repository.GeneralSettingRepository
import com.zaneschepke.wireguardautotunnel.domain.repository.TunnelRepository
import com.zaneschepke.wireguardautotunnel.domain.state.FailureReason
import com.zaneschepke.wireguardautotunnel.domain.state.LogHealthState
import com.zaneschepke.wireguardautotunnel.domain.state.PingState
import com.zaneschepke.wireguardautotunnel.domain.state.TunnelState
import com.zaneschepke.wireguardautotunnel.domain.state.TunnelStatistics
import com.zaneschepke.wireguardautotunnel.util.extensions.toMillis
import com.zaneschepke.wireguardautotunnel.util.network.NetworkUtils
import dagger.hilt.android.scopes.ServiceScoped
@@ -23,24 +26,39 @@ import timber.log.Timber
class TunnelMonitor
@Inject
constructor(
private val appDataRepository: AppDataRepository,
private val tunnelManager: TunnelManager,
private val settingsRepository: GeneralSettingRepository,
private val tunnelsRepository: TunnelRepository,
private val networkMonitor: NetworkMonitor,
private val networkUtils: NetworkUtils,
private val logReader: LogReader,
) {
@OptIn(FlowPreview::class)
suspend fun startMonitoring(tunnelId: Int, withLogs: Boolean): Job = coroutineScope {
suspend fun startMonitoring(
tunnelId: Int,
withLogs: Boolean,
tunStateFlow: StateFlow<TunnelState?>,
getStatistics: suspend (Int) -> TunnelStatistics?,
updateTunnelStatus:
suspend (
Int, TunnelStatus?, TunnelStatistics?, Map<Key, PingState>?, LogHealthState?,
) -> Unit,
): Job = coroutineScope {
launch {
val config = appDataRepository.tunnels.getById(tunnelId) ?: return@launch
launch { startPingMonitor(config) }
launch { startWgStatsPoll(config.id) }
if (withLogs) launch { startLogsMonitor(config) }
val config = tunnelsRepository.getById(tunnelId) ?: return@launch
launch { startPingMonitor(config, tunStateFlow, updateTunnelStatus) }
launch { startWgStatsPoll(tunnelId, getStatistics, updateTunnelStatus) }
if (withLogs) launch { startLogsMonitor(config, updateTunnelStatus) }
}
}
private suspend fun startLogsMonitor(tunnelConf: TunnelConf) {
private suspend fun startLogsMonitor(
tunnelConf: TunnelConf,
updateTunnelStatus:
suspend (
Int, TunnelStatus?, TunnelStatistics?, Map<Key, PingState>?, LogHealthState?,
) -> Unit,
) {
logReader.liveLogs
.filter { log -> log.tag.contains(tunnelConf.tunName) }
.mapNotNull { log ->
@@ -59,16 +77,20 @@ constructor(
.distinctUntilChangedBy { it.isHealthy } // Only emit when health changes
.collect { logHealthState ->
Timber.d("Tunnel log health updated for ${tunnelConf.tunName}: $logHealthState")
tunnelManager.updateTunnelStatus(tunnelConf.id, logHealthState = logHealthState)
updateTunnelStatus(tunnelConf.id, null, null, null, logHealthState)
}
}
private suspend fun startPingMonitor(tunnelConf: TunnelConf) = coroutineScope {
private suspend fun startPingMonitor(
tunnelConf: TunnelConf,
tunStateFlow: StateFlow<TunnelState?>,
updateTunnelStatus:
suspend (
Int, TunnelStatus?, TunnelStatistics?, Map<Key, PingState>?, LogHealthState?,
) -> Unit,
) = coroutineScope {
val pingStatsFlow = MutableStateFlow<Map<Key, PingState>>(emptyMap())
val tunStateFlow =
tunnelManager.activeTunnels.mapNotNull { it[tunnelConf.id] }.stateIn(this)
val connectivityStateFlow = networkMonitor.connectivityStateFlow.stateIn(this)
val isNetworkConnected = connectivityStateFlow.map { it.hasConnectivity() }.stateIn(this)
@@ -92,12 +114,12 @@ constructor(
.distinctUntilChanged()
.stateIn(this)
appDataRepository.settings.flow
settingsRepository.flow
.distinctUntilChanged { old, new ->
old.isPingEnabled == new.isPingEnabled &&
old.tunnelPingIntervalSeconds == new.tunnelPingIntervalSeconds &&
old.tunnelPingAttempts == new.tunnelPingAttempts &&
old.tunnelPingTimeoutSeconds == new.tunnelPingTimeoutSeconds
old.tunnelPingTimeoutSeconds == new.tunnelPingTimeoutSeconds &&
old.appMode == new.appMode
}
.collectLatest { settings ->
@@ -203,12 +225,12 @@ constructor(
if (updates.isNotEmpty()) {
pingStatsFlow.update { updates }
tunnelManager.updateTunnelStatus(tunnelConf.id, null, null, updates)
updateTunnelStatus(tunnelConf.id, null, null, updates, null)
}
}
// Wait for the tunnel to be fully active
tunStateFlow.filter { state -> state.status == TunnelStatus.Up }.first()
tunStateFlow.filter { state -> state?.status == TunnelStatus.Up }.first()
// small delay to make sure tunnel is fully up before we actively monitor
delay(3_000L)
@@ -226,22 +248,24 @@ constructor(
)
}
}
tunnelManager.updateTunnelStatus(
tunnelConf.id,
null,
null,
pingStatsFlow.value,
)
updateTunnelStatus(tunnelConf.id, null, null, pingStatsFlow.value, null)
}
delay(settings.tunnelPingIntervalSeconds.toMillis())
}
}
}
private suspend fun startWgStatsPoll(tunnelId: Int) = coroutineScope {
private suspend fun startWgStatsPoll(
tunnelId: Int,
getStatistics: suspend (Int) -> TunnelStatistics?,
updateTunnelStatus:
suspend (
Int, TunnelStatus?, TunnelStatistics?, Map<Key, PingState>?, LogHealthState?,
) -> Unit,
) = coroutineScope {
while (isActive) {
val stats = tunnelManager.getStatistics(tunnelId)
tunnelManager.updateTunnelStatus(tunnelId, null, stats, null)
val stats = getStatistics(tunnelId)
updateTunnelStatus(tunnelId, null, stats, null, null)
delay(STATS_DELAY)
}
}
@@ -263,12 +287,5 @@ constructor(
const val CLOUDFLARE_IPV4_IP = "1.1.1.1"
const val STATS_DELAY = 1_000L
const val KEEPALIVE_RESPONSE_TEXT = "Receiving keepalive packet"
const val HANDSHAKE_RESPONSE_TEXT = "Received handshake response"
const val HANDSHAKE_INIT_FAILED_TEXT = "Failed to send handshake initiation: write udp"
const val DATA_PACKET_FAILED_TEXT = "Failed to send data packets"
const val HANDSHAKE_NOT_COMPLETED_TEXT =
"Handshake did not complete after 5 seconds, retrying"
}
}
@@ -43,8 +43,6 @@ interface TunnelProvider {
val messageEvents: SharedFlow<Pair<String, BackendMessage>>
fun hasVpnPermission(): Boolean
suspend fun updateTunnelStatus(
tunnelId: Int,
status: TunnelStatus? = null,
@@ -1,6 +1,5 @@
package com.zaneschepke.wireguardautotunnel.core.tunnel
import com.zaneschepke.wireguardautotunnel.core.service.ServiceManager
import com.zaneschepke.wireguardautotunnel.data.model.DnsProtocol
import com.zaneschepke.wireguardautotunnel.di.ApplicationScope
import com.zaneschepke.wireguardautotunnel.domain.enums.BackendMode
@@ -8,7 +7,8 @@ import com.zaneschepke.wireguardautotunnel.domain.enums.TunnelStatus
import com.zaneschepke.wireguardautotunnel.domain.events.BackendCoreException
import com.zaneschepke.wireguardautotunnel.domain.model.AppProxySettings
import com.zaneschepke.wireguardautotunnel.domain.model.TunnelConf
import com.zaneschepke.wireguardautotunnel.domain.repository.AppDataRepository
import com.zaneschepke.wireguardautotunnel.domain.repository.GeneralSettingRepository
import com.zaneschepke.wireguardautotunnel.domain.repository.ProxySettingsRepository
import com.zaneschepke.wireguardautotunnel.domain.state.AmneziaStatistics
import com.zaneschepke.wireguardautotunnel.domain.state.TunnelStatistics
import com.zaneschepke.wireguardautotunnel.util.extensions.asAmBackendMode
@@ -41,10 +41,10 @@ class UserspaceTunnel
@Inject
constructor(
@ApplicationScope applicationScope: CoroutineScope,
serviceManager: ServiceManager,
appDataRepository: AppDataRepository,
private val proxySettingsRepository: ProxySettingsRepository,
private val settingsRepository: GeneralSettingRepository,
private val backend: Backend,
) : BaseTunnel(applicationScope, appDataRepository, serviceManager) {
) : BaseTunnel(applicationScope) {
private val runtimeTunnels = ConcurrentHashMap<Int, AwgTunnel>()
@@ -64,7 +64,7 @@ constructor(
val proxies: List<Proxy> =
when (backend) {
is ProxyGoBackend -> {
val proxySettings = appDataRepository.proxySettings.get()
val proxySettings = proxySettingsRepository.get()
Timber.d("Adding proxy configs")
buildList {
if (proxySettings.socks5ProxyEnabled) {
@@ -91,7 +91,7 @@ constructor(
}
else -> emptyList()
}
val setting = appDataRepository.settings.get()
val setting = settingsRepository.get()
val config = tunnelConf.toAmConfig()
val updatedConfig =
Config.Builder()
@@ -5,7 +5,7 @@ import androidx.hilt.work.HiltWorker
import androidx.work.*
import com.zaneschepke.wireguardautotunnel.core.service.ServiceManager
import com.zaneschepke.wireguardautotunnel.di.IoDispatcher
import com.zaneschepke.wireguardautotunnel.domain.repository.AppDataRepository
import com.zaneschepke.wireguardautotunnel.domain.repository.GeneralSettingRepository
import dagger.assisted.Assisted
import dagger.assisted.AssistedInject
import java.util.concurrent.TimeUnit
@@ -20,7 +20,7 @@ constructor(
@Assisted private val context: Context,
@Assisted private val params: WorkerParameters,
private val serviceManager: ServiceManager,
private val appDataRepository: AppDataRepository,
private val settingsRepository: GeneralSettingRepository,
@IoDispatcher private val ioDispatcher: CoroutineDispatcher,
) : CoroutineWorker(context, params) {
@@ -50,11 +50,11 @@ constructor(
override suspend fun doWork(): Result =
withContext(ioDispatcher) {
Timber.i("Service worker started")
with(appDataRepository.settings.get()) {
with(settingsRepository.get()) {
Timber.i("Checking to see if auto-tunnel has been killed by system")
if (isAutoTunnelEnabled && serviceManager.autoTunnelService.value == null) {
Timber.i("Service has been killed by system, restoring.")
serviceManager.startAutoTunnel()
settingsRepository.updateAutoTunnelEnabled(true)
}
}
Result.success()
@@ -42,7 +42,7 @@ class DataStoreManager(
try {
context.dataStore.data.first()
} catch (e: IOException) {
Timber.Forest.e(e)
Timber.e(e)
}
}
}
@@ -52,9 +52,9 @@ class DataStoreManager(
try {
context.dataStore.edit { it[key] = value }
} catch (e: IOException) {
Timber.Forest.e(e)
Timber.e(e)
} catch (e: Exception) {
Timber.Forest.e(e)
Timber.e(e)
}
}
}
@@ -64,9 +64,9 @@ class DataStoreManager(
try {
context.dataStore.edit { it.remove(key) }
} catch (e: IOException) {
Timber.Forest.e(e)
Timber.e(e)
} catch (e: Exception) {
Timber.Forest.e(e)
Timber.e(e)
}
}
}
@@ -78,7 +78,7 @@ class DataStoreManager(
try {
context.dataStore.data.map { it[key] }.first()
} catch (e: IOException) {
Timber.Forest.e(e)
Timber.e(e)
null
}
}
@@ -21,4 +21,7 @@ interface SettingsDao {
@Delete suspend fun delete(t: Settings)
@Query("SELECT COUNT('id') FROM settings") suspend fun count(): Long
@Query("UPDATE settings SET is_tunnel_enabled = :enabled")
suspend fun updateAutoTunnelEnabled(enabled: Boolean)
}
@@ -47,6 +47,28 @@ interface TunnelConfigDao {
@Query("SELECT * FROM TUNNELCONFIG WHERE is_mobile_data_tunnel=1")
suspend fun findByMobileDataTunnel(): TunnelConfigs
@Query(
"""
SELECT * FROM TunnelConfig
ORDER BY
CASE WHEN is_primary_tunnel = 1 THEN 0 ELSE 1 END,
position ASC
LIMIT 1"""
)
suspend fun getDefaultTunnel(): TunnelConfig?
@Query(
"""
SELECT * FROM TunnelConfig
ORDER BY
CASE WHEN is_Active = 1 THEN 0
WHEN is_primary_tunnel = 1 THEN 1
ELSE 2 END,
position ASC
LIMIT 1"""
)
suspend fun getStartTunnel(): TunnelConfig?
@Query("SELECT * FROM tunnelconfig ORDER BY position")
fun getAllFlow(): Flow<List<TunnelConfig>>
}
@@ -1,26 +0,0 @@
package com.zaneschepke.wireguardautotunnel.data.repository
import com.zaneschepke.wireguardautotunnel.domain.model.TunnelConf
import com.zaneschepke.wireguardautotunnel.domain.repository.*
import javax.inject.Inject
class AppDataRoomRepository
@Inject
constructor(
override val settings: GeneralSettingRepository,
override val tunnels: TunnelRepository,
override val appState: AppStateRepository,
override val proxySettings: ProxySettingsRepository,
) : AppDataRepository {
override suspend fun getPrimaryOrFirstTunnel(): TunnelConf? {
return tunnels.findPrimary().firstOrNull() ?: tunnels.getAll().firstOrNull()
}
override suspend fun getStartTunnelConfig(): TunnelConf? {
tunnels.getActive().let {
if (it.isNotEmpty()) return it.first()
return getPrimaryOrFirstTunnel()
}
}
}
@@ -29,4 +29,8 @@ class RoomSettingsRepository(
(settingsDoa.getAll().firstOrNull() ?: Settings()).toAppSettings()
}
}
override suspend fun updateAutoTunnelEnabled(enabled: Boolean) {
withContext(ioDispatcher) { settingsDoa.updateAutoTunnelEnabled(enabled) }
}
}
@@ -82,6 +82,18 @@ class RoomTunnelRepository(
}
}
override suspend fun getDefaultTunnel(): TunnelConf? {
return withContext(ioDispatcher) {
tunnelConfigDao.getDefaultTunnel()?.let(TunnelConfigMapper::toTunnelConf)
}
}
override suspend fun getStartTunnel(): TunnelConf? {
return withContext(ioDispatcher) {
tunnelConfigDao.getStartTunnel()?.let(TunnelConfigMapper::toTunnelConf)
}
}
override suspend fun count(): Int {
return withContext(ioDispatcher) { tunnelConfigDao.count().toInt() }
}
@@ -124,22 +124,6 @@ class RepositoryModule {
return DataStoreAppStateRepository(dataStoreManager, applicationScope, ioDispatcher)
}
@Provides
@Singleton
fun provideAppDataRepository(
settingsRepository: GeneralSettingRepository,
tunnelRepository: TunnelRepository,
appStateRepository: AppStateRepository,
proxySettingsRepository: ProxySettingsRepository,
): AppDataRepository {
return AppDataRoomRepository(
settingsRepository,
tunnelRepository,
appStateRepository,
proxySettingsRepository,
)
}
@Provides
@Singleton
fun provideHttpClient(): HttpClient {
@@ -9,8 +9,9 @@ import com.zaneschepke.networkmonitor.AndroidNetworkMonitor
import com.zaneschepke.networkmonitor.NetworkMonitor
import com.zaneschepke.wireguardautotunnel.core.service.ServiceManager
import com.zaneschepke.wireguardautotunnel.core.tunnel.*
import com.zaneschepke.wireguardautotunnel.domain.repository.AppDataRepository
import com.zaneschepke.wireguardautotunnel.domain.repository.GeneralSettingRepository
import com.zaneschepke.wireguardautotunnel.domain.repository.ProxySettingsRepository
import com.zaneschepke.wireguardautotunnel.domain.repository.TunnelRepository
import com.zaneschepke.wireguardautotunnel.util.extensions.to
import com.zaneschepke.wireguardautotunnel.util.network.NetworkUtils
import dagger.Module
@@ -84,11 +85,9 @@ class TunnelModule {
@Kernel
fun provideKernelProvider(
@ApplicationScope applicationScope: CoroutineScope,
serviceManager: ServiceManager,
appDataRepository: AppDataRepository,
backend: com.wireguard.android.backend.Backend,
): TunnelProvider {
return KernelTunnel(applicationScope, serviceManager, appDataRepository, backend)
return KernelTunnel(applicationScope, backend)
}
@Provides
@@ -96,11 +95,16 @@ class TunnelModule {
@Userspace
fun provideUserspaceProvider(
@ApplicationScope applicationScope: CoroutineScope,
serviceManager: ServiceManager,
appDataRepository: AppDataRepository,
proxySettingsRepository: ProxySettingsRepository,
settingsRepository: GeneralSettingRepository,
@Userspace backend: Backend,
): TunnelProvider {
return UserspaceTunnel(applicationScope, serviceManager, appDataRepository, backend)
return UserspaceTunnel(
applicationScope,
proxySettingsRepository,
settingsRepository,
backend,
)
}
@Provides
@@ -108,11 +112,16 @@ class TunnelModule {
@ProxyUserspace
fun provideProxyUserspaceProvider(
@ApplicationScope applicationScope: CoroutineScope,
serviceManager: ServiceManager,
appDataRepository: AppDataRepository,
settingsRepository: GeneralSettingRepository,
proxySettingsRepository: ProxySettingsRepository,
@ProxyUserspace backend: Backend,
): TunnelProvider {
return UserspaceTunnel(applicationScope, serviceManager, appDataRepository, backend)
return UserspaceTunnel(
applicationScope,
proxySettingsRepository,
settingsRepository,
backend,
)
}
@Provides
@@ -122,7 +131,9 @@ class TunnelModule {
@Userspace userspaceTunnel: TunnelProvider,
@ProxyUserspace proxyTunnel: TunnelProvider,
serviceManager: ServiceManager,
appDataRepository: AppDataRepository,
tunnelRepository: TunnelRepository,
settingsRepository: GeneralSettingRepository,
tunnelMonitor: TunnelMonitor,
@IoDispatcher ioDispatcher: CoroutineDispatcher,
@ApplicationScope applicationScope: CoroutineScope,
): TunnelManager {
@@ -131,7 +142,9 @@ class TunnelModule {
userspaceTunnel,
proxyTunnel,
serviceManager,
appDataRepository,
settingsRepository,
tunnelRepository,
tunnelMonitor,
applicationScope,
ioDispatcher,
)
@@ -168,30 +181,29 @@ class TunnelModule {
@IoDispatcher ioDispatcher: CoroutineDispatcher,
@MainDispatcher mainCoroutineDispatcher: CoroutineDispatcher,
@ApplicationScope applicationScope: CoroutineScope,
appDataRepository: AppDataRepository,
settingsRepository: GeneralSettingRepository,
): ServiceManager {
return ServiceManager(
context,
ioDispatcher,
applicationScope,
mainCoroutineDispatcher,
appDataRepository,
settingsRepository,
)
}
@Singleton
@Provides
fun provideTunnelMonitor(
@ApplicationContext context: Context,
tunnelManager: TunnelManager,
networkMonitor: NetworkMonitor,
networkUtils: NetworkUtils,
logReader: LogReader,
appDataRepository: AppDataRepository,
tunnelsRepository: TunnelRepository,
settingsRepository: GeneralSettingRepository,
): TunnelMonitor {
return TunnelMonitor(
appDataRepository,
tunnelManager,
settingsRepository,
tunnelsRepository,
networkMonitor,
networkUtils,
logReader,
@@ -3,7 +3,6 @@ package com.zaneschepke.wireguardautotunnel.domain.model
import com.wireguard.config.Config
import com.zaneschepke.wireguardautotunnel.util.extensions.defaultName
import com.zaneschepke.wireguardautotunnel.util.extensions.isValidIpv4orIpv6Address
import com.zaneschepke.wireguardautotunnel.util.extensions.toWgQuickString
import java.io.InputStream
import java.nio.charset.StandardCharsets
@@ -76,7 +75,7 @@ data class TunnelConf(
fun tunnelConfFromQuick(amQuick: String, name: String? = null): TunnelConf {
val config = configFromAmQuick(amQuick)
val wgQuick = config.toWgQuickString()
val wgQuick = config.toWgQuickString(true)
return TunnelConf(
tunName = name ?: config.defaultName(),
wgQuick = wgQuick,
@@ -89,7 +88,7 @@ data class TunnelConf(
name: String? = null,
): TunnelConf {
val amQuick = config.toAwgQuickString(true, false)
val wgQuick = config.toWgQuickString()
val wgQuick = config.toWgQuickString(true)
return TunnelConf(
tunName = name ?: config.defaultName(),
wgQuick = wgQuick,
@@ -1,15 +0,0 @@
package com.zaneschepke.wireguardautotunnel.domain.repository
import com.zaneschepke.wireguardautotunnel.domain.model.TunnelConf
interface AppDataRepository {
suspend fun getPrimaryOrFirstTunnel(): TunnelConf?
suspend fun getStartTunnelConfig(): TunnelConf?
val settings: GeneralSettingRepository
val tunnels: TunnelRepository
val appState: AppStateRepository
val proxySettings: ProxySettingsRepository
}
@@ -9,4 +9,6 @@ interface GeneralSettingRepository {
val flow: Flow<GeneralSettings>
suspend fun get(): GeneralSettings
suspend fun updateAutoTunnelEnabled(enabled: Boolean)
}
@@ -27,6 +27,10 @@ interface TunnelRepository {
suspend fun getActive(): Tunnels
suspend fun getDefaultTunnel(): TunnelConf?
suspend fun getStartTunnel(): TunnelConf?
suspend fun count(): Int
suspend fun findByTunnelName(name: String): TunnelConf?
@@ -14,8 +14,6 @@ sealed class GlobalSideEffect {
data object PopBackStack : GlobalSideEffect()
data class ShareFile(val file: File) : GlobalSideEffect()
data class LaunchUrl(val url: String) : GlobalSideEffect()
data object ConfigChanged : GlobalSideEffect()
@@ -18,31 +18,28 @@ data class TunnelState(
if (pingStates == null && logHealthState == null && statistics == null)
return Health.UNKNOWN
if (logHealthState?.isHealthy == false) return Health.UNHEALTHY
val healthLogs =
logHealthState?.isHealthy == true &&
(now - logHealthState.timestamp) <= LOG_HEALTH_SUCCESS_TIMEOUT_MS
// Logs check take precedent
logHealthState?.let { log ->
if (!log.isHealthy) return Health.UNHEALTHY
val recent = (now - log.timestamp) <= LOG_HEALTH_SUCCESS_TIMEOUT_MS
if (recent) {
// Logs healthy but override if pings are unhealthy
if (pingStates?.any { !it.value.isReachable } == true) return Health.UNHEALTHY
if (statistics != null) {
if (statistics.isTunnelStale()) {
return Health.STALE
}
if ((logHealthState == null || !healthLogs) && pingStates == null) {
return Health.HEALTHY
}
} else {
if (!healthLogs) {
return Health.UNKNOWN
}
}
if (healthLogs) {
// Ping health if no logs
pingStates?.let { pings ->
if (pings.any { !it.value.isReachable }) return Health.UNHEALTHY
return Health.HEALTHY
}
// Stats health if no logs or pings
statistics?.let { stats ->
return if (stats.isTunnelStale()) Health.STALE else Health.HEALTHY
}
return Health.UNKNOWN
}
@@ -46,12 +46,12 @@ fun IconSurfaceButton(
horizontalAlignment = Alignment.Start,
) {
Row(
verticalAlignment = Alignment.Companion.CenterVertically,
verticalAlignment = Alignment.CenterVertically,
horizontalArrangement = Arrangement.spacedBy(16.dp),
) {
Row(
horizontalArrangement = Arrangement.spacedBy(16.dp),
verticalAlignment = Alignment.Companion.CenterVertically,
verticalAlignment = Alignment.CenterVertically,
modifier =
Modifier.padding(vertical = if (description == null) 10.dp else 0.dp),
) {
@@ -1,94 +0,0 @@
package com.zaneschepke.wireguardautotunnel.ui.common.textbox
import androidx.compose.foundation.interaction.MutableInteractionSource
import androidx.compose.foundation.interaction.collectIsFocusedAsState
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.text.KeyboardActions
import androidx.compose.foundation.text.KeyboardOptions
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.outlined.Save
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.runtime.*
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalFocusManager
import androidx.compose.ui.platform.LocalSoftwareKeyboardController
import androidx.compose.ui.text.input.ImeAction
import androidx.compose.ui.text.input.KeyboardCapitalization
import androidx.compose.ui.unit.dp
@Composable
fun SubmitConfigurationTextBox(
value: String?,
label: String,
hint: String,
modifier: Modifier = Modifier,
isErrorValue: (value: String?) -> Boolean,
onSubmit: (value: String) -> Unit,
supportingText: @Composable (() -> Unit)? = null,
keyboardOptions: KeyboardOptions =
KeyboardOptions(capitalization = KeyboardCapitalization.None, imeAction = ImeAction.Done),
) {
val focusManager = LocalFocusManager.current
val interactionSource = remember { MutableInteractionSource() }
val isFocused by interactionSource.collectIsFocusedAsState()
val keyboardController = LocalSoftwareKeyboardController.current
var stateValue by remember { mutableStateOf(value ?: "") }
CustomTextField(
isError = isErrorValue(stateValue),
textStyle =
MaterialTheme.typography.bodySmall.copy(color = MaterialTheme.colorScheme.onSurface),
value = stateValue,
onValueChange = { stateValue = it },
interactionSource = interactionSource,
supportingText = supportingText,
label = {
Text(
label,
color = MaterialTheme.colorScheme.onSurface,
style = MaterialTheme.typography.labelMedium,
)
},
containerColor = MaterialTheme.colorScheme.surface,
placeholder = {
Text(
hint,
style = MaterialTheme.typography.bodySmall,
color = MaterialTheme.colorScheme.outline,
)
},
modifier = modifier.fillMaxWidth().height(48.dp),
singleLine = true,
keyboardOptions = keyboardOptions,
keyboardActions =
KeyboardActions(
onDone = {
onSubmit(stateValue)
keyboardController?.hide()
}
),
trailing = {
if (!isErrorValue(stateValue) && isFocused) {
IconButton(
onClick = {
onSubmit(stateValue)
keyboardController?.hide()
focusManager.clearFocus()
}
) {
val icon = Icons.Outlined.Save
Icon(
imageVector = icon,
contentDescription = icon.name,
tint = MaterialTheme.colorScheme.primary,
)
}
}
},
)
}
@@ -17,6 +17,7 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
import androidx.navigation.NavGraph.Companion.findStartDestination
import androidx.navigation.NavHostController
import androidx.navigation.compose.currentBackStackEntryAsState
import com.zaneschepke.wireguardautotunnel.R
@@ -58,26 +59,50 @@ fun BottomNavbar(
BottomNavItem(
name = stringResource(R.string.tunnels),
icon = Icons.Rounded.Home,
onClick = { navController.navigate(Route.TunnelsGraph) },
onClick = {
navController.navigate(Route.TunnelsGraph) {
popUpTo(navController.graph.findStartDestination().id) { saveState = true }
launchSingleTop = true
restoreState = true
}
},
route = Route.TunnelsGraph,
),
BottomNavItem(
name = stringResource(R.string.auto_tunnel),
icon = Icons.Rounded.Bolt,
onClick = { navController.navigate(Route.AutoTunnelGraph) },
onClick = {
navController.navigate(Route.AutoTunnelGraph) {
popUpTo(navController.graph.findStartDestination().id) { saveState = true }
launchSingleTop = true
restoreState = true
}
},
route = Route.AutoTunnelGraph,
active = isAutoTunnelActive,
),
BottomNavItem(
name = stringResource(R.string.settings),
icon = Icons.Rounded.Settings,
onClick = { navController.navigate(Route.SettingsGraph) },
onClick = {
navController.navigate(Route.SettingsGraph) {
popUpTo(navController.graph.findStartDestination().id) { saveState = true }
launchSingleTop = true
restoreState = true
}
},
route = Route.SettingsGraph,
),
BottomNavItem(
name = stringResource(R.string.support),
icon = Icons.Rounded.QuestionMark,
onClick = { navController.navigate(Route.SupportGraph) },
onClick = {
navController.navigate(Route.SupportGraph) {
popUpTo(navController.graph.findStartDestination().id) { saveState = true }
launchSingleTop = true
restoreState = true
}
},
route = Route.SupportGraph,
),
)
@@ -17,7 +17,6 @@ import androidx.navigation.toRoute
import com.zaneschepke.wireguardautotunnel.R
import com.zaneschepke.wireguardautotunnel.ui.common.button.ActionIconButton
import com.zaneschepke.wireguardautotunnel.ui.navigation.Route
import com.zaneschepke.wireguardautotunnel.ui.navigation.Route.Config
import com.zaneschepke.wireguardautotunnel.ui.sideeffect.LocalSideEffect
import com.zaneschepke.wireguardautotunnel.ui.state.NavbarState
import com.zaneschepke.wireguardautotunnel.viewmodel.SharedAppViewModel
@@ -74,21 +73,12 @@ fun NavHostController.currentBackStackEntryAsNavbarState(
}
}
val disableDelete by
rememberSaveable(sharedState.selectedTunnels, sharedState.tunnels) {
mutableStateOf(
sharedState.tunnels.any { tunnel ->
tunnel.isActive &&
sharedState.tunnels.any { selected -> selected.id == tunnel.id }
}
)
}
val selectedCount by
rememberSaveable(sharedState.selectedTunnels) {
mutableStateOf(sharedState.selectedTunnels.size)
mutableIntStateOf(sharedState.selectedTunnels.size)
}
return produceState(initialValue = NavbarState(), route, selectedCount, disableDelete) {
return produceState(initialValue = NavbarState(), route, selectedCount) {
value =
when (route) {
Route.AdvancedAutoTunnel ->
@@ -104,7 +94,11 @@ fun NavHostController.currentBackStackEntryAsNavbarState(
Route.AutoTunnel ->
NavbarState(
showBottomItems = true,
topTitle = { Text(stringResource(R.string.auto_tunnel)) },
topTitle =
if (!sharedState.isLocationDisclosureShown) null
else {
{ Text(stringResource(R.string.auto_tunnel)) }
},
)
is Route.Config -> {
val tunnel = sharedState.tunnels.find { it.id == route.id }
@@ -236,7 +230,7 @@ fun NavHostController.currentBackStackEntryAsNavbarState(
sharedViewModel.postSideEffect(LocalSideEffect.Modal.QR)
}
ActionIconButton(Icons.Rounded.Edit, R.string.edit_tunnel) {
navigate(Config(route.id))
navigate(Route.Config(route.id))
}
}
},
@@ -275,8 +269,6 @@ fun NavHostController.currentBackStackEntryAsNavbarState(
sharedViewModel.copySelectedTunnel()
}
}
if (!disableDelete) {
ActionIconButton(
Icons.Rounded.Delete,
R.string.delete_tunnel,
@@ -287,7 +279,6 @@ fun NavHostController.currentBackStackEntryAsNavbarState(
}
}
}
}
},
showBottomItems = true,
)
@@ -17,7 +17,7 @@ import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.dp
import androidx.hilt.navigation.compose.hiltViewModel
import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import com.google.accompanist.permissions.ExperimentalPermissionsApi
import com.zaneschepke.wireguardautotunnel.R
@@ -42,6 +42,12 @@ fun AutoTunnelScreen(viewModel: AutoTunnelViewModel = hiltViewModel()) {
val navController = LocalNavController.current
val autoTunnelState by viewModel.container.stateFlow.collectAsStateWithLifecycle()
LaunchedEffect(autoTunnelState.stateInitialized) {
if (!autoTunnelState.isLocationDisclosureShown && autoTunnelState.stateInitialized) {
navController.navigate(Route.LocationDisclosure)
}
}
if (!autoTunnelState.stateInitialized) return
var showLocationDialog by remember { mutableStateOf(false) }
@@ -1,16 +1,25 @@
package com.zaneschepke.wireguardautotunnel.ui.screens.autotunnel.disclosure
import android.content.Intent
import android.net.Uri
import android.provider.Settings
import androidx.activity.compose.rememberLauncherForActivityResult
import androidx.activity.result.contract.ActivityResultContracts
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.unit.dp
import com.zaneschepke.wireguardautotunnel.ui.LocalNavController
import com.zaneschepke.wireguardautotunnel.ui.common.button.surface.SurfaceSelectionGroupButton
import com.zaneschepke.wireguardautotunnel.ui.navigation.Route
import com.zaneschepke.wireguardautotunnel.ui.screens.autotunnel.disclosure.components.LocationDisclosureHeader
import com.zaneschepke.wireguardautotunnel.ui.screens.autotunnel.disclosure.components.appSettingsItem
import com.zaneschepke.wireguardautotunnel.ui.screens.autotunnel.disclosure.components.skipItem
@@ -19,6 +28,18 @@ import com.zaneschepke.wireguardautotunnel.viewmodel.AutoTunnelViewModel
@Composable
fun LocationDisclosureScreen(viewModel: AutoTunnelViewModel) {
val navController = LocalNavController.current
val context = LocalContext.current
fun goToAutoTunnel() {
navController.navigate(Route.AutoTunnel) {
popUpTo(Route.LocationDisclosure) { inclusive = true }
}
}
val settingsLauncher =
rememberLauncherForActivityResult(ActivityResultContracts.StartActivityForResult()) { _ ->
goToAutoTunnel()
}
LaunchedEffect(Unit) { viewModel.setLocationDisclosureShown() }
@@ -28,7 +49,18 @@ fun LocationDisclosureScreen(viewModel: AutoTunnelViewModel) {
modifier = Modifier.fillMaxSize().padding(top = 18.dp).padding(horizontal = 24.dp),
) {
LocationDisclosureHeader()
SurfaceSelectionGroupButton(items = listOf(appSettingsItem()))
SurfaceSelectionGroupButton(items = listOf(skipItem(navController)))
SurfaceSelectionGroupButton(
items =
listOf(
appSettingsItem {
val intent =
Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS).apply {
data = Uri.fromParts("package", context.packageName, null)
}
settingsLauncher.launch(intent)
}
)
)
SurfaceSelectionGroupButton(items = listOf(skipItem { goToAutoTunnel() }))
}
}
@@ -4,19 +4,15 @@ import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.outlined.LocationOn
import androidx.compose.material3.Icon
import androidx.compose.runtime.Composable
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.stringResource
import com.zaneschepke.wireguardautotunnel.R
import com.zaneschepke.wireguardautotunnel.ui.common.button.ForwardButton
import com.zaneschepke.wireguardautotunnel.ui.common.button.LaunchButton
import com.zaneschepke.wireguardautotunnel.ui.common.button.surface.SelectionItem
import com.zaneschepke.wireguardautotunnel.ui.common.button.surface.SelectionItemLabel
import com.zaneschepke.wireguardautotunnel.ui.common.button.surface.SelectionLabelType
import com.zaneschepke.wireguardautotunnel.util.extensions.launchAppSettings
@Composable
fun appSettingsItem(): SelectionItem {
val context = LocalContext.current
fun appSettingsItem(onClick: () -> Unit): SelectionItem {
return SelectionItem(
leading = { Icon(Icons.Outlined.LocationOn, contentDescription = null) },
title = {
@@ -25,7 +21,7 @@ fun appSettingsItem(): SelectionItem {
labelType = SelectionLabelType.TITLE,
)
},
trailing = { ForwardButton { context.launchAppSettings() } },
onClick = { context.launchAppSettings() },
trailing = { LaunchButton { onClick() } },
onClick = onClick,
)
}
@@ -2,21 +2,19 @@ package com.zaneschepke.wireguardautotunnel.ui.screens.autotunnel.disclosure.com
import androidx.compose.runtime.Composable
import androidx.compose.ui.res.stringResource
import androidx.navigation.NavController
import com.zaneschepke.wireguardautotunnel.R
import com.zaneschepke.wireguardautotunnel.ui.common.button.ForwardButton
import com.zaneschepke.wireguardautotunnel.ui.common.button.surface.SelectionItem
import com.zaneschepke.wireguardautotunnel.ui.common.button.surface.SelectionItemLabel
import com.zaneschepke.wireguardautotunnel.ui.common.button.surface.SelectionLabelType
import com.zaneschepke.wireguardautotunnel.ui.navigation.Route
@Composable
fun skipItem(navController: NavController): SelectionItem {
fun skipItem(onClick: () -> Unit): SelectionItem {
return SelectionItem(
title = {
SelectionItemLabel(stringResource(R.string.skip), labelType = SelectionLabelType.TITLE)
},
trailing = { ForwardButton { navController.navigate(Route.AutoTunnelGraph) } },
onClick = { navController.navigate(Route.AutoTunnelGraph) },
trailing = { ForwardButton { onClick() } },
onClick = onClick,
)
}
@@ -24,12 +24,18 @@ fun PinLockScreen() {
val pinAlreadyExists by rememberSaveable { mutableStateOf(PinManager.pinExists()) }
var pinCreated by rememberSaveable { mutableStateOf(false) }
fun onPinCorrect() {
sharedViewModel.authenticated()
navController.popBackStack()
navController.navigate(Route.TunnelsGraph)
}
PinLock(
title = {
Text(
color = MaterialTheme.colorScheme.onSurface,
text =
if (pinAlreadyExists || pinCreated) {
if (pinAlreadyExists) {
stringResource(id = R.string.enter_pin)
} else {
stringResource(id = R.string.create_pin)
@@ -38,11 +44,7 @@ fun PinLockScreen() {
},
backgroundColor = MaterialTheme.colorScheme.surface,
textColor = MaterialTheme.colorScheme.onSurface,
onPinCorrect = {
sharedViewModel.authenticated()
navController.popBackStack()
navController.navigate(Route.TunnelsGraph)
},
onPinCorrect = { onPinCorrect() },
onPinIncorrect = {
sharedViewModel.showToast(StringValue.StringResource(R.string.incorrect_pin))
},
@@ -50,6 +52,7 @@ fun PinLockScreen() {
pinCreated = true
sharedViewModel.showToast(StringValue.StringResource(R.string.pin_created))
sharedViewModel.setPinLockEnabled(true)
onPinCorrect()
},
)
BackHandler(enabled = (!pinAlreadyExists && !pinCreated)) {
@@ -15,7 +15,7 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalFocusManager
import androidx.compose.ui.unit.dp
import androidx.hilt.navigation.compose.hiltViewModel
import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import com.zaneschepke.wireguardautotunnel.R
import com.zaneschepke.wireguardautotunnel.data.model.AppMode
@@ -32,7 +32,6 @@ import com.zaneschepke.wireguardautotunnel.util.StringValue
import com.zaneschepke.wireguardautotunnel.util.extensions.asString
import com.zaneschepke.wireguardautotunnel.viewmodel.SettingsViewModel
import org.orbitmvi.orbit.compose.collectSideEffect
import xyz.teamgravity.pin_lock_compose.PinManager
@Composable
fun SettingsScreen(viewModel: SettingsViewModel = hiltViewModel()) {
@@ -72,7 +71,7 @@ fun SettingsScreen(viewModel: SettingsViewModel = hiltViewModel()) {
}
}
if (showBackupSheet) BackupBottomSheet() { showBackupSheet = false }
if (showBackupSheet) BackupBottomSheet { showBackupSheet = false }
if (showAppModeSheet)
AppModeBottomSheet(sharedViewModel::setAppMode, settingsState.settings.appMode) {
showAppModeSheet = false
@@ -136,29 +135,28 @@ fun SettingsScreen(viewModel: SettingsViewModel = hiltViewModel()) {
}
)
if (showProxySettings)
add(proxYSettingsItem() { navController.navigate(Route.ProxySettings) })
add(proxYSettingsItem { navController.navigate(Route.ProxySettings) })
}
)
SectionDivider()
SurfaceSelectionGroupButton(
listOf(systemFeaturesItem() { navController.navigate(Route.SystemFeatures) })
listOf(systemFeaturesItem { navController.navigate(Route.SystemFeatures) })
)
SectionDivider()
SurfaceSelectionGroupButton(
items =
buildList {
add(appearanceItem() { navController.navigate(Route.Appearance) })
add(appearanceItem { navController.navigate(Route.Appearance) })
add(
localLoggingItem(settingsState.isLocalLoggingEnabled) {
viewModel.setLocalLogging(it)
}
)
if (settingsState.isLocalLoggingEnabled)
add(readLogsItem() { navController.navigate(Route.Logs) })
add(readLogsItem { navController.navigate(Route.Logs) })
add(
pinLockItem(settingsState.isPinLockEnabled) { enabled ->
if (enabled) {
PinManager.initialize(context)
navController.navigate(Route.Lock)
} else {
sharedViewModel.setPinLockEnabled(false)
@@ -13,7 +13,7 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.font.FontStyle
import androidx.compose.ui.unit.dp
import androidx.hilt.navigation.compose.hiltViewModel
import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import com.zaneschepke.wireguardautotunnel.R
import com.zaneschepke.wireguardautotunnel.ui.LocalSharedVm
@@ -30,7 +30,7 @@ fun LogsScreen(viewModel: LoggerViewModel = hiltViewModel()) {
val lazyColumnListState = rememberLazyListState()
var isAutoScrolling by rememberSaveable { mutableStateOf(true) }
var lastScrollPosition by rememberSaveable() { mutableIntStateOf(0) }
var lastScrollPosition by rememberSaveable { mutableIntStateOf(0) }
var showLogsSheet by rememberSaveable { mutableStateOf(false) }
sharedAppViewModel.collectSideEffect { sideEffect ->
@@ -69,7 +69,16 @@ fun LogsScreen(viewModel: LoggerViewModel = hiltViewModel()) {
}
if (showLogsSheet) {
LogsBottomSheet({ viewModel.exportLogs() }, { viewModel.deleteLogs() }) {
LogsBottomSheet(
{ uri ->
viewModel.exportLogs(uri)
showLogsSheet = false
},
{
viewModel.deleteLogs()
showLogsSheet = false
},
) {
showLogsSheet = false
}
}
@@ -1,24 +1,53 @@
package com.zaneschepke.wireguardautotunnel.ui.screens.settings.logs.components
import android.net.Uri
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.outlined.Delete
import androidx.compose.material.icons.outlined.FolderZip
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.runtime.Composable
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.stringResource
import com.zaneschepke.wireguardautotunnel.BuildConfig
import com.zaneschepke.wireguardautotunnel.R
import com.zaneschepke.wireguardautotunnel.ui.common.functions.rememberFileExportLauncherForResult
import com.zaneschepke.wireguardautotunnel.ui.common.sheet.CustomBottomSheet
import com.zaneschepke.wireguardautotunnel.ui.common.sheet.SheetOption
import com.zaneschepke.wireguardautotunnel.util.Constants
import com.zaneschepke.wireguardautotunnel.util.FileUtils
import com.zaneschepke.wireguardautotunnel.util.extensions.hasSAFSupport
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun LogsBottomSheet(onExport: () -> Unit, onDelete: () -> Unit, onDismiss: () -> Unit) {
fun LogsBottomSheet(onExport: (file: Uri?) -> Unit, onDelete: () -> Unit, onDismiss: () -> Unit) {
val context = LocalContext.current
val selectedTunnelsExportLauncher =
rememberFileExportLauncherForResult(
mimeType = FileUtils.ZIP_FILE_MIME_TYPE,
onResult = { file ->
if (file != null) {
onExport(file)
} else onDismiss()
},
)
fun handleFileExport() {
if (context.hasSAFSupport(FileUtils.ZIP_FILE_MIME_TYPE)) {
selectedTunnelsExportLauncher.launch(
"${Constants.BASE_LOG_FILE_NAME}_${BuildConfig.VERSION_NAME}_${BuildConfig.FLAVOR}.zip"
)
} else {
onExport(null)
}
}
CustomBottomSheet(
listOf(
SheetOption(
Icons.Outlined.FolderZip,
stringResource(R.string.export_logs),
onClick = onExport,
onClick = { handleFileExport() },
),
SheetOption(
Icons.Outlined.Delete,
@@ -19,7 +19,7 @@ import androidx.compose.ui.text.input.ImeAction
import androidx.compose.ui.text.input.PasswordVisualTransformation
import androidx.compose.ui.text.input.VisualTransformation
import androidx.compose.ui.unit.dp
import androidx.hilt.navigation.compose.hiltViewModel
import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import com.zaneschepke.wireguardautotunnel.R
import com.zaneschepke.wireguardautotunnel.domain.model.AppProxySettings
@@ -32,16 +32,16 @@ data class Address(
address = R.string.zcash_address,
icon = R.drawable.zcash,
),
Address(
name = R.string.litecoin_mweb,
address = R.string.litecoin_mweb_address,
icon = R.drawable.ltc,
),
Address(
name = R.string.litecoin,
address = R.string.litecoin_address,
icon = R.drawable.ltc,
),
Address(
name = R.string.ecash,
address = R.string.ecash_address,
icon = R.drawable.ecash,
),
Address(
name = R.string.polygon,
address = R.string.polygon_address,
@@ -72,36 +72,6 @@ data class Address(
address = R.string.bitcoin_cash_address,
icon = R.drawable.bitcoin_cash,
),
Address(
name = R.string.ecash,
address = R.string.ecash_address,
icon = R.drawable.ecash,
),
Address(
name = R.string.nano,
address = R.string.nano_address,
icon = R.drawable.nano,
),
Address(
name = R.string.zano,
address = R.string.zano_address,
icon = R.drawable.zano,
),
Address(
name = R.string.decred,
address = R.string.decred_address,
icon = R.drawable.decred,
),
Address(
name = R.string.wownero,
address = R.string.wownero_address,
icon = R.drawable.wownero,
),
Address(
name = R.string.doge,
address = R.string.doge_address,
icon = R.drawable.doge,
),
)
}
}
@@ -107,6 +107,7 @@ fun TunnelsScreen(viewModel: TunnelsViewModel) {
if (showExportSheet) {
ExportTunnelsBottomSheet({ type, uri ->
sharedViewModel.exportSelectedTunnels(type, uri)
showExportSheet = false
}) {
showExportSheet = false
sharedViewModel.clearSelectedTunnels()
@@ -11,9 +11,9 @@ import com.zaneschepke.wireguardautotunnel.domain.enums.ConfigType
import com.zaneschepke.wireguardautotunnel.ui.common.functions.rememberFileExportLauncherForResult
import com.zaneschepke.wireguardautotunnel.ui.common.sheet.CustomBottomSheet
import com.zaneschepke.wireguardautotunnel.ui.common.sheet.SheetOption
import com.zaneschepke.wireguardautotunnel.util.Constants
import com.zaneschepke.wireguardautotunnel.util.FileUtils
import com.zaneschepke.wireguardautotunnel.util.extensions.hasSAFSupport
import java.time.Instant
@Composable
fun ExportTunnelsBottomSheet(
@@ -30,14 +30,19 @@ fun ExportTunnelsBottomSheet(
mimeType = FileUtils.ZIP_FILE_MIME_TYPE,
onResult = { file ->
if (file != null) {
onExport(ConfigType.WG, file)
onExport(exportConfigType, file)
} else onDismiss()
},
)
fun handleFileExport() {
if (context.hasSAFSupport(FileUtils.ZIP_FILE_MIME_TYPE)) {
selectedTunnelsExportLauncher.launch(Constants.DEFAULT_EXPORT_FILE_NAME)
val fileName =
when (exportConfigType) {
ConfigType.AM -> "am_export_${Instant.now().epochSecond}.zip"
ConfigType.WG -> "wg_export_${Instant.now().epochSecond}.zip"
}
selectedTunnelsExportLauncher.launch(fileName)
} else {
onExport(exportConfigType, null)
}
@@ -39,7 +39,10 @@ fun TunnelRowItem(
modifier: Modifier = Modifier,
) {
val context = LocalContext.current
var leadingIconColor by remember(state) { mutableStateOf(state.health().asColor()) }
var leadingIconColor by
remember(state.status, state.logHealthState, state.pingStates, state.statistics) {
mutableStateOf(state.health().asColor())
}
val (leadingIcon, size, typeDescription) =
remember(tunnel) {
@@ -10,7 +10,7 @@ import androidx.compose.runtime.*
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
import androidx.hilt.navigation.compose.hiltViewModel
import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import com.zaneschepke.wireguardautotunnel.ui.LocalSharedVm
import com.zaneschepke.wireguardautotunnel.ui.common.SecureScreenFromRecording
@@ -107,6 +107,6 @@ fun ConfigScreen(tunnelId: Int? = null, viewModel: TunnelsViewModel = hiltViewMo
)
},
)
AddPeerButton() { configProxy = configProxy.copy(peers = configProxy.peers + PeerProxy()) }
AddPeerButton { configProxy = configProxy.copy(peers = configProxy.peers + PeerProxy()) }
}
}
@@ -102,12 +102,7 @@ fun SortScreen(viewModel: TunnelsViewModel) {
text = tunnel.tunName,
trailing = {
if (!isTv)
Icon(
Icons.Default.DragHandle,
stringResource(
com.zaneschepke.wireguardautotunnel.R.string.drag_handle
),
)
Icon(Icons.Default.DragHandle, stringResource(R.string.drag_handle))
else
Row {
IconButton(
@@ -121,9 +116,7 @@ fun SortScreen(viewModel: TunnelsViewModel) {
) {
Icon(
Icons.Default.ArrowUpward,
stringResource(
com.zaneschepke.wireguardautotunnel.R.string.move_up
),
stringResource(R.string.move_up),
)
}
IconButton(
@@ -8,7 +8,7 @@ import androidx.compose.runtime.*
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
import androidx.hilt.navigation.compose.hiltViewModel
import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import com.zaneschepke.wireguardautotunnel.ui.LocalSharedVm
import com.zaneschepke.wireguardautotunnel.ui.screens.tunnels.splittunnel.components.SplitTunnelContent
@@ -36,13 +36,13 @@ fun SplitTunnelScreen(tunnelId: Int, viewModel: SplitTunnelViewModel = hiltViewM
val conf by remember { derivedStateOf { tunnelConf.toAmConfig() } }
var splitConfig by remember {
mutableStateOf<Pair<SplitOption, Set<String>>>(
mutableStateOf(
when {
conf.`interface`.excludedApplications.isNotEmpty() ->
Pair(SplitOption.EXCLUDE, conf.`interface`.excludedApplications.toSet())
conf.`interface`.includedApplications.isNotEmpty() ->
Pair(SplitOption.INCLUDE, conf.`interface`.includedApplications.toSet())
else -> Pair(SplitOption.ALL, emptySet())
else -> Pair(SplitOption.ALL, emptySet<String>())
}
)
}
@@ -31,6 +31,7 @@ fun AppListSection(
) {
var query by remember { mutableStateOf("") }
val locale = remember { Locale.getDefault() }
val filteredAndSortedPackages by remember {
derivedStateOf {
@@ -40,7 +41,12 @@ fun AppListSection(
pkg.name.contains(query, ignoreCase = true) ||
pkg.packageName.contains(query, ignoreCase = true)
}
.sortedBy { pkg -> pkg.name.lowercase(Locale.getDefault()) }
.sortedWith(
compareByDescending<InstalledPackage> {
splitConfig.second.contains(it.packageName)
}
.thenBy { it.name.lowercase(locale) }
)
}
}
@@ -1,16 +1,36 @@
package com.zaneschepke.wireguardautotunnel.ui.screens.tunnels.tunneloptions.components
import android.util.Patterns
import androidx.compose.foundation.interaction.MutableInteractionSource
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.text.KeyboardActions
import androidx.compose.foundation.text.KeyboardOptions
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.outlined.Save
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.derivedStateOf
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalFocusManager
import androidx.compose.ui.platform.LocalSoftwareKeyboardController
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.input.ImeAction
import androidx.compose.ui.text.input.KeyboardCapitalization
import androidx.compose.ui.unit.dp
import com.zaneschepke.wireguardautotunnel.R
import com.zaneschepke.wireguardautotunnel.domain.model.TunnelConf
import com.zaneschepke.wireguardautotunnel.ui.common.button.surface.SelectionItem
import com.zaneschepke.wireguardautotunnel.ui.common.textbox.SubmitConfigurationTextBox
import com.zaneschepke.wireguardautotunnel.ui.common.textbox.CustomTextField
import com.zaneschepke.wireguardautotunnel.util.extensions.isValidIpv4orIpv6Address
@Composable
@@ -18,18 +38,73 @@ fun pingConfigItem(tunnelConf: TunnelConf, onSubmit: (ip: String) -> Unit): Sele
return SelectionItem(
title = {},
description = {
val focusManager = LocalFocusManager.current
val keyboardController = LocalSoftwareKeyboardController.current
var stateValue by remember { mutableStateOf(tunnelConf.pingTarget ?: "") }
val isError by
remember(stateValue) {
derivedStateOf {
stateValue.isNotBlank() &&
!stateValue.isValidIpv4orIpv6Address() &&
!Patterns.DOMAIN_NAME.matcher(stateValue).matches()
}
}
Column(verticalArrangement = Arrangement.spacedBy(16.dp)) {
SubmitConfigurationTextBox(
value = tunnelConf.pingTarget,
label = stringResource(R.string.set_custom_ping_target),
hint = stringResource(R.string.ip_or_hostname),
isErrorValue = {
it?.isNotBlank() == true &&
!it.isValidIpv4orIpv6Address() &&
!Patterns.DOMAIN_NAME.matcher(it).matches()
CustomTextField(
isError = isError,
textStyle =
MaterialTheme.typography.bodySmall.copy(
color = MaterialTheme.colorScheme.onSurface
),
value = stateValue,
onValueChange = { stateValue = it },
interactionSource = remember { MutableInteractionSource() },
label = {
Text(
stringResource(R.string.set_custom_ping_target),
color = MaterialTheme.colorScheme.onSurface,
style = MaterialTheme.typography.labelMedium,
)
},
placeholder = {
Text(
stringResource(R.string.ip_or_hostname),
style = MaterialTheme.typography.bodySmall,
color = MaterialTheme.colorScheme.outline,
)
},
containerColor = MaterialTheme.colorScheme.surface,
supportingText = { Text(stringResource(R.string.ping_target_description)) },
onSubmit = onSubmit,
modifier =
Modifier.padding(top = 5.dp, bottom = 10.dp)
.fillMaxWidth()
.padding(end = 16.dp),
singleLine = true,
keyboardOptions =
KeyboardOptions(
capitalization = KeyboardCapitalization.None,
imeAction = ImeAction.Done,
),
keyboardActions = KeyboardActions(onDone = { onSubmit(stateValue) }),
trailing = {
if (!isError) {
IconButton(
onClick = {
onSubmit(stateValue)
keyboardController?.hide()
focusManager.clearFocus()
}
) {
val icon = Icons.Outlined.Save
Icon(
imageVector = icon,
contentDescription = icon.name,
tint = MaterialTheme.colorScheme.primary,
)
}
}
},
)
}
},
@@ -8,5 +8,6 @@ data class AutoTunnelUiState(
val connectivityState: ConnectivityState? = null,
val generalSettings: GeneralSettings = GeneralSettings(),
val isBatteryOptimizationShown: Boolean = false,
val isLocationDisclosureShown: Boolean = false,
val stateInitialized: Boolean = false,
)
@@ -7,7 +7,5 @@ data class NavbarState(
val topTrailing: (@Composable () -> Unit)? = null,
val showBottomItems: Boolean = false,
val removeBottom: Boolean = false,
val removeTop: Boolean = false,
val locationDisclosureShown: Boolean = false,
val isAutoTunnelActive: Boolean = false,
)
@@ -5,22 +5,10 @@ object Constants {
const val BASE_LOG_FILE_NAME = "wg_tunnel_logs"
const val BATTERY_SAVER_WATCHER_WAKE_LOCK_TIMEOUT = 10 * 60 * 1_000L // 10 minutes
const val VPN_SETTINGS_PACKAGE = "android.net.vpn.SETTINGS"
const val SYSTEM_EXEMPT_SERVICE_TYPE_ID = 1 shl 10
const val SPECIAL_USE_SERVICE_TYPE_ID = 1 shl 30
const val DEFAULT_EXPORT_FILE_NAME = "wgtunnel-export.zip"
const val SUBSCRIPTION_TIMEOUT = 5_000L
const val DEFAULT_PING_IP = "1.1.1.1"
const val PING_TIMEOUT: Int = 5_000
const val PING_ATTEMPTS: Int = 3
const val PING_INTERVAL = 30
val amProperties = listOf("Jc", "Jmin", "Jmax", "S1", "S2", "H1", "H2", "H3", "H4")
const val QR_CODE_NAME_PROPERTY = "# Name ="
const val FDROID_FLAVOR = "fdroid"
@@ -1,13 +1,13 @@
package com.zaneschepke.wireguardautotunnel.util
object InvalidFileExtensionException : Exception() {
private fun readResolve(): Any = InvalidFileExtensionException
class InvalidFileExtensionException : Exception() {
private fun readResolve(): Any = InvalidFileExtensionException()
}
object FileReadException : Exception() {
private fun readResolve(): Any = FileReadException
class FileReadException : Exception() {
private fun readResolve(): Any = FileReadException()
}
object ConfigExportException : Exception() {
private fun readResolve(): Any = ConfigExportException
class ConfigExportException : Exception() {
private fun readResolve(): Any = ConfigExportException()
}
@@ -95,7 +95,7 @@ fun Context.hasSAFSupport(mimeType: String): Boolean {
}
fun Context.launchShareFile(file: File) {
val uri = FileProvider.getUriForFile(this, getString(R.string.provider), file)
FileProvider.getUriForFile(this, getString(R.string.provider), file)
val shareIntent =
Intent().apply {
action = Intent.ACTION_SEND
@@ -7,7 +7,6 @@ import com.zaneschepke.wireguardautotunnel.domain.enums.HandshakeStatus
import com.zaneschepke.wireguardautotunnel.domain.enums.TunnelStatus
import com.zaneschepke.wireguardautotunnel.domain.events.BackendCoreException
import com.zaneschepke.wireguardautotunnel.domain.state.TunnelStatistics
import com.zaneschepke.wireguardautotunnel.util.Constants
import com.zaneschepke.wireguardautotunnel.util.NumberUtils
import com.zaneschepke.wireguardautotunnel.util.StringValue
import org.amnezia.awg.backend.Backend
@@ -74,26 +73,11 @@ fun com.wireguard.config.BadConfigException.asStringValue(): StringValue {
return StringValue.StringResource(R.string.config_error_template, reason, location)
}
fun Config.toWgQuickString(): String {
val amQuick = toAwgQuickString(true, false)
val lines = amQuick.lines().toMutableList()
val linesIterator = lines.iterator()
while (linesIterator.hasNext()) {
val next = linesIterator.next()
Constants.amProperties.forEach {
if (next.startsWith(it, ignoreCase = true)) {
linesIterator.remove()
}
}
}
return lines.joinToString(System.lineSeparator())
}
fun Config.defaultName(): String {
return try {
this.peers[0].endpoint.get().host
} catch (e: Exception) {
Timber.Forest.e(e)
Timber.e(e)
NumberUtils.generateRandomTunnelName()
}
}
@@ -11,7 +11,7 @@ import androidx.compose.runtime.remember
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.res.vectorResource
import androidx.hilt.navigation.compose.hiltViewModel
import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel
import androidx.lifecycle.ViewModel
import androidx.navigation.NavBackStackEntry
import androidx.navigation.NavController
@@ -46,6 +46,7 @@ constructor(
connectivityState = connectivity,
generalSettings = settings,
isBatteryOptimizationShown = appState.isBatteryOptimizationDisableShown,
isLocationDisclosureShown = appState.isLocationDisclosureShown,
stateInitialized = true,
)
}
@@ -74,9 +75,9 @@ constructor(
if (!state.isBatteryOptimizationShown) {
return@intent postSideEffect(GlobalSideEffect.RequestBatteryOptimizationDisabled)
}
serviceManager.startAutoTunnel()
settingsRepository.updateAutoTunnelEnabled(true)
} else {
serviceManager.stopAutoTunnel()
settingsRepository.updateAutoTunnelEnabled(false)
}
}
@@ -116,7 +117,7 @@ constructor(
}
fun setTunnelOnEthernet(to: Boolean) = intent {
settingsRepository.save(state.generalSettings.copy(isTunnelOnMobileDataEnabled = to))
settingsRepository.save(state.generalSettings.copy(isTunnelOnEthernetEnabled = to))
}
fun setDebounceDelay(to: Int) = intent {
@@ -1,7 +1,9 @@
package com.zaneschepke.wireguardautotunnel.viewmodel
import android.net.Uri
import androidx.lifecycle.ViewModel
import com.zaneschepke.logcatter.LogReader
import com.zaneschepke.wireguardautotunnel.BuildConfig
import com.zaneschepke.wireguardautotunnel.R
import com.zaneschepke.wireguardautotunnel.domain.repository.AppStateRepository
import com.zaneschepke.wireguardautotunnel.domain.repository.GlobalEffectRepository
@@ -11,7 +13,6 @@ import com.zaneschepke.wireguardautotunnel.util.Constants
import com.zaneschepke.wireguardautotunnel.util.FileUtils
import com.zaneschepke.wireguardautotunnel.util.StringValue
import dagger.hilt.android.lifecycle.HiltViewModel
import java.time.Instant
import javax.inject.Inject
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.delay
@@ -71,18 +72,30 @@ constructor(
globalEffectRepository.post(globalSideEffect)
}
fun exportLogs() = intent {
fun exportLogs(uri: Uri?) = intent {
val result =
fileUtils.createNewShareFile(
"${Constants.BASE_LOG_FILE_NAME}-${Instant.now().epochSecond}.zip"
"${Constants.BASE_LOG_FILE_NAME}_${BuildConfig.VERSION_NAME}_${BuildConfig.FLAVOR}.zip"
)
val onFailure = { action: Throwable ->
Timber.e(action)
intent {
postSideEffect(
GlobalSideEffect.Toast(
StringValue.StringResource(
R.string.export_failed,
": ${action.localizedMessage}",
)
)
)
result.onSuccess { file -> postSideEffect(GlobalSideEffect.ShareFile(file)) }
result.onFailure { error ->
val message =
error.message?.let { StringValue.DynamicString(it) }
?: StringValue.StringResource(R.string.unknown_error)
postSideEffect(GlobalSideEffect.Toast(message))
}
Unit
}
result.onSuccess { file ->
logReader.zipLogFiles(file.absolutePath)
fileUtils.exportFile(file, uri, FileUtils.ZIP_FILE_MIME_TYPE).onFailure(onFailure)
}
result.onFailure(onFailure)
}
fun deleteLogs() = intent {
@@ -33,6 +33,7 @@ import javax.inject.Inject
import javax.inject.Provider
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.firstOrNull
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.withContext
import org.orbitmvi.orbit.ContainerHost
@@ -98,7 +99,7 @@ constructor(
fun startTunnel(tunnelConf: TunnelConf) = intent {
if (state.settings.appMode == AppMode.VPN) {
if (!tunnelManager.hasVpnPermission())
if (!serviceManager.hasVpnPermission())
return@intent postSideEffect(
GlobalSideEffect.RequestVpnPermission(AppMode.VPN, tunnelConf)
)
@@ -163,29 +164,35 @@ constructor(
fun setWifiDetectionMethod(method: WifiDetectionMethod) = intent {
when (method) {
WifiDetectionMethod.ROOT -> if (!requestRoot()) return@intent
WifiDetectionMethod.SHIZUKU -> return@intent requestShizuku()
WifiDetectionMethod.SHIZUKU -> {
requestShizuku()
return@intent
}
else -> Unit
}
settingsRepository.save(state.settings.copy(wifiDetectionMethod = method))
}
private fun requestShizuku() {
private fun requestShizuku() = intent {
Shizuku.addRequestPermissionResultListener(
Shizuku.OnRequestPermissionResultListener { requestCode: Int, grantResult: Int ->
if (grantResult != PERMISSION_GRANTED) return@OnRequestPermissionResultListener
setWifiDetectionMethod(WifiDetectionMethod.SHIZUKU)
intent {
settingsRepository.save(
state.settings.copy(wifiDetectionMethod = WifiDetectionMethod.SHIZUKU)
)
}
}
)
try {
if (Shizuku.checkSelfPermission() != PERMISSION_GRANTED) Shizuku.requestPermission(123)
settingsRepository.save(
state.settings.copy(wifiDetectionMethod = WifiDetectionMethod.SHIZUKU)
)
} catch (_: Exception) {
intent {
postSideEffect(
GlobalSideEffect.Snackbar(
StringValue.StringResource(R.string.shizuku_not_detected)
GlobalSideEffect.Snackbar(StringValue.StringResource(R.string.shizuku_not_detected))
)
)
}
}
}
@@ -227,6 +234,13 @@ constructor(
}
fun deleteSelectedTunnels() = intent {
val activeTunIds = tunnelManager.activeTunnels.firstOrNull()?.map { it.key }
if (state.selectedTunnels.any { activeTunIds?.contains(it.id) == true })
return@intent postSideEffect(
GlobalSideEffect.Snackbar(
StringValue.StringResource(R.string.delete_active_message)
)
)
tunnelRepository.delete(state.selectedTunnels.toList())
clearSelectedTunnels()
}
@@ -270,6 +284,10 @@ constructor(
.onSuccess {
fileUtils.zipAll(it, files).onFailure(onFailure)
fileUtils.exportFile(it, uri, FileUtils.ZIP_FILE_MIME_TYPE).onFailure(onFailure)
postSideEffect(
GlobalSideEffect.Snackbar(StringValue.StringResource(R.string.export_success))
)
clearSelectedTunnels()
}
.onFailure(onFailure)
}
@@ -203,10 +203,7 @@ constructor(
importTunnelConfigs(mapOf(conf to null))
}
fun importFromQr(conf: String) = intent {
importFromClipboard(conf)
postSideEffect(GlobalSideEffect.PopBackStack)
}
fun importFromQr(conf: String) = intent { importFromClipboard(conf) }
fun importFromUrl(url: String) = intent {
runCatching {
-38
View File
@@ -1,38 +0,0 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:aapt="http://schemas.android.com/aapt"
android:width="102.6dp"
android:height="79.1dp"
android:viewportWidth="102.6"
android:viewportHeight="79.1">
<path
android:pathData="M45.1,49.1h25.3c9.4,0 17.1,-7.6 17.1,-17.1S79.9,15 70.5,15h-8.1L45.1,0h25.3c17.7,-0.1 32.1,14.2 32.1,31.9c0.1,13.1 -7.9,24.9 -20.1,29.8l20,17.3H79.6L45.1,49.1z">
<aapt:attr name="android:fillColor">
<gradient
android:startX="45.15"
android:startY="39.51"
android:endX="102.48"
android:endY="39.51"
android:type="linear">
<item android:offset="0" android:color="#FF62D0C9"/>
<item android:offset="1" android:color="#FF7DE2AC"/>
</gradient>
</aapt:attr>
</path>
<path
android:pathData="M57.5,30H32.2c-9.4,0 -17.1,7.6 -17.1,17.1s7.6,17.1 17.1,17.1h8.1l17.2,15H32.2C14.5,79.2 0.1,64.9 0,47.3c-0.1,-13.2 7.9,-25 20.1,-29.9L0.1,0H23L57.5,30z"
android:fillColor="#4971FA"/>
<path
android:pathData="M57.5,30H32.2c-9.4,0 -17.1,7.6 -17.1,17.1s7.6,17.1 17.1,17.1h8.1l17.2,15H32.2C14.5,79.2 0.1,64.9 0,47.3c-0.1,-13.2 7.9,-25 20.1,-29.9L0.1,0H23L57.5,30z">
<aapt:attr name="android:fillColor">
<gradient
android:startX="0.18"
android:startY="39.55"
android:endX="57.51"
android:endY="39.55"
android:type="linear">
<item android:offset="0" android:color="#FF3268FB"/>
<item android:offset="1" android:color="#FF4795FA"/>
</gradient>
</aapt:attr>
</path>
</vector>
-977
View File
@@ -1,977 +0,0 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="500dp" android:viewportHeight="1236" android:viewportWidth="1236" android:width="500dp">
<path android:fillColor="#988430" android:pathData="M618,618m-618,0a618,618 0,1 1,1236 0a618,618 0,1 1,-1236 0"/>
<path android:fillColor="#7a6a2a" android:pathData="M618,618m-598.2,0a598.2,598.2 0,1 1,1196.4 0a598.2,598.2 0,1 1,-1196.4 0"/>
<path android:fillColor="#ba9f33" android:pathData="M618,618m-585.6,0a585.6,585.6 0,1 1,1171.2 0a585.6,585.6 0,1 1,-1171.2 0"/>
<group>
<clip-path android:pathData="M618,618m-585.6,0a585.6,585.6 0,1 1,1171.2 0a585.6,585.6 0,1 1,-1171.2 0"/>
<path android:fillColor="#e2cc85" android:pathData="M470.2,860l-19.6,-37.1 11.4,-46.4 81.3,-31.4 -34.6,-71 17.1,-71.7 32.1,-64.2 99.2,-15.6 72.9,-69.5L887.4,465l30.9,168.3 -59.5,211.9 -33.9,109.7 -137.4,5.2 -63.8,-44.2 -74.7,-31.2z"/>
</group>
<group>
<clip-path android:pathData="M618,618m-585.6,0a585.6,585.6 0,1 1,1171.2 0a585.6,585.6 0,1 1,-1171.2 0"/>
<path android:fillColor="#f1d789" android:pathData="M711.2,858.8s-19,8.7 -51.4,6.7c-9.4,-12.6 -75.1,-18.5 -75.1,-18.5s-8.2,-2.5 -22.7,3.5c-14.6,5.9 -28.4,5.2 -41.3,8.4 -12.9,3.2 -25.7,-13.6 -35.6,-17.1 -9.9,-3.7 -23,-12.6 -23,-12.6l-27.7,-2.7 -55.6,-23.5 -88.3,-88 -24,37.6 -7.4,46.5 26.7,55.1 71.9,65.5 140.2,35.6 83.1,-24.5 104.1,-44 26.1,-28z"/>
</group>
<group>
<clip-path android:pathData="M618,618m-585.6,0a585.6,585.6 0,1 1,1171.2 0a585.6,585.6 0,1 1,-1171.2 0"/>
<path android:fillColor="#f4ecb4" android:pathData="M213.1,547.8l17.8,-53.9 21.2,-34.8 68.3,-5.7 -20.5,59.8 -57.1,101.6 23.7,90.7 -42,21 -12.9,-19.8 -10.4,-45.4 -0.7,-51z"/>
</group>
<group>
<clip-path android:pathData="M618,618m-585.6,0a585.6,585.6 0,1 1,1171.2 0a585.6,585.6 0,1 1,-1171.2 0"/>
<path android:fillColor="#f3e19d" android:pathData="M289.7,855.1l-13.1,-18.3s-3.5,-8.7 -1.5,-16.3c2,-7.7 1.7,-8.2 0.7,-11.1s-9.4,-12.9 -8.9,-21.5c0.5,-8.7 -0.7,-11.6 5.7,-18.5 6.7,-6.7 4.7,-18.3 4.7,-18.3l8.7,5.4 2,-3s3.2,2.5 3.2,6.4c0.7,-5.4 -2.2,-30.4 4.4,-36.1 6.7,-5.7 18.3,26.7 18.3,26.7l-7.2,-47 -18.5,-48.2 -32.9,-44 -2,-48.5v-4.2s-15.1,23.2 -19.3,41.5c-3,12.6 4.2,27.9 2.7,46 -1.2,18 -2.7,16.6 1.7,23.7s15.1,21.8 10.9,32.4c-3.7,9.1 -16.3,2.7 -16.3,2.7s-2.5,7.4 -5.9,10.1c-1.2,-4.4 -2.5,-7.2 -4.9,-9.9 -0.2,1.7 -0.7,4 -0.7,4s-2.2,-6.9 -4.4,-15.6c-3,-11.6 -6.2,-26.9 -9.1,-35.1 -1.2,4.7 -4.2,19 -4.2,19l1.7,22 8.2,30.2 7.9,19.8 7.7,24.2 6.7,16.3 5.4,12.4 4.7,27.9 22.7,24 12.1,5.4 8.8,-4.5z"/>
</group>
<group>
<clip-path android:pathData="M618,618m-585.6,0a585.6,585.6 0,1 1,1171.2 0a585.6,585.6 0,1 1,-1171.2 0"/>
<path android:fillColor="#f2e8b0" android:pathData="M225,503.8s-16.3,27.7 -21,55.6c-4.7,27.9 -8.9,57.4 -5.9,95.4 3,38.3 8.7,61.8 13.3,78.6 7.9,27.9 28.4,66.7 28.4,66.7l0.7,-1.5s-5.4,-9.9 -8.2,-20.5c-2.7,-10.6 -3.7,-23.2 -6.2,-28.9 -2.2,-5.7 -5.9,-10.6 -7.7,-17.6 -1.7,-6.7 -2,-17.3 -7.2,-25.2 -2.2,-3.2 -4.9,-11.6 -5.7,-20 -1,-12.6 0.5,-26.7 -0.7,-38.3 -2.2,-19.3 -3.7,-32.4 -1.7,-42.5 2,-10.1 12.4,-38.8 18.8,-61.6 4.2,-14.6 1.7,-26.9 9.4,-39.6 7.7,-12.6 12.4,-23.7 14.1,-31.4 2,-7 -20.4,30.8 -20.4,30.8z"/>
</group>
<group>
<clip-path android:pathData="M618,618m-585.6,0a585.6,585.6 0,1 1,1171.2 0a585.6,585.6 0,1 1,-1171.2 0"/>
<path android:fillColor="#f5eec0" android:pathData="M302.3,492.7s-8.4,2.5 -12.4,6.9c-4,4.2 -5.7,7.7 -11.1,14.8 -5.4,7.2 -5.7,12.9 -10.1,21.8 -4.4,8.7 -14.1,21.8 -15.3,26.5 -1.2,4.7 -3.2,26.7 -5.7,37.1 -2.2,10.4 2.5,23.2 2.5,23.2l5.7,-1.2s0,7.4 5.7,12.4c5.7,4.9 6.7,-16.6 6.7,-16.6l21.3,-71.9 32.1,-21.8 3.5,-17.6 -22.9,-13.6z"/>
</group>
<group>
<clip-path android:pathData="M618,618m-585.6,0a585.6,585.6 0,1 1,1171.2 0a585.6,585.6 0,1 1,-1171.2 0"/>
<path android:fillColor="#e6db9d" android:pathData="M317.9,525.3s-15.1,1 -22.5,6.4c-3,2.2 -4.2,4 -7.4,6.7 -5.9,4.9 -11.9,9.4 -14.8,15.8 -3.2,6.4 -6.7,16.1 -9.1,34.4 -1,7.7 -1,14.8 -1.7,21 -1,8.4 -2.5,15.1 -1.7,19.8 1,9.6 10.9,14.6 11.9,25.5l20.5,-10.4 19.3,-76.1 41,-25.7 -23.2,-26 -12.3,8.6z"/>
</group>
<group>
<clip-path android:pathData="M618,618m-585.6,0a585.6,585.6 0,1 1,1171.2 0a585.6,585.6 0,1 1,-1171.2 0"/>
<path android:fillColor="#e5cb7a" android:pathData="M321.1,1204.6l-91.5,2.2 -48.5,-3.7s3,-35.6 3.7,-44c1.7,-5.2 7.4,-20 9.1,-22.7 1.2,-4 2.7,-14.1 -0.7,-26.5 2.2,-3.5 9.1,-5.4 16.8,-74.4 3,-25.7 3.5,-45.2 5.7,-57.4 3.2,-17.3 5.4,-23.7 4.9,-30.2 -0.7,-10.4 -1.5,-18 -0.5,-26 1.5,-10.6 11.9,-23.2 11.6,-31.9 -0.2,-6.9 -3.7,-11.4 -6.7,-15.6 -3,-4.2 -5.4,-7.7 -5.4,-7.7s20.5,-14.1 20.3,-70.9c0.7,0.2 1.2,0.5 1.2,0.5l10.1,28.7 6.9,8.4 26.5,49.4 34.1,33.1 50.4,33.9 31.6,34.4 3.2,91.7 -41.3,53.6 -41.5,75.1z"/>
</group>
<group>
<clip-path android:pathData="M618,618m-585.6,0a585.6,585.6 0,1 1,1171.2 0a585.6,585.6 0,1 1,-1171.2 0"/>
<path android:fillColor="#d8c173" android:pathData="M335.9,1125.5s0.7,-11.4 10.1,-18.8c1.5,2.5 2.5,4.9 2.2,6.7 1.7,-3 13.6,-22.2 40.5,-27.2 26.9,-4.9 33.4,-24.5 33.4,-24.5l57.1,-51.9 65.3,-60.1 79.4,-27.9 37.1,-9.1s0.7,2.7 -0.7,8.7c6.9,-0.5 22.2,-4 38.1,-9.6 6.4,-2.5 12.4,-3.5 15.6,-0.2 4.7,4.4 5.4,14.8 5.7,21 7.7,-1.7 16.6,-9.1 23.7,-8.4 11.4,1.2 21.5,14.6 33.1,14.6 15.3,0 22.2,-9.4 32.9,-16.8 6.4,-4.4 15.6,-9.9 20.8,-13.6 12.4,-9.1 143.6,-49.2 143.6,-49.2l46,3 7.4,49.4 -4,129.8 -210.6,110 -332,50.9 -135.2,-34.6 -9.5,-42.2z"/>
</group>
<group>
<clip-path android:pathData="M618,618m-585.6,0a585.6,585.6 0,1 1,1171.2 0a585.6,585.6 0,1 1,-1171.2 0"/>
<path android:fillColor="#f1d789" android:pathData="M195.5,1204.9s12.1,-27.4 17.8,-67c4.7,-32.4 0.5,-39.8 1.7,-50.2 1.7,-15.6 19.3,-46 20.8,-51.9 1.2,12.1 4.7,57.8 17.3,68 -2.7,4 -7.2,17.8 8.9,28.4 -2.7,5.7 -8.2,12.6 -4.7,23 3.5,10.4 7.7,25.2 5.7,41.5 -5.7,1.2 -11.9,3.7 -16.8,8.4 -4.9,4.4 -50.7,-0.2 -50.7,-0.2z"/>
</group>
<group>
<clip-path android:pathData="M618,618m-585.6,0a585.6,585.6 0,1 1,1171.2 0a585.6,585.6 0,1 1,-1171.2 0"/>
<path android:fillColor="#e0cd81" android:pathData="M402.9,1185.8l73.7,-20.5 3.2,1s1.7,1 1.7,4.4c4.7,-2.7 8.7,-2.2 11.6,-4 1.5,3.2 3,13.8 9.6,15.1 6.9,1.5 14.3,-3 21.8,-8.7 7.4,-5.9 15.8,-13.3 22.2,-16.3 1.2,2 4.2,8.2 6.2,13.3 8.4,-6.7 23,-33.9 43.8,-33.4 2,-4.7 9.4,-21.8 28.9,-34.9 19.3,-13.1 31.4,-14.1 46.5,-12.9 5.9,-7.7 13.6,-14.6 21.8,-19.5 2.5,1 9.4,5.2 18,1.2 8.7,-4 18.5,-19.5 31.4,-21.5 11.4,-1.7 20,4.2 20,4.2s37.6,-37.3 63.5,-49.7c-1,-3 -3,-14.3 27.4,-39.3 1.7,1.5 0.5,5.7 1.7,5.9 0.5,0 7.9,-3.2 17.3,-10.4 11.6,-8.7 25.5,-17.8 33.9,-20.3 15.8,-4.7 32.6,4.9 32.6,4.9s2,-1.5 4.7,-2.2c4,-0.7 6.9,-1.2 9.1,-2 -0.2,5.2 2.7,14.1 0,21.8 0,0 4.2,2.5 9.9,4.2 -1.7,3.7 -5.4,13.1 -11.6,17.6 5.2,2.5 5.9,5.4 13.3,7.9 -3,4.2 -7.9,11.4 -10.1,15.8 -2.2,4.7 -10.1,24.2 -13.6,31.6 -3.7,7.4 -8.7,21 -11.1,23.7 -2.5,2.7 -11.1,14.3 -17.8,20 5.9,-2.2 30.2,-9.6 40.5,-12.4 -6.2,9.1 -63.5,94.2 -63.5,94.2L774.1,1199l-56.6,9.6 -294.9,-0.2 -26,-12.9 6.3,-9.7z"/>
</group>
<group>
<clip-path android:pathData="M618,618m-585.6,0a585.6,585.6 0,1 1,1171.2 0a585.6,585.6 0,1 1,-1171.2 0"/>
<path android:fillColor="#dfc57c" android:pathData="M320.4,522.6s-8.7,0 -10.4,1.2c-1.7,1.2 8.7,3.7 11.9,4.9 3.2,1.2 10.1,6.7 11.9,11.1 1.7,4.2 62.5,28.7 62.5,28.7l43,-2.2 14.8,-20.5 -28.2,-24.7 19.8,-58.3 -26.2,4.2 -63,37.6 -31.6,12.1 -4.5,5.9z"/>
</group>
<group>
<clip-path android:pathData="M618,618m-585.6,0a585.6,585.6 0,1 1,1171.2 0a585.6,585.6 0,1 1,-1171.2 0"/>
<path android:fillColor="#e5cc7c" android:pathData="M414.8,541.9s1.7,3.2 5.9,3.2c8.9,0 17.1,2.2 20.5,6.7 5.7,7.2 21.5,30.2 21.5,30.2l37.8,13.6 2.5,-44.5 -41.3,-28.7 -47,17.3v2.2z"/>
</group>
<group>
<clip-path android:pathData="M618,618m-585.6,0a585.6,585.6 0,1 1,1171.2 0a585.6,585.6 0,1 1,-1171.2 0"/>
<path android:fillColor="#d2c281" android:pathData="M407.4,558.4s6.9,0.5 15.6,-2.7 23,-10.1 29.2,-7.4c8.7,3.7 6.9,15.3 16.3,25.7 5.7,6.4 16.1,6.2 22,13.1 5.9,6.9 26.2,3.7 26.2,3.7l7.7,41.5 -30.9,39.6 -10.1,49.2h-41.8L403.4,706l-18.8,-45.5 9.4,-46 13.4,-56.1z"/>
</group>
<group>
<clip-path android:pathData="M618,618m-585.6,0a585.6,585.6 0,1 1,1171.2 0a585.6,585.6 0,1 1,-1171.2 0"/>
<path android:fillColor="#e2c270" android:pathData="M488.2,560.4s1.5,0.5 3.2,0.5c-1.2,1 -3.7,3.2 -2.7,8.9s4.2,12.9 1.5,17.3c1.2,1.5 3,3.2 4.7,8.2 1.7,4.9 2.2,9.4 13.3,10.1 -2.5,1.5 -4.4,3.5 -4.4,3.5s7.7,6.7 11.6,12.9c4,-0.2 14.6,-3.5 14.6,-3.5l2.2,1.5 4.7,-2s-4.4,-1.7 -1.2,-12.4c3,-9.4 5.7,-8.9 5.9,-9.6 0.2,-0.7 2.2,-10.6 2.2,-14.6 1.5,-5.2 2.7,-21 2.7,-21l-3.2,-34.9 -18,-10.9 -14.6,-14.1 -13.8,26 -9.1,9.1 -0.7,22.5 1.1,2.5z"/>
</group>
<group>
<clip-path android:pathData="M618,618m-585.6,0a585.6,585.6 0,1 1,1171.2 0a585.6,585.6 0,1 1,-1171.2 0"/>
<path android:fillColor="#ccb360" android:pathData="M531.5,531.2s3.2,9.1 4.4,16.1c0.7,-2.2 0.7,-4.2 0.7,-4.2s2.5,13.8 3,19.5c1,-0.2 2,-0.5 2.2,0.5 0.2,1 2.5,12.1 2,18.3 1.2,-2.2 6.9,-10.9 16.8,-16.8 4,-2.5 8.7,-5.2 13.6,-5.4 7.7,-0.2 13.3,4.9 22.5,4.9 22.2,0 42.3,-16.3 57.1,-21.3 10.9,-3.7 20.3,-6.4 26.9,-12.4 3.2,-2.7 8.9,-8.7 14.1,-17.6 6.9,-11.9 14.1,-22.2 21.3,-23.5 -5.7,1 -9.9,0.7 -9.9,0.7s2.2,-2.2 5.9,-5.2 8.2,-6.7 14.6,-6.7c11.4,0 17.1,1.7 23.5,1.7 6.4,-0.2 10.1,-1.7 10.1,-1.7s6.7,4.7 21.8,4.7c15.1,0.2 25.2,1.5 33.1,2.2 7.9,0.7 34.4,-2.2 42,-2 7.9,0.2 14.3,3.5 14.3,3.5L847,415.3l-88,-76.9 -52.4,37.1 -80.6,80.6 -78,28.9 -16.3,18.3v27.9h-0.2z"/>
</group>
<group>
<clip-path android:pathData="M618,618m-585.6,0a585.6,585.6 0,1 1,1171.2 0a585.6,585.6 0,1 1,-1171.2 0"/>
<path android:fillColor="#d5b457" android:pathData="M706.5,490.4s2.2,-2.2 5.9,-5.2 8.2,-6.7 14.6,-6.7c11.4,0 17.1,1.7 23.5,1.7 6.4,-0.2 10.1,-1.7 10.1,-1.7s6.7,4.7 21.8,4.7c15.1,0.2 25.2,1.5 33.1,2.2 7.9,0.7 34.4,-2.2 42,-2 7.9,0.2 14.3,3.5 14.3,3.5l-11.1,-32.1 -12.9,-24.5L811,390s-44.2,-26 -44.5,-26.2c-0.2,-0.2 -15.3,-4.2 -15.3,-4.2l-40,24.2 -36.3,93.9 -0.7,19.8 23.5,11.1c5.9,-9.9 12.4,-17.8 18.5,-18.8 -5.5,0.6 -9.7,0.6 -9.7,0.6z"/>
</group>
<group>
<clip-path android:pathData="M618,618m-585.6,0a585.6,585.6 0,1 1,1171.2 0a585.6,585.6 0,1 1,-1171.2 0"/>
<path android:fillColor="#d2b257" android:pathData="M706,497.1c-3.5,0.2 -6.4,-0.5 -7.2,-3 -3,-8.4 -5.4,-9.6 -7.9,-9.6s-5.9,5.4 -7.9,5.9 -4.4,-6.2 -4.4,-6.2l-2.2,-1s-12.9,8.4 -22,18.3 -24,26.7 -30.7,29.7c-6.7,3 -29.7,4 -37.6,5.7 -7.9,1.7 -16.6,7.4 -17.8,8.7s3.5,2.7 4.2,4c0.7,1.2 -7.7,0.7 -8.4,2 -0.5,1 2,6.7 3.2,9.6 2.2,-1 4.4,-1.7 6.9,-1.7 7.7,-0.2 13.3,4.9 22.5,4.9 22.2,0 42.3,-16.3 57.1,-21.3 10.9,-3.7 20.3,-6.4 26.9,-12.4 3.2,-2.7 8.9,-8.7 14.1,-17.6 3.8,-6.1 7.5,-11.8 11.2,-16z"/>
</group>
<group>
<clip-path android:pathData="M618,618m-585.6,0a585.6,585.6 0,1 1,1171.2 0a585.6,585.6 0,1 1,-1171.2 0"/>
<path android:fillColor="#d2b159" android:pathData="M387.6,992s-2,-7.4 -20.3,-26.5c-5.2,-5.4 -8.4,-9.9 -11.9,-13.1 -8.7,-8.2 -13.8,-10.4 -20,-15.1 -13.6,-10.1 -28.4,-10.1 -39.8,-22.5 -11.4,-12.4 -24.7,-36.1 -33.9,-60.3 -9.1,-24.2 -11.6,-31.9 -11.6,-32.6s2.5,-5.4 5.7,-4.7c3.2,0.7 3.2,6.9 4,8.4 0.2,0.5 2.5,3.7 5.4,6.9 4.7,5.4 11.4,11.9 14.8,21.5 -0.7,-8.2 -3.5,-17.3 -3.5,-17.3s17.6,11.1 32.6,22.7c15.1,11.6 21.3,15.6 25.7,23 4.4,7.4 14.8,26.9 19.8,32.6s73.2,27.2 73.2,27.2l32.4,24.2 16.1,35.3 -12.6,19.8 -24.2,5.2 -39.3,-17.6 -12.6,-17.1z"/>
</group>
<group>
<clip-path android:pathData="M618,618m-585.6,0a585.6,585.6 0,1 1,1171.2 0a585.6,585.6 0,1 1,-1171.2 0"/>
<path android:fillColor="#c2a44d" android:pathData="M300.3,870.4s8.2,13.1 28.2,25.5c18,10.9 46.5,20.8 71.9,26.7 14.6,3.5 29.2,6.2 42.3,6.4 35.3,0.5 59.6,-9.6 89.7,-12.9 16.3,-1.7 36.3,-3 57.1,-7.9 26.7,-6.4 42.5,-13.6 64,-23.7 15.6,-7.2 29.9,-12.6 41.5,-19.5 16.3,-9.6 28.2,-20.3 42,-23.5 -1.7,4.7 -3.5,13.1 -17.1,21.8 7.2,-0.2 17.1,-0.7 17.1,-0.7s-9.6,5.7 -26.5,18.5c-10.4,7.9 -24.2,21.3 -38.3,30.2 -9.1,5.7 -19,9.9 -25.5,13.3 -15.8,8.7 -22.2,13.1 -32.6,23.7 3.7,-0.2 4,0 4,0S605,950 595.6,955c-2,0 -5.4,-0.7 -11.4,1 -4.7,1.5 -10.9,4.9 -17.3,6.7 -9.1,2.7 -12.1,1.5 -12.1,1.5l1.5,3s-11.9,-0.2 -15.8,0.2c0.7,0.2 0.5,0.5 0.5,0.5s-0.5,0 -2,0.7c-1.2,0.7 -3.2,2 -6.2,2.7 -1.2,0.2 -2.2,0.2 -3.7,0.5 0.5,1.2 4.4,7.9 6.2,11.9 -1.5,1 -24,18 -24,18s1,1.5 1.7,3.5c0.7,2.2 1,5.4 1.7,6.9 1.7,3 2.7,3.5 2.7,3.5s-2.7,0.5 -7.4,1.7c-4,1 -8.9,2.7 -15.8,3.7 -2,0.2 -4.2,0.5 -6.4,0.5 1,2.2 5.4,10.6 -2.7,20.3 -8.2,9.6 -10.6,11.1 -13.1,17.3 -0.7,-0.5 -2,-1.5 -4,-2.5 -2.7,-1.2 -6.4,-3 -7.7,-5.4 -0.2,1 -1.2,4.9 -3,9.4 -2.5,6.7 -6.2,13.3 -6.9,18.3 -2.7,-3 -7.7,-8.9 -14.6,-7.7 -6.9,1.2 -12.4,10.6 -13.6,13.3 0,-1.7 -1.2,-3 -1.5,-1 -0.2,2.2 -4,25.2 -25.2,43.8 -0.2,-4.7 -0.2,-15.1 -0.7,-18.5 -2,2 -4.4,4.9 -18.8,11.1 -14.1,6.2 -11.9,12.4 -11.9,12.4s-1.2,-9.9 6.4,-20.3c7.7,-10.4 12.4,-15.3 12.4,-16.1 0,-0.2 -0.2,-1.2 -1,-2.2 -1,-1 -3,-2.2 -3,-3 1.2,-0.5 13.1,-6.2 12.4,-18 -0.7,-10.6 -5.2,-16.1 -8.4,-20 -0.5,-0.5 4.7,-4.2 4,-5.4 -0.5,-0.7 -6.9,-5.4 -7.7,-7.9 0.2,-1.2 0.5,-3.2 1,-4.4 0.7,-2.2 1.2,-3.7 1,-5.2 -0.5,-2.5 -3.2,-9.4 -4,-10.1 0.7,0.2 5.7,0 5.7,0s-4,-6.4 -4.7,-9.4c-0.7,-3 -2.2,-10.9 -3,-12.4 1.7,0.2 5.9,0.5 5.9,0 0.2,-1.5 -3.7,-4 -2,-5.9 1.2,0.2 3.5,1.2 5.7,4 -1.2,-3.2 -3.2,-9.4 -7.4,-11.9 2,-0.7 8.7,-2.5 14.6,1s7.9,8.4 7.9,8.4 3.5,2.7 8.9,6.7c6.2,4.9 14.1,11.9 26.7,16.8 2.7,1.5 9.6,1.5 14.6,0.5 3,-0.7 4.7,-1.7 6.2,-2.5 1.2,-0.7 2.2,-1 2.2,-1s-2,-4 -3.7,-6.2c1.7,0 3.7,0.2 3.7,0.2s1.2,-2.7 -4.2,-7.9c1.2,-1.2 2.7,-2 2.7,-4 -1.7,-0.2 -4.7,-2.7 -5.4,-3.7 1,-0.7 2.5,-3 4.2,-3.7 -1.5,-1.2 -5.2,-6.2 -6.9,-6.7 1.7,-0.5 4.7,-2.2 4.7,-2.2s-8.4,-2.2 -11.1,-4c-2.7,-2 -6.7,-5.4 -9.1,-6.4 -2.5,-1 -6.9,-1.5 -8.7,-3.5 1.7,0.5 4.4,0 6.4,0 1.5,0 2.2,0.2 2.7,0.2 -0.2,-0.7 -0.2,-2.2 3.7,-2.7 3.7,-0.7 5.4,-1.7 5.4,-1.7s-3.7,-0.2 -7.9,-4.2 -7.7,-7.2 -10.1,-7.7c-2.5,-0.5 -7.2,1.7 -10.1,1.5 -4,-0.5 -5.7,-2.5 -5.7,-2.5s-13.3,1.2 -42.8,-16.8c-25.5,-15.6 -36.6,-29.4 -36.6,-29.4s-3,-1 -6.9,-3.2c-9.6,-5 -22.9,-15.4 -22.5,-29z"/>
</group>
<group>
<clip-path android:pathData="M618,618m-585.6,0a585.6,585.6 0,1 1,1171.2 0a585.6,585.6 0,1 1,-1171.2 0"/>
<path android:fillColor="#caa13e" android:pathData="M668.2,270.2s3.5,1 5.9,4c4.7,5.4 7.7,15.6 -3,26.5 4.2,1.5 5.9,2 9.6,1.5 -3.7,4.4 -12.1,13.8 -12.6,22 -0.5,6.7 3.7,8.7 3.7,8.7s-6.4,7.4 -6.7,19.8c1.5,-1.7 4.9,-5.4 9.9,-9.4 7.4,-5.9 17.6,-12.6 24.5,-16.8 -0.2,2.7 0.7,5.2 0.7,5.2s12.9,-10.6 23.7,-5.9c4.9,2.2 2.7,9.1 2.7,9.1s6.7,-2.5 11.4,2.2 11.4,16.8 14.8,21.5c1.5,2.2 5.4,6.4 9.4,12.9 4.7,7.7 9.9,18.3 13.6,28.7 0.2,-5.2 1.5,-13.3 16.3,-8.2 14.8,5.2 31.6,16.1 45.7,37.6 14.1,21.5 17.6,45.7 24.7,54.9 7.2,8.9 14.6,23.7 15.1,29.9s-2.2,26.2 12.6,80.3c4.2,-16.8 10.6,-54.1 10.6,-54.1l3.5,-32.9 4,-101.8L802,317.6l-83.1,-60.3 -54.1,5.2 3.4,7.7z"/>
</group>
<group>
<clip-path android:pathData="M618,618m-585.6,0a585.6,585.6 0,1 1,1171.2 0a585.6,585.6 0,1 1,-1171.2 0"/>
<path android:fillColor="#b59544" android:pathData="M865.7,421.7s-1.5,-9.9 -26.5,-26.7c-25,-16.6 -44.5,-16.6 -62.5,-30.7 -13.8,-11.1 -28.2,-36.6 -37.6,-45 -9.1,-8.3 -10.6,-32.3 -10.6,-32.3l30.7,-25.7 45.7,-66 38.6,-42.5 18.5,25.7 25.7,30.2 14.3,60.6 5.2,88.7 -41.5,63.7z"/>
</group>
<group>
<clip-path android:pathData="M618,618m-585.6,0a585.6,585.6 0,1 1,1171.2 0a585.6,585.6 0,1 1,-1171.2 0"/>
<path android:fillColor="#c89d3a" android:pathData="M896.6,528s1.7,-19.3 -4.9,-39.8 -21,-56.9 -27.7,-70.5c-2.7,-15.1 -0.7,-16.3 2.2,-18 3,-1.7 13.8,-7.9 19.8,-29.7 5.9,-21.8 24.5,-22.5 24.5,-22.5l11.4,-8.4 17.3,43.3 15.1,39.1 4.7,29.9 3.5,25.5 -8.2,53.9 -40.5,36.6 -17.2,-39.4z"/>
</group>
<group>
<clip-path android:pathData="M618,618m-585.6,0a585.6,585.6 0,1 1,1171.2 0a585.6,585.6 0,1 1,-1171.2 0"/>
<path android:fillColor="#ceb052" android:pathData="M321.1,1204.6s-9.1,-16.8 -9.6,-24c-0.2,-6.9 2.5,-11.4 2.5,-11.4s-3.5,-5.2 -6.7,-6.4c0.7,-3.5 2,-7.7 4.7,-10.6 2.7,-3.2 7.9,-7.4 8.9,-8.9s1.5,-3.5 4.4,-4c3,-0.5 6.2,-0.5 6.2,-4.4v-7.2s1.2,-0.7 2.2,-2c0.7,-1 1.2,-2.2 1.7,-2.5 1,-0.5 5.7,-2 8.2,-1.5 2.5,0.5 9.1,3.2 12.6,3 7.2,-0.2 15.6,-5.7 28.9,-3.2 20,3.7 24.7,17.3 36.3,25 7.9,5.4 16.1,3 17.3,3h2.7c0.5,0 4.2,-4.2 6.2,-4 4,0.2 4.4,3.5 6.9,3.7 5.9,0.7 17.3,-3 23,-1.5 2.7,0.7 6.2,3.5 7.2,7.2 1.2,3.7 0.2,8.4 -2.7,11.1 -6.2,5.7 -12.1,11.1 -13.3,15.8 1.7,1.2 4.7,4 4.7,4s-2.7,2.5 -7.7,4.9c-2.2,1 -5.7,2.7 -9.6,3.2 -7.4,0.7 -16.6,1.7 -22,9.6s-24,3.5 -24,3.5l-89,-2.4z"/>
</group>
<group>
<clip-path android:pathData="M618,618m-585.6,0a585.6,585.6 0,1 1,1171.2 0a585.6,585.6 0,1 1,-1171.2 0"/>
<path android:fillColor="#cca847" android:pathData="M864,929s15.6,-20.8 21,-31.1c5.4,-10.6 -17.1,-145.1 -17.1,-145.1l45.2,-148.1 -1.2,-48.2s2.2,-44.5 7.4,-63.8c6.2,11.1 25.5,24.5 29.7,31.6 2,-13.6 8.7,-42.3 7.7,-72.9 3.7,5.7 12.6,63 12.6,63l8.9,38.6 11.6,41 12.9,43.3 7.7,29.9 4.4,7.2 3.7,12.6 3.5,13.6 10.1,31.9 5.9,26.2 4.7,47.5s1.7,5.9 2.2,11.1c0.2,5.2 -0.7,8.2 -0.7,9.1 0,1 1.7,11.4 1,19.3 -1,7.9 -1,14.1 -7.2,19.8 -6.2,5.7 -10.1,39.6 -10.1,39.6l-11.1,-7.4s2.2,-10.1 -3,-19.3c-5.2,-9.1 -15.3,-11.1 -21,-9.6 -5.7,1.2 -17.1,3 -20.8,6.2 -3.5,3.2 -12.1,13.1 -20,17.6 -9.9,5.9 -26,6.4 -34.6,8.4 -8.7,2 -18.3,7.9 -28.4,14.8 -10.5,6.8 -21.1,11.7 -25,13.2z"/>
</group>
<group>
<clip-path android:pathData="M618,618m-585.6,0a585.6,585.6 0,1 1,1171.2 0a585.6,585.6 0,1 1,-1171.2 0"/>
<path android:fillColor="#c39d3c" android:pathData="M864,1147.5s8.7,5.7 24.7,9.6 56.9,27.4 56.9,27.4l34.4,21 42.5,3.2 37.3,-5.2s1.2,-15.8 -1.2,-74.7c-2.5,-59.1 -4.4,-67.5 -4.4,-71.9 0,-4.4 -1.5,-79.4 -3.2,-95.7 -1.7,-16.3 -0.5,-32.9 -1,-42.5s-5.9,-48.7 -8.4,-58.8c-2.7,-10.1 -7.9,-15.1 -8.7,-15.1 -0.7,0.2 -4.9,19 -4.9,23.7s-1,16.1 -1,19c-0.7,-0.2 -1,-2 -1,-2.7 -1,2.5 -2.2,6.9 -2.7,7.4s0.7,-4.2 0,-5.2 -2,-0.5 -1.7,-3c0.2,-2.5 0.7,-4.4 0.7,-4.4s-3,4.4 -5.2,15.6c-2.2,11.1 -2.2,11.4 -3,12.4 -0.7,1.2 -4.7,5.2 -4.9,6.7 -0.2,2.7 3.7,5.4 4,6.9 0.2,2.5 -3.5,14.1 -4.7,19.8 -1.2,5.7 -0.7,16.8 -2,22.5 -1,5.2 -2,8.2 -5.4,10.4 2.5,0.5 4.9,1.2 4.9,1.2s3.5,14.8 -5.4,27.4c-3.2,4.4 -4,6.4 -7.4,10.4 -6.7,7.4 -11.9,15.8 -12.4,21.3 -0.5,-2 -0.7,-4.9 -0.7,-4.9s-10.4,12.1 -14.8,19c-5.7,8.9 -13.6,8.4 -15.8,10.6 -2.2,2.2 -2.7,6.2 -2,9.4 -2,0.5 -5.7,1.2 -8.2,8.9 -1.2,4 -4.2,7.9 -8.9,10.6 -4.7,2.7 -10.4,3.5 -13.3,4.2 2.5,0.7 3.5,0.7 4.7,1.5 -1.5,2.5 -8.4,6.4 -16.1,11.4 -7.7,4.7 -11.4,11.6 -13.3,16.1 -2,4.2 -4.9,6.9 -9.6,7.4 2,1.2 4.9,4 6.4,4.9 -2.2,0.5 -5.9,0.5 -12.6,6.2 -7,5.8 -9.4,7.5 -12.6,8z"/>
</group>
<group>
<clip-path android:pathData="M618,618m-585.6,0a585.6,585.6 0,1 1,1171.2 0a585.6,585.6 0,1 1,-1171.2 0"/>
<path android:fillColor="#d2ba6b" android:pathData="M715.4,1202.9s6.2,-9.6 21.8,-15.6c15.6,-6.2 32.1,-7.4 38.6,-9.4 6.2,-2 11.1,-4.7 18.8,-6.2 -0.7,5.9 -1,10.6 -2.7,14.6 5.7,1 20,-10.1 27.7,-12.6 7.7,-2.5 25.2,-6.2 26.7,-7.4 1.5,-1.2 4.7,-8.4 5.7,-8.7 1,-0.2 3.7,1.5 5.4,1.5 3.2,0 25.7,-20.8 43.5,-20.5 17.6,0.2 37.6,14.8 34.6,27.9 4.7,-2.7 9.6,-5.2 13.6,-4.2 -0.5,1.7 -0.7,3.7 -0.7,3.7s9.6,-2.2 12.1,1c2.7,3.2 1.2,6.2 7.7,13.8 5.2,6.4 3.7,7.9 2.7,10.1 2.5,0.7 14.8,4.9 26.2,15.6 11.4,10.6 -91,4 -91,4l-188.9,-1.7 -1.8,-5.9z"/>
</group>
<group>
<clip-path android:pathData="M618,618m-585.6,0a585.6,585.6 0,1 1,1171.2 0a585.6,585.6 0,1 1,-1171.2 0"/>
<path android:fillColor="#c0993a" android:pathData="M1012.5,783.6s-3.2,17.3 -8.9,28.2c-5.7,10.9 -11.9,26 -11.9,26s0,-5.4 1.2,-10.1c-7.2,4.2 -24.7,14.3 -29.7,18.8 -4.7,4.2 -12.6,11.6 -14.6,15.1 4.7,-13.8 9.6,-26.2 10.4,-31.9 -7.2,5.2 -40.8,32.9 -58.3,51.2L846.2,925s-8.4,4.7 -19.3,9.1c-9.4,4 -20.5,7.4 -28.7,10.6 2.2,-5.9 5.7,-11.1 10.6,-16.1 5.2,-4.9 20.8,-21.8 23.2,-29.7 2.2,-8.2 2.7,-13.1 -0.2,-20 -2.7,0.7 -8.9,1 -13.1,2.2 -4.2,1.2 -8.7,5.7 -8.7,5.7s3.2,-18.3 10.1,-35.6c-5.2,0.2 -14.1,1.7 -14.1,1.7s12.4,-20.8 33.6,-35.3c-3.5,0.7 -11.4,2.7 -19,5.9 -12.4,5.2 -26,12.9 -36.1,17.1 5.7,-7.9 45.7,-65 69.5,-118.2 23.7,-53.1 32.6,-66.7 37.8,-95.2 2.7,-14.1 2,-34.9 2.7,-53.6 0.7,-18.5 3,-35.1 1.5,-46.2 6.2,7.7 29.4,29.4 30.2,77.9 0.7,48.5 -22.2,114 -46.5,149.3 5.9,1.7 21.3,3.7 37.1,-23.7s15.6,-35.1 21.3,-46.5c0.7,5.7 0.5,7.7 0.5,7.7s23,-27.9 33.9,-63c2.2,15.1 8.7,28.4 -1.5,56.1 -9.1,25 -21,31.1 -21,31.1s5.9,-1 14.6,-6.2c1.5,3.7 1.2,7.9 3.7,9.4s5.9,4 6.4,6.4c2.7,-4 6.9,-9.1 8.2,-12.9 -1,7.9 -1.7,42.5 2,60.1 7.7,-0.7 15.6,-1.2 21,-15.1 -3.7,13.6 -3.7,21.8 -1.2,33.4 4.1,-2.8 7.8,-7.8 7.8,-7.8z"/>
</group>
<group>
<clip-path android:pathData="M618,618m-585.6,0a585.6,585.6 0,1 1,1171.2 0a585.6,585.6 0,1 1,-1171.2 0"/>
<path android:fillColor="#a88f33" android:pathData="M752.7,232.4s-7.7,3.2 -20.8,3.2c-11.4,0 -8.2,-4.4 -26,-4.4 -27.4,0 -123.1,15.8 -139.9,15.6 -10.9,-0.2 36.8,4.7 36.8,4.7l121.9,1.7 24.5,-2 9.1,-18.5 -5.6,-0.3z"/>
</group>
<group>
<clip-path android:pathData="M618,618m-585.6,0a585.6,585.6 0,1 1,1171.2 0a585.6,585.6 0,1 1,-1171.2 0"/>
<path android:fillColor="#e3c571" android:pathData="M436.6,470.7s-15.6,11.9 -22.2,21c-6.7,9.1 -10.1,15.1 -17.6,22.5 2.5,0.2 5.2,-0.7 5.2,-0.7s0,2 -1.2,2.5c2.5,-0.2 4.4,0.7 5.7,2 -2.2,1.2 -8.2,7.2 -3.5,14.3 3.5,5.4 10.9,5.9 10.9,5.9s-1.7,4.9 5.4,4.4c15.3,-0.7 32.4,-7.4 40.3,-5.7 7.9,2 12.4,2.7 18,12.4 5.9,9.6 11.1,11.1 11.1,11.1s3.5,-8.9 2.7,-22.2c4.7,-11.4 4.7,-22.5 4.7,-22.5l-5.2,-38.3 -22.7,-28.7 -29.4,16.3 -2.2,5.7z"/>
</group>
<group>
<clip-path android:pathData="M618,618m-585.6,0a585.6,585.6 0,1 1,1171.2 0a585.6,585.6 0,1 1,-1171.2 0"/>
<path android:fillColor="#d8b65b" android:pathData="M464.5,465s2.2,5.2 11.4,5.7c-1,2.2 -1,2.5 -0.7,4.2 0.2,1.7 0.5,4.2 0.5,4.2s1.2,-0.5 2.7,-2c0.5,2.2 -0.5,5.7 0,8.2 0.5,2.5 1.5,4.4 1.5,4.4s0.2,-0.5 0.5,-1c0.2,-0.5 2,5.4 6.9,9.9 0,-1.2 0.5,-2 0.5,-2s0,1.7 1.2,3.5c-0.5,-0.2 -1,-0.7 -1,-0.7s0.5,15.8 3.2,24c0.7,-1 1,-1.2 1.2,-1.7 0,-0.5 -0.2,4.4 -0.7,7.9 -0.7,3.5 -0.2,8.4 -0.2,8.4s2.7,-2.2 5.9,-3.5c3,-1.2 7.9,-4.9 10.9,-13.1s4,-14.3 4,-14.3 1.7,3.2 2,5.9c0.2,2.5 4.9,1.2 4.9,1.2l1,-10.9 5.9,-24.7 5.4,-15.3 26,-40.5 47,-36.1 41,9.4 34.6,-47 -59.6,-35.8 -56.4,5.9 -51.2,70.9 -41,64.3 -7.4,10.6z"/>
</group>
<group>
<clip-path android:pathData="M618,618m-585.6,0a585.6,585.6 0,1 1,1171.2 0a585.6,585.6 0,1 1,-1171.2 0"/>
<path android:fillColor="#d3ae4d" android:pathData="M759.9,362.4s-3.5,0.7 -13.6,5.9 -17.1,6.9 -21,14.6c-4,7.7 -4.2,13.8 -4.2,13.8s6.9,-3 10.9,-4c4.2,-1 8.9,-0.7 8.4,1 -0.5,1.5 -2,3.2 -2,3.2s7.9,-0.2 7.7,3.7c-0.2,4 -1.5,8.2 -3,10.1 -1.5,2 -7.7,4.9 -8.4,7.2 -1.7,4.7 0.7,4.9 -0.2,8.7 -0.7,3.7 -4,10.9 -14.8,23.5 -11.1,12.6 -15.8,21.5 -15.8,21.5s-5.4,-10.1 -8.2,-18.8c-2,1 -12.6,6.9 -12.6,6.9L658.5,374l0.5,-5.7s2.2,-2.7 2.7,-7.7c-3.7,-1.2 -4.2,-2.2 -9.1,-6.9 -4.9,-4.7 -8.9,-10.4 -17.1,-14.3 -1.2,-2.2 -2.7,-5.2 -8.7,-6.4 -5.9,-1.2 -9.6,-2.2 -9.6,-2.2s3.2,-1.2 4.7,-3.7c-3.7,0.5 -6.7,1.7 -14.8,1.5 -8.2,-0.2 -9.1,-0.5 -13.6,0.2s-9.9,2.7 -11.9,-4.2c-2.2,-1.7 -6.9,-0.2 -10.9,5.7s-5.4,10.6 -13.1,12.9c-0.2,1.5 -1,5.4 -3.5,9.6 -2.2,3.7 -5.7,7.4 -10.4,12.9 -7.4,8.7 -6.2,23 -18,33.9 -11.9,10.9 2,-30.2 2,-30.2l19,-45.5 54.1,-52.9 84,-5.7 8.2,43.5 41,14.1 25.9,39.5z"/>
</group>
<group>
<clip-path android:pathData="M618,618m-585.6,0a585.6,585.6 0,1 1,1171.2 0a585.6,585.6 0,1 1,-1171.2 0"/>
<path android:fillColor="#caa13e" android:pathData="M773.2,372l-35.3,-50.9 -24.7,-19s-17.6,-32.4 -18.8,-33.4c-1,-0.7 -17.6,-2.5 -28.2,-3.2l2,4.9s3.5,1 5.9,4c4.7,5.4 7.7,15.6 -3,26.5 4.2,1.5 5.9,2 9.6,1.5 -3.7,4.4 -12.1,13.8 -12.6,22 -0.5,6.7 3.7,8.7 3.7,8.7s-6.4,7.4 -6.7,19.8c1.5,-1.7 4.9,-5.4 9.9,-9.4 7.4,-5.9 17.6,-12.6 24.5,-16.8 -0.2,2.7 0.7,5.2 0.7,5.2s12.9,-10.6 23.7,-5.9c4.9,2.2 2.7,9.1 2.7,9.1s6.7,-2.5 11.4,2.2 11.4,16.8 14.8,21.5c1.5,2.2 5.4,6.4 9.4,12.9 4.7,7.7 9.9,18.3 13.6,28.7 0.2,-4 1,-9.6 7.9,-9.6L773.2,372z"/>
</group>
<group>
<clip-path android:pathData="M618,618m-585.6,0a585.6,585.6 0,1 1,1171.2 0a585.6,585.6 0,1 1,-1171.2 0"/>
<path android:fillColor="#f4efc8" android:pathData="M244,516.6s-2.5,-6.2 0,-18.3c2.5,-12.1 6.4,-17.8 7.7,-35.6 1.2,-17.8 12.9,-40 12.9,-40l32.1,-14.6 22.7,6.2 6.7,30.4 -28.7,15.8s-1.5,6.7 -9.6,12.1c-8.2,5.4 -19.3,9.6 -22,15.1 -2.7,5.7 -3.5,10.6 -3.5,10.6s-8.2,-1.7 -13.1,3.7c-5.2,5.5 -5,10.4 -5.2,14.6z"/>
</group>
<group>
<clip-path android:pathData="M618,618m-585.6,0a585.6,585.6 0,1 1,1171.2 0a585.6,585.6 0,1 1,-1171.2 0"/>
<path android:fillColor="#ebcc73" android:pathData="M308.8,508.5s-2.7,1.7 -4.7,5.9c-2,-3.2 -6.7,-22.2 -6.9,-39.3 -0.2,-17.1 -1.2,-21.3 2.7,-27.2 4,-5.9 19.5,-12.1 17.3,-22.7 -2.2,-10.1 -11.4,-14.3 -22.7,-11.4 -7.9,2 -13.8,18.8 -22,27.2 -6.2,6.4 -13.6,5.4 -15.6,8.9 -2.7,4.7 -0.2,9.4 -1,12.4 -0.2,1 -2.7,6.4 -7.2,12.9 -9.1,13.1 -24.5,31.6 -26.5,48.2 0.7,-9.4 0.2,-9.6 2.7,-20l-1.5,-2.5 9.9,-32.4 6.4,-26.7 14.3,-44.7 25.2,-45.7 24.5,-27.4 25.5,1.7 3,38.3 14.6,71.9 30.7,37.8 -49.2,33.1 -19.5,1.7z"/>
</group>
<group>
<clip-path android:pathData="M618,618m-585.6,0a585.6,585.6 0,1 1,1171.2 0a585.6,585.6 0,1 1,-1171.2 0"/>
<path android:fillColor="#e5c66b" android:pathData="M324.1,522.1s-4.2,1 -5.7,0.2c-1.5,-0.7 -3,-1.7 -2.5,-2.7 0.5,-1 3.2,-2.7 3.2,-3.5 0,-0.7 -0.2,-2.7 -2.5,-3s-3,1.2 -3,1.2 -2.2,-1.7 -4,-2c1.5,-0.2 3.2,-0.2 3.2,-0.2s-4.2,-2 -8.7,-2.5c2.5,-1.5 7.4,-5.9 10.6,-5.9s5.2,-0.5 4.7,-2.2c-0.5,-1.7 -3,-4.2 -5.7,-5.2 1,-1.2 1.7,-3 -0.7,-7.9 -2.5,-4.9 -1.5,-8.2 -0.7,-9.4 0.7,-1.5 3.2,-4.2 4.4,-5.9 1.2,-1.7 2.2,-4 4.2,-5.2 1,-0.7 4.2,-2 7.4,-3.2 3.5,-1.2 6.4,-2.7 8.4,-1.2 2.2,1.5 1.2,3.5 1.2,3.5s6.9,-2.5 13.1,0.7c6.2,3 21.3,4.9 21.3,4.9l5.4,10.9 -35.8,30.7 -14.8,7.4 -3,0.5z"/>
</group>
<group>
<clip-path android:pathData="M618,618m-585.6,0a585.6,585.6 0,1 1,1171.2 0a585.6,585.6 0,1 1,-1171.2 0"/>
<path android:fillColor="#e6bd62" android:pathData="M373.8,471.9s-11.1,7.4 -13.6,10.1c1.5,0.2 4,1.2 3,2.7 -1.2,1.5 -8.4,6.7 -12.4,11.6 -4.2,4.9 -8.2,11.1 -9.6,14.1 -1.5,2.7 -12.9,10.6 -16.8,11.6 8.2,0 24.7,-10.1 30.9,-10.1 -0.2,3 1.7,6.4 5.2,6.7 3.5,0.2 13.6,2.2 27.2,-6.2 13.6,-8.2 9.1,-14.3 14.8,-18.3 10.9,-7.2 15.3,-13.6 21.3,-17.6 5.9,-4 9.1,-4.9 9.1,-4.9s0.2,-3 2,-2.7c1.7,0.2 2.2,1.7 2.2,1.7s10.4,-7.4 23.7,-9.4c-0.5,-0.2 -0.7,-0.7 -0.7,-0.7s1,-0.5 1.2,-1c0,0 0.7,-1 1.2,-0.5s1.2,4.2 2.2,5.7c2.2,-1 6.4,-10.4 6.4,-10.4l10.1,-28.9V399l-7.9,1.5 -59.3,25.2 -36,37.3 -4.2,8.9z"/>
</group>
<group>
<clip-path android:pathData="M618,618m-585.6,0a585.6,585.6 0,1 1,1171.2 0a585.6,585.6 0,1 1,-1171.2 0"/>
<path android:fillColor="#b6933f" android:pathData="M544.6,342.4s5.2,-1.2 9.1,-3.7c-1.2,3.2 -1.2,6.7 -6.4,14.3 -5.2,7.7 -5.4,8.7 -9.6,16.6 -4.2,8.2 -4.7,20 -8.7,25.2 3.2,-1.5 5.7,-1.7 5.7,-1.7s-4,3.5 -5.7,7.2c-1.7,3.7 -4.7,11.4 -12.1,16.1 -7.4,4.7 -16.8,7.7 -26.9,18.8 -10.1,10.9 -20.5,24.7 -25.7,29.7 2.7,-4.7 6.4,-14.1 7.4,-20.3 1,-6.2 -0.2,-13.6 1.5,-21.8 1.7,-8.2 1.7,-14.1 9.9,-28.4 8.2,-14.3 22.2,-64 22.2,-64l30.2,-9.6 9.1,21.6z"/>
</group>
<group>
<clip-path android:pathData="M618,618m-585.6,0a585.6,585.6 0,1 1,1171.2 0a585.6,585.6 0,1 1,-1171.2 0"/>
<path android:fillColor="#c49937" android:pathData="M522.8,324.1s-9.1,13.1 -11.6,24.7 -0.2,10.6 -1.7,16.3c-1.5,5.7 0,10.6 0,10.6s4,-7.2 12.6,-12.4 15.6,-8.9 19.8,-13.3c4.2,-4.7 7.7,-12.4 16.8,-18.3 -3.7,-0.5 -8.9,-2.2 -9.9,-2 3.7,-4.2 14.8,-10.6 26,-18.3 11.1,-7.9 10.4,-11.1 28.4,-19 -5.9,1 -8.7,-0.5 -13.6,0 2,-4.2 8.9,-6.2 15.8,-13.1 6.9,-6.9 -4.4,-17.1 -4.4,-17.1l-52.7,31.9 -25.5,30z"/>
</group>
<group>
<clip-path android:pathData="M618,618m-585.6,0a585.6,585.6 0,1 1,1171.2 0a585.6,585.6 0,1 1,-1171.2 0"/>
<path android:fillColor="#dfc068" android:pathData="M379.7,300.3l1.2,-9.6 15.1,-24.2 15.8,-42.5v-58.1l-1.2,-33.6 2.5,-22 1.9,-7 2,-2.7 12.9,6.7 17.8,24.2 1.7,46.7 -17.3,73.7 -49.4,53.9z"/>
</group>
<group>
<clip-path android:pathData="M618,618m-585.6,0a585.6,585.6 0,1 1,1171.2 0a585.6,585.6 0,1 1,-1171.2 0"/>
<path android:fillColor="#a88f33" android:pathData="M419,97.9s-7.9,0.2 -9.6,33.1c-1.7,32.9 -2.5,50.2 -3.7,66.5s-4,26.2 -5.4,35.8c-1.5,9.6 -2.2,22.7 -6.7,30.7 -2,3.7 -6.2,15.3 -16.1,24 -11.1,9.6 -27.7,16.3 -30.2,16.8 -4.4,1 -26.7,3.2 -35.8,8.2 -3.2,1.7 -8.7,3.7 -14.8,9.4 -12.1,10.9 -28.2,30.4 -39.8,53.9 -17.8,35.1 -35.6,134.2 -35.6,134.2l4,-6.7s0.5,-8.9 9.4,-24.5c8.7,-15.6 6.2,-33.1 18.3,-63 4.7,-11.4 10.6,-26.2 17.8,-38.8 11.4,-20.5 25.2,-38.1 39.1,-47.7 22.7,-15.6 47.7,-19 47.7,-19l26.9,-17.8s4.7,-9.1 10.9,-19.5c8.7,-14.6 19.8,-30.9 22.2,-54.6 3.7,-35.1 -5.2,-58.1 -4.7,-78.9 0.5,-20.8 0.7,-36.1 4.9,-39.8s1.2,-2.3 1.2,-2.3z"/>
</group>
<group>
<clip-path android:pathData="M618,618m-585.6,0a585.6,585.6 0,1 1,1171.2 0a585.6,585.6 0,1 1,-1171.2 0"/>
<path android:fillColor="#c99e3d" android:pathData="M419,254.9s11.9,-29.2 17.3,-55.1c1,-5.2 3,-10.4 3.5,-14.6 2.5,-24.5 3.2,-34.6 0,-48 -2.5,-9.9 -12.1,-18.8 -17.1,-25.7 -4.9,-7.2 -7.2,-9.9 -6.2,-11.4s4.9,-4 8.7,-3.7c3.7,0.2 13.3,1 21.3,9.9 7.7,8.9 13.8,39.1 13.8,39.1l6.4,39.8 16.3,50.2 -64,19.5z"/>
</group>
<group>
<clip-path android:pathData="M618,618m-585.6,0a585.6,585.6 0,1 1,1171.2 0a585.6,585.6 0,1 1,-1171.2 0"/>
<path android:fillColor="#b58634" android:pathData="M530.5,224.5s-2.2,1 -6.2,0c0.2,2 -0.2,5.9 -4,8.4 -4.2,-1.7 -43.5,1.7 -43.5,1.7s-18.3,-3.2 -24,-27.4c-4,-16.1 3,-38.3 0.7,-52.9 -3.5,-21.5 -8.4,-25.7 -8.9,-32.4 -0.5,-6.7 -1,-8.4 -1,-12.6 -2.2,-0.5 -3.5,-1.2 -5.7,-1.2 -0.5,-2 0.5,-3.7 -1.7,-7.2 1.2,0.5 9.4,1.5 19,10.6 7.9,7.4 7.9,10.1 9.1,11.6 1.5,1.5 13.6,11.9 18.8,22.2s15.3,43.3 17.6,48.7c0.7,2.2 2.2,4.4 5.9,9.4 5.8,7.2 14.3,19.1 23.9,21.1z"/>
</group>
<group>
<clip-path android:pathData="M618,618m-585.6,0a585.6,585.6 0,1 1,1171.2 0a585.6,585.6 0,1 1,-1171.2 0"/>
<path android:fillColor="#a88f33" android:pathData="M465.7,123.6c3.7,5.9 10.6,17.8 16.3,30.4 5.9,13.3 9.4,24.2 16.8,33.1 -4,-11.6 -11.1,-34.4 -15.3,-42.5 -4.7,-8.6 -14.3,-17.8 -17.8,-21z"/>
</group>
<group>
<clip-path android:pathData="M618,618m-585.6,0a585.6,585.6 0,1 1,1171.2 0a585.6,585.6 0,1 1,-1171.2 0"/>
<path android:fillColor="#e6c367" android:pathData="M397.7,288s-10.1,2.5 -28.9,12.4c-6.2,3.2 -12.1,5.9 -17.8,8.4 -14.8,6.7 -30.7,12.9 -43.3,16.3 1,1.2 1.5,1.7 1.5,1.7s0,4.9 2.7,7.7c-1.5,1.5 -21.5,15.1 -15.6,60.6 4,-1.5 8.7,-3.5 9.4,-3.5 1.2,0.2 1.5,3.5 3,3.5s6.4,-2 11.6,-8.7c-0.2,2.7 -3.2,29.9 12.9,48.2 3,-3.5 10.6,-15.1 10.6,-15.1l0.2,-3.7s0.7,-12.9 4.9,-24.7c4.2,-11.9 12.4,-20.5 12.4,-20.5l42.8,-61.1 -6.4,-21.5z"/>
</group>
<group>
<clip-path android:pathData="M618,618m-585.6,0a585.6,585.6 0,1 1,1171.2 0a585.6,585.6 0,1 1,-1171.2 0"/>
<path android:fillColor="#dcba5a" android:pathData="M357.7,377.7s-3,2.2 -6.4,3.2c-0.7,-2.5 -1.7,-11.1 4.2,-19.5 6.9,-10.1 22,-23.2 26.2,-33.6 2.7,-6.7 1.5,-23.5 25.5,-45s33.4,-28.9 33.4,-28.9l38.8,-19.5 47.7,18.8 -23.7,92.9 -18.4,43.5 -73.2,-13.8 -54.1,1.9z"/>
</group>
<group>
<clip-path android:pathData="M618,618m-585.6,0a585.6,585.6 0,1 1,1171.2 0a585.6,585.6 0,1 1,-1171.2 0"/>
<path android:fillColor="#e9ce77" android:pathData="M385.6,352.5l9.1,-11.4V333s10.1,-2.7 21,-13.8c10.9,-11.1 26,-32.4 39.3,-31.1 13.3,1.5 14.6,28.9 15.1,36.6 0.5,7.7 2.2,25.2 4.9,34.6 3,9.4 -32.4,45 -32.4,45l-24,18.3 -33,-70.1z"/>
</group>
<group>
<clip-path android:pathData="M618,618m-585.6,0a585.6,585.6 0,1 1,1171.2 0a585.6,585.6 0,1 1,-1171.2 0"/>
<path android:fillColor="#cdae50" android:pathData="M413.8,447.4s7.4,-11.6 2,-14.1c3.2,-7.2 9.1,-14.8 9.1,-14.8s4.2,-10.4 17.8,-23.2c13.6,-12.9 22,-21.3 24.2,-29.9 2.2,-8.7 2.2,-17.1 2.2,-17.1s2.7,2.2 4.7,3.2c2.2,1 12.6,9.6 11.1,26.9 -1.5,17.3 -7.9,24.5 -7.9,24.5s-6.2,6.2 -10.6,9.4c-4.7,3.2 -6.4,6.9 -14.3,7.2 1.2,-1 2.7,-1.5 2.7,-1.5s-8.2,-1 -12.6,3 -13.8,16.3 -18.5,20c-4.7,3 -9.9,6.4 -9.9,6.4z"/>
</group>
<group>
<clip-path android:pathData="M618,618m-585.6,0a585.6,585.6 0,1 1,1171.2 0a585.6,585.6 0,1 1,-1171.2 0"/>
<path android:fillColor="#d2a83e" android:pathData="M746.3,252.9s-15.8,-6.4 -36.8,-7.2c-21,-0.7 -51.7,0.5 -81.8,0.7 -32.4,0.2 -61.8,-11.1 -102.6,-13.1 -6.7,-4 -23.7,-21.5 -76.9,15.6 3.2,-0.2 38.6,-8.2 50.9,7.2 12.4,15.3 8.9,41.3 7.2,47.5 -3.2,13.8 -13.6,33.9 -17.8,48s-3.2,21.5 -6.2,31.4 -9.6,14.8 -5.7,26.2c5.2,-3.2 7.9,-3.2 16.6,-22.7 8.7,-19.5 6.9,-33.4 21.3,-49.9 14.1,-16.6 37.6,-39.3 46.5,-45 8.9,-5.7 79.8,-42.5 154,-7.4 17.9,-1.9 31.3,-31.3 31.3,-31.3z"/>
</group>
<group>
<clip-path android:pathData="M618,618m-585.6,0a585.6,585.6 0,1 1,1171.2 0a585.6,585.6 0,1 1,-1171.2 0"/>
<path android:fillColor="#c29637" android:pathData="M478.1,239.3s-0.2,-1.7 -0.5,-2.2c-1.2,-2.5 -2.7,-4 -2.7,-4s-17.6,-3.2 -26.5,-2.2c-15.6,1.7 -29.7,21 -36.3,30.9 -6.7,9.9 -14.8,25.2 -23.7,33.1 0.2,-1.2 -0.5,-2.2 -0.5,-2.2s0.5,0.7 -0.5,1.7 -1,1.5 -0.5,2l1.5,1.5c0.5,0 14.3,-6.2 33.1,-23.7 20,-18.3 35.3,-27.7 43.3,-30.9 6.1,-2.8 13.3,-4 13.3,-4z"/>
</group>
<group>
<clip-path android:pathData="M618,618m-585.6,0a585.6,585.6 0,1 1,1171.2 0a585.6,585.6 0,1 1,-1171.2 0"/>
<path android:fillColor="#ac8132" android:pathData="M819.5,164.1s-3.2,4 -7.2,8.4c-8.9,9.4 -20.5,20 -30.4,30.9 -9.4,10.4 -20,18.5 -31.9,32.1 -11.9,13.6 -25.7,28.7 -29.2,33.1 -3.2,4.4 -5.7,11.6 -5.7,15.3 -1.7,-1.2 -3.7,-2.5 -3.7,-2.5s1,2 3,4.4c2.5,3.5 6.4,7.9 8.4,10.6 3.2,4.4 4.9,9.6 5.2,11.4 1.2,0.2 8.9,1.7 18.5,-14.1 9.6,-15.8 22.2,-33.1 22.2,-33.1l20,-29.7 12.6,-25.2 15.8,-28.2 2.4,-13.4z"/>
</group>
<group>
<clip-path android:pathData="M618,618m-585.6,0a585.6,585.6 0,1 1,1171.2 0a585.6,585.6 0,1 1,-1171.2 0"/>
<path android:fillColor="#a88f33" android:pathData="M840,143.9s-12.1,9.9 -16.8,15.8c-4.7,5.9 -15.8,21.5 -15.8,21.5l4,-0.5 20.3,-18 7.9,-14.1 0.4,-4.7z"/>
</group>
<group>
<clip-path android:pathData="M618,618m-585.6,0a585.6,585.6 0,1 1,1171.2 0a585.6,585.6 0,1 1,-1171.2 0"/>
<path android:fillColor="#a67a2e" android:pathData="M836.3,938.6s-0.2,-8.2 4.4,-13.1c4.7,-4.9 16.6,-12.1 28.2,-39.1 11.6,-26.9 12.9,-33.1 12.9,-33.1s-20.8,17.8 -33.6,22c3,-6.2 4.7,-10.6 6.2,-13.8 -1.7,-1.5 -8.9,-3.2 -9.6,-4 4,-4 6.2,-13.8 14.3,-20.3 10.4,-7.9 29.4,-21.5 44.2,-33.6 14.8,-12.1 43.8,-40.3 47.5,-48.5 2.2,3.2 2.7,5.2 2.7,5.2s-14.6,19 -22.2,31.1c-6.7,10.4 -6.2,16.3 -6.2,16.3l13.8,-5.9s4,14.8 -14.1,37.3c7.9,-3 11.1,-1.2 15.6,-3.7 -7.4,4.7 -17.6,11.1 -27.2,28.7 -9.4,17.6 -22.2,38.1 -43.8,50.9 -21,13.5 -33.1,23.6 -33.1,23.6z"/>
</group>
<group>
<clip-path android:pathData="M618,618m-585.6,0a585.6,585.6 0,1 1,1171.2 0a585.6,585.6 0,1 1,-1171.2 0"/>
<path android:fillColor="#8c6228" android:pathData="M782.1,263.3s-8.2,17.1 -9.4,30.4c-0.2,3.2 -1,5.7 -1,9.4 -0.2,11.9 0.7,25.2 -2,31.4 -1,-2.5 -1.5,-4.2 -2.5,-5.2 -1.5,4.2 -4.2,17.3 -6.4,22.2 -1,-3.2 -3.2,-14.3 -3,-27.4 0.2,-13.1 0.5,-15.6 0.5,-18.3 -0.5,4 -3.2,9.4 -4.2,12.6 -1.5,-2.7 -3.2,-6.2 -5.2,-9.1 -1.2,2 -2.7,4.9 -4,6.4 -0.2,-1.2 -0.7,-4.4 -1,-8.9 -0.2,-5.2 -0.5,-11.9 -0.2,-13.3 0.5,-2.7 4.7,-13.3 13.6,-23 10.6,-11.6 21.5,-33.9 24.7,-40.8 3.2,-6.9 16.8,-35.6 16.8,-35.6h10.4l-15.1,34.4s-9.1,18.8 -13.8,25.7c-4.7,6.9 -14.6,26.7 -19,34.4 3.2,-4.2 5.9,-6.4 9.1,-10.4 3.1,-2.8 11.7,-14.9 11.7,-14.9z"/>
</group>
<group>
<clip-path android:pathData="M618,618m-585.6,0a585.6,585.6 0,1 1,1171.2 0a585.6,585.6 0,1 1,-1171.2 0"/>
<path android:fillColor="#cba94c" android:pathData="M840.2,142.6s-2,7.2 -7.9,14.3c-6.2,7.4 -19.5,17.3 -26,25.2 -5.9,7.7 -17.8,28.7 -12.4,53.6 2,-5.4 5.7,-16.1 15.6,-28.2s20.5,-26 25.7,-36.8c5.2,-10.9 5.9,-19.5 5.9,-19.5l2,-2.5 -1.2,-5.7 -1.7,-0.4z"/>
</group>
<group>
<clip-path android:pathData="M618,618m-585.6,0a585.6,585.6 0,1 1,1171.2 0a585.6,585.6 0,1 1,-1171.2 0"/>
<path android:fillColor="#a88f33" android:pathData="M1042.7,805.9s-4,-10.9 -5.2,-20.8c-1.2,-9.9 2,-11.9 -1.7,-23.2 -2.2,-6.9 -6.2,-5.9 -7.2,-6.9s-1.7,-11.4 -1.5,-17.1c0.2,-5.7 -0.2,-13.1 -1.2,-16.3 -1.5,-1.2 -2.5,-2.2 -4.7,-9.6 -2.5,-7.4 -3.7,-11.1 -4.9,-13.3s-4.7,-4.2 -4.7,-6.4c0,-4.4 4,-6.7 4,-7.9 -0.2,-2.5 -3.2,-0.5 -4,-1.2 -1,-1.2 2.5,-8.4 1.2,-9.4 -0.5,-0.5 -4,3.7 -4.9,2.5 -1,-1.2 -2.2,-13.1 -4,-21 -1.7,-7.7 -3.5,-13.3 -3.7,-15.6 -0.2,-2.2 -13.8,-41 -17.1,-50.4 -3.2,-9.4 -5.7,-19.5 -6.7,-24.2 -1,-4.7 -1.7,-14.3 -2.2,-13.3 -0.5,1 -0.2,5.9 -1,5.7 -0.7,-0.2 -3.2,-17.3 -4,-20 -0.7,-2.7 -4.9,-11.9 -5.9,-18.5 -1,-6.7 -3.2,-24.2 -4.7,-36.1 -1.5,-11.9 -2.2,-16.8 -2.2,-19.8 0,-1.5 0.5,-10.1 -1.2,-21.8 -2,-12.6 -5.9,-27.9 -9.4,-36.8 -6.7,-16.8 -24.5,-59.8 -27.7,-70.5 0,-2.7 3.5,-1.2 3.5,-1.2s8.7,21.8 15.1,38.6c6.2,16.8 12.1,31.6 13.6,33.1 1.2,1.5 10.6,18 14.8,45s5.7,51.9 8.2,68.5c1.2,7.9 2.2,16.3 4.7,24.7 2.7,9.1 6.9,18.5 12.4,32.9 4.7,12.1 8.2,22.2 10.1,30.9 2.2,11.1 2.2,19.5 3.5,25 1.2,4.7 3,14.1 7.2,27.7s10.4,31.1 14.6,42c8.2,21.8 11.9,40 13.1,49.7 1.1,10 4.8,44.6 3.8,55z"/>
</group>
<group>
<clip-path android:pathData="M618,618m-585.6,0a585.6,585.6 0,1 1,1171.2 0a585.6,585.6 0,1 1,-1171.2 0"/>
<path android:fillColor="#be9c44" android:pathData="M840.7,141.4l-0.5,1.2s1.5,0.5 1.2,2.5c0,1 0,4.9 -0.5,8.2 -0.5,3.5 -1.5,6.2 -1.7,8.4 0,4.7 0.7,10.1 -5.9,23.5 -2,3.7 -3.2,6.9 -4.2,9.1 -2.5,5.4 -3,6.2 -5.2,8.7 3.5,-2 16.1,-9.9 22.5,-8.7 -4.4,2.5 -11.1,7.4 -15.3,13.8 1,0.2 5.2,1 11.9,0 11.1,-1.7 23.5,-5.7 34.4,-4.9 11.9,0.7 7.2,-14.3 7.2,-14.3l-13.8,-30.2 -26,-18.3 -4.1,1z"/>
</group>
<group>
<clip-path android:pathData="M618,618m-585.6,0a585.6,585.6 0,1 1,1171.2 0a585.6,585.6 0,1 1,-1171.2 0"/>
<path android:fillColor="#a17c34" android:pathData="M908.5,367.6s-11.6,-11.6 -16.3,-51.4c-4.7,-40 -3.7,-98.9 -3.7,-98.9l-9.4,-23s-2,-15.3 -6.9,-21c-4.9,-5.7 -14.6,-15.3 -19,-20 -4.4,-4.7 -9.4,-11.1 -12.4,-12.1 1.5,-2.5 8.2,-16.6 33.9,-16.8 25.7,-0.2 33.6,14.1 36.3,19.3 2.7,5.2 14.8,27.7 19.3,70.5 4.2,42.8 4.4,46 3.7,60.8 -0.5,8.2 -3.2,27.2 -7.9,47.5 -4.3,17.2 -9,36.4 -17.6,45.1z"/>
</group>
<group>
<clip-path android:pathData="M618,618m-585.6,0a585.6,585.6 0,1 1,1171.2 0a585.6,585.6 0,1 1,-1171.2 0"/>
<path android:fillColor="#8c6228" android:pathData="M872.1,401.7s5.4,0.7 11.1,-2.5c3.7,-0.2 17.1,1.5 27.4,-11.6 0.7,3 2.5,11.1 -2.2,18.3 2.5,-2.5 6.2,-3.5 6.7,-4.2 0.2,3.7 3.7,15.1 -11.1,42.8 4,-4.4 8.7,-4.2 12.9,-4.7 0.2,5.2 3,22.7 -4.4,32.1 -4.9,6.4 -12.9,4.4 -12.9,4.4s0.2,-2.2 0,-4.2c-0.2,-2.7 -1.2,-5.4 -0.5,-7.2 -1,-0.5 -5.2,-2.2 -10.4,-7.2 -8.7,-8.2 -20,-22.2 -20.8,-32.6 -1,-11.6 9.4,-14.1 9.4,-14.1s-1.2,-1 -2.2,-2.7c-0.5,-1.7 -1,-4.4 -3,-6.6z"/>
</group>
<group>
<clip-path android:pathData="M618,618m-585.6,0a585.6,585.6 0,1 1,1171.2 0a585.6,585.6 0,1 1,-1171.2 0"/>
<path android:fillColor="#92723a" android:pathData="M795,275.9s-0.5,-0.7 -3.2,2.5c0.5,-3.2 1,-6.2 1.2,-9.1 1,-2.2 2.7,-4.9 4.9,-7.4 -1.5,3 -2.5,5.7 -2.5,5.7s3.7,-6.9 9.1,-11.1c3.7,-3 8.4,-4.4 10.4,-7.2 2.2,-3 1.7,-3.5 2.2,-4 0,0 4.9,-3.2 12.4,-12.6 1,-1.2 2.5,-2.5 3.5,-3.7 1.7,-0.7 5.7,-2.5 10.4,-4.9 4.9,-2.7 10.4,-6.4 13.8,-7.9 6.7,-3 13.8,-2.7 17.1,-7.4 2.5,-0.7 5.2,-8.2 4.7,-14.6 3.7,1.5 22.7,13.3 29.2,39.1 4.7,18.3 -3.7,46.5 -7.2,60.1 -3.5,13.6 -4,23.7 -8.9,29.9 -6.2,8.2 -26.2,19.8 -31.1,25.5 -4.2,4.7 -16.8,16.6 -16.3,25.2 0.5,6.4 8.4,9.9 10.1,11.1 1.7,1.2 1.7,2.7 4.9,2s4.4,-2.2 5.7,-2.2c1.5,0.2 1.5,0.5 2.2,0.5s1.5,-0.2 1.5,-0.2 -0.5,9.1 -21.8,11.9c-1.5,0.2 -3,0.7 -4.9,1 2.5,-1.2 4,-1.2 6.7,-4.9 -3,-0.5 -11.6,-1 -13.8,-1.7 0.7,-1.2 3,-4.4 4.9,-5.9 1.7,-1.5 -0.2,-2 -1.7,-1.2 -0.7,0.5 -4,2.7 -7.4,5.7 -2.5,2.2 -4.7,5.2 -8.7,7.9 -1.2,-4 -1,-11.6 3.7,-17.1 -1.2,0.2 -3.5,3.7 -5.7,3 -0.2,-1.5 -0.5,-6.4 0.7,-10.9s7.7,-12.4 7.7,-12.4l31.4,-56.1 6.7,-42.5 -71.9,13.9z"/>
</group>
<group>
<clip-path android:pathData="M618,618m-585.6,0a585.6,585.6 0,1 1,1171.2 0a585.6,585.6 0,1 1,-1171.2 0"/>
<path android:fillColor="#b18e3e" android:pathData="M793.3,278.3s-1.7,1.2 1.7,3.5c-0.5,0.7 -1.7,3.2 -3.2,4.9 -1.7,2 -3.5,3.2 -4.2,4.9 -1.5,3.5 -2.7,5.9 -2.7,7.4s-0.5,11.1 -4.7,17.3c-1.5,2.2 -3.2,5.9 -4.4,8.4 -2.5,4.4 -4.7,7.9 -5.2,9.9 -1,3.5 -1.7,13.1 -1.7,13.1s2.2,-2.7 3,-3.7c-1.2,2.5 -2.5,5.2 -4.4,7.2 1.2,-1 4.7,-3.5 10.6,-8.7 8.2,-6.9 21,-18.5 36.6,-27.7 -4.7,1.7 -8.7,1.7 -11.9,2.2 2.5,-2.5 25,-28.9 36.8,-31.4 1.2,-1.5 1,-3.2 1,-3.2l-10.1,-1 -20.5,4.4 -3,-15.8 -13.7,8.3z"/>
</group>
<group>
<clip-path android:pathData="M618,618m-585.6,0a585.6,585.6 0,1 1,1171.2 0a585.6,585.6 0,1 1,-1171.2 0"/>
<path android:fillColor="#543e26" android:pathData="M825.9,368.3s-2.7,2.7 -5.2,9.4c-0.7,-0.7 -3,-3.2 -4.9,-6.7 -3.7,-6.2 -9.4,-14.1 -22.7,-9.6 -0.2,-4.2 -0.5,-6.4 0,-9.4 2.2,-0.5 8.9,-5.9 15.6,-13.8 4.7,-5.4 9.1,-11.6 12.1,-19.5 2,-1.5 5.4,-4 9.9,-6.9 6.4,-4.4 14.1,-10.4 15.3,-17.1 -3,1.2 -9.4,4.2 -19,3.7 3.7,-1.7 9.4,-3.5 8.7,-10.9 1.5,-1 2.7,-1.7 2.7,-1.7s-1.2,-0.5 -3.5,-0.5c-0.2,-0.7 -0.5,-1.7 -2.2,-1.2 -1.7,0.5 -2,0.5 -2.2,1.2 -0.7,0.2 -3,0 -4.7,1.2 -1.7,1.2 -6.4,5.2 -8.2,5.9 0.7,-1.2 1.7,-3 1.7,-3s-4.9,0.5 -8.4,2c-6.4,2.2 -13.8,6.2 -21.3,10.1 0.7,-1.2 1,-2 1.5,-2.2 0.5,-0.2 1.7,-0.5 1.7,-0.7 0,-0.2 -0.5,-2 -0.2,-2.7 0.2,-0.7 4.4,-8.9 7.9,-13.6 3.5,-4.7 4.2,-11.4 4.2,-11.4l15.3,-7.7 43,-9.9 27.9,1.7 -3.5,19.3 -16.5,33.7 -14.1,30.7 -16.1,18.8 -14.8,10.8z"/>
</group>
<group>
<clip-path android:pathData="M618,618m-585.6,0a585.6,585.6 0,1 1,1171.2 0a585.6,585.6 0,1 1,-1171.2 0"/>
<path android:fillColor="#806031" android:pathData="M895.6,284.8s-16.8,20.8 -21.5,24c3,-6.4 21.5,-44.5 28.2,-55.1 -1.5,-1.2 -3.5,-1.2 1.2,-19.8 -4,9.4 -5.4,14.3 -8.7,16.8 -3.2,2.5 -3.7,1.7 -5.9,1.7 0.7,-1.2 0.5,-2.5 0.5,-2.5s-14.1,-1.7 -23.7,-1.7 -28.7,5.2 -39.3,9.4c-8.4,3.5 -13.1,3.5 -16.1,5.7 -3,2.5 -4.7,5.2 -6.2,5.9 -1.2,0.7 -6.9,2.5 -8.2,4.4 -1.2,2 -3.2,4.2 -3.2,4.7s-0.5,1.2 1,0.7c0.5,-0.2 4.2,-2.2 8.4,-4.7 5.7,-3.2 12.6,-6.9 17.6,-9.1 14.3,-5.7 18.8,-4.7 25.2,-5.9 6.7,-1.2 16.3,-4 22.7,-4 6.4,-0.2 18.5,0 21.3,0.5 -1.2,1 -2.2,2.2 -1.7,6.4 0,1.2 -1,2.5 -2,5.4 -3,8.2 -8.7,21.8 -11.9,28.7 -4.4,9.4 -9.4,17.3 -11.9,22.2 -2.5,4.9 -7.9,17.8 -13.3,24.7 -5.4,6.9 -8.2,11.1 -9.9,12.6s-13.8,10.4 -12.9,13.6c2.2,-0.7 16.1,-5.9 26.2,-17.3 10.1,-11.4 12.1,-18.3 20,-24.5 7.9,-6.2 14.1,-16.6 17.8,-25.2 3.1,-8 2.4,-10.5 6.3,-17.6z"/>
</group>
<group>
<clip-path android:pathData="M618,618m-585.6,0a585.6,585.6 0,1 1,1171.2 0a585.6,585.6 0,1 1,-1171.2 0"/>
<path android:fillColor="#b6903c" android:pathData="M533.5,440s-2.2,9.1 -7.2,13.6c-4.9,4.4 -13.6,8.2 -14.6,15.6 -1.2,7.4 8.7,11.1 8.7,11.1s-5.4,8.9 -5.4,15.6c0,6.9 -0.2,8.2 0.5,14.8 -1.2,0.7 -2,2 -2,2s0.5,6.4 5.4,10.4 9.1,6.4 11.6,5.4c0.5,1 1,2.5 1,2.5s3.7,-9.4 6.2,-17.6c2.5,-8.4 4.7,-7.2 5.7,-18.5 1,-11.4 11.9,-30.7 11.9,-30.7l7.4,-16.6 -12.1,-9.4 -17.1,1.8z"/>
</group>
<group>
<clip-path android:pathData="M618,618m-585.6,0a585.6,585.6 0,1 1,1171.2 0a585.6,585.6 0,1 1,-1171.2 0"/>
<path android:fillColor="#685026" android:pathData="M556,456.3s-3.7,3.7 -6.9,8.2c-3.2,4.4 -5.7,8.4 -10.4,10.1 -4.7,1.7 -7.7,1.7 -7.4,6.4s4.7,6.7 7.2,9.1c2.7,2.5 4.9,6.7 3.7,11.4 1.5,-0.7 4.2,-1.5 6.7,-6.9s20,-38.3 20,-38.3H556z"/>
</group>
<group>
<clip-path android:pathData="M618,618m-585.6,0a585.6,585.6 0,1 1,1171.2 0a585.6,585.6 0,1 1,-1171.2 0"/>
<path android:fillColor="#d4b968" android:pathData="M624.9,380.4s1.5,-4 0,-6.9c-1.5,-3 -10.6,-4 -15.1,-7.4 -4.7,-3.5 -10.4,-5.9 -15.1,-4.4 0.7,-1.7 3.5,-5.4 1.2,-6.2 -2.2,-0.7 -10.4,3 -12.6,4.7 -2.2,1.7 -7.2,3.7 -8.2,4.9s-2.7,3.5 -3.7,2.5c-1,-0.7 -1.5,-2.5 -3.2,-1.5 -1.7,1 -9.9,7.7 -11.4,11.6s-4.9,12.6 -15.1,22.5c-10.1,9.9 -14.6,16.3 -11.6,20 3,3.7 4.4,1 4.9,4.2 0.2,1.5 0.5,5.4 -0.5,9.4 -1.2,5.2 -3.2,10.1 -0.5,11.1 6.9,2.2 13.6,-2 15.1,-0.7 3,2.7 -1.7,12.4 5.4,14.3 7.2,2 14.3,-1.7 14.3,-1.7l26.2,-14.1 25.2,-13.3 12.9,-25.5 -6.9,-21.3 -1.3,-2.2z"/>
</group>
<group>
<clip-path android:pathData="M618,618m-585.6,0a585.6,585.6 0,1 1,1171.2 0a585.6,585.6 0,1 1,-1171.2 0"/>
<path android:fillColor="#cca849" android:pathData="M600.2,441.3s-4.4,-6.7 1,-12.6c5.4,-5.9 13.1,-8.4 16.1,-12.1 -1,-1.2 -2.2,-1.5 -2.2,-1.5s2.7,-5.4 8.7,-8.2c-1.5,-1.5 -3.5,-2.7 -5.7,-2.7 -4.9,0 -7.9,3 -12.4,3 -4.4,0 -4.9,-2.2 -4.9,-2.2s7.4,-0.7 6.7,-4c-0.7,-3.5 -2,-3.5 -2,-3.5s14.3,-5.9 16.8,-9.1c2.5,-3.2 2.2,-6.9 2.7,-8.4 1.7,0 11.6,-5.2 15.6,-3s1.2,8.2 1.2,8.2 12.1,-9.1 18.3,-18c5.4,0.5 7.9,-3.7 11.9,-3.7 4.9,0 12.6,6.7 14.1,21 1,8.2 2.5,12.9 1,27.4 -0.7,8.2 -0.5,25.7 2,34.4 1.7,6.9 5.7,6.2 5.7,6.2s-0.7,3 -3.5,5.4c-2.7,2.5 -3,9.1 -2.7,11.6 0.5,2.5 1.5,5.4 1.5,5.4s-3.2,3.7 -4,6.2c-0.7,2.5 -4,4.2 -6.4,4.2 -2.5,0 -1.2,-0.2 -4.4,0s-4.2,0.7 -6.2,0 -3.5,-1.5 -2.7,-7.9c0.7,-6.4 -24.7,-21.3 -24.7,-21.3l-41.5,-14.8z"/>
</group>
<group>
<clip-path android:pathData="M618,618m-585.6,0a585.6,585.6 0,1 1,1171.2 0a585.6,585.6 0,1 1,-1171.2 0"/>
<path android:fillColor="#585136" android:pathData="M552.5,504.5s9.1,12.1 46.5,12.1c17.8,0 24,-1.7 27.7,-2.7 4,-1 19,-6.9 34.1,-24.7 13.6,-16.1 10.6,-22.7 10.6,-22.7l-7.9,-1.2 -25.7,3.5 -76.1,32.4 -9.2,3.3z"/>
</group>
<group>
<clip-path android:pathData="M618,618m-585.6,0a585.6,585.6 0,1 1,1171.2 0a585.6,585.6 0,1 1,-1171.2 0"/>
<path android:fillColor="#252211" android:pathData="M580.4,507.5s-32.4,7.2 -32.4,-13.3c0,-20 20,-41 25,-44.7 5.2,-3.7 17.6,-7.9 17.6,-7.9h29.9l5.7,15.1 -2.5,32.6 -43.3,18.2z"/>
</group>
<group>
<clip-path android:pathData="M618,618m-585.6,0a585.6,585.6 0,1 1,1171.2 0a585.6,585.6 0,1 1,-1171.2 0"/>
<path android:fillColor="#c3b378" android:pathData="M610.3,447.7s-6.2,-5.7 -20.3,2 -25.5,23.7 -26.2,38.3c-0.7,12.9 10.6,22.5 28.2,23 13.1,0.5 21,-1 25,-2 -1,-1.2 -6.2,-7.7 -6.2,-7.7l-0.5,-53.6z"/>
</group>
<group>
<clip-path android:pathData="M618,618m-585.6,0a585.6,585.6 0,1 1,1171.2 0a585.6,585.6 0,1 1,-1171.2 0"/>
<path android:fillColor="#e6d89c" android:pathData="M604.2,450.9s-1.5,-1.2 -5.9,1.2c-3.7,2 -9.1,7.2 -13.3,10.9 -2.7,2.2 -4.4,3.2 -5.9,4.9 -6.2,7.4 -11.4,19.5 -8.4,25.5 3,5.9 12.9,12.9 38.1,8.2l-4.6,-50.7z"/>
</group>
<group>
<clip-path android:pathData="M618,618m-585.6,0a585.6,585.6 0,1 1,1171.2 0a585.6,585.6 0,1 1,-1171.2 0"/>
<path android:fillColor="#252211" android:pathData="M596,463.3s-4,6.2 -4,16.1c0,10.1 5.7,26.2 26.7,27.4 16.1,1 26.9,-23.2 38.6,-32.6 8.9,-7.2 14.3,-7.4 14.3,-7.4s-9.1,-9.9 -33.4,-22.7c-24,-12.9 -50.9,-14.6 -65.5,5.2 6.9,-0.5 29.2,-6.2 29.2,-6.2l10.9,3.5 -16.8,16.7z"/>
</group>
<group>
<clip-path android:pathData="M618,618m-585.6,0a585.6,585.6 0,1 1,1171.2 0a585.6,585.6 0,1 1,-1171.2 0"/>
<path android:fillColor="#6f674d" android:pathData="M627.4,476.4c-0.7,-1.5 -1.2,-3.5 1.7,-4 3,-0.5 4.2,-0.2 5.2,2s2,4 0.5,4.9c-1.5,0.8 -5.4,0 -7.4,-2.9zM622.7,462.3s-1,0.7 -0.5,-0.7c0.2,-1.7 1.5,-4.7 4.7,-4 3.2,0.7 2.5,4.2 2,5.2s-3.2,2.7 -5.2,2 -1,-2.5 -1,-2.5z"/>
</group>
<group>
<clip-path android:pathData="M618,618m-585.6,0a585.6,585.6 0,1 1,1171.2 0a585.6,585.6 0,1 1,-1171.2 0"/>
<path android:fillColor="#ac924c" android:pathData="M352,468.7s7.9,5.9 17.1,5.7c9.1,-0.2 20.8,-9.6 26.2,-15.6 3.2,-3.5 5.9,-7.2 8.9,-10.1 2.5,-2.5 4.2,-3.7 5.4,-5.4 1.7,-2 3.5,-5.7 4.4,-6.9 -2.2,1.7 -5.4,4.7 -8.7,6.7 -3.2,2 -10.1,5.7 -12.9,6.7 -2.7,1 -30.7,15.8 -30.7,15.8l-9.7,3.1z"/>
</group>
<group>
<clip-path android:pathData="M618,618m-585.6,0a585.6,585.6 0,1 1,1171.2 0a585.6,585.6 0,1 1,-1171.2 0"/>
<path android:fillColor="#9f8e57" android:pathData="M364.1,394.8s4.4,-3 12.9,-4.9c8.2,-2 24.7,-3.5 24.7,-3.5l13.6,5.9 5.4,20.5 -9.9,21.3 -12.6,7.9 -14.3,-23 -19.8,-24.2z"/>
</group>
<group>
<clip-path android:pathData="M618,618m-585.6,0a585.6,585.6 0,1 1,1171.2 0a585.6,585.6 0,1 1,-1171.2 0"/>
<path android:fillColor="#eac970" android:pathData="M346.3,413.1l-4.7,3.5s1.2,-2.2 2.2,-8.9c1,-6.7 6.2,-23 13.8,-32.4s7.4,-8.9 7.4,-8.9 -2.2,-0.5 -4,1c1,-2.2 7.4,-10.1 13.8,-14.1s8.9,-5.2 15.6,-2c6.7,3.2 8.4,4.9 13.3,4.7s9.1,-5.4 9.1,-5.4 1,3.2 -2.7,10.6c-3.7,7.4 -18.3,22.5 -18.3,22.5l-30.4,20.8 -15.1,8.6z"/>
</group>
<group>
<clip-path android:pathData="M618,618m-585.6,0a585.6,585.6 0,1 1,1171.2 0a585.6,585.6 0,1 1,-1171.2 0"/>
<path android:fillColor="#d7bc6b" android:pathData="M368.8,392.3s22,3 28.7,-3.2c0.2,0.7 1,0.7 1,1.2s-0.5,1 -0.5,1 1.2,-0.2 2.2,-0.2c1,0.2 1.7,0.5 2.7,0.5 1,0 2.2,-0.2 2.2,-0.2s-0.2,1.7 -1.5,2.5c1,0 2,0.2 2,1s0.2,3.2 -1,3.7c-1.5,0.5 -3,-0.2 -3,-0.2s0,2.7 1.5,5.4c2,3.7 6.2,7.9 11.9,6.7 0,0 3,7.2 -9.6,23.2 -1.7,2.2 -3.5,5.2 -5.7,7.7 -1.7,4 -2,5.9 -2,5.9s21.3,-8.2 27.4,-26.9c6.2,-18.8 7.4,-37.3 6.2,-54.6 -0.2,-4.9 -1,-8.4 -2.2,-10.9 -3,-6.2 -11.4,-5.2 -14.8,-1.7 -4.9,4.9 -13.1,17.1 -24.5,25.5 -11.6,8.4 -12.1,9.9 -21,13.6z"/>
</group>
<group>
<clip-path android:pathData="M618,618m-585.6,0a585.6,585.6 0,1 1,1171.2 0a585.6,585.6 0,1 1,-1171.2 0"/>
<path android:fillColor="#585136" android:pathData="M342.4,419.3s-4.2,2.5 -6.4,11.9c-2.2,9.6 2,21.3 4.4,25 2.5,3.7 7.9,13.8 19.3,14.3 2.5,0 5.4,-0.5 8.2,-1.7 4,-1.7 7.9,-4.4 11.1,-6.9 4.9,-3.7 8.9,-6.9 8.4,-7.2 -1.2,-0.5 -30.2,-24.5 -30.2,-24.5L346.3,418l-3.9,1.3z"/>
</group>
<group>
<clip-path android:pathData="M618,618m-585.6,0a585.6,585.6 0,1 1,1171.2 0a585.6,585.6 0,1 1,-1171.2 0"/>
<path android:fillColor="#453a25" android:pathData="M369.8,459.1s5.9,-0.5 9.4,-2.7 -20.5,-26 -20.5,-26l1.7,25.7 9.4,3z"/>
</group>
<group>
<clip-path android:pathData="M618,618m-585.6,0a585.6,585.6 0,1 1,1171.2 0a585.6,585.6 0,1 1,-1171.2 0"/>
<path android:fillColor="#84754b" android:pathData="M344.3,417.5s-3,5.7 -3,7.2c-0.5,4.9 1,20.3 2.2,25.2 1.2,5.2 7.7,13.1 16.1,13.1 5.2,0 12.4,-3.2 12.4,-4 0,-1 -7.4,-2 -9.4,-5.7 -1.2,-2 -1.7,-6.9 -2,-11.9 -0.2,-3.2 -0.2,-6.7 1,-7.9 2.7,-3 3.2,-11.6 3.2,-11.6l9.6,-17.8h-12.6l-15.1,9.4 -2.4,4z"/>
</group>
<group>
<clip-path android:pathData="M618,618m-585.6,0a585.6,585.6 0,1 1,1171.2 0a585.6,585.6 0,1 1,-1171.2 0"/>
<path android:fillColor="#252211" android:pathData="M340.6,423s9.9,-13.1 18.8,-16.1c8.9,-3 12.9,-1.2 12.9,-1.2l-5.2,13.3 -7.4,8.2 0.5,4.2s-1.2,11.1 6.2,18.8c7.4,7.7 12.9,7.4 16.1,7.4 3.2,0 12.4,-2.7 17.1,-13.8 4.2,-10.4 7.7,-23.7 -0.7,-37.1 -8.2,-13.3 -22.7,-13.8 -25.5,-13.8 -2.8,0.1 -24.8,1.1 -32.8,30.1z"/>
</group>
<group>
<clip-path android:pathData="M618,618m-585.6,0a585.6,585.6 0,1 1,1171.2 0a585.6,585.6 0,1 1,-1171.2 0"/>
<path android:fillColor="#f7f7e7" android:pathData="M594.5,467.5c-3.7,-1.7 -0.2,-12.1 3.5,-15.3 3.7,-3.2 8.4,-6.9 16.6,-7.4 3,-0.2 5.9,1.7 5.4,3.7 -0.7,3.7 -5.9,8.9 -10.6,12.6 -6.5,5.1 -10.7,8.3 -14.9,6.4z"/>
</group>
<group>
<clip-path android:pathData="M618,618m-585.6,0a585.6,585.6 0,1 1,1171.2 0a585.6,585.6 0,1 1,-1171.2 0"/>
<path android:fillColor="#f8f6de" android:pathData="M394.5,410.8c2.7,-0.2 6.2,2 6.9,4.9 0.7,3.2 -1.7,9.6 -6.9,9.6 -4.2,0 -6.4,-5.2 -6.4,-6.7s0.7,-3 1,-3.5c0.2,-0.3 0.7,-3.8 5.4,-4.3z"/>
</group>
<group>
<clip-path android:pathData="M618,618m-585.6,0a585.6,585.6 0,1 1,1171.2 0a585.6,585.6 0,1 1,-1171.2 0"/>
<path android:fillColor="#d4c38b" android:pathData="M355.5,413.1s-6.9,3.2 -10.1,9.9c-3.2,6.7 -2.5,13.3 -2,15.8s3,8.7 4.7,10.9c1.7,2.2 4,3.7 5.7,3.5 1.7,-0.2 5.2,-4.7 5.2,-7.4s0.2,-14.1 3.5,-20.3c2.9,-6.2 -7,-12.4 -7,-12.4z"/>
</group>
<group>
<clip-path android:pathData="M618,618m-585.6,0a585.6,585.6 0,1 1,1171.2 0a585.6,585.6 0,1 1,-1171.2 0"/>
<path android:fillColor="#e2d59d" android:pathData="M356.5,412.6c-1.2,0.7 -3.2,1.7 -2.7,3 0.5,1.2 4.7,2 6.2,4.9 1.7,3 1.7,6.2 1.2,7.7 0.5,-0.2 2,-1 3.5,-2.5 2.2,-2.5 4.9,-5.9 7.2,-5.9 1.5,0 3,0.7 4.4,0.7 2.2,0 4.4,-0.7 4.7,-3 0.5,-3 -4.2,-5.7 -6.9,-5.2 0.5,-2 1.2,-4.9 -1,-6.9s-9.1,1.5 -10.6,2.5c-1.6,1 -6,4.7 -6,4.7z"/>
</group>
<group>
<clip-path android:pathData="M618,618m-585.6,0a585.6,585.6 0,1 1,1171.2 0a585.6,585.6 0,1 1,-1171.2 0"/>
<path android:fillColor="#cbac5a" android:pathData="M515.4,622.7l14.8,-4.4 4.2,3s3,6.4 7.7,7.2c-1.5,3.2 -5.4,5.9 -5.2,8.2s2.2,4 2.2,4 -13.3,22 12.9,44.2c-6.2,2.5 -14.1,5.9 -18.3,7.9 3,0.7 9.4,2 12.1,4.4 2.7,2.5 2.7,3.2 5.2,4.7s4,3.5 3.5,4.4c-1.7,-1 -7.4,-4 -8.4,-1.2 -1,2.7 -24.7,1.7 -24.7,1.7l-40,7.7s1.5,-4 -2.7,-7.7c-4.9,-4.4 -10.9,0.2 -17.3,-4.7 -8.4,-6.4 -8.7,-13.8 -11.4,-16.6 2.7,-1.7 8.2,-4.2 21.3,-5.9 -0.5,-1 -2.2,-4 -1.2,-6.7 1.2,-3.5 6.2,-5.7 4.7,-9.9 2.2,-0.5 3.2,-0.5 8.7,-7.4 5.2,-6.9 8.4,-8.4 12.4,-8.9s6.4,0 13.8,-6.9c5.2,-4.9 3.5,-9.1 3.5,-9.1s3.4,-1.1 2.2,-8z"/>
</group>
<group>
<clip-path android:pathData="M618,618m-585.6,0a585.6,585.6 0,1 1,1171.2 0a585.6,585.6 0,1 1,-1171.2 0"/>
<path android:fillColor="#d6bc6f" android:pathData="M471.7,624.9c0.2,-1 1,-1.5 6.4,-1s39.6,-3.2 48.9,-3.7c9.4,-0.7 42.5,-0.2 58.6,3.2s32.4,7.4 40.3,9.4c7.9,2.2 10.4,3 10.1,4 -0.2,1 -2,2 -3,1.7 -1,-0.2 -27.2,-8.2 -35.3,-9.9s-36.1,-6.2 -51.4,-5.9c-14.3,0.2 -20,-0.2 -32.1,1.2 -12.1,1.5 -32.1,3.5 -38.1,2.7 -5.9,-0.7 -4.7,-0.7 -4.4,-1.7z"/>
</group>
<group>
<clip-path android:pathData="M618,618m-585.6,0a585.6,585.6 0,1 1,1171.2 0a585.6,585.6 0,1 1,-1171.2 0"/>
<path android:fillColor="#dfc677" android:pathData="M552.2,703.3s20.5,11.1 27.9,24.7c5.4,10.1 -3.2,15.1 -3.2,15.1s11.6,0 10.1,6.4c-0.7,4 -20,14.8 -32.9,20.5 -13.1,5.7 -12.6,5.4 -19,6.4 -6.2,1 -23.2,-2 -26.7,3 -3.5,4.9 -2,10.1 -1,10.9 1,0.7 9.1,1.7 9.1,1.7s-1.7,4.7 -18.5,5.2 -21,1.7 -22,3.5c-1,1.7 3.2,0.7 10.9,2 7.7,1.2 18.5,2 18.5,2s-3.5,3 -12.6,5.4c-10.4,2.7 -26.7,5.2 -31.6,8.2 2.5,1.7 6.2,4.2 7.9,4.4 -4.2,1 -10.1,3.2 -11.1,4 1.5,1 3.5,2.2 3.5,2.2s-8.4,10.1 -13.3,12.6 -33.1,15.6 -42.8,13.1c-24.2,-6.4 -27.2,-32.9 -33.1,-34.9 -8.9,-3 -13.1,3 -21,-1.2 3.5,-2.5 5.4,-4 9.1,-5.7 -4,-2 -24.7,-15.1 -24.7,-15.1s-2.5,-5.7 -7.2,-13.8c-4,-6.9 -9.9,-16.1 -14.3,-24.2 -9.6,-17.8 -10.1,-26 -18.8,-36.1 1.5,-2 6.7,-1.7 6.7,-1.7l72.9,24 129.3,3.7 33.6,-48 14.3,1.7z"/>
</group>
<group>
<clip-path android:pathData="M618,618m-585.6,0a585.6,585.6 0,1 1,1171.2 0a585.6,585.6 0,1 1,-1171.2 0"/>
<path android:fillColor="#c4a859" android:pathData="M360.7,776.5s1,1.2 2.7,2.2c2.5,1.7 6.2,3.7 8.7,6.7 1,-1.5 3.5,-4.2 7.9,0s9.9,1.2 13.3,2.2c3.5,1.2 3.7,1.7 3.7,1.7s2,-1.7 6.4,-3.5c2.7,-1 5.9,-1.7 9.4,-2.7 3.2,-0.7 6.7,-1.7 9.1,-1.7 2.2,1.5 10.1,9.9 41.8,-2.5 29.9,-11.6 36.8,-12.9 41.8,-11.1 0.5,-1.2 1,-3.5 8.7,-3.2 0,-3.2 -6.4,-14.1 -6.4,-14.1l-35.3,-12.1h-19.3L395.3,749l-32.1,18.3 -2.5,9.2z"/>
</group>
<group>
<clip-path android:pathData="M618,618m-585.6,0a585.6,585.6 0,1 1,1171.2 0a585.6,585.6 0,1 1,-1171.2 0"/>
<path android:fillColor="#927d49" android:pathData="M341.4,756.2s0.7,5.4 8.7,11.1c7.9,5.7 10.4,9.1 10.4,9.1s1.5,-2 2.7,-4c1.2,-2.2 2.2,-4.7 4.2,-5.4 4,-1.7 13.1,1.5 15.1,1 1.7,-0.5 1.2,-4 3,-4 4.2,-0.2 6.9,2.7 8.4,2.7s5.2,-0.2 5.7,-1 0.7,-9.1 6.4,-13.1c6.2,-4.4 13.8,-2.5 15.8,-1.5 0,1.5 0.2,5.2 4.2,5.4 4,0.2 4.4,-0.5 7.9,0.7s7.7,-0.2 9.6,5.7c1.7,-0.5 5.7,-1 4.7,-6.7 2,-1.5 3.7,-2.5 7.9,-8.4 1,-1.5 2.7,-3.2 4,-5.4 3.5,0 7.7,-0.7 13.3,4.2 -1.7,1.2 -2.7,2 -3.2,3.2 0.5,0.5 2.5,2.5 4,4.7 1.5,2 2.5,4.4 4.4,4.9 4.2,1.2 11.1,-0.5 18.8,0 7.4,0.5 13.6,3.2 16.3,4.9 1,-0.5 1,-0.7 3.5,-0.2 2.5,0.5 4.4,0.7 1.7,-2.5 1.5,0.7 3.2,2.2 4.7,0.7 1.5,-1.5 2.7,-3.7 6.9,-4.2s5.7,0.2 7.4,-4.2c2.2,-5.4 -5.4,-5.4 -5.4,-5.4s3.5,-3.2 7.4,-7.4c4.7,-4.4 10.1,-10.1 11.4,-17.1 2.2,-12.9 -10.4,-14.6 -10.4,-14.6l-61.1,18.8 -74.7,-3.7 -63.7,31.7z"/>
</group>
<group>
<clip-path android:pathData="M618,618m-585.6,0a585.6,585.6 0,1 1,1171.2 0a585.6,585.6 0,1 1,-1171.2 0"/>
<path android:fillColor="#6e6342" android:pathData="M286.5,579.7s-2,2.5 -3.2,8.4c-1.2,5.9 -0.7,5.2 -1.7,9.4s-13.3,46 -8.7,60.1 12.6,19.3 17.6,30.7c1,2.5 2,4 2.5,6.2 1.7,7.4 0.2,13.1 2.2,20.5 0.7,2.5 2.5,5.4 5.2,8.4 5.9,6.2 15.6,12.1 19.8,16.3 5.9,6.2 14.3,18.8 25,20 5.7,0.7 13.8,-1.7 20.5,-5.7 5.9,-3.7 9.6,-8.9 15.8,-11.9 4.4,-2.2 9.1,-3 13.3,-4 8.7,-1.7 16.6,-2 21.3,-1 7.2,1.5 24.2,6.7 33.6,6.7 3.7,0 12.4,-0.5 21.8,-3 14.3,-4.2 31.6,-11.4 43,-14.6 6.7,-2 12.1,-2.5 17.6,-3.7 9.4,-2.2 17.3,-5.2 21.8,-10.9 -3,-3.5 -6.7,-8.9 -26.7,-8.7 -22.7,0.5 -48.9,13.1 -61.8,15.1 -12.9,2 -18.5,3.7 -32.9,-1.5 -14.1,-5.2 -14.6,-8.7 -14.6,-8.7s-14.8,-10.4 -21,-36.8c-6.2,-26.5 0,-45.7 16.1,-64 4.2,-4.7 3.2,-8.9 3.2,-8.9s10.6,-14.3 7.7,-27.7c-3.2,-13.3 -23.7,-10.6 -23.7,-10.6l-113.7,19.9z"/>
</group>
<group>
<clip-path android:pathData="M618,618m-585.6,0a585.6,585.6 0,1 1,1171.2 0a585.6,585.6 0,1 1,-1171.2 0"/>
<path android:fillColor="#39331f" android:pathData="M303.6,624.2s-1.5,2.7 -1.2,5.4c0.2,2.7 1,6.2 9.1,14.1 6.9,6.9 5.4,14.6 5.4,14.6s3.5,0.7 12.9,-3.7c7.4,-3.5 9.9,2.7 9.9,2.7s3,-1.7 6.9,-2.2c4,-0.5 6.2,-2 6.2,-2s8.7,8.9 16.3,13.1c6.9,3.7 10.9,6.2 14.3,3.7 3.2,-2.2 3.2,-6.7 3,-8.7 0,0 -1,-2.5 -3,-5.2 -2.2,-3.2 -5.7,-6.9 -5.9,-9.9 -0.5,-6.9 5.2,-15.1 4,-17.1 -1.2,-2 -5.7,-2.5 -16.8,1.5 -11.5,3.8 -61.1,-6.3 -61.1,-6.3z"/>
</group>
<group>
<clip-path android:pathData="M618,618m-585.6,0a585.6,585.6 0,1 1,1171.2 0a585.6,585.6 0,1 1,-1171.2 0"/>
<path android:fillColor="#292311" android:pathData="M329.8,668.9s-5.7,-5.4 -3.7,-31.6c3,-0.2 7.2,0.7 7.2,0.7s3.1,20.3 -3.5,30.9z"/>
</group>
<group>
<clip-path android:pathData="M618,618m-585.6,0a585.6,585.6 0,1 1,1171.2 0a585.6,585.6 0,1 1,-1171.2 0"/>
<path android:fillColor="#252211" android:pathData="M289.2,559.7s1,-0.7 2.2,-2c-2,3.7 -11.1,18.5 -3.7,41.8 7.4,23.2 26,40.5 48.9,41.3s34.9,-10.4 48.7,-27.2c5.4,-6.7 11.6,-15.1 17.1,-20.8 8.2,-8.9 14.6,-11.4 14.6,-20 0,-17.6 -18,-25.5 -44.5,-33.4 -26.5,-7.9 -50.4,-6.9 -62.8,-1.5 -12.1,5.9 -17.3,12.1 -20.5,21.8z"/>
</group>
<group>
<clip-path android:pathData="M618,618m-585.6,0a585.6,585.6 0,1 1,1171.2 0a585.6,585.6 0,1 1,-1171.2 0"/>
<path android:fillColor="#3f3824" android:pathData="M374.3,676.8l2,-1s0.5,-7.9 3.7,-7.7c3.2,0.5 4.7,4.7 4.4,6.2 -0.2,1.5 -1,4 -4.2,3.7 -4.2,0.1 -5.9,-1.2 -5.9,-1.2z"/>
</group>
<group>
<clip-path android:pathData="M618,618m-585.6,0a585.6,585.6 0,1 1,1171.2 0a585.6,585.6 0,1 1,-1171.2 0"/>
<path android:fillColor="#2d2815" android:pathData="M365.4,643.2s2,-0.7 4.4,1.7c2,0 10.6,-1 13.3,0.7 2.7,1.7 3.5,3.2 3.5,3.2s-10.1,2.2 -15.6,0c-5.6,-1.9 -5.6,-5.6 -5.6,-5.6z"/>
</group>
<group>
<clip-path android:pathData="M618,618m-585.6,0a585.6,585.6 0,1 1,1171.2 0a585.6,585.6 0,1 1,-1171.2 0"/>
<path android:fillColor="#82764f" android:pathData="M409.9,644.7c0,-0.5 -5.4,-4.2 -11.1,-5.4 -1,-0.2 -1.2,0.5 -2,0.5 -0.5,-0.2 -0.7,-1.7 -0.7,-1.7l-3.2,1.7s-0.5,0.7 1.2,2c1.5,1.2 4,2.2 4.7,4.2 0.7,2 0.7,2.7 1,3 0.2,0.2 3.7,0 5.4,-1 1.7,-1.1 4.9,-2.6 4.7,-3.3z"/>
</group>
<group>
<clip-path android:pathData="M618,618m-585.6,0a585.6,585.6 0,1 1,1171.2 0a585.6,585.6 0,1 1,-1171.2 0"/>
<path android:fillColor="#2d2816" android:pathData="M359.4,665s1,-6.9 7.7,-7.2c6.9,-0.5 8.2,6.2 8.2,6.2l-4,4c0,-0.1 -3,-4.3 -11.9,-3z"/>
</group>
<group>
<clip-path android:pathData="M618,618m-585.6,0a585.6,585.6 0,1 1,1171.2 0a585.6,585.6 0,1 1,-1171.2 0"/>
<path android:fillColor="#574f35" android:pathData="M402.9,635.3s-3.7,4 -11.9,5.2c-0.7,-1 -2.2,-3 0,-6.2s4.7,-4.2 7.2,-3.2c2.5,0.5 4.2,2.2 4.7,4.2z"/>
</group>
<group>
<clip-path android:pathData="M618,618m-585.6,0a585.6,585.6 0,1 1,1171.2 0a585.6,585.6 0,1 1,-1171.2 0"/>
<path android:fillColor="#82764f" android:pathData="M418,640.2c0.2,-1 -0.5,-1.2 0,-1.7s3.2,-1.5 3.7,-1c0.2,0.2 0,1 0,2s0,2 -0.5,2.7c-0.7,1 -2.7,1.5 -3.7,1.2 -1,-0.2 -1.2,-1.7 -1.2,-2 0.5,-0.2 1.7,-0.7 1.7,-1.2zM435.1,629.4c0,-0.5 1.7,-1.5 2.7,-1.5 1.5,0 1.5,1.2 1.7,1.5 0.5,0.2 0.5,-0.2 1,0.7 0.5,1 1.2,2.5 0.7,3.5s-2.5,1.7 -3,1.5c-0.7,-0.5 -2.9,-5 -3.1,-5.7z"/>
</group>
<group>
<clip-path android:pathData="M618,618m-585.6,0a585.6,585.6 0,1 1,1171.2 0a585.6,585.6 0,1 1,-1171.2 0"/>
<path android:fillColor="#6e6342" android:pathData="M400.7,642.5s2.2,0.5 5.2,3c-1,0.7 -2.5,1.5 -2.5,1.5s-0.2,-2.3 -2.7,-4.5z"/>
</group>
<group>
<clip-path android:pathData="M618,618m-585.6,0a585.6,585.6 0,1 1,1171.2 0a585.6,585.6 0,1 1,-1171.2 0"/>
<path android:fillColor="#585136" android:pathData="M395.8,620.5c-0.5,-0.5 1.5,-1.7 2.7,-1.5 1.2,0.2 1.7,1 3,1.2s1.5,-0.5 2,-1 2.2,-0.2 2.5,0c0.2,0.2 0.5,0.7 0.5,0.7s0,-1.2 1,-2c1,-0.7 2,-0.7 2.7,-0.5 0.2,0.7 1.2,3.2 1,3.7 -0.2,0.5 -3.2,1.2 -3.7,0.7 0.5,1.2 2.7,3.7 3,4.2 0.2,0.5 -2.2,1.7 -3.2,1.5 -1.4,-0.1 -10,-5.1 -11.5,-7zM408.9,603.9s-0.2,-0.7 -1,-1.2c-0.7,-0.2 -3,0 -3,1.2s2,7.9 4.2,11.4c2.5,3.5 4.2,6.4 5.9,7.2 1.7,0.7 2.7,-0.5 3,-1 0.2,-0.5 0.7,-4.2 0.5,-12.9 -0.2,-8.7 -0.5,-17.1 -1,-17.6s-2.5,-0.5 -3.2,0.5 -5.2,10.9 -5.4,12.4z"/>
</group>
<group>
<clip-path android:pathData="M618,618m-585.6,0a585.6,585.6 0,1 1,1171.2 0a585.6,585.6 0,1 1,-1171.2 0"/>
<path android:fillColor="#574f35" android:pathData="M400,655.1s-3.5,-2.2 -6.9,-0.7c-3.2,1.5 -3,7.4 -3,7.4s2.2,1 4.4,-0.5 5,-4 5.5,-6.2z"/>
</group>
<group>
<clip-path android:pathData="M618,618m-585.6,0a585.6,585.6 0,1 1,1171.2 0a585.6,585.6 0,1 1,-1171.2 0"/>
<path android:fillColor="#82764f" android:pathData="M406.6,663c-0.2,-2 -2,-2 -2,-3 0.2,-1 1.2,-1.7 2.2,-1.7 1,0 2,1.2 3.2,2 1.2,0.7 3,2 3.2,3.5s-2,5.7 -4.4,5.7c-2.4,-0.1 -1.7,-4.5 -2.2,-6.5zM425.9,660.3s-4,1.2 -3.7,0c0.2,-1.2 1.2,-1.5 2.5,-1.5 0.5,-0.5 1.5,-1.2 2.5,-1.2s1.5,0.5 1.5,0.5 2.7,-1.2 3.5,-0.5c0.7,0.7 0.2,0.7 0.7,1.5 0.5,0.7 1.2,2.2 1.2,3s-3,2.5 -5.4,2.2c-2.8,-0.6 -2.3,-3.5 -2.8,-4zM449.2,655.8s1.2,0.7 0.2,1.5c-0.7,0.7 -4.2,2 -7.2,2.2 -3,0 -5.7,0.5 -5.7,-0.5s2.5,-3 4,-3.5c0.5,-0.7 1.5,-1.2 2.5,-1.2 1.2,0 5.9,-0.5 7.2,-0.7 1.2,-0.2 2.2,0.5 1.5,1.5 -0.3,0.7 -2.5,0.7 -2.5,0.7zM456.1,624.9s-1.5,3.2 -3.2,3.2c-1.7,-0.2 -1.7,-0.7 -1.7,-1.2 0,-0.7 1.7,-2.5 1.5,-3 -0.5,0 -1.7,0 -1.5,-1.2 0,-1 1.7,-2.2 3.2,-2 0.5,-0.5 2.2,-1.5 4,-1.5 1.7,0 3.2,0.5 3.2,1.5s-2,3.2 -2.7,3.7c-0.8,0.8 -1.8,1.3 -2.8,0.5zM433.3,684s-2,0.2 -2,1.2c0,0.5 0.5,0.5 1.2,0.2 0.5,0 1.2,-0.2 1.2,-0.2 0.2,0.2 0.2,1.2 1.7,1.2 0.7,0 2.2,-0.5 3.5,-1.2 1.2,-0.5 2.2,-1 2.2,-2 -0.5,-1.7 -1.5,-2.5 -3,-2.5s-2.2,0.5 -2.2,0.5 -0.5,-1 -2.2,0c-1.7,1 -1.5,1 -1,1.5 0.9,0.8 0.6,1.3 0.6,1.3zM422,694.4c0,-0.5 2.5,-1.5 3.2,-1.2 0.7,0.2 2.7,4 2.7,4.4 0,0.5 -2.5,1.7 -3.5,1.7s-2.7,-1.7 -2.7,-2c0,-0.2 1.2,-0.5 1.2,-0.7 0.3,-0.5 -0.9,-1.7 -0.9,-2.2zM414.1,679.8c0.5,-0.2 0.5,-0.7 1.2,-1.2s1.5,-0.2 1.5,-0.2 0.5,-1 1.7,-1.2c1.2,-0.2 2.2,0 2,0.5 0,1.5 1,2.5 1,3.7 0,1.2 -0.7,2.7 -3.2,3.7 -2.5,0.7 -5.9,0.7 -6.4,0.5 -0.5,-0.2 -1,-2.2 -0.5,-3.2 0.4,-1.1 1.9,-2.1 2.7,-2.6z"/>
</group>
<group>
<clip-path android:pathData="M618,618m-585.6,0a585.6,585.6 0,1 1,1171.2 0a585.6,585.6 0,1 1,-1171.2 0"/>
<path android:fillColor="#6e6342" android:pathData="M417.3,680.5s-1.7,1 -1.7,1.5c-0.2,0.5 -0.2,1.2 -0.2,1.5s2.2,-0.2 2.5,-0.5c0.1,-0.2 -0.6,-2 -0.6,-2.5z"/>
</group>
<group>
<clip-path android:pathData="M618,618m-585.6,0a585.6,585.6 0,1 1,1171.2 0a585.6,585.6 0,1 1,-1171.2 0"/>
<path android:fillColor="#585136" android:pathData="M402.4,675.8c1,0.2 2.7,0 4,0.5 1,0.5 1.7,1.5 0.7,2.7 -1,1.2 -2,3 -4.2,2.7 -2.5,-0.2 -4.9,-1.5 -4.9,-2.5 -0.2,-1.2 0.5,-2.7 1.2,-3.5 1,-0.8 1.5,-0.3 3.2,0.1z"/>
</group>
<group>
<clip-path android:pathData="M618,618m-585.6,0a585.6,585.6 0,1 1,1171.2 0a585.6,585.6 0,1 1,-1171.2 0"/>
<path android:fillColor="#574f35" android:pathData="M401.2,676.8s-3.2,2.5 -4,3.7c-1,1.2 -5.9,7.4 -7.4,8.7 0.5,-1 1.7,-2.5 1.7,-2.5s-3,1.7 -4.2,5.4c-1.2,3.7 6.7,5.7 11.9,7.2s7.2,2 7.2,2 -3,-4.4 -4.9,-9.1c-2,-4.7 -3,-5.2 -1.7,-7.4 1,-2.2 2.5,-3.7 2.5,-5.4 -0.6,-1.6 -1.1,-2.6 -1.1,-2.6z"/>
</group>
<group>
<clip-path android:pathData="M618,618m-585.6,0a585.6,585.6 0,1 1,1171.2 0a585.6,585.6 0,1 1,-1171.2 0"/>
<path android:fillColor="#252211" android:pathData="M287.2,684.7s0.7,0.2 2.2,0c1.5,-0.2 17.1,-5.9 33.4,-4.9 7.2,0.5 20,1.5 36.1,5.9 20.5,5.4 46,16.1 62.5,22.2 4.4,1.7 8.7,4.7 11.9,5.9 12.6,4.9 13.1,4.9 20.5,6.2 8.7,1.2 17.6,-1.7 26.9,-3.7 11.4,-2.5 30.9,-3.7 48,-6.2 8.9,-1.2 16.3,-3.7 16.3,-3.7s-13.6,13.6 -46.2,18.5c-16.3,2.5 -29.7,1.7 -39.8,0.5 -10.4,-1 -17.3,-2.5 -22.5,-4 -5.9,-1.7 -18,-6.2 -32.9,-9.9 -10.4,-2.7 -22,-4.7 -35.3,-7.2 -32.8,-6 -68.4,-12.9 -81.1,-19.6z"/>
</group>
<group>
<clip-path android:pathData="M618,618m-585.6,0a585.6,585.6 0,1 1,1171.2 0a585.6,585.6 0,1 1,-1171.2 0"/>
</group>
<group>
<clip-path android:pathData="M618,618m-585.6,0a585.6,585.6 0,1 1,1171.2 0a585.6,585.6 0,1 1,-1171.2 0"/>
<path android:fillColor="#cfb66c" android:pathData="M270.2,552c-3.5,-3.2 -7.2,-6.4 -10.6,-9.6 -3.5,-3.2 -6.9,-6.4 -10.4,-9.6l-10.4,-9.9c-1.7,-1.7 -3.5,-3.2 -5.2,-4.9 -1.7,-1.5 -3.7,-3.2 -5.4,-4.7 -13.8,-13.1 -27.7,-26.2 -41.3,-39.3 14.1,12.9 27.9,25.7 42,38.8l4.9,4.9c1.7,1.7 3.5,3.2 5.2,4.9l10.4,9.6c3.5,3.2 6.9,6.4 10.4,9.9s6.9,6.7 10.4,9.9zM87,550s50.2,5.2 74.7,8.7c22.7,3.2 93.7,14.1 93.7,14.1M87,550c14.1,1.2 28.2,2.7 42.3,4.2 7.2,0.7 14.1,1.5 21,2.2l10.6,1.2c3.5,0.5 6.9,1 10.4,1.5l42,6.7 21,3.5c6.9,1.2 13.8,2.5 21,3.7 -6.9,-0.7 -14.1,-1.7 -21,-2.7l-21,-3 -42,-6.2c-3.5,-0.5 -6.9,-1.2 -10.4,-1.7l-10.6,-1.2c-6.9,-0.7 -14.1,-1.7 -21,-2.5 -14.1,-1.7 -28.2,-3.5 -42.3,-5.7zM250.4,585.9s-53.6,13.6 -71.7,18.8C160.9,609.6 107,626 107,626"/>
</group>
<group>
<clip-path android:pathData="M618,618m-585.6,0a585.6,585.6 0,1 1,1171.2 0a585.6,585.6 0,1 1,-1171.2 0"/>
<path android:fillColor="#cfb66c" android:pathData="M250.4,585.9c-11.9,3.5 -23.7,6.9 -35.8,10.1l-35.8,9.6c-11.9,3.5 -23.7,6.9 -35.6,10.4l-17.8,4.9c-5.9,1.7 -11.9,3.2 -18,4.9 5.9,-2 11.9,-4 17.8,-5.7l17.8,-5.7c11.9,-3.7 23.7,-7.2 35.6,-10.9 12.1,-3 24,-6.2 36.1,-9.1 11.5,-2.9 23.6,-5.8 35.7,-8.5zM114.5,659c5.9,-2.2 73.9,-33.9 89.7,-41.3 7.9,-3.7 30.9,-11.9 30.9,-11.9"/>
</group>
<group>
<clip-path android:pathData="M618,618m-585.6,0a585.6,585.6 0,1 1,1171.2 0a585.6,585.6 0,1 1,-1171.2 0"/>
<path android:fillColor="#cfb66c" android:pathData="M114.5,659c5.2,-2 10.1,-4.4 15.1,-6.7l14.8,-6.9 29.7,-14.3c9.9,-4.7 19.5,-9.9 29.7,-14.3 5.2,-2.2 10.4,-4 15.6,-5.7l7.9,-2.5c2.7,-0.7 5.2,-1.5 7.9,-2.2 -9.9,4.7 -20.3,8.7 -30.2,13.3 -9.9,4.9 -20,8.9 -30.2,13.3l-30.2,13.3c-10.1,4.1 -20,8.5 -30.1,12.7zM121.1,686.7s61.6,-36.1 82.8,-47.7c11.1,-6.2 47,-24 47,-24"/>
</group>
<group>
<clip-path android:pathData="M618,618m-585.6,0a585.6,585.6 0,1 1,1171.2 0a585.6,585.6 0,1 1,-1171.2 0"/>
<path android:fillColor="#cfb66c" android:pathData="M121.1,686.7c10.4,-6.4 21,-12.9 31.6,-19.5l15.8,-9.6c5.4,-3.2 10.6,-6.2 16.1,-9.4 5.4,-3.2 10.6,-6.4 16.1,-9.4 2.7,-1.7 5.4,-3 8.2,-4.2l8.4,-4.2c11.1,-5.4 22.2,-10.9 33.9,-15.6 -10.6,6.7 -21.5,12.4 -32.4,18.3 -5.4,3 -10.9,5.7 -16.3,8.7 -5.4,3 -10.6,6.2 -16.1,9.1 -5.4,3.2 -10.6,6.2 -16.1,9.1l-16.3,8.9c-11.1,6 -22,11.9 -32.9,17.8zM250.4,622.9s-38.3,29.4 -50.7,38.8c-12.4,9.4 -48.9,35.8 -48.9,35.8"/>
</group>
<group>
<clip-path android:pathData="M618,618m-585.6,0a585.6,585.6 0,1 1,1171.2 0a585.6,585.6 0,1 1,-1171.2 0"/>
<path android:fillColor="#cfb66c" android:pathData="M250.4,622.9c-7.9,6.7 -16.3,13.1 -24.5,19.3l-24.7,19c-8.4,6.2 -16.6,12.6 -25,18.8 -8.4,6.2 -16.8,12.1 -25.7,17.8 7.9,-6.7 16.3,-12.9 24.7,-19s17.1,-12.1 25.2,-18.3l24.7,-19c8.5,-6.2 16.7,-12.6 25.3,-18.6zM206.7,692.9s8.9,-7.4 20,-17.8c13.8,-12.9 30.7,-29.4 36.1,-32.4"/>
</group>
<group>
<clip-path android:pathData="M618,618m-585.6,0a585.6,585.6 0,1 1,1171.2 0a585.6,585.6 0,1 1,-1171.2 0"/>
<path android:fillColor="#cfb66c" android:pathData="M206.7,692.9c4.4,-4.4 9.1,-8.7 13.8,-12.9l7.2,-6.2c2.2,-2 4.7,-4.2 6.9,-6.4 4.4,-4.4 8.7,-9.1 13.1,-13.6 2.2,-2.2 4.4,-4.4 6.9,-6.4 1.2,-1 2.5,-2 4,-2.7 1.2,-0.7 2.5,-2 4.2,-2.2 -1,1.5 -2.2,2.2 -3.2,3.5 -1.2,1 -2.2,2.2 -3.2,3.2 -2.2,2.2 -4.7,4.2 -6.9,6.2 -4.7,4 -9.6,7.9 -14.3,12.1 -4.7,4.2 -9.1,8.7 -13.8,12.9 -5.1,4.3 -9.8,8.5 -14.7,12.5zM266.5,652.9s-32.6,31.9 -39.3,37.1"/>
</group>
<group>
<clip-path android:pathData="M618,618m-585.6,0a585.6,585.6 0,1 1,1171.2 0a585.6,585.6 0,1 1,-1171.2 0"/>
<path android:fillColor="#cfb66c" android:pathData="M266.5,652.9c-3,3.5 -6.2,6.7 -9.4,9.6l-9.9,9.4c-3.2,3.2 -6.2,6.4 -9.6,9.6 -3.5,3 -6.7,5.9 -10.4,8.7l9.6,-9.4c3.2,-3.2 6.7,-5.9 10.1,-9.1l9.6,-9.4c3.3,-3.3 6.5,-6.5 10,-9.4zM268,670.2s-3.7,10.9 -10.6,24.5c-8.4,16.8 -21,37.8 -26.5,48.5"/>
</group>
<group>
<clip-path android:pathData="M618,618m-585.6,0a585.6,585.6 0,1 1,1171.2 0a585.6,585.6 0,1 1,-1171.2 0"/>
<path android:fillColor="#cfb66c" android:pathData="M268,670.2c0,3.7 -1,6.9 -2.2,10.1 -1.2,3.2 -2.5,6.4 -4,9.4s-3.2,6.2 -4.9,9.1c-1.7,3 -3.7,5.9 -5.2,8.9l-10.1,17.8c-3.5,5.9 -6.9,11.9 -10.6,17.6 2.5,-6.4 5.9,-12.4 9.1,-18.3 3.5,-5.9 6.7,-11.9 9.9,-18 1.5,-3 3,-6.2 4.2,-9.4 1.5,-3.2 3,-6.2 4.2,-9.1 1.5,-3.2 2.7,-6.2 4.2,-9.1 1.7,-3.1 3.1,-6.1 5.4,-9z"/>
</group>
<group>
<clip-path android:pathData="M618,618m-585.6,0a585.6,585.6 0,1 1,1171.2 0a585.6,585.6 0,1 1,-1171.2 0"/>
<path android:fillColor="#dec270" android:pathData="M303.6,752.2s-9.9,13.1 -8.9,29.7c2.7,-8.7 6.1,-22 8.9,-29.7zM313,765.3s-3.5,35.6 -6.4,53.1c4.1,-20.2 4.9,-18.5 6.4,-53.1zM378.5,820.5s-14.8,43.5 -15.1,55.6c3.2,-12.4 9.4,-37.8 15.1,-55.6z"/>
</group>
<group>
<clip-path android:pathData="M618,618m-585.6,0a585.6,585.6 0,1 1,1171.2 0a585.6,585.6 0,1 1,-1171.2 0"/>
<path android:fillColor="#cbaf59" android:pathData="M413.1,749.5s24,39.6 42,73.4c-4.9,-17 -16.1,-48.2 -42,-73.4z"/>
</group>
<group>
<clip-path android:pathData="M618,618m-585.6,0a585.6,585.6 0,1 1,1171.2 0a585.6,585.6 0,1 1,-1171.2 0"/>
<path android:fillColor="#e3c677" android:pathData="M477.6,807.8s18.8,32.4 35.6,71.9c-2,-17 -7.4,-46.1 -35.6,-71.9z"/>
</group>
<group>
<clip-path android:pathData="M618,618m-585.6,0a585.6,585.6 0,1 1,1171.2 0a585.6,585.6 0,1 1,-1171.2 0"/>
<path android:fillColor="#ecd592" android:pathData="M667.2,866.2c4,-2.5 11.9,-16.1 18.8,-19.5 6.9,-3.5 12.1,-4.2 18.3,-11.1 6.2,-7.2 7.9,-11.6 21.5,-17.3 19,-8.2 5.9,-18.8 5.9,-18.8s3.2,-3.2 6.7,-5.7c4.9,-3.7 10.6,-8.2 10.1,-16.1 -0.7,-13.3 -3.2,-32.6 -14.1,-43.8 10.6,-2.2 30.9,-3.7 43.5,-6.9 14.6,-3.7 21.3,-8.9 21.3,-8.9s-8.4,-14.3 5.2,-28.7c13.6,-14.3 24.7,-23 32.9,-39.1 -9.4,-1.2 -23.7,-6.2 -60.3,7.7 2.7,1.2 5.7,3.2 5.7,3.2s-22.5,6.2 -30.7,13.1c-14.3,12.1 -16.1,22 -31.6,29.4 -15.6,7.4 -31.1,5.4 -44,11.4 -12.9,5.9 -14.8,11.1 -19.5,13.3 1,1.2 -0.2,3.2 1.7,4.9 -1.2,1.7 -8.2,13.1 -15.3,13.1 0.7,2.7 6.7,4.7 6.7,4.7s-4.4,3.2 -15.6,4c5.7,5.9 11.1,12.4 26,21.8 -1.2,2.5 -6.2,6.2 -4.2,10.9 2.2,4.7 7.9,11.1 30.7,16.3 -11.6,0.5 -25.2,3.2 -43.5,0.7 -18.3,-2.2 -21.3,-3.5 -32.6,-0.7 1.2,1.2 4.4,1.2 7.2,4.4 -3,0.2 -21.8,-2.2 -28.2,6.2 -6.7,8.7 -9.6,23 -9.1,32.6 -3.5,1.7 -6.9,4.7 -5.2,10.9s10.6,8.2 16.3,12.1c5.7,4.2 6.2,5.7 11.6,4.7 5.7,-1.2 14.1,-6.9 19,-6.9s8.4,3.7 8.4,3.7 13.3,-6.4 14.6,-5.2c1.2,1.2 0.2,8.9 1.5,10.1 1.3,0.9 16.3,-8 20.3,-10.5z"/>
</group>
<path android:fillAlpha="0.8" android:fillColor="#fff" android:pathData="M957.9,466c-62.5,-161.4 -217,-191.3 -217,-191.3H300.1l1.7,164.4h87.8v367.1h-89.5v164.1h428.6c103.3,0 186.1,-103.8 186.1,-103.8C1047.4,678.3 957.9,466 957.9,466zM731,755.9s-33.6,48.5 -70.2,48.5h-73.2l-1.7,-364.9h93.9s43.5,9.1 73.9,95.2c0,0 40.3,123.3 -22.7,221.2z" android:strokeAlpha="0.8"/>
</vector>
-9
View File
@@ -1,9 +0,0 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="300dp" android:viewportHeight="1080" android:viewportWidth="1080" android:width="300dp">
<path android:fillColor="#209CE9" android:pathData="M540,540m-540,0a540,540 0,1 1,1080 0a540,540 0,1 1,-1080 0"/>
<path android:fillColor="#FFFFFF" android:pathData="M792.9,881h-52.5L541.1,570.6L338.8,881h-52.1l226.8,-351.7L306.9,206.2h53.5L542,490.4l185.4,-284.2h50.2L568.8,528.4L792.9,881z"/>
<path android:fillColor="#FFFFFF" android:pathData="M336.5,508.7h408.3v38.4H336.5V508.7zM336.5,623.9h408.3v38.4H336.5L336.5,623.9z"/>
</vector>
-15
View File
@@ -1,15 +0,0 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="64dp"
android:height="64dp"
android:viewportWidth="64"
android:viewportHeight="64">
<path
android:pathData="M61.5,19.5C54.6,3.3 35.8,-4.3 19.5,2.5s-23.9,25.7 -17,41.9s25.7,23.9 41.9,17c7.7,-3.2 13.8,-9.3 17,-17C64.8,36.5 64.8,27.5 61.5,19.5z"
android:fillColor="#FF2AD4"/>
<path
android:pathData="M7.4,26.3h8.2v15.6v6.4l4.6,-4.4l11.9,-11.2l11.8,11.2l4.6,4.4v-6.4l0,-15.6h8.1c0.4,1.8 0.6,3.7 0.6,5.6c0,13.9 -11.3,25.3 -25.2,25.3S6.7,45.8 6.7,31.9C6.7,30 6.9,28.1 7.4,26.3M5.3,23.5C0.7,38.3 8.9,54 23.7,58.6s30.5,-3.7 35,-18.4c0.8,-2.7 1.3,-5.5 1.3,-8.3c0,-2.8 -0.4,-5.6 -1.3,-8.4H45.8l-0.1,18.4L32.1,28.8L18.3,41.9V23.5H5.3z"
android:fillColor="#FFFFFF"/>
<path
android:pathData="M18.3,20.8H21v2.8v12l9.1,-8.7l1.9,-1.8l1.9,1.8l9.1,8.6v-12v-2.7h14.7C51.5,6.6 34.9,0.2 20.8,6.4c-6.4,2.8 -11.6,8 -14.4,14.4H18.3z"
android:fillColor="#FFCC00"/>
</vector>
-95
View File
@@ -1,95 +0,0 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:aapt="http://schemas.android.com/aapt"
android:width="119dp"
android:height="120dp"
android:viewportWidth="119"
android:viewportHeight="120">
<path
android:pathData="M69.59,0H83.33C88.03,-0 91.99,-0 95.23,0.27C98.62,0.55 101.85,1.16 104.92,2.76C109.59,5.18 113.39,9.05 115.77,13.81C117.33,16.93 117.93,20.22 118.21,23.67C118.47,26.97 118.47,31 118.47,35.79V49.06C118.47,53.86 118.47,57.89 118.21,61.19C117.93,64.64 117.33,67.93 115.77,71.05C113.39,75.81 109.59,79.68 104.92,82.1C101.85,83.69 98.62,84.31 95.23,84.59C91.99,84.86 88.03,84.86 83.33,84.86H42.3C39.42,84.86 36.82,83.1 35.7,80.39C34.59,77.68 35.18,74.56 37.19,72.47L71.07,37.32L81.28,47.53L59.35,70.29H83.04C88.11,70.29 91.48,70.28 94.07,70.06C96.57,69.86 97.71,69.49 98.42,69.12C100.4,68.09 102.01,66.45 103.02,64.44C103.38,63.71 103.74,62.55 103.95,60C104.16,57.36 104.17,53.93 104.17,48.77V36.09C104.17,30.92 104.16,27.49 103.95,24.86C103.74,22.31 103.38,21.15 103.02,20.42C102.01,18.41 100.4,16.77 98.42,15.74C97.71,15.37 96.57,15 94.07,14.79C91.48,14.58 88.11,14.57 83.04,14.57H69.88C64.75,14.57 61.34,14.58 58.73,14.8C56.19,15.01 55.05,15.38 54.33,15.76C52.34,16.8 50.72,18.46 49.73,20.5C49.37,21.24 49.01,22.41 48.84,24.99C48.65,27.66 48.69,31.13 48.75,36.35L48.82,42.34L34.51,42.52L34.44,36.23C34.38,31.39 34.33,27.31 34.56,23.98C34.8,20.49 35.37,17.16 36.92,14C39.28,9.18 43.09,5.26 47.79,2.8C50.88,1.18 54.13,0.56 57.56,0.27C60.83,-0 64.83,-0 69.59,0Z"
android:fillType="evenOdd">
<aapt:attr name="android:fillColor">
<gradient
android:startX="56.45"
android:startY="84.2"
android:endX="57.42"
android:endY="-0.11"
android:type="linear">
<item android:offset="0.43" android:color="#FF498FFD"/>
<item android:offset="1" android:color="#FF16D1D6"/>
</gradient>
</aapt:attr>
</path>
<path
android:pathData="M69.59,0H83.33C88.03,-0 91.99,-0 95.23,0.27C98.62,0.55 101.85,1.16 104.92,2.76C109.59,5.18 113.39,9.05 115.77,13.81C117.33,16.93 117.93,20.22 118.21,23.67C118.47,26.97 118.47,31 118.47,35.79V49.06C118.47,53.86 118.47,57.89 118.21,61.19C117.93,64.64 117.33,67.93 115.77,71.05C113.39,75.81 109.59,79.68 104.92,82.1C101.85,83.69 98.62,84.31 95.23,84.59C91.99,84.86 88.03,84.86 83.33,84.86H42.3C39.42,84.86 36.82,83.1 35.7,80.39C34.59,77.68 35.18,74.56 37.19,72.47L71.07,37.32L81.28,47.53L59.35,70.29H83.04C88.11,70.29 91.48,70.28 94.07,70.06C96.57,69.86 97.71,69.49 98.42,69.12C100.4,68.09 102.01,66.45 103.02,64.44C103.38,63.71 103.74,62.55 103.95,60C104.16,57.36 104.17,53.93 104.17,48.77V36.09C104.17,30.92 104.16,27.49 103.95,24.86C103.74,22.31 103.38,21.15 103.02,20.42C102.01,18.41 100.4,16.77 98.42,15.74C97.71,15.37 96.57,15 94.07,14.79C91.48,14.58 88.11,14.57 83.04,14.57H69.88C64.75,14.57 61.34,14.58 58.73,14.8C56.19,15.01 55.05,15.38 54.33,15.76C52.34,16.8 50.72,18.46 49.73,20.5C49.37,21.24 49.01,22.41 48.84,24.99C48.65,27.66 48.69,31.13 48.75,36.35L48.82,42.34L34.51,42.52L34.44,36.23C34.38,31.39 34.33,27.31 34.56,23.98C34.8,20.49 35.37,17.16 36.92,14C39.28,9.18 43.09,5.26 47.79,2.8C50.88,1.18 54.13,0.56 57.56,0.27C60.83,-0 64.83,-0 69.59,0Z"
android:fillType="evenOdd">
<aapt:attr name="android:fillColor">
<gradient
android:centerX="33.4"
android:centerY="25.69"
android:gradientRadius="54.1"
android:type="radial">
<item android:offset="0" android:color="#FF18CFD7"/>
<item android:offset="1" android:color="#0018CFD7"/>
</gradient>
</aapt:attr>
</path>
<path
android:pathData="M69.59,0H83.33C88.03,-0 91.99,-0 95.23,0.27C98.62,0.55 101.85,1.16 104.92,2.76C109.59,5.18 113.39,9.05 115.77,13.81C117.33,16.93 117.93,20.22 118.21,23.67C118.47,26.97 118.47,31 118.47,35.79V49.06C118.47,53.86 118.47,57.89 118.21,61.19C117.93,64.64 117.33,67.93 115.77,71.05C113.39,75.81 109.59,79.68 104.92,82.1C101.85,83.69 98.62,84.31 95.23,84.59C91.99,84.86 88.03,84.86 83.33,84.86H42.3C39.42,84.86 36.82,83.1 35.7,80.39C34.59,77.68 35.18,74.56 37.19,72.47L71.07,37.32L81.28,47.53L59.35,70.29H83.04C88.11,70.29 91.48,70.28 94.07,70.06C96.57,69.86 97.71,69.49 98.42,69.12C100.4,68.09 102.01,66.45 103.02,64.44C103.38,63.71 103.74,62.55 103.95,60C104.16,57.36 104.17,53.93 104.17,48.77V36.09C104.17,30.92 104.16,27.49 103.95,24.86C103.74,22.31 103.38,21.15 103.02,20.42C102.01,18.41 100.4,16.77 98.42,15.74C97.71,15.37 96.57,15 94.07,14.79C91.48,14.58 88.11,14.57 83.04,14.57H69.88C64.75,14.57 61.34,14.58 58.73,14.8C56.19,15.01 55.05,15.38 54.33,15.76C52.34,16.8 50.72,18.46 49.73,20.5C49.37,21.24 49.01,22.41 48.84,24.99C48.65,27.66 48.69,31.13 48.75,36.35L48.82,42.34L34.51,42.52L34.44,36.23C34.38,31.39 34.33,27.31 34.56,23.98C34.8,20.49 35.37,17.16 36.92,14C39.28,9.18 43.09,5.26 47.79,2.8C50.88,1.18 54.13,0.56 57.56,0.27C60.83,-0 64.83,-0 69.59,0Z"
android:fillType="evenOdd">
<aapt:attr name="android:fillColor">
<gradient
android:centerX="64.99"
android:centerY="49.78"
android:gradientRadius="20.28"
android:type="radial">
<item android:offset="0" android:color="#FF4990FE"/>
<item android:offset="0.35" android:color="#FF4990FE"/>
<item android:offset="1" android:color="#004990FE"/>
</gradient>
</aapt:attr>
</path>
<path
android:pathData="M69.59,0H83.33C88.03,-0 91.99,-0 95.23,0.27C98.62,0.55 101.85,1.16 104.92,2.76C109.59,5.18 113.39,9.05 115.77,13.81C117.33,16.93 117.93,20.22 118.21,23.67C118.47,26.97 118.47,31 118.47,35.79V49.06C118.47,53.86 118.47,57.89 118.21,61.19C117.93,64.64 117.33,67.93 115.77,71.05C113.39,75.81 109.59,79.68 104.92,82.1C101.85,83.69 98.62,84.31 95.23,84.59C91.99,84.86 88.03,84.86 83.33,84.86H42.3C39.42,84.86 36.82,83.1 35.7,80.39C34.59,77.68 35.18,74.56 37.19,72.47L71.07,37.32L81.28,47.53L59.35,70.29H83.04C88.11,70.29 91.48,70.28 94.07,70.06C96.57,69.86 97.71,69.49 98.42,69.12C100.4,68.09 102.01,66.45 103.02,64.44C103.38,63.71 103.74,62.55 103.95,60C104.16,57.36 104.17,53.93 104.17,48.77V36.09C104.17,30.92 104.16,27.49 103.95,24.86C103.74,22.31 103.38,21.15 103.02,20.42C102.01,18.41 100.4,16.77 98.42,15.74C97.71,15.37 96.57,15 94.07,14.79C91.48,14.58 88.11,14.57 83.04,14.57H69.88C64.75,14.57 61.34,14.58 58.73,14.8C56.19,15.01 55.05,15.38 54.33,15.76C52.34,16.8 50.72,18.46 49.73,20.5C49.37,21.24 49.01,22.41 48.84,24.99C48.65,27.66 48.69,31.13 48.75,36.35L48.82,42.34L34.51,42.52L34.44,36.23C34.38,31.39 34.33,27.31 34.56,23.98C34.8,20.49 35.37,17.16 36.92,14C39.28,9.18 43.09,5.26 47.79,2.8C50.88,1.18 54.13,0.56 57.56,0.27C60.83,-0 64.83,-0 69.59,0Z"
android:fillType="evenOdd">
<aapt:attr name="android:fillColor">
<gradient
android:centerX="40.23"
android:centerY="77.32"
android:gradientRadius="36.98"
android:type="radial">
<item android:offset="0" android:color="#FF4990FE"/>
<item android:offset="0.41" android:color="#FF4990FE"/>
<item android:offset="1" android:color="#004990FE"/>
</gradient>
</aapt:attr>
</path>
<path
android:pathData="M24.41,105.21C27,105.42 30.37,105.43 35.43,105.43H48.82C53.44,105.43 56.51,105.42 58.88,105.24C61.17,105.07 62.23,104.76 62.88,104.45C65.17,103.38 67.01,101.51 68.06,99.18C68.36,98.51 68.67,97.44 68.84,95.1C69.01,92.69 69.02,89.56 69.02,84.86H83.33L83.33,85.12C83.33,89.49 83.33,93.17 83.11,96.19C82.88,99.34 82.37,102.36 81.07,105.26C78.59,110.76 74.25,115.17 68.85,117.7C66,119.03 63.04,119.54 59.94,119.78C56.98,120 53.37,120 49.08,120L35.15,120C30.44,120 26.48,120 23.24,119.73C19.85,119.45 16.62,118.84 13.56,117.24C8.88,114.82 5.09,110.95 2.7,106.19C1.14,103.07 0.54,99.78 0.26,96.33C-0,93.03 -0,89 -0,84.21V70.94C-0,66.14 -0,62.11 0.26,58.81C0.54,55.36 1.14,52.07 2.7,48.95C5.09,44.19 8.88,40.32 13.56,37.9C16.62,36.31 19.85,35.69 23.24,35.41C26.48,35.14 30.44,35.14 35.15,35.14H76.17C80.12,35.14 83.33,38.4 83.33,42.43C83.33,46.45 80.12,49.71 76.17,49.71H35.43C30.37,49.71 27,49.72 24.41,49.94C21.9,50.14 20.77,50.51 20.05,50.88C18.07,51.91 16.46,53.55 15.45,55.56C15.09,56.29 14.73,57.45 14.52,60C14.31,62.64 14.31,66.07 14.31,71.23V83.91C14.31,89.07 14.31,92.51 14.52,95.14C14.73,97.69 15.09,98.85 15.45,99.58C16.46,101.59 18.07,103.23 20.05,104.26C20.77,104.63 21.9,105 24.41,105.21Z"
android:fillType="evenOdd">
<aapt:attr name="android:fillColor">
<gradient
android:startX="83.77"
android:startY="120.33"
android:endX="84.08"
android:endY="34.3"
android:type="linear">
<item android:offset="0" android:color="#FF2950FF"/>
<item android:offset="0.82" android:color="#FF498FFD"/>
</gradient>
</aapt:attr>
</path>
<path
android:pathData="M24.41,105.21C27,105.42 30.37,105.43 35.43,105.43H48.82C53.44,105.43 56.51,105.42 58.88,105.24C61.17,105.07 62.23,104.76 62.88,104.45C65.17,103.38 67.01,101.51 68.06,99.18C68.36,98.51 68.67,97.44 68.84,95.1C69.01,92.69 69.02,89.56 69.02,84.86H83.33L83.33,85.12C83.33,89.49 83.33,93.17 83.11,96.19C82.88,99.34 82.37,102.36 81.07,105.26C78.59,110.76 74.25,115.17 68.85,117.7C66,119.03 63.04,119.54 59.94,119.78C56.98,120 53.37,120 49.08,120L35.15,120C30.44,120 26.48,120 23.24,119.73C19.85,119.45 16.62,118.84 13.56,117.24C8.88,114.82 5.09,110.95 2.7,106.19C1.14,103.07 0.54,99.78 0.26,96.33C-0,93.03 -0,89 -0,84.21V70.94C-0,66.14 -0,62.11 0.26,58.81C0.54,55.36 1.14,52.07 2.7,48.95C5.09,44.19 8.88,40.32 13.56,37.9C16.62,36.31 19.85,35.69 23.24,35.41C26.48,35.14 30.44,35.14 35.15,35.14H76.17C80.12,35.14 83.33,38.4 83.33,42.43C83.33,46.45 80.12,49.71 76.17,49.71H35.43C30.37,49.71 27,49.72 24.41,49.94C21.9,50.14 20.77,50.51 20.05,50.88C18.07,51.91 16.46,53.55 15.45,55.56C15.09,56.29 14.73,57.45 14.52,60C14.31,62.64 14.31,66.07 14.31,71.23V83.91C14.31,89.07 14.31,92.51 14.52,95.14C14.73,97.69 15.09,98.85 15.45,99.58C16.46,101.59 18.07,103.23 20.05,104.26C20.77,104.63 21.9,105 24.41,105.21Z"
android:fillType="evenOdd">
<aapt:attr name="android:fillColor">
<gradient
android:centerX="83.77"
android:centerY="84.2"
android:gradientRadius="36.57"
android:type="radial">
<item android:offset="0.34" android:color="#FF2950FF"/>
<item android:offset="0.79" android:color="#002950FF"/>
</gradient>
</aapt:attr>
</path>
</vector>
+128 -54
View File
@@ -1,38 +1,32 @@
<?xml version="1.0" encoding="utf-8"?>
<?xml version='1.0' encoding='utf-8'?>
<resources>
<string name="no_tunnels">Žádné tunely ještě nebyly přidány!</string>
<string name="tunnel_mobile_data">Tunelování na mobilních datech</string>
<string name="tunnel_mobile_data">Tunelovat na mobilních datech</string>
<string name="privacy_policy">Otevřít zásady soukromí</string>
<string name="okay">OK</string>
<string name="thank_you">Děkujeme za používání WG Tunnel!</string>
<string name="add_tunnels_text">Přidat ze souboru nebo zipu</string>
<string name="open_file">Otevřít soubor</string>
<string name="add_from_qr">Přidat z QR kódu</string>
<string name="qr_scan">QR skenování</string>
<string name="tunnel_name">Název tunelu</string>
<string name="exclude">Vyloučit</string>
<string name="include">Zahrnout</string>
<string name="endpoint">Koncový bod</string>
<string name="always_on_vpn_support">Povolit trvalé připojení VPN</string>
<string name="location_services_not_detected">Služby polohy nebyly detekovány</string>
<string name="location_services_not_detected">Polohové služby nebyly detekovány</string>
<string name="vpn_on">VPN zapnuto</string>
<string name="vpn_off">VPN vypnuto</string>
<string name="create_import">Vytvořit od základu</string>
<string name="add_peer">Přidat peer</string>
<string name="comma_separated_list">seznam oddělený čárkami</string>
<string name="random">(náhodné)</string>
<string name="optional">(volitelné)</string>
<string name="preshared_key">Předsdílený klíč</string>
<string name="seconds">vteřin(y)</string>
<string name="seconds">Vteřin(y)</string>
<string name="cancel">Zrušit</string>
<string name="error_authentication_failed">Autentizace selhala</string>
<string name="error_authorization_failed">Nepovedlo se autorizovat</string>
<string name="enabled_app_shortcuts">Zapnout zkratky</string>
<string name="unknown_error">Došlo k neznámé chybě</string>
<string name="tunnel_on_wifi">Tunelovat na nedůvěryhodné Wi-Fi</string>
<string name="email_subject">WG Tunnel podpora</string>
<string name="email_chooser">Poslat email…</string>
<string name="use_kernel">Použít kernel modul</string>
<string name="error_ssid_exists">SSID již existuje</string>
<string name="error_root_denied">Oprávnění root zamítnuto</string>
<string name="error_no_file_explorer">Není nainstalován žádný průzkumník souborů</string>
@@ -43,7 +37,6 @@
<string name="set_primary_tunnel">Nastavit jako hlavní tunel</string>
<string name="use_tunnel_on_wifi_name">Použít tunel pro Wi-Fi</string>
<string name="edit_tunnel">Upravit tunel</string>
<string name="version">Verze</string>
<string name="junk_packet_count">Junk packet počet</string>
<string name="junk_packet_minimum_size">Junk packet minimální velikost</string>
<string name="junk_packet_maximum_size">Junk packet maximální velikost</string>
@@ -52,9 +45,7 @@
<string name="unsure_how">pokud si nejste jisti, jak postupovat</string>
<string name="see_the">Podívejte se na</string>
<string name="getting_started_guide">začátečnickou příručku</string>
<string name="error_file_format">Neplatný formát konfigurace</string>
<string name="error_file_extension">Soubor není ve formátu .conf nebo .zip</string>
<string name="turn_off_tunnel">Akce vyžaduje vypnutí tunelu</string>
<string name="tunnel_on_ethernet">Tunelovat na ethernetu</string>
<string name="prominent_background_location_message">Tato funkce vyžaduje oprávnění pro přístup k poloze na pozadí pro zapnutí monitorování Wi-Fi SSID, i když je aplikace zavřená. Pro více detailů, podívejte se prosím na zásady soukromí umístěné v kategorii Podpora.</string>
<string name="tunnels">Tunely</string>
@@ -65,24 +56,23 @@
<string name="allowed_ips">Povolené IP adresy</string>
<string name="name">Název</string>
<string name="auto_tunneling">Automatické tunelování</string>
<string name="turn_on_tunnel">Akce vyžaduje aktivní tunel</string>
<string name="interface_">Rozhraní</string>
<string name="rotate_keys">Rotovat klíče</string>
<string name="private_key">Soukromý klíč</string>
<string name="copy_public_key">Kopírovat veřejný klíč</string>
<string name="base64_key">base64 klíč</string>
<string name="base64_key">Base64 klíč</string>
<string name="docs_description">Přečíst si dokumentaci</string>
<string name="email_description">Poslat mi email</string>
<string name="location_services_missing_message">Aplikace nenašla žádné služby polohy zapnuté na Vašem zařízení. Dle Vašeho zařízení, tohle může způsobit, že funkce nedůvěryhodné Wi-Fi nedokáže přečíst jméno připojené Wi-Fi. Chcete i přesto pokračovat?</string>
<string name="delete_tunnel">Smazat tunel</string>
<string name="delete_tunnel_message">Jste si jisti, že chcete smazat tento tunel?</string>
<string name="yes">Ano</string>
<string name="all">vše</string>
<string name="all">Vše</string>
<string name="no_email_detected">Žádná emailová aplikace nebyla nalezena</string>
<string name="no_browser_detected">Žádný prohlížeč nebyl nalezen</string>
<string name="read_logs">Přečíst si logy</string>
<string name="pin_created">PIN úspěšně vytvořen</string>
<string name="enter_pin">Zadejte Váš PIN</string>
<string name="enter_pin">Zadejte PIN</string>
<string name="enable_app_lock">Zapnout zámek aplikace</string>
<string name="restart_on_ping">Restartovat při selhání pingu</string>
<string name="mobile_data_tunnel">Nastavit jako tunel pro mobilní data</string>
@@ -91,7 +81,7 @@
<string name="app_name">WG Tunnel</string>
<string name="mtu">MTU</string>
<string name="listen_port">Naslouchací port</string>
<string name="auto">(automaticky)</string>
<string name="auto">(Automaticky)</string>
<string name="kernel">Kernel</string>
<string name="persistent_keepalive">Udržování spojení</string>
<string name="restart_at_boot">Restartovat při spuštění</string>
@@ -103,29 +93,22 @@
<string name="dark">Tmavé</string>
<string name="dynamic">Podle systému</string>
<string name="notifications">Oznámení</string>
<string name="kill_switch">Vypínač</string>
<string name="wifi_name_via_shell">Název WiFi přes shell</string>
<string name="use_root_shell_for_wifi">Použít root shell pro získání názvu WiFi</string>
<string name="use_root_shell_for_wifi">Použít root shell pro získání Wi-Fi informací, zabrání potřebě oprávnění k poloze</string>
<string name="add_from_clipboard">Přidat ze schránky</string>
<string name="set_ethernet_tunnel">Nastavit jako tunel pro ethernet</string>
<string name="allow_lan_traffic">Povolit LAN provoz</string>
<string name="set_custom_ping_ip">Nastavit vlastní ping IP</string>
<string name="set_custom_ping_internal">Ping interval (s)</string>
<string name="logs">Logy</string>
<string name="automatic">Automaticky</string>
<string name="primary_tunnel">Hlavní tunel</string>
<string name="mobile_tunnel">Tunel pro mobilní data</string>
<string name="skip">Přeskočit</string>
<string name="kernel_not_supported">Kernel není podporován</string>
<string name="donate">Přispět na projekt</string>
<string name="enable_local_logging">Zapnout místní protokolování</string>
<string name="stop_on_internet_loss">Zastavit tunel při ztrátě internetu</string>
<string name="stop_on_no_internet">Zastavit při ztrátě internetu</string>
<string name="ethernet_tunnel">Ethernet tunel</string>
<string name="native_kill_switch">Nativní kill switch</string>
<string name="vpn_kill_switch">VPN kill switch</string>
<string name="auto_tunnel_channel_name">Kanál pro oznámení auto-tunelu</string>
<string name="kill_switch_options">Kill switch možnosti</string>
<string name="vpn_channel_description">Kanál pro oznámení o stavu VPN</string>
<string name="bypass_lan_for_kill_switch">Obejít LAN pro kill switch</string>
<string name="hide_scripts">Skrýt skripty</string>
@@ -138,11 +121,10 @@
<string name="auto_tunnel">Auto-tunel</string>
<string name="init_packet_magic_header">Init packet magic header</string>
<string name="response_packet_magic_header">Response packet magic header</string>
<string name="set_custom_ping_cooldown">Cooldown restartu pingu (s)</string>
<string name="trusted_wifi_names">Důvěryhodné názvy wifi</string>
<string name="trusted_wifi_names">Důvěryhodné názvy Wi-Fi</string>
<string name="advanced_settings">Rozšířené nastavení</string>
<string name="include_lan">Zahrnout LAN</string>
<string name="add_wifi_name">Přidat název wifi</string>
<string name="add_wifi_name">Přidat název Wi-Fi</string>
<string name="vpn_channel_name">Kanál pro oznámení VPN</string>
<string name="tunnel_specific_settings">Specifické nastavení tunelu</string>
<string name="show_scripts">Zobrazit skripty</string>
@@ -151,18 +133,14 @@
<string name="transport_packet_magic_header">Transport packet magic header</string>
<string name="underload_packet_magic_header">Underload packet magic header</string>
<string name="peer">Peer</string>
<string name="prefer_ipv4">Preferovat IPv4 připojení</string>
<string name="kill_switch_off">Vypnout kill switch na důvěryhodných</string>
<string name="vpn_settings">Systémové nastavení VPN</string>
<string name="never">nikdy</string>
<string name="sec">s</string>
<string name="handshake">handshake</string>
<string name="never">Nikdy</string>
<string name="handshake">Handshake</string>
<string name="start_auto">Spustit auto-tunel</string>
<string name="stop_auto">Zastavit auto-tunel</string>
<string name="local_logging">Místní protokolování</string>
<string name="learn_more">Zjistit více</string>
<string name="stop">zastavit</string>
<string name="server_ipv4">Překlad názvu hostitele IPv4</string>
<string name="stop">Stop</string>
<string name="always_on_message2">ujistěte se, že je pro všechny ostatní aplikace vypnutá funkce trvalé připojení VPN, a zkuste to znovu</string>
<string name="use_wildcards">Použít zástupné znaky(wildcards) pro názvy</string>
<string name="multiple">Několik</string>
@@ -171,33 +149,25 @@
<string name="join_matrix">Připojte se k Matrix komunitě</string>
<string name="join_telegram">Připojte se k Telegram komunitě</string>
<string name="post_down">Po deaktivaci</string>
<string name="invalid_config_error">chyba_neplatné_konfigurace</string>
<string name="error_download_failed">Nepodařilo se stáhnout konfiguraci</string>
<string name="select">Vybrat</string>
<string name="save">Uložit</string>
<string name="dns_resolve_error">Chyba překladu dns</string>
<string name="bio_update_required">Vyžadována aktualizace biometrického zabezpečení</string>
<string name="dns_resolve_error">Překlad DNS selhal</string>
<string name="export_logs">Exportovat uložené protokoly</string>
<string name="add_tunnel">Přidat tunel</string>
<string name="delete_logs">Smazat a vyčistit protokoly</string>
<string name="dropdown">Rozbalovací nabídka</string>
<string name="select_all">Vybrat vše</string>
<string name="share">Sdílet</string>
<string name="trusted_ssid_value_description">Odeslat SSID</string>
<string name="app_settings">nastavení aplikace</string>
<string name="debounce_delay">Debounce zpoždění</string>
<string name="always_on_message">Autorizace připojení VPN byla zamítnuta. Zkontrolujte prosím</string>
<string name="bio_not_created">Biometrické údaje nebyly vytvořeny</string>
<string name="bio_not_supported">Biometrie není podporována</string>
<string name="bio_subtitle">Přihlášení pomocí biometrických údajů</string>
<string name="config_error">Chybná konfigurace</string>
<string name="config_error">Neplatná konfigurace</string>
<string name="prominent_background_location_title">Zpřístupnění stávající polohy na pozadí</string>
<string name="vpn_denied_dialog_title">Povolení zamítnuto</string>
<string name="app_permission_title">Řídicí most pro WG tunely</string>
<string name="app_permission_description">Ovládání funkcí tunelu a automatického tunelu.</string>
<string name="enable_remote_app_control">Povolit vzdálené ovládání aplikace</string>
<string name="tunnel_starting">Spuštění tunelu</string>
<string name="bio_auth_title">Biometrické ověření</string>
<string name="nothing_here_yet">Zatím zde nic není!</string>
<string name="export_success">Export byl úspěšně dokončen</string>
<string name="download">Stáhnout</string>
@@ -215,7 +185,7 @@
<string name="checking_for_update">Kontrola aktualizací</string>
<string name="add_from_url">Přidat z adresy URL</string>
<string name="inactive">Neaktivní</string>
<string name="auth_error">Chyba: neautorizováno</string>
<string name="auth_error">Neautorizováno</string>
<string name="kernel_name_error">Chyba názvu modulu jádra</string>
<string name="export_failed">Export se nezdařil</string>
<string name="delete">Smazat</string>
@@ -223,32 +193,136 @@
<string name="export_tunnels_amnezia">Exportovat tunely jako Amnezia</string>
<string name="remote_key_template">Klíč: %1$s</string>
<string name="active">Aktivní</string>
<string name="service_running_error">Chyba: Služba není spuštěna</string>
<string name="service_running_error">Služba není spuštěna</string>
<string name="wifi_name_template">Aktivní: %1$s</string>
<string name="tunnel_error_template">Tunel selhal s: %1$s</string>
<string name="camera_permission_required">Vyžadováno oprávnění k použití fotoaparátu</string>
<string name="info">Informace</string>
<string name="copy">Kopírovat</string>
<string name="status">Stav</string>
<string name="launch_app_settings">Spustit nastavení aplikace</string>
<string name="tunnel_running">Tunel je v provozu</string>
<string name="wildcards_active">Wildcards aktivní</string>
<string name="root_accepted">Root shell přijata</string>
<string name="background_location_message">Autorizace povolit vždy polohu a/nebo přesná poloha je vyžadováno pro tuto funkci. Viz</string>
<string name="update_check_unsupported">Kontrola aktualizací není u tohoto typu sestavení podporována.</string>
<string name="background_location_message2">abyste se ujistili, že jsou tato oprávnění povolena</string>
<string name="darker">Tmavší</string>
<string name="amoled">AMOLED</string>
<string name="default_ping_ip">(nepovinné, výchozí hodnota je peers)</string>
<string name="monitoring_state_changes">Monitorování změn stavu</string>
<string name="pre_up">Před aktivací</string>
<string name="pre_down">Před deaktivací</string>
<string name="post_up">Po aktivaci</string>
<string name="optional_default">"nepovinné, výchozí: "</string>
<string name="flavor_template">Varianta: %1$s</string>
<string name="security_template">Zabezpečení: %1$s</string>
<string name="done">Hotovo</string>
<string name="wireguard">WireGuard</string>
<string name="amnezia">Amnezia</string>
<string name="show_qr">Zobrazit QR kód</string>
<string name="current_template">Aktuální: %1$s</string>
<string name="wifi_detection_method">Metoda detekce Wi-Fi</string>
<string name="_default">Výchozí</string>
<string name="legacy">Legacy</string>
<string name="root">Root</string>
<string name="shizuku">Shizuku</string>
<string name="release_notes">Poznámky k vydání</string>
<string name="shizuku_not_detected">Shizuku nebyl detekován</string>
<string name="sort">Třídit</string>
<string name="move_up">Posunout nahoru</string>
<string name="move_down">Přesunout dolů</string>
<string name="use_android_recommended">Použije metodu doporučenou systémem Android pro získání informací o síti Wi-Fi v závislosti na verzi systému Android</string>
<string name="legacy_api_description">Použije zastarou metodu systému Android 12 pro získání informací o síti Wi-Fi, která omezuje dotazy na polohu, ale na novějších zařízeních nemusí spolehlivě fungovat</string>
<string name="use_shell_via_shizuku">Použít shell přes Shizuku k získání informací o Wi-Fi, čímž se zabrání potřebě povolení k poloze na zařízeních, která nejsou rootnutá</string>
<string name="drag_handle">Přetáhnout úchyt</string>
<string name="error_tunnel_name">Název tunelu musí v kernel režimu obsahovat 15 znaků nebo méně</string>
<string name="tunnel">tunel</string>
<string name="tunnel_item_description">%1$s, %2$s, %3$s</string>
<string name="warning">Varování</string>
<string name="location_permissions">Oprávnění k přístupu k poloze</string>
<string name="open_settings">Otevřít nastavení</string>
<string name="location_permissions_missing">Chybí oprávnění k přístupu k poloze</string>
<string name="fix">Opravit</string>
<string name="start">Start</string>
<string name="auto_tunnel_running">Automatický tunel je spuštěn</string>
<string name="auto_tunnel_not_running">Automatický tunel není spuštěn</string>
<string name="pinger_bounce_successful">Tunel byl úspěšně restartován pomocí pingera.</string>
<string name="tunnel_monitoring">Monitorování tunelu</string>
<string name="ip_or_hostname">IP adresa nebo název hostitele</string>
<string name="attempts_per_interval">Pokusů o ping za interval</string>
<string name="timeout_all_attempts">Celkový časový limit pro všechny pokusy</string>
<string name="display_detailed_ping_stats">Zobrazit podrobné statistiky pingů</string>
<string name="rx_template">RX: %1$s MB</string>
<string name="tx_template">TX: %1$s MB</string>
<string name="ping_success_template">Poslední úspěšný ping: %1$s</string>
<string name="packets_sent_template">Odeslané pakety: %1$s</string>
<string name="packet_loss_template">Ztracené pakety: %.2f%%</string>
<string name="_true">Pravda</string>
<string name="restarting_app">Restartování aplikace pro použití změn…</string>
<string name="restore_failed">Obnovení ze zálohy se nepodařilo.</string>
<string name="backup_failed">Nepodařilo se vytvořit zálohu.</string>
<string name="backup_application">Zálohovat data aplikace</string>
<string name="restore_application">Obnovit ze zálohy</string>
<string name="proxy">Proxy</string>
<string name="socks_5_proxy">SOCKS5 proxy</string>
<string name="http_proxy">HTTP proxy</string>
<string name="username">Uživatelské jméno</string>
<string name="password">Heslo</string>
<string name="proxy_credentials">Přihlašovací údaje pro proxy</string>
<string name="proxy_settings">Nastavení proxy</string>
<string name="vpn">VPN</string>
<string name="android_integrations">Integrace s Androidem</string>
<string name="show_password">Zobrazit heslo</string>
<string name="defaults_to_template">(výchozí hodnota je %1$s)</string>
<string name="dns_settings">Nastavení DNS</string>
<string name="dns_provider">poskytovatel DNS</string>
<string name="dns_protocol">DNS protokol</string>
<string name="system">Systém</string>
<string name="doh">DNS přes HTTPS (DoH)</string>
<string name="comma_separated">Oddělené čárkami</string>
<string name="server_port">Server:Port</string>
<string name="new_tunnel">Nový tunel</string>
<string name="system_features">Systémové funkce</string>
<string name="read_failed">Nepodařilo se přečíst data.</string>
<string name="invalid_key">Neplatný klíč</string>
<string name="invalid_number">Neplatné číslo</string>
<string name="invalid_value">Neplatná hodnota</string>
<string name="missing_attribute">Chybějící atribut</string>
<string name="missing_section">Chybějící sekce</string>
<string name="syntax_error">Syntaktická chyba</string>
<string name="unknown_attribute">Neznámý atribut</string>
<string name="unknown_section">Neznámá sekce</string>
<string name="ports_must_differ">Selhalo. Proxy servery musí mít různé porty.</string>
<string name="password_no_spaces">Heslo nesmí obsahovat mezery.</string>
<string name="tunnel_name_taken">Název tunelu je již použit.</string>
<string name="range_hint">(%1$d%2$d)</string>
<string name="mimic_quic">Napodobit QUIC</string>
<string name="mimic_dns">Napodobit DNS</string>
<string name="mimic_sip">Napodobit SIP</string>
<string name="active_tunnel_update_failed">Aktualizace aktivního tunelu se nezdařila</string>
<string name="ddns_auto_update">Automatická aktualizace dynamického DNS</string>
<string name="ddns_auto_update_description">Automatická aktualizace IP adresy při změně DDNS</string>
<string name="prefer_ipv6_resolution">Upřednostnit překlad IPv6 peerů</string>
<string name="disabled">Deaktivováno</string>
<string name="mode_disabled_template">Funkce není v %1$s režimu dostupná.</string>
<string name="donate_title">Darovat</string>
<string name="crypto">Adresy kryptoměn</string>
<string name="github_sponsors">GitHub Sponzoři</string>
<string name="liberapay">Liberapay</string>
<string name="kofi">Ko-fi</string>
<string name="donation_thanks_intro">Děkujeme, že uvažujete o podpoře tohoto projektu!</string>
<string name="donation_closing">Mým snem je pracovat pro vás na tomto projektu na plný úvazek.</string>
<string name="donation_signoff">S vděčností,</string>
<string name="expiremental_template">%1$s (experimentální)</string>
<string name="root_required_template">%1$s (vyžaduje root)</string>
<string name="recommended_template">%1$s (doporučeno)</string>
<string name="hint_template">(%1$s)</string>
<string name="set_custom_ping_target">Vlastní cíl pingu (volitelné)</string>
<string name="tunnel_ping_interval">Interval pingování tunelu</string>
<string name="ping_timeout">Časový limit pingování tunelu</string>
<string name="monitoring_ping">Povolit monitorování pingování tunelu</string>
<string name="sec_ago_template">Před %1$s s</string>
<string name="latency_template">Latence: %1$s</string>
<string name="ping_target_template">Cíl pingu: %1$s</string>
<string name="backup_success">Úspěšně zazálohováno. %1$s</string>
<string name="config_error_template">Špatná konfigurace. %1$s v umístění: %2$s.</string>
<string name="donation_dev_message">Jako jediný vývojář neúnavně pracuji na tom, aby se WG Tunnel stal nejlepším bezplatným a open-source WireGuard klientem pro Android, ale to je možné pouze s vaší podporou.</string>
<string name="google_donation_message">Bohužel, kvůli pravidlům společnosti Google nejsou odkazy na darování povoleny ve verzi této aplikace z Obchodu Play. Projděte si prosím webové stránky projektu, abyste zjistili, kde můžete přispět.</string>
<string name="pinger_bounce_recovery">Restartování pingera se nezdařilo. Tunel byl obnoven se starými adresami.</string>
<string name="bounce_failed_template">Pinger nemohl obnovit tunel kvůli následující chybě: %1$s</string>
</resources>
+129 -43
View File
@@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<?xml version='1.0' encoding='utf-8'?>
<resources>
<string name="app_name">WG Tunnel</string>
<string name="error_file_extension">Datei ist keine .conf oder .zip</string>
@@ -9,15 +9,12 @@
<string name="okay">Ok</string>
<string name="tunnel_on_ethernet">Tunnel für Ethernet</string>
<string name="auto_tunneling">Auto-Tunneln</string>
<string name="turn_on_tunnel">Für diese Aktion muss ein aktiver Tunnel bestehen</string>
<string name="prominent_background_location_message">Diese Funktion erfordert die Erlaubnis zur Standortbestimmung im Hintergrund, um die Überwachung der WLAN SSID zu ermöglichen, auch wenn die Anwendung geschlossen ist. Weitere Einzelheiten in den Datenschutzbestimmungen, die auf dem Support-Bildschirm verlinkt sind.</string>
<string name="prominent_background_location_title">Vereinbarung der Standortberechtigung im Hintergrund</string>
<string name="thank_you">Danke für die Nutzung von WG Tunnel!</string>
<string name="trusted_ssid_value_description">SSID übermitteln</string>
<string name="add_tunnels_text">Von Datei oder ZIP hinzufügen</string>
<string name="open_file">Datei öffnen</string>
<string name="add_from_qr">Über QR-Code hinzufügen</string>
<string name="qr_scan">QR--Code scannen</string>
<string name="tunnel_name">Tunnel-Name</string>
<string name="exclude">Ausschließen</string>
<string name="include">Einschließen</string>
@@ -40,7 +37,6 @@
<string name="private_key">Privater Schlüssel</string>
<string name="copy_public_key">Öffentlichen Schlüssel kopieren</string>
<string name="base64_key">base64-Schlüssel</string>
<string name="comma_separated_list">Kommaseparierte Liste</string>
<string name="delete_tunnel">Tunnel löschen</string>
<string name="persistent_keepalive">Dauerhaftes Keepalive</string>
<string name="enable_app_lock">App-Sperre aktivieren</string>
@@ -69,14 +65,11 @@
<string name="auto">(automatisch)</string>
<string name="incorrect_pin">PIN nicht korrekt</string>
<string name="pin_created">PIN erfolgreich erstellt</string>
<string name="enter_pin">Deine PIN eingeben</string>
<string name="version">Version</string>
<string name="enter_pin">PIN eingeben</string>
<string name="settings">Einstellungen</string>
<string name="support">Unterstützung</string>
<string name="error_authentication_failed">Authentifizierung fehlgeschlagen</string>
<string name="unknown_error">Unbekannter Fehler aufgetreten</string>
<string name="email_chooser">Eine E-Mail senden…</string>
<string name="error_authorization_failed">Autorisierung fehlgeschlagen</string>
<string name="no_email_detected">Keine E-Mail-App erkannt</string>
<string name="create_pin">PIN erstellen</string>
<string name="use_tunnel_on_wifi_name">Tunnel für WLAN-Namen verwenden</string>
@@ -85,9 +78,7 @@
<string name="edit_tunnel">Tunnel bearbeiten</string>
<string name="set_primary_tunnel">Als Primären Tunnel setzen</string>
<string name="vpn_channel_name">VPN Benachrichtigungskanal</string>
<string name="turn_off_tunnel">Aktion erfordert deaktivierten Tunnel</string>
<string name="kernel">Kernel</string>
<string name="use_kernel">Kernelmodul verwenden</string>
<string name="error_ssid_exists">SSID existiert bereits</string>
<string name="junk_packet_count">Junk-Paket Anzahl</string>
<string name="junk_packet_maximum_size">Junk-Paket maximale Grösse</string>
@@ -100,30 +91,19 @@
<string name="underload_packet_magic_header">Unterlastpaket magic header</string>
<string name="see_the">wirf einen Blick in die</string>
<string name="unsure_how">Wenn du nicht sicher bist, wie du weiterverfahren sollst</string>
<string name="error_file_format">Ungültiges Format der Tunnelkonfiguration</string>
<string name="response_packet_magic_header">Antwortpaket magic header</string>
<string name="restart_at_boot">Beim Hochfahren starten</string>
<string name="optional_default">"optional, standard: "</string>
<string name="background_location_message">Für diese Funktion ist die Erlaubnis, den Standort jederzeit zu bestimmen, und/oder ein genauer Standort erforderlich. Bitte prüfe die</string>
<string name="vpn_settings">VPN-Systemeinstellungen</string>
<string name="always_on_message">Die Genehmigung für eine VPN-Verbindung wurde verweigert. Bitte überprüfe die</string>
<string name="set_custom_ping_cooldown">Ping-Neustart-Cooldown (sek)</string>
<string name="set_custom_ping_ip">Benutzerdefinierte Ping-IP einstellen</string>
<string name="default_ping_ip">(optional, Standardwert: Gegenstelle)</string>
<string name="set_custom_ping_internal">Pingintervall (sek)</string>
<string name="always_on_message2">um sicherzustellen, dass Always-on VPN für alle anderen Apps ausgeschaltet ist und versuche es erneut</string>
<string name="sec">Sek</string>
<string name="app_settings">App-Einstellungen</string>
<string name="background_location_message2">um sicherzustellen, dass diese Berechtigungen aktiviert sind</string>
<string name="root_accepted">Root-Shell akzeptiert</string>
<string name="show_amnezia_properties">Amnezia-Eigenschaften anzeigen</string>
<string name="never">nie</string>
<string name="handshake">Handshake</string>
<string name="vpn_denied_dialog_title">Genehmigung verweigert</string>
<string name="logs">Logeinträge</string>
<string name="kernel_not_supported">Kernel nicht unterstützt</string>
<string name="trusted_wifi_names">Vertrauenswürdige WLAN Namen</string>
<string name="use_root_shell_for_wifi">Root-Shell verwenden, um WLAN-Namen zu ermitteln</string>
<string name="use_root_shell_for_wifi">Root-Shell zum Abrufen von Wi-Fi-Informationen verwenden, so dass keine Standortberechtigungen erforderlich sind</string>
<string name="light">Hell</string>
<string name="add_wifi_name">WLAN Namen hinzufügen</string>
<string name="dark">Dunkel</string>
@@ -133,14 +113,12 @@
<string name="skip">Überspringen</string>
<string name="learn_more">Mehr erfahren</string>
<string name="wildcards_active">Wildcards verfügbar</string>
<string name="wifi_name_via_shell">WLAN Namen per Shell</string>
<string name="start_auto">Auto-Tunnel starten</string>
<string name="tunnel_running">Laufender Tunnel</string>
<string name="donate">Fürs Projekt spenden</string>
<string name="local_logging">Lokales Logging</string>
<string name="enable_local_logging">Lokales Logging aktivieren</string>
<string name="add_from_clipboard">Aus Zwischenablage einfügen</string>
<string name="kill_switch">Notschalter</string>
<string name="automatic">Automatisch</string>
<string name="language">Sprache</string>
<string name="display_theme">Anzeigetheme</string>
@@ -154,8 +132,6 @@
<string name="ethernet_tunnel">Ethernet Tunnel</string>
<string name="set_ethernet_tunnel">Als Ethernet Tunnel setzen</string>
<string name="native_kill_switch">Nativer Notschalter</string>
<string name="vpn_kill_switch">VPN Notschalter</string>
<string name="kill_switch_options">Notschalteroptionen</string>
<string name="allow_lan_traffic">LAN Verkehr erlauben</string>
<string name="vpn_channel_description">Ein Kanal für VPN-Statusbenachrichtigungen</string>
<string name="auto_tunnel_channel_name">Auto-Tunnel-Benachrichtigungskanal</string>
@@ -180,20 +156,13 @@
<string name="include_lan">LAN einschließen</string>
<string name="exclude_lan">LAN ausschließen</string>
<string name="tunnel_control">Tunnelsteuerung</string>
<string name="kill_switch_off">Notschalter stoppen bei vertrauenswürdigen</string>
<string name="auto_tunnel">Auto-Tunnel</string>
<string name="server_ipv4">IPv4 Hostnamensauflösung</string>
<string name="prefer_ipv4">IPv4 Verbindung bevorzugen</string>
<string name="multiple">Mehrere</string>
<string name="bio_subtitle">Melde dich mit deinen biometrischen Anmeldeinformationen an</string>
<string name="select">Auswählen</string>
<string name="status">Status</string>
<string name="invalid_config_error">ungültige_konfiguration_fehler</string>
<string name="matrix_url">https://matrix.to/#/#wg-tunnel-space:matrix.org</string>
<string name="search">Suchen</string>
<string name="config_error">Konfigurationsfehler</string>
<string name="config_error">Ungültige Konfiguration</string>
<string name="join_matrix">Matrix-Community beitreten</string>
<string name="bio_auth_title">Biometrische Authentifizierung</string>
<string name="error_download_failed">Download der Konfiguration fehlgeschlagen</string>
<string name="add_from_url">Von URL hinzufügen</string>
<string name="export_logs">Gespeicherte Logs exportieren</string>
@@ -202,32 +171,27 @@
<string name="delete_logs">Logs leeren und löschen</string>
<string name="tunnel_error_template">Tunnel mit: %1$s fehlgeschlagen</string>
<string name="save">Speichern</string>
<string name="bio_not_supported">Biometrische Daten werden nicht unterstützt</string>
<string name="remote_key_template">Schlüssel: %1$s</string>
<string name="enter_config_url">Konfigurations-URL eingeben</string>
<string name="join_telegram">Telegram-Community beitreten</string>
<string name="dropdown">Auswahlliste</string>
<string name="add_tunnel">Tunnel hinzufügen</string>
<string name="copy">Kopieren</string>
<string name="info">Info</string>
<string name="kernel_name_error">Fehler im Kernel-Modulnamen</string>
<string name="service_running_error">Fehler: Dienst läuft nicht</string>
<string name="auth_error">Fehler: nicht autorisiert</string>
<string name="service_running_error">Dienst läuft nicht</string>
<string name="auth_error">Nicht autorisiert</string>
<string name="inactive">Inaktiv</string>
<string name="bio_not_created">Biometrische Daten nicht erstellt</string>
<string name="bio_update_required">Biometrisches Sicherheitsupdate erforderlich</string>
<string name="tunnel_starting">Starte Tunnel</string>
<string name="enable_remote_app_control">App-Fernsteuerung aktivieren</string>
<string name="export_tunnels_amnezia">Tunnel als Amnezia exportieren</string>
<string name="export_failed">Export fehlgeschlagen</string>
<string name="app_permission_description">Steuere Tunnel und Auto-Tunnel Funktionen.</string>
<string name="dns_resolve_error">dns-Auflösungsfehler</string>
<string name="dns_resolve_error">DNS-Auflösung fehlgeschlagen</string>
<string name="export_tunnels_wireguard">Tunnel als WireGuard exportieren</string>
<string name="camera_permission_required">Kameraberechtigung erforderlich</string>
<string name="wifi_name_template">Aktiv: %1$s</string>
<string name="delete">Löschen</string>
<string name="nothing_here_yet">Noch nix hier!</string>
<string name="share">Teilen</string>
<string name="select_all">Alles auswählen</string>
<string name="version_template">Version: %1$s</string>
<string name="export_success">Export Erfolg</string>
@@ -252,4 +216,126 @@
<string name="done">Erledigt</string>
<string name="show_qr">QR anzeigen</string>
<string name="amnezia">Amnezia</string>
<string name="shizuku">Shizuku</string>
<string name="legacy_api_description">Eine unter Android 12 veraltete Methode zum Abrufen von Wi-Fi-Informationen verwenden, die Standortabfragen einschränkt, aber auf neueren Geräten möglicherweise nicht zuverlässig funktioniert</string>
<string name="use_shell_via_shizuku">Shell über Shizuku zum Abrufen von Wi-Fi-Informationen verwenden, wodurch die Notwendigkeit einer Standortgenehmigung auf nichtgerooteten Geräten vermieden wird</string>
<string name="use_android_recommended">Von Android empfohlene Methode zum Abrufen von Wi-Fi-Informationen verwenden, je nach Android-Version</string>
<string name="release_notes">Release Notes</string>
<string name="shizuku_not_detected">Shizuku nicht entdeckt</string>
<string name="current_template">Aktuell: %1$s</string>
<string name="wifi_detection_method">Wi-Fi-Erkennungsmethode</string>
<string name="_default">Standard</string>
<string name="legacy">Veraltet</string>
<string name="root">Root</string>
<string name="sort">Sortierung</string>
<string name="move_up">Nach oben verschieben</string>
<string name="move_down">Nach unten verschieben</string>
<string name="drag_handle">Verschiebegriff</string>
<string name="error_tunnel_name">Tunnelname muss im Kernelmodus 15 Zeichen oder weniger betragen</string>
<string name="tunnel">Tunnel</string>
<string name="tunnel_item_description">%1$s, %2$s, %3$s</string>
<string name="warning">Warnung</string>
<string name="location_permissions">Standortberechtigungen</string>
<string name="location_justification">Um Wi-Fi-Namen im Hintergrund mit deiner aktuellen Erkennungsmethode lesen zu können, benötigt Android, dass Apps die Berechtigung \'Allow all the time\' und \'Precise\' (Background Location auf älteren Geräten) erhalten. Bitte aktiviere diese Berechtigungen in deinen Android-App-Einstellungen.</string>
<string name="open_settings">Einstellungen öffnen</string>
<string name="location_permissions_missing">Standortberechtigungen fehlen</string>
<string name="fix">Beheben</string>
<string name="start">Start</string>
<string name="auto_tunnel_running">Auto-Tunnel läuft</string>
<string name="auto_tunnel_not_running">Auto-Tunnel läuft nicht</string>
<string name="pinger_bounce_successful">Tunnel erfolgreich per Pinger neu gestartet.</string>
<string name="pinger_bounce_recovery">Pinger-Neustart fehlgeschlagen. Tunnel mit alten Adressen wiederhergestellt.</string>
<string name="bounce_failed_template">Pinger konnte den Tunnel mit folgendem Fehler nicht wiederherstellen: %1$s</string>
<string name="tunnel_monitoring">Tunnelüberwachung</string>
<string name="set_custom_ping_target">Benutzerdefiniertes Ping-Ziel (optional)</string>
<string name="ip_or_hostname">IP oder Hostname</string>
<string name="ping_target_description">Wird verwendet, wenn keine interne IP verfügbar ist (z. B. in Full-Tunnel-Konfigurationen). Leer lassen verwendet standardmäßig Cloudflare.</string>
<string name="tunnel_ping_interval">Tunnel-Ping-Intervall</string>
<string name="attempts_per_interval">Ping-Versuche pro Intervall</string>
<string name="ping_timeout">Tunnel-Ping-Timeout</string>
<string name="timeout_all_attempts">Gesamtzeitüberschreitung für alle Versuche</string>
<string name="display_detailed_ping_stats">Detaillierte Ping-Statistiken anzeigen</string>
<string name="monitoring_ping">Ping-Tunnel-Überwachung aktivieren</string>
<string name="rx_template">RX: %1$s MB</string>
<string name="tx_template">TX: %1$s MB</string>
<string name="reachable_template">Erreichbar: %1$s</string>
<string name="ping_success_template">Letzter erfolgreicher Ping: %1$s</string>
<string name="sec_ago_template">vor %1$s Sek</string>
<string name="latency_template">Latenz: %1$s</string>
<string name="jitter_template">Jitter: %1$s</string>
<string name="packets_sent_template">Versendete Pakete: %1$s</string>
<string name="packet_loss_template">Verlorene Pakete: %.2f%%</string>
<string name="ping_target_template">Pingziel: %1$s</string>
<string name="_true">Wahr</string>
<string name="_false">Falsch</string>
<string name="backup_success">Backuperfolg. %1$s</string>
<string name="restore_success">Wiederherstellerfolg. %1$s</string>
<string name="restarting_app">Starte App neu, um Änderungen anzuwenden …</string>
<string name="restore_failed">Wiederherstellung aus Backup fehlgeschlagen.</string>
<string name="backup_failed">Backup konnte nicht erstellt werden.</string>
<string name="backup_application">Appdaten sichern</string>
<string name="restore_application">Aus Backup wiederherstellen</string>
<string name="hint_template">(%1$s)</string>
<string name="expiremental_template">%1$s (experimental)</string>
<string name="root_required_template">%1$s (root benötigt)</string>
<string name="recommended_template">%1$s (empfohlen)</string>
<string name="proxy">Proxy</string>
<string name="backend_mode">App-Modus</string>
<string name="selected">Ausgewählt</string>
<string name="socks_5_proxy">SOCKS5 proxy</string>
<string name="http_proxy">HTTP proxy</string>
<string name="username">Benutzername</string>
<string name="password">Passwort</string>
<string name="proxy_credentials">Proxy-Anmeldeinformationen</string>
<string name="proxy_settings">Proxy-Einstellungen</string>
<string name="vpn">VPN</string>
<string name="android_integrations">Android-Integrationen</string>
<string name="show_password">Passwort anzeigen</string>
<string name="socks_5_bind_address">SOCKS5-Bindadresse</string>
<string name="http_bind_address">HTTP-Binde-Adresse</string>
<string name="defaults_to_template">(Standardmäßig %1$s)</string>
<string name="dns_settings">DNS-Einstellungen</string>
<string name="locked_down">Abgesperrt</string>
<string name="dns_provider">DNS-Anbieter</string>
<string name="dns_protocol">DNS-Protokoll</string>
<string name="system">System</string>
<string name="doh">DNS über HTTPS (DoH)</string>
<string name="comma_separated">Komma getrennt</string>
<string name="server_port">Server:Port</string>
<string name="new_tunnel">Neuer Tunnel</string>
<string name="system_features">Systemfunktionen</string>
<string name="read_failed">Daten konnten nicht gelesen werden.</string>
<string name="invalid_key">Ungültiger Schlüssel</string>
<string name="invalid_number">Ungültige Nummer</string>
<string name="invalid_value">Ungültiger Wert</string>
<string name="missing_attribute">Fehlendes Attribut</string>
<string name="missing_section">Fehlender Abschnitt</string>
<string name="syntax_error">Syntaxfehler</string>
<string name="unknown_attribute">Unbekanntes Attribut</string>
<string name="unknown_section">Unbekannter Abschnitt</string>
<string name="config_error_template">Schlechte Konfiguration. %1$s am Standort: %2$s.</string>
<string name="ports_must_differ">Fehlgeschlagen. Proxys müssen unterschiedliche Ports haben.</string>
<string name="password_no_spaces">Passwort kann keine Leerzeichen beinhalten.</string>
<string name="tunnel_name_taken">Tunnelname bereits in Gebrauch.</string>
<string name="range_hint">(%1$d%2$d)</string>
<string name="mimic_quic">Mimic QUIC</string>
<string name="mimic_dns">Mimic DNS</string>
<string name="mimic_sip">Mimic SIP</string>
<string name="ddns_auto_update">Dynamisches DNS Auto-Update</string>
<string name="ddns_auto_update_description">Aktualisiert IP bei DDNS Änderungen</string>
<string name="prefer_ipv6_resolution">IPv6 Gegenstellen-Auflösung bevorzugen</string>
<string name="disabled">Deaktiviert</string>
<string name="mode_disabled_template">Funktion im %1$s Modus nicht verfügbar.</string>
<string name="lockdown">Abriegelung</string>
<string name="active_tunnel_update_failed">Update des laufenden Tunnels fehlgeschlagen</string>
<string name="donate_title">Spenden</string>
<string name="crypto">Kryptowährungsadressen</string>
<string name="github_sponsors">GitHub-Sponsoren</string>
<string name="liberapay">Liberapay</string>
<string name="kofi">Ko-fi</string>
<string name="donation_thanks_intro">Vielen Dank, dass du eine Spende für dieses Projekt in Erwägung ziehst!</string>
<string name="donation_dev_message">Als alleiniger Entwickler arbeite ich unermüdlich daran, WG Tunnel zum besten kostenlosen Open-Source-WireGuard-Client für Android zu machen, aber das ist nur mit deiner Unterstützung möglich.</string>
<string name="donation_closing">Es ist mein Traum, Vollzeit für dich an diesem Projekt zu arbeiten.</string>
<string name="donation_signoff">Dankbar,</string>
<string name="google_donation_message">Aufgrund der Richtlinien von Google sind Spendenlinks in der Play Store-Version dieser App leider nicht erlaubt. Bitte durchsuche die Webseiten des Projekts, um herauszufinden, wo du spenden kannst.</string>
</resources>
+1 -37
View File
@@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<?xml version='1.0' encoding='utf-8'?>
<resources>
<string name="allowed_ips">Allowed IPs</string>
<string name="email_chooser">Enviar un email…</string>
@@ -11,14 +11,11 @@
<string name="all">todas</string>
<string name="mobile_data_tunnel">Establecer como túnel en datos móviles</string>
<string name="use_tunnel_on_wifi_name">Usar tunnel en nombre Wi-Fi</string>
<string name="version">Versión</string>
<string name="support">Ayuda</string>
<string name="private_key">Clave privada</string>
<string name="trusted_ssid_value_description">Enviar SSID</string>
<string name="add_tunnels_text">Añadir desde archivo o zip</string>
<string name="open_file">Abrir archivo</string>
<string name="add_from_qr">Añadir mediante código QR</string>
<string name="qr_scan">Escanear QR</string>
<string name="tunnel_name">Nombre de túnel</string>
<string name="exclude">Excluir</string>
<string name="include">Incluir</string>
@@ -28,7 +25,6 @@
<string name="addresses">Addresses</string>
<string name="public_key">Public key</string>
<string name="error_file_extension">No es un archivo .conf o .zip</string>
<string name="turn_off_tunnel">Desactiva antes el túnel</string>
<string name="no_tunnels">¡Ningún túnel añadido aún!</string>
<string name="tunnels">Túneles</string>
<string name="tunnel_mobile_data">Activar túnel en datos móviles</string>
@@ -46,15 +42,11 @@
<string name="vpn_on">VPN on</string>
<string name="vpn_off">VPN off</string>
<string name="create_import">Crear desde cero</string>
<string name="turn_on_tunnel">La acción necesita un túnel activado</string>
<string name="rotate_keys">Rotar claves</string>
<string name="comma_separated_list">lista separada por comas</string>
<string name="random">(aleatorio)</string>
<string name="optional">(opcional)</string>
<string name="seconds">segundos</string>
<string name="cancel">Cancelar</string>
<string name="error_authentication_failed">Fallo de autenticación</string>
<string name="error_authorization_failed">Fallo de autorización</string>
<string name="enabled_app_shortcuts">Habilitar acesos directos de app</string>
<string name="unknown_error">Error desconocido</string>
<string name="email_subject">Ayuda WG Tunnel</string>
@@ -64,7 +56,6 @@
<string name="persistent_keepalive">Keepalive persistente</string>
<string name="docs_description">Leer documentación</string>
<string name="email_description">Envíame un email</string>
<string name="use_kernel">Usar módulo del Kernel</string>
<string name="error_ssid_exists">SSID existente</string>
<string name="error_root_denied">Shell root denegado</string>
<string name="error_no_file_explorer">Explorador de archivos no instalado</string>
@@ -92,12 +83,8 @@
<string name="junk_packet_count">Recuento de paquetes basura</string>
<string name="junk_packet_minimum_size">Tamaño mínimo del paquete basura</string>
<string name="add_from_clipboard">Agregar desde el portapapeles</string>
<string name="app_settings">configuración de la aplicación</string>
<string name="optional_default">"opcional, por defecto: "</string>
<string name="show_amnezia_properties">Mostrar propiedades de Amnezia</string>
<string name="never">nunca</string>
<string name="sec">seg</string>
<string name="set_custom_ping_internal">Intervalo del Ping (seg)</string>
<string name="transport_packet_magic_header">Encabezado del paquete de transporte</string>
<string name="getting_started_guide">Guía de inicio</string>
<string name="always_on_message">Se ha denegado el permiso de conexión VPN. Por favor, compruebe el</string>
@@ -107,17 +94,11 @@
<string name="init_packet_junk_size">Tamaño basura del paquete de inicialización</string>
<string name="unsure_how">Si no estás seguro de cómo proceder</string>
<string name="see_the">Ver la</string>
<string name="error_file_format">Configuración del formato del túnel no válida</string>
<string name="vpn_denied_dialog_title">Permiso denegado</string>
<string name="vpn_settings">Configuraciones VPN del sistema</string>
<string name="background_location_message">Permitir todo el tiempo que se requiera permiso de ubicación y/o ubicación precisa para esta función. Consultar</string>
<string name="response_packet_junk_size">Tamaño basura del paquete de respuesta</string>
<string name="init_packet_magic_header">Encabezado del paquete de inicialización</string>
<string name="background_location_message2">para asegurarse de que estos permisos estén habilitados</string>
<string name="root_accepted">Shell root permitido</string>
<string name="set_custom_ping_ip">Establecer ping ip personalizado</string>
<string name="default_ping_ip">(opcional, por defecto de los pares)</string>
<string name="set_custom_ping_cooldown">Tiempo de espera de reinicio del Ping (seg)</string>
<string name="restart_at_boot">Reiniciar al arrancar</string>
<string name="underload_packet_magic_header">Encabezado del paquete baja carga</string>
<string name="handshake">Protocolo de intercambio</string>
@@ -128,14 +109,12 @@
<string name="use_wildcards">Usar comodines de nombre</string>
<string name="primary_tunnel">Túnel principal</string>
<string name="add_wifi_name">Añadir nombre de wifi</string>
<string name="kernel_not_supported">Kernel no compatible</string>
<string name="start_auto">Iniciar túnel automático</string>
<string name="stop_auto">Detener túnel automático</string>
<string name="local_logging">Registro local</string>
<string name="enable_local_logging">Habilitar registro local</string>
<string name="exclude_lan">Excluir LAN</string>
<string name="enable_amnezia_compatibility">Activar compatibilidad con Amnezia</string>
<string name="wifi_name_via_shell">Nombre del wifi a través del shell</string>
<string name="include_lan">Incluir LAN</string>
<string name="tunnel_specific_settings">Ajustes específicos del túnel</string>
<string name="hide_scripts">Ocultar scripts</string>
@@ -146,7 +125,6 @@
<string name="debounce_delay">Retardo de rebote</string>
<string name="hide_amnezia_properties">Ocultar propiedades de Amnezia</string>
<string name="skip">Saltar</string>
<string name="kill_switch">Interruptor de apagado</string>
<string name="automatic">Automático</string>
<string name="notifications">Notificaciones</string>
<string name="light">Claro</string>
@@ -166,8 +144,6 @@
<string name="ethernet_tunnel">Túnel ethernet</string>
<string name="set_ethernet_tunnel">Establecer como túnel ethernet</string>
<string name="native_kill_switch">Interruptor de apagado nativo</string>
<string name="vpn_kill_switch">Interruptor de apagado VPN</string>
<string name="kill_switch_options">Opciones del interruptor de apagado</string>
<string name="allow_lan_traffic">Permitir tráfico LAN</string>
<string name="bypass_lan_for_kill_switch">Excluir LAN del interruptor de apagado</string>
<string name="auto_tunnel_channel_name">Canal de notificación del túnel automático</string>
@@ -181,16 +157,12 @@
<string name="remove_amnezia_compatibility">Eliminar compatibilidad con Amnezia</string>
<string name="tunnel_control">Control del túnel</string>
<string name="auto_tunnel">Túnel automático</string>
<string name="kill_switch_off">Detener interruptor de apagado en confianza</string>
<string name="server_ipv4">Resolución de host IPv4</string>
<string name="prefer_ipv4">Preferir conexión IPv4</string>
<string name="multiple">Múltiple</string>
<string name="add_from_url">Añadir desde URL</string>
<string name="save">Guardar</string>
<string name="select">Seleccionar</string>
<string name="join_telegram">Únete a la comunidad de Telegram</string>
<string name="join_matrix">Únete a la comunidad de Matrix</string>
<string name="share">Compartir</string>
<string name="update_download_failed">Fallo al descargar actualización.</string>
<string name="licenses">Licencias</string>
<string name="checking_for_update">Comprobando actualización</string>
@@ -198,7 +170,6 @@
<string name="permission_required">Permiso requerido</string>
<string name="active">Activo</string>
<string name="copy">Copiar</string>
<string name="bio_not_supported">Datos biométricos no admitidos</string>
<string name="export_tunnels_wireguard">Exportar túneles como WireGuard</string>
<string name="export_tunnels_amnezia">Exportar túneles como Amnezia</string>
<string name="wifi_name_template">Activo: %1$s</string>
@@ -206,34 +177,27 @@
<string name="export_logs">Exportar registros almacenados</string>
<string name="inactive">Inactivo</string>
<string name="search">Buscar</string>
<string name="bio_subtitle">Inicia sesión con tu credencial biométrica</string>
<string name="kernel_name_error">error en el nombre del módulo del kernel</string>
<string name="camera_permission_required">Permiso de cámara requerido</string>
<string name="dns_resolve_error">error de resolución DNS</string>
<string name="error_download_failed">Fallo al descargar configuración</string>
<string name="enter_config_url">Introducir URL de configuración</string>
<string name="bio_update_required">Actualización de seguridad biométrica requerida</string>
<string name="delete_logs">Eliminar y limpiar registros</string>
<string name="app_permission_title">Puente de Control WG Tunnel</string>
<string name="dropdown">Menú desplegable</string>
<string name="info">Info</string>
<string name="delete">Eliminar</string>
<string name="export_failed">Exportación fallida</string>
<string name="app_permission_description">Controlar túneles y funcionalidades de auto-túnel</string>
<string name="tunnel_error_template">Túnel fallido con: %1$s</string>
<string name="invalid_config_error">invalid_config_error</string>
<string name="remote_key_template">Clave: %1$s</string>
<string name="config_error">Error de configuración</string>
<string name="auth_error">error no autorizado</string>
<string name="service_running_error">Error de servicio no en ejecución</string>
<string name="status">Estado</string>
<string name="bio_auth_title">Autenticación biométrica</string>
<string name="version_template">Versión: %1$s</string>
<string name="check_for_update">Comprobar actualización</string>
<string name="update_check_failed">Fallo al comprobar la actualización.</string>
<string name="security_template">Seguridad: %1$s</string>
<string name="flavor_template">Sabor: %1$s</string>
<string name="bio_not_created">Datos biométricos no creados</string>
<string name="tunnel_starting">Iniciando túnel</string>
<string name="enable_remote_app_control">Activar control remoto de la app</string>
<string name="export_success">Éxito al exportar</string>
+38 -36
View File
@@ -1,9 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<?xml version='1.0' encoding='utf-8'?>
<resources>
<string name="app_name">WG Tunnel</string>
<string name="error_file_extension">See pole .conf või .zip fail</string>
<string name="vpn_channel_name">VPN-i teavituskanal</string>
<string name="turn_off_tunnel">See toiming eeldab, et tunnel pole töös</string>
<string name="prominent_background_location_message">See funktsionaalsus eeldab, et rakendusel on õigus asukoha ja WiFi SSID tuvastamiseks taustal, seda ka siis, kui rakendus on suletud. Lisateavet leiad Privaatsusreeglite lehelt, mille leiad Kasutajatoe vaatest.</string>
<string name="no_tunnels">Ühtegi tunnelit pole veel lisatud!</string>
<string name="tunnels">Tunnelid</string>
@@ -12,9 +11,7 @@
<string name="okay">Sobib</string>
<string name="tunnel_on_ethernet">Loo tunnel kohtvõrgus</string>
<string name="add_tunnels_text">Lisa conf- või zip-failist</string>
<string name="open_file">Ava fail</string>
<string name="add_from_qr">Lisa QR-koodist</string>
<string name="qr_scan">Skaneeri QR-koodi</string>
<string name="tunnel_name">Tunneli nimi</string>
<string name="exclude">Välista</string>
<string name="include">Kaasa</string>
@@ -34,7 +31,6 @@
<string name="vpn_on">VPN on kasutusel</string>
<string name="vpn_off">VPN pole kasutusel</string>
<string name="create_import">Loo nullist</string>
<string name="turn_on_tunnel">Toiming eeldab aktiivse tunneli olemasolu</string>
<string name="licenses">Litsentsid</string>
<string name="update_check_unsupported">Selle rakenduse versiooni puhul pole uuenduste kontrollimine toetatud.</string>
<string name="darker">Tumedam kujundus</string>
@@ -55,17 +51,10 @@
<string name="install_updated_permission">See rakendus vajab uuenduse paigaldamiseks õigusi.</string>
<string name="allow">Luba</string>
<string name="nothing_here_yet">Siin pole veel midagi!</string>
<string name="share">Jaga</string>
<string name="select_all">Vali kõik</string>
<string name="export_success">Eksportimine õnnestus</string>
<string name="inactive">Pole aktiivne</string>
<string name="active">Aktiivne</string>
<string name="status">Olek</string>
<string name="bio_auth_title">Biomeetriline autentimine</string>
<string name="bio_subtitle">Logi sisse kasutades biomeetrilist autentimist</string>
<string name="bio_not_supported">Biomeetriline tuvastamine pole toetatud</string>
<string name="bio_not_created">Biomeetriline tuvastamine pole seadistatud</string>
<string name="bio_update_required">Vajalik on biomeetrilise tuvastamise turvauuendus</string>
<string name="tunnel_starting">Tunnel käivitub</string>
<string name="enable_remote_app_control">Luba rakenduse kaugjuhtimine</string>
<string name="add_from_url">Lisa võrguaadressilt</string>
@@ -80,7 +69,6 @@
<string name="export_logs">Ekspordi salvestatud logid</string>
<string name="delete_logs">Kustuta ja eemalda logid</string>
<string name="copy">Kopeeri</string>
<string name="info">Teave</string>
<string name="export_tunnels_amnezia">Ekspordi tunnelid Amnezia jaoks</string>
<string name="export_tunnels_wireguard">Ekspordi tunnelid WireGuardi jaoks</string>
<string name="advanced_settings">Täiendavad seadistused</string>
@@ -110,7 +98,6 @@
<string name="private_key">Privaatvõti</string>
<string name="copy_public_key">Kopeeri avalik võti</string>
<string name="base64_key">base64-kodeeringus võti</string>
<string name="comma_separated_list">komadega eraldatud loend</string>
<string name="listen_port">Kuulatav port</string>
<string name="random">(juhuslik)</string>
<string name="optional">(valikuline)</string>
@@ -118,13 +105,11 @@
<string name="seconds">sekundit</string>
<string name="persistent_keepalive">Pidev elumärksõnum</string>
<string name="cancel">Katkesta</string>
<string name="error_authentication_failed">Autentimine ei õnnestunud</string>
<string name="exclude_lan">Välista kohtvõrgud</string>
<string name="include_lan">Kaasa kohtvõrgud</string>
<string name="dns_resolve_error">nimelahenduse viga</string>
<string name="dns_resolve_error">Nimelahendus ei toiminud</string>
<string name="peer">Partner</string>
<string name="add_peer">Lisa partner</string>
<string name="default_ping_ip">(valikuline, vaikimisi partneri otspunkt)</string>
<string name="rotate_keys">Vaheta võtmeid</string>
<string name="delete_tunnel">Kustuta tunnel</string>
<string name="delete_tunnel_message">Kas sa oled kindel, et soovid selle tunneli kustutada?</string>
@@ -140,7 +125,6 @@
<string name="enter_pin">Sisesta oma PIN-kood</string>
<string name="create_pin">Loo PIN-kood</string>
<string name="edit_tunnel">Muuda tunnelit</string>
<string name="version">Versioon</string>
<string name="settings">Seadistused</string>
<string name="support">Kasutajatugi</string>
<string name="unknown_error">Tekkis tundmatu viga</string>
@@ -149,7 +133,6 @@
<string name="email_chooser">Saada e-kiri…</string>
<string name="docs_description">Loe dokumentatsiooni</string>
<string name="email_description">Saada mulle e-kiri</string>
<string name="use_kernel">Kasuta kernelimoodulit</string>
<string name="error_ssid_exists">SSID on juba olemas</string>
<string name="error_root_denied">Juurkasutaja õigustes kest on keelatud</string>
<string name="error_no_file_explorer">Failihaldurit pole paigaldatud</string>
@@ -162,35 +145,26 @@
<string name="version_template">Versioon: %1$s</string>
<string name="security_template">Turvalisus: %1$s</string>
<string name="flavor_template">Levitusviis: %1$s</string>
<string name="config_error">seadistusviga</string>
<string name="invalid_config_error">vigane_seadistus_viga</string>
<string name="kernel_name_error">viga kerneli mooduli nimes</string>
<string name="auth_error">viga autentimisel</string>
<string name="service_running_error">viga, kus teenus ei toimi</string>
<string name="config_error">Vigane seadistus</string>
<string name="kernel_name_error">Viga kerneli mooduli nimes</string>
<string name="auth_error">Pole lubatud</string>
<string name="service_running_error">Teenus ei tööta</string>
<string name="unsure_how">kui sa ei tea, mida järgmiseks teha</string>
<string name="see_the">Vaata</string>
<string name="getting_started_guide">esimeste toimingute juhendit</string>
<string name="restart_at_boot">Käivita alglaadimisel uuesti</string>
<string name="vpn_denied_dialog_title">Õigused on puudu</string>
<string name="set_custom_ping_internal">Pingi välp (sekundites)</string>
<string name="optional_default">"valikuline, vaikimisi: "</string>
<string name="never">mitte kunagi</string>
<string name="sec">sek</string>
<string name="handshake">kätlus</string>
<string name="logs">Logid</string>
<string name="kill_switch">Kiirpeatamine</string>
<string name="trusted_wifi_names">Usaldusväärsete WiFi-võrkude nimed</string>
<string name="add_wifi_name">Lisa WiFi võrgunimi</string>
<string name="primary_tunnel">Põhiline tunnel</string>
<string name="app_settings">rakenduse seadistused</string>
<string name="background_location_message2">tagamaks, et need õigused on lubatud</string>
<string name="root_accepted">Juurkasutaja kest on lubatud</string>
<string name="set_custom_ping_ip">Sisesta muu ip-aadress</string>
<string name="learn_more">Lisateave</string>
<string name="monitoring_state_changes">Jälgin oleku muudatusi</string>
<string name="tunnel_running">Tunnel töötab</string>
<string name="tunnel_specific_settings">Tunnelikohased seadistused</string>
<string name="kernel_not_supported">Kernel pole toetatud</string>
<string name="start_auto">Käivita automaatne tunneldus</string>
<string name="stop_auto">Peata automaatne tunneldus</string>
<string name="quick_actions">Kiirtoimingud</string>
@@ -200,7 +174,7 @@
<string name="camera_permission_required">Vajalik on õigus kasutada kaamerat</string>
<string name="dropdown">Rippmenüü</string>
<string name="splt_tunneling">Jagatud tunneldus</string>
<string name="stop">peata</string>
<string name="stop">Peata</string>
<string name="stop_on_no_internet">Peata internetiühenduse puudumisel</string>
<string name="stop_on_internet_loss">Peata tunnel internetiühenduse kadumisel</string>
<string name="enable_app_lock">Kasuta rakenduse lukustust</string>
@@ -208,13 +182,10 @@
<string name="mobile_data_tunnel">Määra mobiilse andmeside tunneliks</string>
<string name="use_tunnel_on_wifi_name">Kasuta tunnelit WiFi nime puhul</string>
<string name="kernel">Tuum/Kernel</string>
<string name="error_file_format">Vigane tunneli seadistuste vorming</string>
<string name="mobile_tunnel">Mobiilside andmetunnel</string>
<string name="launch_app_settings">Käivita rakenduse seadistused</string>
<string name="use_wildcards">Kasuta nimedes metamärke</string>
<string name="wildcards_active">Metamärgid on kasutusel</string>
<string name="prefer_ipv4">Eelista IPv4 ühendust</string>
<string name="server_ipv4">IPv4 hostinime nimelahendus</string>
<string name="junk_packet_count">Rämpspakettide arv</string>
<string name="junk_packet_minimum_size">Rämpspaketi miinimumsuurus</string>
<string name="junk_packet_maximum_size">Rämpspaketi maksimumsuurus</string>
@@ -225,4 +196,35 @@
<string name="transport_packet_magic_header">Transpordipaketi päise kohandatud osa</string>
<string name="underload_packet_magic_header">Väikese koormusega paketi päise kohandatud osa</string>
<string name="vpn_settings">VPN-i süsteemsed seadistused</string>
<string name="move_down">Liiguta allapoole</string>
<string name="move_up">Liiguta ülespoole</string>
<string name="drag_handle">Käepide sikutamiseks</string>
<string name="sort">Järjesta</string>
<string name="shizuku_not_detected">Shizukut ei õnnestu tuvastada</string>
<string name="release_notes">Muudatuste logi</string>
<string name="use_android_recommended">Kasuta versioonikohast Androidi soovitatud meetodit WiFi teabe kogumiseks</string>
<string name="use_shell_via_shizuku">Selleks et juurkasutajata seadmes vältida asukohateenuse sisselülitamist, kasuta WiFi teabe kogumiseks Shizuku vahendusel käivitatud kesta</string>
<string name="legacy_api_description">Kasuta Androidi 12 ajast pärit aegunud meetodit WiFi teabe kogumiseks - sellega vähendad asukohateenuse päringuid, kuid see ei pruugi uuemates seadmetes usaldusväärselt toimida</string>
<string name="shizuku">Shizuku</string>
<string name="root">Juurkasutaja</string>
<string name="legacy">Aegunud meetod</string>
<string name="_default">Vaikimisi meetod</string>
<string name="wifi_detection_method">WiFi tuvastamise meetod</string>
<string name="current_template">Praegune: %1$s</string>
<string name="multiple">Mitmikvalik</string>
<string name="enabled_app_shortcuts">Kasuta rakenduse otseteid</string>
<string name="location_services_missing_message">Rakendus ei suuda sinu nutiseadmes tuvastada asukohateenuste toimimist. Sõltuvalt sinu nutiseadmest võib see tähendada, et ebausaldusväärse WiFi-ühenduse identifitseerimine nime alusel ei pruugi toimida. Kas sa ikkagi soovid jätkata?</string>
<string name="auto_tunnel_title">Tunneli automaatne loomine</string>
<string name="auto_tunnel_not_running">Tunneli automaatne käivitamine pole kasutusel</string>
<string name="auto_tunnel_running">Tunneli automaatne käivitamine on kasutusel</string>
<string name="start">Käivita</string>
<string name="fix">Paranda</string>
<string name="location_permissions_missing">Puuduvad õigused asukoha tuvastamiseks</string>
<string name="open_settings">Ava seadistused</string>
<string name="location_justification">Android eeldab, et WiFi-võrkude nimede taustal identifitseerimine toimiks sinu praeguse tuvastusmeetodi puhul, peavad rakendusel olema õigused „Luba alati“ ja „Täpne“ (vanemates nutiseadmetes „Asukoha tuvastamine taustal“). Palun luba need õigused Androidi seadistustest.</string>
<string name="location_permissions">Õigused asukoha tuvastamiseks</string>
<string name="warning">Hoiatus</string>
<string name="tunnel_item_description">1$s, %2$s, %3$s</string>
<string name="tunnel">tunnel</string>
<string name="error_tunnel_name">Kernelirežiimis peab tunneli nime pikkus olema 15 tähemärki või vähem</string>
</resources>
+1 -2
View File
@@ -1,10 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<?xml version='1.0' encoding='utf-8'?>
<resources>
<string name="app_permission_title">پل کنترل تونل وایرگارد</string>
<string name="privacy_policy">مشاهده سیاست حفظ حریم خصوصی</string>
<string name="vpn_channel_name">کانال اطلاع رسانی VPN</string>
<string name="error_file_extension">فایل .conf یا .zip نیست.</string>
<string name="turn_off_tunnel">اقدام نیاز به تونل زنی دارد</string>
<string name="no_tunnels">هنوز تونلی اضافه نشده!</string>
<string name="tunnels">تونل‌ها</string>
<string name="tunnel_mobile_data">تونل روی داده تلفن همراه</string>
+1 -16
View File
@@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<?xml version='1.0' encoding='utf-8'?>
<resources>
<string name="optional">(valinnainen)</string>
<string name="exclude">Poissulje</string>
@@ -10,7 +10,6 @@
<string name="appearance">Ulkoasu</string>
<string name="tunnel_specific_settings">Tunnelikohtaiset asetukset</string>
<string name="dns_servers">DNS-palvelimet</string>
<string name="background_location_message2">varmistaaksesi, että käyttöoikeudet ovat myönnetty</string>
<string name="app_name">WG Tunnel</string>
<string name="vpn_channel_name">VPN-ilmoituskanava</string>
<string name="delete_tunnel_message">Haluatko varmasti poistaa tämän tunnelin?</string>
@@ -22,7 +21,6 @@
<string name="thank_you">Kiitos WG Tunnelin käyttämisestä!</string>
<string name="trusted_ssid_value_description">Tallenna SSID</string>
<string name="add_tunnels_text">Lisää tiedostosta tai zip-arkistosta</string>
<string name="open_file">Avaa tiedosto</string>
<string name="add_from_qr">Lisää QR-koodilla</string>
<string name="config_changes_saved">Asetusten muutokset tallennettu.</string>
<string name="public_key">Julkinen avain</string>
@@ -33,11 +31,9 @@
<string name="auto_tunneling">Automaattinen tunnelointi</string>
<string name="vpn_on">VPN päällä</string>
<string name="vpn_off">VPN pois päältä</string>
<string name="turn_on_tunnel">Toiminto vaatii aktiivisen tunnelin</string>
<string name="private_key">Yksityinen avain</string>
<string name="copy_public_key">Kopioi julkinen avain</string>
<string name="base64_key">base64-avain</string>
<string name="comma_separated_list">pilkulla eroteltu lista</string>
<string name="random">(satunnainen)</string>
<string name="unknown_error">Tapahtui tuntematon virhe</string>
<string name="tunnel_on_wifi">Tunneloi epäluotettavilla wifi-yhteyksillä</string>
@@ -59,25 +55,21 @@
<string name="enable_app_lock">Ota käyttöön sovelluksen lukitus</string>
<string name="set_primary_tunnel">Aseta ensisijaiseksi tunneliksi</string>
<string name="edit_tunnel">Muokkaa tunnelia</string>
<string name="version">Versio</string>
<string name="settings">Asetukset</string>
<string name="support">Tuki</string>
<string name="unsure_how">jos et tiedä, miten jatkaa</string>
<string name="see_the">katso</string>
<string name="getting_started_guide">aloitusopas</string>
<string name="error_file_format">Virheellinen tunneliasetusten tiedostomuoto</string>
<string name="vpn_denied_dialog_title">Ei käyttöoikeutta</string>
<string name="vpn_settings">VPN järjestelmäasetukset</string>
<string name="always_on_message">VPN-yhteyden käyttöoikeus on evätty. Tarkista</string>
<string name="prominent_background_location_message">Tämä toiminto vaatii taustapaikannusoikeuden, jotta Wi-Fi SSID:n seuranta on mahdollista myös sovelluksen ollessa suljettuna. Lisätietoja löydät Tuki-näkymään linkatusta tietosuojakäytännöstä.</string>
<string name="optional_default">"valinnainen, oletus: "</string>
<string name="donate">Lahjoita projektille</string>
<string name="add_from_clipboard">Lisää leikepöydältä</string>
<string name="ethernet_tunnel">Ethernet-tunneli</string>
<string name="quick_actions">Pikatoiminnot</string>
<string name="advanced_settings">Lisäasetukset</string>
<string name="hide_scripts">Piilota skriptit</string>
<string name="qr_scan">QR-skannaus</string>
<string name="notifications">Ilmoitukset</string>
<string name="error_file_extension">Tiedosto ei ole .conf tai .zip-tiedosto</string>
<string name="tunnel_mobile_data">Tunneloi mobiilidatalla</string>
@@ -102,8 +94,6 @@
<string name="start_auto">Käynnistä automaattinen tunnelointi</string>
<string name="stop_auto">Kytke automaattinen tunnelointi pois päältä</string>
<string name="allow_lan_traffic">Salli LAN-tietoliikenne</string>
<string name="turn_off_tunnel">Toiminto vaatii, että tunneli on pois päältä</string>
<string name="error_authentication_failed">Tunnistautuminen epäonnistui</string>
<string name="display_theme">Teema</string>
<string name="skip">Ohita</string>
<string name="add_wifi_name">Lisää WIFI:n nimi</string>
@@ -112,16 +102,11 @@
<string name="enabled_app_shortcuts">Salli sovelluksen pikakuvakkeet</string>
<string name="automatic">Automaattinen</string>
<string name="tunnel_name">Tunnelin nimi</string>
<string name="sec">sek</string>
<string name="read_logs">Lue lokitiedot</string>
<string name="mobile_tunnel">Mobiilidatatunneli</string>
<string name="restart_at_boot">Käynnistä laitteen käynnistyksen yhteydessä</string>
<string name="always_on_message2">varmistaaksesi, että Aina päällä oleva VPN on kytketty pois päältä kaikkien muiden sovellusten osalta ja yritä uudelleen</string>
<string name="background_location_message">Tätä toimintoa varten tulee sijainnin käyttölupa olla aina sallittuna ja/tai tarkka sijainti käytössä. Katso</string>
<string name="app_settings">sovelluksen asetukset</string>
<string name="root_accepted">Root hyväksytty</string>
<string name="set_custom_ping_ip">Määrittele pingin ip-osoite</string>
<string name="set_custom_ping_internal">Pingin aikaväli (sek)</string>
<string name="show_amnezia_properties">Näytä Amnezia-asetukset</string>
<string name="launch_app_settings">Käynnistä sovelluksen asetukset</string>
<string name="use_wildcards">Käytä jokerimerkkiä nimissä</string>
+6 -32
View File
@@ -1,6 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<?xml version='1.0' encoding='utf-8'?>
<resources>
<string name="turn_off_tunnel">Cette action nécessite la désactivation du tunnel</string>
<string name="no_tunnels">Aucun tunnel n\'a été ajouté pour le moment!</string>
<string name="tunnels">Tunnels</string>
<string name="tunnel_mobile_data">Tunnel sur données mobiles</string>
@@ -9,8 +8,6 @@
<string name="prominent_background_location_title">Divulgation de la localisation en arrière-plan</string>
<string name="thank_you">Merci d\'utiliser WG Tunnel!</string>
<string name="add_tunnels_text">Ajouter depuis un fichier ou un zip</string>
<string name="open_file">Fichier ouvert</string>
<string name="qr_scan">Scan du code QR</string>
<string name="exclude">Exclure</string>
<string name="dns_servers">Serveurs DNS</string>
<string name="mtu">MTU</string>
@@ -22,7 +19,6 @@
<string name="location_services_not_detected">Services de localisation non détectés</string>
<string name="auto_tunneling">Tunnel automatique</string>
<string name="vpn_off">VPN éteint</string>
<string name="turn_on_tunnel">Cette action nécessite un tunnel actif</string>
<string name="add_peer">Ajouter un pair</string>
<string name="rotate_keys">Rotation des clés</string>
<string name="error_file_extension">Le fichier n\'est pas un .conf ou .zip</string>
@@ -43,7 +39,6 @@
<string name="interface_">Interface</string>
<string name="copy_public_key">Copier la clé publique</string>
<string name="base64_key">clé base64</string>
<string name="comma_separated_list">liste séparée par des virgules</string>
<string name="listen_port">Port d\'écoute</string>
<string name="random">(aléatoire)</string>
<string name="persistent_keepalive">Keepalive persistant</string>
@@ -51,44 +46,35 @@
<string name="preshared_key">Clé pré-partagée</string>
<string name="cancel">Annuler</string>
<string name="seconds">secondes</string>
<string name="error_authentication_failed">Échec de l\'authentification</string>
<string name="error_authorization_failed">Autorisation échouée</string>
<string name="tunnel_on_wifi">Tunnel sur wifi non approuvé</string>
<string name="email_chooser">Envoyer un mail…</string>
<string name="docs_description">Lire la documentation</string>
<string name="email_description">Envoyer un mail</string>
<string name="use_kernel">Utiliser le module noyau</string>
<string name="error_ssid_exists">Le SSID existe déjà</string>
<string name="error_root_denied">Accès au shell en tant que root interdit</string>
<string name="error_no_file_explorer">Aucun explorateur de fichier n\'est installé</string>
<string name="auto_tunnel_title">Service de tunnel automatique</string>
<string name="delete_tunnel">Supprimer un tunnel</string>
<string name="delete_tunnel_message">Êtes-vous sûr de vouloir supprimer ce tunnel?</string>
<string name="delete_tunnel_message">Êtes-vous sûr de vouloir supprimer ce tunnel ?</string>
<string name="no_email_detected">Aucune application de mail détectée</string>
<string name="no_browser_detected">Aucun navigateur détecté</string>
<string name="open_issue">Signaler un problème</string>
<string name="incorrect_pin">Code PIN incorrect</string>
<string name="enter_pin">Entrez votre code PIN</string>
<string name="create_pin">Créer un code PIN</string>
<string name="restart_on_ping">Redémarrer après échec du ping (beta)</string>
<string name="enter_pin">Entrez votre code NIP</string>
<string name="create_pin">Créer un NIP</string>
<string name="restart_on_ping">Redémarrer après l\'échec du ping (beta)</string>
<string name="mobile_data_tunnel">Définir comme tunnel de données mobiles</string>
<string name="version">Version</string>
<string name="support">Support</string>
<string name="junk_packet_minimum_size">Taille minimum des paquets indésirables</string>
<string name="init_packet_junk_size">Initialiser la taille des paquets indésirables</string>
<string name="response_packet_junk_size">Taille des paquets indésirables en réponse</string>
<string name="init_packet_magic_header">Initialiser l\'en-tête magique des paquets indésirables</string>
<string name="init_packet_magic_header">Initialiser l\'en-tête magique</string>
<string name="underload_packet_magic_header">En-tête magique des paquets indésirables de sous-charge</string>
<string name="unsure_how">si vous n\'êtes pas sûr de comment procéder</string>
<string name="see_the">Voir le</string>
<string name="error_file_format">Format de configuration du tunnel invalide</string>
<string name="restart_at_boot">Redémarrer au démarrage du système</string>
<string name="vpn_settings">paramètres système des VPN</string>
<string name="app_settings">les réglages de l\'application</string>
<string name="background_location_message2">afin de s\'assurer que ces permissions soient actives</string>
<string name="root_accepted">Accès au shell root autorisé</string>
<string name="set_custom_ping_ip">Personnaliser l\'ip à pinguer</string>
<string name="optional_default">"optionnel, par défaut : "</string>
<string name="show_amnezia_properties">Voir les propriétés d\'Amnezia</string>
<string name="never">jamais</string>
<string name="handshake">handshake</string>
@@ -116,15 +102,9 @@
<string name="vpn_denied_dialog_title">Permission Refusée</string>
<string name="always_on_message">Connexion au VPN interdite. Merci de vérifier les</string>
<string name="always_on_message2">afin de s\'assurer que le VPN permanent est désactivé pour toutes les autres applis puis réessayer</string>
<string name="background_location_message">L\'accès à la permission de localisation permanente et/ou la localisation précise est nécessaire pour cette fonctionnalité. Veuillez vérifier dans</string>
<string name="default_ping_ip">(facultatif, par défaut les pairs)</string>
<string name="set_custom_ping_internal">Intervalle de ping (sec)</string>
<string name="set_custom_ping_cooldown">Temps d\'attente avant redémarrage du ping (sec)</string>
<string name="sec">sec</string>
<string name="add_from_clipboard">Ajouter depuis le presse-papiers</string>
<string name="primary_tunnel">Tunnel principal</string>
<string name="stop_auto">Arrêter l\'auto-tunnel</string>
<string name="kill_switch">Arrêt d\'urgence</string>
<string name="appearance">Apparence</string>
<string name="notifications">Notifications</string>
<string name="automatic">Automatique</string>
@@ -141,14 +121,12 @@
<string name="learn_more">En savoir plus</string>
<string name="use_wildcards">Utiliser les wildcards</string>
<string name="wildcards_active">Wildcards activé</string>
<string name="wifi_name_via_shell">Nom du Wifi via le shell</string>
<string name="use_root_shell_for_wifi">Utiliser un shell root pour obtenir le nom du wifi</string>
<string name="tunnel_running">Tunnel en cours d\'exécution</string>
<string name="monitoring_state_changes">Surveille les changements d’état</string>
<string name="donate">Faire un don au projet</string>
<string name="local_logging">Journalisation locale</string>
<string name="enable_local_logging">Activer la journalisation locale</string>
<string name="kernel_not_supported">Noyau non supporté</string>
<string name="start_auto">Démarrer l\'auto-tunnel</string>
<string name="exclude_lan">Exclure le LAN</string>
<string name="tunnel_specific_settings">Réglages spécifiques du tunnel</string>
@@ -162,8 +140,6 @@
<string name="ethernet_tunnel">Tunnel ethernet</string>
<string name="set_ethernet_tunnel">Définir comme tunnel ethernet</string>
<string name="native_kill_switch">Arrêt d\'urgence natif</string>
<string name="vpn_kill_switch">Arrêt d\'urgence VPN</string>
<string name="kill_switch_options">Options d\'arrêt d\'urgence</string>
<string name="allow_lan_traffic">Autoriser le trafic LAN</string>
<string name="bypass_lan_for_kill_switch">Contourner le LAN en cas d\'arêt d\'urgence</string>
<string name="stop">arrêter</string>
@@ -185,8 +161,6 @@
<string name="search">Rechercher</string>
<string name="save">Sauvegarder</string>
<string name="copy">Copier</string>
<string name="info">Informations</string>
<string name="prefer_ipv4">Préférer une connexion IPv4</string>
<string name="allow">Autoriser</string>
<string name="app_permission_title">Pont de contrôle du tunnel WG</string>
<string name="app_permission_description">Contrôler les tunnels et les fonctions automatiques des tunnels.</string>
+1 -19
View File
@@ -1,13 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<?xml version='1.0' encoding='utf-8'?>
<resources>
<string name="version">Versi</string>
<string name="settings">Pengaturan</string>
<string name="support">Support</string>
<string name="kernel">Kernel</string>
<string name="init_packet_junk_size">Ukuran sampah paket init</string>
<string name="app_name">WG Tunnel</string>
<string name="error_file_extension">File bukan .conf atau .zip</string>
<string name="turn_off_tunnel">Aksi memerlukan tunnel mati</string>
<string name="no_tunnels">Belum ada tunnel yang ditambahkan!</string>
<string name="tunnels">Tunnel</string>
<string name="tunnel_mobile_data">Tunnel pada data seluler</string>
@@ -18,18 +16,15 @@
<string name="thank_you">Terima kasih telah menggunakan WG Tunnel!</string>
<string name="trusted_ssid_value_description">Kirim SSID</string>
<string name="add_tunnels_text">Tambah dari file atau zip</string>
<string name="open_file">Buka File</string>
<string name="add_from_qr">Tambahkan dari kode QR</string>
<string name="auto_tunneling">Tunnel-otomatis</string>
<string name="vpn_off">VPN mati</string>
<string name="vpn_on">VPN aktif</string>
<string name="create_import">Buat dari awal</string>
<string name="turn_on_tunnel">Tindakan memerlukan tunnel aktif</string>
<string name="add_peer">Tambahkan rekan</string>
<string name="interface_">Interface</string>
<string name="rotate_keys">Putar tombol</string>
<string name="private_key">Kunci privat</string>
<string name="comma_separated_list">Daftar yang dipisahkan koma</string>
<string name="listen_port">Dengarkan port</string>
<string name="random">(acak)</string>
<string name="optional">(opsional)</string>
@@ -37,7 +32,6 @@
<string name="seconds">detik</string>
<string name="persistent_keepalive">Tetap hidup</string>
<string name="cancel">Batal</string>
<string name="error_authorization_failed">Gagal mengotorisasi</string>
<string name="enabled_app_shortcuts">Mengaktifkan pintasan aplikasi</string>
<string name="unknown_error">Terjadi kesalahan yang tidak diketahui</string>
<string name="tunnel_on_wifi">Tunnel di wifi yang tidak tepercaya</string>
@@ -45,7 +39,6 @@
<string name="email_chooser">Kirim email…</string>
<string name="docs_description">Baca dokumentasi</string>
<string name="email_description">Kirimkan email kepada saya</string>
<string name="use_kernel">Gunakan modul kernel</string>
<string name="error_ssid_exists">SSID sudah ada</string>
<string name="error_root_denied">Root shell ditolak</string>
<string name="error_no_file_explorer">Tidak ada file explorer yang diinstal</string>
@@ -69,30 +62,19 @@
<string name="unsure_how">Jika Anda tidak yakin bagaimana melanjutkannya</string>
<string name="see_the">Lihat</string>
<string name="getting_started_guide">Panduan Memulai</string>
<string name="error_file_format">Format konfigurasi tunnel tidak valid</string>
<string name="restart_at_boot">Mulai ulang saat boot</string>
<string name="vpn_denied_dialog_title">Izin Ditolak</string>
<string name="vpn_settings">Pengaturan sistem VPN</string>
<string name="always_on_message">Izin koneksi VPN telah ditolak. Silakan periksa</string>
<string name="always_on_message2">untuk memastikan VPN Selalu aktif dimatikan untuk semua aplikasi lain dan coba lagi</string>
<string name="background_location_message">Izinkan izin lokasi sepanjang waktu dan/atau lokasi yang tepat diperlukan untuk fitur ini. Silakan lihat</string>
<string name="app_settings">pengaturan aplikasi</string>
<string name="background_location_message2">untuk memastikan izin ini diaktifkan.</string>
<string name="root_accepted">Shell root diterima</string>
<string name="set_custom_ping_ip">Atur ip ping kustom</string>
<string name="default_ping_ip">(optional, default ke peers)</string>
<string name="set_custom_ping_internal">Interval ping (detik)</string>
<string name="optional_default">"opsional, default: "</string>
<string name="set_custom_ping_cooldown">Cooldown Ping restart (detik)</string>
<string name="show_amnezia_properties">Tampilkan properti Amnezia</string>
<string name="never">tidak pernah</string>
<string name="sec">dtk</string>
<string name="handshake">handshake</string>
<string name="vpn_channel_name">Notifikasi Saluran VPN</string>
<string name="prominent_background_location_message">Fitur ini memerlukan izin lokasi latar belakang untuk mengaktifkan pemantauan SSID Wi-Fi bahkan saat aplikasi ditutup. Untuk detail lebih lanjut, silakan lihat Kebijakan Privasi yang ditautkan di layar Dukungan.</string>
<string name="copy_public_key">Salin kunci publik</string>
<string name="base64_key">kunci base64</string>
<string name="error_authentication_failed">Autentikasi gagal</string>
<string name="enable_app_lock">Aktifkan kunci aplikasi</string>
<string name="delete_tunnel">Hapus tunnel</string>
<string name="delete_tunnel_message">Apakah Anda yakin ingin menghapus tunnel ini?</string>
+103 -55
View File
@@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<?xml version='1.0' encoding='utf-8'?>
<resources>
<string name="error_file_extension">Il file non è .conf o .zip</string>
<string name="allowed_ips">IP consentiti</string>
@@ -6,14 +6,11 @@
<string name="interface_">Interfaccia</string>
<string name="rotate_keys">Ruota chiavi</string>
<string name="private_key">Chiave privata</string>
<string name="base64_key">chiave base64</string>
<string name="comma_separated_list">elenco separato da virgola</string>
<string name="base64_key">Chiave base64</string>
<string name="listen_port">Porta d\'ascolto</string>
<string name="error_authorization_failed">Autorizzazione fallita</string>
<string name="error_no_file_explorer">Nessun gestore file installato</string>
<string name="app_name">Tunnel WG</string>
<string name="vpn_channel_name">Canale di notifica VPN</string>
<string name="turn_off_tunnel">L\'operaz. richiede la disatt. del tunnel</string>
<string name="public_key">Chiave pubblica</string>
<string name="addresses">Indirizzi</string>
<string name="dns_servers">Server DNS</string>
@@ -28,8 +25,7 @@
<string name="random">(casuale)</string>
<string name="optional">(opzionale)</string>
<string name="preshared_key">Chiave pre-condivisa</string>
<string name="error_authentication_failed">Autenticazione fallita</string>
<string name="tunnels">Tunnels</string>
<string name="tunnels">Tunnel</string>
<string name="tunnel_mobile_data">Tunnel su dati mobili</string>
<string name="privacy_policy">Guarda la policy sulla privacy</string>
<string name="okay">Okay</string>
@@ -37,25 +33,23 @@
<string name="name">Nome</string>
<string name="always_on_vpn_support">Permetti VPN sempre attiva</string>
<string name="location_services_not_detected">Servizi di localizzazione non rilevati</string>
<string name="auto_tunneling">Tunnel automatico</string>
<string name="auto_tunneling">Tunneling automatico</string>
<string name="vpn_on">VPN on</string>
<string name="vpn_off">VPN off</string>
<string name="create_import">Crea da zero</string>
<string name="turn_on_tunnel">L\'operazione richiede un tunnel attivo</string>
<string name="add_peer">Aggiungi peer</string>
<string name="copy_public_key">Copia chiave pubblica</string>
<string name="seconds">secondi</string>
<string name="seconds">Secondi</string>
<string name="persistent_keepalive">Keepalive persistente</string>
<string name="cancel">Annulla</string>
<string name="unknown_error">Avvenuto errore sconosciuto</string>
<string name="tunnel_on_wifi">Tunnel su wifi non fidato</string>
<string name="use_kernel">Usa modulo kernel</string>
<string name="error_ssid_exists">L\'SSID esiste già</string>
<string name="error_root_denied">Shell di root negata</string>
<string name="prominent_background_location_title">Permesso localizzazione in background</string>
<string name="location_services_missing_message">Questa app non rileva alcun servizio di localizzazione attivo sul tuo dispositivo. Indipendentemente dal dispositivo, questo potrebbe causare il fallimento nel recuperare il nome wifi da parte della funzione wifi non fidate. Vuoi continuare comunque?</string>
<string name="read_logs">Leggi i log</string>
<string name="auto">(auto)</string>
<string name="auto">(Auto)</string>
<string name="underload_packet_magic_header">Magic header pacchetto sottocarico</string>
<string name="unsure_how">se non sei sicuro su come procedere</string>
<string name="vpn_settings">Impostazioni sistema VPN</string>
@@ -64,7 +58,6 @@
<string name="delete_tunnel">Cancella tunnel</string>
<string name="init_packet_junk_size">Inizializza la dimensione dei pacchetti indesiderati</string>
<string name="always_on_message2">per essere sicuro che la VPN Always-on sia spenta per tutte le altre app e riprova</string>
<string name="background_location_message">Permetti i permessi per la localizzazione durante tutto il tempo e/o la localizzazione precisa è richiesta per questa funzione. Vedi la</string>
<string name="config_changes_saved">Salvate modifiche configurazione.</string>
<string name="delete_tunnel_message">Sei certo di voler cancellare questo tunnel?</string>
<string name="thank_you">Grazie per usare WG Tunnel!</string>
@@ -72,7 +65,7 @@
<string name="exclude">Escludi</string>
<string name="include">Includi</string>
<string name="yes">Si</string>
<string name="all">tutte</string>
<string name="all">Tutto</string>
<string name="no_email_detected">Nessuna app email rilevata</string>
<string name="no_browser_detected">Nessun browser rilevato</string>
<string name="incorrect_pin">Il PIN non è corretto</string>
@@ -83,7 +76,6 @@
<string name="set_primary_tunnel">Imposta come tunnel principale</string>
<string name="use_tunnel_on_wifi_name">Usa tunnel su nome wifi</string>
<string name="edit_tunnel">Modifica tunnel</string>
<string name="version">Versione</string>
<string name="settings">Impostazioni</string>
<string name="support">Supporto</string>
<string name="kernel">Kernel</string>
@@ -94,37 +86,23 @@
<string name="response_packet_magic_header">Magic header pacchetto risposta</string>
<string name="getting_started_guide">guida di avvio rapido</string>
<string name="see_the">Vedi la</string>
<string name="error_file_format">Formato configurazione tunnel non valido</string>
<string name="restart_at_boot">Riavvia al boot</string>
<string name="vpn_denied_dialog_title">Permesso Negato</string>
<string name="app_settings">impostazioni app</string>
<string name="background_location_message2">per assicurarti che questi permessi siano abilitati</string>
<string name="root_accepted">Accesso alla shell root accettata</string>
<string name="set_custom_ping_ip">Imposta ip ping personalizzato</string>
<string name="default_ping_ip">(opzionale, default ai peers)</string>
<string name="set_custom_ping_internal">Intervallo ping (sec)</string>
<string name="optional_default">"opzionale, default: "</string>
<string name="set_custom_ping_cooldown">Tempo attesa prima della ripartenza ping (sec)</string>
<string name="show_amnezia_properties">Mostra proprietà Amnezia</string>
<string name="add_tunnels_text">Aggiungi da file o zip</string>
<string name="open_file">Apri file</string>
<string name="add_from_qr">Aggiungi da codice QR</string>
<string name="qr_scan">Scansione QR</string>
<string name="tunnel_name">Nome Tunnel</string>
<string name="open_issue">Apri un problema</string>
<string name="enter_pin">Inserisci il tuo PIN</string>
<string name="enter_pin">Inserisci PIN</string>
<string name="create_pin">Crea PIN</string>
<string name="transport_packet_magic_header">Magic header pacchetto trasporto</string>
<string name="kill_switch_off">Arresta kill switch su fidate</string>
<string name="prominent_background_location_message">Questa caratteristica richiede il permesso di localizzazione in background per abilitare il monitoraggio dell\'SSID Wi-fi anche quando l\'applicazione è chiusa. Per più dettagli, verifica la Privacy Policy linkata nella schermata di supporto.</string>
<string name="auto_tunnel_title">Servizio tunnel automatico</string>
<string name="mobile_tunnel">Tunnel dati mobili</string>
<string name="wifi_name_via_shell">Nome wifi via shell</string>
<string name="use_root_shell_for_wifi">Usa una shell di robot per recuperare il nome wifi</string>
<string name="use_root_shell_for_wifi">Utilizzare una shell root per ottenere le informazioni Wi-Fi, evitando la necessità dell\'autorizzazioni della posizione</string>
<string name="stop_on_internet_loss">Ferma il tunnel in caso di perdita di collegamento internet</string>
<string name="ethernet_tunnel">Tunnel ethernet</string>
<string name="vpn_kill_switch">Kill switch VPN</string>
<string name="kill_switch_options">Opzioni kill switch</string>
<string name="allow_lan_traffic">Abilita traffico LAN</string>
<string name="tunnel_control">Controllo tunnel</string>
<string name="include_lan">Includi la LAN</string>
@@ -136,11 +114,11 @@
<string name="donate">Dona al progetto</string>
<string name="enable_local_logging">Abilita logging locale</string>
<string name="monitoring_state_changes">Monitora i cambi di stato</string>
<string name="stop">arrestato</string>
<string name="stop">Ferma</string>
<string name="tunnel_specific_settings">Configurazioni specifiche del tunnel</string>
<string name="show_scripts">Mostra gli script</string>
<string name="pre_up">Prima di avviarsi</string>
<string name="splt_tunneling">Split tunneling</string>
<string name="splt_tunneling">Tunneling diviso</string>
<string name="quick_actions">Azioni rapide</string>
<string name="debounce_delay">Ritardo debounce</string>
<string name="hide_amnezia_properties">Nascondi le proprietà di Amnezia</string>
@@ -148,20 +126,17 @@
<string name="enable_amnezia_compatibility">Abilita compatibilità Amnezia</string>
<string name="remove_amnezia_compatibility">Disabilita compatibilità Amnezia</string>
<string name="exclude_lan">Escludi la LAN</string>
<string name="share">Condividi</string>
<string name="select_all">Seleziona tutto</string>
<string name="never">mai</string>
<string name="never">Mai</string>
<string name="use_wildcards">Usa nomi jolly</string>
<string name="add_from_clipboard">Aggiungi dagli appunti</string>
<string name="trusted_wifi_names">Nomi wifi di fiducia</string>
<string name="add_wifi_name">Aggiungi un nome wifi</string>
<string name="primary_tunnel">Tunnel primario</string>
<string name="sec">sec</string>
<string name="post_down">Dopo essersi arrestato</string>
<string name="pre_down">Prima di arrestarsi</string>
<string name="light">Chiaro</string>
<string name="dark">Scuro</string>
<string name="bio_not_created">Biometria non creata</string>
<string name="search">Cerca</string>
<string name="app_permission_description">Controllo tunnel e funzionalità automatiche.</string>
<string name="enter_config_url">Inserisci un URL di configurazione</string>
@@ -170,15 +145,13 @@
<string name="active">Attivo</string>
<string name="dropdown">A discesa</string>
<string name="local_logging">Logging locale</string>
<string name="handshake">handshake</string>
<string name="handshake">Handshake</string>
<string name="logs">Logs</string>
<string name="notifications">Notifiche</string>
<string name="automatic">Automatico</string>
<string name="kill_switch">Kill switch</string>
<string name="dynamic">Dinamico</string>
<string name="language">Lingua</string>
<string name="display_theme">Tema schermo</string>
<string name="kernel_not_supported">Kernel non supportato</string>
<string name="tunnel_running">Tunnel avviato</string>
<string name="stop_on_no_internet">Ferma se non c\'è internet</string>
<string name="start_auto">Avvia tunnel automatico</string>
@@ -202,7 +175,6 @@
<string name="export_logs">Esporta i log salvati</string>
<string name="delete_logs">Cancella e pulisci i logs</string>
<string name="copy">Copia</string>
<string name="info">Informazioni</string>
<string name="export_tunnels_amnezia">Esporta i tunnel in modalità Amnezia</string>
<string name="export_tunnels_wireguard">Esporta i tunnel in modalità WireGuard</string>
<string name="delete">Cancella</string>
@@ -210,22 +182,16 @@
<string name="export_failed">Esportazione fallita</string>
<string name="tunnel_error_template">Tunnel interrotto: %1$s</string>
<string name="wifi_name_template">Attivo: %1$s</string>
<string name="auth_error">errore non autorizzato</string>
<string name="service_running_error">errore servizio non avviato</string>
<string name="auth_error">Non autorizzato</string>
<string name="service_running_error">Servizio non in esecuzione</string>
<string name="inactive">Inattivo</string>
<string name="remote_key_template">Chiave: %1$s</string>
<string name="config_error">errore di configurazione</string>
<string name="dns_resolve_error">errore risoluzione dns</string>
<string name="invalid_config_error">invalid_config_error</string>
<string name="bio_not_supported">Biometria non supportata</string>
<string name="bio_subtitle">Il log sta usando la tua autenticazione biometrica</string>
<string name="config_error">Configurazione non valida</string>
<string name="dns_resolve_error">Risoluzione DNS fallita</string>
<string name="enable_remote_app_control">Abilita controllo remoto app</string>
<string name="version_template">Versione: %1$s</string>
<string name="flavor_template">Caratteristica: %1$s</string>
<string name="kernel_name_error">nome errato modulo kernel</string>
<string name="status">Stato</string>
<string name="bio_auth_title">Autenticazione Biometrica</string>
<string name="bio_update_required">Aggiornamento richiesto sicurezza biometrica</string>
<string name="kernel_name_error">Nome modulo kernel errato</string>
<string name="tunnel_starting">Il tunnel si sta avviando</string>
<string name="update_available">Aggiornamento disponibile!</string>
<string name="permission_required">Permessi Richiesti</string>
@@ -235,7 +201,7 @@
<string name="install_updated_permission">Questa applicazione richiede i permessi per installare gli aggiornamenti.</string>
<string name="allow">Autorizza</string>
<string name="licenses">Licenze</string>
<string name="update_check_unsupported">Controllo degli aggiornamenti non supportato per questo tipo di build.</string>
<string name="update_check_unsupported">Controllo degli aggiornamenti non è supportato per questo tipo di build.</string>
<string name="darker">Più scuro</string>
<string name="security_template">Sicurezza: %1$s</string>
<string name="export_success">Esportazione riuscita</string>
@@ -244,7 +210,89 @@
<string name="update_check_failed">Controllo aggiornamenti fallito.</string>
<string name="checking_for_update">Controllo gli aggiornamenti</string>
<string name="amoled">AMOLED</string>
<string name="server_ipv4">Risoluzione nomi IPv4</string>
<string name="prefer_ipv4">Preferisci connessioni IPv4</string>
<string name="nothing_here_yet">Non c\'è ancora nulla qui!</string>
<string name="range_hint">(%1$d%2$d)</string>
<string name="tunnel_name_taken">Nome tunnel già in uso.</string>
<string name="password_no_spaces">La password non deve avere spazi.</string>
<string name="ports_must_differ">Fallito. I proxy devono avere porte differenti.</string>
<string name="config_error_template">Configurazione sbagliata. %1$s in posizione: %2$s.</string>
<string name="unknown_section">Sezione sconosciuta</string>
<string name="unknown_attribute">Attributo sconosciuto</string>
<string name="syntax_error">Errore di sintassi</string>
<string name="missing_section">Sezione mancante</string>
<string name="missing_attribute">Attributo mancante</string>
<string name="invalid_value">Valore non valido</string>
<string name="invalid_number">Nunero non valido</string>
<string name="invalid_key">Chiave non valida</string>
<string name="read_failed">Impossibile leggere i dati.</string>
<string name="system_features">Funzioni di sistema</string>
<string name="new_tunnel">Nuovo tunnel</string>
<string name="server_port">Server:Porta</string>
<string name="comma_separated">Separati da virgola</string>
<string name="doh">DNS su HTTPS (DoH)</string>
<string name="system">Sistema</string>
<string name="dns_protocol">Protocollo DNS</string>
<string name="dns_provider">Provider DNS</string>
<string name="dns_settings">Impostazioni DNS</string>
<string name="defaults_to_template">(predefinito è %1$s)</string>
<string name="http_bind_address">Indirizzo di ascolto HTTP</string>
<string name="socks_5_bind_address">Inidirizzo di ascolto SOCKS5</string>
<string name="show_password">Mostra password</string>
<string name="android_integrations">Integrazioni Android</string>
<string name="vpn">VPN</string>
<string name="proxy_settings">Impostazioni Proxy</string>
<string name="proxy_credentials">Credenziali Proxy</string>
<string name="password">Password</string>
<string name="username">Nome utente</string>
<string name="http_proxy">Proxy HTTP</string>
<string name="socks_5_proxy">Proxy SOCKS5</string>
<string name="selected">Selezionata</string>
<string name="backend_mode">Modalità app</string>
<string name="proxy">Proxy</string>
<string name="restore_application">Ripristina da backup</string>
<string name="backup_application">Backup dati applicazione</string>
<string name="backup_failed">Impossibile creare il backup.</string>
<string name="restore_failed">Impossibile ripristinare dal backup.</string>
<string name="restarting_app">Riavviando l\'app per applicare le modifiche…</string>
<string name="restore_success">Ripristino riuscito. %1$s</string>
<string name="backup_success">Bakcup riuscito. %1$s</string>
<string name="_false">Falso</string>
<string name="_true">Vero</string>
<string name="ping_target_template">Obiettivo ping: %1$s</string>
<string name="packet_loss_template">Pacchetti persi: %.2f%%</string>
<string name="packets_sent_template">Pacchetti inviati: %1$s</string>
<string name="jitter_template">Jitter: %1$s</string>
<string name="latency_template">Latenza: %1$s</string>
<string name="sec_ago_template">%1$s sec fa</string>
<string name="ping_success_template">Ultimo ping riuscito: %1$s</string>
<string name="reachable_template">Raggiungibile: %1$s</string>
<string name="tx_template">TX: %1$s MB</string>
<string name="rx_template">RX: %1$s MB</string>
<string name="current_template">Corrente: %1$s</string>
<string name="expiremental_template">%1$s (sperimentale)</string>
<string name="root_required_template">%1$s (root richiesto)</string>
<string name="recommended_template">%1$s (raccomandato)</string>
<string name="hint_template">(%1$s)</string>
<string name="show_qr">Mostra QR</string>
<string name="amnezia">Amnezia</string>
<string name="wireguard">WireGuard</string>
<string name="done">Fatto</string>
<string name="wifi_detection_method">Metodo di rilevamento Wi-Fi</string>
<string name="_default">Default</string>
<string name="legacy">Legacy</string>
<string name="root">Root</string>
<string name="shizuku">Shizuku</string>
<string name="release_notes">Note di rilascio</string>
<string name="shizuku_not_detected">Shizuku non rilevato</string>
<string name="sort">Ordina</string>
<string name="move_up">Sposta su</string>
<string name="move_down">Sposta giù</string>
<string name="tunnel">tunnel</string>
<string name="tunnel_item_description">1$s, %2$s, %3$s</string>
<string name="warning">Attenzione</string>
<string name="location_permissions">Permesso di geolocalizzazione</string>
<string name="open_settings">Apri impostazioni</string>
<string name="location_permissions_missing">Permesso di geolocalizzazone mancante</string>
<string name="fix">Fix</string>
<string name="start">Avvia</string>
</resources>
+1 -14
View File
@@ -1,10 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<?xml version='1.0' encoding='utf-8'?>
<resources>
<string name="app_name">WG Tunnel</string>
<string name="error_file_extension">ファイルが.confまたは.zipではありません</string>
<string name="vpn_channel_name">VPN通知チャンネル</string>
<string name="add_from_qr">QRコードから追加</string>
<string name="qr_scan">QRスキャン</string>
<string name="tunnel_name">VPNトンネル名</string>
<string name="public_key">公開鍵</string>
<string name="always_on_vpn_support">常時VPN接続を許可</string>
@@ -14,15 +13,12 @@
<string name="interface_">インターフェース</string>
<string name="private_key">秘密鍵</string>
<string name="copy_public_key">公開鍵のコピー</string>
<string name="comma_separated_list">カンマ区切りリスト</string>
<string name="optional">(オプション)</string>
<string name="seconds"></string>
<string name="persistent_keepalive">持続的キープアライブ</string>
<string name="cancel">キャンセル</string>
<string name="error_authentication_failed">認証に失敗しました</string>
<string name="unknown_error">不明なエラーが発生しました</string>
<string name="error_no_file_explorer">ファイルエクスプローラーはインストールされていません</string>
<string name="error_authorization_failed">認証に失敗しました</string>
<string name="enabled_app_shortcuts">アプリのショートカットを有効にする</string>
<string name="location_services_missing_message">アプリがデバイスで有効になっている位置情報サービスを検出しません。 デバイスによっては、信頼されていない無線LAN機能がWiFi名を読み取れない可能性があります。このまま続けますか?</string>
<string name="no_email_detected">メールアプリは検出されません</string>
@@ -30,10 +26,8 @@
<string name="no_browser_detected">ブラウザは検出されません</string>
<string name="error_ssid_exists">SSIDはすでに存在します</string>
<string name="mtu">MTU</string>
<string name="turn_off_tunnel">実行にはトンネルオフが必要</string>
<string name="thank_you">WGトンネルをご利用いただきありがとうございます!</string>
<string name="add_tunnels_text">ファイルまたはzipから追加する</string>
<string name="open_file">ファイルを開く</string>
<string name="dns_servers">DNSサーバー</string>
<string name="preshared_key">事前共有鍵</string>
<string name="delete_tunnel_message">このトンネルを削除しますか?</string>
@@ -44,25 +38,21 @@
<string name="prominent_background_location_message">この機能は、アプリケーションを閉じている間でもWi-Fi SSIDの監視を可能にするため、バックグラウンドでの位置情報の許可が必要です。 詳しくはサポート画面のプライバシーポリシーをご覧ください。</string>
<string name="email_chooser">メールを送る…</string>
<string name="docs_description">Read the docs</string>
<string name="use_kernel">カーネルモジュールを使用する</string>
<string name="exclude">除外</string>
<string name="include">含有</string>
<string name="config_changes_saved">設定変更が保存された。</string>
<string name="peer">ピア</string>
<string name="allowed_ips">許可IPアドレス</string>
<string name="endpoint">エンドポイント</string>
<string name="turn_on_tunnel">実行に有効なVPNトンネルが必要です</string>
<string name="add_peer">ピアの追加</string>
<string name="delete_tunnel">トンネルの削除</string>
<string name="unsure_how">操作方法がわからない場合</string>
<string name="background_location_message">この機能には『常に許可』の位置情報権限および/または正確な位置情報が必要です。以下をご覧ください</string>
<string name="tunnel_on_ethernet">Ethernetでのトンネルの有効化</string>
<string name="open_issue">問題を報告する</string>
<string name="incorrect_pin">PINが無効です</string>
<string name="read_logs">ログを確認する</string>
<string name="pin_created">PINの登録が完了しました</string>
<string name="settings">設定</string>
<string name="set_custom_ping_internal">Ping間隔 (秒)</string>
<string name="tunnel_mobile_data">モバイルデータでのトンネルの有効化</string>
<string name="tunnel_on_wifi">信頼していないWifiでの有効化</string>
<string name="enter_pin">PINコードを入力</string>
@@ -71,14 +61,11 @@
<string name="edit_tunnel">トンネルの編集</string>
<string name="create_pin">新規PINを作成</string>
<string name="use_tunnel_on_wifi_name">指定WiFiでトンネルを適用</string>
<string name="version">バージョン</string>
<string name="mobile_data_tunnel">モバイルデータトンネルに設定</string>
<string name="enable_app_lock">アプリロックを有効にする</string>
<string name="always_on_message">VPN接続の許可が拒否されました。</string>
<string name="always_on_message2">他のすべてのアプリで常時接続VPNがオフになっていることを確認して、再度お試しください</string>
<string name="getting_started_guide">スタートガイド</string>
<string name="error_file_format">無効なトンネル設定フォーマット</string>
<string name="kill_switch">キルスイッチ</string>
<string name="notifications">通知</string>
<string name="logs">ログ</string>
<string name="add_from_clipboard">クリップボードからの追加</string>
+98 -27
View File
@@ -1,7 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<?xml version='1.0' encoding='utf-8'?>
<resources>
<string name="error_file_extension">Bestand is geen .conf of .zip</string>
<string name="turn_off_tunnel">Actie vereist uitgeschakelde tunnel</string>
<string name="tunnel_mobile_data">Tunnel bij mobiele data</string>
<string name="app_name">WG Tunnel</string>
<string name="vpn_channel_name">VPN Notificatiekanaal</string>
@@ -10,7 +9,6 @@
<string name="tunnel_on_ethernet">Tunnel bij ethernet</string>
<string name="no_tunnels">Nog geen tunnels geconfigureerd!</string>
<string name="okay">Oke</string>
<string name="error_authentication_failed">Authenticatie mislukt</string>
<string name="include">Meenemen</string>
<string name="addresses">Adres</string>
<string name="peer">Peer (extern systeem)</string>
@@ -20,21 +18,16 @@
<string name="endpoint">Endpoint</string>
<string name="name">Naam</string>
<string name="auto_tunneling">Auto-tunnelen</string>
<string name="turn_on_tunnel">Actie vereist actieve tunnel</string>
<string name="seconds">seconden</string>
<string name="persistent_keepalive">Persistent keepalive</string>
<string name="error_authorization_failed">Autorisatie mislukt</string>
<string name="enabled_app_shortcuts">App snelkoppelingen inschakelen</string>
<string name="random">(willekeurig)</string>
<string name="thank_you">Bedankt voor het gebruiken van WG Tunnel!</string>
<string name="trusted_ssid_value_description">Verstuur SSID</string>
<string name="add_tunnels_text">Toevoegen uit bestand of zip</string>
<string name="add_from_qr">Toevoegen met QR code</string>
<string name="qr_scan">QR scannen</string>
<string name="exclude">Uitsluiten</string>
<string name="config_changes_saved">Configuratiewijzigingen opgeslagen.</string>
<string name="comma_separated_list">Komma-gescheiden lijst</string>
<string name="open_file">Bestand openen</string>
<string name="public_key">Publieke sleutel</string>
<string name="tunnel_name">Tunnelnaam</string>
<string name="dns_servers">DNS servers</string>
@@ -67,7 +60,6 @@
<string name="mobile_data_tunnel">Stel in als mobiele datatunnel</string>
<string name="set_primary_tunnel">Stel in als primaire tunnel</string>
<string name="edit_tunnel">Tunnel bewerken</string>
<string name="version">Versie</string>
<string name="settings">Instellingen</string>
<string name="support">Ondersteuning</string>
<string name="junk_packet_minimum_size">Junk packet minimum grootte</string>
@@ -80,8 +72,6 @@
<string name="enter_pin">Vul PIN in</string>
<string name="pin_created">PIN aangemaakt</string>
<string name="use_tunnel_on_wifi_name">Gebruik tunnel bij WiFi naam</string>
<string name="error_file_format">Ongeldige tunnelconfiguratie</string>
<string name="set_custom_ping_ip">Stel eigen ping IP in</string>
<string name="add_peer">Peer toevoegen</string>
<string name="init_packet_magic_header">Initiële packet magic header</string>
<string name="prominent_background_location_title">Achtergrondlocatievrijgave</string>
@@ -89,7 +79,6 @@
<string name="email_subject">WG Tunnel ondersteuning</string>
<string name="email_chooser">Stuur een email…</string>
<string name="docs_description">Lees de documentatie</string>
<string name="use_kernel">Gebruik kernelmodus</string>
<string name="error_ssid_exists">SSID bestaat al</string>
<string name="error_root_denied">Root toegang geweigerd</string>
<string name="tunnel_on_wifi">Tunnelen bij onvertrouwde WiFi</string>
@@ -100,12 +89,8 @@
<string name="restart_at_boot">Herstart na systeemstart</string>
<string name="always_on_message">VPN verbindingstoegang geweigerd. Controleer aub de</string>
<string name="always_on_message2">om zeker te zijn dat Altijd-aan VPN is uitgeschakeld voor alle andere apps, en probeer dan opnieuw</string>
<string name="default_ping_ip">(optioneel, standaard op peers)</string>
<string name="set_custom_ping_cooldown">Ping herstart afkoelperiode (sec)</string>
<string name="background_location_message2">om te controleren of toegang is verleend</string>
<string name="show_amnezia_properties">Amnezia instellingen weergeven</string>
<string name="never">nooit</string>
<string name="sec">sec</string>
<string name="handshake">handshake</string>
<string name="logs">Logboeken</string>
<string name="email_description">Stuur mij een email</string>
@@ -113,15 +98,10 @@
<string name="getting_started_guide">\"aan de slag\" handleiding</string>
<string name="vpn_denied_dialog_title">Toegang geweigerd</string>
<string name="vpn_settings">VPN systeeminstellingen</string>
<string name="app_settings">app instellingen</string>
<string name="root_accepted">Root toegang verleend</string>
<string name="set_custom_ping_internal">Ping interval (sec)</string>
<string name="optional_default">"optioneel, standaard "</string>
<string name="prominent_background_location_message">Deze functie vereist locatierechten om het WiFi SSID te kunnen bepalen. Ook als de applicatie is gesloten. Lees het privacybeleid op het scherm Ondersteuning voor meer informatie.</string>
<string name="location_services_missing_message">De app kan geen ingeschakelde locatieservices op je apparaat vinden. Afhankelijk van het type apparaat kan dit leiden tot een niet functionerende herkenning van het verbonden WiFi netwerk. De niet-vertrouwde WiFi functionaliteit werkt daardoor mogelijk niet. Toch doorgaan?</string>
<string name="background_location_message">Permanente achtergrondtoegang tot exacte locatie is vereist voor deze functie. Bekijk aub de</string>
<string name="transport_packet_magic_header">Transport packet magic header</string>
<string name="kill_switch">Kill-switch</string>
<string name="appearance">Uiterlijk</string>
<string name="light">Licht</string>
<string name="dynamic">Dynamisch</string>
@@ -134,7 +114,7 @@
<string name="set_ethernet_tunnel">Instellen als ethernet tunnel</string>
<string name="allow_lan_traffic">LAN trafiek toestaan</string>
<string name="vpn_channel_description">Een kanaal voor VPN status notificaties</string>
<string name="stop">stop</string>
<string name="stop">Stop</string>
<string name="splt_tunneling">Gesplitste tunneling</string>
<string name="tunnel_specific_settings">Tunnel specifieke instellingen</string>
<string name="advanced_settings">Geavanceerde instellingen</string>
@@ -152,11 +132,7 @@
<string name="stop_on_internet_loss">Stop tunnel bij verlies van internet</string>
<string name="mobile_tunnel">Mobiele datatunnel</string>
<string name="wildcards_active">Wildcards actief</string>
<string name="wifi_name_via_shell">Wifi naam via shell</string>
<string name="vpn_kill_switch">VPN kill switch</string>
<string name="kill_switch_options">Kill switch opties</string>
<string name="use_root_shell_for_wifi">Gebruik root shell om wifi naam te bepalen</string>
<string name="kernel_not_supported">Kernel niet ondersteund</string>
<string name="use_root_shell_for_wifi">Gebruik root shell om wifi naam te bepalen, zodat locatie toestemmingen niet nodig zijn</string>
<string name="start_auto">Start auto-tunnel</string>
<string name="stop_auto">Stop auto-tunnel</string>
<string name="tunnel_running">Tunnel actief</string>
@@ -171,4 +147,99 @@
<string name="app_permission_description">Configureer tunnels een auto-tunnel instellingen.</string>
<string name="skip">Overslaan</string>
<string name="primary_tunnel">Primaire tunnel</string>
<string name="allow">Sta toe</string>
<string name="licenses">Licenties</string>
<string name="update_check_unsupported">Update controle is niet ondersteund voor dit build type</string>
<string name="darker">Donkerder</string>
<string name="amoled">AMOLED</string>
<string name="show_qr">Toon QR Code</string>
<string name="amnezia">Amnezia</string>
<string name="wireguard">WireGuard</string>
<string name="done">Klaar</string>
<string name="wifi_detection_method">Wi-Fi detectie methode</string>
<string name="_default">Standaard</string>
<string name="legacy_api_description">Gebruik een oude Android 12 methode om Wi-Fi informatie te verzamelen die locatie aanvragen beperkt, maar mogelijk niet goed werkt op nieuwe toestellen.</string>
<string name="use_android_recommended">Gebruik Android aanbevolen methode om Wi-Fi intormatie te verzamelen, gebaseerd op Android versie</string>
<string name="release_notes">Release notes</string>
<string name="shizuku_not_detected">Shizuku niet gedetecteerd</string>
<string name="sort">Sorteer</string>
<string name="move_up">Naar Boven</string>
<string name="move_down">Naar Beneden</string>
<string name="error_tunnel_name">Tunnel naam moet 15 karakters of minder zijn in kernel modus</string>
<string name="tunnel">tunnel</string>
<string name="warning">Waarschuwing</string>
<string name="location_permissions">Locatie toestemmingen</string>
<string name="location_justification">Om Wi-Fi namen te kunnen uitlezen in de achtergrond met jouw huidige detectie methode, is het nodig in Android om de toestemmingen \'Laat altijd toe\' en \'Precies\' (Achtergrond locatie op oudere toestellen) te geven. Geef aub deze toestemmingen in je Android app instellingen.</string>
<string name="open_settings">Open Instellingen</string>
<string name="location_permissions_missing">Locatie toestemming ontbreekt</string>
<string name="fix">Herstel</string>
<string name="start">Start</string>
<string name="auto_tunnel_running">Auto-tunnel is actief</string>
<string name="auto_tunnel_not_running">Auto-tunnel is niet actief</string>
<string name="auth_error">Niet toegelaten</string>
<string name="service_running_error">Service niet actief</string>
<string name="inactive">Niet actief</string>
<string name="active">Actief</string>
<string name="tunnel_starting">Tunnel wordt gestart</string>
<string name="enable_remote_app_control">Activeer applicatie controle vanop afstand</string>
<string name="nothing_here_yet">Nog niets hier!</string>
<string name="select_all">Selecteer alles</string>
<string name="export_success">Export gelukt</string>
<string name="download">Download</string>
<string name="check_for_update">Controleer op update</string>
<string name="update_check_failed">Controleer op update niet gelukt.</string>
<string name="checking_for_update">Controleren op updates</string>
<string name="latest_installed">U heeft reeds de laatste versie.</string>
<string name="update_download_failed">Downloaden van de update niet gelukt.</string>
<string name="update_available">Update beschikbaar!</string>
<string name="download_and_install">Download en installeer</string>
<string name="permission_required">Toestemming vereist</string>
<string name="install_updated_permission">Deze app heeft toestemming nodig om updates te installeren.</string>
<string name="app_permission_title">WG Tunnel Control Bridge</string>
<string name="display_theme">Scherm thema</string>
<string name="debounce_delay">Debounce vertraging</string>
<string name="exclude_lan">Sluit LAN uit</string>
<string name="include_lan">Inclusief LAN</string>
<string name="tunnel_control">Tunnel controle</string>
<string name="auto_tunnel">Auto-tunnel</string>
<string name="multiple">Meerdere</string>
<string name="enter_config_url">Voeg configuratie URL in</string>
<string name="error_download_failed">Downloaden configuratie mislukt</string>
<string name="save">Bewaar</string>
<string name="search">Zoek</string>
<string name="select">Selecteer</string>
<string name="join_telegram">Suit je aan bij de Telegram gemeenschap</string>
<string name="join_matrix">Sluit je aan bij de Matrix gemeenschap</string>
<string name="dropdown">Keuzelijst</string>
<string name="add_tunnel">Voeg tunnel toe</string>
<string name="export_logs">Exporteer bewaarde logs</string>
<string name="delete_logs">Verwijder en maak logs leeg</string>
<string name="copy">Kopieer</string>
<string name="export_tunnels_amnezia">Exporteer tunnels als Amnezia</string>
<string name="export_tunnels_wireguard">Exporteer tunnels als WireGuard</string>
<string name="delete">Verwijder</string>
<string name="camera_permission_required">Kamera toestemming vereist</string>
<string name="export_failed">Export mislukt</string>
<string name="tunnel_error_template">Tunnel is mislukt: %1$s</string>
<string name="wifi_name_template">Actief: %1$s</string>
<string name="remote_key_template">Sleutel: %1$s</string>
<string name="version_template">Versie: %1$s</string>
<string name="security_template">Veiligheid: %1$s</string>
<string name="current_template">Huidige: %1$s</string>
<string name="flavor_template">Smaak: %1$s</string>
<string name="config_error">Configuratie ongeldig</string>
<string name="dns_resolve_error">DNS opzoeking niet gelukt</string>
<string name="kernel_name_error">Kernel module naam fout</string>
<string name="legacy">Verouderd</string>
<string name="root">Root</string>
<string name="shizuku">Shizuku</string>
<string name="native_kill_switch">Ingebouwde kill switch</string>
<string name="pre_up">Vooraleer op</string>
<string name="post_up">Na op</string>
<string name="pre_down">Vooraleer neer</string>
<string name="post_down">Na neer</string>
<string name="use_shell_via_shizuku">Gebruik schil via Shizuku om Wi-Fi informatie te verkrijgen, zodat locatie toestemming niet nodig is op toestellen die niet geroot zijn</string>
<string name="drag_handle">Sleep Handle</string>
<string name="tunnel_item_description">1$s, %2$s, %3$s</string>
<string name="bypass_lan_for_kill_switch">Gebruik LAN niet voor stop knop</string>
</resources>
+137 -51
View File
@@ -1,11 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<?xml version='1.0' encoding='utf-8'?>
<resources>
<string name="tunnels">Tunele</string>
<string name="app_name">WG Tunnel</string>
<string name="unsure_how">jeśli nie masz pewności, jak postępować</string>
<string name="getting_started_guide">przewodnik wprowadzający,</string>
<string name="peer">Peer</string>
<string name="background_location_message2">w celu upewnienia się, że uprawnienia te są włączone</string>
<string name="rotate_keys">Rotuj klucze</string>
<string name="tunnel_on_ethernet">Tunel przez sieć ethernetową</string>
<string name="public_key">Klucz publiczny</string>
@@ -14,7 +13,6 @@
<string name="auto_tunneling">Autotunelowanie</string>
<string name="vpn_on">Włącz VPN</string>
<string name="vpn_off">Wyłącz VPN</string>
<string name="turn_on_tunnel">Czynność wymaga aktywnego tunelu</string>
<string name="interface_">Interfejs</string>
<string name="enabled_app_shortcuts">Włącz skróty aplikacji</string>
<string name="privacy_policy">Wyświetl politykę prywatności</string>
@@ -28,11 +26,9 @@
<string name="transport_packet_magic_header">Nagłówek magicznego pakietu transportowego</string>
<string name="underload_packet_magic_header">Nagłówek magicznego pakietu niedociążenia</string>
<string name="see_the">Zobacz</string>
<string name="error_file_format">Nieprawidłowy format konfiguracji tunelu</string>
<string name="restart_at_boot">Uruchom ponownie przy rozruchu</string>
<string name="never">nigdy</string>
<string name="sec">sek.</string>
<string name="handshake">uzgadnianie</string>
<string name="never">Nigdy</string>
<string name="handshake">Uzgadnianie</string>
<string name="show_amnezia_properties">Pokaż właściwości protokołu Amnezia</string>
<string name="seconds">sek.</string>
<string name="prominent_background_location_message">Ta funkcja wymaga pozwolenia na dostęp do lokalizacji w tle, aby włączyć monitorowanie SSID sieci Wi-Fi nawet wtedy, gdy aplikacja jest zamknięta. Więcej szczegółów znajdziesz w polityce prywatności znajdującej się na ekranie Obsługa.</string>
@@ -54,8 +50,7 @@
<string name="no_browser_detected">Nie wykryto przeglądarki</string>
<string name="prominent_background_location_title">Ujawnienie lokalizacji w tle</string>
<string name="email_subject">Obsługa aplikacji WG Tunnel</string>
<string name="auto">(automatycznie)</string>
<string name="error_authorization_failed">Nie udało się autoryzować</string>
<string name="auto">(Automatycznie)</string>
<string name="add_from_clipboard">Dodaj ze schowka</string>
<string name="delete_tunnel_message">Czy na pewno chcesz usunąć ten tunel?</string>
<string name="tunnel_on_wifi">Tunel przez niezaufaną sieć Wi-Fi</string>
@@ -66,7 +61,6 @@
<string name="junk_packet_minimum_size">Minimalny rozmiar pakietu śmieciowego</string>
<string name="open_issue">Otwórz zagadnienie</string>
<string name="thank_you">Dziękujemy za korzystanie z aplikacji WG Tunnel!</string>
<string name="error_authentication_failed">Uwierzytelnianie nie powiodło się</string>
<string name="use_wildcards">Użyj symboli wieloznacznych nazw</string>
<string name="yes">Tak</string>
<string name="add_peer">Dodaj peera</string>
@@ -76,20 +70,16 @@
<string name="junk_packet_maximum_size">Maksymalny rozmiar pakietu śmieciowego</string>
<string name="local_logging">Lokalne rejestrowanie</string>
<string name="monitoring_state_changes">Monitorowanie zmian stanu</string>
<string name="version">Wersja</string>
<string name="add_tunnels_text">Dodaj z pliku lub archiwum ZIP</string>
<string name="unknown_error">Wystąpił nieznany błąd</string>
<string name="start_auto">Uruchom autotunel</string>
<string name="location_services_not_detected">Usługi lokalizacyjne nie zostały wykryte</string>
<string name="background_location_message">Ta funkcja wymaga zezwolenia na określenie lokalizacji w dowolnym momencie i/lub dokładnej lokalizacji. Sprawdź</string>
<string name="location_services_not_detected">Nie wykryto usług lokalizacyjnych</string>
<string name="auto_tunnel_title">Usługa autotunelu</string>
<string name="donate">Przekaż darowiznę na rzecz projektu</string>
<string name="trusted_ssid_value_description">Prześlij SSID</string>
<string name="all">wszystkie</string>
<string name="all">Wszystkie</string>
<string name="no_email_detected">Nie wykryto aplikacji pocztowej</string>
<string name="turn_off_tunnel">Czynność wymaga wyłączenia tunelu</string>
<string name="add_from_qr">Dodaj z kodu QR</string>
<string name="qr_scan">Skanuj kod QR</string>
<string name="tunnel_name">Nazwa tunelu</string>
<string name="include">Uwzględnij</string>
<string name="config_changes_saved">Zmiany konfiguracji zostały zapisane.</string>
@@ -97,11 +87,9 @@
<string name="endpoint">Punkt końcowy</string>
<string name="name">Nazwa</string>
<string name="private_key">Klucz prywatny</string>
<string name="comma_separated_list">lista rozdzielona przecinkami</string>
<string name="listen_port">Port nasłuchu</string>
<string name="always_on_vpn_support">Zezwalaj na stały VPN</string>
<string name="base64_key">klucz base64</string>
<string name="use_kernel">Użyj modułu jądra</string>
<string name="base64_key">Klucz Base64</string>
<string name="error_ssid_exists">SSID już istnieje</string>
<string name="error_no_file_explorer">Eksplorator plików nie jest zainstalowany</string>
<string name="error_root_denied">Odmowa powłoki użytkownika root</string>
@@ -112,13 +100,7 @@
<string name="junk_packet_count">Liczba pakietów śmieciowych</string>
<string name="init_packet_junk_size">Rozmiar śmieciowego pakietu początkowego</string>
<string name="vpn_denied_dialog_title">Odmowa zezwolenia</string>
<string name="app_settings">ustawienia aplikacji</string>
<string name="set_custom_ping_ip">Ustaw niestandardowy adres IP pingowania</string>
<string name="default_ping_ip">(opcjonalnie, domyślnie do peerów)</string>
<string name="set_custom_ping_internal">Interwał pingowania (sek.)</string>
<string name="optional_default">"opcjonalnie, domyślnie: "</string>
<string name="logs">Dzienniki</string>
<string name="kill_switch">Wyłącznik awaryjny</string>
<string name="appearance">Wygląd</string>
<string name="notifications">Powiadomienia</string>
<string name="automatic">Automatyczny</string>
@@ -134,15 +116,11 @@
<string name="skip">Pomiń</string>
<string name="launch_app_settings">Uruchom ustawienia aplikacji</string>
<string name="learn_more">Dowiedz się więcej</string>
<string name="wifi_name_via_shell">Nazwa sieci Wi-Fi poprzez powłokę</string>
<string name="use_root_shell_for_wifi">Użyj powłoki użytkownika root, aby uzyskać nazwę sieci Wi-Fi</string>
<string name="kernel_not_supported">Jądro nie jest obsługiwane</string>
<string name="use_root_shell_for_wifi">Użyj powłoki użytkownika root, aby uzyskać informacje o sieci Wi-Fi, dzięki czemu nie będzie potrzeby uzyskiwania uprawnień do lokalizacji</string>
<string name="stop_auto">Zatrzymaj autotunel</string>
<string name="tunnel_running">Tunel jest uruchomiony</string>
<string name="enable_local_logging">Włącz lokalne rejestrowanie</string>
<string name="email_chooser">Wyślij wiadomość e-mail…</string>
<string name="set_custom_ping_cooldown">Czas odnowienia pingowania (sek.)</string>
<string name="open_file">Otwórz plik</string>
<string name="okay">OK</string>
<string name="no_tunnels">Nie dodano jeszcze żadnych tuneli!</string>
<string name="exclude">Wyklucz</string>
@@ -160,7 +138,7 @@
<string name="vpn_channel_description">Kanał powiadomień o stanie VPN</string>
<string name="auto_tunnel_channel_name">Kanał powiadomień autotunelu</string>
<string name="auto_tunnel_channel_description">Kanał powiadomień o stanie autotunelowania</string>
<string name="stop">zatrzymaj</string>
<string name="stop">Zatrzymaj</string>
<string name="splt_tunneling">Tunelowanie rozdzielone</string>
<string name="tunnel_specific_settings">Ustawienia specyficzne dla tunelu</string>
<string name="pre_up">Przed aktywacją</string>
@@ -169,8 +147,6 @@
<string name="post_down">Po dezaktywacji</string>
<string name="quick_actions">Szybkie czynności</string>
<string name="native_kill_switch">Natywny wyłącznik awaryjny</string>
<string name="vpn_kill_switch">Wyłącznik awaryjny VPN</string>
<string name="kill_switch_options">Opcje wyłącznika awaryjnego</string>
<string name="show_scripts">Pokaż skrypty</string>
<string name="hide_scripts">Ukryj skrypty</string>
<string name="debounce_delay">Opóźnienie odbicia</string>
@@ -182,15 +158,10 @@
<string name="hide_amnezia_properties">Ukryj właściwości protokołu Amnezia</string>
<string name="tunnel_control">Kontrola tunelu</string>
<string name="auto_tunnel">Autotunel</string>
<string name="kill_switch_off">Zatrzymaj wyłącznik awaryjny w zaufanej</string>
<string name="server_ipv4">Rozpoznawanie nazw hostów IPv6</string>
<string name="prefer_ipv4">Preferuj połączenie IPv4</string>
<string name="multiple">Wiele</string>
<string name="bio_auth_title">Uwierzytelnianie biometryczne</string>
<string name="active">Aktywny</string>
<string name="status">Stan</string>
<string name="app_permission_description">Sterowanie tunelami i funkcjami autotunelowania.</string>
<string name="kernel_name_error">błąd nazwy modułu jądra</string>
<string name="kernel_name_error">Błąd nazwy modułu jądra</string>
<string name="add_from_url">Dodaj z adresu URL</string>
<string name="export_failed">Eksport nie powiódł się</string>
<string name="inactive">Nieaktywny</string>
@@ -198,7 +169,7 @@
<string name="delete_logs">Usuń i wyczyść dzienniki</string>
<string name="join_telegram">Dołącz do społeczności Telegramu</string>
<string name="error_download_failed">Nie udało się pobrać konfiguracji</string>
<string name="service_running_error">błąd braku działania usługi</string>
<string name="service_running_error">Usługa nie działa</string>
<string name="app_permission_title">Mostek sterujący WG Tunnel</string>
<string name="enter_config_url">Wpisz adres URL konfiguracji</string>
<string name="save">Zapisz</string>
@@ -207,29 +178,22 @@
<string name="matrix_url">https://matrix.to/#/#wg-tunnel-space:matrix.org</string>
<string name="export_logs">Eksportuj zapisane dzienniki</string>
<string name="copy">Skopiuj</string>
<string name="info">Informacje</string>
<string name="export_tunnels_wireguard">Eksportuj tunele jako WireGuard</string>
<string name="delete">Usuń</string>
<string name="camera_permission_required">Wymagane zezwolenie na dostęp do aparatu</string>
<string name="tunnel_error_template">Tunel nie powiódł się z powodu: %1$s</string>
<string name="remote_key_template">Klucz: %1$s</string>
<string name="config_error">błąd konfiguracji</string>
<string name="config_error">Nieprawidłowa konfiguracja</string>
<string name="dropdown">Rozwijane</string>
<string name="auth_error">błąd braku autoryzacji</string>
<string name="bio_not_supported">Dane biometryczne nie są obsługiwane</string>
<string name="auth_error">Brak autoryzacji</string>
<string name="tunnel_starting">Uruchamianie tunelu</string>
<string name="enable_remote_app_control">Włącz zdalne sterowanie aplikacją</string>
<string name="bio_not_created">Dane biometryczne nie zostały utworzone</string>
<string name="bio_update_required">Wymagana aktualizacja zabezpieczeń biometrycznych</string>
<string name="add_tunnel">Dodaj tunel</string>
<string name="bio_subtitle">Zaloguj się przy użyciu danych biometrycznych</string>
<string name="select">Wybierz</string>
<string name="export_tunnels_amnezia">Eksportuj tunele jako Amnezia</string>
<string name="invalid_config_error">błąd nieprawidłowej konfiguracji</string>
<string name="dns_resolve_error">błąd rozwiązywania DNS</string>
<string name="dns_resolve_error">Rozwiązywanie DNS się nie powiodło</string>
<string name="nothing_here_yet">Jeszcze nic tu nie ma!</string>
<string name="select_all">Wybierz wszystkie</string>
<string name="share">Udostępnij</string>
<string name="download">Pobierz</string>
<string name="version_template">Wersja: %1$s</string>
<string name="check_for_update">Sprawdź aktualizację</string>
@@ -244,7 +208,7 @@
<string name="allow">Zezwól</string>
<string name="export_success">Eksport zakończony powodzeniem</string>
<string name="licenses">Licencje</string>
<string name="update_check_unsupported">Sprawdzanie aktualizacji nie jest obsługiwane w tym typie kompilacji.</string>
<string name="update_check_unsupported">Sprawdzanie aktualizacji nie jest obsługiwane dla tego typu kompilacji.</string>
<string name="flavor_template">Wariant: %1$s</string>
<string name="darker">Ciemniejszy</string>
<string name="amoled">AMOLED</string>
@@ -253,4 +217,126 @@
<string name="amnezia">Amnezia</string>
<string name="wireguard">WireGuard</string>
<string name="done">Gotowe</string>
<string name="current_template">Bieżące: %1$s</string>
<string name="wifi_detection_method">Metoda wykrywania Wi-Fi</string>
<string name="_default">Domyślna</string>
<string name="legacy">Przestarzała</string>
<string name="root">Root</string>
<string name="shizuku">Shizuku</string>
<string name="legacy_api_description">Użyj przestarzałej metody pobierania informacji o sieci Wi-Fi z systemu Android 12, która ogranicza zapytania o lokalizację, ale może nie działać niezawodnie na nowszych urządzeniach</string>
<string name="use_shell_via_shizuku">Użyj powłoki za pośrednictwem Shizuku, aby uzyskać informacje o sieci Wi-Fi, dzięki czemu unikniesz konieczności uzyskania uprawnień do lokalizacji na urządzeniach bez uprawnień użytkownika root</string>
<string name="use_android_recommended">Użyj zalecanej przez system Android metody uzyskiwania informacji o sieci Wi-Fi w zależności od wersji systemu</string>
<string name="release_notes">Informacje o wydaniu</string>
<string name="shizuku_not_detected">Nie wykryto Shizuku</string>
<string name="sort">Sortuj</string>
<string name="move_up">Przesuń w górę</string>
<string name="move_down">Przesuń w dół</string>
<string name="drag_handle">Uchwyt do przeciągania</string>
<string name="error_tunnel_name">Nazwa tunelu musi mieć maksymalnie 15 znaków w trybie jądra</string>
<string name="tunnel">Tunel</string>
<string name="tunnel_item_description">%1$s, %2$s, %3$s</string>
<string name="warning">Ostrzeżenie</string>
<string name="location_permissions">Uprawnienia dotyczące lokalizacji</string>
<string name="location_justification">Aby móc odczytywać nazwy sieci Wi-Fi w tle za pomocą obecnej metody wykrywania, system Android wymaga od aplikacji uprawnień „Zawsze zezwalaj” i „Używaj dokładnej lokalizacji” („Lokalizacja w tle” na starszych urządzeniach). Włącz te uprawnienia w ustawieniach aplikacji systemu Android.</string>
<string name="open_settings">Otwórz ustawienia</string>
<string name="location_permissions_missing">Brak uprawnień do lokalizacji</string>
<string name="fix">Napraw</string>
<string name="start">Uruchom</string>
<string name="auto_tunnel_running">Autotunel jest uruchomiony</string>
<string name="auto_tunnel_not_running">Autotunel nie jest uruchomiony</string>
<string name="pinger_bounce_successful">Tunel został pomyślnie uruchomiony ponownie przez pinger.</string>
<string name="pinger_bounce_recovery">Nie udało się ponownie uruchomić pingera. Tunel odzyskany ze starymi adresami.</string>
<string name="bounce_failed_template">Pinger nie mógł odzyskać tunelu z powodu błędu: %1$s</string>
<string name="tunnel_monitoring">Monitorowanie tunelu</string>
<string name="set_custom_ping_target">Niestandardowy cel pingowania (opcjonalnie)</string>
<string name="ip_or_hostname">Adres IP lub nazwa hosta</string>
<string name="ping_target_description">Używane, jeśli wewnętrzny adres IP nie jest dostępny (np. w konfiguracjach pełnego tunelu). Pozostawienie pustego pola domyślnie powoduje korzystanie z Cloudflare.</string>
<string name="tunnel_ping_interval">Interwał pingowania tunelu</string>
<string name="attempts_per_interval">Próby pingowania na interwał</string>
<string name="ping_timeout">Limit czasu pingowania tunelu</string>
<string name="timeout_all_attempts">Całkowity limit czasu dla wszystkich prób</string>
<string name="display_detailed_ping_stats">Wyświetl szczegółowe statystyki pingowania</string>
<string name="monitoring_ping">Włącz monitorowanie pingowania tunelu</string>
<string name="rx_template">RX: %1$s MB</string>
<string name="tx_template">TX: %1$s MB</string>
<string name="reachable_template">Osiągalny: %1$s</string>
<string name="ping_success_template">Ostatni udany ping: %1$s</string>
<string name="sec_ago_template">%1$s sek. temu</string>
<string name="latency_template">Opóźnienie: %1$s</string>
<string name="jitter_template">Jitter: %1$s</string>
<string name="packets_sent_template">Pakiety wysłane: %1$s</string>
<string name="packet_loss_template">Pakiety utracone: %.2f%%</string>
<string name="ping_target_template">Cel pingowania: %1$s</string>
<string name="_true">Prawda</string>
<string name="_false">Fałsz</string>
<string name="backup_success">Powodzenie tworzenia kopii zapasowej. %1$s</string>
<string name="restore_success">Powodzenie przywracania. %1$s</string>
<string name="restarting_app">Ponowne uruchomienie aplikacji w celu zastosowania zmian…</string>
<string name="restore_failed">Nie udało się przywrócić danych z kopii zapasowej.</string>
<string name="backup_failed">Nie udało się utworzyć kopii zapasowej.</string>
<string name="backup_application">Utwórz kopię zapasową danych aplikacji</string>
<string name="restore_application">Przywróć z kopii zapasowej</string>
<string name="expiremental_template">%1$s (eksperymentalne)</string>
<string name="root_required_template">%1$s (wymagany root)</string>
<string name="recommended_template">%1$s (zalecane)</string>
<string name="hint_template">(%1$s)</string>
<string name="proxy">Proxy</string>
<string name="backend_mode">Tryb aplikacji</string>
<string name="selected">Wybrane</string>
<string name="socks_5_proxy">Proxy SOCKS5</string>
<string name="http_proxy">Proxy HTTP</string>
<string name="username">Nazwa użytkownika</string>
<string name="password">Hasło</string>
<string name="proxy_credentials">Poświadczenia proxy</string>
<string name="proxy_settings">Ustawienia proxy</string>
<string name="vpn">VPN</string>
<string name="android_integrations">Integracje z Androidem</string>
<string name="show_password">Pokaż hasło</string>
<string name="socks_5_bind_address">Adres powiązania SOCKS5</string>
<string name="http_bind_address">Adres powiązania HTTP</string>
<string name="defaults_to_template">(domyślnie %1$s)</string>
<string name="dns_settings">Ustawienia DNS</string>
<string name="locked_down">Zablokowane</string>
<string name="dns_provider">Dostawca DNS</string>
<string name="dns_protocol">Protokół DNS</string>
<string name="system">Systemowy</string>
<string name="doh">DNS poprzez HTTPS (DoH)</string>
<string name="comma_separated">Oddzielone przecinkiem</string>
<string name="server_port">Serwer:Port</string>
<string name="new_tunnel">Nowy tunel</string>
<string name="system_features">Funkcje systemu</string>
<string name="read_failed">Nie udało się odczytać danych.</string>
<string name="invalid_key">Nieprawidłowy klucz</string>
<string name="invalid_number">Nieprawidłowa liczba</string>
<string name="invalid_value">Nieprawidłowa wartość</string>
<string name="missing_attribute">Brakujący atrybut</string>
<string name="missing_section">Brakująca sekcja</string>
<string name="syntax_error">Błąd składni</string>
<string name="unknown_attribute">Nieznany atrybut</string>
<string name="unknown_section">Nieznana sekcja</string>
<string name="config_error_template">Błędna konfiguracja. %1$s w lokalizacji: %2$s.</string>
<string name="ports_must_differ">Nie udało się. Serwery proxy muszą mieć różne porty.</string>
<string name="password_no_spaces">Hasło nie może zawierać spacji.</string>
<string name="tunnel_name_taken">Nazwa tunelu jest już używana.</string>
<string name="range_hint">(%1$d%2$d)</string>
<string name="mimic_quic">Imituj QUIC</string>
<string name="mimic_dns">Imituj DNS</string>
<string name="mimic_sip">Imituj SIP</string>
<string name="ddns_auto_update">Automatyczna aktualizacja dynamicznego DNS</string>
<string name="ddns_auto_update_description">Automatyczna aktualizacja adresu IP po zmianach DDNS</string>
<string name="prefer_ipv6_resolution">Preferuj rozwiązywanie peerów IPv6</string>
<string name="disabled">Wyłączone</string>
<string name="mode_disabled_template">Funkcja niedostępna w trybie %1$s.</string>
<string name="lockdown">Zablokowane</string>
<string name="active_tunnel_update_failed">Aktualizacja aktywnego tunelu się nie powiodła</string>
<string name="donate_title">Wspomóż</string>
<string name="crypto">Adresy kryptowalut</string>
<string name="github_sponsors">Sponsorzy GitHub</string>
<string name="liberapay">Liberapay</string>
<string name="kofi">Ko-fi</string>
<string name="donation_thanks_intro">Dziękuję za rozważenie przekazania darowizny na rzecz tego projektu!</string>
<string name="donation_dev_message">Jako jedyny programista nieustannie pracuję nad tym, aby WG Tunnel stał się najlepszym darmowym i otwartoźródłowym klientem WireGuard na Androida, ale jest to możliwe tylko dzięki Twojemu wsparciu.</string>
<string name="donation_closing">Moim marzeniem jest praca nad tym projektem na pełen etat.</string>
<string name="donation_signoff">Z wdzięcznością,</string>
<string name="google_donation_message">Niestety, ze względu na politykę Google, linki do darowizn nie są dozwolone w wersji tej aplikacji dostępnej w Google Play. Aby dowiedzieć się, gdzie można przekazać darowiznę, odwiedź strony projektu.</string>
</resources>
+1 -23
View File
@@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<?xml version='1.0' encoding='utf-8'?>
<resources>
<string name="tunnel_on_ethernet">Túnel na ethernet</string>
<string name="public_key">Chave pública</string>
@@ -17,7 +17,6 @@
<string name="all">todos</string>
<string name="enter_pin">Digite o seu pin</string>
<string name="use_tunnel_on_wifi_name">Usar túnel em wifi com nome</string>
<string name="version">Versão</string>
<string name="junk_packet_count">Quantidade de pacotes-lixo</string>
<string name="junk_packet_minimum_size">Tamanho mínimo de pacote-lixo</string>
<string name="junk_packet_maximum_size">Tamanho máximo de pacote-lixo</string>
@@ -27,7 +26,6 @@
<string name="no_tunnels">Nenhum túnel foi adicionado!</string>
<string name="error_file_extension">O ficheiro não é .conf ou .zip</string>
<string name="prominent_background_location_message">Este recurso precisa de permissões de localização em segundo plano para ativar o monitoramento do SSID da rede Wi-Fi mesmo quando a aplicação está fechado. Para mais pormenores, por favor veja a Política de Privacidade no ecrã de Suporte.</string>
<string name="turn_off_tunnel">Esta ação só é possível com o túnel inativo</string>
<string name="enabled_app_shortcuts">Ativar atalhos de aplicações</string>
<string name="tunnels">Túneis</string>
<string name="privacy_policy">Ver a Política de Privacidade</string>
@@ -36,10 +34,8 @@
<string name="prominent_background_location_title">Revelar a localização em segundo plano</string>
<string name="thank_you">Obrigado por usar o WG Tunnel!</string>
<string name="trusted_ssid_value_description">Envie o SSID</string>
<string name="open_file">Abrir Ficheiro</string>
<string name="add_from_qr">Adicionar a partir de código QR</string>
<string name="add_tunnels_text">Adicionar a partir de ficheiro ou zip</string>
<string name="qr_scan">Escanear o código QR</string>
<string name="tunnel_name">Nome do Túnel</string>
<string name="config_changes_saved">Mudanças nas configurações gravadas.</string>
<string name="exclude">Excluir</string>
@@ -53,17 +49,13 @@
<string name="vpn_on">VPN ligada</string>
<string name="vpn_off">VPN desligada</string>
<string name="listen_port">Porta de escuta</string>
<string name="turn_on_tunnel">Esta ação precisa um túnel ativo</string>
<string name="add_peer">Adicionar par</string>
<string name="interface_">Interface</string>
<string name="copy_public_key">Copiar chave pública</string>
<string name="comma_separated_list">Lista separada por vírgulas</string>
<string name="optional">(opcional)</string>
<string name="random">(aleatório)</string>
<string name="persistent_keepalive">Manter a conexão persistente (keepalive)</string>
<string name="cancel">Cancelar</string>
<string name="error_authentication_failed">Autenticação falhou</string>
<string name="error_authorization_failed">Autorização falhou</string>
<string name="restart_on_ping">Reiniciar em falha de ping (beta)</string>
<string name="email_description">Me envie um email</string>
<string name="error_ssid_exists">SSID já existe</string>
@@ -74,7 +66,6 @@
<string name="tunnel_on_wifi">Túnel em Wi-Fi não confiável</string>
<string name="delete_tunnel">Apagar túnel</string>
<string name="email_chooser">Enviar um email…</string>
<string name="use_kernel">Usar o módulo do kernel</string>
<string name="docs_description">Ler a documentação</string>
<string name="error_root_denied">Shell Root negado</string>
<string name="location_services_missing_message">A aplicação não detetou o serviço de localização ativado no seu dispositivo. Dependendo do dispositivo, isto pode causar que a função de Wi-Fi não confiável falhe em ler o nome do Wi-Fi. Quer continuar mesmo assim?</string>
@@ -96,23 +87,14 @@
<string name="unsure_how">se não tiver certeza em como continuar</string>
<string name="see_the">Veja o</string>
<string name="getting_started_guide">guia de início rápido</string>
<string name="error_file_format">Formato de configuração inválido</string>
<string name="vpn_channel_name">Canal de notificações VPN</string>
<string name="set_custom_ping_ip">Definir ip ping personalizado</string>
<string name="vpn_denied_dialog_title">Permissão negada</string>
<string name="vpn_settings">Configurações do sistema VPN</string>
<string name="always_on_message">A permissão de conexão VPN foi negada. Por favor, verifique</string>
<string name="app_settings">configurações da app</string>
<string name="background_location_message2">para garantir que essas permissões estejam ativadas.</string>
<string name="root_accepted">Shell root aceito</string>
<string name="optional_default">"opcional, padrão: "</string>
<string name="show_amnezia_properties">Mostrar propriedades de Amnezia</string>
<string name="never">nunca</string>
<string name="default_ping_ip">(opcional, padrão para pares)</string>
<string name="set_custom_ping_internal">Intervalo de Ping (seg)</string>
<string name="handshake">handshake</string>
<string name="background_location_message">Permitir que toda a permissão de localização do tempo e/ou localização precisa é necessária para este recurso. Por favor, veja</string>
<string name="sec">seg</string>
<string name="notifications">Notificações</string>
<string name="exclude_lan">Excluir LAN</string>
<string name="hide_scripts">Ocultar scripts</string>
@@ -135,7 +117,6 @@
<string name="wildcards_active">Wildcards ativos</string>
<string name="learn_more">Saber mais</string>
<string name="use_wildcards">Usar nomes coringas</string>
<string name="wifi_name_via_shell">Nome do Wi-Fi por shell</string>
<string name="use_root_shell_for_wifi">Obter o nome do Wi-Fi através do shell root</string>
<string name="start_auto">Iniciar túnel automático</string>
<string name="stop_auto">Pausar túnel automático</string>
@@ -149,8 +130,6 @@
<string name="ethernet_tunnel">Túnel ethernet</string>
<string name="set_ethernet_tunnel">Definir como túnel ethernet</string>
<string name="native_kill_switch">Interruptor de desligamento padrão</string>
<string name="vpn_kill_switch">Interruptor de desligamento VPN</string>
<string name="kill_switch_options">Opções do interruptor de desligamento</string>
<string name="allow_lan_traffic">Permitir tráfego LAN</string>
<string name="bypass_lan_for_kill_switch">Ignorar LAN no interruptor de desligamento</string>
<string name="splt_tunneling">Tunelamento dividido</string>
@@ -158,7 +137,6 @@
<string name="tunnel_specific_settings">Configurações específicas no túnel</string>
<string name="show_scripts">Mostrar scripts</string>
<string name="quick_actions">Ações rápidas</string>
<string name="kernel_not_supported">Kernel não suportado</string>
<string name="advanced_settings">Configurações avançadas</string>
<string name="enable_amnezia_compatibility">Ativar compatibilidade Amnezia</string>
</resources>
+1 -23
View File
@@ -1,10 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<?xml version='1.0' encoding='utf-8'?>
<resources>
<string name="error_authorization_failed">Autorização falhou</string>
<string name="incorrect_pin">O Pin está errado</string>
<string name="create_pin">Criar um pin</string>
<string name="set_primary_tunnel">Selecionar como túnel principal</string>
<string name="background_location_message2">para garantir que essas permissões estejam ativadas.</string>
<string name="dns_servers">Servidores DNS</string>
<string name="add_from_qr">Adicionar a partir de código QR</string>
<string name="tunnels">Túneis</string>
@@ -25,14 +23,12 @@
<string name="okay">OK</string>
<string name="tunnel_on_ethernet">Túnel na ethernet</string>
<string name="create_import">Criar do zero</string>
<string name="turn_on_tunnel">Esta ação precisa um túnel ativo</string>
<string name="enabled_app_shortcuts">Ativar atalhos de aplicações</string>
<string name="tunnel_on_wifi">Túnel em Wi-Fi não confiável</string>
<string name="email_subject">Apoio para o WG Tunnel</string>
<string name="email_chooser">Enviar um email…</string>
<string name="prominent_background_location_title">Revelar a localização em segundo plano</string>
<string name="thank_you">Obrigado por usar o WG Tunnel!</string>
<string name="qr_scan">Escanear o código QR</string>
<string name="tunnel_name">Nome do Túnel</string>
<string name="location_services_not_detected">Serviço de localização não foi detetado</string>
<string name="delete_tunnel_message">Tem certeza que quer apagar este túnel?</string>
@@ -44,26 +40,16 @@
<string name="enable_app_lock">Ligar bloqueio de aplicação</string>
<string name="restart_on_ping">Reiniciar em falha de ping (beta)</string>
<string name="edit_tunnel">Editar túnel</string>
<string name="version">Versão</string>
<string name="kernel">Kernel</string>
<string name="junk_packet_count">Quantidade de pacotes-lixo</string>
<string name="junk_packet_minimum_size">Tamanho mínimo de pacote-lixo</string>
<string name="response_packet_junk_size">Tamanho de resposta de pacote-lixo</string>
<string name="unsure_how">se não tiver certeza em como continuar</string>
<string name="error_file_format">Formato de configuração inválido</string>
<string name="always_on_message">A permissão de conexão VPN foi negada. Por favor, verifique</string>
<string name="background_location_message">Permitir que toda a permissão de localização do tempo e/ou localização precisa é necessária para este recurso. Por favor, veja</string>
<string name="app_settings">configurações da app</string>
<string name="root_accepted">Shell root aceito</string>
<string name="set_custom_ping_ip">Definir ip ping personalizado</string>
<string name="default_ping_ip">(opcional, padrão para pares)</string>
<string name="set_custom_ping_internal">Intervalo de Ping (seg)</string>
<string name="optional_default">"opcional, padrão: "</string>
<string name="show_amnezia_properties">Mostrar propriedades de Amnezia</string>
<string name="never">nunca</string>
<string name="sec">seg</string>
<string name="handshake">handshake</string>
<string name="turn_off_tunnel">Esta ação só é possível com o túnel inativo</string>
<string name="allowed_ips">IPs Permitidos</string>
<string name="endpoint">Endpoint</string>
<string name="name">Nome</string>
@@ -90,7 +76,6 @@
<string name="prominent_background_location_message">Este recurso precisa de permissões de localização em segundo plano para ativar o monitoramento do SSID da rede Wi-Fi mesmo quando a aplicação está fechado. Para mais pormenores, por favor veja a Política de Privacidade no ecrã de Suporte.</string>
<string name="trusted_ssid_value_description">Envie o SSID</string>
<string name="add_tunnels_text">Adicionar a partir de ficheiro ou zip</string>
<string name="open_file">Abrir Ficheiro</string>
<string name="exclude">Excluir</string>
<string name="include">Incluir</string>
<string name="config_changes_saved">Mudanças nas configurações gravadas.</string>
@@ -100,13 +85,10 @@
<string name="rotate_keys">Revezar chaves</string>
<string name="private_key">Chave privada</string>
<string name="copy_public_key">Copiar chave pública</string>
<string name="comma_separated_list">Lista separada por vírgulas</string>
<string name="listen_port">Porta de escuta</string>
<string name="random">(aleatório)</string>
<string name="preshared_key">Chave pré-partilhada</string>
<string name="seconds">segundos</string>
<string name="error_authentication_failed">Autenticação falhou</string>
<string name="use_kernel">Usar o módulo do kernel</string>
<string name="no_browser_detected">Nenhum navegador detetado</string>
<string name="open_issue">Abrir um problema</string>
<string name="mobile_data_tunnel">Selecionar como túnel em dados móveis</string>
@@ -116,11 +98,8 @@
<string name="always_on_message2">para ter certeza que VPN Sempre-ligada é desligada para todas as outras aplicações e tente novamente</string>
<string name="restart_at_boot">Ativar na inicialização</string>
<string name="native_kill_switch">Interruptor de desligamento padrão</string>
<string name="vpn_kill_switch">Interruptor de desligamento VPN</string>
<string name="kill_switch_options">Opções do interruptor de desligamento</string>
<string name="allow_lan_traffic">Permitir tráfego LAN</string>
<string name="bypass_lan_for_kill_switch">Ignorar LAN no interruptor de desligamento</string>
<string name="wifi_name_via_shell">Nome do Wi-Fi por shell</string>
<string name="trusted_wifi_names">Nomes de Wi-Fi confiáveis</string>
<string name="notifications">Notificações</string>
<string name="skip">Pular</string>
@@ -144,7 +123,6 @@
<string name="learn_more">Saber mais</string>
<string name="wildcards_active">Wildcards ativos</string>
<string name="use_root_shell_for_wifi">Obter o nome do Wi-Fi através do shell root</string>
<string name="kernel_not_supported">Kernel não suportado</string>
<string name="start_auto">Iniciar túnel automático</string>
<string name="monitoring_state_changes">Monitorar estado de alterações</string>
<string name="donate">Contribua com projeto</string>
+148 -61
View File
@@ -1,6 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<?xml version='1.0' encoding='utf-8'?>
<resources>
<string name="turn_off_tunnel">Действие требует отключения туннеля</string>
<string name="mtu">MTU</string>
<string name="tunnel_name">Имя туннеля</string>
<string name="public_key">Открытый ключ</string>
@@ -8,10 +7,8 @@
<string name="peer">Пир</string>
<string name="privacy_policy">Посмотреть политику конфиденциальности</string>
<string name="add_from_qr">Добавить из QR-кода</string>
<string name="qr_scan">Сканировать QR-код</string>
<string name="auto_tunneling">Автотуннелирование</string>
<string name="no_tunnels">Туннели ещё не добавлены!</string>
<string name="open_file">Открыть файл</string>
<string name="exclude">Исключить</string>
<string name="include">Включить</string>
<string name="config_changes_saved">Изменения конфигурации сохранены.</string>
@@ -24,16 +21,16 @@
<string name="vpn_off">VPN откл.</string>
<string name="interface_">Интерфейс</string>
<string name="optional">(необязательно)</string>
<string name="all">все</string>
<string name="all">Все</string>
<string name="no_email_detected">Приложение для отправки почты не найдено</string>
<string name="enter_pin">Введите PIN-код</string>
<string name="enable_app_lock">Защита приложения</string>
<string name="restart_on_ping">Перезапуск при сбое пинга (бета)</string>
<string name="settings">Настройки</string>
<string name="support">Поддержка</string>
<string name="init_packet_junk_size">Начальный размер «мусорного» пакета</string>
<string name="response_packet_junk_size">Размер ответного «мусорного» пакета</string>
<string name="init_packet_magic_header">Заголовок пакета инициализации</string>
<string name="init_packet_junk_size">S1</string>
<string name="response_packet_junk_size">S2</string>
<string name="init_packet_magic_header">H1</string>
<string name="see_the">Смотрите</string>
<string name="tunnel_mobile_data">Туннелировать через мобильный интернет</string>
<string name="tunnel_on_ethernet">Туннелировать через Ethernet</string>
@@ -45,8 +42,7 @@
<string name="private_key">Закрытый ключ</string>
<string name="base64_key">Ключ в base64</string>
<string name="error_no_file_explorer">Не найден файловый менеджер</string>
<string name="delete_tunnel_message">Вы действительно хотите удалить этот туннель?</string>
<string name="version">Версия</string>
<string name="delete_tunnel_message">Удалить выбранные туннели?</string>
<string name="unknown_error">Неизвестная ошибка</string>
<string name="tunnel_on_wifi">Туннель в недоверенных сетях Wi-Fi</string>
<string name="error_file_extension">Файл не имеет расширение .conf или .zip</string>
@@ -55,20 +51,17 @@
<string name="vpn_channel_name">Канал уведомлений VPN</string>
<string name="tunnels">Туннели</string>
<string name="okay">Хорошо</string>
<string name="prominent_background_location_title">Фоновая передача местоположения</string>
<string name="prominent_background_location_title">Фоновое отслеживание местоположения</string>
<string name="thank_you">Благодарим вас за использование WG Tunnel!</string>
<string name="trusted_ssid_value_description">Отправить SSID</string>
<string name="add_tunnels_text">Добавить из файла или архива</string>
<string name="location_services_not_detected">Сервисы местоположения не найдены</string>
<string name="turn_on_tunnel">Действие требует наличие активного туннеля</string>
<string name="add_peer">Добавить пира</string>
<string name="rotate_keys">Обновить ключи</string>
<string name="comma_separated_list">разделённый запятыми список</string>
<string name="listen_port">Порт прослушивания</string>
<string name="preshared_key">Общий ключ</string>
<string name="seconds">секунд</string>
<string name="persistent_keepalive">Поддержание работы туннеля (keepalive)</string>
<string name="error_authentication_failed">Сбой аутентификации</string>
<string name="persistent_keepalive">Интервал поддержки соединения</string>
<string name="location_services_missing_message">Приложение не обнаружило сервис местоположения на вашем устройстве. На некоторых устройствах это может привести к невозможности определения имени сети Wi-Fi и сбою функции недоверенной сети. Всё равно продолжить?</string>
<string name="error_ssid_exists">SSID уже существует</string>
<string name="error_root_denied">Root-доступ запрещён</string>
@@ -77,7 +70,6 @@
<string name="use_tunnel_on_wifi_name">Использовать туннель в сети Wi-Fi</string>
<string name="prominent_background_location_message">Эта функция требует фоновый доступ к местоположению для отслеживания имён сетей Wi-Fi, даже когда приложение закрыто. Для получения дополнительной информации, прочтите политику конфиденциальности на экране поддержки.</string>
<string name="copy_public_key">Копировать открытый ключ</string>
<string name="error_authorization_failed">Не удалось пройти аутентификацию</string>
<string name="enabled_app_shortcuts">Включить ярлыки приложения</string>
<string name="open_issue">Сообщить о проблеме</string>
<string name="incorrect_pin">Некорректный PIN-код</string>
@@ -85,51 +77,39 @@
<string name="create_pin">Создать PIN-код</string>
<string name="mobile_data_tunnel">Назначить как туннель для мобильного интернета</string>
<string name="edit_tunnel">Редактировать туннель</string>
<string name="junk_packet_count">Количество «мусорных» пакетов</string>
<string name="junk_packet_maximum_size">Максимальный размер «мусорного» пакета</string>
<string name="error_file_format">некорректный формат конфигурации туннеля</string>
<string name="junk_packet_count">Jc</string>
<string name="junk_packet_maximum_size">Jmax</string>
<string name="email_subject">Поддержка WG Tunnel</string>
<string name="email_description">Отправить письмо автору</string>
<string name="use_kernel">Использовать модуль режима ядра</string>
<string name="no_browser_detected">Браузер не найден</string>
<string name="read_logs">Посмотреть журнал</string>
<string name="auto">(авто)</string>
<string name="set_primary_tunnel">Назначить как главный туннель</string>
<string name="kernel">Модуль ядра</string>
<string name="junk_packet_minimum_size">Минимальный размер «мусорного» пакета</string>
<string name="response_packet_magic_header">Заголовок пакета ответа</string>
<string name="transport_packet_magic_header">Заголовок транспортного пакета</string>
<string name="junk_packet_minimum_size">Jmin</string>
<string name="response_packet_magic_header">H2</string>
<string name="transport_packet_magic_header">H4</string>
<string name="getting_started_guide">руководство по началу работы</string>
<string name="unsure_how">, если не уверены, что делать дальше</string>
<string name="underload_packet_magic_header">Заголовок пакета под нагрузкой</string>
<string name="underload_packet_magic_header">H3</string>
<string name="root_accepted">Root-доступ разрешён</string>
<string name="always_on_message">Разрешение на VPN-соединение было отклонено, проверьте</string>
<string name="set_custom_ping_cooldown">Время ожидания перезапуска пинга (сек.)</string>
<string name="restart_at_boot">Перезапуск при загрузке</string>
<string name="default_ping_ip">(необязательно, по умолчанию для пиров)</string>
<string name="app_settings">настройки приложения</string>
<string name="background_location_message2">, чтобы убедиться, что эти разрешения предоставлены</string>
<string name="always_on_message2">, чтобы убедиться, что функция «Постоянный VPN» отключена для всех других приложений, и повторите попытку</string>
<string name="background_location_message">Разрешать всё время, пока для работы этой функции требуется доступ на определение местоположения и/или точное местоположение. Смотрите</string>
<string name="vpn_settings">Системные настройки VPN</string>
<string name="vpn_denied_dialog_title">Отказано в доступе</string>
<string name="set_custom_ping_internal">Интервал пинга (сек.)</string>
<string name="optional_default">"необязательно, по умолчанию: "</string>
<string name="set_custom_ping_ip">Назначить свой IP для пинга</string>
<string name="show_amnezia_properties">Показать настройки Amnezia</string>
<string name="never">никогда</string>
<string name="sec">сек.</string>
<string name="handshake">соединение</string>
<string name="handshake">Соединение</string>
<string name="logs">Журналы</string>
<string name="light">Светлая</string>
<string name="automatic">Автоматическая</string>
<string name="automatic">Автовыбор</string>
<string name="dynamic">Динамическая</string>
<string name="language">Язык</string>
<string name="trusted_wifi_names">Доверенные сети Wi-Fi</string>
<string name="primary_tunnel">Основной туннель</string>
<string name="mobile_tunnel">Туннель для мобильных данных</string>
<string name="learn_more">Узнать больше</string>
<string name="kernel_not_supported">Ядро не поддерживается</string>
<string name="stop_auto">Остановить автотуннель</string>
<string name="donate">Пожертвовать на проект</string>
<string name="local_logging">Локальное ведение журнала</string>
@@ -138,13 +118,11 @@
<string name="use_wildcards">Использовать подстановочные знаки в имени</string>
<string name="appearance">Внешний вид</string>
<string name="notifications">Уведомления</string>
<string name="kill_switch">Экстренное отключение</string>
<string name="dark">Тёмная</string>
<string name="display_theme">Тема</string>
<string name="add_wifi_name">Добавить сеть Wi-Fi</string>
<string name="launch_app_settings">Настройки запуска приложения</string>
<string name="use_root_shell_for_wifi">Использовать root-доступ для получения имени сети Wi-Fi</string>
<string name="wifi_name_via_shell">Имя Wi-Fi через root</string>
<string name="use_root_shell_for_wifi">Использовать root-доступ для получения информации о Wi-Fi без необходимости разрешения на определение местоположения</string>
<string name="start_auto">Запустить автотуннель</string>
<string name="tunnel_running">Работающий туннель</string>
<string name="monitoring_state_changes">Отслеживание изменений состояния</string>
@@ -158,13 +136,11 @@
<string name="ethernet_tunnel">Туннель для Ethernet</string>
<string name="set_ethernet_tunnel">Назначить как туннель для Ethernet</string>
<string name="native_kill_switch">Штатное экстренное отключение</string>
<string name="vpn_kill_switch">Экстренное отключение VPN</string>
<string name="kill_switch_options">Настройка экстренного отключения</string>
<string name="allow_lan_traffic">Обход LAN</string>
<string name="bypass_lan_for_kill_switch">Разрешать трафик LAN при экстренном отключении</string>
<string name="vpn_channel_description">Канал уведомлений о состоянии VPN</string>
<string name="auto_tunnel_channel_description">Канал уведомлений о состоянии автотуннеля</string>
<string name="stop">стоп</string>
<string name="stop">Стоп</string>
<string name="splt_tunneling">Раздельное туннелирование</string>
<string name="tunnel_specific_settings">Специальные настройки туннеля</string>
<string name="pre_up">До активации</string>
@@ -181,13 +157,9 @@
<string name="include_lan">Включить LAN</string>
<string name="auto_tunnel">Автотуннелирование</string>
<string name="tunnel_control">Управление туннелями</string>
<string name="kill_switch_off">Без экстренного отключения в доверенных</string>
<string name="prefer_ipv4">Предпочитать соединение IPv4</string>
<string name="server_ipv4">Получать имя узла IPv4</string>
<string name="multiple">Несколько</string>
<string name="config_error">ошибка конфигурации</string>
<string name="active">Активный</string>
<string name="bio_subtitle">Вход по биометрическим данным</string>
<string name="config_error">Неправильная конфигурация</string>
<string name="active">Активно</string>
<string name="export_logs">Экспорт журналов</string>
<string name="delete_logs">Удалить журналы</string>
<string name="app_permission_title">Центр управления WG Tunnel</string>
@@ -195,16 +167,12 @@
<string name="wifi_name_template">Активный: %1$s</string>
<string name="add_from_url">Добавить из URL</string>
<string name="join_matrix">Присоединиться к сообществу в Matrix</string>
<string name="dns_resolve_error">ошибка получения dns</string>
<string name="kernel_name_error">ошибка имени модуля ядра</string>
<string name="bio_not_created">Биометрия не создана</string>
<string name="dns_resolve_error">Ошибка получения DNS</string>
<string name="kernel_name_error">Ошибка имени модуля ядра</string>
<string name="enter_config_url">Введите URL конфигурации</string>
<string name="info">Информация</string>
<string name="bio_auth_title">Биометрическая аутентификация</string>
<string name="tunnel_error_template">Ошибка туннеля: %1$s</string>
<string name="service_running_error">не запущен сервис</string>
<string name="service_running_error">Не запущен сервис</string>
<string name="app_permission_description">Управление туннелями и функцией автоматического туннелирования.</string>
<string name="bio_not_supported">Биометрия не поддерживается</string>
<string name="join_telegram">Присоединиться к сообществу в Telegram</string>
<string name="matrix_url">https://matrix.to/#/#wg-tunnel-space:matrix.org</string>
<string name="camera_permission_required">Требуется доступ к камере</string>
@@ -213,12 +181,9 @@
<string name="add_tunnel">Добавить туннель</string>
<string name="remote_key_template">Ключ: %1$s</string>
<string name="export_tunnels_amnezia">Экспорт туннелей как Amnezia</string>
<string name="inactive">Неактивный</string>
<string name="status">Статус</string>
<string name="invalid_config_error">ошибка в конфигурации</string>
<string name="inactive">Неактивно</string>
<string name="save">Сохранить</string>
<string name="bio_update_required">Требуется обновление безопасности биометрии</string>
<string name="auth_error">не выполнена авторизация</string>
<string name="auth_error">Не выполнена авторизация</string>
<string name="tunnel_starting">Запуск туннеля</string>
<string name="copy">Копировать</string>
<string name="delete">Удалить</string>
@@ -228,7 +193,6 @@
<string name="error_download_failed">Невозможно скачать конфигурацию</string>
<string name="nothing_here_yet">Здесь пока ничего нет!</string>
<string name="select_all">Выбрать все</string>
<string name="share">Поделиться</string>
<string name="export_success">Экспорт успешно выполнен</string>
<string name="check_for_update">Проверить обновление</string>
<string name="update_check_failed">Проверка обновлений не выполнена.</string>
@@ -252,4 +216,127 @@
<string name="done">Готово</string>
<string name="amnezia">Amnezia</string>
<string name="show_qr">Показать QR-код</string>
<string name="wifi_detection_method">Метод обнаружения Wi-Fi</string>
<string name="_default">По умолчанию</string>
<string name="legacy">Устаревший</string>
<string name="root">Root</string>
<string name="shizuku">Shizuku</string>
<string name="legacy_api_description">Получать информацию о Wi-Fi устаревшим методом Android 12, который ограничивает запросы определения местоположения, но может работать нестабильно на новых устройствах</string>
<string name="use_shell_via_shizuku">Получать информацию о Wi-Fi через Shizuku без необходимости разрешения определения местоположения на устройствах без root-доступа</string>
<string name="use_android_recommended">Получать информацию о Wi-Fi рекомендуемым методом на основе версии Android</string>
<string name="release_notes">Примечания к выпуску</string>
<string name="shizuku_not_detected">Shizuku не найден</string>
<string name="current_template">Текущий: %1$s</string>
<string name="sort">Сортировка</string>
<string name="drag_handle">Перетаскивание</string>
<string name="move_up">Переместить вверх</string>
<string name="move_down">Переместить вниз</string>
<string name="error_tunnel_name">В режиме ядра имя туннеля должно содержать не более 15 символов</string>
<string name="tunnel">туннель</string>
<string name="tunnel_item_description">%1$s, %2$s, %3$s</string>
<string name="warning">Внимание</string>
<string name="location_permissions">Разрешения на доступ к местоположению</string>
<string name="location_justification">Чтобы получать имена сетей Wi-Fi в фоновом режиме с помощью выбранного метода обнаружения, приложению необходимо предоставить разрешения на доступ к местоположению «Разрешить всегда» и «Точное определение местоположения» («Фоновое определение местоположения» на старых устройствах). Включите эти разрешения в настройках приложения.</string>
<string name="open_settings">Открыть настройки</string>
<string name="location_permissions_missing">Отсутствуют разрешения на доступ к местоположению</string>
<string name="fix">Исправить</string>
<string name="start">Старт</string>
<string name="auto_tunnel_running">Автотуннелирование запущено</string>
<string name="auto_tunnel_not_running">Автотуннелирование не запущено</string>
<string name="ip_or_hostname">IP или имя узла</string>
<string name="restarting_app">Перезапуск приложения для применения изменений…</string>
<string name="restore_failed">Невозможно восстановить из резервной копии.</string>
<string name="backup_failed">Невозможно создать резервную копию.</string>
<string name="backup_application">Резервирование данных приложения</string>
<string name="restore_application">Восстановление данных приложения</string>
<string name="tunnel_monitoring">Отслеживание туннеля</string>
<string name="sec_ago_template">%1$s сек.</string>
<string name="latency_template">Задержка: %1$s</string>
<string name="packets_sent_template">Отправлено пакетов: %1$s</string>
<string name="packet_loss_template">Потеряно пакетов: %.2f%%</string>
<string name="backup_success">Резервное копирование выполнено. %1$s</string>
<string name="restore_success">Восстановление выполнено. %1$s</string>
<string name="pinger_bounce_successful">Туннель перезапущен после проверки пинга.</string>
<string name="pinger_bounce_recovery">Невозможно перезапустить туннель после проверки пинга. Туннель восстановлен со старыми адресами.</string>
<string name="set_custom_ping_target">Цель пинга (необязательно)</string>
<string name="ping_target_description">Используется, если внутренний IP-адрес недоступен (например, в конфигурациях с полным туннелем). Если оставить поле пустым, по умолчанию используется Cloudflare.</string>
<string name="tunnel_ping_interval">Интервал пинга туннеля</string>
<string name="attempts_per_interval">Попытки пинга за интервал</string>
<string name="ping_timeout">Время ожидания пинга туннеля</string>
<string name="timeout_all_attempts">Общее время ожидания всех попыток</string>
<string name="display_detailed_ping_stats">Подробная статистика пингования</string>
<string name="monitoring_ping">Отслеживать пингование туннеля</string>
<string name="rx_template">↓: %1$s МБ</string>
<string name="tx_template">↑: %1$s МБ</string>
<string name="reachable_template">Доступно: %1$s</string>
<string name="ping_success_template">Последний успешный пинг: %1$s</string>
<string name="ping_target_template">Цель пинга: %1$s</string>
<string name="bounce_failed_template">Невозможно восстановить туннель после проверки пинга из-за ошибки: %1$s</string>
<string name="jitter_template">Джиттер: %1$s</string>
<string name="_true">Верно</string>
<string name="_false">Неверно</string>
<string name="expiremental_template">%1$s (экспериментально)</string>
<string name="root_required_template">%1$s (требуется root)</string>
<string name="recommended_template">%1$s (рекомендуется)</string>
<string name="hint_template">(%1$s)</string>
<string name="proxy">Прокси</string>
<string name="backend_mode">Режим приложения</string>
<string name="selected">Выбрано</string>
<string name="socks_5_proxy">SOCKS5-прокси</string>
<string name="http_proxy">HTTP-прокси</string>
<string name="username">Пользователь</string>
<string name="password">Пароль</string>
<string name="proxy_credentials">Учётные данные прокси</string>
<string name="proxy_settings">Настройки прокси</string>
<string name="vpn">VPN</string>
<string name="android_integrations">Интеграция с Android</string>
<string name="show_password">Показать пароль</string>
<string name="socks_5_bind_address">Адрес привязки SOCKS5</string>
<string name="http_bind_address">Адрес привязки HTTP</string>
<string name="defaults_to_template">(по умолчанию к %1$s)</string>
<string name="dns_settings">Настройки DNS</string>
<string name="locked_down">Заблокировано</string>
<string name="dns_provider">Провайдер DNS</string>
<string name="dns_protocol">Протокол DNS</string>
<string name="system">Системный</string>
<string name="doh">DNS через HTTPS (DoH)</string>
<string name="comma_separated">Разделённые запятой</string>
<string name="server_port">Сервер:порт</string>
<string name="new_tunnel">Новый туннель</string>
<string name="system_features">Системные функции</string>
<string name="read_failed">Невозможно прочитать данные.</string>
<string name="invalid_key">Неправильный ключ</string>
<string name="invalid_number">Неправильное число</string>
<string name="invalid_value">Неправильное значение</string>
<string name="missing_attribute">Отсутствует атрибут</string>
<string name="syntax_error">Синтаксическая ошибка</string>
<string name="unknown_attribute">Неизвестный атрибут</string>
<string name="config_error_template">Неправильная конфигурация: %1$s в позиции %2$s.</string>
<string name="ports_must_differ">Ошибка: прокси должны иметь разные порты.</string>
<string name="password_no_spaces">Пароль не может содержать пробелы.</string>
<string name="mimic_quic">Имитировать QUIC</string>
<string name="mimic_dns">Имитировать DNS</string>
<string name="mimic_sip">Имитировать SIP</string>
<string name="missing_section">Отсутствует раздел</string>
<string name="unknown_section">Неизвестный раздел</string>
<string name="tunnel_name_taken">Имя туннеля уже используется.</string>
<string name="range_hint">(%1$d%2$d)</string>
<string name="active_tunnel_update_failed">Невозможно обновить активный туннель</string>
<string name="ddns_auto_update">Автообновление динамического DNS</string>
<string name="ddns_auto_update_description">Автоматическое обновление IP при изменении DDNS</string>
<string name="disabled">Отключено</string>
<string name="mode_disabled_template">Функция недоступна в режиме %1$s.</string>
<string name="lockdown">Блокировка</string>
<string name="prefer_ipv6_resolution">Предпочитать получение IPv6 пиров</string>
<string name="kofi">Ko-fi</string>
<string name="donation_thanks_intro">Благодарим вас за желание сделать пожертвование!</string>
<string name="donation_closing">Моя мечта — работать для вас над этим проектом полный рабочий день.</string>
<string name="donation_signoff">С благодарностью,</string>
<string name="google_donation_message">К сожалению, правила Google не позволяют разместить ссылку для пожертвования в версии приложения для Play Store. Пожалуйста, перейдите на сайт приложения, чтобы узнать, как сделать пожертвование.</string>
<string name="donate_title">Сделать пожертвование</string>
<string name="crypto">Криптовалютные адреса</string>
<string name="github_sponsors">GitHub Sponsors</string>
<string name="liberapay">Liberapay</string>
<string name="donation_dev_message">Будучи единственным разработчиком, я неустанно работаю, чтобы сделать WG Tunnel лучшим бесплатным и открытым клиентом WireGuard для Android, но это возможно только с вашей поддержкой.</string>
<string name="delete_active_message">Невозможно удалить активный туннель.</string>
</resources>
+65
View File
@@ -0,0 +1,65 @@
<?xml version='1.0' encoding='utf-8'?>
<resources>
<string name="app_name">Tunel WG</string>
<string name="app_permission_description">Ovládanie tunelov a funkcie automatického tunela.</string>
<string name="vpn_channel_name">Notifikačný kanál VPN</string>
<string name="error_file_extension">Súbor nie je typu .conf ani .zip</string>
<string name="no_tunnels">Zatiaľ neboli pridané žiadne tunely!</string>
<string name="tunnels">Tunely</string>
<string name="privacy_policy">Zobraziť zásady ochrany osobných údajov</string>
<string name="okay">Dobre</string>
<string name="prominent_background_location_message">Táto funkcia vyžaduje povolenie na sledovanie polohy na pozadí, aby bolo možné monitorovať Wi-Fi SSID aj v prípade, že je aplikácia zatvorená. Ďalšie informácie nájdete v zásadách ochrany osobných údajov, na ktoré odkazuje obrazovka podpory.</string>
<string name="prominent_background_location_title">Zverejnenie informácií o polohe</string>
<string name="thank_you">Ďakujeme, že používate WG Tunnel!</string>
<string name="trusted_ssid_value_description">Potvrdiť SSID</string>
<string name="add_tunnels_text">Pridať zo súboru alebo zip</string>
<string name="add_from_qr">Pridať z QR kódu</string>
<string name="tunnel_name">Názov tunela</string>
<string name="exclude">Vylúčiť</string>
<string name="include">Zahrnúť</string>
<string name="config_changes_saved">Zmeny konfigurácie boli uložené.</string>
<string name="public_key">Verejný kľúč</string>
<string name="addresses">Adresy</string>
<string name="dns_servers">Adresy DNS serverov</string>
<string name="mtu">MTU</string>
<string name="peer">Peer</string>
<string name="allowed_ips">Povolené IP adresy</string>
<string name="endpoint">Koncový bod</string>
<string name="name">Meno</string>
<string name="always_on_vpn_support">Povoliť vždy zapnuté VPN</string>
<string name="location_services_not_detected">Služby určovania polohy neboli zistené</string>
<string name="auto_tunneling">Automatický tunel</string>
<string name="vpn_on">VPN zapnuté</string>
<string name="vpn_off">VPN vypnuté</string>
<string name="create_import">Vytvoriť od začiatku</string>
<string name="add_peer">Pridať peer</string>
<string name="interface_">Rozhranie</string>
<string name="rotate_keys">Otočiť kľúče</string>
<string name="private_key">Súkromný kľúč</string>
<string name="copy_public_key">Skopírovať verejný kľúč</string>
<string name="base64_key">Kľúč Base64</string>
<string name="listen_port">Prístupový port</string>
<string name="random">(náhodný)</string>
<string name="optional">(voliteľné)</string>
<string name="preshared_key">Pre-shared kľúč</string>
<string name="seconds">Sekundy</string>
<string name="persistent_keepalive">Trvalé udržanie spojenia</string>
<string name="cancel">Zrušiť</string>
<string name="enabled_app_shortcuts">Povoliť skratky aplikácií</string>
<string name="unknown_error">Došlo k neznámej chybe</string>
<string name="tunnel_on_wifi">Tunel na nedôveryhodnej wifi</string>
<string name="email_subject">Podpora tunela WG</string>
<string name="email_chooser">Poslať e-mail…</string>
<string name="docs_description">Prečítajte si dokumentáciu</string>
<string name="email_description">Pošlite mi e-mail</string>
<string name="error_ssid_exists">SSID už existuje</string>
<string name="error_no_file_explorer">Nie je nainštalovaný žiadny prehliadač súborov</string>
<string name="location_services_missing_message">Aplikácia nezistila žiadne lokalizačné služby povolené vo vašom zariadení. V závislosti od zariadenia to môže spôsobiť, že funkcia nedôveryhodnej wifi nebude môcť prečítať názov wifi. Chcete aj tak pokračovať?</string>
<string name="auto_tunnel_title">Služba automatického tunela</string>
<string name="delete_tunnel">Vymazanie tunela</string>
<string name="delete_tunnel_message">Naozaj chcete tento tunel odstrániť?</string>
<string name="yes">Áno</string>
<string name="all">Všetko</string>
<string name="no_email_detected">Nebola zistená žiadna e-mailová aplikácia</string>
<string name="no_browser_detected">Nebol zistený žiadny prehliadač</string>
</resources>
+1 -37
View File
@@ -1,10 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<?xml version='1.0' encoding='utf-8'?>
<resources>
<string name="kill_switch_options">சுவிட்ச் விருப்பங்களைக் கொல்லுங்கள்</string>
<string name="private_key">தனிப்பட்ட விசை</string>
<string name="delete_tunnel_message">இந்த சுரங்கப்பாதையை நீக்க விரும்புகிறீர்களா?</string>
<string name="add_from_qr">QR குறியீட்டிலிருந்து சேர்க்கவும்</string>
<string name="error_file_format">தவறான சுரங்கப்பாதை கட்டமைப்பு வடிவம்</string>
<string name="vpn_on">Vpn on</string>
<string name="exclude">விலக்கு</string>
<string name="vpn_channel_description">VPN மாநில அறிவிப்புகளுக்கான சேனல்</string>
@@ -12,7 +10,6 @@
<string name="app_name">Wg சுரங்கப்பாதை</string>
<string name="no_tunnels">இன்னும் சுரங்கங்கள் எதுவும் சேர்க்கப்படவில்லை!</string>
<string name="error_file_extension">கோப்பு ஒரு .conf அல்லது .zip அல்ல</string>
<string name="turn_off_tunnel">செயலுக்கு சுரங்கப்பாதை தேவை</string>
<string name="tunnels">சுரங்கங்கள்</string>
<string name="tunnel_mobile_data">மொபைல் தரவுகளில் சுரங்கப்பாதை</string>
<string name="privacy_policy">தனியுரிமைக் கொள்கையைக் காண்க</string>
@@ -21,8 +18,6 @@
<string name="thank_you">WG சுரங்கப்பாதையைப் பயன்படுத்தியதற்கு நன்றி!</string>
<string name="trusted_ssid_value_description">SSID ஐ சமர்ப்பிக்கவும்</string>
<string name="add_tunnels_text">கோப்பு அல்லது சிப்பிலிருந்து சேர்க்கவும்</string>
<string name="open_file">கோப்பு திறந்திருக்கும்</string>
<string name="qr_scan">QR ச்கேன்</string>
<string name="tunnel_name">சுரங்கப்பாதை பெயர்</string>
<string name="include">அடங்கும்</string>
<string name="allowed_ips">அனுமதிக்கப்பட்ட ஐபிக்கள்</string>
@@ -34,12 +29,9 @@
<string name="add_peer">சகாக்களைச் சேர்க்கவும்</string>
<string name="copy_public_key">பொது விசையை நகலெடுக்கவும்</string>
<string name="base64_key">base64 விசை</string>
<string name="comma_separated_list">கமா பிரிக்கப்பட்ட பட்டியல்</string>
<string name="listen_port">துறைமுகம் கேளுங்கள்</string>
<string name="persistent_keepalive">தொடர்ச்சியான கீப்அலிவ்</string>
<string name="cancel">ரத்துசெய்</string>
<string name="error_authentication_failed">ஏற்பு தோல்வியடைந்தது</string>
<string name="error_authorization_failed">அங்கீகரிக்கத் தவறிவிட்டது</string>
<string name="enabled_app_shortcuts">பயன்பாட்டு குறுக்குவழிகளை இயக்கவும்</string>
<string name="unknown_error">தெரியாத பிழை ஏற்பட்டது</string>
<string name="tunnel_on_wifi">நம்பத்தகாத வைஃபை மீது சுரங்கப்பாதை</string>
@@ -61,7 +53,6 @@
<string name="enter_pin">உங்கள் முள் உள்ளிடவும்</string>
<string name="create_pin">முள் உருவாக்கவும்</string>
<string name="enable_app_lock">பயன்பாட்டு பூட்டை இயக்கவும்</string>
<string name="version">பதிப்பு</string>
<string name="settings">அமைப்புகள்</string>
<string name="support">உதவி</string>
<string name="kernel">கர்னல்</string>
@@ -82,19 +73,11 @@
<string name="vpn_settings">VPN கணினி அமைப்புகள்</string>
<string name="always_on_message">VPN இணைப்பு இசைவு மறுக்கப்பட்டுள்ளது. சரிபார்க்கவும்</string>
<string name="always_on_message2">மற்ற எல்லா பயன்பாடுகளுக்கும் எப்போதும் VPN அணைக்கப்பட்டு மீண்டும் முயற்சிக்கவும் என்பதை உறுதிப்படுத்திக் கொள்ளுங்கள்</string>
<string name="background_location_message">இந்த அம்சத்திற்கு எல்லா நேர இருப்பிட இசைவு மற்றும்/அல்லது துல்லியமான இருப்பிடம் தேவை. தயவுசெய்து பார்க்கவும்</string>
<string name="app_settings">பயன்பாட்டு அமைப்புகள்</string>
<string name="root_accepted">ரூட் செல் ஏற்றுக்கொள்ளப்பட்டது</string>
<string name="set_custom_ping_ip">தனிப்பயன் பிங் ஐபி அமைக்கவும்</string>
<string name="default_ping_ip">(விரும்பினால், சகாக்களுக்கு இயல்புநிலை)</string>
<string name="set_custom_ping_internal">பிங் இடைவெளி (நொடி)</string>
<string name="set_custom_ping_cooldown">பிங் மறுதொடக்கம் கூல்டவுன் (நொடி)</string>
<string name="show_amnezia_properties">அம்னேசியா பண்புகளைக் காட்டு</string>
<string name="never">ஒருபோதும்</string>
<string name="sec">நொடி</string>
<string name="handshake">ஏண்ட்சேக்</string>
<string name="logs">பதிவுகள்</string>
<string name="kill_switch">சுவிட்சைக் கொல்லுங்கள்</string>
<string name="appearance">தோற்றம்</string>
<string name="notifications">அறிவிப்புகள்</string>
<string name="automatic">தானியங்கி</string>
@@ -111,9 +94,7 @@
<string name="use_wildcards">வைல்டு கார்டுகள் என்ற பெயரைப் பயன்படுத்தவும்</string>
<string name="learn_more">மேலும் அறிக</string>
<string name="wildcards_active">காடு கார்டுகள் செயலில்</string>
<string name="wifi_name_via_shell">செல் வழியாக வைஃபை பெயர்</string>
<string name="use_root_shell_for_wifi">வைஃபை பெயரைப் பெற ரூட் செல்லைப் பயன்படுத்தவும்</string>
<string name="kernel_not_supported">கர்னல் ஆதரிக்கப்படவில்லை</string>
<string name="start_auto">ஆட்டோ-டன்னல் தொடங்கவும்</string>
<string name="stop_auto">ஆட்டோ-டன்னல் நிறுத்தவும்</string>
<string name="tunnel_running">சுரங்கப்பாதை இயங்கும்</string>
@@ -127,7 +108,6 @@
<string name="ethernet_tunnel">ஈத்தர்நெட் சுரங்கப்பாதை</string>
<string name="set_ethernet_tunnel">ஈத்தர்நெட் சுரங்கப்பாதையாக அமைக்கவும்</string>
<string name="native_kill_switch">சொந்த கொலை சுவிட்ச்</string>
<string name="vpn_kill_switch">VPN கில் சுவிட்ச்</string>
<string name="allow_lan_traffic">லேன் போக்குவரத்தை அனுமதிக்கவும்</string>
<string name="bypass_lan_for_kill_switch">கொலை சுவிட்சுக்கு பைபாச் லேன்</string>
<string name="auto_tunnel_channel_name">ஆட்டோ-டன்னல் அறிவிப்பு சேனல்</string>
@@ -159,7 +139,6 @@
<string name="peer">ஒப்பி</string>
<string name="always_on_vpn_support">எப்போதும் VPN ஐ அனுமதிக்கவும்</string>
<string name="location_services_not_detected">இருப்பிட சேவைகள் கண்டறியப்படவில்லை</string>
<string name="turn_on_tunnel">செயலுக்கு செயலில் சுரங்கப்பாதை தேவை</string>
<string name="interface_">இடைமுகம்</string>
<string name="rotate_keys">விசைகளை சுழற்றுங்கள்</string>
<string name="seconds">நொடிகள்</string>
@@ -167,7 +146,6 @@
<string name="optional">(விரும்பினால்)</string>
<string name="preshared_key">முன் பகிரப்பட்ட விசை</string>
<string name="email_description">எனக்கு மின்னஞ்சல் அனுப்புங்கள்</string>
<string name="use_kernel">கர்னல் தொகுதியைப் பயன்படுத்தவும்</string>
<string name="location_services_missing_message">உங்கள் சாதனத்தில் இயக்கப்பட்ட எந்த இருப்பிட சேவைகளையும் பயன்பாடு கண்டறியவில்லை. சாதனத்தைப் பொறுத்து, இது நம்பத்தகாத வைஃபை அம்சத்தை வைஃபை பெயரைப் படிக்கத் தவறிவிடும். எப்படியும் தொடர விரும்புகிறீர்களா?</string>
<string name="auto_tunnel_title">ஆட்டோ-டன்னல் பணி</string>
<string name="delete_tunnel">சுரங்கப்பாதையை நீக்கு</string>
@@ -176,16 +154,10 @@
<string name="set_primary_tunnel">முதன்மை சுரங்கப்பாதையாக அமைக்கவும்</string>
<string name="use_tunnel_on_wifi_name">வைஃபை பெயரில் சுரங்கப்பாதை பயன்படுத்தவும்</string>
<string name="edit_tunnel">சுரங்கப்பாதை திருத்து</string>
<string name="background_location_message2">இந்த அனுமதிகள் இயக்கப்பட்டுள்ளன என்பதை உறுதிப்படுத்த</string>
<string name="optional_default">"விரும்பினால், இயல்புநிலை: "</string>
<string name="dynamic">மாறும்</string>
<string name="quick_actions">விரைவான செயல்கள்</string>
<string name="advanced_settings">மேம்பட்ட அமைப்புகள்</string>
<string name="server_ipv4">ஐபிவி 4 ஓச்ட்பெயர் தீர்மானம்</string>
<string name="prefer_ipv4">ஐபிவி 4 இணைப்பை விரும்புங்கள்</string>
<string name="multiple">நான்கு</string>
<string name="kill_switch_off">நம்பகமானதைக் கொலை செய்வதை நிறுத்துங்கள்</string>
<string name="share">பங்கு</string>
<string name="select_all">அனைத்தையும் தெரிவுசெய்</string>
<string name="version_template">பதிப்பு: %1$s</string>
<string name="update_download_failed">புதுப்பிப்பு பதிவிறக்கம் தோல்வியடைந்தது.</string>
@@ -194,7 +166,6 @@
<string name="inactive">செயலற்றது</string>
<string name="tunnel_error_template">சுரங்கப்பாதை தோல்வியுற்றது: %1$s</string>
<string name="export_tunnels_wireguard">சுரங்கங்களை வயர் கார்டாக ஏற்றுமதி செய்யுங்கள்</string>
<string name="invalid_config_error">Invalitir_config_error</string>
<string name="app_permission_title">WG சுரங்கப்பாதை கட்டுப்பாட்டு பாலம்</string>
<string name="add_tunnel">சுரங்கப்பாதை சேர்க்கவும்</string>
<string name="app_permission_description">சுரங்கங்கள் மற்றும் ஆட்டோ-டன்னல் அம்சங்களைக் கட்டுப்படுத்தவும்.</string>
@@ -206,7 +177,6 @@
<string name="join_matrix">மேட்ரிக்ச் சமூகத்தில் சேரவும்</string>
<string name="dropdown">கீழ்தோன்றும்</string>
<string name="export_logs">சேமிக்கப்பட்ட பதிவுகளை ஏற்றுமதி செய்யுங்கள்</string>
<string name="info">தகவல்</string>
<string name="delete">நீக்கு</string>
<string name="wifi_name_template">செயலில்: %1$s</string>
<string name="export_failed">ஏற்றுமதி தோல்வியடைந்தது</string>
@@ -217,12 +187,8 @@
<string name="auth_error">அங்கீகரிக்கப்பட்ட பிழை இல்லை</string>
<string name="service_running_error">பணி இயங்கும் பிழை</string>
<string name="active">செயலில்</string>
<string name="bio_not_supported">பயோமெட்ரிக்ச் ஆதரிக்கப்படவில்லை</string>
<string name="bio_subtitle">உங்கள் பயோமெட்ரிக் நற்சான்றிதழைப் பயன்படுத்தி உள்நுழைக</string>
<string name="tunnel_starting">சுரங்கப்பாதை தொடங்குகிறது</string>
<string name="enable_remote_app_control">தொலைநிலை பயன்பாட்டுக் கட்டுப்பாட்டை இயக்கவும்</string>
<string name="bio_not_created">பயோமெட்ரிக்ச் உருவாக்கப்படவில்லை</string>
<string name="bio_update_required">பயோமெட்ரிக் பாதுகாப்பு புதுப்பிப்பு தேவை</string>
<string name="flavor_template">சுவை: %1$s</string>
<string name="add_from_url">முகவரி இலிருந்து சேர்க்கவும்</string>
<string name="delete_logs">பதிவுகளை நீக்கவும் அழிக்கவும்</string>
@@ -230,8 +196,6 @@
<string name="save">சேமி</string>
<string name="export_tunnels_amnezia">அம்னேசியாவாக சுரங்கங்களை ஏற்றுமதி செய்யுங்கள்</string>
<string name="camera_permission_required">கேமரா இசைவு தேவை</string>
<string name="status">நிலை</string>
<string name="bio_auth_title">பயோமெட்ரிக் ஏற்பு</string>
<string name="nothing_here_yet">இன்னும் இங்கே எதுவும் இல்லை!</string>
<string name="export_success">ஏற்றுமதி செய்</string>
<string name="download">பதிவிறக்கம்</string>
+9 -35
View File
@@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<?xml version='1.0' encoding='utf-8'?>
<resources>
<string name="app_name">WG Tunnel</string>
<string name="vpn_channel_id" translatable="false">VPN Channel</string>
@@ -7,9 +7,7 @@
<string name="docs_url" translatable="false">https://zaneschepke.com/wgtunnel-docs/overview.html</string>
<string name="privacy_policy_url" translatable="false">https://zaneschepke.com/wgtunnel-docs/privacypolicy.html</string>
<string name="docs_wildcards" translatable="false">https://zaneschepke.com/wgtunnel-docs/features.html#wildcard-wi-fi-name-support</string>
<string name="donate_url" translatable="false">https://zaneschepke.com/donate/</string>
<string name="error_file_extension">Dosya .conf veya .zip değil</string>
<string name="turn_off_tunnel">Bu işlem tünelin kapalı olmasını gerektirir</string>
<string name="no_tunnels">Henüz tünel eklenmedi!</string>
<string name="tunnels">Tüneller</string>
<string name="tunnel_mobile_data">Mobil veride tünel</string>
@@ -21,9 +19,7 @@
<string name="thank_you">WG Tunneli kullandığınız için teşekkürler!</string>
<string name="trusted_ssid_value_description">SSID Gönder</string>
<string name="add_tunnels_text">Dosyadan veya zipten ekle</string>
<string name="open_file">Dosya Aç</string>
<string name="add_from_qr">QR kodundan ekle</string>
<string name="qr_scan">QR Tara</string>
<string name="tunnel_name">Tünel Adı</string>
<string name="exclude">Hariç Tut</string>
<string name="include">Dahil Et</string>
@@ -37,29 +33,25 @@
<string name="endpoint">Uç Nokta</string>
<string name="name">Ad</string>
<string name="always_on_vpn_support">Her Zaman Açık VPNe İzin Ver</string>
<string name="location_services_not_detected">Konum Servisleri Algılanmadı</string>
<string name="location_services_not_detected">Konum Servisleri Algılanamadı</string>
<string name="db_name" translatable="false">wg-tunnel-db</string>
<string name="auto_tunneling">Otomatik tünelleme</string>
<string name="vpn_on">VPN açık</string>
<string name="vpn_off">VPN kapalı</string>
<string name="create_import">Sıfırdan oluştur</string>
<string name="turn_on_tunnel">Bu işlem aktif bir tünel gerektirir</string>
<string name="add_peer">Eş ekle</string>
<string name="interface_">Arayüz</string>
<string name="rotate_keys">Anahtarları döndür</string>
<string name="private_key">Özel anahtar</string>
<string name="copy_public_key">Genel anahtarı kopyala</string>
<string name="base64_key">base64 anahtar</string>
<string name="comma_separated_list">virgülle ayrılmış liste</string>
<string name="base64_key">Base64 anahtarı</string>
<string name="listen_port">Dinleme portu</string>
<string name="random">(rastgele)</string>
<string name="optional">(isteğe bağlı)</string>
<string name="preshared_key">Ön paylaşımlı anahtar</string>
<string name="seconds">saniye</string>
<string name="seconds">Saniye</string>
<string name="persistent_keepalive">Kalıcı canlı tutma</string>
<string name="cancel">İptal</string>
<string name="error_authentication_failed">Kimlik doğrulama başarısız</string>
<string name="error_authorization_failed">Yetkilendirme başarısız</string>
<string name="enabled_app_shortcuts">Uygulama kısayollarını etkinleştir</string>
<string name="unknown_error">Bilinmeyen bir hata oluştu</string>
<string name="tunnel_on_wifi">Güvenilmeyen wifida tünel</string>
@@ -68,7 +60,6 @@
<string name="email_chooser">E-posta gönder…</string>
<string name="docs_description">Belgeleri oku</string>
<string name="email_description">Bana e-posta gönder</string>
<string name="use_kernel">Çekirdek modülünü kullan</string>
<string name="error_ssid_exists">SSID zaten mevcut</string>
<string name="error_root_denied">Root kabuğu reddedildi</string>
<string name="error_no_file_explorer">Dosya gezgini yüklü değil</string>
@@ -77,12 +68,12 @@
<string name="delete_tunnel">Tüneli sil</string>
<string name="delete_tunnel_message">Bu tüneli silmek istediğinizden emin misiniz?</string>
<string name="yes">Evet</string>
<string name="all">tümü</string>
<string name="all">Tümü</string>
<string name="no_email_detected">E-posta uygulaması algılanmadı</string>
<string name="no_browser_detected">Tarayıcı algılanmadı</string>
<string name="open_issue">Bir sorun aç</string>
<string name="read_logs">Günlükleri oku</string>
<string name="auto">(otomatik)</string>
<string name="auto">(Otomatik)</string>
<string name="incorrect_pin">Pin yanlış</string>
<string name="pin_created">Pin başarıyla oluşturuldu</string>
<string name="enter_pin">Pininizi girin</string>
@@ -93,7 +84,6 @@
<string name="set_primary_tunnel">Birincil tünel olarak ayarla</string>
<string name="use_tunnel_on_wifi_name">Wifi adında tünel kullan</string>
<string name="edit_tunnel">Tüneli düzenle</string>
<string name="version">Sürüm</string>
<string name="settings">Ayarlar</string>
<string name="support">Destek</string>
<string name="kernel">Çekirdek</string>
@@ -111,27 +101,16 @@
<string name="see_the">Bakınız</string>
<string name="getting_started_url" translatable="false">https://zaneschepke.com/wgtunnel-docs/getting-started.html</string>
<string name="getting_started_guide">başlangıç kılavuzu</string>
<string name="error_file_format">Geçersiz tünel yapılandırma formatı</string>
<string name="restart_at_boot">Başlangıçta yeniden başlat</string>
<string name="vpn_denied_dialog_title">İzin Reddedildi</string>
<string name="vpn_settings">VPN sistem ayarları</string>
<string name="always_on_message">VPN bağlantı izni reddedildi. Lütfen</string>
<string name="always_on_message2">diğer tüm uygulamalar için Her Zaman Açık VPNin kapalı olduğundan emin olun ve tekrar deneyin</string>
<string name="background_location_message">Bu özellik için her zaman konum izni ve/veya hassas konum gereklidir. Lütfen</string>
<string name="app_settings">uygulama ayarları</string>
<string name="background_location_message2">bu izinlerin etkin olduğundan emin olun</string>
<string name="root_accepted">Root kabuğu kabul edildi</string>
<string name="set_custom_ping_ip">Özel ping IPsi ayarla</string>
<string name="default_ping_ip">(isteğe bağlı, varsayılan eşler)</string>
<string name="set_custom_ping_internal">Ping aralığı (saniye)</string>
<string name="optional_default">"isteğe bağlı, varsayılan: "</string>
<string name="set_custom_ping_cooldown">Ping yeniden başlatma bekleme süresi (saniye)</string>
<string name="show_amnezia_properties">Amnezia özelliklerini göster</string>
<string name="never">asla</string>
<string name="sec">sn</string>
<string name="never">Asla</string>
<string name="handshake">el sıkışma</string>
<string name="logs">Günlükler</string>
<string name="kill_switch">Kill Switch</string>
<string name="appearance">Görünüm</string>
<string name="notifications">Bildirimler</string>
<string name="automatic">Otomatik</string>
@@ -149,9 +128,7 @@
<string name="use_wildcards">İsim jokerlerini kullan</string>
<string name="learn_more">Daha fazla bilgi</string>
<string name="wildcards_active">Jokerler etkin</string>
<string name="wifi_name_via_shell">Kabuk üzerinden wifi adı</string>
<string name="use_root_shell_for_wifi">Wifi adını almak için root kabuğunu kullan</string>
<string name="kernel_not_supported">Çekirdek desteklenmiyor</string>
<string name="start_auto">Otomatik tüneli başlat</string>
<string name="stop_auto">Otomatik tüneli durdur</string>
<string name="tunnel_running">Tünel çalışıyor</string>
@@ -165,8 +142,6 @@
<string name="ethernet_tunnel">Ethernet tüneli</string>
<string name="set_ethernet_tunnel">Ethernet tüneli olarak ayarla</string>
<string name="native_kill_switch">Yerel kill switch</string>
<string name="vpn_kill_switch">VPN kill switch</string>
<string name="kill_switch_options">Kill switch seçenekleri</string>
<string name="allow_lan_traffic">LAN trafiğine izin ver</string>
<string name="bypass_lan_for_kill_switch">Kill switch için LAN’ı atla</string>
<string name="vpn_channel_description">VPN durum bildirimleri için bir kanal</string>
@@ -192,8 +167,7 @@
<string name="include_lan">LAN’ı dahil et</string>
<string name="tunnel_control">Tünel kontrolü</string>
<string name="auto_tunnel">Otomatik tünel</string>
<string name="kill_switch_off">Güvenilirde kill switchi durdur</string>
<string name="server_ipv4">IPv4 ana makine çözünürlüğü</string>
<string name="prefer_ipv4">IPv4 bağlantısını tercih et</string>
<string name="multiple">Çoklu</string>
<string name="app_permission_title">WG Tunnel Kontrol Köprüsü</string>
<string name="app_permission_description">Kontrol tünelleri ve oto-tünel özellikleri.</string>
</resources>
+1 -28
View File
@@ -1,6 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<?xml version='1.0' encoding='utf-8'?>
<resources>
<string name="comma_separated_list">список розділений комами</string>
<string name="no_tunnels">Тунелі ще не додані!</string>
<string name="app_name">WG Tunnel</string>
<string name="tunnels">Тунелі</string>
@@ -8,11 +7,9 @@
<string name="tunnel_on_ethernet">Тунелювати Ethernet</string>
<string name="prominent_background_location_title">Фонова передача місцезнаходження</string>
<string name="trusted_ssid_value_description">Підтвердити SSID</string>
<string name="qr_scan">Сканувати QR</string>
<string name="tunnel_name">Ім\'я тунелю</string>
<string name="include">Включити</string>
<string name="config_changes_saved">Зміни налаштувань збережено.</string>
<string name="turn_on_tunnel">Дія потребує активного тунелю</string>
<string name="rotate_keys">Оновити ключі</string>
<string name="private_key">Закритий ключ</string>
<string name="base64_key">Ключ в base64</string>
@@ -23,19 +20,15 @@
<string name="error_root_denied">Root доступ заборонено</string>
<string name="incorrect_pin">Невірний PIN-код</string>
<string name="use_tunnel_on_wifi_name">Використовувати тунель в мережі Wi-Fi</string>
<string name="version">Версія</string>
<string name="transport_packet_magic_header">Заголовок транспортного пакету</string>
<string name="getting_started_guide">інструкція щодо початку роботи</string>
<string name="error_file_format">некоректний формат конфігурації тунелю</string>
<string name="vpn_channel_name">Канал сповіщення VPN</string>
<string name="error_file_extension">Файл не є .conf або .zip файлом</string>
<string name="turn_off_tunnel">Дія потребує вимкнення тунелю</string>
<string name="tunnel_mobile_data">Тунелювати мобільні дані</string>
<string name="privacy_policy">Переглянути політику конфіденційності</string>
<string name="thank_you">Спасибі за використання WG Tunnel!</string>
<string name="prominent_background_location_message">Дана функція потребує фоновий доступ до служби місцезнаходження для моніторингу назви мереж Wi-Fi навіть коли додаток закрито. Для отримання додаткової інформації прочитайте політику приватності на екрані Підтримки.</string>
<string name="add_tunnels_text">Додати з файлу або архіву</string>
<string name="open_file">Відкрити файл</string>
<string name="exclude">Виключити</string>
<string name="add_from_qr">Додати з QR коду</string>
<string name="public_key">Публічний ключ</string>
@@ -59,15 +52,12 @@
<string name="preshared_key">Загальний ключ</string>
<string name="seconds">секунд</string>
<string name="persistent_keepalive">Підтримка роботи тунелю (keepalive)</string>
<string name="error_authorization_failed">Не вдалося авторизуватися</string>
<string name="enabled_app_shortcuts">Дозволити ярлики</string>
<string name="error_authentication_failed">Помилка автентифікації</string>
<string name="unknown_error">Невідома помилка</string>
<string name="tunnel_on_wifi">Тунелювати недовірені мережі Wi-Fi</string>
<string name="email_subject">Підтримка WG-Tunnel</string>
<string name="docs_description">Переглянути документацію</string>
<string name="email_description">Відправити email автору</string>
<string name="use_kernel">Використовувати модуль режиму ядра</string>
<string name="error_ssid_exists">SSID вже існує</string>
<string name="error_no_file_explorer">Не знайдено файловий менеджер</string>
<string name="auto_tunnel_title">Сервіс автотунелювання</string>
@@ -105,13 +95,7 @@
<string name="skip">Пропустити</string>
<string name="trusted_wifi_names">Довірені мережі Wi-Fi</string>
<string name="vpn_denied_dialog_title">Немає дозволу</string>
<string name="app_settings">налаштування програми</string>
<string name="background_location_message2">, щоб переконатися, що ці дозволи надано</string>
<string name="default_ping_ip">(необов\'язково, за замовчуванням для пірів)</string>
<string name="set_custom_ping_internal">Інтервал пінгу (сек.)</string>
<string name="set_custom_ping_cooldown">Час очікування перезапуску пінгу (сек.)</string>
<string name="show_amnezia_properties">Показати налаштування Amnezia</string>
<string name="sec">сек.</string>
<string name="handshake">з\'єднання</string>
<string name="notifications">Сповіщення</string>
<string name="light">Світла</string>
@@ -122,13 +106,10 @@
<string name="launch_app_settings">Налаштування запуску програми</string>
<string name="learn_more">Дізнатись більше</string>
<string name="wildcards_active">Підстановочні знаки використовуються</string>
<string name="wifi_name_via_shell">Ім\'я Wi-Fi через root</string>
<string name="kill_switch">Екстрене відключення</string>
<string name="restart_at_boot">Перезапуск під час завантаження</string>
<string name="vpn_settings">Системні налаштування VPN</string>
<string name="always_on_message">Дозвіл на VPN-з\'єднання було відхилено, перевірте</string>
<string name="root_accepted">Root-доступ дозволено</string>
<string name="set_custom_ping_ip">Призначити свій IP для пінгу</string>
<string name="logs">Журнали</string>
<string name="mobile_tunnel">Тунель для мобільних даних</string>
<string name="display_theme">Тема</string>
@@ -138,9 +119,7 @@
<string name="dynamic">Динамічна</string>
<string name="use_root_shell_for_wifi">Використовувати root-доступ для отримання імені мережі Wi-Fi</string>
<string name="use_wildcards">Використовувати підстановочні знаки в імені</string>
<string name="optional_default">"необов\'язково, за замовчуванням: "</string>
<string name="always_on_message2">, щоб переконатися, що функція «Постійний VPN» вимкнена для всіх інших програм, і спробуйте ще раз</string>
<string name="background_location_message">Дозволяти весь час, доки для роботи цієї функції потрібен доступ на місцезнаходження та/або точне місцезнаходження. Дивіться</string>
<string name="advanced_settings">Додаткові налаштування</string>
<string name="quick_actions">Швидкі дії</string>
<string name="tunnel_running">Тунель працює</string>
@@ -149,8 +128,6 @@
<string name="add_from_clipboard">Додати з буфера обміну</string>
<string name="stop_on_no_internet">Зупинити без інтернету</string>
<string name="native_kill_switch">Штатне екстрене відключення</string>
<string name="vpn_kill_switch">Екстрене відключення VPN</string>
<string name="kill_switch_options">Налаштування екстреного вимкнення</string>
<string name="allow_lan_traffic">Обхід LAN</string>
<string name="bypass_lan_for_kill_switch">Дозволяти трафік LAN при екстреному вимкненні</string>
<string name="auto_tunnel_channel_name">Канал сповіщень автотунелю</string>
@@ -171,7 +148,6 @@
<string name="tunnel_control">Управління тунелем</string>
<string name="auto_tunnel">Автотунель</string>
<string name="local_logging">Локальне ведення журналу</string>
<string name="kernel_not_supported">Ядро не підтримується</string>
<string name="start_auto">Запустити автотунель</string>
<string name="stop_auto">Зупинити автотунель</string>
<string name="enable_local_logging">Увімкнути ведення журналу</string>
@@ -181,8 +157,5 @@
<string name="tunnel_specific_settings">Спеціальні налаштування тунелю</string>
<string name="vpn_channel_description">Канал сповіщень про стан VPN</string>
<string name="enable_amnezia_compatibility">Включити сумісність із Amnezia</string>
<string name="kill_switch_off">Без екстреного вимкнення у довірених</string>
<string name="server_ipv4">Отримання імені вузла IPv4</string>
<string name="prefer_ipv4">Віддавати перевагу з\'єднанню IPv4</string>
<string name="multiple">Декілька</string>
</resources>
+122 -46
View File
@@ -1,20 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<?xml version='1.0' encoding='utf-8'?>
<resources>
<string name="peer">پیر</string>
<string name="add_from_qr">کیو آر کوڈ سے شامل کریں</string>
<string name="always_on_vpn_support">ہمیشہ آن وی پی این کی اجازت دیں</string>
<string name="add_peer">پیئر شامل کریں</string>
<string name="turn_off_tunnel">کارروائی کے لیے ٹنل بند کی ضرورت ہے</string>
<string name="rotate_keys">کلید گھمائیں</string>
<string name="copy_public_key">عوامی کلید نقل کریں</string>
<string name="vpn_channel_name">وی پی این نوٹیفکیشن چینل</string>
<string name="optional">(اختیاری)</string>
<string name="comma_separated_list">کوما سے الگ کردہ فہرست</string>
<string name="location_services_missing_message">ایپ آپ کے آلے پر فعال مقام کی سروسز کا پتہ نہیں لگا رہی۔ ڈیوائس پر منحصر ہے، یہ غیر بھروسہ مند وائی فائی فیچر کے وائی فائی کا نام پڑھنے میں ناکام ہونے کا سبب بن سکتا ہے۔ کیا آپ بہرحال جاری رکھنا چاہیں گے؟</string>
<string name="prominent_background_location_title">پس منظر لوکیشن کا انکشاف</string>
<string name="public_key">عوامی کلید</string>
<string name="app_name">ڈبلیو جی ٹنل</string>
<string name="error_file_extension">فائل conf یا zip نہیں ہے۔</string>
<string name="error_file_extension">فائل conf یا zip نہیں ہے</string>
<string name="no_tunnels">ابھی تک کوئی ٹنلز شامل نہیں کی گئیں!</string>
<string name="tunnels">ٹنلز</string>
<string name="tunnel_mobile_data">موبائل ڈیٹا پر ٹنل</string>
@@ -23,8 +21,6 @@
<string name="tunnel_on_ethernet">ای تھرنیٹ پر ٹنل</string>
<string name="thank_you">ڈبلیو جی ٹنل استعمال کرنے کا شکریہ!</string>
<string name="trusted_ssid_value_description">ایس ایس آی ڈی جمع کروائیں</string>
<string name="open_file">فائل کھولیں</string>
<string name="qr_scan">کیو آر اسکین</string>
<string name="tunnel_name">ٹنل کا نام</string>
<string name="exclude">خارج</string>
<string name="include">شامل</string>
@@ -37,7 +33,6 @@
<string name="location_services_not_detected">مقام کی سروسز کا پتہ نہیں چلا</string>
<string name="vpn_on">وی پی این آن</string>
<string name="vpn_off">وی پی این آف</string>
<string name="turn_on_tunnel">کارروائی کے لیے فعال ٹنل کی ضرورت ہے</string>
<string name="interface_">انٹرفیس</string>
<string name="private_key">نجی کلید</string>
<string name="base64_key">بیس64 کلید</string>
@@ -45,14 +40,11 @@
<string name="random">(بے ترتیب)</string>
<string name="preshared_key">پہلے سے مشترکہ کلید</string>
<string name="cancel">منسوخ</string>
<string name="error_authentication_failed">تصدیق ناکام</string>
<string name="error_authorization_failed">اجازت دینے میں ناکام</string>
<string name="enabled_app_shortcuts">ایپ شارٹ کٹس کو فعال کریں</string>
<string name="tunnel_on_wifi">ناقابل اعتماد وائی فائی پر ٹنل</string>
<string name="email_subject">ڈبلیو جی ٹنل سپورٹ</string>
<string name="docs_description">دستاویزات پڑھیں</string>
<string name="email_description">مجھے ایک ای میل بھیجیں</string>
<string name="use_kernel">کرنل ماڈیول استعمال کریں</string>
<string name="error_ssid_exists">ایس ایس آی ڈی پہلے سے موجود ہے</string>
<string name="error_root_denied">روٹ شیل سے انکار کر دیا گیا</string>
<string name="error_no_file_explorer">کوئی فائل ایکسپلورر انسٹال نہیں ہے</string>
@@ -71,22 +63,16 @@
<string name="create_pin">پن بنائیں</string>
<string name="restart_on_ping">پنگ فیل پر دوبارہ شروع کریں (بی ٹا)</string>
<string name="set_primary_tunnel">بنیادی ٹنل کے طور پر سیٹ کریں</string>
<string name="version">ورژن</string>
<string name="junk_packet_count">جنک پیکٹ کی تعداد</string>
<string name="init_packet_junk_size">اِنِٹ پیکٹ جنک سائز</string>
<string name="init_packet_magic_header">اِنِٹ پیکٹ میجک ہیڈر</string>
<string name="transport_packet_magic_header">ٹرانسپورٹ پیکٹ میجک ہیڈر</string>
<string name="see_the">دیکھیں</string>
<string name="error_file_format">غلط ٹنل کنفیگریشن فارمیٹ</string>
<string name="vpn_denied_dialog_title">اجازت نامنظور</string>
<string name="vpn_settings">وی پی این سسٹم کی ترتیبات</string>
<string name="always_on_message">وی پی این کنکشن کی اجازت مسترد کر دی گئی ہے۔ براہ کرم چیک کریں</string>
<string name="app_settings">ایپ کی ترتیبات</string>
<string name="root_accepted">روٹ شیل قبول کر لیا گیا</string>
<string name="set_custom_ping_ip">اپنی مرضی کے مطابق پنگ آئی پی سیٹ کریں</string>
<string name="default_ping_ip">(اختیاری، پیئرز کے لیے طہ شدہ)</string>
<string name="show_amnezia_properties">ایمنیزیا خصوصیات دکھائیں</string>
<string name="sec">سیکنڈ</string>
<string name="appearance">ظاہری شکل</string>
<string name="notifications">اطلاعات</string>
<string name="automatic">خودکار</string>
@@ -99,15 +85,12 @@
<string name="mobile_tunnel">موبائل ڈیٹا ٹنل</string>
<string name="skip">نظر انداز</string>
<string name="learn_more">مزید جانیں</string>
<string name="kernel_not_supported">کرنل سپورٹڈ نہیں</string>
<string name="start_auto">خودکار ٹنل چلائیں</string>
<string name="donate">پروجیکٹ کے لیے عطیہ کریں</string>
<string name="local_logging">مقامی لاگنگ</string>
<string name="enable_local_logging">مقامی لاگنگ فعال کریں</string>
<string name="stop_on_no_internet">بغیر انٹرنیٹ پر روکیں</string>
<string name="stop_on_internet_loss">انٹرنیٹ لاس پر ٹنل روکیں</string>
<string name="vpn_kill_switch">وی پی این کِل سوئچ</string>
<string name="kill_switch_options">کِل سوئچ اختیارات</string>
<string name="allow_lan_traffic">لین ٹریفک کی اجازت دیں</string>
<string name="splt_tunneling">سپلٹ ٹنلنگ</string>
<string name="tunnel_specific_settings">ٹنل کی مخصوص ترتیبات</string>
@@ -123,8 +106,6 @@
<string name="exclude_lan">لین خارج کریں</string>
<string name="include_lan">لین شامل کریں</string>
<string name="auto_tunnel">خودکار ٹنل</string>
<string name="kill_switch_off">قابل اعتماد پر کِل سوئچ بند کریں</string>
<string name="server_ipv4">آئی پی وی 4 ہوسٹ نیم ریزولیوشن</string>
<string name="multiple">متعدد</string>
<string name="prominent_background_location_message">اس فیچر کو ایپلیکیشن بند ہونے کے باوجود بھی وای فائی ایس ایس آی ڈی مانیٹرنگ کو فعال کرنے کے لیے پس منظر لوکیشن کی اجازت درکار ہے۔ مزید تفصیلات کے لیے، براہ کرم سپورٹ اسکرین پر منسلک رازداری کی پالیسی دیکھیں۔</string>
<string name="email_chooser">ای میل بھیجیں…</string>
@@ -133,24 +114,20 @@
<string name="auto_tunneling">خودکار ٹنلنگ</string>
<string name="create_import">شروع سے تخلیق کریں</string>
<string name="unknown_error">نامعلوم خرابی پیش آگئی</string>
<string name="seconds">سیکنڈ</string>
<string name="seconds">سیکنڈز</string>
<string name="persistent_keepalive">مسلسل زندہ</string>
<string name="remove_amnezia_compatibility">ایمنیزیا مطابقت ہٹائیں</string>
<string name="light">روشن</string>
<string name="set_ethernet_tunnel">بطور ایتھرنیٹ ٹنل کے سیٹ کریں</string>
<string name="launch_app_settings">ایپ ترتیبات لانچ کریں</string>
<string name="monitoring_state_changes">ریاستی تبدیلیوں کی نگرانی</string>
<string name="set_custom_ping_internal">پنگ وقفہ (سیکنڈ)</string>
<string name="wifi_name_via_shell">شیل کے ذریعے وائی فائی کا نام</string>
<string name="enter_pin">اپنا پن درج کریں</string>
<string name="enter_pin">پن درج کریں</string>
<string name="getting_started_guide">شروع کرنے کی گائیڈ</string>
<string name="set_custom_ping_cooldown">پنگ دوبارہ شروع کولڈاؤن (سیکنڈ)</string>
<string name="handshake">ہینڈشیک</string>
<string name="response_packet_magic_header">رسپانس پیکٹ میجک ہیڈر</string>
<string name="unsure_how">اگر آپ کو یقین نہیں کہ کیسے آگے بڑھیں</string>
<string name="use_tunnel_on_wifi_name">وائی فائی نام پر ٹنل استعمال کریں</string>
<string name="optional_default">"اختیاری، طہ شدہ: "</string>
<string name="use_root_shell_for_wifi">وائی فائی کا نام حاصل کرنے کے لیے روٹ شیل کا استعمال کریں</string>
<string name="use_root_shell_for_wifi">وائی فائی کی معلومات حاصل کرنے کے لیے روٹ شیل کا استعمال کریں، مقام کی اجازت کی ضرورت کو روکتے ہوئے</string>
<string name="response_packet_junk_size">رسپانس پیکٹ جنک سائز</string>
<string name="junk_packet_minimum_size">جنک پیکٹ کا کم از کم سائز</string>
<string name="mobile_data_tunnel">موبائل ڈیٹا ٹنل کے طور پر سیٹ کریں</string>
@@ -160,12 +137,9 @@
<string name="kernel">کرنل</string>
<string name="restart_at_boot">بوٹ پر دوبارہ شروع کریں</string>
<string name="support">سپورٹ</string>
<string name="background_location_message2">یہ یقینی بنانے کے لیے کہ یہ اجازتیں فعال ہیں</string>
<string name="settings">ترتیبات</string>
<string name="junk_packet_maximum_size">جنک پیکٹ کا زیادہ سے زیادہ سائز</string>
<string name="enable_amnezia_compatibility">ایمنیزیا مطابقت فعال کریں</string>
<string name="kill_switch">کِل سوئچ</string>
<string name="prefer_ipv4">آئی پی وی 4 کنکشن کو ترجیح دیں</string>
<string name="native_kill_switch">مقامی کِل سوئچ</string>
<string name="auto_tunnel_channel_description">خودکار ٹنل اسٹیٹ کی اطلاعات کے لیے ایک چینل</string>
<string name="use_wildcards">نام وائلڈ کارڈ استعمال کریں</string>
@@ -176,7 +150,6 @@
<string name="stop">روکیں</string>
<string name="never">کبھی نہیں</string>
<string name="underload_packet_magic_header">پیکٹ میجک ہیڈر کو انڈر لوڈ کریں</string>
<string name="background_location_message">اس خصوصیت کے لیے ہر وقت مقام کی اجازت اور/یا درست مقام کی ضرورت ہے۔ ملاحظہ فرمائیں</string>
<string name="always_on_message2">یہ یقینی بنانے کے لیے کہ ہمیشہ آن وی پی این دیگر تمام ایپس کے لیے بند ہے اور دوبارہ کوشش کریں</string>
<string name="ethernet_tunnel">ایتھرنیٹ ٹنل</string>
<string name="auto_tunnel_channel_name">خودکار ٹنل نوٹیفکیشن چینل</string>
@@ -202,32 +175,23 @@
<string name="add_tunnel">ٹنل شامل کریں</string>
<string name="export_logs">ذخیرہ شدہ لاگز برآمد کریں</string>
<string name="copy">نقل</string>
<string name="info">معلومات</string>
<string name="export_tunnels_wireguard">ٹنلز بطور وائر گارڈ برآمد کریں</string>
<string name="delete">حذف</string>
<string name="camera_permission_required">کیمرے کی اجازت درکار ہے</string>
<string name="export_failed">برآمد ناکام</string>
<string name="tunnel_error_template">ٹنل اس کے ساتھ ناکام ہوگئی: %1$s</string>
<string name="wifi_name_template">فعال: %1$s</string>
<string name="config_error">کنفگریشن خرابی</string>
<string name="dns_resolve_error">ڈی این ایس ریزولوشن خرابی</string>
<string name="invalid_config_error">غلط_کنفگریشن_خرابی۔</string>
<string name="auth_error">غیر مجاز غلطی</string>
<string name="service_running_error">سروس نہیں چل رہی کی خرابی</string>
<string name="config_error">غلط ترتیب</string>
<string name="dns_resolve_error">ڈی این ایس ریزولوشن ناکام</string>
<string name="auth_error">غیر مجاز</string>
<string name="service_running_error">سروس نہیں چل رہی</string>
<string name="inactive">غیر فعال</string>
<string name="active">فعال</string>
<string name="status">سٹیٹس</string>
<string name="bio_not_supported">بایومیٹرکس تعاون یافتہ نہیں</string>
<string name="bio_not_created">بائیومیٹرکس نہیں بنائے گئے</string>
<string name="bio_update_required">بائیومیٹرک سیکیورٹی تازہ کاری درکار ہے</string>
<string name="tunnel_starting">ٹنل شروع ہو رہی ہے</string>
<string name="nothing_here_yet">ابھی تک یہاں کچھ نہیں!</string>
<string name="join_matrix">میٹرکس کمیونٹی میں شامل ہوں</string>
<string name="delete_logs">لاگز حذف اور صاف کریں</string>
<string name="export_tunnels_amnezia">ٹنلز بطور ایمنیزیا برآمد کریں</string>
<string name="bio_subtitle">اپنی بائیومیٹرک اسناد کا استعمال کرتے ہوئے لاگ ان کریں</string>
<string name="bio_auth_title">بائیومیٹرک تصدیق</string>
<string name="share">اشتراک</string>
<string name="select_all">سبھی کو منتخب کریں</string>
<string name="check_for_update">تازہ کاری کے لیے جانچ کریں</string>
<string name="update_check_failed">تازہ کاری کی جانچ ناکام ہو گئی۔</string>
@@ -246,10 +210,122 @@
<string name="darker">بہت گہرا</string>
<string name="amoled">ایمولیڈ</string>
<string name="security_template">سیکیورٹی: %1$s</string>
<string name="update_check_unsupported">تازہ کاری معائنہ اس قسم کی تعمیر کی حمایت نہیں کرتا ہے۔</string>
<string name="update_check_unsupported">اس قسم کی تعمیر کے لیے تازہ کاری معائنہ تعاون یافتہ نہیں ہے۔</string>
<string name="flavor_template">ذائقہ: %1$s</string>
<string name="show_qr">کیو آر دکھائیں</string>
<string name="amnezia">ایمنیزیا</string>
<string name="wireguard">وائرگارڈ</string>
<string name="done">ہوگیا</string>
<string name="current_template">موجودہ: %1$s</string>
<string name="wifi_detection_method">وائی فائی کا پتہ لگانے کا طریقہ</string>
<string name="_default">طے شدہ</string>
<string name="legacy">میراث</string>
<string name="root">رووٹ</string>
<string name="shizuku">شیزوکو</string>
<string name="legacy_api_description">وائی فائی کی معلومات حاصل کرنے کے لیے ایک اینڈرائڈ 12 فرسودہ طریقہ استعمال کریں جو مقام کے استفسارات کو محدود کرتا ہے، لیکن ہو سکتا ہے کہ نئے آلات پر قابل اعتماد طریقے سے کام نہ کرے</string>
<string name="use_shell_via_shizuku">وائی فائی کی معلومات حاصل کرنے کے لیے شیزوکو کے ذریعے شیل کا استعمال کریں، غیر رووٹ والے آلات پر مقام کی اجازت کی ضرورت کو روکتے ہوئے</string>
<string name="use_android_recommended">اینڈرائیڈ ورژن کی بنیاد پر وائی فائی کی معلومات حاصل کرنے کے لیے اینڈرائیڈ کا تجویز کردہ طریقہ استعمال کریں</string>
<string name="release_notes">ریلیز نوٹس</string>
<string name="shizuku_not_detected">شیزوکو کا پتہ نہیں چلا</string>
<string name="sort">چھانٹ</string>
<string name="drag_handle">ہینڈل کو گھسیٹیں</string>
<string name="move_up">اوپر منتقل کریں</string>
<string name="move_down">نیچے منتقل کریں</string>
<string name="error_tunnel_name">کرنل موڈ میں ٹنل کا نام 15 حروف یا اس سے کم ہونا چاہیے</string>
<string name="tunnel">ٹنل</string>
<string name="tunnel_item_description">%1$s, %2$s, %3$s</string>
<string name="warning">وارننگ</string>
<string name="location_permissions">مقام کی اجازت</string>
<string name="location_justification">آپ کے موجودہ پتہ لگانے کے طریقے کے ساتھ پس منظر میں وائی فائی کے ناموں کو پڑھنے کے لیے، اینڈرائیڈ کو ایپس کو \'ہر وقت اجازت دیں\' اور \'عین مطابق\' (پرانے آلات پر پس منظر کی جگہ) کی اجازت دینے کی ضرورت ہے۔ براہ کرم اپنی اینڈرائیڈ ایپ کی ترتیبات میں ان اجازتوں کو فعال کریں۔</string>
<string name="open_settings">ترتیبات کھولیں</string>
<string name="location_permissions_missing">مقام کی اجازتیں غائب ہیں</string>
<string name="fix">ٹھیک کریں</string>
<string name="start">شروع کریں</string>
<string name="auto_tunnel_running">آٹو ٹنل چل رہا ہے</string>
<string name="auto_tunnel_not_running">آٹو ٹنل نہیں چل رہا ہے</string>
<string name="pinger_bounce_successful">پِنگر کے ذریعے ٹنل کامیابی کے ساتھ دوبارہ شروع ہو گئی۔</string>
<string name="pinger_bounce_recovery">پِنگر دوبارہ شروع کرنا ناکام ہو گیا۔ پرانے پتوں کے ساتھ ٹنل برآمد ہوئی۔</string>
<string name="bounce_failed_template">پِنگر خرابی کے ساتھ سرنگ کی بازیابی میں ناکام ہو گیا: %1$s</string>
<string name="tunnel_monitoring">ٹنل کی نگرانی</string>
<string name="set_custom_ping_target">حسب ضرورت پِنگ ہدف (اختیاری)</string>
<string name="ip_or_hostname">آئی پی یا میزبان نام</string>
<string name="ping_target_description">استعمال کیا جاتا ہے اگر کوئی اندرونی آئی پی دستیاب نہیں ہے (جیسے، مکمل ٹنل کی تشکیل میں)۔ خالی چھوڑنے پر کلاؤڈفلئیر طے شدہ ہے۔</string>
<string name="tunnel_ping_interval">ٹنل پِنگ وقفہ</string>
<string name="attempts_per_interval">فی وقفہ پنگ کی کوششیں</string>
<string name="ping_timeout">ٹنل پنگ ٹائم آؤٹ</string>
<string name="timeout_all_attempts">تمام کوششوں کے لیے کل ٹائم آؤٹ</string>
<string name="display_detailed_ping_stats">پِنگ کے تفصیلی اعدادوشمار دکھائیں</string>
<string name="monitoring_ping">پِنگ ٹنل مانیٹرنگ کو فعال کریں</string>
<string name="rx_template">آر ایکس: %1$s ایم بی</string>
<string name="tx_template">ٹی ایکس: %1$s ایم بی</string>
<string name="reachable_template">قابل رسائی: %1$s</string>
<string name="ping_success_template">آخری کامیاب پِنگ: %1$s</string>
<string name="sec_ago_template">%1$s سیکنڈ پہلے</string>
<string name="latency_template">تاخیر: %1$s</string>
<string name="jitter_template">ہلچل: %1$s</string>
<string name="packets_sent_template">پیکٹ بھیجے گئے: %1$s</string>
<string name="packet_loss_template">پیکٹ کا نقصان: %.2f%%</string>
<string name="ping_target_template">پِنگ کا ہدف: %1$s</string>
<string name="_true">درست</string>
<string name="_false">غلط</string>
<string name="backup_success">بیک اپ کامیاب۔ %1$s</string>
<string name="restore_success">بحالی کامیاب۔ %1$s</string>
<string name="restarting_app">تبدیلیاں لاگو کرنے کے لیے ایپ کو دوبارہ شروع کیا جا رہا ہے…</string>
<string name="restore_failed">بیک اپ سے بحالی ناکام۔</string>
<string name="backup_failed">بیک اپ بنانے میں ناکام۔</string>
<string name="backup_application">ایپلیکیشن ڈیٹا کا بیک اپ</string>
<string name="restore_application">بیک اپ سے بحال کریں</string>
<string name="expiremental_template">%1$s (تجرباتی)</string>
<string name="root_required_template">%1$s (روٹ کی ضرورت ہے)</string>
<string name="recommended_template">%1$s (تجویز کردہ)</string>
<string name="hint_template">(%1$s)</string>
<string name="proxy">پراکسی</string>
<string name="backend_mode">ایپ موڈ</string>
<string name="selected">منتخب کردہ</string>
<string name="socks_5_proxy">ساکس5 پراکسی</string>
<string name="http_proxy">ایچ‌ٹی‌ٹی‌پی پراکسی</string>
<string name="username">صارف نام</string>
<string name="password">پاس ورڈ</string>
<string name="proxy_credentials">پراکسی اسناد</string>
<string name="proxy_settings">پراکسی ترتیبات</string>
<string name="vpn">وی‌پی‌این</string>
<string name="android_integrations">اینڈرائیڈ انضمام</string>
<string name="show_password">پاس ورڈ دکھائیں</string>
<string name="socks_5_bind_address">ساکس5 بائنڈ ایڈریس</string>
<string name="http_bind_address">ایچ‌ٹی‌ٹی‌پی پابند پتہ</string>
<string name="defaults_to_template">(%1$s پر پہلے سے طے شدہ)</string>
<string name="dns_settings">ڈی‌این‌ایس ترتیبات</string>
<string name="locked_down">لاک ڈاؤن</string>
<string name="dns_provider">ڈی‌این‌ایس فراہم کنندہ</string>
<string name="dns_protocol">ڈی‌این‌ایس پروٹوکول</string>
<string name="system">سسٹم</string>
<string name="doh">ایچ‌ٹی‌ٹی‌پی‌ایس پر ڈی‌این‌ایس (ڈی‌او‌ایچ)</string>
<string name="comma_separated">کوما الگ شدہ</string>
<string name="server_port">سرور:پورٹ</string>
<string name="new_tunnel">نئی ٹنل</string>
<string name="system_features">سسٹم کی خصوصیات</string>
<string name="read_failed">ڈیٹا پڑھنے میں ناکام۔</string>
<string name="invalid_key">غلط کلید</string>
<string name="invalid_number">غلط نمبر</string>
<string name="invalid_value">غلط مقدار</string>
<string name="missing_attribute">غائب وصف</string>
<string name="missing_section">غائب سیکشن</string>
<string name="syntax_error">نحو کی خرابی</string>
<string name="unknown_attribute">نامعلوم وصف</string>
<string name="unknown_section">نامعلوم سیکشن</string>
<string name="config_error_template">خراب ترتیب۔ %1$s مقام پر: %2$s۔</string>
<string name="ports_must_differ">ناکام۔ پراکسیوں کے پاس مختلف پورٹس ہونے چاہئیں۔</string>
<string name="password_no_spaces">پاس ورڈ میں خالی جگہیں نہیں ہوسکتی ہیں۔</string>
<string name="tunnel_name_taken">ٹنل کا نام پہلے ہی استعمال ہو چکا ہے۔</string>
<string name="range_hint">(%1$d%2$d)</string>
<string name="mimic_quic">کیو‌یو‌آئی‌سی کی نقل کریں</string>
<string name="mimic_dns">ڈی‌این‌ایس کی نقل کریں</string>
<string name="mimic_sip">ایس‌آئی‌پی کی نقل کریں</string>
<string name="active_tunnel_update_failed">فعال ٹنل کی تازہ کاری ناکام ہو گئی</string>
<string name="ddns_auto_update">متحرک ڈی‌این‌ایس خودکار تازہ کاری</string>
<string name="ddns_auto_update_description">ڈی‌ڈی‌این‌ایس تبدیلیوں پر آئی‌پی کی خودکار تازہ کاری کرتا ہے</string>
<string name="prefer_ipv6_resolution">آئی‌پی‌وی6 ہم مرتبہ ریزولوشن کو ترجیح دیں</string>
<string name="disabled">معذور</string>
<string name="mode_disabled_template">فیچر %1$s موڈ میں دستیاب نہیں ہے۔</string>
<string name="lockdown">لاک ڈاؤن</string>
</resources>
+132 -46
View File
@@ -1,6 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<?xml version='1.0' encoding='utf-8'?>
<resources>
<string name="turn_off_tunnel">请先关闭连接再操作</string>
<string name="no_tunnels">您还没有添加隧道!</string>
<string name="tunnels">隧道列表</string>
<string name="privacy_policy">查看隐私政策</string>
@@ -11,7 +10,6 @@
<string name="trusted_ssid_value_description">确认修改 SSID</string>
<string name="add_tunnels_text">从文件或 zip 添加</string>
<string name="add_from_qr">从二维码添加</string>
<string name="qr_scan">扫描二维码</string>
<string name="tunnel_name">隧道名称</string>
<string name="include">包含</string>
<string name="public_key">公钥</string>
@@ -22,13 +20,12 @@
<string name="name">名称</string>
<string name="peer">节点</string>
<string name="always_on_vpn_support">允许 VPN 始终在线</string>
<string name="location_services_not_detected">定位服务未开启</string>
<string name="location_services_not_detected">未检测到定位服务</string>
<string name="rotate_keys">轮换秘钥</string>
<string name="create_import">手动创建</string>
<string name="private_key">私钥</string>
<string name="listen_port">监听端口</string>
<string name="optional">(可选)</string>
<string name="error_authorization_failed">验证失败</string>
<string name="enabled_app_shortcuts">创建桌面快捷方式</string>
<string name="docs_description">阅读文档</string>
<string name="email_description">给作者发邮件</string>
@@ -37,12 +34,9 @@
<string name="copy_public_key">复制公钥</string>
<string name="email_chooser">发送邮件…</string>
<string name="persistent_keepalive">连接保活</string>
<string name="turn_on_tunnel">此操作需要一个已建立的隧道</string>
<string name="tunnel_on_wifi">在不受信任的 WiFi 上建立隧道</string>
<string name="exclude">排除</string>
<string name="comma_separated_list">逗号分隔列表</string>
<string name="base64_key">Base64 编码</string>
<string name="use_kernel">使用内核模块</string>
<string name="endpoint">端点</string>
<string name="thank_you">谢谢您使用 WG Tunnel!</string>
<string name="prominent_background_location_message">此功能是在应用关闭时,后台自动扫描 Wi-Fi SSID,需要开启后台位置信息访问权限。更多信息,请在支持页面查看隐私政策。</string>
@@ -54,10 +48,8 @@
<string name="seconds"></string>
<string name="cancel">取消</string>
<string name="preshared_key">预共享密钥</string>
<string name="error_authentication_failed">身份验证失败</string>
<string name="unknown_error">发生了未知错误</string>
<string name="error_ssid_exists">SSID 已经存在</string>
<string name="open_file">打开文件</string>
<string name="config_changes_saved">设置已保存。</string>
<string name="interface_">接口</string>
<string name="email_subject">WG Tunnel 支持</string>
@@ -70,20 +62,14 @@
<string name="no_email_detected">未安装邮件应用</string>
<string name="enable_app_lock">锁定应用</string>
<string name="use_tunnel_on_wifi_name">在指定的 WiFi 上使用此隧道</string>
<string name="version">版本</string>
<string name="settings">设置</string>
<string name="support">支持</string>
<string name="kernel">内核</string>
<string name="junk_packet_minimum_size">无效包最小值</string>
<string name="root_accepted">已获取 root 权限</string>
<string name="default_ping_ip">(可选,默认选择节点)</string>
<string name="set_custom_ping_internal">Ping 间隔(秒)</string>
<string name="optional_default">"可选,默认: "</string>
<string name="set_custom_ping_cooldown">Ping 重启间隔(秒)</string>
<string name="show_amnezia_properties">显示 Amnezia 属性</string>
<string name="no_browser_detected">没有安装浏览器</string>
<string name="incorrect_pin">密码不正确</string>
<string name="set_custom_ping_ip">自定义 Ping 的目标 ip</string>
<string name="junk_packet_count">无效包计数</string>
<string name="app_name">WG Tunnel</string>
<string name="vpn_channel_name">VPN 通知频道</string>
@@ -91,8 +77,8 @@
<string name="read_logs">查看日志</string>
<string name="auto">(自动)</string>
<string name="pin_created">创建密码成功</string>
<string name="enter_pin">输入</string>
<string name="create_pin">创建</string>
<string name="enter_pin">输入 PIN </string>
<string name="create_pin">创建 PIN </string>
<string name="set_primary_tunnel">设置为主隧道</string>
<string name="mobile_data_tunnel">允许使用数据流量</string>
<string name="init_packet_junk_size">初始化无效包大小</string>
@@ -100,26 +86,21 @@
<string name="response_packet_magic_header">响应包的 magic header</string>
<string name="response_packet_junk_size">无效的响应包大小</string>
<string name="vpn_denied_dialog_title">拒绝访问</string>
<string name="app_settings">应用设置</string>
<string name="background_location_message2">请确保这些权限已开启</string>
<string name="logs">日志</string>
<string name="restart_on_ping">Ping 失败之后自动重启隧道(beta)</string>
<string name="edit_tunnel">编辑隧道</string>
<string name="init_packet_magic_header">初始化数据包的 magic header</string>
<string name="error_file_format">无效的隧道配置文件格式</string>
<string name="always_on_message">VPN 连接被拒绝,请检查</string>
<string name="vpn_settings">系统 VPN 设置</string>
<string name="always_on_message2">确保始终开启 VPN 功能已关闭,然后再尝试连接</string>
<string name="never">从不</string>
<string name="sec"></string>
<string name="handshake">已握手</string>
<string name="handshake">握手</string>
<string name="light">亮色</string>
<string name="dark">暗色</string>
<string name="trusted_wifi_names">可信 WiFi SSID</string>
<string name="prominent_background_location_title">后台定位披露</string>
<string name="dynamic">动态颜色</string>
<string name="display_theme">主题</string>
<string name="kill_switch">系统 VPN 设置</string>
<string name="appearance">外观</string>
<string name="notifications">通知</string>
<string name="automatic">跟随系统</string>
@@ -131,7 +112,6 @@
<string name="transport_packet_magic_header">传输包的 magic header</string>
<string name="underload_packet_magic_header">欠载数据包 magic header</string>
<string name="restart_at_boot">开机时重新启动</string>
<string name="background_location_message">需要允许所有时间位置权限和/或精确位置才能使用此功能。请参阅</string>
<string name="learn_more">了解更多</string>
<string name="unsure_how">如果您不确定如何进行</string>
<string name="see_the">请查阅</string>
@@ -140,9 +120,7 @@
<string name="launch_app_settings">打开应用设置</string>
<string name="use_wildcards">使用 SSID 通配符</string>
<string name="wildcards_active">启用通配符</string>
<string name="wifi_name_via_shell">通过 shell 获取 WiFi 名称</string>
<string name="use_root_shell_for_wifi">使用 root 权限的 shell 来获取 WiFi 名称</string>
<string name="kernel_not_supported">内核不支持</string>
<string name="use_root_shell_for_wifi">使用 root 权限的 shell 获取 WiFi 信息,以防需要位置权限</string>
<string name="start_auto">开启自动隧道</string>
<string name="monitoring_state_changes">监控状态变化</string>
<string name="stop_auto">停止自动隧道</string>
@@ -177,20 +155,13 @@
<string name="ethernet_tunnel">以太网隧道</string>
<string name="set_ethernet_tunnel">设置为以太网隧道</string>
<string name="native_kill_switch">系统 VPN 开关</string>
<string name="vpn_kill_switch">VPN 开关</string>
<string name="kill_switch_options">开关选项</string>
<string name="allow_lan_traffic">允许局域网流量</string>
<string name="vpn_channel_description">VPN 状态通知频道</string>
<string name="kill_switch_off">在受信任网络上停止 Kill Switch</string>
<string name="prefer_ipv4">首选 IPv4 连接</string>
<string name="multiple">多个</string>
<string name="server_ipv4">IPv4 主机名解析</string>
<string name="auth_error">未授权错误</string>
<string name="status">状态</string>
<string name="bio_not_created">生物特征未创建</string>
<string name="auth_error">未授权</string>
<string name="export_failed">导出失败了</string>
<string name="delete">删除</string>
<string name="dns_resolve_error">dns 解析出错</string>
<string name="dns_resolve_error">DNS 解析失败</string>
<string name="dropdown">下拉</string>
<string name="camera_permission_required">需要相机权限</string>
<string name="join_telegram">加入 Telegram 社区</string>
@@ -204,18 +175,14 @@
<string name="add_tunnel">添加隧道</string>
<string name="delete_logs">删除并清除日志</string>
<string name="copy">复制</string>
<string name="info">信息</string>
<string name="export_tunnels_amnezia">将隧道导出为 Amnezia</string>
<string name="export_tunnels_wireguard">将隧道导出为 WireGuard</string>
<string name="tunnel_error_template">隧道失败,原因:%1$s</string>
<string name="remote_key_template">Key: %1$s</string>
<string name="config_error">配置错误</string>
<string name="config_error">无效配置</string>
<string name="kernel_name_error">内核模块名称错误</string>
<string name="service_running_error">服务未运行错误</string>
<string name="service_running_error">服务未运行</string>
<string name="active">活跃</string>
<string name="bio_auth_title">生物特征认证</string>
<string name="invalid_config_error">无效配置</string>
<string name="bio_update_required">需要生物特征安全更新</string>
<string name="tunnel_starting">隧道启动中</string>
<string name="enable_remote_app_control">开启远程应用控制</string>
<string name="join_matrix">加入 Matrix 社区</string>
@@ -223,12 +190,9 @@
<string name="app_permission_description">控制隧道和自动隧道功能.</string>
<string name="app_permission_title">WG 隧道控制桥</string>
<string name="inactive">不活跃</string>
<string name="bio_subtitle">使用你的生物特征凭据登录</string>
<string name="export_logs">导出已保存的日志</string>
<string name="bio_not_supported">生物特征不受支持</string>
<string name="nothing_here_yet">此处还什么都没有!</string>
<string name="select_all">全选</string>
<string name="share">分享</string>
<string name="version_template">当前版本:%1$s</string>
<string name="export_success">导出成功</string>
<string name="download">下载</string>
@@ -252,4 +216,126 @@
<string name="amnezia">Amnezia</string>
<string name="wireguard">WireGuard</string>
<string name="done">完成</string>
<string name="current_template">当前:%1$s</string>
<string name="wifi_detection_method">Wi-Fi 检测方式</string>
<string name="_default">默认</string>
<string name="legacy">旧式</string>
<string name="root">Root</string>
<string name="shizuku">Shizuku</string>
<string name="legacy_api_description">用 Android 12 废弃的 Wi-Fi 信息获取方法,此方法限制位置查询,但可能不会在新设备上可靠工作</string>
<string name="use_shell_via_shizuku">通过 Shizuku 使用 Shell 来获得 Wi-Fi 信息,防止在非 root 设备上需要获得位置权限</string>
<string name="use_android_recommended">基于 Android 版本,使用系统推荐的获取 Wi-Fi 信息的方法</string>
<string name="release_notes">发行日志</string>
<string name="shizuku_not_detected">未检测到 Shizuku</string>
<string name="sort">排序</string>
<string name="drag_handle">拖动手柄</string>
<string name="move_up">上移</string>
<string name="move_down">下移</string>
<string name="error_tunnel_name">内核模式下隧道名称长度最多 15 个字符</string>
<string name="tunnel">隧道</string>
<string name="tunnel_item_description">%1$s, %2$s, %3$s</string>
<string name="warning">警告</string>
<string name="location_permissions">位置权限</string>
<string name="location_justification">为了用当前检测方法在后台读取 Wi-Fi 名称,Android 要求应用被给予“始终允许”和“精确定位”(在较老设备上叫“后台位置”)权限。请在系统的应用设置中启用这些权限。</string>
<string name="open_settings">打开设置</string>
<string name="location_permissions_missing">缺少定位权限</string>
<string name="fix">修复</string>
<string name="start">启动</string>
<string name="auto_tunnel_running">自动隧道运行中</string>
<string name="auto_tunnel_not_running">自动隧道未运行</string>
<string name="pinger_bounce_successful">pinger 成功重启了隧道。</string>
<string name="pinger_bounce_recovery">Pinger 重启失败。用旧地址恢复了隧道。</string>
<string name="bounce_failed_template">Pinger 未能恢复隧道,错误:%1$s</string>
<string name="tunnel_monitoring">隧道监控</string>
<string name="set_custom_ping_target">自定义 ping 目标(可选)</string>
<string name="ip_or_hostname">IP 或主机名</string>
<string name="ping_target_description">如内部 IP 不可用(比如使用不分流的配置)会使用这个。留空则默认使用 Cloudflare。</string>
<string name="tunnel_ping_interval">隧道 ping 操作间隔</string>
<string name="attempts_per_interval">每一间隔的 Ping 次数</string>
<string name="ping_timeout">隧道 ping 超时</string>
<string name="timeout_all_attempts">所有 ping 尝试的总超时</string>
<string name="display_detailed_ping_stats">展示详细的 ping 数据</string>
<string name="monitoring_ping">启用隧道 ping 监控</string>
<string name="rx_template">已接受:%1$s MB</string>
<string name="tx_template">已传输:%1$s MB</string>
<string name="reachable_template">可抵达:%1$s</string>
<string name="ping_success_template">上次成功的 ping 操作:%1$s</string>
<string name="sec_ago_template">%1$s 秒前</string>
<string name="latency_template">延迟:%1$s</string>
<string name="jitter_template">抖动:%1$s</string>
<string name="packets_sent_template">已发送数据包:%1$s</string>
<string name="packet_loss_template">丢失数据包:%.2f%%</string>
<string name="ping_target_template">Ping 目标:%1$s</string>
<string name="_true">True</string>
<string name="_false">False</string>
<string name="backup_success">成功备份:%1$s</string>
<string name="restore_success">成功恢复:%1$s</string>
<string name="restarting_app">正重启应用来应用更改…</string>
<string name="restore_failed">未能从备份恢复。</string>
<string name="backup_failed">创建备份失败。</string>
<string name="backup_application">备份应用数据</string>
<string name="restore_application">从备份恢复</string>
<string name="expiremental_template">%1$s (实验性)</string>
<string name="root_required_template">%1$s (需 root</string>
<string name="recommended_template">%1$s (推荐)</string>
<string name="hint_template">%1$s</string>
<string name="proxy">代理</string>
<string name="backend_mode">应用模式</string>
<string name="selected">选中的</string>
<string name="socks_5_proxy">SOCKS5 代理</string>
<string name="http_proxy">HTTP 代理</string>
<string name="username">用户名</string>
<string name="password">密码</string>
<string name="proxy_credentials">代理凭证</string>
<string name="proxy_settings">代理设置</string>
<string name="vpn">VPN</string>
<string name="android_integrations">Android 集成</string>
<string name="show_password">显示密码</string>
<string name="socks_5_bind_address">SOCKS5 绑定地址</string>
<string name="http_bind_address">HTTP 绑定地址</string>
<string name="defaults_to_template">(默认为 %1$s</string>
<string name="dns_settings">DNS 设置</string>
<string name="locked_down">锁定</string>
<string name="dns_provider">DNS 提供商</string>
<string name="dns_protocol">DNS 协议</string>
<string name="system">系统</string>
<string name="doh">DNS over HTTPS (DoH)</string>
<string name="comma_separated">英文逗号分隔</string>
<string name="server_port">服务器:端口</string>
<string name="new_tunnel">新隧道</string>
<string name="system_features">系统特性</string>
<string name="read_failed">读取数据失败。</string>
<string name="invalid_key">无效密钥</string>
<string name="invalid_number">无效数字</string>
<string name="invalid_value">无效值</string>
<string name="missing_attribute">缺少属性</string>
<string name="missing_section">缺少部分</string>
<string name="syntax_error">语法错误</string>
<string name="unknown_attribute">未知属性</string>
<string name="unknown_section">未知部分</string>
<string name="config_error_template">错误的配置。位置:%2$s 处的 %1$s。</string>
<string name="ports_must_differ">失败了。代理必须有不同的端口。</string>
<string name="password_no_spaces">密码不能有空格。</string>
<string name="tunnel_name_taken">已经有同名隧道。</string>
<string name="range_hint">%1$d%2$d</string>
<string name="mimic_quic">模拟 QUIC</string>
<string name="mimic_dns">模拟 DNS</string>
<string name="mimic_sip">模拟 SIP</string>
<string name="active_tunnel_update_failed">激活隧道更新失败了</string>
<string name="ddns_auto_update">动态 DNS 自动更新</string>
<string name="ddns_auto_update_description">DDNS 更改时自动更新 IP</string>
<string name="prefer_ipv6_resolution">偏好 IPv6 对端解析</string>
<string name="disabled">已停用</string>
<string name="mode_disabled_template">功能在 %1$s 模式下不可用。</string>
<string name="lockdown">锁定</string>
<string name="donate_title">捐赠</string>
<string name="crypto">加密货币地址</string>
<string name="github_sponsors">GitHub Sponsors</string>
<string name="liberapay">Liberapay</string>
<string name="kofi">Ko-fi</string>
<string name="donation_thanks_intro">感谢您考虑向本项目捐款!</string>
<string name="donation_dev_message">作为唯一开发者,我不知疲倦地让 WG Tunnel 成为 Android 上最佳的自由开源 WireGuard 客户端,但没有您的支持这无法实现。</string>
<string name="donation_closing">我的梦想是为您全职开发本项目。</string>
<string name="donation_signoff">再次感谢,</string>
<string name="google_donation_message">不幸的是,由于 Google 的政策,本应用的 Play Store 版本不允许出现捐赠链接。请浏览本项目网页寻找捐赠地址。</string>
</resources>
+74 -33
View File
@@ -1,22 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<?xml version='1.0' encoding='utf-8'?>
<resources>
<string name="sec"></string>
<string name="error_file_extension">檔案類型不是 .conf 或 .zip</string>
<string name="language">語言</string>
<string name="interface_">界面</string>
<string name="launch_app_settings">打開應用程式設定</string>
<string name="use_kernel">使用核心模組</string>
<string name="version">版本</string>
<string name="app_name">WG Tunnel</string>
<string name="name">名稱</string>
<string name="public_key">公鑰</string>
<string name="privacy_policy">查看隱私政策</string>
<string name="tunnels">隧道清單</string>
<string name="thank_you">感謝您使用 WG Tunnel</string>
<string name="open_file">開啟檔案</string>
<string name="mtu">MTU</string>
<string name="okay">確認</string>
<string name="qr_scan">掃描 QR code</string>
<string name="dns_servers">DNS 伺服器</string>
<string name="tunnel_name">隧道名稱</string>
<string name="config_changes_saved">組態變更已儲存。</string>
@@ -56,8 +51,6 @@
<string name="settings">設定</string>
<string name="restart_at_boot">開機時重新啟動</string>
<string name="junk_packet_count">垃圾封包數</string>
<string name="set_custom_ping_internal">Ping 間隔 (秒)</string>
<string name="app_settings">應用程式設定</string>
<string name="logs">日誌</string>
<string name="dark">灰色</string>
<string name="light">亮色</string>
@@ -66,7 +59,6 @@
<string name="display_theme">主題</string>
<string name="primary_tunnel">主要隧道</string>
<string name="learn_more">了解更多</string>
<string name="kernel_not_supported">核心不支援</string>
<string name="notifications">通知</string>
<string name="dynamic">動態</string>
<string name="never">從不</string>
@@ -81,7 +73,6 @@
<string name="exclude_lan">排除 LAN</string>
<string name="include_lan">包含 LAN</string>
<string name="unknown_error">發生未知錯誤</string>
<string name="error_file_format">無效的隧道組態檔案格式</string>
<string name="endpoint">終端點</string>
<string name="location_services_not_detected">未啟用定位服務</string>
<string name="junk_packet_maximum_size">垃圾封包最大值</string>
@@ -105,34 +96,27 @@
<string name="add_from_url">從 URL 新增</string>
<string name="join_matrix">加入 Matrix 社群</string>
<string name="copy">複製</string>
<string name="base64_key">base64 格式</string>
<string name="base64_key">Base64 格式</string>
<string name="persistent_keepalive">保持連線</string>
<string name="email_subject">WG Tunnel 支援</string>
<string name="all">全部</string>
<string name="server_ipv4">IPv4 主機名稱解析</string>
<string name="search">搜尋</string>
<string name="save">儲存</string>
<string name="prefer_ipv4">偏好 IPv4 連線</string>
<string name="select">選擇</string>
<string name="info">資訊</string>
<string name="delete">刪除</string>
<string name="export_failed">匯出失敗</string>
<string name="add_tunnel">新增隧道</string>
<string name="camera_permission_required">需要相機權限</string>
<string name="status">狀態</string>
<string name="dns_resolve_error">dns 解析錯誤</string>
<string name="dns_resolve_error">DNS 解析失敗</string>
<string name="kernel_name_error">核心模組名稱錯誤</string>
<string name="nothing_here_yet">這裡目前還沒有任何東西!</string>
<string name="remove_amnezia_compatibility">移除 Amnezia 相容性</string>
<string name="enable_amnezia_compatibility">啟用 Amnezia 相容性</string>
<string name="comma_separated_list">以逗號分隔的清單</string>
<string name="show_amnezia_properties">顯示 Amnezia 屬性</string>
<string name="background_location_message2">請確保啟用了這些權限</string>
<string name="set_custom_ping_ip">自訂 ping 目標 IP</string>
<string name="hide_amnezia_properties">隱藏 Amnezia 屬性</string>
<string name="active">使用中</string>
<string name="vpn_denied_dialog_title">拒絕存取</string>
<string name="always_on_message">VPN 連線所需權限被拒絕,請檢查</string>
<string name="always_on_message">VPN 連線被拒絕,請檢查</string>
<string name="wildcards_active">啟用萬用字元</string>
<string name="multiple">多個</string>
<string name="export_tunnels_amnezia">將隧道匯出為 Amnezia</string>
@@ -140,12 +124,10 @@
<string name="wifi_name_template">使用中: %1$s</string>
<string name="inactive">未使用</string>
<string name="trusted_wifi_names">信任的 WiFi SSID</string>
<string name="set_custom_ping_cooldown">Ping 重新開始冷卻時間 (秒)</string>
<string name="auto_tunnel">自動隧道管理</string>
<string name="auto_tunnel_title">自動隧道管理服務</string>
<string name="restart_on_ping">Ping 失敗後重新啟動隧道 (beta)</string>
<string name="select_all">全選</string>
<string name="share">分享</string>
<string name="start_auto">開始自動隧道管理</string>
<string name="auto_tunneling">自動隧道管理</string>
<string name="stop_auto">停止自動隧道管理</string>
@@ -154,7 +136,7 @@
<string name="export_logs">匯出已儲存的日誌</string>
<string name="delete_logs">刪除並清理日誌</string>
<string name="monitoring_state_changes">監控狀態變化</string>
<string name="use_root_shell_for_wifi">透過 root 權限取得 WiFi SSID</string>
<string name="use_root_shell_for_wifi">透過 root 權限取得 Wi-Fi 資訊,避免需要位置存取權</string>
<string name="splt_tunneling">隧道拆分</string>
<string name="tunnel_specific_settings">隧道個別設定</string>
<string name="use_wildcards">SSID 使用萬用字元</string>
@@ -177,9 +159,7 @@
<string name="update_check_unsupported">更新檢查不支援此建置類型。</string>
<string name="darker">黑色</string>
<string name="preshared_key">預分享金鑰</string>
<string name="error_authentication_failed">驗證失敗</string>
<string name="transport_packet_magic_header">傳輸封包魔法標頭</string>
<string name="default_ping_ip">(可選,預設選擇端點)</string>
<string name="tunnel_running">隧道運作中</string>
<string name="hide_scripts">隱藏指令碼</string>
<string name="underload_packet_magic_header">負載封包魔法標頭</string>
@@ -191,23 +171,18 @@
<string name="init_packet_junk_size">初始封包垃圾大小</string>
<string name="response_packet_junk_size">回應封包垃圾大小</string>
<string name="auto_tunnel_channel_description">自動隧道管理服務狀態通知頻道</string>
<string name="prominent_background_location_message">此功能需要背景位置權以啟用即使應用程式關閉也會持續執行的 Wi-Fi SSID 自動掃描。如果想知道更多資訊,請參閱支援頁面的隱私政策。</string>
<string name="prominent_background_location_message">此功能需要背景位置存取權以啟用即使應用程式關閉也會持續執行的 Wi-Fi SSID 自動掃描。如果想知道更多資訊,請參閱支援頁面的隱私政策。</string>
<string name="tunnel_starting">隧道正在啟動</string>
<string name="error_authorization_failed">授權失敗</string>
<string name="vpn_channel_name">VPN 通知頻道</string>
<string name="peer">端點</string>
<string name="turn_off_tunnel">此操作需要關閉隧道</string>
<string name="turn_on_tunnel">此操作需要一個已建立的隧道</string>
<string name="rotate_keys">輪換金鑰</string>
<string name="add_peer">新增端點</string>
<string name="init_packet_magic_header">初始封包魔法標頭</string>
<string name="response_packet_magic_header">回應封包魔法標頭</string>
<string name="background_location_message">此功能需要任何時間都被允許使用位置權限或者精確位置。請參閱</string>
<string name="always_on_message2">確保 永久連線的 VPN 已經關閉並再試一次</string>
<string name="enter_config_url">輸入組態 URL</string>
<string name="error_download_failed">下載組態失敗</string>
<string name="config_error">組態錯誤</string>
<string name="invalid_config_error">組態無效</string>
<string name="config_error">無效組態</string>
<string name="remote_key_template">金鑰: %1$s</string>
<string name="flavor_template">風格: %1$s</string>
<string name="security_template">安全性: %1$s</string>
@@ -215,9 +190,75 @@
<string name="wireguard">WireGuard</string>
<string name="done">完成</string>
<string name="show_qr">顯示 QR code</string>
<string name="optional_default">"可選,預設: "</string>
<string name="pre_up">啟動前</string>
<string name="post_up">啟動後</string>
<string name="pre_down">關閉前</string>
<string name="post_down">關閉後</string>
<string name="wifi_detection_method">Wi-Fi 檢測方法</string>
<string name="release_notes">發行說明</string>
<string name="shizuku">Shizuku</string>
<string name="root">Root</string>
<string name="_default">預設</string>
<string name="shizuku_not_detected">偵測不到 Shizuku</string>
<string name="legacy">舊版</string>
<string name="use_android_recommended">使用基於 Android 版本而不同的推薦方法取得 Wi-Fi 資訊</string>
<string name="legacy_api_description">使用一種 Android 12 已棄用的方法取得 Wi-Fi 資訊,此方法會限制位置查詢,但可能不會在新裝置上起作用</string>
<string name="use_shell_via_shizuku">透過 Shizuku 使用 shell 取得 Wi-Fi 資訊,避免在沒有 root 的裝置上需要位置存取權</string>
<string name="current_template">目前: %1$s</string>
<string name="service_running_error">服務未執行</string>
<string name="sort">排序</string>
<string name="latency_template">延遲: %1$s</string>
<string name="jitter_template">抖動: %1$s</string>
<string name="tx_template">已傳輸: %1$s MB</string>
<string name="rx_template">已接收: %1$s MB</string>
<string name="warning">警告</string>
<string name="ip_or_hostname">IP 或主機名稱</string>
<string name="sec_ago_template">%1$s 秒前</string>
<string name="restarting_app">正在重啟應用程式以應用變更…</string>
<string name="packets_sent_template">已發送封包: %1$s</string>
<string name="packet_loss_template">丟失封包: %.2f%%</string>
<string name="restore_application">從備份還原</string>
<string name="restore_success">復原成功。 %1$s</string>
<string name="backup_success">備份成功。%1$s</string>
<string name="backup_application">備份應用程式資料</string>
<string name="restore_failed">還原備份失敗。</string>
<string name="backup_failed">建立備份失敗。</string>
<string name="set_custom_ping_target">自訂 ping 目標 (可選)</string>
<string name="ping_success_template">上次 ping 成功: %1$s</string>
<string name="display_detailed_ping_stats">顯示詳細的 ping 統計資訊</string>
<string name="fix">修復</string>
<string name="tunnel_item_description">1$s, %2$s, %3$s</string>
<string name="start">啟動</string>
<string name="tunnel">隧道</string>
<string name="location_permissions">位置存取權</string>
<string name="open_settings">開啟設定</string>
<string name="auto_tunnel_running">自動隧道管理正在執行</string>
<string name="auto_tunnel_not_running">自動隧道管理未執行</string>
<string name="_true">True</string>
<string name="_false">False</string>
<string name="ping_target_template">Ping 目標: %1$s</string>
<string name="reachable_template">可抵達: %1$s</string>
<string name="tunnel_monitoring">隧道監控</string>
<string name="monitoring_ping">啟用隧道 ping 監控</string>
<string name="ping_timeout">隧道 ping 逾時</string>
<string name="tunnel_ping_interval">隧道 ping 間隔</string>
<string name="attempts_per_interval">每一間隔的 ping 嘗試次數</string>
<string name="error_tunnel_name">核心模式下隧道名稱最長 15 個字元</string>
<string name="location_permissions_missing">缺少位置存取權</string>
<string name="move_up">向上移動</string>
<string name="move_down">向下移動</string>
<string name="trusted_ssid_value_description">提交 SSID</string>
<string name="timeout_all_attempts">所有嘗試的總逾時值</string>
<string name="ping_target_description">如果內部 IP 不可用才會使用 (例如: full-tunnel 組態)。留空預設為 Cloudflare。</string>
<string name="drag_handle">拖曳操作</string>
<string name="tunnel_mobile_data">行動數據上的隧道</string>
<string name="tunnel_on_ethernet">乙太網路上的隧道</string>
<string name="prominent_background_location_title">背景定位披露</string>
<string name="tunnel_on_wifi">不受信任 Wi-Fi 上的隧道</string>
<string name="mobile_data_tunnel">設為行動數據隧道</string>
<string name="use_tunnel_on_wifi_name">在指定 Wi-Fi 名稱上使用隧道</string>
<string name="mobile_tunnel">行動數據隧道</string>
<string name="skip">略過</string>
<string name="ethernet_tunnel">乙太網路隧道</string>
<string name="set_ethernet_tunnel">設為乙太網路隧道</string>
</resources>

Some files were not shown because too many files have changed in this diff Show More