mirror of
https://github.com/amnezia-vpn/amnezia-client.git
synced 2026-06-21 02:01:03 +07:00
Compare commits
1 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| bdb7795334 |
@@ -10,10 +10,10 @@ Amnezia is an open-source VPN client, with a key feature that enables you to dep
|
||||
|
||||
<br>
|
||||
|
||||
<a href="https://github.com/amnezia-vpn/amnezia-client/releases/download/4.7.0.0/AmneziaVPN_4.7.0.0_x64.exe"><img src="https://github.com/amnezia-vpn/amnezia-client/blob/dev/metadata/img-readme/win.png" width="150" style="max-width: 100%;"></a>
|
||||
<a href="https://github.com/amnezia-vpn/amnezia-client/releases/download/4.7.0.0/AmneziaVPN_4.7.0.0.dmg"><img src="https://github.com/amnezia-vpn/amnezia-client/blob/dev/metadata/img-readme/mac.png" width="150" style="max-width: 100%;"></a>
|
||||
<a href="https://github.com/amnezia-vpn/amnezia-client/releases/download/4.7.0.0/AmneziaVPN_Linux_4.7.0.0.tar.zip"><img src="https://github.com/amnezia-vpn/amnezia-client/blob/dev/metadata/img-readme/lin.png" width="150" style="max-width: 100%;"></a>
|
||||
<a href="https://github.com/amnezia-vpn/amnezia-client/releases/tag/4.7.0.0"><img src="https://github.com/amnezia-vpn/amnezia-client/blob/dev/metadata/img-readme/andr.png" width="150" style="max-width: 100%;"></a>
|
||||
<a href="https://github.com/amnezia-vpn/amnezia-client/releases/download/4.6.0.3/AmneziaVPN_4.6.0.3_x64.exe"><img src="https://github.com/amnezia-vpn/amnezia-client/blob/dev/metadata/img-readme/win.png" width="150" style="max-width: 100%;"></a>
|
||||
<a href="https://github.com/amnezia-vpn/amnezia-client/releases/download/4.6.0.3/AmneziaVPN_4.6.0.3.dmg"><img src="https://github.com/amnezia-vpn/amnezia-client/blob/dev/metadata/img-readme/mac.png" width="150" style="max-width: 100%;"></a>
|
||||
<a href="https://github.com/amnezia-vpn/amnezia-client/releases/download/4.6.0.3/AmneziaVPN_Linux_4.6.0.3.tar.zip"><img src="https://github.com/amnezia-vpn/amnezia-client/blob/dev/metadata/img-readme/lin.png" width="150" style="max-width: 100%;"></a>
|
||||
<a href="https://github.com/amnezia-vpn/amnezia-client/releases/tag/4.6.0.3"><img src="https://github.com/amnezia-vpn/amnezia-client/blob/dev/metadata/img-readme/andr.png" width="150" style="max-width: 100%;"></a>
|
||||
|
||||
<br>
|
||||
|
||||
|
||||
@@ -1,28 +1,81 @@
|
||||
package org.amnezia.vpn.protocol.awg
|
||||
|
||||
import org.amnezia.vpn.protocol.wireguard.Wireguard
|
||||
import org.amnezia.vpn.util.optStringOrNull
|
||||
import org.json.JSONObject
|
||||
|
||||
/**
|
||||
* Config example:
|
||||
* {
|
||||
* "protocol": "awg",
|
||||
* "description": "Server 1",
|
||||
* "dns1": "1.1.1.1",
|
||||
* "dns2": "1.0.0.1",
|
||||
* "hostName": "100.100.100.0",
|
||||
* "splitTunnelSites": [
|
||||
* ],
|
||||
* "splitTunnelType": 0,
|
||||
* "awg_config_data": {
|
||||
* "H1": "969537490",
|
||||
* "H2": "481688153",
|
||||
* "H3": "2049399200",
|
||||
* "H4": "52029755",
|
||||
* "Jc": "3",
|
||||
* "Jmax": "1000",
|
||||
* "Jmin": "50",
|
||||
* "S1": "49",
|
||||
* "S2": "60",
|
||||
* "client_ip": "10.8.1.1",
|
||||
* "hostName": "100.100.100.0",
|
||||
* "port": 12345,
|
||||
* "client_pub_key": "clientPublicKeyBase64",
|
||||
* "client_priv_key": "privateKeyBase64",
|
||||
* "psk_key": "presharedKeyBase64",
|
||||
* "server_pub_key": "publicKeyBase64",
|
||||
* "config": "[Interface]
|
||||
* Address = 10.8.1.1/32
|
||||
* DNS = 1.1.1.1, 1.0.0.1
|
||||
* PrivateKey = privateKeyBase64
|
||||
* Jc = 3
|
||||
* Jmin = 50
|
||||
* Jmax = 1000
|
||||
* S1 = 49
|
||||
* S2 = 60
|
||||
* H1 = 969537490
|
||||
* H2 = 481688153
|
||||
* H3 = 2049399200
|
||||
* H4 = 52029755
|
||||
*
|
||||
* [Peer]
|
||||
* PublicKey = publicKeyBase64
|
||||
* PresharedKey = presharedKeyBase64
|
||||
* AllowedIPs = 0.0.0.0/0, ::/0
|
||||
* Endpoint = 100.100.100.0:12345
|
||||
* PersistentKeepalive = 25
|
||||
* "
|
||||
* }
|
||||
* }
|
||||
*/
|
||||
|
||||
class Awg : Wireguard() {
|
||||
|
||||
override val ifName: String = "awg0"
|
||||
|
||||
override fun parseConfig(config: JSONObject): AwgConfig {
|
||||
val configData = config.getJSONObject("awg_config_data")
|
||||
val configDataJson = config.getJSONObject("awg_config_data")
|
||||
val configData = parseConfigData(configDataJson.getString("config"))
|
||||
return AwgConfig.build {
|
||||
configWireguard(config, configData)
|
||||
configWireguard(configData, configDataJson)
|
||||
configSplitTunneling(config)
|
||||
configAppSplitTunneling(config)
|
||||
configData.optStringOrNull("Jc")?.let { setJc(it.toInt()) }
|
||||
configData.optStringOrNull("Jmin")?.let { setJmin(it.toInt()) }
|
||||
configData.optStringOrNull("Jmax")?.let { setJmax(it.toInt()) }
|
||||
configData.optStringOrNull("S1")?.let { setS1(it.toInt()) }
|
||||
configData.optStringOrNull("S2")?.let { setS2(it.toInt()) }
|
||||
configData.optStringOrNull("H1")?.let { setH1(it.toLong()) }
|
||||
configData.optStringOrNull("H2")?.let { setH2(it.toLong()) }
|
||||
configData.optStringOrNull("H3")?.let { setH3(it.toLong()) }
|
||||
configData.optStringOrNull("H4")?.let { setH4(it.toLong()) }
|
||||
configData["Jc"]?.let { setJc(it.toInt()) }
|
||||
configData["Jmin"]?.let { setJmin(it.toInt()) }
|
||||
configData["Jmax"]?.let { setJmax(it.toInt()) }
|
||||
configData["S1"]?.let { setS1(it.toInt()) }
|
||||
configData["S2"]?.let { setS2(it.toInt()) }
|
||||
configData["H1"]?.let { setH1(it.toLong()) }
|
||||
configData["H2"]?.let { setH2(it.toLong()) }
|
||||
configData["H3"]?.let { setH3(it.toLong()) }
|
||||
configData["H4"]?.let { setH4(it.toLong()) }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,6 +5,36 @@ import net.openvpn.ovpn3.ClientAPI_Config
|
||||
import org.amnezia.vpn.protocol.openvpn.OpenVpn
|
||||
import org.json.JSONObject
|
||||
|
||||
/**
|
||||
* Config Example:
|
||||
* {
|
||||
* "protocol": "cloak",
|
||||
* "description": "Server 1",
|
||||
* "dns1": "1.1.1.1",
|
||||
* "dns2": "1.0.0.1",
|
||||
* "hostName": "100.100.100.0",
|
||||
* "splitTunnelSites": [
|
||||
* ],
|
||||
* "splitTunnelType": 0,
|
||||
* "openvpn_config_data": {
|
||||
* "config": "openVpnConfig"
|
||||
* }
|
||||
* "cloak_config_data": {
|
||||
* "BrowserSig": "chrome",
|
||||
* "EncryptionMethod": "aes-gcm",
|
||||
* "NumConn": 1,
|
||||
* "ProxyMethod": "openvpn",
|
||||
* "PublicKey": "PublicKey=",
|
||||
* "RemoteHost": "100.100.100.0",
|
||||
* "RemotePort": "443",
|
||||
* "ServerName": "servername",
|
||||
* "StreamTimeout": 300,
|
||||
* "Transport": "direct",
|
||||
* "UID": "UID="
|
||||
* }
|
||||
* }
|
||||
*/
|
||||
|
||||
class Cloak : OpenVpn() {
|
||||
|
||||
override fun parseConfig(config: JSONObject): ClientAPI_Config {
|
||||
|
||||
@@ -16,6 +16,23 @@ import org.amnezia.vpn.util.net.getLocalNetworks
|
||||
import org.amnezia.vpn.util.net.parseInetAddress
|
||||
import org.json.JSONObject
|
||||
|
||||
/**
|
||||
* Config Example:
|
||||
* {
|
||||
* "protocol": "openvpn",
|
||||
* "description": "Server 1",
|
||||
* "dns1": "1.1.1.1",
|
||||
* "dns2": "1.0.0.1",
|
||||
* "hostName": "100.100.100.0",
|
||||
* "splitTunnelSites": [
|
||||
* ],
|
||||
* "splitTunnelType": 0,
|
||||
* "openvpn_config_data": {
|
||||
* "config": "openVpnConfig"
|
||||
* }
|
||||
* }
|
||||
*/
|
||||
|
||||
open class OpenVpn : Protocol() {
|
||||
|
||||
private var openVpnClient: OpenVpnClient? = null
|
||||
|
||||
@@ -1,9 +0,0 @@
|
||||
package org.amnezia.vpn.util
|
||||
|
||||
import org.json.JSONArray
|
||||
import org.json.JSONObject
|
||||
|
||||
inline fun <reified T> JSONArray.asSequence(): Sequence<T> =
|
||||
(0..<length()).asSequence().map { get(it) as T }
|
||||
|
||||
fun JSONObject.optStringOrNull(name: String) = optString(name).ifEmpty { null }
|
||||
+69
-24
@@ -1,6 +1,7 @@
|
||||
package org.amnezia.vpn.protocol.wireguard
|
||||
|
||||
import android.net.VpnService.Builder
|
||||
import java.util.TreeMap
|
||||
import org.amnezia.awg.GoBackend
|
||||
import org.amnezia.vpn.protocol.Protocol
|
||||
import org.amnezia.vpn.protocol.ProtocolState.CONNECTED
|
||||
@@ -8,13 +9,46 @@ import org.amnezia.vpn.protocol.ProtocolState.DISCONNECTED
|
||||
import org.amnezia.vpn.protocol.Statistics
|
||||
import org.amnezia.vpn.protocol.VpnStartException
|
||||
import org.amnezia.vpn.util.Log
|
||||
import org.amnezia.vpn.util.asSequence
|
||||
import org.amnezia.vpn.util.net.InetEndpoint
|
||||
import org.amnezia.vpn.util.net.InetNetwork
|
||||
import org.amnezia.vpn.util.net.parseInetAddress
|
||||
import org.amnezia.vpn.util.optStringOrNull
|
||||
import org.json.JSONObject
|
||||
|
||||
/**
|
||||
* Config example:
|
||||
* {
|
||||
* "protocol": "wireguard",
|
||||
* "description": "Server 1",
|
||||
* "dns1": "1.1.1.1",
|
||||
* "dns2": "1.0.0.1",
|
||||
* "hostName": "100.100.100.0",
|
||||
* "splitTunnelSites": [
|
||||
* ],
|
||||
* "splitTunnelType": 0,
|
||||
* "wireguard_config_data": {
|
||||
* "client_ip": "10.8.1.1",
|
||||
* "hostName": "100.100.100.0",
|
||||
* "port": 12345,
|
||||
* "client_pub_key": "clientPublicKeyBase64",
|
||||
* "client_priv_key": "privateKeyBase64",
|
||||
* "psk_key": "presharedKeyBase64",
|
||||
* "server_pub_key": "publicKeyBase64",
|
||||
* "config": "[Interface]
|
||||
* Address = 10.8.1.1/32
|
||||
* DNS = 1.1.1.1, 1.0.0.1
|
||||
* PrivateKey = privateKeyBase64
|
||||
*
|
||||
* [Peer]
|
||||
* PublicKey = publicKeyBase64
|
||||
* PresharedKey = presharedKeyBase64
|
||||
* AllowedIPs = 0.0.0.0/0, ::/0
|
||||
* Endpoint = 100.100.100.0:12345
|
||||
* PersistentKeepalive = 25
|
||||
* "
|
||||
* }
|
||||
* }
|
||||
*/
|
||||
|
||||
private const val TAG = "Wireguard"
|
||||
|
||||
open class Wireguard : Protocol() {
|
||||
@@ -52,49 +86,60 @@ open class Wireguard : Protocol() {
|
||||
}
|
||||
|
||||
protected open fun parseConfig(config: JSONObject): WireguardConfig {
|
||||
val configData = config.getJSONObject("wireguard_config_data")
|
||||
val configDataJson = config.getJSONObject("wireguard_config_data")
|
||||
val configData = parseConfigData(configDataJson.getString("config"))
|
||||
return WireguardConfig.build {
|
||||
configWireguard(config, configData)
|
||||
configWireguard(configData, configDataJson)
|
||||
configSplitTunneling(config)
|
||||
configAppSplitTunneling(config)
|
||||
}
|
||||
}
|
||||
|
||||
protected fun WireguardConfig.Builder.configWireguard(config: JSONObject, configData: JSONObject) {
|
||||
configData.getString("client_ip").split(",").map { address ->
|
||||
protected fun WireguardConfig.Builder.configWireguard(configData: Map<String, String>, configDataJson: JSONObject) {
|
||||
configData["Address"]?.split(",")?.map { address ->
|
||||
InetNetwork.parse(address.trim())
|
||||
}.forEach(::addAddress)
|
||||
}?.forEach(::addAddress)
|
||||
|
||||
config.optStringOrNull("dns1")?.let { dns ->
|
||||
addDnsServer(parseInetAddress(dns.trim()))
|
||||
}
|
||||
|
||||
config.optStringOrNull("dns2")?.let { dns ->
|
||||
addDnsServer(parseInetAddress(dns.trim()))
|
||||
}
|
||||
configData["DNS"]?.split(",")?.map { dns ->
|
||||
parseInetAddress(dns.trim())
|
||||
}?.forEach(::addDnsServer)
|
||||
|
||||
val defRoutes = hashSetOf(
|
||||
InetNetwork("0.0.0.0", 0),
|
||||
InetNetwork("::", 0)
|
||||
)
|
||||
val routes = hashSetOf<InetNetwork>()
|
||||
configData.getJSONArray("allowed_ips").asSequence<String>().map { route ->
|
||||
configData["AllowedIPs"]?.split(",")?.map { route ->
|
||||
InetNetwork.parse(route.trim())
|
||||
}.forEach(routes::add)
|
||||
}?.forEach(routes::add)
|
||||
// if the allowed IPs list contains at least one non-default route, disable global split tunneling
|
||||
if (routes.any { it !in defRoutes }) disableSplitTunneling()
|
||||
addRoutes(routes)
|
||||
|
||||
configData.optStringOrNull("mtu")?.let { setMtu(it.toInt()) }
|
||||
configDataJson.optString("mtu").let { mtu ->
|
||||
if (mtu.isNotEmpty()) {
|
||||
setMtu(mtu.toInt())
|
||||
} else {
|
||||
configData["MTU"]?.let { setMtu(it.toInt()) }
|
||||
}
|
||||
}
|
||||
|
||||
val host = configData.getString("hostName").let { parseInetAddress(it.trim()) }
|
||||
val port = configData.getInt("port")
|
||||
setEndpoint(InetEndpoint(host, port))
|
||||
configData["Endpoint"]?.let { setEndpoint(InetEndpoint.parse(it)) }
|
||||
configData["PersistentKeepalive"]?.let { setPersistentKeepalive(it.toInt()) }
|
||||
configData["PrivateKey"]?.let { setPrivateKeyHex(it.base64ToHex()) }
|
||||
configData["PublicKey"]?.let { setPublicKeyHex(it.base64ToHex()) }
|
||||
configData["PresharedKey"]?.let { setPreSharedKeyHex(it.base64ToHex()) }
|
||||
}
|
||||
|
||||
configData.optStringOrNull("persistent_keep_alive")?.let { setPersistentKeepalive(it.toInt()) }
|
||||
configData.getString("client_priv_key").let { setPrivateKeyHex(it.base64ToHex()) }
|
||||
configData.getString("server_pub_key").let { setPublicKeyHex(it.base64ToHex()) }
|
||||
configData.optStringOrNull("psk_key")?.let { setPreSharedKeyHex(it.base64ToHex()) }
|
||||
protected fun parseConfigData(data: String): Map<String, String> {
|
||||
val parsedData = TreeMap<String, String>(String.CASE_INSENSITIVE_ORDER)
|
||||
data.lineSequence()
|
||||
.filter { it.isNotEmpty() && !it.startsWith('[') }
|
||||
.forEach { line ->
|
||||
val attr = line.split("=", limit = 2)
|
||||
parsedData[attr.first().trim()] = attr.last().trim()
|
||||
}
|
||||
return parsedData
|
||||
}
|
||||
|
||||
private fun start(config: WireguardConfig, vpnBuilder: Builder, protect: (Int) -> Boolean) {
|
||||
|
||||
@@ -20,6 +20,69 @@ import org.amnezia.vpn.util.net.InetNetwork
|
||||
import org.amnezia.vpn.util.net.parseInetAddress
|
||||
import org.json.JSONObject
|
||||
|
||||
/**
|
||||
* Config example:
|
||||
* {
|
||||
* "appSplitTunnelType": 0,
|
||||
* "config_version": 0,
|
||||
* "description": "Server 1",
|
||||
* "dns1": "1.1.1.1",
|
||||
* "dns2": "1.0.0.1",
|
||||
* "hostName": "100.100.100.0",
|
||||
* "protocol": "xray",
|
||||
* "splitTunnelApps": [],
|
||||
* "splitTunnelSites": [],
|
||||
* "splitTunnelType": 0,
|
||||
* "xray_config_data": {
|
||||
* "inbounds": [
|
||||
* {
|
||||
* "listen": "127.0.0.1",
|
||||
* "port": 8080,
|
||||
* "protocol": "socks",
|
||||
* "settings": {
|
||||
* "udp": true
|
||||
* }
|
||||
* }
|
||||
* ],
|
||||
* "log": {
|
||||
* "loglevel": "error"
|
||||
* },
|
||||
* "outbounds": [
|
||||
* {
|
||||
* "protocol": "vless",
|
||||
* "settings": {
|
||||
* "vnext": [
|
||||
* {
|
||||
* "address": "100.100.100.0",
|
||||
* "port": 443,
|
||||
* "users": [
|
||||
* {
|
||||
* "encryption": "none",
|
||||
* "flow": "xtls-rprx-vision",
|
||||
* "id": "id"
|
||||
* }
|
||||
* ]
|
||||
* }
|
||||
* ]
|
||||
* },
|
||||
* "streamSettings": {
|
||||
* "network": "tcp",
|
||||
* "realitySettings": {
|
||||
* "fingerprint": "chrome",
|
||||
* "publicKey": "publicKey",
|
||||
* "serverName": "google.com",
|
||||
* "shortId": "id",
|
||||
* "spiderX": ""
|
||||
* },
|
||||
* "security": "reality"
|
||||
* }
|
||||
* }
|
||||
* ]
|
||||
* }
|
||||
* }
|
||||
*
|
||||
*/
|
||||
|
||||
private const val TAG = "Xray"
|
||||
private const val LIBXRAY_TAG = "libXray"
|
||||
|
||||
|
||||
@@ -187,10 +187,6 @@ QString WireguardConfigurator::createConfig(const ServerCredentials &credentials
|
||||
jConfig[config_key::server_pub_key] = connData.serverPubKey;
|
||||
jConfig[config_key::mtu] = wireguarConfig.value(config_key::mtu).toString(protocols::wireguard::defaultMtu);
|
||||
|
||||
jConfig[config_key::persistent_keep_alive] = 25;
|
||||
QJsonArray allowedIps { "0.0.0.0/0" };
|
||||
jConfig[config_key::allowed_ips] = allowedIps;
|
||||
|
||||
jConfig[config_key::clientId] = connData.clientPubKey;
|
||||
|
||||
return QJsonDocument(jConfig).toJson();
|
||||
|
||||
@@ -149,13 +149,9 @@ void LocalSocketController::activate(const QJsonObject &rawConfig) {
|
||||
QJsonArray jsAllowedIPAddesses;
|
||||
|
||||
QJsonArray plainAllowedIP = wgConfig.value(amnezia::config_key::allowed_ips).toArray();
|
||||
QJsonArray defaultAllowedIP = QJsonArray::fromStringList(QString("0.0.0.0/0, ::/0").split(","));
|
||||
|
||||
bool allowSplitTunnelFromAppSettings = false;
|
||||
if (!plainAllowedIP.isEmpty() && plainAllowedIP.contains("0.0.0.0/0")) {
|
||||
allowSplitTunnelFromAppSettings = true;
|
||||
}
|
||||
|
||||
if (!allowSplitTunnelFromAppSettings) {
|
||||
if (plainAllowedIP != defaultAllowedIP && !plainAllowedIP.isEmpty()) {
|
||||
// Use AllowedIP list from WG config because of higher priority
|
||||
for (auto v : plainAllowedIP) {
|
||||
QString ipRange = v.toString();
|
||||
@@ -174,6 +170,7 @@ void LocalSocketController::activate(const QJsonObject &rawConfig) {
|
||||
}
|
||||
}
|
||||
} else {
|
||||
|
||||
// Use APP split tunnel
|
||||
if (splitTunnelType == 0 || splitTunnelType == 2) {
|
||||
QJsonObject range_ipv4;
|
||||
|
||||
@@ -22,7 +22,7 @@ extension PacketTunnelProvider {
|
||||
|
||||
if tunnelConfiguration.peers.first!.allowedIPs
|
||||
.map({ $0.stringRepresentation })
|
||||
.contains("0.0.0.0/0") {
|
||||
.joined(separator: ", ") == "0.0.0.0/0, ::/0" {
|
||||
if wgConfig.splitTunnelType == 1 {
|
||||
for index in tunnelConfiguration.peers.indices {
|
||||
tunnelConfiguration.peers[index].allowedIPs.removeAll()
|
||||
|
||||
@@ -491,7 +491,7 @@ bool IosController::setupWireGuard()
|
||||
if (config.contains(config_key::allowed_ips) && config[config_key::allowed_ips].isArray()) {
|
||||
wgConfig.insert(config_key::allowed_ips, config[config_key::allowed_ips]);
|
||||
} else {
|
||||
QJsonArray allowed_ips { "0.0.0.0/0" };
|
||||
QJsonArray allowed_ips { "0.0.0.0/0", "::/0" };
|
||||
wgConfig.insert(config_key::allowed_ips, allowed_ips);
|
||||
}
|
||||
|
||||
@@ -576,7 +576,7 @@ bool IosController::setupAwg()
|
||||
if (config.contains(config_key::allowed_ips) && config[config_key::allowed_ips].isArray()) {
|
||||
wgConfig.insert(config_key::allowed_ips, config[config_key::allowed_ips]);
|
||||
} else {
|
||||
QJsonArray allowed_ips { "0.0.0.0/0" };
|
||||
QJsonArray allowed_ips { "0.0.0.0/0", "::/0" };
|
||||
wgConfig.insert(config_key::allowed_ips, allowed_ips);
|
||||
}
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
#include "Winsvc.h"
|
||||
|
||||
/**
|
||||
* @brief The WindowsServiceManager provides control over the MozillaVPNBroker
|
||||
* @brief The WindowsServiceManager provides controll over the MozillaVPNBroker
|
||||
* service via SCM
|
||||
*/
|
||||
class WindowsServiceManager : public QObject {
|
||||
|
||||
@@ -15,6 +15,6 @@ H4 = $TRANSPORT_PACKET_MAGIC_HEADER
|
||||
[Peer]
|
||||
PublicKey = $WIREGUARD_SERVER_PUBLIC_KEY
|
||||
PresharedKey = $WIREGUARD_PSK
|
||||
AllowedIPs = 0.0.0.0/0
|
||||
AllowedIPs = 0.0.0.0/0, ::/0
|
||||
Endpoint = $SERVER_IP_ADDRESS:$AWG_SERVER_PORT
|
||||
PersistentKeepalive = 25
|
||||
|
||||
@@ -6,6 +6,6 @@ PrivateKey = $WIREGUARD_CLIENT_PRIVATE_KEY
|
||||
[Peer]
|
||||
PublicKey = $WIREGUARD_SERVER_PUBLIC_KEY
|
||||
PresharedKey = $WIREGUARD_PSK
|
||||
AllowedIPs = 0.0.0.0/0
|
||||
AllowedIPs = 0.0.0.0/0, ::/0
|
||||
Endpoint = $SERVER_IP_ADDRESS:$WIREGUARD_SERVER_PORT
|
||||
PersistentKeepalive = 25
|
||||
|
||||
+1
-1
@@ -183,7 +183,7 @@ public:
|
||||
|
||||
bool isScreenshotsEnabled() const
|
||||
{
|
||||
return value("Conf/screenshotsEnabled", true).toBool();
|
||||
return value("Conf/screenshotsEnabled", false).toBool();
|
||||
}
|
||||
void setScreenshotsEnabled(bool enabled)
|
||||
{
|
||||
|
||||
@@ -6,47 +6,48 @@
|
||||
<message>
|
||||
<location filename="../ui/models/apiServicesModel.cpp" line="63"/>
|
||||
<source>Classic VPN for comfortable work, downloading large files and watching videos. Works for any sites. Speed up to %1 MBit/s</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Для перевода на персидский:
|
||||
وی پی ان کلاسیک برای کار راحت، دانلود فایلهای بزرگ و تماشای ویدیو. قابل استفاده برای هر سایتی. سرعت تا %1 مگابیت بر ثانیه.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/models/apiServicesModel.cpp" line="67"/>
|
||||
<source>VPN to access blocked sites in regions with high levels of Internet censorship. </source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>وی پی ان برای دسترسی به سایتهای مسدود شده در مناطق با سانسور شدید اینترنت.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/models/apiServicesModel.cpp" line="72"/>
|
||||
<source>Amnezia Premium - A classic VPN for comfortable work, downloading large files, and watching videos in high resolution. It works for all websites, even in countries with the highest level of internet censorship.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>امنزیا پریمیوم - یک وی پی ان کلاسیک برای کار راحت، دانلود فایلهای بزرگ و تماشای ویدیو با کیفیت بالا. قابل استفاده برای تمامی سایتها، حتی در کشورهایی با بالاترین سطح سانسور اینترنت.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/models/apiServicesModel.cpp" line="75"/>
|
||||
<source>Amnezia Free is a free VPN to bypass blocking in countries with high levels of internet censorship</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>امنزیا رایگان یک وی پی ان رایگان برای دور زدن مسدودیتها در کشورهایی با سطح بالای سانسور اینترنت است.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/models/apiServicesModel.cpp" line="80"/>
|
||||
<source>%1 MBit/s</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>%1 MBit/s</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/models/apiServicesModel.cpp" line="87"/>
|
||||
<source>%1 days</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>%1 روز</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/models/apiServicesModel.cpp" line="96"/>
|
||||
<source>VPN will open only popular sites blocked in your region, such as Instagram, Facebook, Twitter and others. Other sites will be opened from your real IP address, <a href="%1/free" style="color: #FBB26A;">more details on the website.</a></source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>وی پی ان فقط سایتهای محبوبی را که در منطقه شما مسدود شدهاند، مانند اینستاگرام، فیسبوک، توییتر و غیره باز میکند. سایر سایتها با آدرس آیپی واقعی شما باز خواهند شد. <a href="%1/free" style="color: #FBB26A;">more details on the website.</a></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/models/apiServicesModel.cpp" line="104"/>
|
||||
<source>Free</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>رایگان</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/models/apiServicesModel.cpp" line="106"/>
|
||||
<source>%1 $/month</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>%1 $/ماه</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@@ -54,22 +55,22 @@
|
||||
<message>
|
||||
<location filename="../ui/controllers/appSplitTunnelingController.cpp" line="23"/>
|
||||
<source>Application added: %1</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>برنامه اضافه شد: %1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/controllers/appSplitTunnelingController.cpp" line="26"/>
|
||||
<source>The application has already been added</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>برنامه از قبل اضافه شده است</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/controllers/appSplitTunnelingController.cpp" line="37"/>
|
||||
<source>The selected applications have been added</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>برنامههای انتخاب شده اضافه شدند</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/controllers/appSplitTunnelingController.cpp" line="48"/>
|
||||
<source>Application removed: %1</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>برنامه حذف شد: %1</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@@ -77,7 +78,7 @@
|
||||
<message>
|
||||
<location filename="../ui/qml/Components/ConnectButton.qml" line="27"/>
|
||||
<source>Unable to disconnect during configuration preparation</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>در هنگام آمادهسازی پیکربندی، نمیتوان از اتصال خارج شد.</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@@ -102,7 +103,7 @@
|
||||
<message>
|
||||
<location filename="../ui/controllers/connectionController.cpp" line="110"/>
|
||||
<source>Preparing...</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>در حال آمادهسازی...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/controllers/connectionController.cpp" line="132"/>
|
||||
@@ -118,12 +119,12 @@
|
||||
<message>
|
||||
<location filename="../ui/controllers/connectionController.cpp" line="209"/>
|
||||
<source>The selected protocol is not supported on the current platform</source>
|
||||
<translation type="unfinished">پروتکل انتخاب شده بر روی این پلتفرم پشتیبانی نمیشود</translation>
|
||||
<translation>پروتکل انتخاب شده بر روی این پلتفرم پشتیبانی نمیشودپروتکل انتخاب شده در پلتفرم فعلی پشتیبانی نمیشود.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/controllers/connectionController.cpp" line="233"/>
|
||||
<source>unable to create configuration</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>نمیتوان پیکربندی را ایجاد کرد.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/controllers/connectionController.cpp" line="95"/>
|
||||
@@ -256,13 +257,13 @@ Can't be disabled for current server</source>
|
||||
<message>
|
||||
<location filename="../ui/controllers/importController.cpp" line="87"/>
|
||||
<source>Unable to open file</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>نمیتوان فایل را باز کرد.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/controllers/importController.cpp" line="186"/>
|
||||
<location filename="../ui/controllers/importController.cpp" line="191"/>
|
||||
<source>Invalid configuration file</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>فایل پیکربندی نامعتبر است.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/controllers/importController.cpp" line="606"/>
|
||||
@@ -272,7 +273,7 @@ Can't be disabled for current server</source>
|
||||
<message>
|
||||
<location filename="../ui/controllers/importController.cpp" line="641"/>
|
||||
<source>In the imported configuration, potentially dangerous lines were found:</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>در پیکربندی وارد شده، خطوطی که ممکن است خطرناک باشند، یافت شدند:</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@@ -329,12 +330,12 @@ Already installed containers were found on the server. All installed containers
|
||||
<message>
|
||||
<location filename="../ui/controllers/installController.cpp" line="608"/>
|
||||
<source>Api config removed</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>پیکربندی API حذف شد.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/controllers/installController.cpp" line="630"/>
|
||||
<source>%1 cached profile cleared</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>%1 پروفایل ذخیره شده پاک شد.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/controllers/installController.cpp" line="769"/>
|
||||
@@ -349,17 +350,17 @@ Already installed containers were found on the server. All installed containers
|
||||
<message>
|
||||
<location filename="../ui/controllers/installController.cpp" line="845"/>
|
||||
<source>%1 installed successfully.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>%1 با موفقیت نصب شد.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/controllers/installController.cpp" line="877"/>
|
||||
<source>API config reloaded</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>پیکربندی API دوباره بارگذاری شد.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/controllers/installController.cpp" line="881"/>
|
||||
<source>Successfully changed the country of connection to %1</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>کشور اتصال با موفقیت به %1 تغییر یافت.</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@@ -367,17 +368,17 @@ Already installed containers were found on the server. All installed containers
|
||||
<message>
|
||||
<location filename="../ui/qml/Components/InstalledAppsDrawer.qml" line="57"/>
|
||||
<source>Choose application</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>انتخاب برنامه</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/qml/Components/InstalledAppsDrawer.qml" line="139"/>
|
||||
<source>application name</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>نام برنامه</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/qml/Components/InstalledAppsDrawer.qml" line="152"/>
|
||||
<source>Add selected</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>اضافه کردن انتخاب شده</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@@ -453,7 +454,7 @@ Already installed containers were found on the server. All installed containers
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageHome.qml" line="67"/>
|
||||
<source>Logging enabled</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>لاگبرداری فعال شد</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageHome.qml" line="111"/>
|
||||
@@ -589,7 +590,7 @@ Already installed containers were found on the server. All installed containers
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageProtocolAwgSettings.qml" line="382"/>
|
||||
<source>Unable change settings while there is an active connection</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>نمیتوان تنظیمات را تغییر داد در حالی که اتصال فعال است.</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@@ -623,7 +624,7 @@ Already installed containers were found on the server. All installed containers
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageProtocolCloakSettings.qml" line="193"/>
|
||||
<source>Unable change settings while there is an active connection</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>نمیتوان تنظیمات را تغییر داد در حالی که اتصال فعال است.</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@@ -794,7 +795,7 @@ Already installed containers were found on the server. All installed containers
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="445"/>
|
||||
<source>Unable change settings while there is an active connection</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>نمیتوان تنظیمات را تغییر داد در حالی که اتصال فعال است.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Remove OpenVPN</source>
|
||||
@@ -895,7 +896,7 @@ Already installed containers were found on the server. All installed containers
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageProtocolShadowSocksSettings.qml" line="181"/>
|
||||
<source>Unable change settings while there is an active connection</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>نمیتوان تنظیمات را تغییر داد در حالی که اتصال فعال است.</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@@ -903,22 +904,22 @@ Already installed containers were found on the server. All installed containers
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageProtocolWireGuardSettings.qml" line="94"/>
|
||||
<source>WG settings</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>تنظیمات WG</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageProtocolWireGuardSettings.qml" line="102"/>
|
||||
<source>Port</source>
|
||||
<translation type="unfinished">پورت</translation>
|
||||
<translation>پورت</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageProtocolWireGuardSettings.qml" line="123"/>
|
||||
<source>MTU</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageProtocolWireGuardSettings.qml" line="157"/>
|
||||
<source>Unable change settings while there is an active connection</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>نمیتوان تنظیمات را تغییر داد در حالی که اتصال فعال است.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>All users with whom you shared a connection will no longer be able to connect to it.</source>
|
||||
@@ -939,22 +940,22 @@ Already installed containers were found on the server. All installed containers
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageProtocolXraySettings.qml" line="95"/>
|
||||
<source>XRay settings</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>تنظیمات XRay</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageProtocolXraySettings.qml" line="103"/>
|
||||
<source>Disguised as traffic from</source>
|
||||
<translation type="unfinished">پنهان کردن به عنوان ترافیک از</translation>
|
||||
<translation>بهعنوان ترافیک از طرف زیر نمایش داده میشود</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageProtocolXraySettings.qml" line="129"/>
|
||||
<source>Save</source>
|
||||
<translation type="unfinished">ذخیره</translation>
|
||||
<translation>ذخیره</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageProtocolXraySettings.qml" line="137"/>
|
||||
<source>Unable change settings while there is an active connection</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>نمیتوان تنظیمات را تغییر داد در حالی که اتصال فعال است.</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@@ -1001,7 +1002,7 @@ Already installed containers were found on the server. All installed containers
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageServiceDnsSettings.qml" line="85"/>
|
||||
<source>Cannot remove AmneziaDNS from running server</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>نمیتوان AmneziaDNS را از سرور در حال اجرا حذف کرد.</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@@ -1093,18 +1094,18 @@ Already installed containers were found on the server. All installed containers
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageServiceSocksProxySettings.qml" line="26"/>
|
||||
<source>Settings updated successfully</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>تنظیمات با موفقیت بهروزرسانی شد.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageServiceSocksProxySettings.qml" line="93"/>
|
||||
<location filename="../ui/qml/Pages2/PageServiceSocksProxySettings.qml" line="250"/>
|
||||
<source>SOCKS5 settings</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>تنظیمات SOCKS5</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageServiceSocksProxySettings.qml" line="104"/>
|
||||
<source>Host</source>
|
||||
<translation type="unfinished">هاست</translation>
|
||||
<translation>هاستمیزبان</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageServiceSocksProxySettings.qml" line="114"/>
|
||||
@@ -1112,50 +1113,50 @@ Already installed containers were found on the server. All installed containers
|
||||
<location filename="../ui/qml/Pages2/PageServiceSocksProxySettings.qml" line="162"/>
|
||||
<location filename="../ui/qml/Pages2/PageServiceSocksProxySettings.qml" line="189"/>
|
||||
<source>Copied</source>
|
||||
<translation type="unfinished">کپی شد</translation>
|
||||
<translation>کپی شدکپی شد</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageServiceSocksProxySettings.qml" line="125"/>
|
||||
<location filename="../ui/qml/Pages2/PageServiceSocksProxySettings.qml" line="260"/>
|
||||
<source>Port</source>
|
||||
<translation type="unfinished">پورت</translation>
|
||||
<translation>پورتپورت</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageServiceSocksProxySettings.qml" line="149"/>
|
||||
<source>User name</source>
|
||||
<translation type="unfinished">نام کاربری</translation>
|
||||
<translation>نام کاربری</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageServiceSocksProxySettings.qml" line="173"/>
|
||||
<location filename="../ui/qml/Pages2/PageServiceSocksProxySettings.qml" line="306"/>
|
||||
<source>Password</source>
|
||||
<translation type="unfinished">رمز عبور</translation>
|
||||
<translation>رمز عبور</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageServiceSocksProxySettings.qml" line="282"/>
|
||||
<source>Username</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>نام کاربری</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageServiceSocksProxySettings.qml" line="336"/>
|
||||
<location filename="../ui/qml/Pages2/PageServiceSocksProxySettings.qml" line="374"/>
|
||||
<source>Change connection settings</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>تغییر تنظیمات اتصال</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageServiceSocksProxySettings.qml" line="343"/>
|
||||
<source>The port must be in the range of 1 to 65535</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>پورت باید در محدوده ۱ تا ۶۵۵۳۵ باشد</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageServiceSocksProxySettings.qml" line="347"/>
|
||||
<source>Password cannot be empty</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>رمز عبور نمیتواند خالی باشد</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageServiceSocksProxySettings.qml" line="350"/>
|
||||
<source>Username cannot be empty</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>نام کاربری نمیتواند خالی باشد</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@@ -1285,7 +1286,7 @@ Already installed containers were found on the server. All installed containers
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageSettingsAbout.qml" line="113"/>
|
||||
<source>https://t.me/amnezia_vpn_en</source>
|
||||
<translation>https://t.me/amnezia_vpn</translation>
|
||||
<translation>https://t.me/amnezia_vpn_ir</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageSettingsAbout.qml" line="123"/>
|
||||
@@ -1337,22 +1338,22 @@ Already installed containers were found on the server. All installed containers
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageSettingsApiServerInfo.qml" line="45"/>
|
||||
<source>For the region</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>برای منطقه</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageSettingsApiServerInfo.qml" line="54"/>
|
||||
<source>Price</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>قیمت</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageSettingsApiServerInfo.qml" line="63"/>
|
||||
<source>Work period</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>مدت زمان کار</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageSettingsApiServerInfo.qml" line="74"/>
|
||||
<source>Speed</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>سرعت</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageSettingsApiServerInfo.qml" line="106"/>
|
||||
@@ -1362,49 +1363,49 @@ Already installed containers were found on the server. All installed containers
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageSettingsApiServerInfo.qml" line="119"/>
|
||||
<source>Copied</source>
|
||||
<translation type="unfinished">کپی شد</translation>
|
||||
<translation>کپی شد</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageSettingsApiServerInfo.qml" line="139"/>
|
||||
<source>Reload API config</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>بارگذاری مجدد پیکربندی API</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageSettingsApiServerInfo.qml" line="144"/>
|
||||
<source>Reload API config?</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>آیا میخواهید پیکربندی API را دوباره بارگذاری کنید؟</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageSettingsApiServerInfo.qml" line="145"/>
|
||||
<location filename="../ui/qml/Pages2/PageSettingsApiServerInfo.qml" line="185"/>
|
||||
<source>Continue</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>ادامه دهید</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageSettingsApiServerInfo.qml" line="146"/>
|
||||
<location filename="../ui/qml/Pages2/PageSettingsApiServerInfo.qml" line="186"/>
|
||||
<source>Cancel</source>
|
||||
<translation type="unfinished">کنسل</translation>
|
||||
<translation>کنسللغو کنید</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageSettingsApiServerInfo.qml" line="150"/>
|
||||
<source>Cannot reload API config during active connection</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>نمیتوان پیکربندی API را در حین اتصال فعال دوباره بارگذاری کرد.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageSettingsApiServerInfo.qml" line="179"/>
|
||||
<source>Remove from application</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>حذف از برنامه</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageSettingsApiServerInfo.qml" line="184"/>
|
||||
<source>Remove from application?</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>آیا میخواهید از برنامه حذف کنید؟</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageSettingsApiServerInfo.qml" line="190"/>
|
||||
<source>Cannot remove server during active connection</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>نمیتوان سرور را در حین اتصال فعال حذف کرد.</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@@ -1412,57 +1413,57 @@ Already installed containers were found on the server. All installed containers
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageSettingsAppSplitTunneling.qml" line="30"/>
|
||||
<source>Cannot change split tunneling settings during active connection</source>
|
||||
<translation type="unfinished">نمی توان تنظیمات تونل تقسیم را در طول اتصال فعال تغییر داد</translation>
|
||||
<translation>نمی توان تنظیمات تونل تقسیم را در طول اتصال فعال تغییر دادنمیتوان تنظیمات تقسیم تونلینگ را در حین اتصال فعال تغییر داد.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageSettingsAppSplitTunneling.qml" line="51"/>
|
||||
<source>Only the apps from the list should have access via VPN</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>فقط برنامههای موجود در لیست باید از طریق VPN دسترسی داشته باشند.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageSettingsAppSplitTunneling.qml" line="56"/>
|
||||
<source>Apps from the list should not have access via VPN</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>برنامههای موجود در لیست نباید از طریق VPN دسترسی داشته باشند.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageSettingsAppSplitTunneling.qml" line="93"/>
|
||||
<source>App split tunneling</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>تقسیم تونلینگ برنامهها</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageSettingsAppSplitTunneling.qml" line="129"/>
|
||||
<source>Mode</source>
|
||||
<translation type="unfinished">حالت</translation>
|
||||
<translation>حالتمدل</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageSettingsAppSplitTunneling.qml" line="221"/>
|
||||
<source>Remove </source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>حذف </translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageSettingsAppSplitTunneling.qml" line="222"/>
|
||||
<source>Continue</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>ادامه دهید</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageSettingsAppSplitTunneling.qml" line="223"/>
|
||||
<source>Cancel</source>
|
||||
<translation type="unfinished">کنسل</translation>
|
||||
<translation>کنسل</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageSettingsAppSplitTunneling.qml" line="267"/>
|
||||
<source>application name</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>نام برنامه</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageSettingsAppSplitTunneling.qml" line="278"/>
|
||||
<source>Open executable file</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageSettingsAppSplitTunneling.qml" line="279"/>
|
||||
<source>Executable files (*.*)</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>فایلهای اجرایی (*.*)</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@@ -1480,12 +1481,12 @@ Already installed containers were found on the server. All installed containers
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageSettingsApplication.qml" line="94"/>
|
||||
<source>Enable notifications</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>فعال کردن اعلانها</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageSettingsApplication.qml" line="95"/>
|
||||
<source>Enable notifications to show the VPN state in the status bar</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageSettingsApplication.qml" line="117"/>
|
||||
@@ -1565,7 +1566,7 @@ Already installed containers were found on the server. All installed containers
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageSettingsApplication.qml" line="240"/>
|
||||
<source>Cannot reset settings during active connection</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>نمیتوان تنظیمات را در حین اتصال فعال بازنشانی کرد.</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@@ -1644,7 +1645,7 @@ Already installed containers were found on the server. All installed containers
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageSettingsBackup.qml" line="153"/>
|
||||
<source>Cannot restore backup settings during active connection</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>نمیتوان تنظیمات پشتیبان را در حین اتصال فعال بازیابی کرد.</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@@ -1682,17 +1683,17 @@ Already installed containers were found on the server. All installed containers
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageSettingsConnection.qml" line="154"/>
|
||||
<source>KillSwitch</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>KillSwitch</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageSettingsConnection.qml" line="155"/>
|
||||
<source>Disables your internet if your encrypted VPN connection drops out for any reason.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>اگر به هر دلیلی اتصال VPN رمزگذاری شده شما قطع شود، اینترنت شما را غیرفعال میکند.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageSettingsConnection.qml" line="166"/>
|
||||
<source>Cannot change killSwitch settings during active connection</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>نمیتوان تنظیمات Kill Switch را در حین اتصال فعال تغییر داد.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageSettingsConnection.qml" line="97"/>
|
||||
@@ -1778,7 +1779,7 @@ Already installed containers were found on the server. All installed containers
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageSettingsLogging.qml" line="24"/>
|
||||
<source>Logging is enabled. Note that logs will be automatically disabled after 14 days, and all log files will be deleted.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>ثبت وقایع فعال است. توجه داشته باشید که ثبت وقایع بهطور خودکار پس از ۱۴ روز غیرفعال شده و تمام فایلهای ثبت وقایع حذف خواهند شد.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageSettingsLogging.qml" line="69"/>
|
||||
@@ -1919,7 +1920,7 @@ Already installed containers were found on the server. All installed containers
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageSettingsServerData.qml" line="134"/>
|
||||
<source>Cannot reboot server during active connection</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>نمیتوان سرور را در حین اتصال فعال راهاندازی مجدد کرد.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageSettingsServerData.qml" line="176"/>
|
||||
@@ -1929,7 +1930,7 @@ Already installed containers were found on the server. All installed containers
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageSettingsServerData.qml" line="183"/>
|
||||
<source>Cannot remove server during active connection</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>نمیتوان سرور را در حین اتصال فعال حذف کرد.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageSettingsServerData.qml" line="218"/>
|
||||
@@ -1944,7 +1945,7 @@ Already installed containers were found on the server. All installed containers
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageSettingsServerData.qml" line="225"/>
|
||||
<source>Cannot clear server from Amnezia software during active connection</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>نمیتوان سرور را در حین اتصال فعال از نرمافزار Amnezia پاک کرد.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageSettingsServerData.qml" line="253"/>
|
||||
@@ -1959,7 +1960,7 @@ Already installed containers were found on the server. All installed containers
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageSettingsServerData.qml" line="266"/>
|
||||
<source>Cannot reset API config during active connection</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>نمیتوان پیکربندی API را در حین اتصال فعال بازنشانی کرد.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageSettingsServerData.qml" line="162"/>
|
||||
@@ -2015,12 +2016,12 @@ Already installed containers were found on the server. All installed containers
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageSettingsServerProtocol.qml" line="135"/>
|
||||
<source>Clear %1 profile</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>پاک کردن پروفایل %1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageSettingsServerProtocol.qml" line="138"/>
|
||||
<source>Clear %1 profile?</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>آیا میخواهید پروفایل %1 را پاک کنید؟</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageSettingsServerProtocol.qml" line="137"/>
|
||||
@@ -2030,7 +2031,7 @@ Already installed containers were found on the server. All installed containers
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageSettingsServerProtocol.qml" line="145"/>
|
||||
<source>Unable to clear %1 profile while there is an active connection</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>نمیتوان پروفایل %1 را در حین اتصال فعال پاک کرد.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageSettingsServerProtocol.qml" line="186"/>
|
||||
@@ -2050,7 +2051,7 @@ Already installed containers were found on the server. All installed containers
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageSettingsServerProtocol.qml" line="198"/>
|
||||
<source>Cannot remove active container</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>نمیتوان کانتینر فعال را حذف کرد.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageSettingsServerProtocol.qml" line="140"/>
|
||||
@@ -2179,32 +2180,32 @@ Already installed containers were found on the server. All installed containers
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageSetupWizardApiServiceInfo.qml" line="62"/>
|
||||
<source>For the region</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>برای منطقه</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageSetupWizardApiServiceInfo.qml" line="71"/>
|
||||
<source>Price</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>قیمت</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageSetupWizardApiServiceInfo.qml" line="80"/>
|
||||
<source>Work period</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>مدت زمان کار</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageSetupWizardApiServiceInfo.qml" line="91"/>
|
||||
<source>Speed</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>سرعت</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageSetupWizardApiServiceInfo.qml" line="100"/>
|
||||
<source>Features</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>ویژگیها</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageSetupWizardApiServiceInfo.qml" line="139"/>
|
||||
<source>Connect</source>
|
||||
<translation type="unfinished">اتصال</translation>
|
||||
<translation>اتصال</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@@ -2212,12 +2213,12 @@ Already installed containers were found on the server. All installed containers
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageSetupWizardApiServicesList.qml" line="52"/>
|
||||
<source>VPN by Amnezia</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>VPN توسط Amnezia</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageSetupWizardApiServicesList.qml" line="53"/>
|
||||
<source>Choose a VPN service that suits your needs.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>یک سرویس VPN که مناسب نیازهای شما باشد را انتخاب کنید.</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@@ -2254,67 +2255,67 @@ It's okay as long as it's from someone you trust.</source>
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageSetupWizardConfigSource.qml" line="57"/>
|
||||
<source>Connection</source>
|
||||
<translation type="unfinished">ارتباط</translation>
|
||||
<translation>ارتباط</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageSetupWizardConfigSource.qml" line="67"/>
|
||||
<source>Insert the key, add a configuration file or scan the QR-code</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>کلید را وارد کنید، فایل پیکربندی را اضافه کنید یا کد QR را اسکن کنید</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageSetupWizardConfigSource.qml" line="77"/>
|
||||
<source>Insert key</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>کلید را وارد کنید</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageSetupWizardConfigSource.qml" line="78"/>
|
||||
<source>Insert</source>
|
||||
<translation type="unfinished">وارد کردن</translation>
|
||||
<translation>وارد کردن</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageSetupWizardConfigSource.qml" line="98"/>
|
||||
<source>Continue</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>ادامه دهید</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageSetupWizardConfigSource.qml" line="116"/>
|
||||
<source>Other connection options</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>گزینههای اتصال دیگر</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageSetupWizardConfigSource.qml" line="129"/>
|
||||
<source>VPN by Amnezia</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>VPN توسط Amnezia</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageSetupWizardConfigSource.qml" line="130"/>
|
||||
<source>Connect to classic paid and free VPN services from Amnezia</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>اتصال به سرویسهای VPN کلاسیک پولی و رایگان از Amnezia</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageSetupWizardConfigSource.qml" line="153"/>
|
||||
<source>Self-hosted VPN</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Self-hosted VPN</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageSetupWizardConfigSource.qml" line="154"/>
|
||||
<source>Configure Amnezia VPN on your own server</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>پیکربندی VPN Amnezia بر روی سرور خودتان</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageSetupWizardConfigSource.qml" line="174"/>
|
||||
<source>Restore from backup</source>
|
||||
<translation type="unfinished">بازیابی از پشتیبان</translation>
|
||||
<translation>بازیابی از پشتیبان</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageSetupWizardConfigSource.qml" line="180"/>
|
||||
<source>Open backup file</source>
|
||||
<translation type="unfinished">باز کردن فایل پشتیبان</translation>
|
||||
<translation>باز کردن فایل پشتیبان</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageSetupWizardConfigSource.qml" line="181"/>
|
||||
<source>Backup files (*.backup)</source>
|
||||
<translation type="unfinished">Backup files (*.backup)</translation>
|
||||
<translation>Backup files (*.backup)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageSetupWizardConfigSource.qml" line="206"/>
|
||||
@@ -2329,7 +2330,7 @@ It's okay as long as it's from someone you trust.</source>
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageSetupWizardConfigSource.qml" line="248"/>
|
||||
<source>I have nothing</source>
|
||||
<translation type="unfinished">من هیچی ندارم</translation>
|
||||
<translation>من هیچی ندارم</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Key as text</source>
|
||||
@@ -2381,12 +2382,12 @@ It's okay as long as it's from someone you trust.</source>
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageSetupWizardCredentials.qml" line="153"/>
|
||||
<source>How to run your VPN server</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>چگونه سرور VPN خود را اجرا کنید</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageSetupWizardCredentials.qml" line="154"/>
|
||||
<source>Where to get connection data, step-by-step instructions for buying a VPS</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>دادههای اتصال را از کجا دریافت کنید و دستورالعملهای مرحله به مرحله برای خرید یک VPS</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageSetupWizardCredentials.qml" line="170"/>
|
||||
@@ -2501,7 +2502,7 @@ It's okay as long as it's from someone you trust.</source>
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageSetupWizardProtocolSettings.qml" line="267"/>
|
||||
<source>The port must be in the range of 1 to 65535</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>پورت باید در محدوده ۱ تا ۶۵۵۳۵ باشد</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@@ -2550,7 +2551,7 @@ It's okay as long as it's from someone you trust.</source>
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageSetupWizardStart.qml" line="48"/>
|
||||
<source>Let's get started</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>بیایید شروع کنیم</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@@ -2601,7 +2602,7 @@ It's okay as long as it's from someone you trust.</source>
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageSetupWizardViewConfig.qml" line="123"/>
|
||||
<source>Enable WireGuard obfuscation. It may be useful if WireGuard is blocked on your provider.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>فعالسازی استتار WireGuard. این ممکن است مفید باشد اگر WireGuard توسط ارائهدهنده شما مسدود شده باشد.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageSetupWizardViewConfig.qml" line="144"/>
|
||||
@@ -2680,7 +2681,7 @@ It's okay as long as it's from someone you trust.</source>
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageShare.qml" line="96"/>
|
||||
<source>Save XRay config</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>ذخیره پیکربندی XRay</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageShare.qml" line="122"/>
|
||||
@@ -2705,7 +2706,7 @@ It's okay as long as it's from someone you trust.</source>
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageShare.qml" line="152"/>
|
||||
<source>XRay native format</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>فرمت بومی XRay</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageShare.qml" line="190"/>
|
||||
@@ -2741,22 +2742,22 @@ It's okay as long as it's from someone you trust.</source>
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageShare.qml" line="817"/>
|
||||
<source>Creation date: %1</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>تاریخ ایجاد: %1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageShare.qml" line="825"/>
|
||||
<source>Latest handshake: %1</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>آخرین ارتباط: %1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageShare.qml" line="833"/>
|
||||
<source>Data received: %1</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>دادههای دریافت شده: %1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageShare.qml" line="841"/>
|
||||
<source>Data sent: %1</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>دادههای ارسال شده: %1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Creation date: </source>
|
||||
@@ -2882,12 +2883,12 @@ It's okay as long as it's from someone you trust.</source>
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageStart.qml" line="198"/>
|
||||
<source>Logging was disabled after 14 days, log files were deleted</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>ثبت وقایع پس از ۱۴ روز غیرفعال شد و فایلهای ثبت وقایع حذف شدند</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageStart.qml" line="202"/>
|
||||
<source>Settings restored from backup file</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>تنظیمات از فایل پشتیبان بازیابی شد</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@@ -3296,17 +3297,17 @@ It's okay as long as it's from someone you trust.</source>
|
||||
<message>
|
||||
<location filename="../core/errorstrings.cpp" line="14"/>
|
||||
<source>Background service is not running</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Background service is not running</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../core/errorstrings.cpp" line="23"/>
|
||||
<source>Server error: Packet manager error</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Server error: Packet manager error</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../core/errorstrings.cpp" line="34"/>
|
||||
<source>SCP error: Generic failure</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>SCP error: Generic failure</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../core/errorstrings.cpp" line="38"/>
|
||||
@@ -3356,17 +3357,17 @@ It's okay as long as it's from someone you trust.</source>
|
||||
<message>
|
||||
<location filename="../core/errorstrings.cpp" line="60"/>
|
||||
<source>In the response from the server, an empty config was received</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>در پاسخ از سرور، پیکربندی خالی دریافت شد</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../core/errorstrings.cpp" line="61"/>
|
||||
<source>SSL error occurred</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation type="unfinished">SSL error occurred</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../core/errorstrings.cpp" line="62"/>
|
||||
<source>Server response timeout on api request</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Server response timeout on api request</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../core/errorstrings.cpp" line="63"/>
|
||||
@@ -3426,12 +3427,12 @@ It's okay as long as it's from someone you trust.</source>
|
||||
<message>
|
||||
<location filename="../containers/containers_defs.cpp" line="127"/>
|
||||
<source>XRay with REALITY - Suitable for countries with the highest level of internet censorship. Traffic masking as web traffic at the TLS level, and protection against detection by active probing methods.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>XRay با REALITY - مناسب برای کشورهایی با بالاترین سطح سانسور اینترنت. استتار ترافیک به عنوان ترافیک وب در سطح TLS و حفاظت در برابر شناسایی با روشهای پروب فعال.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../containers/containers_defs.cpp" line="130"/>
|
||||
<source>IKEv2/IPsec - Modern stable protocol, a bit faster than others, restores connection after signal loss. It has native support on the latest versions of Android and iOS.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>IKEv2/IPsec - پروتکل مدرن و پایدار، کمی سریعتر از سایرین است و پس از قطع شدن سیگنال، اتصال را بازیابی میکند. از پشتیبانی بومی در آخرین نسخههای Android و iOS برخوردار است.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../containers/containers_defs.cpp" line="137"/>
|
||||
@@ -3504,7 +3505,11 @@ WireGuard به دلیل امضاهای بسته متمایز خود، بسیار
|
||||
It uniquely identifies censors during the TLS handshake phase, seamlessly operating as a proxy for legitimate clients while diverting censors to genuine websites like google.com, thus presenting an authentic TLS certificate and data.
|
||||
This advanced capability differentiates REALITY from similar technologies by its ability to disguise web traffic as coming from random, legitimate sites without the need for specific configurations.
|
||||
Unlike older protocols such as VMess, VLESS, and the XTLS-Vision transport, REALITY's innovative "friend or foe" recognition at the TLS handshake enhances security and circumvents detection by sophisticated DPI systems employing active probing techniques. This makes REALITY a robust solution for maintaining internet freedom in environments with stringent censorship.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>پروتکل REALITY، یک توسعه پیشگامانه توسط خالقان XRay، بهطور خاص برای مقابله با بالاترین سطح سانسور اینترنتی طراحی شده است و از رویکرد نوآورانهای برای دور زدن محدودیتها استفاده میکند.
|
||||
|
||||
REALITY بهطور منحصربهفردی سانسورچیان را در مرحله دستدهی TLS شناسایی میکند و بهصورت یکپارچه بهعنوان پراکسی برای کاربران قانونی عمل میکند، در حالی که سانسورچیان را به سایتهای معتبر مانند google.com هدایت میکند و در نتیجه یک گواهی TLS واقعی و دادههای اصلی ارائه میدهد.
|
||||
|
||||
این قابلیت پیشرفته، REALITY را از فناوریهای مشابه متمایز میکند، زیرا میتواند ترافیک وب را بدون نیاز به پیکربندیهای خاص، بهعنوان ترافیک از سایتهای تصادفی و معتبر جا بزند. برخلاف پروتکلهای قدیمیتر مانند VMess، VLESS و انتقال XTLS-Vision، تشخیص نوآورانه "دوست یا دشمن" REALITY در مرحله دستدهی TLS امنیت را افزایش داده و از شناسایی توسط سیستمهای پیشرفته DPI که از تکنیکهای پروب فعال استفاده میکنند، جلوگیری میکند. این ویژگی REALITY را به یک راهحل قوی برای حفظ آزادی اینترنت در محیطهایی با سانسور شدید تبدیل میکند.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../containers/containers_defs.cpp" line="230"/>
|
||||
@@ -3665,7 +3670,7 @@ For more detailed information, you can
|
||||
<location filename="../containers/containers_defs.cpp" line="104"/>
|
||||
<location filename="../containers/containers_defs.cpp" line="248"/>
|
||||
<source>SOCKS5 proxy server</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>سرور پروکسی SOCKS5</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../3rd/qtkeychain/qtkeychain/libsecret.cpp" line="119"/>
|
||||
|
||||
@@ -6,47 +6,47 @@
|
||||
<message>
|
||||
<location filename="../ui/models/apiServicesModel.cpp" line="63"/>
|
||||
<source>Classic VPN for comfortable work, downloading large files and watching videos. Works for any sites. Speed up to %1 MBit/s</source>
|
||||
<translation>Классический VPN для комфортной работы, загрузки больших файлов и просмотра видео. Работает для любых сайтов. Скорость до %1 Мбит/с</translation>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/models/apiServicesModel.cpp" line="67"/>
|
||||
<source>VPN to access blocked sites in regions with high levels of Internet censorship. </source>
|
||||
<translation>VPN для доступа к заблокированным сайтам в регионах с высоким уровнем интернет-цензуры. </translation>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/models/apiServicesModel.cpp" line="72"/>
|
||||
<source>Amnezia Premium - A classic VPN for comfortable work, downloading large files, and watching videos in high resolution. It works for all websites, even in countries with the highest level of internet censorship.</source>
|
||||
<translation>Amnezia Premium — классический VPN для комфортной работы, загрузки больших файлов и просмотра видео в высоком разрешении. Работает на всех сайтах, даже в странах с самым высоким уровнем интернет-цензуры.</translation>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/models/apiServicesModel.cpp" line="75"/>
|
||||
<source>Amnezia Free is a free VPN to bypass blocking in countries with high levels of internet censorship</source>
|
||||
<translation>Amnezia Free - это бесплатный VPN для обхода блокировок в странах с высоким уровнем интернет-цензуры</translation>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/models/apiServicesModel.cpp" line="80"/>
|
||||
<source>%1 MBit/s</source>
|
||||
<translation></translation>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/models/apiServicesModel.cpp" line="87"/>
|
||||
<source>%1 days</source>
|
||||
<translation>%1 дней</translation>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/models/apiServicesModel.cpp" line="96"/>
|
||||
<source>VPN will open only popular sites blocked in your region, such as Instagram, Facebook, Twitter and others. Other sites will be opened from your real IP address, <a href="%1/free" style="color: #FBB26A;">more details on the website.</a></source>
|
||||
<translation>Через VPN будут открываться только популярные сайты, заблокированные в вашем регионе, такие как Instagram, Facebook, Twitter и другие. Остальные сайты будут открываться с вашего реального IP-адреса, <a href="%1/free" style="color: #FBB26A;">подробности на сайте.</a></translation>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/models/apiServicesModel.cpp" line="104"/>
|
||||
<source>Free</source>
|
||||
<translation>Бесплатно</translation>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/models/apiServicesModel.cpp" line="106"/>
|
||||
<source>%1 $/month</source>
|
||||
<translation>%1 $/месяц</translation>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@@ -329,7 +329,7 @@ Already installed containers were found on the server. All installed containers
|
||||
<message>
|
||||
<location filename="../ui/controllers/installController.cpp" line="608"/>
|
||||
<source>Api config removed</source>
|
||||
<translation>Конфигурация API удалена</translation>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/controllers/installController.cpp" line="630"/>
|
||||
@@ -349,17 +349,17 @@ Already installed containers were found on the server. All installed containers
|
||||
<message>
|
||||
<location filename="../ui/controllers/installController.cpp" line="845"/>
|
||||
<source>%1 installed successfully.</source>
|
||||
<translation>%1 успешно установлен.</translation>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/controllers/installController.cpp" line="877"/>
|
||||
<source>API config reloaded</source>
|
||||
<translation>Конфигурация API перезагружена</translation>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/controllers/installController.cpp" line="881"/>
|
||||
<source>Successfully changed the country of connection to %1</source>
|
||||
<translation>Изменение страны подключения на %1</translation>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@@ -1353,22 +1353,22 @@ Already installed containers were found on the server. All installed containers
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageSettingsApiServerInfo.qml" line="45"/>
|
||||
<source>For the region</source>
|
||||
<translation>Для региона</translation>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageSettingsApiServerInfo.qml" line="54"/>
|
||||
<source>Price</source>
|
||||
<translation>Цена</translation>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageSettingsApiServerInfo.qml" line="63"/>
|
||||
<source>Work period</source>
|
||||
<translation>Период работы</translation>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageSettingsApiServerInfo.qml" line="74"/>
|
||||
<source>Speed</source>
|
||||
<translation>Скорость</translation>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageSettingsApiServerInfo.qml" line="106"/>
|
||||
@@ -1378,49 +1378,49 @@ Already installed containers were found on the server. All installed containers
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageSettingsApiServerInfo.qml" line="119"/>
|
||||
<source>Copied</source>
|
||||
<translation>Скопировано</translation>
|
||||
<translation type="unfinished">Скопировано</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageSettingsApiServerInfo.qml" line="139"/>
|
||||
<source>Reload API config</source>
|
||||
<translation>Перезагрузить конфигурацию API</translation>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageSettingsApiServerInfo.qml" line="144"/>
|
||||
<source>Reload API config?</source>
|
||||
<translation>Перезагрузить конфигурацию API?</translation>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageSettingsApiServerInfo.qml" line="145"/>
|
||||
<location filename="../ui/qml/Pages2/PageSettingsApiServerInfo.qml" line="185"/>
|
||||
<source>Continue</source>
|
||||
<translation>Продолжить</translation>
|
||||
<translation type="unfinished">Продолжить</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageSettingsApiServerInfo.qml" line="146"/>
|
||||
<location filename="../ui/qml/Pages2/PageSettingsApiServerInfo.qml" line="186"/>
|
||||
<source>Cancel</source>
|
||||
<translation>Отменить</translation>
|
||||
<translation type="unfinished">Отменить</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageSettingsApiServerInfo.qml" line="150"/>
|
||||
<source>Cannot reload API config during active connection</source>
|
||||
<translation>Невозможно перзагрузить API конфигурацию при активном соединении</translation>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageSettingsApiServerInfo.qml" line="179"/>
|
||||
<source>Remove from application</source>
|
||||
<translation>Удалить из приложения</translation>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageSettingsApiServerInfo.qml" line="184"/>
|
||||
<source>Remove from application?</source>
|
||||
<translation>Удалить из приложения?</translation>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageSettingsApiServerInfo.qml" line="190"/>
|
||||
<source>Cannot remove server during active connection</source>
|
||||
<translation>Невозможно удалить сервер во время активного соединения</translation>
|
||||
<translation type="unfinished">Невозможно удалить сервер во время активного соединения</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@@ -1714,7 +1714,7 @@ Already installed containers were found on the server. All installed containers
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageSettingsConnection.qml" line="154"/>
|
||||
<source>KillSwitch</source>
|
||||
<translation>KillSwitch</translation>
|
||||
<translation>Аварийный выключатель</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageSettingsConnection.qml" line="155"/>
|
||||
@@ -2247,32 +2247,32 @@ Already installed containers were found on the server. All installed containers
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageSetupWizardApiServiceInfo.qml" line="62"/>
|
||||
<source>For the region</source>
|
||||
<translation>Для региона</translation>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageSetupWizardApiServiceInfo.qml" line="71"/>
|
||||
<source>Price</source>
|
||||
<translation>Цена</translation>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageSetupWizardApiServiceInfo.qml" line="80"/>
|
||||
<source>Work period</source>
|
||||
<translation>Период работы</translation>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageSetupWizardApiServiceInfo.qml" line="91"/>
|
||||
<source>Speed</source>
|
||||
<translation>Скорость</translation>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageSetupWizardApiServiceInfo.qml" line="100"/>
|
||||
<source>Features</source>
|
||||
<translation>Особенности</translation>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageSetupWizardApiServiceInfo.qml" line="139"/>
|
||||
<source>Connect</source>
|
||||
<translation>Подключиться</translation>
|
||||
<translation type="unfinished">Подключиться</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@@ -2280,12 +2280,12 @@ Already installed containers were found on the server. All installed containers
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageSetupWizardApiServicesList.qml" line="52"/>
|
||||
<source>VPN by Amnezia</source>
|
||||
<translation>VPN от Amnezia</translation>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageSetupWizardApiServicesList.qml" line="53"/>
|
||||
<source>Choose a VPN service that suits your needs.</source>
|
||||
<translation>Выберите VPN-сервис, который подходит именно вам.</translation>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@@ -2322,67 +2322,67 @@ It's okay as long as it's from someone you trust.</source>
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageSetupWizardConfigSource.qml" line="57"/>
|
||||
<source>Connection</source>
|
||||
<translation>Соединение</translation>
|
||||
<translation type="unfinished">Соединение</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageSetupWizardConfigSource.qml" line="67"/>
|
||||
<source>Insert the key, add a configuration file or scan the QR-code</source>
|
||||
<translation>Вставьте ключ, добавьте файл конфигурации или отсканируйте QR-код</translation>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageSetupWizardConfigSource.qml" line="77"/>
|
||||
<source>Insert key</source>
|
||||
<translation>Вставьте ключ</translation>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageSetupWizardConfigSource.qml" line="78"/>
|
||||
<source>Insert</source>
|
||||
<translation>Вставить</translation>
|
||||
<translation type="unfinished">Вставить</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageSetupWizardConfigSource.qml" line="98"/>
|
||||
<source>Continue</source>
|
||||
<translation>Продолжить</translation>
|
||||
<translation type="unfinished">Продолжить</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageSetupWizardConfigSource.qml" line="116"/>
|
||||
<source>Other connection options</source>
|
||||
<translation>Другие варианты подключения</translation>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageSetupWizardConfigSource.qml" line="129"/>
|
||||
<source>VPN by Amnezia</source>
|
||||
<translation>VPN от Amnezia</translation>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageSetupWizardConfigSource.qml" line="130"/>
|
||||
<source>Connect to classic paid and free VPN services from Amnezia</source>
|
||||
<translation>Подключайтесь к классическим платным и бесплатным VPN-сервисам от Amnezia</translation>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageSetupWizardConfigSource.qml" line="153"/>
|
||||
<source>Self-hosted VPN</source>
|
||||
<translation>Self-hosted VPN</translation>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageSetupWizardConfigSource.qml" line="154"/>
|
||||
<source>Configure Amnezia VPN on your own server</source>
|
||||
<translation>Настроить VPN на собственном сервере</translation>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageSetupWizardConfigSource.qml" line="174"/>
|
||||
<source>Restore from backup</source>
|
||||
<translation>Восстановить из резервной копии</translation>
|
||||
<translation type="unfinished">Восстановить из резервной копии</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageSetupWizardConfigSource.qml" line="180"/>
|
||||
<source>Open backup file</source>
|
||||
<translation>Открыть резервную копию</translation>
|
||||
<translation type="unfinished">Открыть резервную копию</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageSetupWizardConfigSource.qml" line="181"/>
|
||||
<source>Backup files (*.backup)</source>
|
||||
<translation>Файлы резервных копий (*.backup)</translation>
|
||||
<translation type="unfinished">Файлы резервных копий (*.backup)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageSetupWizardConfigSource.qml" line="206"/>
|
||||
@@ -2397,7 +2397,7 @@ It's okay as long as it's from someone you trust.</source>
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageSetupWizardConfigSource.qml" line="248"/>
|
||||
<source>I have nothing</source>
|
||||
<translation>У меня ничего нет</translation>
|
||||
<translation type="unfinished">У меня ничего нет</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Key as text</source>
|
||||
@@ -2470,12 +2470,12 @@ and will not be shared or disclosed to the Amnezia or any third parties</source>
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageSetupWizardCredentials.qml" line="153"/>
|
||||
<source>How to run your VPN server</source>
|
||||
<translation>Как создать VPN на собственном сервере</translation>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageSetupWizardCredentials.qml" line="154"/>
|
||||
<source>Where to get connection data, step-by-step instructions for buying a VPS</source>
|
||||
<translation>Где взять данные для подключения, пошаговые инстуркции по покупке VPS</translation>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageSetupWizardCredentials.qml" line="170"/>
|
||||
@@ -2655,7 +2655,7 @@ and will not be shared or disclosed to the Amnezia or any third parties</source>
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageSetupWizardStart.qml" line="48"/>
|
||||
<source>Let's get started</source>
|
||||
<translation>Приступим</translation>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@@ -3016,7 +3016,7 @@ and will not be shared or disclosed to the Amnezia or any third parties</source>
|
||||
<message>
|
||||
<location filename="../ui/qml/Pages2/PageStart.qml" line="202"/>
|
||||
<source>Settings restored from backup file</source>
|
||||
<translation>Настройки восстановлены из бэкап файла</translation>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
|
||||
@@ -395,11 +395,7 @@ QJsonObject ImportController::extractWireGuardConfig(const QString &data)
|
||||
lastConfig[config_key::mtu] = configMap.value("MTU");
|
||||
}
|
||||
|
||||
if (!configMap.value("PersistentKeepalive").isEmpty()) {
|
||||
lastConfig[config_key::persistent_keep_alive] = configMap.value("PersistentKeepalive");
|
||||
}
|
||||
|
||||
QJsonArray allowedIpsJsonArray = QJsonArray::fromStringList(configMap.value("AllowedIPs").split(", "));
|
||||
QJsonArray allowedIpsJsonArray = QJsonArray::fromStringList(configMap.value("AllowedIPs").split(","));
|
||||
|
||||
lastConfig[config_key::allowed_ips] = allowedIpsJsonArray;
|
||||
|
||||
|
||||
@@ -131,7 +131,7 @@ void PageController::showOnStartup()
|
||||
if (!m_settings->isStartMinimized()) {
|
||||
emit raiseMainWindow();
|
||||
} else {
|
||||
#if defined(Q_OS_WIN) || defined(Q_OS_LINUX)
|
||||
#ifdef Q_OS_WIN
|
||||
emit hideMainWindow();
|
||||
#elif defined Q_OS_MACX
|
||||
setDockIconVisible(false);
|
||||
|
||||
@@ -694,16 +694,7 @@ bool ServersModel::isDefaultServerDefaultContainerHasSplitTunneling()
|
||||
QJsonObject serverProtocolConfig = container.value(ContainerProps::containerTypeToString(defaultContainer)).toObject();
|
||||
QString clientProtocolConfigString = serverProtocolConfig.value(config_key::last_config).toString();
|
||||
QJsonObject clientProtocolConfig = QJsonDocument::fromJson(clientProtocolConfigString.toUtf8()).object();
|
||||
QString nativeProtocolConfigString = clientProtocolConfig.value(config_key::config).toString();
|
||||
|
||||
const static QRegularExpression allowedIpsRegExp("AllowedIPs\\s*=\\s*([^\n]*)");
|
||||
QRegularExpressionMatch allowedIpsMatch = allowedIpsRegExp.match(nativeProtocolConfigString);
|
||||
QString allowedIpsString;
|
||||
if (allowedIpsMatch.hasCaptured(1)) {
|
||||
allowedIpsString = allowedIpsMatch.captured(1);
|
||||
}
|
||||
|
||||
return !allowedIpsString.contains("0.0.0.0/0")
|
||||
return (clientProtocolConfigString.contains("AllowedIPs") && !clientProtocolConfigString.contains("AllowedIPs = 0.0.0.0/0, ::/0"))
|
||||
|| (!clientProtocolConfig.value(config_key::allowed_ips).toArray().isEmpty()
|
||||
&& !clientProtocolConfig.value(config_key::allowed_ips).toArray().contains("0.0.0.0/0"));
|
||||
} else if (defaultContainer == DockerContainer::Cloak || defaultContainer == DockerContainer::OpenVpn
|
||||
|
||||
@@ -11,7 +11,7 @@ import "../Config"
|
||||
DrawerType2 {
|
||||
id: root
|
||||
|
||||
property bool isAppSplitTunnelingEnabled: Qt.platform.os === "windows" || Qt.platform.os === "android"
|
||||
property bool isAppSplitTinnelingEnabled: Qt.platform.os === "windows" || Qt.platform.os === "android"
|
||||
|
||||
anchors.fill: parent
|
||||
expandedHeight: parent.height * 0.9
|
||||
@@ -24,8 +24,6 @@ DrawerType2 {
|
||||
anchors.right: parent.right
|
||||
spacing: 0
|
||||
|
||||
property bool isServerSplitTunnelingEnabled: ServersModel.isDefaultServerDefaultContainerHasSplitTunneling
|
||||
|
||||
Connections {
|
||||
target: root
|
||||
enabled: !GC.isMobile()
|
||||
@@ -55,7 +53,7 @@ DrawerType2 {
|
||||
Layout.fillWidth: true
|
||||
Layout.topMargin: 16
|
||||
|
||||
visible: isServerSplitTunnelingEnabled
|
||||
visible: ServersModel.isDefaultServerDefaultContainerHasSplitTunneling
|
||||
|
||||
text: qsTr("Split tunneling on the server")
|
||||
descriptionText: qsTr("Enabled \nCan't be disabled for current server")
|
||||
@@ -70,7 +68,7 @@ DrawerType2 {
|
||||
}
|
||||
|
||||
DividerType {
|
||||
visible: isServerSplitTunnelingEnabled
|
||||
visible: ServersModel.isDefaultServerDefaultContainerHasSplitTunneling
|
||||
}
|
||||
|
||||
LabelWithButtonType {
|
||||
@@ -97,7 +95,7 @@ DrawerType2 {
|
||||
|
||||
LabelWithButtonType {
|
||||
id: appSplitTunnelingSwitch
|
||||
visible: isAppSplitTunnelingEnabled
|
||||
visible: isAppSplitTinnelingEnabled
|
||||
|
||||
Layout.fillWidth: true
|
||||
|
||||
@@ -114,7 +112,7 @@ DrawerType2 {
|
||||
}
|
||||
|
||||
DividerType {
|
||||
visible: isAppSplitTunnelingEnabled
|
||||
visible: isAppSplitTinnelingEnabled
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -120,7 +120,7 @@ PageType {
|
||||
id: mailButton
|
||||
Layout.fillWidth: true
|
||||
|
||||
text: qsTr("support@amnezia.org")
|
||||
text: qsTr("Mail")
|
||||
descriptionText: qsTr("For reviews and bug reports")
|
||||
leftImageSource: "qrc:/images/controls/mail.svg"
|
||||
|
||||
@@ -128,8 +128,6 @@ PageType {
|
||||
parentFlickable: fl
|
||||
|
||||
clickedFunction: function() {
|
||||
GC.copyToClipBoard(text)
|
||||
PageController.showNotificationMessage(qsTr("Copied"))
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
+32
-57
@@ -291,68 +291,43 @@ void VpnConnection::appendKillSwitchConfig()
|
||||
|
||||
void VpnConnection::appendSplitTunnelingConfig()
|
||||
{
|
||||
// this block is for old native configs and for old self-hosted configs
|
||||
auto protocolName = m_vpnConfiguration.value(config_key::vpnproto).toString();
|
||||
if (protocolName == ProtocolProps::protoToString(Proto::Awg) || protocolName == ProtocolProps::protoToString(Proto::WireGuard)) {
|
||||
auto configData = m_vpnConfiguration.value(protocolName + "_config_data").toObject();
|
||||
if (configData.value(config_key::allowed_ips).isString()) {
|
||||
QJsonArray allowedIpsJsonArray = QJsonArray::fromStringList(configData.value(config_key::allowed_ips).toString().split(", "));
|
||||
configData.insert(config_key::allowed_ips, allowedIpsJsonArray);
|
||||
m_vpnConfiguration.insert(protocolName + "_config_data", configData);
|
||||
} else if (configData.value(config_key::allowed_ips).isUndefined()) {
|
||||
auto nativeConfig = configData.value(config_key::config).toString();
|
||||
auto nativeConfigLines = nativeConfig.split("\n");
|
||||
for (auto &line : nativeConfigLines) {
|
||||
if (line.contains("AllowedIPs")) {
|
||||
auto allowedIpsString = line.split(" = ");
|
||||
if (allowedIpsString.size() < 1) {
|
||||
break;
|
||||
}
|
||||
QJsonArray allowedIpsJsonArray = QJsonArray::fromStringList(allowedIpsString.at(1).split(", "));
|
||||
configData.insert(config_key::allowed_ips, allowedIpsJsonArray);
|
||||
m_vpnConfiguration.insert(protocolName + "_config_data", configData);
|
||||
break;
|
||||
}
|
||||
if (m_vpnConfiguration.value(config_key::configVersion).toInt()) {
|
||||
auto protocolName = m_vpnConfiguration.value(config_key::vpnproto).toString();
|
||||
if (protocolName == ProtocolProps::protoToString(Proto::Awg)) {
|
||||
auto configData = m_vpnConfiguration.value(protocolName + "_config_data").toObject();
|
||||
QJsonArray allowedIpsJsonArray = QJsonArray::fromStringList(configData.value("allowed_ips").toString().split(","));
|
||||
QJsonArray defaultAllowedIP = QJsonArray::fromStringList(QString("0.0.0.0/0, ::/0").split(","));
|
||||
|
||||
if (allowedIpsJsonArray != defaultAllowedIP) {
|
||||
allowedIpsJsonArray.append(m_vpnConfiguration.value(config_key::dns1).toString());
|
||||
allowedIpsJsonArray.append(m_vpnConfiguration.value(config_key::dns2).toString());
|
||||
|
||||
m_vpnConfiguration.insert(config_key::splitTunnelType, Settings::RouteMode::VpnOnlyForwardSites);
|
||||
m_vpnConfiguration.insert(config_key::splitTunnelSites, allowedIpsJsonArray);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
Settings::RouteMode routeMode = Settings::RouteMode::VpnAllSites;
|
||||
QJsonArray sitesJsonArray;
|
||||
if (m_settings->isSitesSplitTunnelingEnabled()) {
|
||||
routeMode = m_settings->routeMode();
|
||||
|
||||
auto sites = m_settings->getVpnIps(routeMode);
|
||||
for (const auto &site : sites) {
|
||||
sitesJsonArray.append(site);
|
||||
}
|
||||
|
||||
// Allow traffic to Amnezia DNS
|
||||
if (routeMode == Settings::VpnOnlyForwardSites) {
|
||||
sitesJsonArray.append(m_vpnConfiguration.value(config_key::dns1).toString());
|
||||
sitesJsonArray.append(m_vpnConfiguration.value(config_key::dns2).toString());
|
||||
}
|
||||
}
|
||||
|
||||
if (configData.value(config_key::persistent_keep_alive).isUndefined()) {
|
||||
auto nativeConfig = configData.value(config_key::config).toString();
|
||||
auto nativeConfigLines = nativeConfig.split("\n");
|
||||
for (auto &line : nativeConfigLines) {
|
||||
if (line.contains("PersistentKeepalive")) {
|
||||
auto persistentKeepaliveString = line.split(" = ");
|
||||
if (persistentKeepaliveString.size() < 1) {
|
||||
break;
|
||||
}
|
||||
configData.insert(config_key::persistent_keep_alive, persistentKeepaliveString.at(1));
|
||||
m_vpnConfiguration.insert(protocolName + "_config_data", configData);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
m_vpnConfiguration.insert(config_key::splitTunnelType, routeMode);
|
||||
m_vpnConfiguration.insert(config_key::splitTunnelSites, sitesJsonArray);
|
||||
}
|
||||
|
||||
Settings::RouteMode routeMode = Settings::RouteMode::VpnAllSites;
|
||||
QJsonArray sitesJsonArray;
|
||||
if (m_settings->isSitesSplitTunnelingEnabled()) {
|
||||
routeMode = m_settings->routeMode();
|
||||
|
||||
auto sites = m_settings->getVpnIps(routeMode);
|
||||
for (const auto &site : sites) {
|
||||
sitesJsonArray.append(site);
|
||||
}
|
||||
|
||||
// Allow traffic to Amnezia DNS
|
||||
if (routeMode == Settings::VpnOnlyForwardSites) {
|
||||
sitesJsonArray.append(m_vpnConfiguration.value(config_key::dns1).toString());
|
||||
sitesJsonArray.append(m_vpnConfiguration.value(config_key::dns2).toString());
|
||||
}
|
||||
}
|
||||
|
||||
m_vpnConfiguration.insert(config_key::splitTunnelType, routeMode);
|
||||
m_vpnConfiguration.insert(config_key::splitTunnelSites, sitesJsonArray);
|
||||
|
||||
Settings::AppsRouteMode appsRouteMode = Settings::AppsRouteMode::VpnAllApps;
|
||||
QJsonArray appsJsonArray;
|
||||
if (m_settings->isAppsSplitTunnelingEnabled()) {
|
||||
|
||||
Reference in New Issue
Block a user