Compare commits

..

15 Commits

Author SHA1 Message Date
Zane Schepke 4d64d058de chore: bump version with notes 2025-04-11 21:19:11 -04:00
Weblate (bot) 7e9687aeb9 feat(lang): Translations update from Hosted Weblate (#671)
Co-authored-by: Matthaiks <kitynska@gmail.com>
Co-authored-by: Languages add-on <noreply-addon-languages@weblate.org>
Co-authored-by: solokot <solokot@gmail.com>
Co-authored-by: Kachelkaiser <kachelkaiser@htpst.de>
Co-authored-by: ssantos <ssantos@web.de>
Co-authored-by: 大王叫我来巡山 <hamburger2048@users.noreply.hosted.weblate.org>
2025-04-11 21:16:41 -04:00
Zane Schepke a6e559ecec fix: logger toggle bug
closes #669
2025-04-11 21:06:47 -04:00
Zane Schepke c6bacf8e15 style: latest logo 2025-04-11 20:03:32 -04:00
Zane Schepke fdfc348e76 fix: kill switch launch on start
closes #686
2025-04-11 19:07:36 -04:00
Zane Schepke 77b83ea569 fix: AndroidTV language selection ui bug
fix: AndroidTV restart on boot

closes #673
closes #606
2025-04-11 18:42:11 -04:00
Zane Schepke 5ded556647 fix: ping job start by default
fix: kernel dns resolution on stop bug

closes #674
2025-04-11 17:54:40 -04:00
Zane Schepke b62e592ee9 chore: bump deps 2025-04-11 04:51:06 -04:00
dependabot[bot] 869e1ebf0d chore(deps): bump com.google.devtools.ksp from 2.1.20-1.0.32 to 2.1.20-2.0.0 (#677)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-04-11 04:50:04 -04:00
dependabot[bot] 352eae0b28 chore(deps): bump actions/checkout from 3 to 4 (#675)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-04-11 04:49:08 -04:00
dependabot[bot] 7cb91ecd94 chore(deps): bump androidx.compose.material3:material3 from 1.3.1 to 1.3.2 (#682)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-04-11 04:47:54 -04:00
dependabot[bot] 3291bb0718 chore(deps): bump roomVersion from 2.6.1 to 2.7.0 (#681)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-04-11 04:47:09 -04:00
Zane Schepke ce3f0b85c1 fix: toggle resolution issue
#669
2025-04-11 04:29:03 -04:00
Zane Schepke f9768fc9f0 chore: update license 2025-04-11 02:36:17 -04:00
Zane Schepke 64db37648a style: new app icon 2025-04-11 01:29:21 -04:00
128 changed files with 803 additions and 562 deletions
+1 -1
View File
@@ -43,7 +43,7 @@ jobs:
steps:
- name: Checkout Repository
uses: actions/checkout@v3
uses: actions/checkout@v4
with:
fetch-depth: 0 # This fetches all history so we can check commits
+1 -1
View File
@@ -1,6 +1,6 @@
MIT License
Copyright (c) 2023 WG Auto Tunnel
Copyright © 2023-2025 Zane Schepke
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
+3 -3
View File
@@ -53,7 +53,7 @@
<application
android:name=".WireGuardAutoTunnel"
android:allowBackup="false"
android:banner="@drawable/ic_banner"
android:banner="@mipmap/ic_banner"
android:dataExtractionRules="@xml/data_extraction_rules"
android:enableOnBackInvokedCallback="true"
android:fullBackupContent="@xml/backup_rules"
@@ -114,7 +114,7 @@
<service
android:name=".core.service.tile.TunnelControlTile"
android:exported="true"
android:icon="@drawable/ic_launcher"
android:icon="@drawable/ic_notification"
android:label="@string/tunnel_control"
android:permission="android.permission.BIND_QUICK_SETTINGS_TILE">
<meta-data
@@ -131,7 +131,7 @@
<service
android:name=".core.service.tile.AutoTunnelControlTile"
android:exported="true"
android:icon="@drawable/ic_launcher"
android:icon="@drawable/ic_notification"
android:label="@string/auto_tunnel"
android:permission="android.permission.BIND_QUICK_SETTINGS_TILE">
<meta-data
Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 21 KiB

@@ -84,8 +84,8 @@ import com.zaneschepke.wireguardautotunnel.ui.screens.settings.appearance.displa
import com.zaneschepke.wireguardautotunnel.ui.screens.settings.appearance.language.LanguageScreen
import com.zaneschepke.wireguardautotunnel.ui.screens.settings.disclosure.LocationDisclosureScreen
import com.zaneschepke.wireguardautotunnel.ui.screens.settings.killswitch.KillSwitchScreen
import com.zaneschepke.wireguardautotunnel.ui.screens.settings.logs.LogsScreen
import com.zaneschepke.wireguardautotunnel.ui.screens.support.SupportScreen
import com.zaneschepke.wireguardautotunnel.ui.screens.support.logs.LogsScreen
import com.zaneschepke.wireguardautotunnel.ui.theme.WireguardAutoTunnelTheme
import com.zaneschepke.wireguardautotunnel.util.extensions.goFromRoot
import com.zaneschepke.wireguardautotunnel.viewmodel.AppViewModel
@@ -80,9 +80,6 @@ class WireGuardAutoTunnel : Application(), Configuration.Provider {
ServiceWorker.start(this)
applicationScope.launch {
if (!appDataRepository.settings.get().isKernelEnabled) {
tunnelManager.setBackendState(BackendState.SERVICE_ACTIVE, emptyList())
}
appDataRepository.appState.getLocale()?.let {
withContext(mainDispatcher) { LocaleUtil.changeLocale(it) }
}
@@ -94,7 +91,7 @@ class WireGuardAutoTunnel : Application(), Configuration.Provider {
override fun onTerminate() {
applicationScope.launch {
tunnelManager.setBackendState(BackendState.SERVICE_ACTIVE, emptyList())
tunnelManager.setBackendState(BackendState.INACTIVE, emptyList())
}
super.onTerminate()
}
@@ -60,7 +60,7 @@ class WireGuardNotification @Inject constructor(@ApplicationContext override val
setOngoing(onGoing)
setPriority(NotificationCompat.PRIORITY_HIGH)
setShowWhen(showTimestamp)
setSmallIcon(R.drawable.ic_launcher)
setSmallIcon(R.drawable.ic_notification)
}
.build()
}
@@ -102,7 +102,7 @@ class WireGuardNotification @Inject constructor(@ApplicationContext override val
PendingIntent.FLAG_IMMUTABLE,
)
return NotificationCompat.Action.Builder(
R.drawable.ic_launcher,
R.drawable.ic_notification,
notificationAction.title(context).uppercase(),
pendingIntent,
)
@@ -17,6 +17,7 @@ import com.zaneschepke.wireguardautotunnel.domain.entity.TunnelConf
import com.zaneschepke.wireguardautotunnel.domain.enums.NotificationAction
import com.zaneschepke.wireguardautotunnel.domain.enums.TunnelStatus
import com.zaneschepke.wireguardautotunnel.domain.repository.TunnelRepository
import com.zaneschepke.wireguardautotunnel.domain.state.TunnelState
import com.zaneschepke.wireguardautotunnel.util.Constants
import com.zaneschepke.wireguardautotunnel.util.extensions.distinctByKeys
import dagger.hilt.android.AndroidEntryPoint
@@ -36,6 +37,8 @@ import kotlinx.coroutines.flow.flowOn
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.isActive
import kotlinx.coroutines.launch
import kotlinx.coroutines.sync.Mutex
import kotlinx.coroutines.sync.withLock
import kotlinx.coroutines.withContext
import timber.log.Timber
@@ -57,6 +60,9 @@ class TunnelForegroundService : LifecycleService() {
private val isNetworkConnected = MutableStateFlow(true)
private val tunnelJobs = ConcurrentHashMap<TunnelConf, Job>()
private val pingJobs = ConcurrentHashMap<TunnelConf, Job>()
private val jobsMutex = Mutex()
override fun onCreate() {
super.onCreate()
@@ -88,31 +94,85 @@ class TunnelForegroundService : LifecycleService() {
}
fun start() =
lifecycleScope.launch {
tunnelManager.activeTunnels.distinctByKeys().collect { tuns ->
if (tuns.isEmpty() && tunnelJobs.isEmpty()) return@collect
if (tuns.isEmpty() && tunnelJobs.isNotEmpty()) {
return@collect tunnelJobs.forEach { (key, _) ->
Timber.d("Stopping all tunnel jobs")
tunnelJobs[key]?.cancel()
tunnelJobs.remove(key)
}
}
val (jobsToStop, jobsToStart) = findMissingKeys(tuns, tunnelJobs)
if (jobsToStop.isEmpty() && jobsToStart.isEmpty()) return@collect
jobsToStop.forEach { tun ->
Timber.d("Stopping tunnel jobs for ${tun.tunName}")
tunnelJobs[tun]?.cancel()
tunnelJobs.remove(tun)
}
jobsToStart.forEach { tun ->
Timber.d("Starting tunnel jobs for ${tun.tunName}")
tunnelJobs += (tun to startTunnelJobs(tun))
}
lifecycleScope.launch(ioDispatcher) {
tunnelManager.activeTunnels.distinctByKeys().collect { activeTunnels ->
// No active tunnels and no jobs: nothing to do
if (activeTunnels.isEmpty() && tunnelJobs.isEmpty()) return@collect
// Synchronize jobs with active tunnels
synchronizeJobs(activeTunnels)
updateServiceNotification()
}
}
private suspend fun synchronizeJobs(activeTunnels: Map<TunnelConf, TunnelState>) {
jobsMutex.withLock {
// Stop jobs for tunnels that are no longer active
stopInactiveJobs(activeTunnels)
// Start jobs for new tunnels
startNewJobs(activeTunnels)
}
}
private fun stopInactiveJobs(activeTunnels: Map<TunnelConf, TunnelState>) {
// If no active tunnels, clear all jobs
if (activeTunnels.isEmpty()) {
clearAllJobs()
return
}
// Stop jobs for tunnels not in activeTunnels
val tunnelsToStop = tunnelJobs.keys - activeTunnels.keys
tunnelsToStop.forEach { tun -> stopTunnelJobs(tun) }
}
private fun clearAllJobs() {
tunnelJobs.forEach { (tun, job) ->
Timber.d("Stopping tunnel job for ${tun.tunName}")
job.cancel()
}
tunnelJobs.clear()
pingJobs.forEach { (tun, job) ->
if (isPingBounce(tun)) {
Timber.d("Preserving ping job for ${tun.tunName} due to PING bounce")
return@forEach
}
Timber.d("Stopping ping job for ${tun.tunName}")
job.cancel()
}
pingJobs.entries.removeIf { (tun, _) -> !isPingBounce(tun) }
}
private fun stopTunnelJobs(tun: TunnelConf) {
tunnelJobs.remove(tun)?.cancel()
Timber.d("Stopped tunnel job for ${tun.tunName}")
if (isPingBounce(tun))
return Timber.d("Preserving ${tun.tunName} ping job due to ping bounce")
pingJobs.remove(tun)?.cancel()
Timber.d("Stopped ping job for ${tun.tunName}")
}
private fun startNewJobs(activeTunnels: Map<TunnelConf, TunnelState>) {
val tunnelsToStart = activeTunnels.keys - tunnelJobs.keys
tunnelsToStart.forEach { tun ->
tunnelJobs[tun] = startTunnelJobs(tun)
Timber.d("Started tunnel job for ${tun.tunName}")
if (pingJobs[tun]?.isActive == true) {
Timber.d("Reusing active ping job for ${tun.tunName}")
} else {
pingJobs[tun]?.cancel() // Cancel any stale job
if (tun.isPingEnabled) {
pingJobs[tun] = startPingJob(tun)
Timber.d("Started ping job for ${tun.tunName}")
}
}
}
}
private fun isPingBounce(tun: TunnelConf): Boolean =
tunnelManager.bouncingTunnelIds[tun.id] == TunnelStatus.StopReason.PING
// TODO Would be cool to have this include kill switch
// TODO also we need to include errors
private fun updateServiceNotification() {
@@ -132,26 +192,15 @@ class TunnelForegroundService : LifecycleService() {
// use same scope so we can cancel all of these
private fun startTunnelJobs(tunnelConf: TunnelConf) =
lifecycleScope.launch {
lifecycleScope.launch(ioDispatcher) {
// monitor if we have internet connectivity
launch { startNetworkMonitorJob() }
// job to trigger stats emit on interval
launch { startTunnelStatsJob(tunnelConf) }
// monitor changes to the tunnel config
launch { startTunnelConfChangesJob(tunnelConf) }
// monitor tunnel ping
launch { startPingJob(tunnelConf) }
}
private fun findMissingKeys(
map1: Map<TunnelConf, Any>,
map2: Map<TunnelConf, Any>,
): Pair<Set<TunnelConf>, Set<TunnelConf>> {
val missingMap1 = map2.keys - map1.keys
val missingMap2 = map1.keys - map2.keys
return missingMap1 to missingMap2
}
private suspend fun startTunnelConfChangesJob(tunnelConf: TunnelConf) {
tunnelRepo.flow
.flowOn(ioDispatcher)
@@ -188,24 +237,25 @@ class TunnelForegroundService : LifecycleService() {
}
}
// TODO fix cooldown
private suspend fun startPingJob(tunnel: TunnelConf) = coroutineScope {
delay(PING_START_DELAY)
while (isActive) {
val shouldBounce = shouldBounceTunnel(tunnel)
val delayMs =
if (shouldBounce) {
// let this complete, even after cancel
withContext(NonCancellable) {
tunnelManager.bounceTunnel(tunnel, TunnelStatus.StopReason.PING)
private fun startPingJob(tunnel: TunnelConf) =
lifecycleScope.launch(ioDispatcher) {
// delay for initial duration
delay(tunnel.pingInterval ?: Constants.PING_INTERVAL)
while (isActive) {
val shouldBounce = shouldBounceTunnel(tunnel)
val delayMs =
if (shouldBounce) {
// let this complete, even after cancel
withContext(NonCancellable) {
tunnelManager.bounceTunnel(tunnel, TunnelStatus.StopReason.PING)
}
tunnel.pingCooldown ?: Constants.PING_COOLDOWN
} else {
tunnel.pingInterval ?: Constants.PING_INTERVAL
}
tunnel.pingCooldown ?: Constants.PING_COOLDOWN
} else {
tunnel.pingInterval ?: Constants.PING_INTERVAL
}
delay(delayMs)
delay(delayMs)
}
}
}
private suspend fun shouldBounceTunnel(tunnel: TunnelConf): Boolean {
if (!isNetworkConnected.value) {
@@ -263,10 +313,10 @@ class TunnelForegroundService : LifecycleService() {
// TODO add notification handling and optional log reading for restart on handshake failures
companion object {
const val STATS_DELAY = 1_000L
const val PING_START_DELAY = 30_000L
// ipv6 disabled or block on network
// const val userspaceStartFailed = "Failed to send handshake initiation: write udp [::]"
// const val ipv6Fails = "Failed to send data packets: write udp [::]"
// const val ipv4Fails = "Failed to send data packets: write udp 0.0.0.0:51820"
// Failed to send handshake initiation: write udp [::]"
// Failed to send data packets: write udp [::]
// Failed to send data packets: write udp 0.0.0.0:51820
// Handshake did not complete after 5 seconds, retrying
}
}
@@ -1,5 +1,6 @@
package com.zaneschepke.wireguardautotunnel.core.tunnel
import com.wireguard.android.backend.BackendException
import com.wireguard.android.backend.Tunnel
import com.zaneschepke.wireguardautotunnel.core.service.ServiceManager
import com.zaneschepke.wireguardautotunnel.di.ApplicationScope
@@ -10,10 +11,11 @@ import com.zaneschepke.wireguardautotunnel.domain.repository.AppDataRepository
import com.zaneschepke.wireguardautotunnel.domain.state.TunnelState
import com.zaneschepke.wireguardautotunnel.domain.state.TunnelStatistics
import com.zaneschepke.wireguardautotunnel.util.extensions.asTunnelState
import com.zaneschepke.wireguardautotunnel.util.extensions.toBackendError
import java.util.concurrent.ConcurrentHashMap
import java.util.concurrent.atomic.AtomicBoolean
import kotlin.concurrent.thread
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.flow.update
@@ -35,8 +37,9 @@ abstract class BaseTunnel(
private val tunMutex = Mutex()
private val tunStatusMutex = Mutex()
private val bounceTunnelMutex = Mutex()
private val isBouncing = AtomicBoolean(false)
override val bouncingTunnelIds = ConcurrentHashMap<Int, TunnelStatus.StopReason>()
abstract suspend fun startBackend(tunnel: TunnelConf)
@@ -98,7 +101,7 @@ abstract class BaseTunnel(
is org.amnezia.awg.backend.Tunnel.State ->
updateTunnelStatus(tunnelConf, state.asTunnelState())
}
handleServiceChangesOnStop()
handleServiceStateOnChange()
}
serviceManager.updateTunnelTile()
}
@@ -111,13 +114,10 @@ abstract class BaseTunnel(
override suspend fun startTunnel(tunnelConf: TunnelConf) {
if (activeTuns.exists(tunnelConf.id) || tunThreads.containsKey(tunnelConf.id)) return
// stop active tunnels if we are userspace
if (this@BaseTunnel is UserspaceTunnel) stopActiveTunnels()
tunMutex.withLock {
// use thread to interrupt java backend if stuck (like in dns resolution)
tunThreads +=
tunnelConf.id to
thread {
tunThreads[tunnelConf.id] = thread {
runCatching {
runBlocking {
try {
Timber.d("Starting tunnel ${tunnelConf.id}...")
@@ -127,23 +127,32 @@ abstract class BaseTunnel(
Timber.e(e, "Failed to start tunnel ${tunnelConf.name} userspace")
updateTunnelStatus(tunnelConf, TunnelStatus.Error(e))
} catch (e: InterruptedException) {
Timber.i(
Timber.w(
"Tunnel start has been interrupted as ${tunnelConf.name} failed to start"
)
}
}
}
.onFailure { Timber.w("Tunnel start has been interrupted") }
}
}
}
private suspend fun startTunnelInner(tunnelConf: TunnelConf) {
configureTunnelCallbacks(tunnelConf)
Timber.d("Started backend for tunnel ${tunnelConf.id}...")
startBackend(tunnelConf)
updateTunnelStatus(tunnelConf, TunnelStatus.Up)
Timber.d("DONE for tun ${tunnelConf.id}...")
saveTunnelActiveState(tunnelConf, true)
serviceManager.startTunnelForegroundService()
Timber.d("Starting backend for tunnel ${tunnelConf.id}...")
try {
startBackend(tunnelConf)
updateTunnelStatus(tunnelConf, TunnelStatus.Up)
Timber.d("Started for tun ${tunnelConf.id}...")
saveTunnelActiveState(tunnelConf, true)
serviceManager.startTunnelForegroundService()
} catch (e: BackendException) {
Timber.e(e, "Failed to start backend for ${tunnelConf.name}")
val backendError = e.toBackendError()
updateTunnelStatus(tunnelConf, TunnelStatus.Error(backendError))
throw backendError
}
}
private suspend fun saveTunnelActiveState(tunnelConf: TunnelConf, active: Boolean) {
@@ -173,9 +182,9 @@ abstract class BaseTunnel(
removeActiveTunnel(tunnel)
}
private suspend fun handleServiceChangesOnStop() {
if (activeTuns.value.isEmpty() && !isBouncing.get())
return serviceManager.stopTunnelForegroundService()
private suspend fun handleServiceStateOnChange() {
if (activeTuns.value.isEmpty() && bouncingTunnelIds.isEmpty())
serviceManager.stopTunnelForegroundService()
}
private suspend fun handleStuckStartingTunnelShutdown(tunnel: TunnelConf) {
@@ -205,11 +214,23 @@ abstract class BaseTunnel(
}
override suspend fun bounceTunnel(tunnelConf: TunnelConf, reason: TunnelStatus.StopReason) {
Timber.i("Bounce tunnel ${tunnelConf.name}")
isBouncing.set(true)
stopTunnel(tunnelConf, reason)
startTunnel(tunnelConf)
isBouncing.set(false)
bounceTunnelMutex.withLock {
Timber.i(
"Bounce tunnel ${tunnelConf.name} for reason: $reason, current bouncing: ${bouncingTunnelIds.size}"
)
bouncingTunnelIds[tunnelConf.id] = reason
try {
stopTunnel(tunnelConf, reason)
delay(300L)
startTunnel(tunnelConf)
} finally {
bouncingTunnelIds.remove(tunnelConf.id)
handleServiceStateOnChange()
Timber.d(
"Cleared bounce state for ${tunnelConf.name}, remaining: ${bouncingTunnelIds.size}"
)
}
}
}
override suspend fun runningTunnelNames(): Set<String> =
@@ -9,6 +9,7 @@ import com.zaneschepke.wireguardautotunnel.domain.enums.BackendState
import com.zaneschepke.wireguardautotunnel.domain.enums.TunnelStatus
import com.zaneschepke.wireguardautotunnel.domain.repository.AppDataRepository
import com.zaneschepke.wireguardautotunnel.domain.state.TunnelStatistics
import java.util.concurrent.ConcurrentHashMap
import javax.inject.Inject
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.CoroutineScope
@@ -61,6 +62,9 @@ constructor(
initialValue = emptyMap(),
)
override val bouncingTunnelIds: ConcurrentHashMap<Int, TunnelStatus.StopReason> =
tunnelProviderFlow.value.bouncingTunnelIds
override fun hasVpnPermission(): Boolean {
return userspaceTunnel.hasVpnPermission()
}
@@ -78,11 +82,11 @@ constructor(
}
override suspend fun stopTunnel(tunnelConf: TunnelConf?, reason: TunnelStatus.StopReason) {
tunnelProviderFlow.value.stopTunnel(tunnelConf)
tunnelProviderFlow.value.stopTunnel(tunnelConf, reason)
}
override suspend fun bounceTunnel(tunnelConf: TunnelConf, reason: TunnelStatus.StopReason) {
tunnelProviderFlow.value.bounceTunnel(tunnelConf)
tunnelProviderFlow.value.bounceTunnel(tunnelConf, reason)
}
override fun setBackendState(backendState: BackendState, allowedIps: Collection<String>) {
@@ -5,16 +5,32 @@ import com.zaneschepke.wireguardautotunnel.domain.enums.BackendState
import com.zaneschepke.wireguardautotunnel.domain.enums.TunnelStatus
import com.zaneschepke.wireguardautotunnel.domain.state.TunnelState
import com.zaneschepke.wireguardautotunnel.domain.state.TunnelStatistics
import java.util.concurrent.ConcurrentHashMap
import kotlinx.coroutines.flow.StateFlow
interface TunnelProvider {
/** Starts the specified tunnel configuration. */
suspend fun startTunnel(tunnelConf: TunnelConf)
/**
* Stops the specified tunnel, or all tunnels if none is provided.
*
* @param tunnelConf The tunnel to stop, or null to stop all active tunnels.
* @param reason The reason for stopping, defaults to USER for manual stops. Callers should
* override with specific reasons (e.g., PING, CONFIG_CHANGED) when applicable.
*/
suspend fun stopTunnel(
tunnelConf: TunnelConf? = null,
reason: TunnelStatus.StopReason = TunnelStatus.StopReason.USER,
)
/**
* Bounces (stops and restarts) the specified tunnel.
*
* @param tunnelConf The tunnel to bounce.
* @param reason The reason for bouncing, defaults to USER for manual actions. Callers should
* override with specific reasons (e.g., PING, CONFIG_CHANGED) when applicable.
*/
suspend fun bounceTunnel(
tunnelConf: TunnelConf,
reason: TunnelStatus.StopReason = TunnelStatus.StopReason.USER,
@@ -30,6 +46,8 @@ interface TunnelProvider {
val activeTunnels: StateFlow<Map<TunnelConf, TunnelState>>
val bouncingTunnelIds: ConcurrentHashMap<Int, TunnelStatus.StopReason>
fun hasVpnPermission(): Boolean
suspend fun clearError(tunnelConf: TunnelConf)
@@ -24,7 +24,6 @@ class DataStoreManager(
companion object {
val locationDisclosureShown = booleanPreferencesKey("LOCATION_DISCLOSURE_SHOWN")
val batteryDisableShown = booleanPreferencesKey("BATTERY_OPTIMIZE_DISABLE_SHOWN")
val currentSSID = stringPreferencesKey("CURRENT_SSID")
val pinLockEnabled = booleanPreferencesKey("PIN_LOCK_ENABLED")
val tunnelStatsExpanded = booleanPreferencesKey("TUNNEL_STATS_EXPANDED")
val isLocalLogsEnabled = booleanPreferencesKey("LOCAL_LOGS_ENABLED")
@@ -21,7 +21,7 @@ data class GeneralState(
isBatteryOptimizationDisableShown,
isPinLockEnabled,
isTunnelStatsExpanded,
isLocationDisclosureShown,
isLocalLogsEnabled,
isRemoteControlEnabled,
remoteKey,
locale,
@@ -33,18 +33,18 @@ fun ExpandingRowListItem(
Box(
modifier =
Modifier.animateContentSize()
.clip(RoundedCornerShape(30.dp))
.clip(RoundedCornerShape(8.dp))
.combinedClickable(onClick = { onClick() }, onLongClick = { onHold() })
) {
Column {
Row(
modifier = Modifier.fillMaxWidth().padding(horizontal = 15.dp),
modifier = Modifier.fillMaxWidth().padding(horizontal = 12.dp),
verticalAlignment = Alignment.CenterVertically,
horizontalArrangement = Arrangement.SpaceBetween,
) {
Row(
verticalAlignment = Alignment.CenterVertically,
horizontalArrangement = Arrangement.spacedBy(15.dp),
horizontalArrangement = Arrangement.spacedBy(16.dp),
modifier = Modifier.fillMaxWidth(13 / 20f),
) {
leading()
@@ -47,7 +47,7 @@ fun SelectionItemButton(
Row(
verticalAlignment = Alignment.CenterVertically,
horizontalArrangement = Arrangement.Start,
modifier = Modifier.fillMaxSize().padding(end = 10.dp),
modifier = Modifier.fillMaxSize().padding(horizontal = 12.dp),
) {
leading?.let { it() }
Text(
@@ -1,22 +1,16 @@
package com.zaneschepke.wireguardautotunnel.ui.common.button.surface
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material3.Card
import androidx.compose.material3.CardDefaults
import androidx.compose.material3.HorizontalDivider
import androidx.compose.material3.Icon
import androidx.compose.material3.MaterialTheme
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.unit.dp
import com.zaneschepke.wireguardautotunnel.ui.theme.iconSize
@@ -27,16 +21,17 @@ fun SurfaceSelectionGroupButton(items: List<SelectionItem>) {
shape = RoundedCornerShape(8.dp),
colors = CardDefaults.cardColors(containerColor = MaterialTheme.colorScheme.surface),
) {
items.mapIndexed { index, item ->
items.map { item ->
Box(
contentAlignment = Alignment.Center,
modifier =
Modifier.then(item.onClick?.let { Modifier.clickable { it() } } ?: Modifier)
.fillMaxWidth(),
Modifier.fillMaxWidth()
.clip(RoundedCornerShape(8.dp))
.then(item.onClick?.let { Modifier.clickable { it() } } ?: Modifier),
) {
Row(
verticalAlignment = Alignment.CenterVertically,
modifier = Modifier.fillMaxWidth().padding(vertical = 4.dp),
modifier = Modifier.fillMaxWidth().padding(horizontal = 12.dp),
) {
Row(
verticalAlignment = Alignment.CenterVertically,
@@ -57,6 +52,7 @@ fun SurfaceSelectionGroupButton(items: List<SelectionItem>) {
modifier =
Modifier.fillMaxWidth()
.padding(start = if (item.leadingIcon != null) 16.dp else 0.dp)
.weight(1f)
.padding(
vertical = if (item.description == null) 16.dp else 6.dp
),
@@ -68,15 +64,13 @@ fun SurfaceSelectionGroupButton(items: List<SelectionItem>) {
item.trailing?.let {
Box(
contentAlignment = Alignment.CenterEnd,
modifier = Modifier.padding(start = 16.dp).weight(1f),
modifier = Modifier.padding(start = 16.dp),
) {
it()
}
}
}
}
if (index + 1 != items.size)
HorizontalDivider(color = MaterialTheme.colorScheme.outline.copy(0.30f))
}
}
}
@@ -6,11 +6,16 @@ import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.text.font.FontWeight
@Composable
fun GroupLabel(title: String) {
Row(verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.Start) {
fun GroupLabel(title: String, modifier: Modifier = Modifier) {
Row(
verticalAlignment = Alignment.CenterVertically,
horizontalArrangement = Arrangement.Start,
modifier = modifier,
) {
Text(
title,
style = MaterialTheme.typography.titleMedium,
@@ -8,6 +8,8 @@ import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.verticalScroll
import androidx.compose.material3.HorizontalDivider
import androidx.compose.material3.MaterialTheme
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue
@@ -90,12 +92,12 @@ fun AutoTunnelScreen(uiState: AppUiState, viewModel: AppViewModel) {
Column(
horizontalAlignment = Alignment.Start,
verticalArrangement = Arrangement.spacedBy(24.dp, Alignment.Top),
verticalArrangement = Arrangement.spacedBy(12.dp, Alignment.Top),
modifier =
Modifier.fillMaxSize()
.verticalScroll(rememberScrollState())
.padding(vertical = 24.dp)
.padding(horizontal = 24.dp),
.padding(horizontal = 12.dp),
) {
SurfaceSelectionGroupButton(
items =
@@ -107,7 +109,9 @@ fun AutoTunnelScreen(uiState: AppUiState, viewModel: AppViewModel) {
{ isWifiNameReadable() },
)
)
HorizontalDivider(color = MaterialTheme.colorScheme.outline.copy(0.30f))
SurfaceSelectionGroupButton(items = NetworkTunnelingItems(uiState, viewModel))
HorizontalDivider(color = MaterialTheme.colorScheme.outline.copy(0.30f))
SurfaceSelectionGroupButton(
items =
listOf(
@@ -18,12 +18,12 @@ import com.zaneschepke.wireguardautotunnel.viewmodel.AppViewModel
fun AutoTunnelAdvancedScreen(appUiState: AppUiState, viewModel: AppViewModel) {
Column(
horizontalAlignment = Alignment.Start,
verticalArrangement = Arrangement.spacedBy(24.dp, Alignment.Top),
verticalArrangement = Arrangement.spacedBy(12.dp, Alignment.Top),
modifier =
Modifier.fillMaxSize()
.verticalScroll(rememberScrollState())
.padding(top = 24.dp)
.padding(horizontal = 24.dp),
.padding(vertical = 24.dp)
.padding(horizontal = 12.dp),
) {
DebounceDelaySelector(
currentDelay = appUiState.appSettings.debounceDelaySeconds,
@@ -121,8 +121,7 @@ fun MainScreen(appUiState: AppUiState, appViewState: AppViewState, viewModel: Ap
viewModel.handleEvent(AppEvent.CopyTunnel(it))
viewModel.handleEvent(AppEvent.SetSelectedTunnel(null))
},
modifier =
Modifier.fillMaxSize().padding(top = 12.dp, bottom = 24.dp).padding(horizontal = 12.dp),
modifier = Modifier.fillMaxSize().padding(vertical = 24.dp).padding(horizontal = 12.dp),
viewModel = viewModel,
)
}
@@ -35,12 +35,12 @@ fun TunnelAutoTunnelScreen(
Column(
horizontalAlignment = Alignment.Start,
verticalArrangement = Arrangement.spacedBy(24.dp, Alignment.Top),
verticalArrangement = Arrangement.spacedBy(12.dp, Alignment.Top),
modifier =
Modifier.fillMaxSize()
.verticalScroll(rememberScrollState())
.padding(top = 24.dp)
.padding(horizontal = 24.dp),
.padding(vertical = 24.dp)
.padding(horizontal = 12.dp),
) {
SurfaceSelectionGroupButton(
items =
@@ -6,6 +6,8 @@ import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.verticalScroll
import androidx.compose.material3.HorizontalDivider
import androidx.compose.material3.MaterialTheme
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue
@@ -34,12 +36,12 @@ fun TunnelOptionsScreen(tunnelConf: TunnelConf, appUiState: AppUiState, viewMode
Column(
horizontalAlignment = Alignment.Start,
verticalArrangement = Arrangement.spacedBy(24.dp, Alignment.Top),
verticalArrangement = Arrangement.spacedBy(12.dp, Alignment.Top),
modifier =
Modifier.fillMaxSize()
.verticalScroll(rememberScrollState())
.padding(top = 24.dp)
.padding(horizontal = 24.dp),
.padding(horizontal = 12.dp),
) {
SurfaceSelectionGroupButton(
items =
@@ -50,6 +52,7 @@ fun TunnelOptionsScreen(tunnelConf: TunnelConf, appUiState: AppUiState, viewMode
SplitTunnelingItem(tunnelConf),
)
)
HorizontalDivider(color = MaterialTheme.colorScheme.outline.copy(0.30f))
SurfaceSelectionGroupButton(
items =
buildList {
@@ -8,6 +8,8 @@ import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.verticalScroll
import androidx.compose.material3.HorizontalDivider
import androidx.compose.material3.MaterialTheme
import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment
@@ -48,13 +50,12 @@ fun SettingsScreen(uiState: AppUiState, appViewState: AppViewState, viewModel: A
Column(
horizontalAlignment = Alignment.Start,
verticalArrangement = Arrangement.spacedBy(24.dp, Alignment.Top),
verticalArrangement = Arrangement.spacedBy(12.dp, Alignment.Top),
modifier =
Modifier.verticalScroll(rememberScrollState())
.fillMaxSize()
.padding(top = 24.dp)
.padding(bottom = 40.dp)
.padding(horizontal = 24.dp)
.padding(vertical = 24.dp)
.padding(horizontal = 12.dp)
.then(
if (!isRunningOnTv) {
Modifier.clickable(
@@ -76,6 +77,7 @@ fun SettingsScreen(uiState: AppUiState, appViewState: AppViewState, viewModel: A
add(RestartAtBootItem(uiState, viewModel))
}
)
HorizontalDivider(color = MaterialTheme.colorScheme.outline.copy(0.30f))
SurfaceSelectionGroupButton(
items =
buildList {
@@ -85,8 +87,10 @@ fun SettingsScreen(uiState: AppUiState, appViewState: AppViewState, viewModel: A
add(PinLockItem(uiState, viewModel))
}
)
HorizontalDivider(color = MaterialTheme.colorScheme.outline.copy(0.30f))
if (!isRunningOnTv) {
SurfaceSelectionGroupButton(items = listOf(KernelModeItem(uiState, viewModel)))
HorizontalDivider(color = MaterialTheme.colorScheme.outline.copy(0.30f))
}
SurfaceSelectionGroupButton(
items =
@@ -38,12 +38,12 @@ fun SettingsAdvancedScreen(appUiState: AppUiState, viewModel: AppViewModel) {
Column(
horizontalAlignment = Alignment.Start,
verticalArrangement = Arrangement.spacedBy(24.dp, Alignment.Top),
verticalArrangement = Arrangement.spacedBy(12.dp, Alignment.Top),
modifier =
Modifier.fillMaxSize()
.verticalScroll(rememberScrollState())
.padding(top = 24.dp)
.padding(horizontal = 24.dp),
.padding(vertical = 24.dp)
.padding(horizontal = 12.dp),
) {
SurfaceSelectionGroupButton(listOf(RemoteControlItem(appUiState, viewModel)))
}
@@ -4,6 +4,8 @@ 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.material3.HorizontalDivider
import androidx.compose.material3.MaterialTheme
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
@@ -17,11 +19,13 @@ import com.zaneschepke.wireguardautotunnel.ui.screens.settings.appearance.compon
fun AppearanceScreen() {
Column(
horizontalAlignment = Alignment.Start,
verticalArrangement = Arrangement.spacedBy(24.dp, Alignment.Top),
modifier = Modifier.fillMaxSize().padding(top = 24.dp).padding(horizontal = 24.dp),
verticalArrangement = Arrangement.spacedBy(12.dp, Alignment.Top),
modifier = Modifier.fillMaxSize().padding(vertical = 24.dp).padding(horizontal = 12.dp),
) {
SurfaceSelectionGroupButton(items = listOf(LanguageItem()))
HorizontalDivider(color = MaterialTheme.colorScheme.outline.copy(0.30f))
SurfaceSelectionGroupButton(items = listOf(NotificationsItem()))
HorizontalDivider(color = MaterialTheme.colorScheme.outline.copy(0.30f))
SurfaceSelectionGroupButton(items = listOf(DisplayThemeItem()))
}
}
@@ -8,11 +8,13 @@ import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember
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.screens.settings.appearance.language.components.AutomaticLanguageItem
import com.zaneschepke.wireguardautotunnel.ui.screens.settings.appearance.language.components.LanguageItem
import com.zaneschepke.wireguardautotunnel.ui.state.AppUiState
import com.zaneschepke.wireguardautotunnel.util.LocaleUtil
import com.zaneschepke.wireguardautotunnel.util.extensions.isRunningOnTv
import com.zaneschepke.wireguardautotunnel.viewmodel.AppViewModel
import java.text.Collator
import java.util.*
@@ -21,6 +23,9 @@ import java.util.*
fun LanguageScreen(appUiState: AppUiState, viewModel: AppViewModel) {
val collator = Collator.getInstance(Locale.getDefault())
val context = LocalContext.current
val isAndroidTv = remember { context.isRunningOnTv() }
val locales =
LocaleUtil.supportedLocales.map {
val tag = it.replace("_", "-")
@@ -35,9 +40,11 @@ fun LanguageScreen(appUiState: AppUiState, viewModel: AppViewModel) {
LazyColumn(
horizontalAlignment = Alignment.CenterHorizontally,
verticalArrangement = Arrangement.Top,
modifier = Modifier.padding(horizontal = 24.dp),
modifier = Modifier.padding(horizontal = 12.dp),
) {
item { AutomaticLanguageItem(appUiState, viewModel) }
items(sortedLocales, key = { it }) { locale -> LanguageItem(locale, appUiState, viewModel) }
item { AutomaticLanguageItem(appUiState, viewModel, isAndroidTv) }
items(sortedLocales, key = { it }) { locale ->
LanguageItem(locale, appUiState, viewModel, isAndroidTv)
}
}
}
@@ -15,7 +15,7 @@ import com.zaneschepke.wireguardautotunnel.viewmodel.AppViewModel
import com.zaneschepke.wireguardautotunnel.viewmodel.event.AppEvent
@Composable
fun AutomaticLanguageItem(appUiState: AppUiState, viewModel: AppViewModel) {
fun AutomaticLanguageItem(appUiState: AppUiState, viewModel: AppViewModel, isAndroidTv: Boolean) {
Box(modifier = Modifier.padding(top = 24.dp)) {
SelectionItemButton(
buttonText = stringResource(R.string.automatic),
@@ -29,7 +29,7 @@ fun AutomaticLanguageItem(appUiState: AppUiState, viewModel: AppViewModel) {
}
}
},
ripple = false,
ripple = isAndroidTv,
)
}
}
@@ -9,7 +9,12 @@ import com.zaneschepke.wireguardautotunnel.viewmodel.event.AppEvent
import java.util.*
@Composable
fun LanguageItem(locale: Locale, appUiState: AppUiState, viewModel: AppViewModel) {
fun LanguageItem(
locale: Locale,
appUiState: AppUiState,
viewModel: AppViewModel,
isAndroidTv: Boolean,
) {
SelectionItemButton(
buttonText =
locale.getDisplayLanguage(locale).replaceFirstChar {
@@ -28,6 +33,6 @@ fun LanguageItem(locale: Locale, appUiState: AppUiState, viewModel: AppViewModel
SelectedLabel()
}
},
ripple = false,
ripple = isAndroidTv,
)
}
@@ -4,6 +4,8 @@ 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.material3.HorizontalDivider
import androidx.compose.material3.MaterialTheme
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
@@ -22,11 +24,12 @@ fun KillSwitchScreen(uiState: AppUiState, viewModel: AppViewModel) {
Column(
horizontalAlignment = Alignment.Start,
verticalArrangement = Arrangement.spacedBy(24.dp, Alignment.Top),
modifier = Modifier.fillMaxSize().padding(top = 24.dp).padding(horizontal = 24.dp),
verticalArrangement = Arrangement.spacedBy(12.dp, Alignment.Top),
modifier = Modifier.fillMaxSize().padding(vertical = 24.dp).padding(horizontal = 12.dp),
) {
if (!context.isRunningOnTv()) {
SurfaceSelectionGroupButton(items = listOf(NativeKillSwitchItem()))
HorizontalDivider(color = MaterialTheme.colorScheme.outline.copy(0.30f))
}
SurfaceSelectionGroupButton(
items =
@@ -1,8 +1,11 @@
package com.zaneschepke.wireguardautotunnel.ui.screens.support.logs
package com.zaneschepke.wireguardautotunnel.ui.screens.settings.logs
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.lazy.rememberLazyListState
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue
@@ -11,11 +14,15 @@ import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.runtime.snapshotFlow
import androidx.compose.ui.Alignment
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.lifecycle.compose.collectAsStateWithLifecycle
import com.zaneschepke.wireguardautotunnel.ui.screens.support.logs.components.LogList
import com.zaneschepke.wireguardautotunnel.ui.screens.support.logs.components.LogsBottomSheet
import com.zaneschepke.wireguardautotunnel.R
import com.zaneschepke.wireguardautotunnel.ui.screens.settings.logs.components.LogList
import com.zaneschepke.wireguardautotunnel.ui.screens.settings.logs.components.LogsBottomSheet
import com.zaneschepke.wireguardautotunnel.ui.state.AppViewState
import com.zaneschepke.wireguardautotunnel.viewmodel.AppViewModel
@@ -62,6 +69,20 @@ fun LogsScreen(appViewState: AppViewState, viewModel: AppViewModel) {
LogsBottomSheet(viewModel)
}
if (logs.isEmpty()) {
return Box(
modifier = Modifier.fillMaxSize().padding(horizontal = 24.dp),
contentAlignment = Alignment.Center,
) {
Text(
text = stringResource(R.string.nothing_here_yet),
fontStyle = FontStyle.Italic,
style = MaterialTheme.typography.bodyLarge,
color = MaterialTheme.colorScheme.onSurface,
)
}
}
LogList(
logs = logs,
lazyColumnListState = lazyColumnListState,
@@ -1,4 +1,4 @@
package com.zaneschepke.wireguardautotunnel.ui.screens.support.logs.components
package com.zaneschepke.wireguardautotunnel.ui.screens.settings.logs.components
import androidx.compose.foundation.clickable
import androidx.compose.foundation.interaction.MutableInteractionSource
@@ -1,4 +1,4 @@
package com.zaneschepke.wireguardautotunnel.ui.screens.support.logs.components
package com.zaneschepke.wireguardautotunnel.ui.screens.settings.logs.components
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.lazy.LazyColumn
@@ -1,4 +1,4 @@
package com.zaneschepke.wireguardautotunnel.ui.screens.support.logs.components
package com.zaneschepke.wireguardautotunnel.ui.screens.settings.logs.components
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Row
@@ -6,6 +6,8 @@ import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.verticalScroll
import androidx.compose.material3.HorizontalDivider
import androidx.compose.material3.MaterialTheme
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
@@ -25,14 +27,18 @@ fun SupportScreen() {
Column(
modifier =
Modifier.fillMaxSize()
.padding(top = 24.dp)
.padding(horizontal = 24.dp)
.padding(vertical = 24.dp)
.padding(horizontal = 12.dp)
.verticalScroll(rememberScrollState()),
horizontalAlignment = Alignment.Start,
verticalArrangement = Arrangement.spacedBy(24.dp, Alignment.Top),
verticalArrangement = Arrangement.spacedBy(12.dp, Alignment.Top),
) {
GroupLabel(stringResource(R.string.thank_you))
GroupLabel(
stringResource(R.string.thank_you),
modifier = Modifier.padding(horizontal = 12.dp),
)
GeneralSupportOptions(context)
HorizontalDivider(color = MaterialTheme.colorScheme.outline.copy(0.30f))
ContactSupportOptions(context)
VersionLabel()
}
@@ -2,6 +2,7 @@ package com.zaneschepke.wireguardautotunnel.util
object Constants {
const val MAX_LOG_SIZE = 10_000L
const val BASE_PACKAGE = "com.zaneschepke.wireguardautotunnel"
const val BASE_LOG_FILE_NAME = "wg_tunnel_logs"
@@ -27,12 +27,7 @@ import com.zaneschepke.wireguardautotunnel.domain.state.TunnelState
import com.zaneschepke.wireguardautotunnel.ui.state.AppUiState
import com.zaneschepke.wireguardautotunnel.ui.state.AppViewState
import com.zaneschepke.wireguardautotunnel.ui.theme.Theme
import com.zaneschepke.wireguardautotunnel.util.Constants
import com.zaneschepke.wireguardautotunnel.util.FileReadException
import com.zaneschepke.wireguardautotunnel.util.FileUtils
import com.zaneschepke.wireguardautotunnel.util.InvalidFileExtensionException
import com.zaneschepke.wireguardautotunnel.util.LocaleUtil
import com.zaneschepke.wireguardautotunnel.util.StringValue
import com.zaneschepke.wireguardautotunnel.util.*
import com.zaneschepke.wireguardautotunnel.util.extensions.withFirstState
import com.zaneschepke.wireguardautotunnel.viewmodel.event.AppEvent
import dagger.hilt.android.lifecycle.HiltViewModel
@@ -41,20 +36,10 @@ import java.time.Instant
import java.util.*
import javax.inject.Inject
import javax.inject.Provider
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.SharingStarted
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.flowOn
import kotlinx.coroutines.flow.stateIn
import kotlinx.coroutines.flow.update
import kotlinx.coroutines.launch
import kotlinx.coroutines.plus
import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*
import kotlinx.coroutines.sync.Mutex
import kotlinx.coroutines.sync.withLock
import kotlinx.coroutines.withContext
import org.amnezia.awg.config.BadConfigException
import org.amnezia.awg.config.Config
import timber.log.Timber
@@ -73,12 +58,15 @@ constructor(
private val logReader: LogReader,
private val fileUtils: FileUtils,
private val shortcutManager: ShortcutManager,
private val networkMonitor: NetworkMonitor,
networkMonitor: NetworkMonitor,
) : ViewModel() {
private var logsJob: Job? = null
private val tunnelMutex = Mutex()
private val settingsMutex = Mutex()
private val tunControlMutex = Mutex()
private val loggerMutex = Mutex()
private val _screenCallback = MutableStateFlow<(() -> Unit)?>(null)
@@ -87,7 +75,7 @@ constructor(
private val _logs = MutableStateFlow<List<LogMessage>>(emptyList())
val logs: StateFlow<List<LogMessage>> = _logs.asStateFlow()
private val maxLogSize = 10_000
private val maxLogSize = Constants.MAX_LOG_SIZE
val uiState =
combine(
@@ -100,7 +88,7 @@ constructor(
) { array ->
val settings = array[0] as AppSettings
val tunnels = array[1] as List<TunnelConf>
val generalState = array[2] as AppState
val appState = array[2] as AppState
val activeTunnels = array[3] as Map<TunnelConf, TunnelState>
val autoTunnel = array[4] as Boolean
val network = array[5] as NetworkStatus
@@ -109,7 +97,7 @@ constructor(
appSettings = settings,
tunnels = tunnels,
activeTunnels = activeTunnels,
appState = generalState,
appState = appState,
isAutoTunnelActive = autoTunnel,
isAppLoaded = true,
networkStatus = network,
@@ -127,7 +115,7 @@ constructor(
initPin(state.appState.isPinLockEnabled)
handleKillSwitchChange(state.appSettings)
initServicesFromSavedState(state)
if (state.appState.isLocalLogsEnabled) startCollectingLogs()
if (state.appState.isLocalLogsEnabled) logsJob = startCollectingLogs()
}
}
}
@@ -225,7 +213,7 @@ constructor(
appDataRepository.appState.setIsRemoteControlEnabled(enabled)
}
private fun startCollectingLogs() {
private fun startCollectingLogs() =
viewModelScope.launch {
logReader.bufferedLogs.flowOn(ioDispatcher).collect { logMessage ->
_logs.update { currentList ->
@@ -238,7 +226,6 @@ constructor(
}
}
}
}
private suspend fun handleAppReadyCheck(tunnels: List<TunnelConf>) {
if (tunnels.size == appDataRepository.tunnels.count()) {
@@ -256,14 +243,16 @@ constructor(
saveTunnel(tunnel.copy(isPingEnabled = !tunnel.isPingEnabled))
private suspend fun handleToggleLocalLogging(currentlyEnabled: Boolean) {
val enable = !currentlyEnabled
appDataRepository.appState.setLocalLogsEnabled(enable)
withContext(mainDispatcher) {
loggerMutex.withLock {
val enable = !currentlyEnabled
appDataRepository.appState.setLocalLogsEnabled(enable)
if (enable) {
logsJob?.cancel()
logReader.start()
startCollectingLogs()
logsJob = startCollectingLogs()
} else {
logReader.stop()
logsJob?.cancel()
_logs.update { emptyList() }
}
}
@@ -445,8 +434,8 @@ constructor(
saveSettings(appSettings.copy(isAlwaysOnVpnEnabled = !appSettings.isAlwaysOnVpnEnabled))
private suspend fun handleLocaleChange(localeTag: String) {
withContext(mainDispatcher) { LocaleUtil.changeLocale(localeTag) }
appDataRepository.appState.setLocale(localeTag)
LocaleUtil.changeLocale(localeTag)
_appViewState.update { it.copy(isConfigChanged = true) }
}
@@ -474,6 +463,8 @@ constructor(
}
private fun handleKillSwitchChange(appSettings: AppSettings) {
// let auto tunnel handle kill switch changes if running
if (uiState.value.isAutoTunnelActive) return
if (!appSettings.isVpnKillSwitchEnabled)
return tunnelManager.setBackendState(BackendState.SERVICE_ACTIVE, emptyList())
Timber.d("Starting kill switch")
@@ -687,9 +678,13 @@ constructor(
}
private suspend fun handleDeleteLogs() {
withContext(mainDispatcher) {
logReader.deleteAndClearLogs()
loggerMutex.withLock {
logsJob?.cancel()
_logs.update { emptyList() }
logReader.stop()
logReader.deleteAndClearLogs()
logReader.start()
logsJob = startCollectingLogs()
}
}
@@ -1,18 +0,0 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:tint="#FFFFFF"
android:viewportWidth="640"
android:viewportHeight="640">
<group
android:scaleX="1.0132159"
android:scaleY="1.0132159"
android:translateX="-4.229075"
android:translateY="-4.229075">
<path
android:fillColor="#53bdb6"
android:fillType="evenOdd"
android:pathData="M316.72,80.15C314.94,80.82 312.08,83.95 308.79,88.84C275.66,138.15 157.88,161.96 119.66,127.08C109.97,118.24 101.21,118.84 98.97,128.5C96.01,141.29 98.49,204.07 103.12,233.5C123.71,364.32 186.77,465.69 303.03,554.88C314.06,563.34 316.63,563.42 326.93,555.61C329.91,553.35 336.21,548.63 340.93,545.13C345.64,541.63 350.87,537.46 352.55,535.88C354.23,534.29 357.92,531.53 360.75,529.74C413.56,496.43 481.74,399.04 510.38,316C527.22,267.19 534.86,236.66 539.96,197.9C547.99,136.74 545.31,124.46 526,134.01C469.85,161.74 361.02,137.16 333.39,90.49C327.63,80.75 322.93,77.84 316.72,80.15M307.5,195.34C282.24,203.76 266.16,237.38 269.85,274.04C270.99,285.39 271.18,285 264.63,285C254.13,285 254.15,284.87 255,352.05C255.64,402.94 250.1,397.02 298.5,398.52C352.54,400.2 377.63,400.23 379.23,398.63C381.67,396.18 381.86,392.86 382.46,339.89C383.09,283.93 383.39,286 374.51,286C367.07,286 367.21,286.26 367.77,273.58C369.89,225.38 338.74,184.92 307.5,195.34M308.93,216.98C294.31,224.7 281.68,270.05 290.33,283.75C291.74,285.99 346.85,285.51 347.78,283.25C359.48,254.75 330.62,205.51 308.93,216.98M309.54,317.1C304.18,321.81 304.39,327.76 310.11,332.99C314.78,337.26 314.82,336.51 309.33,349.89C307.44,354.51 306.13,358.89 306.42,359.64C306.96,361.06 329,361.75 329,360.35C329,359.98 327.42,354.82 325.5,348.86C323.58,342.91 322,337.52 322,336.89C322,336.26 323.58,334 325.5,331.87C335.69,320.59 321.02,307.02 309.54,317.1"
android:strokeColor="#00000000" />
</group>
</vector>
Binary file not shown.

After

Width:  |  Height:  |  Size: 777 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 544 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 715 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 525 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 382 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 471 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 698 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 987 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

@@ -1,56 +0,0 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="320dp"
android:height="180dp"
android:viewportWidth="640"
android:viewportHeight="640">
<group
android:scaleX="0.6666667"
android:scaleY="0.6666667"
android:translateX="106.666664"
android:translateY="106.666664">
<group
android:scaleX="0.315"
android:scaleY="0.56"
android:translateX="46.4"
android:translateY="140.8">
<path
android:fillColor="#53bdb6"
android:fillType="evenOdd"
android:pathData="M316.72,80.15C314.94,80.82 312.08,83.95 308.79,88.84C275.66,138.15 157.88,161.96 119.66,127.08C109.97,118.24 101.21,118.84 98.97,128.5C96.01,141.29 98.49,204.07 103.12,233.5C123.71,364.32 186.77,465.69 303.03,554.88C314.06,563.34 316.63,563.42 326.93,555.61C329.91,553.35 336.21,548.63 340.93,545.13C345.64,541.63 350.87,537.46 352.55,535.88C354.23,534.29 357.92,531.53 360.75,529.74C413.56,496.43 481.74,399.04 510.38,316C527.22,267.19 534.86,236.66 539.96,197.9C547.99,136.74 545.31,124.46 526,134.01C469.85,161.74 361.02,137.16 333.39,90.49C327.63,80.75 322.93,77.84 316.72,80.15M307.5,195.34C282.24,203.76 266.16,237.38 269.85,274.04C270.99,285.39 271.18,285 264.63,285C254.13,285 254.15,284.87 255,352.05C255.64,402.94 250.1,397.02 298.5,398.52C352.54,400.2 377.63,400.23 379.23,398.63C381.67,396.18 381.86,392.86 382.46,339.89C383.09,283.93 383.39,286 374.51,286C367.07,286 367.21,286.26 367.77,273.58C369.89,225.38 338.74,184.92 307.5,195.34M308.93,216.98C294.31,224.7 281.68,270.05 290.33,283.75C291.74,285.99 346.85,285.51 347.78,283.25C359.48,254.75 330.62,205.51 308.93,216.98M309.54,317.1C304.18,321.81 304.39,327.76 310.11,332.99C314.78,337.26 314.82,336.51 309.33,349.89C307.44,354.51 306.13,358.89 306.42,359.64C306.96,361.06 329,361.75 329,360.35C329,359.98 327.42,354.82 325.5,348.86C323.58,342.91 322,337.52 322,336.89C322,336.26 323.58,334 325.5,331.87C335.69,320.59 321.02,307.02 309.54,317.1"
android:strokeColor="#00000000" />
</group>
<group
android:scaleX="0.52644"
android:scaleY="0.20707752"
android:translateX="320.4"
android:translateY="70.26513">
<group android:translateY="132.92308">
<path
android:fillColor="#53BDB6"
android:pathData="M76.06154,-101.68616L87.95077,-101.68616L72.44308,0L55.606155,0L43.93846,-76.72615L32.196922,0L14.990769,0L0.6646154,-101.68616L13.513846,-101.68616L24.36923,-14.104615L36.553844,-89.870766L52.283077,-89.870766L63.876923,-14.104615Z" />
<path
android:fillColor="#53BDB6"
android:pathData="M135.30154,1.6984615Q123.11692,1.6984615,114.25539,-4.1723075Q105.393845,-10.0430765,100.55692,-21.821539Q95.72,-33.6,95.72,-50.88Q95.72,-67.643074,101.62769,-79.495384Q107.535385,-91.347694,117.246155,-97.32923Q126.956924,-103.31077,138.25539,-103.31077Q147.78154,-103.31077,154.42769,-100.61539Q161.07385,-97.92,167.35077,-92.16L159.59692,-84.11077Q154.94461,-88.46769,149.77539,-90.535385Q144.60616,-92.60307,138.32922,-92.60307Q130.42769,-92.60307,123.92923,-88.504616Q117.43077,-84.40615,113.44308,-75.10154Q109.45538,-65.79692,109.45538,-50.88Q109.45538,-29.095385,116.175385,-19.089231Q122.895386,-9.0830765,136.48308,-9.0830765Q146.7477,-9.0830765,155.83076,-13.9569235L155.83076,-44.97231L135.81847,-44.97231L134.26768,-55.606155L168.5323,-55.606155L168.5323,-7.163077Q160.70462,-2.88,152.98769,-0.59076923Q145.27077,1.6984615,135.30154,1.6984615Z" />
<path
android:fillColor="#53BDB6"
android:pathData="M348.30463,-90.683075L317.43692,-90.683075L317.43692,0L304.66153,0L304.66153,-90.683075L272.90768,-90.683075L272.90768,-101.68616L349.63385,-101.68616Z" />
<path
android:fillColor="#53BDB6"
android:pathData="M383.24924,-22.670769Q383.24924,-15.064615,386.3877,-11.630769Q389.52615,-8.196923,396.32,-8.196923Q402.44922,-8.196923,408.24615,-11.741538Q414.0431,-15.286154,417.36615,-20.52923L417.36615,-77.76L429.7723,-77.76L429.7723,0L419.2123,0L418.17847,-10.486154Q413.67386,-4.726154,406.99078,-1.5138462Q400.30768,1.6984615,393.2923,1.6984615Q382.14154,1.6984615,376.4923,-4.246154Q370.84308,-10.190769,370.84308,-21.193846L370.84308,-77.76L383.24924,-77.76Z" />
<path
android:fillColor="#53BDB6"
android:pathData="M459.84308,0L459.84308,-77.76L470.40308,-77.76L471.36307,-66.97846Q476.01538,-72.81231,483.0677,-76.098465Q490.12,-79.38461,497.06152,-79.38461Q508.2123,-79.38461,513.56616,-73.47692Q518.92,-67.56923,518.92,-56.49231L518.92,0L506.51385,0L506.51385,-47.335384Q506.51385,-56.049232,505.59076,-60.627693Q504.6677,-65.206154,501.82462,-67.42154Q498.98154,-69.636925,493.22153,-69.636925Q486.9446,-69.636925,481.36923,-65.76Q475.79385,-61.883076,472.24924,-56.64L472.24924,0Z" />
<path
android:fillColor="#53BDB6"
android:pathData="M548.8431,0L548.8431,-77.76L559.4031,-77.76L560.3631,-66.97846Q565.0154,-72.81231,572.0677,-76.098465Q579.12,-79.38461,586.0615,-79.38461Q597.2123,-79.38461,602.56616,-73.47692Q607.92,-67.56923,607.92,-56.49231L607.92,0L595.51385,0L595.51385,-47.335384Q595.51385,-56.049232,594.59076,-60.627693Q593.66766,-65.206154,590.8246,-67.42154Q587.98157,-69.636925,582.22156,-69.636925Q575.94464,-69.636925,570.3692,-65.76Q564.7938,-61.883076,561.2492,-56.64L561.2492,0Z" />
<path
android:fillColor="#53BDB6"
android:pathData="M647.59076,-34.486153Q647.88617,-25.772308,650.9877,-19.975384Q654.08923,-14.178461,659.1108,-11.409231Q664.1323,-8.64,670.3354,-8.64Q676.0954,-8.64,680.9323,-10.338462Q685.7692,-12.036923,691.0862,-15.655385L696.92,-7.4584618Q691.4554,-3.1753845,684.4031,-0.73846155Q677.35077,1.6984615,670.1877,1.6984615Q659.0369,1.6984615,650.9877,-3.323077Q642.9385,-8.344615,638.7662,-17.50154Q634.5939,-26.65846,634.5939,-38.76923Q634.5939,-50.51077,638.8031,-59.74154Q643.0123,-68.972305,650.6923,-74.17846Q658.3723,-79.38461,668.56305,-79.38461Q678.3108,-79.38461,685.43695,-74.80615Q692.56305,-70.22769,696.36615,-61.624615Q700.16925,-53.021538,700.16925,-41.28Q700.16925,-37.883076,699.87384,-34.486153ZM668.71075,-69.19385Q659.70154,-69.19385,654.0523,-62.88Q648.4031,-56.566154,647.6646,-44.086155L688.2062,-44.086155Q687.9846,-56.344616,682.81537,-62.76923Q677.6462,-69.19385,668.71075,-69.19385Z" />
<path
android:fillColor="#53BDB6"
android:pathData="M757.12,-19.2Q757.12,-13.735385,760.55383,-11.187693Q763.9877,-8.64,769.96924,-8.64Q776.24615,-8.64,783.04,-11.372308L786.3631,-2.2892308Q782.8185,-0.51692307,778.0923,0.59076923Q773.36615,1.6984615,767.90155,1.6984615Q761.0339,1.6984615,755.75385,-0.8861538Q750.4738,-3.4707692,747.5939,-8.344615Q744.71387,-13.218462,744.71387,-19.864614L744.71387,-99.24923L720.8615,-99.24923L720.8615,-109.07077L757.12,-109.07077Z" />
</group>
</group>
</group>
</vector>
@@ -1,17 +0,0 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="108dp"
android:height="108dp"
android:viewportWidth="640"
android:viewportHeight="640">
<group
android:scaleX="0.6"
android:scaleY="0.6"
android:translateX="128"
android:translateY="128">
<path
android:fillColor="#53bdb6"
android:fillType="evenOdd"
android:pathData="M316.72,80.15C314.94,80.82 312.08,83.95 308.79,88.84C275.66,138.15 157.88,161.96 119.66,127.08C109.97,118.24 101.21,118.84 98.97,128.5C96.01,141.29 98.49,204.07 103.12,233.5C123.71,364.32 186.77,465.69 303.03,554.88C314.06,563.34 316.63,563.42 326.93,555.61C329.91,553.35 336.21,548.63 340.93,545.13C345.64,541.63 350.87,537.46 352.55,535.88C354.23,534.29 357.92,531.53 360.75,529.74C413.56,496.43 481.74,399.04 510.38,316C527.22,267.19 534.86,236.66 539.96,197.9C547.99,136.74 545.31,124.46 526,134.01C469.85,161.74 361.02,137.16 333.39,90.49C327.63,80.75 322.93,77.84 316.72,80.15M307.5,195.34C282.24,203.76 266.16,237.38 269.85,274.04C270.99,285.39 271.18,285 264.63,285C254.13,285 254.15,284.87 255,352.05C255.64,402.94 250.1,397.02 298.5,398.52C352.54,400.2 377.63,400.23 379.23,398.63C381.67,396.18 381.86,392.86 382.46,339.89C383.09,283.93 383.39,286 374.51,286C367.07,286 367.21,286.26 367.77,273.58C369.89,225.38 338.74,184.92 307.5,195.34M308.93,216.98C294.31,224.7 281.68,270.05 290.33,283.75C291.74,285.99 346.85,285.51 347.78,283.25C359.48,254.75 330.62,205.51 308.93,216.98M309.54,317.1C304.18,321.81 304.39,327.76 310.11,332.99C314.78,337.26 314.82,336.51 309.33,349.89C307.44,354.51 306.13,358.89 306.42,359.64C306.96,361.06 329,361.75 329,360.35C329,359.98 327.42,354.82 325.5,348.86C323.58,342.91 322,337.52 322,336.89C322,336.26 323.58,334 325.5,331.87C335.69,320.59 321.02,307.02 309.54,317.1"
android:strokeColor="#00000000" />
</group>
</vector>
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@color/ic_banner_background" />
<foreground android:drawable="@drawable/ic_banner_foreground" />
<background android:drawable="@color/ic_banner_background"/>
<foreground android:drawable="@mipmap/ic_banner_foreground"/>
</adaptive-icon>
@@ -1,4 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@color/ic_channel_background" />
<background android:drawable="@color/ic_channel_background"/>
<foreground android:drawable="@mipmap/ic_channel_foreground"/>
</adaptive-icon>
@@ -1,7 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@color/ic_launcher_background" />
<foreground android:drawable="@drawable/ic_launcher_foreground" />
<!-- support for adaptive theme icons -->
<monochrome android:drawable="@drawable/ic_launcher_foreground" />
<background android:drawable="@color/ic_launcher_background"/>
<foreground android:drawable="@mipmap/ic_launcher_foreground"/>
</adaptive-icon>
@@ -1,7 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@color/ic_launcher_background" />
<foreground android:drawable="@drawable/ic_launcher_foreground" />
<!-- support for adaptive theme icons -->
<monochrome android:drawable="@drawable/ic_launcher_foreground" />
<background android:drawable="@color/ic_launcher_background"/>
<foreground android:drawable="@mipmap/ic_launcher_foreground"/>
</adaptive-icon>
Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.0 KiB

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1000 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.5 KiB

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 796 B

After

Width:  |  Height:  |  Size: 916 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 672 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.2 KiB

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.7 KiB

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.4 KiB

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.4 KiB

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.5 KiB

After

Width:  |  Height:  |  Size: 5.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.1 KiB

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.4 KiB

After

Width:  |  Height:  |  Size: 7.8 KiB

+41 -15
View File
@@ -32,7 +32,6 @@
<string name="name">Name</string>
<string name="always_on_vpn_support">Always-On VPN erlauben</string>
<string name="location_services_not_detected">Standortdienste nicht erkannt</string>
<string name="hint_search_packages">Pakete suchen</string>
<string name="vpn_on">VPN an</string>
<string name="vpn_off">VPN aus</string>
<string name="create_import">Von Grund auf neu erstellen</string>
@@ -49,7 +48,6 @@
<string name="listen_port">Eingehender Port</string>
<string name="random">(zufällig)</string>
<string name="optional">(optional)</string>
<string name="optional_no_recommend">(Optional, nicht empfohlen)</string>
<string name="seconds">Sekunden</string>
<string name="cancel">Abbrechen</string>
<string name="preshared_key">Geteilter Schlüssel</string>
@@ -76,12 +74,9 @@
<string name="settings">Einstellungen</string>
<string name="support">Unterstützung</string>
<string name="error_authentication_failed">Authentifizierung fehlgeschlagen</string>
<string name="export_configs">Konfigurationen exportieren</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="error_invalid_code">Ungültiger QR Code</string>
<string name="tunneling_apps">Getunnelte Apps</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>
@@ -112,13 +107,11 @@
<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="chat_description">Tritt der Community bei</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="tunnel_required">Feature erfordert mindestens einen Tunnel</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>
@@ -130,7 +123,6 @@
<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="requires_app_relaunch">Diese Änderung erfordert einen Neustart der App. Möchten Sie fortfahren?</string>
<string name="use_root_shell_for_wifi">Root-Shell verwenden, um WLAN-Namen zu ermitteln</string>
<string name="light">Hell</string>
<string name="add_wifi_name">WLAN Namen hinzufügen</string>
@@ -176,9 +168,6 @@
<string name="post_up">Nach Aktivierung</string>
<string name="pre_down">Vor Deaktivierung</string>
<string name="post_down">Nach Deaktivierung</string>
<string name="amnezia_kernel_message">Amnezia nicht verfügbar im Kernel-Modus</string>
<string name="enable_amnezia">Amnezia aktivieren</string>
<string name="wg_compat_mode">Wireguard Kompatibilitätsmodus</string>
<string name="quick_actions">Schnellaktionen</string>
<string name="stop_on_internet_loss">Stoppen, wenn die Internetverbindung getrennt wird</string>
<string name="bypass_lan_for_kill_switch">LAN umgehen für Notschalter</string>
@@ -192,12 +181,49 @@
<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="error_tunnel_start">Start des Tunnels fehlgeschlagen</string>
<string name="auto_tunnel">Auto-Tunnel</string>
<string name="export_amnezia">Als Amnezia exportieren</string>
<string name="export_wireguard">Als WireGuard exportieren</string>
<string name="server_ipv4">IPv4 Hostnamensauflösung</string>
<string name="prefer_ipv4">IPv4 Verbindung bevorzugen</string>
<string name="start_failed_config">Starten des Tunnels wegen Konfigfehler fehlgeschlagen.</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="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>
<string name="app_permission_title">WG Tunnel Control Bridge</string>
<string name="active">Aktiv</string>
<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="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="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>
</resources>
-20
View File
@@ -42,7 +42,6 @@
<string name="name">Nombre</string>
<string name="always_on_vpn_support">Permitir VPN siempre-activada</string>
<string name="location_services_not_detected">Servicios de Ubicación No Detectados</string>
<string name="hint_search_packages">Buscar paquetes</string>
<string name="auto_tunneling">Túnel-automático</string>
<string name="vpn_on">VPN on</string>
<string name="vpn_off">VPN off</string>
@@ -52,13 +51,11 @@
<string name="comma_separated_list">lista separada por comas</string>
<string name="random">(aleatorio)</string>
<string name="optional">(opcional)</string>
<string name="optional_no_recommend">(opcional, no recomendado)</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="export_configs">Exportar configuración</string>
<string name="unknown_error">Error desconocido</string>
<string name="email_subject">Ayuda WG Tunnel</string>
<string name="interface_">Interfaz</string>
@@ -71,12 +68,10 @@
<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>
<string name="error_invalid_code">Código QR no valido</string>
<string name="auto_tunnel_title">Servicio de túnel-automático</string>
<string name="delete_tunnel">Eliminar túnel</string>
<string name="delete_tunnel_message">¿Estás seguro de que quieres eliminar este túnel?</string>
<string name="yes"></string>
<string name="tunneling_apps">Apps por el túnel</string>
<string name="no_email_detected">Ninguna app de email detectada</string>
<string name="no_browser_detected">Ningún navegador detectado</string>
<string name="open_issue">Abrir una incidencia</string>
@@ -115,8 +110,6 @@
<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="chat_description">Unirse a la comunidad</string>
<string name="tunnel_required">La función requiere al menos un túnel</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>
@@ -135,13 +128,11 @@
<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="on_demand_rules">Reglas del túnel bajo demanda</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="configuration_change">Cambio de configuración</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>
@@ -160,7 +151,6 @@
<string name="notifications">Notificaciones</string>
<string name="light">Claro</string>
<string name="dark">Oscuro</string>
<string name="requires_app_relaunch">Este cambio requiere un reinicio de la aplicación. ¿Desea continuar?</string>
<string name="use_root_shell_for_wifi">Utilizar el shell root para obtener el nombre del wifi</string>
<string name="tunnel_running">Túnel funcionando</string>
<string name="monitoring_state_changes">Monitorizando cambios de estado</string>
@@ -186,23 +176,13 @@
<string name="pre_up">Pre up</string>
<string name="post_up">Post up</string>
<string name="pre_down">Pre down</string>
<string name="amnezia_kernel_message">Amnezia no disponible en modo kernel</string>
<string name="post_down">Post down</string>
<string name="enable_amnezia">Activar Amnezia</string>
<string name="wg_compat_mode">Modo compatibilidad de WG</string>
<string name="quick_actions">Acciones rápidas</string>
<string name="remove_amnezia_compatibility">Eliminar compatibilidad con Amnezia</string>
<string name="error_tunnel_start">Fallo al iniciar el túnel</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="dns_error">No se ha podido resolver el DNS del punto final.</string>
<string name="start_failed_config">Fallo al iniciar túnel con error de configuración.</string>
<string name="unauthorized">Fallo al iniciar túnel, no autorizado.</string>
<string name="tunne_start_failed_title">Fallo del túnel</string>
<string name="multiple">Múltiple</string>
<string name="export_amnezia">Exportar cómo Amnezia</string>
<string name="export_wireguard">Exportar cómo WireGuard</string>
</resources>
+1 -9
View File
@@ -47,7 +47,6 @@
<string name="email_description">Lähetä minulle sähköpostia</string>
<string name="error_ssid_exists">SSID on jo luettelossa</string>
<string name="error_no_file_explorer">Tiedostonhallintasovellusta ei ole asennettuna</string>
<string name="error_invalid_code">Virheellinen QR-koodi</string>
<string name="location_services_missing_message">Sovellus ei tunnista laitteessasi käytössä olevia sijaintipalveluja. Laitteesta riippuen tämä voi aiheuttaa sen, että epäluotettava wlan-ominaisuus ei pysty lukemaan wlan-nimeä. Haluatko kuitenkin jatkaa?</string>
<string name="auto_tunnel_title">Automaattinen tunnelointipalvelu</string>
<string name="delete_tunnel">Poista tunneli</string>
@@ -70,16 +69,11 @@
<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="chat_description">Liity yhteisöön</string>
<string name="tunnel_required">Ominaisuus vaatii vähintään yhden tunnelin</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="requires_app_relaunch">Muutos edellyttää sovelluksen uudelleenkäynnistämistä. Haluatko jatkaa?</string>
<string name="add_from_clipboard">Lisää leikepöydältä</string>
<string name="ethernet_tunnel">Ethernet-tunneli</string>
<string name="enable_amnezia">Ota Amnezia käyttöön</string>
<string name="wg_compat_mode">WG-yhteensopivuustila</string>
<string name="quick_actions">Pikatoiminnot</string>
<string name="advanced_settings">Lisäasetukset</string>
<string name="hide_scripts">Piilota skriptit</string>
@@ -88,7 +82,6 @@
<string name="error_file_extension">Tiedosto ei ole .conf tai .zip-tiedosto</string>
<string name="tunnel_mobile_data">Tunneloi mobiilidatalla</string>
<string name="mtu">MTU</string>
<string name="optional_no_recommend">(valinnainen, ei suositeltu)</string>
<string name="preshared_key">Esijaettu avain</string>
<string name="all">kaikki</string>
<string name="never">ei koskaan</string>
@@ -96,7 +89,6 @@
<string name="set_ethernet_tunnel">Aseta ethernet-tunneliksi</string>
<string name="seconds">sekuntia</string>
<string name="cancel">Peruuta</string>
<string name="export_configs">Vie asetukset</string>
<string name="no_browser_detected">Selainta ei tunnistettu</string>
<string name="handshake">kädenpuristus</string>
<string name="light">Vaalea</string>
@@ -123,4 +115,4 @@
<string name="sec">sek</string>
<string name="read_logs">Lue lokitiedot</string>
<string name="mobile_tunnel">Mobiilidatatunneli</string>
</resources>
</resources>
+1 -14
View File
@@ -20,7 +20,6 @@
<string name="name">Nom</string>
<string name="always_on_vpn_support">Autoriser le VPN permanent</string>
<string name="location_services_not_detected">Services de localisation non détectés</string>
<string name="hint_search_packages">Rechercher des paquets</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>
@@ -47,7 +46,6 @@
<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="optional_no_recommend">(optionnel, non recommandé)</string>
<string name="persistent_keepalive">Keepalive persistant</string>
<string name="optional">(optionnel)</string>
<string name="preshared_key">Clé pré-partagée</string>
@@ -55,7 +53,6 @@
<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="export_configs">Exporter les configs</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>
@@ -67,7 +64,6 @@
<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="tunneling_apps">Applis de 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>
@@ -88,7 +84,6 @@
<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="tunnel_required">Cette fonctionnalité nécessite au moins un tunnel</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>
@@ -98,7 +93,6 @@
<string name="never">jamais</string>
<string name="handshake">handshake</string>
<string name="logs">Journaux</string>
<string name="error_invalid_code">Code QR invalide</string>
<string name="enabled_app_shortcuts">Activer les raccourcis</string>
<string name="unknown_error">Une erreur inconnue s\'est produite</string>
<string name="email_subject">Assistance WG Tunnel</string>
@@ -122,7 +116,6 @@
<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="chat_description">Rejoindre la communauté</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>
@@ -139,7 +132,6 @@
<string name="dark">Sombre</string>
<string name="dynamic">Dynamique</string>
<string name="language">Langue</string>
<string name="on_demand_rules">Règles de tunnel à la demande</string>
<string name="launch_app_settings">Ouvrir les paramètres de l\'appli</string>
<string name="display_theme">Thème d\'affichage</string>
<string name="trusted_wifi_names">Nom wifi approuvés</string>
@@ -156,10 +148,8 @@
<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="configuration_change">Configuration modifiée</string>
<string name="kernel_not_supported">Noyau non supporté</string>
<string name="start_auto">Démarrer l\'auto-tunnel</string>
<string name="requires_app_relaunch">Cette modification nécessite un redémarrage de l\'application. Voulez-vous continuer?</string>
<string name="exclude_lan">Exclure le LAN</string>
<string name="tunnel_specific_settings">Réglages spécifiques du tunnel</string>
<string name="show_scripts">Voir les scripts</string>
@@ -178,10 +168,7 @@
<string name="bypass_lan_for_kill_switch">Contourner le LAN en cas d\'arêt d\'urgence</string>
<string name="stop">arrêter</string>
<string name="splt_tunneling">Tunnel partagé</string>
<string name="amnezia_kernel_message">Amnezia n\'est pas disponible en mode noyau</string>
<string name="enable_amnezia">Activer Amnezia</string>
<string name="wg_compat_mode">Mode de compatibilité WG</string>
<string name="quick_actions">Actions rapides</string>
<string name="enable_amnezia_compatibility">Activer la prise en charge d\'Amnezia</string>
<string name="include_lan">Inclure le LAN</string>
</resources>
</resources>
-6
View File
@@ -33,14 +33,12 @@
<string name="listen_port">Dengarkan port</string>
<string name="random">(acak)</string>
<string name="optional">(opsional)</string>
<string name="optional_no_recommend">(opsional, tidak direkomendasikan)</string>
<string name="preshared_key">kunci Pre-shared</string>
<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="export_configs">Ekspor konfigurasi</string>
<string name="unknown_error">Terjadi kesalahan yang tidak diketahui</string>
<string name="tunnel_on_wifi">Tunnel di wifi yang tidak tepercaya</string>
<string name="email_subject">WG Tunnel Support</string>
@@ -51,11 +49,9 @@
<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>
<string name="error_invalid_code">Kode QR tidak valid</string>
<string name="location_services_missing_message">Aplikasi tidak mendeteksi layanan lokasi apa pun yang diaktifkan di perangkat Anda. Tergantung pada perangkatnya, hal ini dapat menyebabkan fitur wifi yang tidak tepercaya gagal membaca nama wifi. Apakah Anda ingin melanjutkan?</string>
<string name="auto_tunnel_title">Layanan Auto-tunnel</string>
<string name="yes">Ya</string>
<string name="tunneling_apps">Aplikasi tunneling</string>
<string name="incorrect_pin">Pin salah</string>
<string name="pin_created">Pin berhasil dibuat</string>
<string name="enter_pin">Masukkan pin Anda</string>
@@ -79,8 +75,6 @@
<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="chat_description">Bergabunglah dengan komunitas</string>
<string name="tunnel_required">Fitur membutuhkan setidaknya satu tunnel</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>
-7
View File
@@ -11,7 +11,6 @@
<string name="listen_port">Porta d\'ascolto</string>
<string name="error_authorization_failed">Autorizzazione fallita</string>
<string name="error_no_file_explorer">Nessun esploratore di file installato</string>
<string name="error_invalid_code">QR code non valido</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>
@@ -19,7 +18,6 @@
<string name="addresses">Indirizzi</string>
<string name="dns_servers">Server DNS</string>
<string name="enabled_app_shortcuts">Abilita le scorciatoie da app</string>
<string name="export_configs">Esporta configurazioni</string>
<string name="email_subject">Supporto di Tunnel WG</string>
<string name="email_chooser">Invia un email…</string>
<string name="docs_description">Read the docs</string>
@@ -29,7 +27,6 @@
<string name="mtu">MTU</string>
<string name="random">(casuale)</string>
<string name="optional">(opzionale)</string>
<string name="optional_no_recommend">(opzionale, non raccomandato)</string>
<string name="preshared_key">Chiave pre-condivisa</string>
<string name="error_authentication_failed">Autenticazione fallita</string>
<string name="tunnels">Tunnels</string>
@@ -40,7 +37,6 @@
<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="hint_search_packages">Cerca pacchetti</string>
<string name="auto_tunneling">Tunnel automatico</string>
<string name="vpn_on">VPN on</string>
<string name="vpn_off">VPN off</string>
@@ -64,7 +60,6 @@
<string name="unsure_how">se non sei sicuro di come procedere</string>
<string name="vpn_settings">Impostazioni sistema VPN</string>
<string name="always_on_message">Permessi connessione VPN negati. Verifica la</string>
<string name="chat_description">Unisciti alla community</string>
<string name="junk_packet_maximum_size">Dimensione massima pacchetti indesiderati</string>
<string name="delete_tunnel">Cancella tunnel</string>
<string name="init_packet_junk_size">Inizializza la dimensione dei pacchetti indesiderati</string>
@@ -102,7 +97,6 @@
<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="tunnel_required">Questa funzione richiede almeno un tunnel</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>
@@ -117,7 +111,6 @@
<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="tunneling_apps">App nel tunnel</string>
<string name="open_issue">Apri un problema</string>
<string name="enter_pin">Inserisci il tuo PIN</string>
<string name="create_pin">Crea PIN</string>
-3
View File
@@ -24,7 +24,6 @@
<string name="error_no_file_explorer">ファイルエクスプローラーはインストールされていません</string>
<string name="error_authorization_failed">認証に失敗しました</string>
<string name="enabled_app_shortcuts">アプリのショートカットを有効にする</string>
<string name="export_configs">設定のエクスポート</string>
<string name="location_services_missing_message">アプリがデバイスで有効になっている位置情報サービスを検出しません。 デバイスによっては、信頼されていない無線LAN機能がWiFi名を読み取れない可能性があります。このまま続けますか?</string>
<string name="no_email_detected">メールアプリは検出されません</string>
<string name="email_description">メールを送る</string>
@@ -36,7 +35,6 @@
<string name="add_tunnels_text">ファイルまたはzipから追加する</string>
<string name="open_file">ファイルを開く</string>
<string name="dns_servers">DNSサーバー</string>
<string name="optional_no_recommend">(オプション、非推奨)</string>
<string name="preshared_key">事前共有鍵</string>
<string name="delete_tunnel_message">このトンネルを削除しますか?</string>
<string name="yes">はい</string>
@@ -55,6 +53,5 @@
<string name="endpoint">エンドポイント</string>
<string name="turn_on_tunnel">実行に有効なVPNトンネルが必要です</string>
<string name="add_peer">ピアの追加</string>
<string name="error_invalid_code">無効なQRコード</string>
<string name="delete_tunnel">トンネルの削除</string>
</resources>
-7
View File
@@ -17,7 +17,6 @@
<string name="allowed_ips">Allowed IPs</string>
<string name="always_on_vpn_support">Altijd-aan VPN toestaan</string>
<string name="location_services_not_detected">Locatieservices niet gevonden</string>
<string name="hint_search_packages">Zoek apps</string>
<string name="endpoint">Endpoint</string>
<string name="name">Naam</string>
<string name="auto_tunneling">Auto-tunnelen</string>
@@ -26,7 +25,6 @@
<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="export_configs">Configs exporteren</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>
@@ -51,11 +49,9 @@
<string name="base64_key">Base64 sleutel</string>
<string name="optional">(optioneel)</string>
<string name="cancel">Annuleren</string>
<string name="optional_no_recommend">(optioneel, niet aanbevolen)</string>
<string name="listen_port">Luisterpoort</string>
<string name="preshared_key">Pre-shared key</string>
<string name="auto_tunnel_title">Auto-tunnel service</string>
<string name="error_invalid_code">Ongeldige QR code</string>
<string name="open_issue">Open een melding</string>
<string name="create_pin">Stel PIN in</string>
<string name="enable_app_lock">Schakel app-lock in</string>
@@ -75,7 +71,6 @@
<string name="settings">Instellingen</string>
<string name="support">Ondersteuning</string>
<string name="junk_packet_minimum_size">Junk packet minimum grootte</string>
<string name="tunneling_apps">Tunnel apps</string>
<string name="all">alle</string>
<string name="no_browser_detected">Geen browser gevonden</string>
<string name="kernel">Kernel</string>
@@ -89,7 +84,6 @@
<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="chat_description">Wordt lid van de community</string>
<string name="prominent_background_location_title">Achtergrondlocatievrijgave</string>
<string name="unknown_error">Onbekende fout opgetreden</string>
<string name="email_subject">WG Tunnel ondersteuning</string>
@@ -119,7 +113,6 @@
<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="tunnel_required">Functie vereist tenminste één tunnel</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>
+44 -23
View File
@@ -12,17 +12,16 @@
<string name="addresses">Adresy</string>
<string name="mtu">MTU</string>
<string name="auto_tunneling">Autotunelowanie</string>
<string name="vpn_on">VPN włączono</string>
<string name="vpn_off">VPN wyłączono</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>
<string name="tunnel_mobile_data">Tunel przez mobilną transmisję danych</string>
<string name="hint_search_packages">Wyszukaj pakiety</string>
<string name="random">(losowy)</string>
<string name="pin_created">Kod PIN został pomyślnie utworzony</string>
<string name="enter_pin">Podaj swój kod PIN</string>
<string name="enter_pin">Podaj kod PIN</string>
<string name="enable_app_lock">Włącz blokadę aplikacji</string>
<string name="response_packet_junk_size">Rozmiar śmieciowego pakietu odpowiedzi</string>
<string name="response_packet_magic_header">Nagłówek magicznego pakietu odpowiedzi</string>
@@ -38,27 +37,21 @@
<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>
<string name="optional">(opcjonalnie)</string>
<string name="optional_no_recommend">(opcjonalnie, niezalecane)</string>
<string name="preshared_key">Klucz wstępnie udostępniony</string>
<string name="location_services_missing_message">Aplikacja nie wykrywa żadnych usług lokalizacyjnych włączonych na tym urządzeniu. W zależności od urządzenia może to spowodować, że funkcja niezaufanej sieci Wi-Fi nie będzie w stanie odczytać nazwy sieci Wi-Fi. Czy chcesz kontynuować mimo to?</string>
<string name="read_logs">Przeczytaj dzienniki</string>
<string name="support">Obsługa</string>
<string name="init_packet_magic_header">Nagłówek magicznego pakietu początkowego</string>
<string name="chat_description">Dołącz do społeczności</string>
<string name="cancel">Anuluj</string>
<string name="always_on_message2">w celu upewnienia się, że funkcja stałego VPN jest wyłączona dla wszystkich innych aplikacji, następnie spróbuj ponownie</string>
<string name="requires_app_relaunch">Ta zmiana wymaga ponownego uruchomienia aplikacji. Czy chcesz kontynuować?</string>
<string name="use_tunnel_on_wifi_name">Użyj tunelu na nazwę sieci Wi-Fi</string>
<string name="root_accepted">Zezwolono na powłokę użytkownika root</string>
<string name="tunneling_apps">Aplikacje tunelujące</string>
<string name="vpn_channel_name">Kanał powiadomień VPN</string>
<string name="create_import">Utwórz od nowa</string>
<string name="error_invalid_code">Nieprawidłowy kod QR</string>
<string name="always_on_message">Zezwolenie na połączenie VPN zostało odrzucone. Sprawdź</string>
<string name="persistent_keepalive">Trwałe utrzymywanie połączenia</string>
<string name="vpn_settings">Ustawienia systemowe VPN</string>
<string name="no_browser_detected">Nie wykryto przeglądarki</string>
<string name="configuration_change">Zmiana konfiguracji</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>
@@ -68,7 +61,6 @@
<string name="tunnel_on_wifi">Tunel przez niezaufaną sieć Wi-Fi</string>
<string name="dns_servers">Serwery DNS</string>
<string name="error_file_extension">Plik nie jest w formacie .conf lub .zip</string>
<string name="export_configs">Eksportuj konfiguracje</string>
<string name="copy_public_key">Skopiuj klucz publiczny</string>
<string name="restart_on_ping">Uruchom ponownie w przypadku niepowodzenia pingowania (beta)</string>
<string name="junk_packet_minimum_size">Minimalny rozmiar pakietu śmieciowego</string>
@@ -120,7 +112,6 @@
<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="tunnel_required">Funkcja wymaga co najmniej jednego tunelu</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>
@@ -138,7 +129,6 @@
<string name="display_theme">Motyw wyświetlania</string>
<string name="trusted_wifi_names">Nazwy zaufanych sieci Wi-Fi</string>
<string name="add_wifi_name">Dodaj nazwę sieci Wi-Fi</string>
<string name="on_demand_rules">Zasady korzystania z tunelu na żądanie</string>
<string name="primary_tunnel">Tunel podstawowy</string>
<string name="mobile_tunnel">Tunel mobilnej transmisji danych</string>
<string name="skip">Pomiń</string>
@@ -177,9 +167,6 @@
<string name="post_up">Po aktywacji</string>
<string name="pre_down">Przed dezaktywacją</string>
<string name="post_down">Po dezaktywacji</string>
<string name="amnezia_kernel_message">Protokół Amnezia niedostępny w trybie jądra</string>
<string name="enable_amnezia">Włącz protokół Amnezia</string>
<string name="wg_compat_mode">Tryb zgodności WG</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>
@@ -193,17 +180,51 @@
<string name="include_lan">Uwzględnij LAN</string>
<string name="advanced_settings">Ustawienia zaawansowane</string>
<string name="hide_amnezia_properties">Ukryj właściwości protokołu Amnezia</string>
<string name="error_tunnel_start">Nie udało się uruchomić tunelu</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="unauthorized">Nie udało się uruchomić tunelu, brak autoryzacji.</string>
<string name="multiple">Wiele</string>
<string name="start_failed_config">Nie udało się uruchomić tunelu z powodu błędu konfiguracji.</string>
<string name="tunne_start_failed_title">Awaria tunelu</string>
<string name="dns_error">Nie udało się rozpoznać punktu końcowego DNS.</string>
<string name="export_amnezia">Eksportuj jako Amnezia</string>
<string name="export_wireguard">Eksportuj jako WireGuard</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="add_from_url">Dodaj z adresu URL</string>
<string name="export_failed">Eksport nie powiódł się</string>
<string name="inactive">Nieaktywny</string>
<string name="wifi_name_template">Aktywna: %1$s</string>
<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="app_permission_title">Mostek sterujący WG Tunnel</string>
<string name="enter_config_url">Wpisz adres URL konfiguracji</string>
<string name="save">Zapisz</string>
<string name="search">Szukaj</string>
<string name="join_matrix">Dołącz do społeczności Matriksa</string>
<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 pozwolenie 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="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="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>
</resources>
+1 -14
View File
@@ -10,12 +10,9 @@
<string name="rotate_keys">Revezar chaves</string>
<string name="private_key">Chave privada</string>
<string name="base64_key">Chave base64</string>
<string name="optional_no_recommend">(opcional, não recomendado)</string>
<string name="preshared_key">Chave pré-partilhada</string>
<string name="seconds">segundos</string>
<string name="export_configs">Exportar configurações</string>
<string name="error_no_file_explorer">Nenhum explorador de ficheiros instalado</string>
<string name="error_invalid_code">Código QR inválido</string>
<string name="auto_tunnel_title">Serviço de Auto-túnel</string>
<string name="all">todos</string>
<string name="enter_pin">Digite o seu pin</string>
@@ -52,7 +49,6 @@
<string name="allowed_ips">IPs Permitidos</string>
<string name="peer">Par</string>
<string name="location_services_not_detected">Serviço de localização não foi detetado</string>
<string name="hint_search_packages">Procurar pacotes</string>
<string name="auto_tunneling">Auto-túnel</string>
<string name="vpn_on">VPN ligada</string>
<string name="vpn_off">VPN desligada</string>
@@ -83,7 +79,6 @@
<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>
<string name="open_issue">Abrir um problema</string>
<string name="tunneling_apps">Aplicações com túnel</string>
<string name="no_email_detected">Nenhuma aplicação de email detetado</string>
<string name="no_browser_detected">Nenhum navegador detetado</string>
<string name="incorrect_pin">O Pin está errado</string>
@@ -107,8 +102,6 @@
<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="chat_description">Junte-se à comunidade</string>
<string name="tunnel_required">Característica requer pelo menos um túnel</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>
@@ -130,12 +123,10 @@
<string name="language">Idioma</string>
<string name="add_wifi_name">Adicionar nome Wi-Fi</string>
<string name="display_theme">Tema</string>
<string name="on_demand_rules">Regras de tunelamento sob demanda</string>
<string name="dark">Escuro</string>
<string name="dynamic">Dinâmico</string>
<string name="skip">Pular</string>
<string name="mobile_tunnel">Túnel com dados móveis</string>
<string name="requires_app_relaunch">Para aplicar as mudanças é necessário reiniciar o aplicativo. Deseja prosseguir ?</string>
<string name="add_from_clipboard">Adicionar da área de transferência</string>
<string name="restart_at_boot">Ativar na inicialização</string>
<string name="appearance">Aparência</string>
@@ -153,7 +144,6 @@
<string name="donate">Contribua com esse projeto</string>
<string name="local_logging">Registro local</string>
<string name="enable_local_logging">Ativar registro local</string>
<string name="configuration_change">Configuração alterada</string>
<string name="stop_on_no_internet">Interromper quando não há internet</string>
<string name="stop_on_internet_loss">Interrompa o túnel quando a internet não estiver disponível</string>
<string name="ethernet_tunnel">Túnel ethernet</string>
@@ -167,11 +157,8 @@
<string name="stop">pausar</string>
<string name="tunnel_specific_settings">Configurações específicas no túnel</string>
<string name="show_scripts">Mostrar scripts</string>
<string name="amnezia_kernel_message">Amnezia indisponível no kernel</string>
<string name="enable_amnezia">Ativar Amnezia</string>
<string name="wg_compat_mode">Modo de compatibilidade WG</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>
</resources>
+50 -10
View File
@@ -1,14 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="error_authorization_failed">Autorização falhou</string>
<string name="export_configs">Exportar configurações</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="chat_description">Junte-se à comunidade</string>
<string name="tunnel_required">Característica requer pelo menos um túnel</string>
<string name="background_location_message2">para garantir que essas permissões estejam ativadas.</string>
<string name="optional_no_recommend">(opcional, não recomendado)</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>
@@ -39,10 +35,8 @@
<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="hint_search_packages">Procurar pacotes</string>
<string name="delete_tunnel_message">Tem certeza que quer apagar este túnel?</string>
<string name="yes">Sim</string>
<string name="tunneling_apps">Aplicações com túnel</string>
<string name="all">todos</string>
<string name="auto">(automático)</string>
<string name="pin_created">Pin criado com sucesso</string>
@@ -63,7 +57,7 @@
<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="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>
@@ -88,12 +82,11 @@
<string name="init_packet_junk_size">Tamanho de pacote-lixo inicial</string>
<string name="vpn_denied_dialog_title">Permissão negada</string>
<string name="vpn_settings">Configurações do sistema VPN</string>
<string name="error_invalid_code">Código QR inválido</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>
<string name="auto_tunnel_title">Serviço de Auto-túnel</string>
<string name="error_no_file_explorer">Nenhum explorador de ficheiros instalado</string>
<string name="app_name">WG Tunnel</string>
<string name="vpn_channel_name">Canal de notificações VPN</string>
<string name="vpn_channel_name">Canal de notificações VPN</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="trusted_ssid_value_description">Envie o SSID</string>
<string name="add_tunnels_text">Adicionar a partir de ficheiro ou zip</string>
@@ -121,5 +114,52 @@
<string name="see_the">Veja o</string>
<string name="getting_started_guide">guia de início rápido</string>
<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">Reiniciar no arranque</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>
<string name="use_wildcards">Usar nomes coringas</string>
<string name="add_wifi_name">Adicionar nome Wi-Fi</string>
<string name="stop_auto">Pausar túnel automático</string>
<string name="tunnel_running">Túnel em execução</string>
<string name="stop_on_no_internet">Interromper quando não há internet</string>
<string name="exclude_lan">Excluir LAN</string>
<string name="local_logging">Registo local</string>
<string name="dynamic">Dinâmico</string>
<string name="light">Claro</string>
<string name="dark">Escuro</string>
<string name="quick_actions">Ações rápidas</string>
<string name="appearance">Aparência</string>
<string name="automatic">Automático</string>
<string name="language">Idioma</string>
<string name="display_theme">Tema</string>
<string name="enable_local_logging">Ativar registo local</string>
<string name="mobile_tunnel">Túnel com dados móveis</string>
<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>
<string name="add_from_clipboard">Adicionar da área de transferência</string>
<string name="stop_on_internet_loss">Interrompa o túnel quando a internet não estiver disponível</string>
<string name="ethernet_tunnel">Túnel ethernet</string>
<string name="set_ethernet_tunnel">Definir como túnel ethernet</string>
<string name="stop">pausar</string>
<string name="splt_tunneling">Tunelamento dividido</string>
<string name="tunnel_specific_settings">Configurações específicas no túnel</string>
<string name="show_scripts">Mostrar scripts</string>
<string name="advanced_settings">Configurações avançadas</string>
<string name="hide_amnezia_properties">Ocultar propriedades Amnezia</string>
<string name="hide_scripts">Ocultar scripts</string>
<string name="enable_amnezia_compatibility">Ativar compatibilidade Amnezia</string>
<string name="remove_amnezia_compatibility">Remover compatibilidade Amnezia</string>
<string name="include_lan">Incluir LAN</string>
</resources>
+163
View File
@@ -0,0 +1,163 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="tunnel_name">Nome do Túnel</string>
<string name="exclude">Excluir</string>
<string name="include">Incluir</string>
<string name="config_changes_saved">Mudanças nas configurações gravadas.</string>
<string name="public_key">Chave pública</string>
<string name="app_name">WG Tunnel</string>
<string name="vpn_channel_name">Canal de notificações VPN</string>
<string name="error_file_extension">O ficheiro não é .conf ou .zip</string>
<string name="turn_off_tunnel">Esta ação só é possível com o túnel inativo</string>
<string name="no_tunnels">Nenhum túnel foi adicionado!</string>
<string name="tunnels">Túneis</string>
<string name="tunnel_mobile_data">Túnel em dados móveis</string>
<string name="privacy_policy">Ver a Política de Privacidade</string>
<string name="okay">OK</string>
<string name="tunnel_on_ethernet">Túnel na ethernet</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="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="add_tunnels_text">Adicionar a partir de ficheiro ou zip</string>
<string name="open_file">Abrir Ficheiro</string>
<string name="add_from_qr">Adicionar a partir de código QR</string>
<string name="qr_scan">Escanear o código QR</string>
<string name="addresses">Endereços</string>
<string name="dns_servers">Servidores DNS</string>
<string name="mtu">MTU</string>
<string name="peer">Par</string>
<string name="allowed_ips">IPs Permitidos</string>
<string name="name">Nome</string>
<string name="always_on_vpn_support">Permitir VPN sempre ligada</string>
<string name="location_services_not_detected">Serviço de localização não foi detetado</string>
<string name="auto_tunneling">Auto-túnel</string>
<string name="vpn_on">VPN ligada</string>
<string name="vpn_off">VPN desligada</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="add_peer">Adicionar par</string>
<string name="interface_">Interface</string>
<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="base64_key">Chave base64</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="optional">(opcional)</string>
<string name="preshared_key">Chave pré-partilhada</string>
<string name="seconds">segundos</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="enabled_app_shortcuts">Ativar atalhos de aplicações</string>
<string name="unknown_error">Ocorreu um erro desconhecido</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="docs_description">Ler a documentação</string>
<string name="email_description">Me envie um email</string>
<string name="use_kernel">Usar o módulo do kernel</string>
<string name="error_ssid_exists">SSID já existe</string>
<string name="error_root_denied">Shell Root negado</string>
<string name="error_no_file_explorer">Nenhum explorador de ficheiros instalado</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>
<string name="auto_tunnel_title">Serviço de Auto-túnel</string>
<string name="delete_tunnel">Apagar túnel</string>
<string name="delete_tunnel_message">Tem certeza que quer apagar este túnel?</string>
<string name="yes">Sim</string>
<string name="all">todos</string>
<string name="no_email_detected">Nenhuma aplicação de email detetado</string>
<string name="no_browser_detected">Nenhum navegador detetado</string>
<string name="open_issue">Abrir um problema</string>
<string name="read_logs">Ler os registos</string>
<string name="auto">(automático)</string>
<string name="incorrect_pin">O Pin está errado</string>
<string name="pin_created">Pin criado com sucesso</string>
<string name="enter_pin">Digite o seu pin</string>
<string name="create_pin">Criar um pin</string>
<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="mobile_data_tunnel">Selecionar como túnel em dados móveis</string>
<string name="set_primary_tunnel">Selecionar como túnel principal</string>
<string name="use_tunnel_on_wifi_name">Usar túnel em wifi com nome</string>
<string name="edit_tunnel">Editar túnel</string>
<string name="version">Versão</string>
<string name="settings">Configurações</string>
<string name="support">Suporte</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="junk_packet_maximum_size">Tamanho máximo de pacote-lixo</string>
<string name="init_packet_junk_size">Tamanho de pacote-lixo inicial</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="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="restart_at_boot">Ativar na inicialização</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="always_on_message2">para ter certeza que VPN Sempre-ligada é desligada para todas as outras aplicações e tente novamente</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="appearance">Aparência</string>
<string name="notifications">Notificações</string>
<string name="automatic">Automático</string>
<string name="light">Claro</string>
<string name="dark">Escuro</string>
<string name="dynamic">Dinâmico</string>
<string name="language">Idioma</string>
<string name="display_theme">Tema</string>
<string name="trusted_wifi_names">Nomes de Wi-Fi confiáveis</string>
<string name="add_wifi_name">Adicionar nome Wi-Fi</string>
<string name="mobile_tunnel">Túnel com dados móveis</string>
<string name="skip">Pular</string>
<string name="use_wildcards">Usar nomes coringas</string>
<string name="learn_more">Saber mais</string>
<string name="wildcards_active">Wildcards ativos</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="kernel_not_supported">Kernel não suportado</string>
<string name="start_auto">Iniciar túnel automático</string>
<string name="stop_auto">Pausar túnel automático</string>
<string name="tunnel_running">Túnel em execução</string>
<string name="monitoring_state_changes">Monitorar estado de alterações</string>
<string name="donate">Contribua com projeto</string>
<string name="local_logging">Registo local</string>
<string name="enable_local_logging">Ativar registo local</string>
<string name="add_from_clipboard">Adicionar da área de transferência</string>
<string name="stop_on_no_internet">Interromper quando não há internet</string>
<string name="stop_on_internet_loss">Interrompa o túnel quando a internet não estiver disponível</string>
<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="stop">pausar</string>
<string name="splt_tunneling">Tunelamento dividido</string>
<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="advanced_settings">Configurações avançadas</string>
<string name="hide_amnezia_properties">Ocultar propriedades Amnezia</string>
<string name="hide_scripts">Ocultar scripts</string>
<string name="enable_amnezia_compatibility">Ativar compatibilidade Amnezia</string>
<string name="remove_amnezia_compatibility">Remover compatibilidade Amnezia</string>
<string name="exclude_lan">Excluir LAN</string>
<string name="include_lan">Incluir LAN</string>
</resources>
+42 -21
View File
@@ -20,13 +20,10 @@
<string name="allowed_ips">Разрешённые IP</string>
<string name="endpoint">Конечная точка</string>
<string name="always_on_vpn_support">Разрешить постоянный VPN</string>
<string name="hint_search_packages">Поиск приложений</string>
<string name="vpn_on">VPN вкл.</string>
<string name="vpn_off">VPN откл.</string>
<string name="interface_">Интерфейс</string>
<string name="optional">(необязательно)</string>
<string name="optional_no_recommend">(необязательно, не рекомендуется)</string>
<string name="tunneling_apps">Туннелируемые приложения</string>
<string name="all">все</string>
<string name="no_email_detected">Приложение для отправки почты не найдено</string>
<string name="enter_pin">Введите PIN-код</string>
@@ -72,8 +69,6 @@
<string name="seconds">секунд</string>
<string name="persistent_keepalive">Поддержание работы туннеля (keepalive)</string>
<string name="error_authentication_failed">Сбой аутентификации</string>
<string name="export_configs">Экспорт конфигурации</string>
<string name="error_invalid_code">Некорректный QR-код</string>
<string name="location_services_missing_message">Приложение не обнаружило сервис местоположения на вашем устройстве. На некоторых устройствах это может привести к невозможности определения имени сети Wi-Fi и сбою функции недоверенной сети. Всё равно продолжить?</string>
<string name="error_ssid_exists">SSID уже существует</string>
<string name="error_root_denied">Root-доступ запрещён</string>
@@ -110,7 +105,6 @@
<string name="root_accepted">Root-доступ разрешён</string>
<string name="always_on_message">Разрешение на VPN-соединение было отклонено, проверьте</string>
<string name="set_custom_ping_cooldown">Время ожидания перезапуска пинга (сек.)</string>
<string name="tunnel_required">Для этой функции необходим хотя бы один туннель</string>
<string name="restart_at_boot">Перезапуск при загрузке</string>
<string name="default_ping_ip">(необязательно, по умолчанию для пиров)</string>
<string name="app_settings">настройки приложения</string>
@@ -118,7 +112,6 @@
<string name="always_on_message2">, чтобы убедиться, что функция «Постоянный VPN» отключена для всех других приложений, и повторите попытку</string>
<string name="background_location_message">Разрешать всё время, пока для работы этой функции требуется доступ на определение местоположения и/или точное местоположение. Смотрите</string>
<string name="vpn_settings">Системные настройки VPN</string>
<string name="chat_description">Присоединиться к сообществу</string>
<string name="vpn_denied_dialog_title">Нет разрешения</string>
<string name="set_custom_ping_internal">Интервал пинга (сек.)</string>
<string name="optional_default">"необязательно, по умолчанию: "</string>
@@ -126,7 +119,7 @@
<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>
@@ -137,12 +130,10 @@
<string name="mobile_tunnel">Туннель для мобильных данных</string>
<string name="learn_more">Узнать больше</string>
<string name="kernel_not_supported">Ядро не поддерживается</string>
<string name="requires_app_relaunch">Данное изменение требует перезапуска приложения. Продолжить?</string>
<string name="stop_auto">Остановить автотуннель</string>
<string name="donate">Пожертвовать на проект</string>
<string name="local_logging">Локальное ведение журнала</string>
<string name="wildcards_active">Подстановочные знаки используются</string>
<string name="configuration_change">Изменение конфигурации</string>
<string name="skip">Пропустить</string>
<string name="use_wildcards">Использовать подстановочные знаки в имени</string>
<string name="appearance">Внешний вид</string>
@@ -152,7 +143,6 @@
<string name="display_theme">Тема</string>
<string name="add_wifi_name">Добавить сеть Wi-Fi</string>
<string name="launch_app_settings">Настройки запуска приложения</string>
<string name="on_demand_rules">Правила туннеля по запросу</string>
<string name="use_root_shell_for_wifi">Использовать root-доступ для получения имени сети Wi-Fi</string>
<string name="wifi_name_via_shell">Имя Wi-Fi через root</string>
<string name="start_auto">Запустить автотуннель</string>
@@ -162,9 +152,6 @@
<string name="add_from_clipboard">Добавить из буфера обмена</string>
<string name="auto_tunnel_channel_name">Канал уведомлений автотуннеля</string>
<string name="show_scripts">Показать сценарии</string>
<string name="amnezia_kernel_message">Amnezia недоступна в режиме ядра</string>
<string name="enable_amnezia">Использовать Amnezia</string>
<string name="wg_compat_mode">Режим совместимости WG</string>
<string name="quick_actions">Быстрые действия</string>
<string name="stop_on_no_internet">Остановить без интернета</string>
<string name="stop_on_internet_loss">Остановить туннель при потере интернета</string>
@@ -194,15 +181,49 @@
<string name="include_lan">Включить LAN</string>
<string name="auto_tunnel">Автотуннель</string>
<string name="tunnel_control">Управление туннелем</string>
<string name="error_tunnel_start">Невозможно запустить туннель</string>
<string name="kill_switch_off">Без экстренного отключения в доверенных</string>
<string name="prefer_ipv4">Предпочитать соединение IPv4</string>
<string name="dns_error">Не получить конечную точку DNS.</string>
<string name="start_failed_config">Невозможно запустить туннель с ошибкой конфигурации.</string>
<string name="unauthorized">Невозможно запустить туннель без авторизации.</string>
<string name="tunne_start_failed_title">Ошибка туннеля</string>
<string name="server_ipv4">Получать имя узла IPv4</string>
<string name="multiple">Несколько</string>
<string name="export_amnezia">Экспортировать как Amnezia</string>
<string name="export_wireguard">Экспортировать как WireGuard</string>
<string name="config_error">ошибка конфигурации</string>
<string name="active">Активный</string>
<string name="bio_subtitle">Вход по биометрическим данным</string>
<string name="export_logs">Экспорт журналов</string>
<string name="delete_logs">Удалить журналы</string>
<string name="app_permission_title">Центр управления WG Tunnel</string>
<string name="search">Поиск</string>
<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="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="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>
<string name="select">Выбор</string>
<string name="dropdown">Выпадающий список</string>
<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="save">Сохранить</string>
<string name="bio_update_required">Требуется обновление безопасности биометрии</string>
<string name="auth_error">не выполнена авторизация</string>
<string name="tunnel_starting">Запуск туннеля</string>
<string name="copy">Копировать</string>
<string name="delete">Удалить</string>
<string name="export_failed">Экспорт не выполнен</string>
<string name="export_tunnels_wireguard">Экспорт туннелей как WireGuard</string>
<string name="enable_remote_app_control">Удалённое управление приложением</string>
<string name="error_download_failed">Невозможно скачать конфигурацию</string>
</resources>
-20
View File
@@ -4,7 +4,6 @@
<string name="private_key">தனிப்பட்ட விசை</string>
<string name="delete_tunnel_message">இந்த சுரங்கப்பாதையை நீக்க விரும்புகிறீர்களா?</string>
<string name="add_from_qr">QR குறியீட்டிலிருந்து சேர்க்கவும்</string>
<string name="tunneling_apps">சுரங்கப்பாதை பயன்பாடுகள்</string>
<string name="error_file_format">தவறான சுரங்கப்பாதை கட்டமைப்பு வடிவம்</string>
<string name="vpn_on">Vpn on</string>
<string name="exclude">விலக்கு</string>
@@ -42,7 +41,6 @@
<string name="error_authentication_failed">ஏற்பு தோல்வியடைந்தது</string>
<string name="error_authorization_failed">அங்கீகரிக்கத் தவறிவிட்டது</string>
<string name="enabled_app_shortcuts">பயன்பாட்டு குறுக்குவழிகளை இயக்கவும்</string>
<string name="export_configs">ஏற்றுமதி உள்ளமைவுகள்</string>
<string name="unknown_error">தெரியாத பிழை ஏற்பட்டது</string>
<string name="tunnel_on_wifi">நம்பத்தகாத வைஃபை மீது சுரங்கப்பாதை</string>
<string name="email_subject">WG சுரங்கப்பாதை உதவி</string>
@@ -106,7 +104,6 @@
<string name="display_theme">கருப்பொருள் காட்சி</string>
<string name="trusted_wifi_names">நம்பகமான வைஃபை பெயர்கள்</string>
<string name="add_wifi_name">வைஃபை பெயரைச் சேர்க்கவும்</string>
<string name="on_demand_rules">தேவை சுரங்கப்பாதை விதிகள்</string>
<string name="primary_tunnel">முதன்மை சுரங்கப்பாதை</string>
<string name="mobile_tunnel">மொபைல் தரவு சுரங்கப்பாதை</string>
<string name="skip">தவிர்</string>
@@ -124,8 +121,6 @@
<string name="donate">திட்டத்திற்கு நன்கொடை</string>
<string name="local_logging">உள்ளூர்வாசிகள்</string>
<string name="enable_local_logging">உள்ளக பதிவுகளை இயக்கவும்</string>
<string name="configuration_change">உள்ளமைவு மாற்றம்</string>
<string name="requires_app_relaunch">இந்த மாற்றத்திற்கு பயன்பாட்டு மறுதொடக்கம் தேவைப்படுகிறது. நீங்கள் தொடர விரும்புகிறீர்களா?</string>
<string name="add_from_clipboard">கிளிப்போர்டில் இருந்து சேர்க்கவும்</string>
<string name="stop_on_no_internet">இணையத்தில் நிறுத்துங்கள்</string>
<string name="stop_on_internet_loss">இணைய இழப்பில் சுரங்கப்பாதையை நிறுத்துங்கள்</string>
@@ -145,9 +140,6 @@
<string name="post_up">இடுகை</string>
<string name="pre_down">முன்</string>
<string name="post_down">இடுகை</string>
<string name="amnezia_kernel_message">கர்னல் பயன்முறையில் அம்னேசியா கிடைக்கவில்லை</string>
<string name="enable_amnezia">அம்னேசியாவை இயக்கவும்</string>
<string name="wg_compat_mode">Wg பொருந்தக்கூடிய பயன்முறை</string>
<string name="hide_scripts">ச்கிரிப்ட்களை மறைக்கவும்</string>
<string name="enable_amnezia_compatibility">அம்னேசியா பொருந்தக்கூடிய தன்மையை இயக்கவும்</string>
<string name="debounce_delay">நேரந்தவறுகை</string>
@@ -155,7 +147,6 @@
<string name="remove_amnezia_compatibility">அம்னேசியா பொருந்தக்கூடிய தன்மையை அகற்று</string>
<string name="exclude_lan">லானை விலக்கு</string>
<string name="include_lan">லேன் சேர்க்கவும்</string>
<string name="error_tunnel_start">சுரங்கப்பாதை தொடங்குவதில் தோல்வி</string>
<string name="tunnel_control">சுரங்கப்பாதை கட்டுப்பாடு</string>
<string name="auto_tunnel">ஆட்டோ-டன்ரல்</string>
<string name="prominent_background_location_message">பயன்பாடு மூடப்பட்டிருந்தாலும் கூட வைஃபை எச்எச்ஐடி கண்காணிப்பை இயக்க இந்த அம்சத்திற்கு பின்னணி இருப்பிட இசைவு தேவைப்படுகிறது. மேலும் விவரங்களுக்கு, உதவி திரையில் இணைக்கப்பட்ட தனியுரிமைக் கொள்கையைப் பார்க்கவும்.</string>
@@ -168,18 +159,15 @@
<string name="peer">ஒப்பி</string>
<string name="always_on_vpn_support">எப்போதும் VPN ஐ அனுமதிக்கவும்</string>
<string name="location_services_not_detected">இருப்பிட சேவைகள் கண்டறியப்படவில்லை</string>
<string name="hint_search_packages">தொகுப்புகளைத் தேடுங்கள்</string>
<string name="turn_on_tunnel">செயலுக்கு செயலில் சுரங்கப்பாதை தேவை</string>
<string name="interface_">இடைமுகம்</string>
<string name="rotate_keys">விசைகளை சுழற்றுங்கள்</string>
<string name="seconds">நொடிகள்</string>
<string name="random">(சீரற்ற)</string>
<string name="optional">(விரும்பினால்)</string>
<string name="optional_no_recommend">(விரும்பினால், பரிந்துரைக்கப்படவில்லை)</string>
<string name="preshared_key">முன் பகிரப்பட்ட விசை</string>
<string name="email_description">எனக்கு மின்னஞ்சல் அனுப்புங்கள்</string>
<string name="use_kernel">கர்னல் தொகுதியைப் பயன்படுத்தவும்</string>
<string name="error_invalid_code">தவறான QR குறியீடு</string>
<string name="location_services_missing_message">உங்கள் சாதனத்தில் இயக்கப்பட்ட எந்த இருப்பிட சேவைகளையும் பயன்பாடு கண்டறியவில்லை. சாதனத்தைப் பொறுத்து, இது நம்பத்தகாத வைஃபை அம்சத்தை வைஃபை பெயரைப் படிக்கத் தவறிவிடும். எப்படியும் தொடர விரும்புகிறீர்களா?</string>
<string name="auto_tunnel_title">ஆட்டோ-டன்னல் பணி</string>
<string name="delete_tunnel">சுரங்கப்பாதையை நீக்கு</string>
@@ -188,19 +176,11 @@
<string name="set_primary_tunnel">முதன்மை சுரங்கப்பாதையாக அமைக்கவும்</string>
<string name="use_tunnel_on_wifi_name">வைஃபை பெயரில் சுரங்கப்பாதை பயன்படுத்தவும்</string>
<string name="edit_tunnel">சுரங்கப்பாதை திருத்து</string>
<string name="chat_description">சமூகத்தில் சேரவும்</string>
<string name="tunnel_required">அம்சத்திற்கு குறைந்தது ஒரு சுரங்கப்பாதை தேவைப்படுகிறது</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="dns_error">எண்ட்பாயிண்ட் டி.என்.எச்.</string>
<string name="start_failed_config">கட்டமைப்பு பிழையுடன் சுரங்கப்பாதையைத் தொடங்குவதில் தோல்வி.</string>
<string name="unauthorized">சுரங்கப்பாதை தொடங்குவதில் தோல்வி, அங்கீகரிக்கப்படாதது.</string>
<string name="tunne_start_failed_title">சுரங்கப்பாதை தோல்வி</string>
<string name="export_amnezia">மறதி நோயாக ஏற்றுமதி</string>
<string name="export_wireguard">வயர் கார்டாக ஏற்றுமதி</string>
<string name="server_ipv4">ஐபிவி 4 ஓச்ட்பெயர் தீர்மானம்</string>
<string name="prefer_ipv4">ஐபிவி 4 இணைப்பை விரும்புங்கள்</string>
<string name="multiple">நான்கு</string>
-20
View File
@@ -38,7 +38,6 @@
<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="hint_search_packages">Paketleri ara</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>
@@ -55,7 +54,6 @@
<string name="listen_port">Dinleme portu</string>
<string name="random">(rastgele)</string>
<string name="optional">(isteğe bağlı)</string>
<string name="optional_no_recommend">(isteğe bağlı, önerilmez)</string>
<string name="preshared_key">Ön paylaşımlı anahtar</string>
<string name="seconds">saniye</string>
<string name="persistent_keepalive">Kalıcı canlı tutma</string>
@@ -63,7 +61,6 @@
<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="export_configs">Yapılandırmaları dışa aktar</string>
<string name="unknown_error">Bilinmeyen bir hata oluştu</string>
<string name="tunnel_on_wifi">Güvenilmeyen wifida tünel</string>
<string name="my_email" translatable="false">support@zaneschepke.com</string>
@@ -75,13 +72,11 @@
<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>
<string name="error_invalid_code">Geçersiz QR kodu</string>
<string name="location_services_missing_message">Uygulama, cihazınızda etkinleştirilmiş herhangi bir konum servisi algılamıyor. Cihaza bağlı olarak, bu durum güvenilmeyen wifi özelliğinin wifi adını okuyamamasını sağlayabilir. Yine de devam etmek ister misiniz?</string>
<string name="auto_tunnel_title">Otomatik tünel servisi</string>
<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="tunneling_apps">Tünelleme uygulamaları</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>
@@ -122,8 +117,6 @@
<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="chat_description">Topluluğa katıl</string>
<string name="tunnel_required">Bu özellik en az bir tünel gerektirir</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>
@@ -149,7 +142,6 @@
<string name="display_theme">Ekran teması</string>
<string name="trusted_wifi_names">Güvenilir wifi adları</string>
<string name="add_wifi_name">Wifi adı ekle</string>
<string name="on_demand_rules">İsteğe bağlı tünel kuralları</string>
<string name="primary_tunnel">Birincil tünel</string>
<string name="mobile_tunnel">Mobil veri tüneli</string>
<string name="skip">Atla</string>
@@ -167,8 +159,6 @@
<string name="donate">Projeye bağış yap</string>
<string name="local_logging">Yerel günlüğe kaydetme</string>
<string name="enable_local_logging">Yerel günlüğe kaydetmeyi etkinleştir</string>
<string name="configuration_change">Yapılandırma değişikliği</string>
<string name="requires_app_relaunch">Bu değişiklik uygulamanın yeniden başlatılmasını gerektirir. Devam etmek ister misiniz?</string>
<string name="add_from_clipboard">Panodan ekle</string>
<string name="stop_on_no_internet">İnternet olmadığında durdur</string>
<string name="stop_on_internet_loss">İnternet kaybında tüneli durdur</string>
@@ -191,9 +181,6 @@
<string name="post_up">Sonra çalıştırma</string>
<string name="pre_down">Ön kapatma</string>
<string name="post_down">Sonra kapatma</string>
<string name="amnezia_kernel_message">Amnezia çekirdek modunda kullanılamaz</string>
<string name="enable_amnezia">Amneziayı etkinleştir</string>
<string name="wg_compat_mode">WG uyumluluk modu</string>
<string name="quick_actions">Hızlı eylemler</string>
<string name="advanced_settings">Gelişmiş ayarlar</string>
<string name="debounce_delay">Gecikme süresi</string>
@@ -203,17 +190,10 @@
<string name="remove_amnezia_compatibility">Amnezia uyumluluğunu kaldır</string>
<string name="exclude_lan">LAN’ı hariç tut</string>
<string name="include_lan">LAN’ı dahil et</string>
<string name="error_tunnel_start">Tünel başlatma başarısız</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="dns_error">Uç nokta DNSsi çözülemedi.</string>
<string name="start_failed_config">Yapılandırma hatası nedeniyle tünel başlatılamadı.</string>
<string name="unauthorized">Yetkisiz, tünel başlatılamadı.</string>
<string name="tunne_start_failed_title">Tünel hatası</string>
<string name="multiple">Çoklu</string>
<string name="export_amnezia">Amnezia olarak dışa aktar</string>
<string name="export_wireguard">WireGuard olarak dışa aktar</string>
</resources>
-20
View File
@@ -18,11 +18,9 @@
<string name="base64_key">Ключ в base64</string>
<string name="random">(випадково)</string>
<string name="optional">(необов\'язково)</string>
<string name="optional_no_recommend">(необов\'язково, не рекомендується)</string>
<string name="cancel">Скасувати</string>
<string name="email_chooser">Надіслати E-Mail…</string>
<string name="error_root_denied">Root доступ заборонено</string>
<string name="error_invalid_code">Некоректний QR-код</string>
<string name="incorrect_pin">Невірний PIN-код</string>
<string name="use_tunnel_on_wifi_name">Використовувати тунель в мережі Wi-Fi</string>
<string name="version">Версія</string>
@@ -47,7 +45,6 @@
<string name="mtu">MTU</string>
<string name="peer">Пір</string>
<string name="endpoint">Кінцева точка</string>
<string name="hint_search_packages">Пошук програм</string>
<string name="name">Ім\'я</string>
<string name="always_on_vpn_support">Дозволили Always-ON VPN</string>
<string name="location_services_not_detected">Сервіси місце знаходження не знайдено</string>
@@ -65,7 +62,6 @@
<string name="error_authorization_failed">Не вдалося авторизуватися</string>
<string name="enabled_app_shortcuts">Дозволити ярлики</string>
<string name="error_authentication_failed">Помилка автентифікації</string>
<string name="export_configs">Експорт конфігурації</string>
<string name="unknown_error">Невідома помилка</string>
<string name="tunnel_on_wifi">Тунелювати недовірені мережі Wi-Fi</string>
<string name="email_subject">Підтримка WG-Tunnel</string>
@@ -79,7 +75,6 @@
<string name="location_services_missing_message">Додаток не знайшов служб місце знаходження на вашому пристрої. На деяких пристроях це може привести до неможливості визначення назви мережі Wi-Fi і помилок функції недовірених Wi-Fi мереж. Все рівно хочете продовжити?</string>
<string name="delete_tunnel_message">Ви дійсно хочете видалити цей тунель?</string>
<string name="yes">Так</string>
<string name="tunneling_apps">Тунельовані додатки</string>
<string name="auto">(авто)</string>
<string name="all">всі</string>
<string name="no_email_detected">Програми для надсилання email не знайдено</string>
@@ -123,7 +118,6 @@
<string name="dark">Темна</string>
<string name="language">Мова</string>
<string name="add_wifi_name">Додати мережу Wi-Fi</string>
<string name="on_demand_rules">Правила тунелю на запит</string>
<string name="primary_tunnel">Основний тунель</string>
<string name="launch_app_settings">Налаштування запуску програми</string>
<string name="learn_more">Дізнатись більше</string>
@@ -138,7 +132,6 @@
<string name="logs">Журнали</string>
<string name="mobile_tunnel">Тунель для мобільних даних</string>
<string name="display_theme">Тема</string>
<string name="chat_description">Приєднатися до спільноти</string>
<string name="automatic">Автоматично</string>
<string name="never">ніколи</string>
<string name="appearance">Зовнішній вигляд</string>
@@ -147,14 +140,12 @@
<string name="use_wildcards">Використовувати підстановочні знаки в імені</string>
<string name="optional_default">"необов\'язково, за замовчуванням: "</string>
<string name="always_on_message2">, щоб переконатися, що функція «Постійний VPN» вимкнена для всіх інших програм, і спробуйте ще раз</string>
<string name="tunnel_required">Для цієї функції необхідний хоча б один тунель</string>
<string name="background_location_message">Дозволяти весь час, доки для роботи цієї функції потрібен доступ на місцезнаходження та/або точне місцезнаходження. Дивіться</string>
<string name="advanced_settings">Додаткові налаштування</string>
<string name="quick_actions">Швидкі дії</string>
<string name="tunnel_running">Тунель працює</string>
<string name="monitoring_state_changes">Відстеження змін стану</string>
<string name="donate">Пожертвувати на проект</string>
<string name="requires_app_relaunch">Дана зміна потребує перезапуску програми. Продовжити?</string>
<string name="add_from_clipboard">Додати з буфера обміну</string>
<string name="stop_on_no_internet">Зупинити без інтернету</string>
<string name="native_kill_switch">Штатне екстрене відключення</string>
@@ -171,16 +162,12 @@
<string name="post_up">Після активації</string>
<string name="pre_down">До деактивації</string>
<string name="post_down">Після деактивації</string>
<string name="amnezia_kernel_message">Amnezia недоступна у режимі ядра</string>
<string name="enable_amnezia">Використовувати Amnezia</string>
<string name="wg_compat_mode">Режим сумісності WG</string>
<string name="debounce_delay">Затримка відбою</string>
<string name="hide_amnezia_properties">Приховати налаштування Amnezia</string>
<string name="hide_scripts">Приховати сценарії</string>
<string name="remove_amnezia_compatibility">Вимкнути сумісність з Amnezia</string>
<string name="exclude_lan">Виключити LAN</string>
<string name="include_lan">Увімкнути LAN</string>
<string name="error_tunnel_start">Неможливо запустити тунель</string>
<string name="tunnel_control">Управління тунелем</string>
<string name="auto_tunnel">Автотунель</string>
<string name="local_logging">Локальне ведення журналу</string>
@@ -188,7 +175,6 @@
<string name="start_auto">Запустити автотунель</string>
<string name="stop_auto">Зупинити автотунель</string>
<string name="enable_local_logging">Увімкнути ведення журналу</string>
<string name="configuration_change">Зміна конфігурації</string>
<string name="stop_on_internet_loss">Зупинити тунель під час втрати інтернету</string>
<string name="ethernet_tunnel">Тунель для Ethernet</string>
<string name="set_ethernet_tunnel">Призначити як тунель для Ethernet</string>
@@ -198,11 +184,5 @@
<string name="kill_switch_off">Без екстреного вимкнення у довірених</string>
<string name="server_ipv4">Отримання імені вузла IPv4</string>
<string name="prefer_ipv4">Віддавати перевагу з\'єднанню IPv4</string>
<string name="dns_error">Не отримати кінцеву точку DNS.</string>
<string name="start_failed_config">Неможливо запустити тунель із помилкою конфігурації.</string>
<string name="unauthorized">Неможливо запустити тунель без авторизації.</string>
<string name="tunne_start_failed_title">Помилка тунелю</string>
<string name="multiple">Декілька</string>
<string name="export_amnezia">Експортувати як Amnezia</string>
<string name="export_wireguard">Експортувати як WireGuard</string>
</resources>
-20
View File
@@ -1,7 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="peer">پیر</string>
<string name="optional_no_recommend">(اختیاری، تجویز کردہ نہیں)</string>
<string name="add_from_qr">QR کوڈ سے شامل کریں۔</string>
<string name="always_on_vpn_support">ہمیشہ آن VPN کی اجازت دیں۔</string>
<string name="add_peer">ساتھی شامل کریں۔</string>
@@ -36,7 +35,6 @@
<string name="endpoint">اختتامی نقطہ</string>
<string name="name">نام</string>
<string name="location_services_not_detected">مقام کی خدمات کا پتہ نہیں چلا</string>
<string name="hint_search_packages">پیکجز تلاش کریں۔</string>
<string name="vpn_on">VPN آن</string>
<string name="vpn_off">VPN آف ہے۔</string>
<string name="turn_on_tunnel">کارروائی کے لیے فعال سرنگ کی ضرورت ہے۔</string>
@@ -50,7 +48,6 @@
<string name="error_authentication_failed">تصدیق ناکام ہوگئی</string>
<string name="error_authorization_failed">اجازت دینے میں ناکام</string>
<string name="enabled_app_shortcuts">ایپ شارٹ کٹس کو فعال کریں۔</string>
<string name="export_configs">ترتیب برآمد کریں۔</string>
<string name="tunnel_on_wifi">ناقابل اعتماد وائی فائی پر سرنگ</string>
<string name="email_subject">ڈبلیو جی ٹنل سپورٹ</string>
<string name="docs_description">دستاویزات پڑھیں</string>
@@ -59,12 +56,10 @@
<string name="error_ssid_exists">SSID پہلے سے موجود ہے۔</string>
<string name="error_root_denied">روٹ شیل سے انکار کر دیا گیا۔</string>
<string name="error_no_file_explorer">کوئی فائل ایکسپلورر انسٹال نہیں ہے۔</string>
<string name="error_invalid_code">غلط QR کوڈ</string>
<string name="auto_tunnel_title">آٹو ٹنل سروس</string>
<string name="delete_tunnel">سرنگ کو حذف کریں۔</string>
<string name="delete_tunnel_message">کیا آپ واقعی اس سرنگ کو حذف کرنا چاہیں گے؟</string>
<string name="yes">جی ہاں</string>
<string name="tunneling_apps">ٹنلنگ ایپس</string>
<string name="all">تمام</string>
<string name="no_email_detected">کوئی ای میل ایپ نہیں ملی</string>
<string name="no_browser_detected">کوئی براؤزر نہیں ملا</string>
@@ -86,7 +81,6 @@
<string name="vpn_denied_dialog_title">اجازت نامنظور</string>
<string name="vpn_settings">VPN سسٹم کی ترتیبات</string>
<string name="always_on_message">VPN کنکشن کی اجازت مسترد کر دی گئی ہے۔ براہ کرم چیک کریں۔</string>
<string name="tunnel_required">خصوصیت کے لیے کم از کم ایک سرنگ درکار ہے۔</string>
<string name="app_settings">ایپ کی ترتیبات</string>
<string name="root_accepted">روٹ شیل کو قبول کر لیا گیا۔</string>
<string name="set_custom_ping_ip">اپنی مرضی کے مطابق پنگ آئی پی سیٹ کریں۔</string>
@@ -122,20 +116,16 @@
<string name="post_up">پوسٹ اپ</string>
<string name="pre_down">پری نیچے</string>
<string name="post_down">پوسٹ نیچے</string>
<string name="amnezia_kernel_message">کرنل موڈ میں ایمنیزیا دستیاب نہیں ہے۔</string>
<string name="quick_actions">فوری اقدامات</string>
<string name="advanced_settings">اعلی درجے کی ترتیبات</string>
<string name="debounce_delay">ڈیباؤنس میں تاخیر</string>
<string name="hide_amnezia_properties">Amnezia کی خصوصیات کو چھپائیں۔</string>
<string name="exclude_lan">LAN کو خارج کریں۔</string>
<string name="include_lan">LAN شامل کریں۔</string>
<string name="error_tunnel_start">سرنگ شروع کرنے میں ناکام</string>
<string name="auto_tunnel">خودکار سرنگ</string>
<string name="kill_switch_off">قابل اعتماد پر کِل سوئچ کو بند کریں۔</string>
<string name="server_ipv4">IPv4 میزبان نام کی قرارداد</string>
<string name="unauthorized">سرنگ شروع کرنے میں ناکام، غیر مجاز۔</string>
<string name="multiple">متعدد</string>
<string name="export_amnezia">Amnezia کے طور پر برآمد کریں۔</string>
<string name="prominent_background_location_message">اس فیچر کو ایپلیکیشن بند ہونے کے باوجود بھی Wi-Fi SSID مانیٹرنگ کو فعال کرنے کے لیے پس منظر کی جگہ کی اجازت درکار ہے۔ مزید تفصیلات کے لیے، براہ کرم سپورٹ اسکرین پر منسلک رازداری کی پالیسی دیکھیں۔</string>
<string name="email_chooser">ای میل بھیجیں…</string>
<string name="add_tunnels_text">فائل یا زپ سے شامل کریں۔</string>
@@ -145,15 +135,11 @@
<string name="unknown_error">نامعلوم خرابی پیش آگئی</string>
<string name="seconds">سیکنڈ</string>
<string name="persistent_keepalive">مسلسل زندہ رہنا</string>
<string name="on_demand_rules">آن ڈیمانڈ ٹنل رولز</string>
<string name="start_failed_config">تشکیل کی خرابی کے ساتھ سرنگ شروع کرنے میں ناکام۔</string>
<string name="remove_amnezia_compatibility">Amnezia مطابقت کو ہٹا دیں۔</string>
<string name="light">روشنی</string>
<string name="set_ethernet_tunnel">ایتھرنیٹ ٹنل کے طور پر سیٹ کریں۔</string>
<string name="launch_app_settings">ایپ کی ترتیبات شروع کریں۔</string>
<string name="chat_description">کمیونٹی میں شامل ہوں۔</string>
<string name="monitoring_state_changes">ریاستی تبدیلیوں کی نگرانی</string>
<string name="configuration_change">کنفیگریشن تبدیلی</string>
<string name="set_custom_ping_internal">پنگ وقفہ (سیکنڈ)</string>
<string name="wifi_name_via_shell">شیل کے ذریعے وائی فائی کا نام</string>
<string name="enter_pin">اپنا پن درج کریں۔</string>
@@ -161,7 +147,6 @@
<string name="set_custom_ping_cooldown">پنگ دوبارہ شروع کول ڈاؤن (سیکنڈ)</string>
<string name="handshake">مصافحہ</string>
<string name="response_packet_magic_header">رسپانس پیکٹ میجک ہیڈر</string>
<string name="requires_app_relaunch">اس تبدیلی کے لیے ایپ کو دوبارہ لانچ کرنے کی ضرورت ہے۔ کیا آپ آگے بڑھنا چاہیں گے؟</string>
<string name="unsure_how">اگر آپ کو یقین نہیں ہے کہ کیسے آگے بڑھیں۔</string>
<string name="use_tunnel_on_wifi_name">وائی فائی نام پر ٹنل استعمال کریں۔</string>
<string name="optional_default">"اختیاری، ڈیفالٹ: "</string>
@@ -183,7 +168,6 @@
<string name="prefer_ipv4">IPv4 کنکشن کو ترجیح دیں۔</string>
<string name="native_kill_switch">مقامی قتل سوئچ</string>
<string name="auto_tunnel_channel_description">خودکار سرنگ ریاست کی اطلاعات کے لیے ایک چینل</string>
<string name="wg_compat_mode">WG مطابقت موڈ</string>
<string name="use_wildcards">نام وائلڈ کارڈ استعمال کریں۔</string>
<string name="stop_auto">آٹو ٹنل بند کرو</string>
<string name="add_wifi_name">وائی فائی کا نام شامل کریں۔</string>
@@ -194,14 +178,10 @@
<string name="underload_packet_magic_header">پیکٹ میجک ہیڈر کو انڈر لوڈ کریں۔</string>
<string name="background_location_message">اس خصوصیت کے لیے ہر وقت مقام کی اجازت اور/یا درست مقام کی ضرورت ہے۔ ملاحظہ فرمائیں</string>
<string name="always_on_message2">یہ یقینی بنانے کے لیے کہ ہمیشہ آن VPN دیگر تمام ایپس کے لیے بند ہے اور دوبارہ کوشش کریں۔</string>
<string name="enable_amnezia">Amnezia کو فعال کریں۔</string>
<string name="ethernet_tunnel">ایتھرنیٹ سرنگ</string>
<string name="auto_tunnel_channel_name">آٹو ٹنل نوٹیفکیشن چینل</string>
<string name="dns_error">اختتامی نقطہ DNS کو حل کرنے میں ناکام۔</string>
<string name="export_wireguard">وائر گارڈ کے بطور برآمد کریں۔</string>
<string name="tunnel_running">ٹنل چل رہا ہے۔</string>
<string name="tunnel_control">ٹنل کنٹرول</string>
<string name="tunne_start_failed_title">ٹنل کی ناکامی۔</string>
<string name="vpn_channel_description">VPN ریاستی اطلاعات کے لیے ایک چینل</string>
<string name="hide_scripts">اسکرپٹ چھپائیں۔</string>
<string name="add_from_clipboard">کلپ بورڈ سے شامل کریں۔</string>
+41 -20
View File
@@ -23,21 +23,17 @@
<string name="peer">节点</string>
<string name="always_on_vpn_support">允许 VPN 始终在线</string>
<string name="location_services_not_detected">定位服务未开启</string>
<string name="hint_search_packages">查找软件包</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="optional_no_recommend">(可选,不建议)</string>
<string name="error_authorization_failed">验证失败</string>
<string name="enabled_app_shortcuts">创建桌面快捷方式</string>
<string name="export_configs">导出设置</string>
<string name="docs_description">阅读文档</string>
<string name="email_description">给作者发邮件</string>
<string name="error_root_denied">root 权限未开启</string>
<string name="error_no_file_explorer">没有安装任何的文件管理器</string>
<string name="error_invalid_code">无效的二维码</string>
<string name="copy_public_key">复制公钥</string>
<string name="email_chooser">发送邮件…</string>
<string name="persistent_keepalive">连接保活</string>
@@ -70,7 +66,6 @@
<string name="delete_tunnel_message">确定删除这个隧道吗?</string>
<string name="location_services_missing_message">此应用不会在您的设备上检测任何已开启的定位服务。根据不同的设备,可能会导致无法获得不可信 WiFi 的名称。您想继续吗?</string>
<string name="yes"></string>
<string name="tunneling_apps">正在使用隧道的应用</string>
<string name="all">全部</string>
<string name="no_email_detected">未安装邮件应用</string>
<string name="enable_app_lock">锁定应用</string>
@@ -80,7 +75,6 @@
<string name="support">支持</string>
<string name="kernel">内核</string>
<string name="junk_packet_minimum_size">无效包最小值</string>
<string name="chat_description">加入社区</string>
<string name="root_accepted">已获取 root 权限</string>
<string name="default_ping_ip">(可选,默认选择节点)</string>
<string name="set_custom_ping_internal">Ping 间隔(秒)</string>
@@ -106,7 +100,6 @@
<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="tunnel_required">此功能需要至少一个隧道</string>
<string name="app_settings">应用设置</string>
<string name="background_location_message2">请确保这些权限已开启</string>
<string name="logs">日志</string>
@@ -143,7 +136,6 @@
<string name="unsure_how">如果您不确定如何进行</string>
<string name="see_the">请查阅</string>
<string name="getting_started_guide">入门指南</string>
<string name="on_demand_rules">自定义隧道规则</string>
<string name="skip">取消</string>
<string name="launch_app_settings">打开应用设置</string>
<string name="use_wildcards">使用 SSID 通配符</string>
@@ -158,8 +150,6 @@
<string name="donate">捐赠</string>
<string name="local_logging">日志</string>
<string name="enable_local_logging">开启本地日志</string>
<string name="configuration_change">配置更改</string>
<string name="requires_app_relaunch">此更改需要重新启动应用程序。您是否要继续?</string>
<string name="stop_on_no_internet">无网络时停用</string>
<string name="stop_on_internet_loss">网络丢失时停止隧道</string>
<string name="bypass_lan_for_kill_switch">绕过局域网流量</string>
@@ -173,9 +163,6 @@
<string name="post_up">启动后</string>
<string name="pre_down">关闭前</string>
<string name="post_down">关闭后</string>
<string name="amnezia_kernel_message">Amnezia 在内核模式中不可用</string>
<string name="enable_amnezia">开启 Amnezia</string>
<string name="wg_compat_mode">WG 兼容性模式</string>
<string name="quick_actions">快捷操作</string>
<string name="advanced_settings">高级设置</string>
<string name="debounce_delay">防抖延迟</string>
@@ -185,7 +172,6 @@
<string name="remove_amnezia_compatibility">移除 Amnezia 兼容性</string>
<string name="exclude_lan">排除局域网</string>
<string name="include_lan">包含局域网</string>
<string name="error_tunnel_start">开启隧道失败</string>
<string name="tunnel_control">隧道控制</string>
<string name="auto_tunnel">自动隧道</string>
<string name="ethernet_tunnel">以太网隧道</string>
@@ -197,12 +183,47 @@
<string name="vpn_channel_description">VPN 状态通知频道</string>
<string name="kill_switch_off">在受信任网络上停止 Kill Switch</string>
<string name="prefer_ipv4">首选 IPv4 连接</string>
<string name="dns_error">解析端点 DNS 失败。</string>
<string name="unauthorized">身份验证未通过,启动流量隧道失败。</string>
<string name="tunne_start_failed_title">隧道失败</string>
<string name="multiple">多个</string>
<string name="server_ipv4">IPv4 主机名解析</string>
<string name="start_failed_config">配置文件错误,启动流量隧道失败。</string>
<string name="export_amnezia">导出为 Amnezia</string>
<string name="export_wireguard">导出为 WireGuard</string>
<string name="auth_error">未授权错误</string>
<string name="status">状态</string>
<string name="bio_not_created">生物特征未创建</string>
<string name="export_failed">导出失败了</string>
<string name="delete">删除</string>
<string name="dns_resolve_error">dns 解析出错</string>
<string name="dropdown">下拉</string>
<string name="camera_permission_required">需要相机权限</string>
<string name="join_telegram">加入 Telegram 社区</string>
<string name="add_from_url">从 URL 添加</string>
<string name="enter_config_url">输入配置 URL</string>
<string name="error_download_failed">下载配置失败</string>
<string name="save">保存</string>
<string name="search">搜索</string>
<string name="select">选择</string>
<string name="matrix_url">https://matrix.to/#/#wg-tunnel-space:matrix.org</string>
<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="kernel_name_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>
<string name="wifi_name_template">活跃:%1$s</string>
<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>
</resources>
@@ -26,13 +26,11 @@
<string name="add_tunnels_text">從檔案或 zip 壓縮檔新增</string>
<string name="add_from_qr">從 QR code 新增</string>
<string name="copy_public_key">複製公鑰</string>
<string name="optional_no_recommend">(可選, 不建議)</string>
<string name="optional">(可選)</string>
<string name="random">(隨機)</string>
<string name="cancel">取消</string>
<string name="private_key">私鑰</string>
<string name="listen_port">監聽連接埠</string>
<string name="export_configs">匯出組態</string>
<string name="create_import">手動建立</string>
<string name="seconds"></string>
<string name="docs_description">閱讀文件</string>
@@ -40,7 +38,6 @@
<string name="delete_tunnel">刪除隧道</string>
<string name="delete_tunnel_message">您確定要刪除此隧道?</string>
<string name="yes"></string>
<string name="error_invalid_code">無效的 QR code</string>
<string name="no_browser_detected">未安裝瀏覽器</string>
<string name="no_email_detected">未安裝電子郵件應用程式</string>
<string name="open_issue">建立新的問題</string>
@@ -58,7 +55,6 @@
<string name="getting_started_guide">取得入門指南</string>
<string name="settings">設定</string>
<string name="restart_at_boot">開機時重新啟動</string>
<string name="chat_description">加入社區</string>
<string name="junk_packet_count">無效封包數</string>
<string name="set_custom_ping_internal">Ping 間隔 (秒)</string>
<string name="app_settings">應用程式設定</string>
@@ -77,18 +73,13 @@
<string name="automatic">自動</string>
<string name="add_wifi_name">新增WiFi SSID</string>
<string name="allow_lan_traffic">允許 LAN 流量</string>
<string name="configuration_change">組態變更</string>
<string name="stop_on_no_internet">沒有連上網路時停用</string>
<string name="stop_on_internet_loss">網路連線斷開時停止隧道</string>
<string name="add_from_clipboard">從剪貼簿新增</string>
<string name="stop">停止</string>
<string name="amnezia_kernel_message">Amnezia 無法在核心模式使用</string>
<string name="enable_amnezia">啟用 Amnezia</string>
<string name="wg_compat_mode">WG 相容性模式</string>
<string name="advanced_settings">進階設定</string>
<string name="exclude_lan">排除 LAN</string>
<string name="include_lan">包含 LAN</string>
<string name="error_tunnel_start">啟用隧道失敗</string>
<string name="unknown_error">發生未知錯誤</string>
<string name="error_file_format">無效的隧道組態檔案格式</string>
<string name="endpoint">端點</string>
@@ -105,7 +96,6 @@
<string name="enable_local_logging">啟用本地日誌記錄</string>
<string name="email_description">給作者寄電子郵件</string>
<string name="always_on_vpn_support">允許永久連線的 VPN</string>
<string name="hint_search_packages">搜尋軟體套件</string>
<string name="vpn_on">VPN 已開啟</string>
<string name="vpn_off">VPN 已關閉</string>
<string name="error_root_denied">無法取得 root 權限</string>
+1 -1
View File
@@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="black_background">#FF1c1b20</color>
<color name="background">#FF21272A</color>
</resources>
@@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="ic_banner_background">#1D1A20</color>
</resources>
<color name="ic_banner_background">#21272A</color>
</resources>
@@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="ic_channel_background">#1D1A20</color>
<color name="ic_channel_background">#21272A</color>
</resources>
@@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="ic_launcher_background">#1D1A20</color>
<color name="ic_launcher_background">#21272A</color>
</resources>

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