Compare commits

..

12 Commits

Author SHA1 Message Date
albexk b1709788a1 Bump version to 4.6.0.0 2024-06-18 17:54:36 +03:00
albexk 3935db5302 Update 3rd-prebuilt 2024-06-18 17:51:27 +03:00
albexk 0809e41a24 Merge branch 'dev' into feature/android-xray 2024-06-18 17:49:53 +03:00
albexk 99b33a812b Fix assets path for xray geo files 2024-06-10 21:42:09 +03:00
albexk 11624b38bd Update 3rd-prebuilt
Fix tun2socks for Android armv7
2024-06-09 15:26:40 +03:00
albexk 4bf6734c2a Merge branch 'dev' into feature/android-xray 2024-06-04 21:18:57 +03:00
albexk 267781bfdc Split protocols into separate processes 2024-06-04 21:16:21 +03:00
albexk 5a3f65df8b Add Android XRay implementation 2024-05-27 17:35:35 +03:00
albexk 5066ecbd56 Add libxray module 2024-05-27 17:13:33 +03:00
albexk 0b94a5b520 Update 3rd-prebuilt 2024-05-27 16:34:01 +03:00
albexk ddd635dc4b Merge branch 'dev' into feature/android-xray 2024-05-27 16:31:23 +03:00
albexk e74afc94fd Add XRay module 2024-05-20 15:15:22 +03:00
109 changed files with 931 additions and 1403 deletions
+2 -2
View File
@@ -2,7 +2,7 @@ cmake_minimum_required(VERSION 3.25.0 FATAL_ERROR)
set(PROJECT AmneziaVPN)
project(${PROJECT} VERSION 4.6.0.3
project(${PROJECT} VERSION 4.6.0.0
DESCRIPTION "AmneziaVPN"
HOMEPAGE_URL "https://amnezia.org/"
)
@@ -11,7 +11,7 @@ string(TIMESTAMP CURRENT_DATE "%Y-%m-%d")
set(RELEASE_DATE "${CURRENT_DATE}")
set(APP_MAJOR_VERSION ${CMAKE_PROJECT_VERSION_MAJOR}.${CMAKE_PROJECT_VERSION_MINOR}.${CMAKE_PROJECT_VERSION_PATCH})
set(APP_ANDROID_VERSION_CODE 55)
set(APP_ANDROID_VERSION_CODE 53)
if(${CMAKE_SYSTEM_NAME} STREQUAL "Linux")
set(MZ_PLATFORM_NAME "linux")
+7 -23
View File
@@ -6,24 +6,10 @@
Amnezia is an open-source VPN client, with a key feature that enables you to deploy your own VPN server on your server.
![Image](https://github.com/amnezia-vpn/amnezia-client/blob/IMGs-for-Readme/metadata/img-readme/readme-baner.png)
<div style="display: flex; justify-content: center; gap: 10px;">
<a href="https://github.com/amnezia-vpn/amnezia-client/releases/download/4.5.3.0/AmneziaVPN_4.5.3.0_x64.exe"><img src="https://github.com/amnezia-vpn/amnezia-client/blob/IMGs-for-Readme/metadata/img-readme/win.png" width="200" style="max-width: 100%;"></a>
<a href="https://github.com/amnezia-vpn/amnezia-client/releases/download/4.5.3.0/AmneziaVPN_4.5.3.0.dmg"><img src="https://github.com/amnezia-vpn/amnezia-client/blob/IMGs-for-Readme/metadata/img-readme/mac.png" width="200" style="max-width: 100%;"></a>
<a href="https://github.com/amnezia-vpn/amnezia-client/releases/download/4.5.3.0/AmneziaVPN_Linux_installer.tar.zip"><img src="https://github.com/amnezia-vpn/amnezia-client/blob/IMGs-for-Readme/metadata/img-readme/lin.png" width="200" style="max-width: 100%;"></a>
<a href="https://play.google.com/store/search?q=amnezia+vpn&c=apps"><img src="https://github.com/amnezia-vpn/amnezia-client/blob/IMGs-for-Readme/metadata/img-readme/play.png" width="200" style="max-width: 100%;"></a>
<a href="https://apps.apple.com/us/app/amneziavpn/id1600529900"><img src="https://github.com/amnezia-vpn/amnezia-client/blob/IMGs-for-Readme/metadata/img-readme/apl.png" width="200" style="max-width: 100%;"></a>
<a href="https://github.com/amnezia-vpn/amnezia-client/releases/download/4.5.3.0/AmneziaVPN-arm64-v8a-release.apk"><img src="https://github.com/amnezia-vpn/amnezia-client/blob/IMGs-for-Readme/metadata/img-readme/andr.png" width="200" style="max-width: 100%;"></a>
</div>
<br>
[All releases](https://github.com/amnezia-vpn/amnezia-client/releases)
## Features
- Very easy to use - enter your IP address, SSH login, and password, and Amnezia will automatically install VPN docker containers to your server and connect to the VPN.
- OpenVPN, Shadowsocks, WireGuard, and IKEv2 protocols support.
- OpenVPN, ShadowSocks, WireGuard, and IKEv2 protocols support.
- Masking VPN with OpenVPN over Cloak plugin
- Split tunneling support - add any sites to the client to enable VPN only for them (only for desktops)
- Windows, MacOS, Linux, Android, iOS releases.
@@ -32,9 +18,7 @@ Amnezia is an open-source VPN client, with a key feature that enables you to dep
[https://amnezia.org](https://amnezia.org) - project website
[https://www.reddit.com/r/AmneziaVPN](https://www.reddit.com/r/AmneziaVPN) - Reddit
[https://t.me/amnezia_vpn_en](https://t.me/amnezia_vpn_en) - Telegram support channel (English)
[https://t.me/amnezia_vpn_ir](https://t.me/amnezia_vpn_ir) - Telegram support channel (Farsi)
[https://t.me/amnezia_vpn_mm](https://t.me/amnezia_vpn_mm) - Telegram support channel (Myanmar)
[https://t.me/amnezia_vpn_en](https://t.me/amnezia_vpn_en) - Telegram support channel (English)
[https://t.me/amnezia_vpn](https://t.me/amnezia_vpn) - Telegram support channel (Russian)
## Tech
@@ -43,7 +27,7 @@ AmneziaVPN uses several open-source projects to work:
- [OpenSSL](https://www.openssl.org/)
- [OpenVPN](https://openvpn.net/)
- [Shadowsocks](https://shadowsocks.org/)
- [ShadowSocks](https://shadowsocks.org/)
- [Qt](https://www.qt.io/)
- [LibSsh](https://libssh.org) - forked from Qt Creator
- and more...
@@ -68,7 +52,7 @@ Check deploy folder for build scripts.
1. First, make sure you have [XCode](https://developer.apple.com/xcode/) installed, at least version 14 or higher.
2. We use QT to generate the XCode project. We need QT version 6.6.2. Install QT for MacOS [here](https://doc.qt.io/qt-6/macos.html) or [QT Online Installer](https://www.qt.io/download-open-source). Required modules:
2. We use QT to generate the XCode project. We need QT version 6.6.1. Install QT for MacOS [here](https://doc.qt.io/qt-6/macos.html) or [QT Online Installer](https://www.qt.io/download-open-source). Required modules:
- MacOS
- iOS
- Qt 5 Compatibility Module
@@ -158,10 +142,10 @@ GPL v3.0
## Donate
Patreon: [https://www.patreon.com/amneziavpn](https://www.patreon.com/amneziavpn)
USDT BEP20: 0x6abD576765a826f87D1D95183438f9408C901bE4
USDT TRC20: TELAitazF1MZGmiNjTcnxDjEiH5oe7LC9d
Bitcoin: bc1qn9rhsffuxwnhcuuu4qzrwp4upkrq94xnh8r26u
XMR: 48spms39jt1L2L5vyw2RQW6CXD6odUd4jFu19GZcDyKKQV9U88wsJVjSbL4CfRys37jVMdoaWVPSvezCQPhHXUW5UKLqUp3
payeer.com: P2561305
ko-fi.com: [https://ko-fi.com/amnezia_vpn](https://ko-fi.com/amnezia_vpn)
## Acknowledgments
-1
View File
@@ -157,7 +157,6 @@ void AmneziaApplication::init()
connect(this, &AmneziaApplication::translationsUpdated, m_notificationHandler.get(), &NotificationHandler::onTranslationsUpdated);
#endif
m_engine->addImportPath("qrc:/ui/qml/Modules/");
m_engine->load(url);
m_systemController->setQmlRoot(m_engine->rootObjects().value(0));
-6
View File
@@ -69,12 +69,6 @@ android {
}
signingConfig = signingConfigs["release"]
}
create("fdroid") {
initWith(getByName("release"))
signingConfig = null
matchingFallbacks += "release"
}
}
splits {
@@ -384,8 +384,7 @@ class AmneziaActivity : QtActivity() {
getVpnProto(vpnConfig)?.let { proto ->
Log.d(TAG, "Proto from config: $proto, current proto: $vpnProto")
if (isServiceConnected) {
if (proto.serviceClass == vpnProto?.serviceClass) {
vpnProto = proto
if (proto == vpnProto) {
connectToVpn(vpnConfig)
return
}
@@ -140,7 +140,7 @@ class CameraActivity : ComponentActivity() {
}
}
}.addOnFailureListener {
Log.e(TAG, "Processing QR code image failed: ${it.message}")
Log.e(TAG, "Processing QR-code image failed: ${it.message}")
}.addOnCompleteListener {
imageProxy.close()
}
@@ -49,15 +49,7 @@ enum class VpnProto(
"org.amnezia.vpn:amneziaXrayService",
XrayService::class.java
) {
override fun createProtocol(): Protocol = Xray.instance
},
SSXRAY(
"SSXRay",
"org.amnezia.vpn:amneziaXrayService",
XrayService::class.java
) {
override fun createProtocol(): Protocol = Xray.instance
override fun createProtocol(): Protocol = Xray()
};
private var _protocol: Protocol? = null
+9 -11
View File
@@ -5,7 +5,6 @@ import android.net.VpnService.Builder
import java.io.File
import java.io.IOException
import go.Seq
import org.amnezia.vpn.protocol.BadConfigException
import org.amnezia.vpn.protocol.Protocol
import org.amnezia.vpn.protocol.ProtocolState.CONNECTED
import org.amnezia.vpn.protocol.ProtocolState.DISCONNECTED
@@ -115,14 +114,17 @@ class Xray : Protocol() {
return
}
val xrayJsonConfig = config.optJSONObject("xray_config_data")
?: config.optJSONObject("ssxray_config_data")
?: throw BadConfigException("config_data not found")
val xrayJsonConfig = config.getJSONObject("xray_config_data")
val xrayConfig = parseConfig(config, xrayJsonConfig)
(xrayJsonConfig.optJSONObject("log") ?: JSONObject().also { xrayJsonConfig.put("log", it) })
.put("loglevel", "warning")
.put("access", "none") // disable access log
// for debug
// xrayJsonConfig.getJSONObject("log").put("loglevel", "debug")
xrayJsonConfig.getJSONObject("log").put("loglevel", "warning")
// disable access log
xrayJsonConfig.getJSONObject("log").put("access", "none")
// replace socks address
// (xrayJsonConfig.getJSONArray("inbounds")[0] as JSONObject).put("listen", "::1")
start(xrayConfig, xrayJsonConfig.toString(), vpnBuilder, protect)
state.value = CONNECTED
@@ -226,10 +228,6 @@ class Xray : Protocol() {
throw VpnStartException("Failed to start tun2socks: $err")
}
}
companion object {
val instance: Xray by lazy { Xray() }
}
}
private fun String?.isNotNullOrBlank(block: (String) -> Unit) {
+6 -22
View File
@@ -90,7 +90,7 @@ QMap<DockerContainer, QString> ContainerProps::containerHumanNames()
{
return { { DockerContainer::None, "Not installed" },
{ DockerContainer::OpenVpn, "OpenVPN" },
{ DockerContainer::ShadowSocks, "OpenVPN over SS" },
{ DockerContainer::ShadowSocks, "ShadowSocks" },
{ DockerContainer::Cloak, "OpenVPN over Cloak" },
{ DockerContainer::WireGuard, "WireGuard" },
{ DockerContainer::Awg, "AmneziaWG" },
@@ -99,8 +99,8 @@ QMap<DockerContainer, QString> ContainerProps::containerHumanNames()
{ DockerContainer::SSXray, "ShadowSocks"},
{ DockerContainer::TorWebSite, QObject::tr("Website in Tor network") },
{ DockerContainer::Dns, QObject::tr("AmneziaDNS") },
{ DockerContainer::Sftp, QObject::tr("SFTP file sharing service") },
{ DockerContainer::Dns, QObject::tr("Amnezia DNS") },
{ DockerContainer::Sftp, QObject::tr("Sftp file sharing service") },
{ DockerContainer::Socks5Proxy, QObject::tr("SOCKS5 proxy server") } };
}
@@ -110,7 +110,7 @@ QMap<DockerContainer, QString> ContainerProps::containerDescriptions()
QObject::tr("OpenVPN is the most popular VPN protocol, with flexible configuration options. It uses its "
"own security protocol with SSL/TLS for key exchange.") },
{ DockerContainer::ShadowSocks,
QObject::tr("Shadowsocks - masks VPN traffic, making it similar to normal web traffic, but it "
QObject::tr("ShadowSocks - masks VPN traffic, making it similar to normal web traffic, but it "
"may be recognized by analysis systems in some highly censored regions.") },
{ DockerContainer::Cloak,
QObject::tr("OpenVPN over Cloak - OpenVPN with VPN masquerading as web traffic and protection against "
@@ -127,7 +127,7 @@ QMap<DockerContainer, QString> ContainerProps::containerDescriptions()
QObject::tr("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.") },
{ DockerContainer::Ipsec,
QObject::tr("IKEv2/IPsec - Modern stable protocol, a bit faster than others, restores connection after "
QObject::tr("IKEv2 - 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.") },
{ DockerContainer::TorWebSite, QObject::tr("Deploy a WordPress site on the Tor network in two clicks.") },
@@ -164,6 +164,7 @@ QMap<DockerContainer, QString> ContainerProps::containerDetailedDescriptions()
"However, certain traffic analysis systems might still detect a Shadowsocks connection. "
"Due to limited support in Amnezia, it's recommended to use AmneziaWG protocol.\n\n"
"* Available in the AmneziaVPN only on desktop platforms\n"
"* Normal power consumption on mobile devices\n\n"
"* Configurable encryption protocol\n"
"* Detectable by some DPI systems\n"
"* Works over TCP network protocol.") },
@@ -285,7 +286,6 @@ bool ContainerProps::isSupportedByCurrentPlatform(DockerContainer c)
case DockerContainer::WireGuard: return true;
case DockerContainer::OpenVpn: return true;
case DockerContainer::Awg: return true;
case DockerContainer::Xray: return true;
case DockerContainer::Cloak:
return true;
// case DockerContainer::ShadowSocks: return true;
@@ -306,7 +306,6 @@ bool ContainerProps::isSupportedByCurrentPlatform(DockerContainer c)
case DockerContainer::Awg: return true;
case DockerContainer::Cloak: return true;
case DockerContainer::Xray: return true;
case DockerContainer::SSXray: return true;
default: return false;
}
@@ -390,18 +389,3 @@ QJsonObject ContainerProps::getProtocolConfigFromContainer(const Proto protocol,
return QJsonDocument::fromJson(protocolConfigString.toUtf8()).object();
}
int ContainerProps::installPageOrder(DockerContainer container)
{
switch (container) {
case DockerContainer::OpenVpn: return 4;
case DockerContainer::Cloak: return 5;
case DockerContainer::ShadowSocks: return 6;
case DockerContainer::WireGuard: return 2;
case DockerContainer::Awg: return 1;
case DockerContainer::Xray: return 3;
case DockerContainer::Ipsec: return 7;
case DockerContainer::SSXray: return 8;
default: return 0;
}
}
-2
View File
@@ -72,8 +72,6 @@ namespace amnezia
static bool isShareable(amnezia::DockerContainer container);
static QJsonObject getProtocolConfigFromContainer(const amnezia::Proto protocol, const QJsonObject &containerConfig);
static int installPageOrder(amnezia::DockerContainer container);
};
static void declareQmlContainerEnum()
+1 -1
View File
@@ -106,7 +106,7 @@ ErrorCode ServerController::runContainerScript(const ServerCredentials &credenti
if (e)
return e;
QString runner = QString("sudo docker exec -i $CONTAINER_NAME %2 %1 ").arg(fileName, (container == DockerContainer::Socks5Proxy ? "sh" : "bash"));
QString runner = QString("sudo docker exec -i $CONTAINER_NAME sh %1 ").arg(fileName);
e = runScript(credentials, replaceVars(runner, genVarsForScript(credentials, container)), cbReadStdOut, cbReadStdErr);
QString remover = QString("sudo docker exec -i $CONTAINER_NAME rm %1 ").arg(fileName);
+6 -6
View File
@@ -9,7 +9,7 @@ QString errorString(ErrorCode code) {
// General error codes
case(ErrorCode::NoError): errorMessage = QObject::tr("No error"); break;
case(ErrorCode::UnknownError): errorMessage = QObject::tr("Unknown error"); break;
case(ErrorCode::UnknownError): errorMessage = QObject::tr("Unknown Error"); break;
case(ErrorCode::NotImplementedError): errorMessage = QObject::tr("Function not implemented"); break;
case(ErrorCode::AmneziaServiceNotRunning): errorMessage = QObject::tr("Background service is not running"); break;
@@ -23,15 +23,15 @@ QString errorString(ErrorCode code) {
case(ErrorCode::ServerPacketManagerError): errorMessage = QObject::tr("Server error: Packet manager error"); break;
// Libssh errors
case(ErrorCode::SshRequestDeniedError): errorMessage = QObject::tr("SSH request was denied"); break;
case(ErrorCode::SshInterruptedError): errorMessage = QObject::tr("SSH request was interrupted"); break;
case(ErrorCode::SshInternalError): errorMessage = QObject::tr("SSH internal error"); break;
case(ErrorCode::SshRequestDeniedError): errorMessage = QObject::tr("Ssh request was denied"); break;
case(ErrorCode::SshInterruptedError): errorMessage = QObject::tr("Ssh request was interrupted"); break;
case(ErrorCode::SshInternalError): errorMessage = QObject::tr("Ssh internal error"); break;
case(ErrorCode::SshPrivateKeyError): errorMessage = QObject::tr("Invalid private key or invalid passphrase entered"); break;
case(ErrorCode::SshPrivateKeyFormatError): errorMessage = QObject::tr("The selected private key format is not supported, use openssh ED25519 key types or PEM key types"); break;
case(ErrorCode::SshTimeoutError): errorMessage = QObject::tr("Timeout connecting to server"); break;
// Ssh scp errors
case(ErrorCode::SshScpFailureError): errorMessage = QObject::tr("SCP error: Generic failure"); break;
case(ErrorCode::SshScpFailureError): errorMessage = QObject::tr("Scp error: Generic failure"); break;
// Local errors
case (ErrorCode::OpenVpnConfigMissing): errorMessage = QObject::tr("OpenVPN config missing"); break;
@@ -39,7 +39,7 @@ QString errorString(ErrorCode code) {
// Distro errors
case (ErrorCode::OpenVpnExecutableMissing): errorMessage = QObject::tr("OpenVPN executable missing"); break;
case (ErrorCode::ShadowSocksExecutableMissing): errorMessage = QObject::tr("Shadowsocks (ss-local) executable missing"); break;
case (ErrorCode::ShadowSocksExecutableMissing): errorMessage = QObject::tr("ShadowSocks (ss-local) executable missing"); break;
case (ErrorCode::CloakExecutableMissing): errorMessage = QObject::tr("Cloak (ck-client) executable missing"); break;
case (ErrorCode::AmneziaServiceConnectionFailed): errorMessage = QObject::tr("Amnezia helper service error"); break;
case (ErrorCode::OpenSslFailed): errorMessage = QObject::tr("OpenSSL failed"); break;
@@ -50,12 +50,10 @@ set_target_properties("networkextension" PROPERTIES
find_library(FW_ASSETS_LIBRARY AssetsLibrary)
find_library(FW_MOBILE_CORE MobileCoreServices)
find_library(FW_UI_KIT UIKit)
find_library(FW_LIBRESOLV libresolv.9.tbd)
target_link_libraries(networkextension PRIVATE ${FW_ASSETS_LIBRARY})
target_link_libraries(networkextension PRIVATE ${FW_MOBILE_CORE})
target_link_libraries(networkextension PRIVATE ${FW_UI_KIT})
target_link_libraries(networkextension PRIVATE ${FW_LIBRESOLV})
target_compile_options(networkextension PRIVATE -DGROUP_ID=\"${BUILD_IOS_GROUP_IDENTIFIER}\")
target_compile_options(networkextension PRIVATE -DNETWORK_EXTENSION=1)
@@ -82,14 +80,12 @@ target_sources(networkextension PRIVATE
${WG_APPLE_SOURCE_DIR}/WireGuardKit/Array+ConcurrentMap.swift
${WG_APPLE_SOURCE_DIR}/WireGuardKit/IPAddress+AddrInfo.swift
${WG_APPLE_SOURCE_DIR}/WireGuardKit/PrivateKey.swift
${CLIENT_ROOT_DIR}/platforms/ios/HevSocksTunnel.swift
${CLIENT_ROOT_DIR}/platforms/ios/NELogController.swift
${CLIENT_ROOT_DIR}/platforms/ios/Log.swift
${CLIENT_ROOT_DIR}/platforms/ios/LogRecord.swift
${CLIENT_ROOT_DIR}/platforms/ios/PacketTunnelProvider.swift
${CLIENT_ROOT_DIR}/platforms/ios/PacketTunnelProvider+WireGuard.swift
${CLIENT_ROOT_DIR}/platforms/ios/PacketTunnelProvider+OpenVPN.swift
${CLIENT_ROOT_DIR}/platforms/ios/PacketTunnelProvider+Xray.swift
${CLIENT_ROOT_DIR}/platforms/ios/WGConfig.swift
${CLIENT_ROOT_DIR}/platforms/ios/iosglue.mm
)
@@ -118,5 +114,3 @@ target_include_directories(networkextension PRIVATE ${CLIENT_ROOT_DIR})
target_include_directories(networkextension PRIVATE ${CMAKE_CURRENT_BINARY_DIR})
target_link_libraries(networkextension PRIVATE ${CLIENT_ROOT_DIR}/3rd-prebuilt/3rd-prebuilt/wireguard/ios/arm64/libwg-go.a)
target_link_libraries(networkextension PRIVATE ${CLIENT_ROOT_DIR}/3rd-prebuilt/3rd-prebuilt/xray/HevSocks5Tunnel.xcframework)
-73
View File
@@ -1,73 +0,0 @@
import HevSocks5Tunnel
public enum Socks5Tunnel {
private static var tunnelFileDescriptor: Int32? {
var ctlInfo = ctl_info()
withUnsafeMutablePointer(to: &ctlInfo.ctl_name) {
$0.withMemoryRebound(to: CChar.self, capacity: MemoryLayout.size(ofValue: $0.pointee)) {
_ = strcpy($0, "com.apple.net.utun_control")
}
}
for fd: Int32 in 0...1024 {
var addr = sockaddr_ctl()
var ret: Int32 = -1
var len = socklen_t(MemoryLayout.size(ofValue: addr))
withUnsafeMutablePointer(to: &addr) {
$0.withMemoryRebound(to: sockaddr.self, capacity: 1) {
ret = getpeername(fd, $0, &len)
}
}
if ret != 0 || addr.sc_family != AF_SYSTEM {
continue
}
if ctlInfo.ctl_id == 0 {
ret = ioctl(fd, CTLIOCGINFO, &ctlInfo)
if ret != 0 {
continue
}
}
if addr.sc_id == ctlInfo.ctl_id {
return fd
}
}
return nil
}
private static var interfaceName: String? {
guard let tunnelFileDescriptor = self.tunnelFileDescriptor else {
return nil
}
var buffer = [UInt8](repeating: 0, count: Int(IFNAMSIZ))
return buffer.withUnsafeMutableBufferPointer { mutableBufferPointer in
guard let baseAddress = mutableBufferPointer.baseAddress else {
return nil
}
var ifnameSize = socklen_t(IFNAMSIZ)
let result = getsockopt(
tunnelFileDescriptor,
2 /* SYSPROTO_CONTROL */,
2 /* UTUN_OPT_IFNAME */,
baseAddress,
&ifnameSize
)
if result == 0 {
return String(cString: baseAddress)
} else {
return nil
}
}
}
@discardableResult
public static func run(withConfig filePath: String) -> Int32 {
guard let fileDescriptor = self.tunnelFileDescriptor else {
fatalError("Get tunnel file descriptor failed.")
}
return hev_socks5_tunnel_main(filePath.cString(using: .utf8), fileDescriptor)
}
public static func quit() {
hev_socks5_tunnel_quit()
}
}
@@ -13,10 +13,6 @@ public func ovpnLog(_ type: OSLogType, title: String = "", message: String) {
neLog(type, title: "OVPN: \(title)", message: message)
}
public func xrayLog(_ type: OSLogType, title: String = "", message: String) {
neLog(type, title: "XRAY: \(title)", message: message)
}
public func neLog(_ type: OSLogType, title: String = "", message: String) {
Log.log(type, title: "NE: \(title)", message: message)
}
@@ -1,166 +0,0 @@
import Foundation
import NetworkExtension
import WireGuardKitGo
enum XrayErrors: Error {
case noXrayConfig
case cantSaveXrayConfig
case cantParseListenAndPort
case cantSaveHevSocksConfig
}
extension Constants {
static let cachesDirectory: URL = {
if let cachesDirectoryURL = FileManager.default.urls(for: .cachesDirectory,
in: .userDomainMask).first {
return cachesDirectoryURL
} else {
fatalError("Unable to retrieve caches directory.")
}
}()
}
extension PacketTunnelProvider {
func startXray(completionHandler: @escaping (Error?) -> Void) {
// Xray configuration
guard let protocolConfiguration = self.protocolConfiguration as? NETunnelProviderProtocol,
let providerConfiguration = protocolConfiguration.providerConfiguration,
let xrayConfigData = providerConfiguration[Constants.xrayConfigKey] as? Data else {
xrayLog(.error, message: "Can't get xray configuration")
completionHandler(XrayErrors.noXrayConfig)
return
}
// Tunnel settings
let ipv6Enabled = true
let hideVPNIcon = false
let settings = NEPacketTunnelNetworkSettings(tunnelRemoteAddress: "254.1.1.1")
settings.mtu = 9000
settings.ipv4Settings = {
let settings = NEIPv4Settings(addresses: ["198.18.0.1"], subnetMasks: ["255.255.0.0"])
settings.includedRoutes = [NEIPv4Route.default()]
return settings
}()
settings.ipv6Settings = {
guard ipv6Enabled else {
return nil
}
let settings = NEIPv6Settings(addresses: ["fd6e:a81b:704f:1211::1"], networkPrefixLengths: [64])
settings.includedRoutes = [NEIPv6Route.default()]
if hideVPNIcon {
settings.excludedRoutes = [NEIPv6Route(destinationAddress: "::", networkPrefixLength: 128)]
}
return settings
}()
let dns = ["8.8.4.4","1.1.1.1"]
settings.dnsSettings = NEDNSSettings(servers: dns)
do {
let port = 10808
let address = "::1"
let jsonDict = try JSONSerialization.jsonObject(with: xrayConfigData,
options: []) as? [String: Any]
guard var jsonDict else {
xrayLog(.error, message: "Can't parse address and port for hevSocks")
completionHandler(XrayErrors.cantParseListenAndPort)
return
}
if var inboundsArray = jsonDict["inbounds"] as? [[String: Any]], !inboundsArray.isEmpty {
inboundsArray[0]["port"] = port
inboundsArray[0]["listen"] = address
jsonDict["inbounds"] = inboundsArray
}
let updatedData = try JSONSerialization.data(withJSONObject: jsonDict, options: [])
setTunnelNetworkSettings(settings) { [weak self] error in
if let error {
completionHandler(error)
return
}
// Launch xray
self?.setupAndStartXray(configData: updatedData) { xrayError in
if let xrayError {
completionHandler(xrayError)
return
}
// Launch hevSocks
self?.setupAndRunTun2socks(configData: updatedData,
address: address,
port: port,
completionHandler: completionHandler)
}
}
} catch {
completionHandler(error)
return
}
}
func stopXray(completionHandler: () -> Void) {
Socks5Tunnel.quit()
LibXrayStopXray()
completionHandler()
}
private func setupAndStartXray(configData: Data,
completionHandler: @escaping (Error?) -> Void) {
let path = Constants.cachesDirectory.appendingPathComponent("config.json", isDirectory: false).path
guard FileManager.default.createFile(atPath: path, contents: configData) else {
xrayLog(.error, message: "Can't save xray configuration")
completionHandler(XrayErrors.cantSaveXrayConfig)
return
}
LibXrayRunXray(nil,
path,
Int64.max)
completionHandler(nil)
xrayLog(.info, message: "Xray started")
}
private func setupAndRunTun2socks(configData: Data,
address: String,
port: Int,
completionHandler: @escaping (Error?) -> Void) {
let config = """
tunnel:
mtu: 9000
socks5:
port: \(port)
address: \(address)
udp: 'udp'
misc:
task-stack-size: 20480
connect-timeout: 5000
read-write-timeout: 60000
log-file: stderr
log-level: error
limit-nofile: 65535
"""
let configurationFilePath = Constants.cachesDirectory.appendingPathComponent("config.yml", isDirectory: false).path
guard FileManager.default.createFile(atPath: configurationFilePath, contents: config.data(using: .utf8)!) else {
xrayLog(.info, message: "Cant save hevSocks configuration")
completionHandler(XrayErrors.cantSaveHevSocksConfig)
return
}
DispatchQueue.global().async {
xrayLog(.info, message: "Hev socks started")
completionHandler(nil)
Socks5Tunnel.run(withConfig: configurationFilePath)
}
}
}
@@ -5,8 +5,7 @@ import Darwin
import OpenVPNAdapter
enum TunnelProtoType: String {
case wireguard, openvpn, xray
case wireguard, openvpn
}
struct Constants {
@@ -14,7 +13,6 @@ struct Constants {
static let processQueueName = "org.amnezia.process-packets"
static let kActivationAttemptId = "activationAttemptId"
static let ovpnConfigKey = "ovpn"
static let xrayConfigKey = "xray"
static let wireGuardConfigKey = "wireguard"
static let loggerTag = "NET"
@@ -93,8 +91,6 @@ class PacketTunnelProvider: NEPacketTunnelProvider {
protoType = .openvpn
} else if (providerConfiguration?[Constants.wireGuardConfigKey] as? Data) != nil {
protoType = .wireguard
} else if (providerConfiguration?[Constants.xrayConfigKey] as? Data) != nil {
protoType = .xray
}
}
@@ -111,9 +107,6 @@ class PacketTunnelProvider: NEPacketTunnelProvider {
completionHandler: completionHandler)
case .openvpn:
startOpenVPN(completionHandler: completionHandler)
case .xray:
startXray(completionHandler: completionHandler)
}
}
@@ -131,8 +124,6 @@ class PacketTunnelProvider: NEPacketTunnelProvider {
case .openvpn:
stopOpenVPN(with: reason,
completionHandler: completionHandler)
case .xray:
stopXray(completionHandler: completionHandler)
}
}
@@ -147,8 +138,6 @@ class PacketTunnelProvider: NEPacketTunnelProvider {
handleWireguardStatusMessage(messageData, completionHandler: completionHandler)
case .openvpn:
handleOpenVPNStatusMessage(messageData, completionHandler: completionHandler)
case .xray:
break;
}
}
+2 -2
View File
@@ -13,7 +13,7 @@ struct WGConfig: Decodable {
let clientIP: String
let clientPrivateKey: String
let serverPublicKey: String
let presharedKey: String?
let presharedKey: String
var allowedIPs: [String]
var persistentKeepAlive: String
let splitTunnelType: Int
@@ -65,7 +65,7 @@ struct WGConfig: Decodable {
\(settings)
[Peer]
PublicKey = \(serverPublicKey)
\(presharedKey == nil ? "" : "PresharedKey = \(presharedKey!)")
PresharedKey = \(presharedKey)
AllowedIPs = \(allowedIPs.joined(separator: ", "))
Endpoint = \(hostName):\(port)
PersistentKeepalive = \(persistentKeepAlive)
-2
View File
@@ -72,11 +72,9 @@ private:
bool setupCloak();
bool setupWireGuard();
bool setupAwg();
bool setupXray();
bool startOpenVPN(const QString &config);
bool startWireGuard(const QString &jsonConfig);
bool startXray(const QString &jsonConfig);
void startTunnel();
-26
View File
@@ -216,9 +216,6 @@ bool IosController::connectVpn(amnezia::Proto proto, const QJsonObject& configur
if (proto == amnezia::Proto::Awg) {
return setupAwg();
}
if (proto == amnezia::Proto::Xray) {
return setupXray();
}
return false;
}
@@ -504,15 +501,6 @@ bool IosController::setupWireGuard()
return startWireGuard(wgConfigDocStr);
}
bool IosController::setupXray()
{
QJsonObject config = m_rawConfig[ProtocolProps::key_proto_config_data(amnezia::Proto::Xray)].toObject();
QJsonDocument xrayConfigDoc(config);
QString xrayConfigStr(xrayConfigDoc.toJson(QJsonDocument::Compact));
return startXray(xrayConfigStr);
}
bool IosController::setupAwg()
{
QJsonObject config = m_rawConfig[ProtocolProps::key_proto_config_data(amnezia::Proto::Awg)].toObject();
@@ -602,20 +590,6 @@ bool IosController::startWireGuard(const QString &config)
startTunnel();
}
bool IosController::startXray(const QString &config)
{
qDebug() << "IosController::startXray";
NETunnelProviderProtocol *tunnelProtocol = [[NETunnelProviderProtocol alloc] init];
tunnelProtocol.providerBundleIdentifier = [NSString stringWithUTF8String:VPN_NE_BUNDLEID];
tunnelProtocol.providerConfiguration = @{@"xray": [[NSString stringWithUTF8String:config.toStdString().c_str()] dataUsingEncoding:NSUTF8StringEncoding]};
tunnelProtocol.serverAddress = m_serverAddress;
m_currentTunnel.protocolConfiguration = tunnelProtocol;
startTunnel();
}
void IosController::startTunnel()
{
NSString *protocolName = @"Unknown";
@@ -139,7 +139,7 @@ bool WireguardUtilsLinux::addInterface(const InterfaceConfig& config) {
if (config.m_killSwitchEnabled) {
FirewallParams params { };
params.dnsServers.append(config.m_dnsServer);
if (config.m_allowedIPAddressRanges.contains(IPAddress("0.0.0.0/0"))) {
if (config.m_allowedIPAddressRanges.at(0).toString() == "0.0.0.0/0"){
params.blockAll = true;
if (config.m_excludedAddresses.size()) {
params.allowNets = true;
@@ -137,8 +137,7 @@ bool WireguardUtilsMacos::addInterface(const InterfaceConfig& config) {
if (config.m_killSwitchEnabled) {
FirewallParams params { };
params.dnsServers.append(config.m_dnsServer);
if (config.m_allowedIPAddressRanges.contains(IPAddress("0.0.0.0/0"))) {
if (config.m_allowedIPAddressRanges.at(0).toString() == "0.0.0.0/0"){
params.blockAll = true;
if (config.m_excludedAddresses.size()) {
params.allowNets = true;
+1 -1
View File
@@ -77,7 +77,7 @@ QMap<amnezia::Proto, QString> ProtocolProps::protocolHumanNames()
{ Proto::TorWebSite, "Website in Tor network" },
{ Proto::Dns, "DNS Service" },
{ Proto::Sftp, QObject::tr("SFTP service") },
{ Proto::Sftp, QObject::tr("Sftp service") },
{ Proto::Socks5Proxy, QObject::tr("SOCKS5 proxy server") } };
}
-2
View File
@@ -239,8 +239,6 @@
<file>images/controls/alert-circle.svg</file>
<file>images/controls/file-check-2.svg</file>
<file>ui/qml/Controls2/WarningType.qml</file>
<file>ui/qml/Modules/Style/qmldir</file>
<file>ui/qml/Modules/Style/AmneziaStyle.qml</file>
<file>ui/qml/Pages2/PageServiceSocksProxySettings.qml</file>
<file>server_scripts/socks5_proxy/run_container.sh</file>
<file>server_scripts/socks5_proxy/Dockerfile</file>
+36 -32
View File
@@ -39,7 +39,7 @@
</message>
<message>
<location filename="../ui/controllers/connectionController.cpp" line="115"/>
<source>Settings updated successfully, reconnnection...</source>
<source>Settings updated successfully, Reconnnection...</source>
<translation>تم تحديث الاعدادات بنجاح, جاري إعادة الاتصال...</translation>
</message>
<message>
@@ -700,8 +700,8 @@ Already installed containers were found on the server. All installed containers
<name>PageProtocolShadowSocksSettings</name>
<message>
<location filename="../ui/qml/Pages2/PageProtocolShadowSocksSettings.qml" line="80"/>
<source>Shadowsocks settings</source>
<translation>Shadowsocks إعدادات</translation>
<source>ShadowSocks settings</source>
<translation>ShadowSocks إعدادات</translation>
</message>
<message>
<location filename="../ui/qml/Pages2/PageProtocolShadowSocksSettings.qml" line="89"/>
@@ -1041,8 +1041,8 @@ And if you don&apos;t like the app, all the more support it - the donation will
</message>
<message>
<location filename="../ui/qml/Pages2/PageSettingsAbout.qml" line="115"/>
<source>GitHub</source>
<translation>GitHub</translation>
<source>Github</source>
<translation></translation>
</message>
<message>
<location filename="../ui/qml/Pages2/PageSettingsAbout.qml" line="119"/>
@@ -1317,7 +1317,7 @@ And if you don&apos;t like the app, all the more support it - the donation will
<name>PageSettingsDns</name>
<message>
<location filename="../ui/qml/Pages2/PageSettingsDns.qml" line="39"/>
<source>Default server does not support custom DNS</source>
<source>Default server does not support custom dns</source>
<translation>الخادم الافتراضي لا يدعم DNS مخصص</translation>
</message>
<message>
@@ -1390,7 +1390,7 @@ And if you don&apos;t like the app, all the more support it - the donation will
</message>
<message>
<location filename="../ui/qml/Pages2/PageSettingsLogging.qml" line="64"/>
<source>Enabling this function will save application&apos;s logs automatically. By default, logging functionality is disabled. Enable log saving in case of application malfunction.</source>
<source>Enabling this function will save application&apos;s logs automatically, By default, logging functionality is disabled. Enable log saving in case of application malfunction.</source>
<translation>سيتم حفظ سجلات البرنامج بشكل تلقائي عند تفعيل هذه الميزة, بشكل افتراضي, هذه الميزة مٌعطلة. قم بتفعيل هذه الميزة في حالة هناك خلل في التطبيق.</translation>
</message>
<message>
@@ -1797,7 +1797,7 @@ It&apos;s okay as long as it&apos;s from someone you trust.</source>
</message>
<message>
<location filename="../ui/qml/Pages2/PageSetupWizardConfigSource.qml" line="89"/>
<source>QR code</source>
<source>QR-code</source>
<translation>رمز QR</translation>
</message>
<message>
@@ -2089,8 +2089,8 @@ It&apos;s okay as long as it&apos;s from someone you trust.</source>
</message>
<message>
<location filename="../ui/qml/Pages2/PageShare.qml" line="79"/>
<source>Save Shadowsocks config</source>
<translation>احفظ تكوين Shadowsocks</translation>
<source>Save ShadowSocks config</source>
<translation>احفظ تكوين ShadowSocks</translation>
</message>
<message>
<location filename="../ui/qml/Pages2/PageShare.qml" line="86"/>
@@ -2119,8 +2119,8 @@ It&apos;s okay as long as it&apos;s from someone you trust.</source>
</message>
<message>
<location filename="../ui/qml/Pages2/PageShare.qml" line="131"/>
<source>Shadowsocks native format</source>
<translation>تنسيق Shadowsocks الاصلي</translation>
<source>ShadowSocks native format</source>
<translation>تنسيق ShadowSocks الاصلي</translation>
</message>
<message>
<location filename="../ui/qml/Pages2/PageShare.qml" line="136"/>
@@ -2571,8 +2571,8 @@ It&apos;s okay as long as it&apos;s from someone you trust.</source>
<name>QObject</name>
<message>
<location filename="../protocols/protocols_defs.cpp" line="77"/>
<source>SFTP service</source>
<translation>خدمة SFTP</translation>
<source>Sftp service</source>
<translation>خدمة Sftp</translation>
</message>
<message>
<location filename="../core/errorstrings.cpp" line="11"/>
@@ -2581,7 +2581,7 @@ It&apos;s okay as long as it&apos;s from someone you trust.</source>
</message>
<message>
<location filename="../core/errorstrings.cpp" line="12"/>
<source>Unknown error</source>
<source>Unknown Error</source>
<translation>خطأ غير معروف</translation>
</message>
<message>
@@ -2621,18 +2621,18 @@ It&apos;s okay as long as it&apos;s from someone you trust.</source>
</message>
<message>
<location filename="../core/errorstrings.cpp" line="24"/>
<source>SSH request was denied</source>
<translation>طلب SSH محظو</translation>
<source>Ssh request was denied</source>
<translation>طلب Ssh محظو</translation>
</message>
<message>
<location filename="../core/errorstrings.cpp" line="25"/>
<source>SSH request was interrupted</source>
<translation>إنقطع طلب SSH</translation>
<source>Ssh request was interrupted</source>
<translation>إنقطع طلب Ssh</translation>
</message>
<message>
<location filename="../core/errorstrings.cpp" line="26"/>
<source>SSH internal error</source>
<translation>مشكلة داخلية SSH</translation>
<source>Ssh internal error</source>
<translation>مشكلة داخلية Ssh</translation>
</message>
<message>
<location filename="../core/errorstrings.cpp" line="27"/>
@@ -2720,7 +2720,7 @@ It&apos;s okay as long as it&apos;s from someone you trust.</source>
</message>
<message>
<location filename="../core/errorstrings.cpp" line="32"/>
<source>SCP error: Generic failure</source>
<source>Scp error: Generic failure</source>
<translation type="unfinished"></translation>
</message>
<message>
@@ -2735,8 +2735,8 @@ It&apos;s okay as long as it&apos;s from someone you trust.</source>
</message>
<message>
<location filename="../core/errorstrings.cpp" line="40"/>
<source>Shadowsocks (ss-local) executable missing</source>
<translation>Shadowsocks (ss-local) executable مفقود</translation>
<source>ShadowSocks (ss-local) executable missing</source>
<translation>ShadowSocks (ss-local) executable مفقود</translation>
</message>
<message>
<location filename="../core/errorstrings.cpp" line="41"/>
@@ -2821,13 +2821,13 @@ It&apos;s okay as long as it&apos;s from someone you trust.</source>
</message>
<message>
<location filename="../containers/containers_defs.cpp" line="91"/>
<source>AmneziaDNS</source>
<translation>AmneziaDNS</translation>
<source>Amnezia DNS</source>
<translation></translation>
</message>
<message>
<location filename="../containers/containers_defs.cpp" line="92"/>
<source>SFTP file sharing service</source>
<translation>ملف SFTP: خدمة المشاركة</translation>
<source>Sftp file sharing service</source>
<translation>ملف Sftp: خدمة المشاركة</translation>
</message>
<message>
<location filename="../containers/containers_defs.cpp" line="98"/>
@@ -2836,8 +2836,8 @@ It&apos;s okay as long as it&apos;s from someone you trust.</source>
</message>
<message>
<location filename="../containers/containers_defs.cpp" line="101"/>
<source>Shadowsocks - masks VPN traffic, making it similar to normal web traffic, but it may be recognized by analysis systems in some highly censored regions.</source>
<translation>بروتوكول Shadowsocks- يتنكر في حركة مرور VPN, يبدو ك حركة مرور الويب العادية
<source>ShadowSocks - masks VPN traffic, making it similar to normal web traffic, but it may be recognized by analysis systems in some highly censored regions.</source>
<translation>بروتوكول ShadowSocks- يتنكر في حركة مرور VPN, يبدو ك حركة مرور الويب العادية
ولكن قد يتم التعرف عليه من خلال أنظمة التحليل في بعض المناطق شديدة الرقابة.</translation>
</message>
<message>
@@ -2944,8 +2944,8 @@ For more detailed information, you can
</message>
<message>
<location filename="../containers/containers_defs.cpp" line="115"/>
<source>IKEv2/IPsec - Modern stable protocol, a bit faster than others, restores connection after signal loss.</source>
<translation>بروتوكول IKEv2/IPsec - بروتوكول مستقر حديث, اسرع بقليل من الباقي, يسترجع الاتصال بعد خسارة الاشارة.</translation>
<source>IKEv2 - Modern stable protocol, a bit faster than others, restores connection after signal loss.</source>
<translation>بروتوكول IKEv2 - بروتوكول مستقر حديث, اسرع بقليل من الباقي, يسترجع الاتصال بعد خسارة الاشارة.</translation>
</message>
<message>
<location filename="../containers/containers_defs.cpp" line="118"/>
@@ -2981,12 +2981,16 @@ It employs its unique security protocol, leveraging the strength of SSL/TLS for
<source>Shadowsocks, inspired by the SOCKS5 protocol, safeguards the connection using the AEAD cipher. Although Shadowsocks is designed to be discreet and challenging to identify, it isn&apos;t identical to a standard HTTPS connection.However, certain traffic analysis systems might still detect a Shadowsocks connection. Due to limited support in Amnezia, it&apos;s recommended to use AmneziaWG protocol.
* Available in the AmneziaVPN only on desktop platforms
* Normal power consumption on mobile devices
* Configurable encryption protocol
* Detectable by some DPI systems
* Works over TCP network protocol.</source>
<translation>Shadowsocks, مستوحي من بروتوكول SOCKS5, يحمي الاتصال بأستعمال شفرة AEAD. كذلك Shadowsocks صٌمم كي يكون متحفظاً ويصعب تحديدة, إنه ليس مطابقًا لاتصال HTTPS القياسي. عمتاُ. بعض انظمة تحليل حركات المرور قد تتعرف علي اتصال Shadowsocks. بسبب الدعم المحدود في Amnezia, يٌنصح بأستخدام بروتوكول AmneziaWG.
* مٌتاح في AmneziaVPN عبر جميع المنصات
* استهلاك طاقة عادي علي اجهزة المحمول
* بروتوكول تشفير قابل للتكوين
* قابل للكشف بواسطة بعض انظمة DPI
* يعمل عبر بروتوكول شبكة TCP.</translation>
+35 -32
View File
@@ -22,7 +22,7 @@
</message>
<message>
<location filename="../ui/controllers/connectionController.cpp" line="115"/>
<source>Settings updated successfully, reconnnection...</source>
<source>Settings updated successfully, Reconnnection...</source>
<translation>تنظیمات به روز رسانی شد
در حال اتصال دوباره...</translation>
</message>
@@ -664,8 +664,8 @@ Already installed containers were found on the server. All installed containers
<name>PageProtocolShadowSocksSettings</name>
<message>
<location filename="../ui/qml/Pages2/PageProtocolShadowSocksSettings.qml" line="80"/>
<source>Shadowsocks settings</source>
<translation>تنظیمات Shadowsocks</translation>
<source>ShadowSocks settings</source>
<translation>تنظیمات ShadowSocks</translation>
</message>
<message>
<location filename="../ui/qml/Pages2/PageProtocolShadowSocksSettings.qml" line="89"/>
@@ -1002,8 +1002,8 @@ Already installed containers were found on the server. All installed containers
</message>
<message>
<location filename="../ui/qml/Pages2/PageSettingsAbout.qml" line="115"/>
<source>GitHub</source>
<translation>GitHub</translation>
<source>Github</source>
<translation>Github</translation>
</message>
<message>
<location filename="../ui/qml/Pages2/PageSettingsAbout.qml" line="119"/>
@@ -1250,7 +1250,7 @@ Already installed containers were found on the server. All installed containers
<name>PageSettingsDns</name>
<message>
<location filename="../ui/qml/Pages2/PageSettingsDns.qml" line="39"/>
<source>Default server does not support custom DNS</source>
<source>Default server does not support custom dns</source>
<translation>سرور پیش‌فرض از دی‌ان‌اس سفارشی پشتیبانی نمی‌کند</translation>
</message>
<message>
@@ -1323,7 +1323,7 @@ Already installed containers were found on the server. All installed containers
</message>
<message>
<location filename="../ui/qml/Pages2/PageSettingsLogging.qml" line="64"/>
<source>Enabling this function will save application&apos;s logs automatically. By default, logging functionality is disabled. Enable log saving in case of application malfunction.</source>
<source>Enabling this function will save application&apos;s logs automatically, By default, logging functionality is disabled. Enable log saving in case of application malfunction.</source>
<translation>فعال کردن این عملکرد باعث ذخیره خودکار لاگ‌های برنامه می‌شود. به طور پیش‌فرض، قابلیت ثبت لاگ غیرفعال است. در صورت بروز خطا در برنامه، ذخیره لاگ را فعال کنید.</translation>
</message>
<message>
@@ -1710,7 +1710,7 @@ It&apos;s okay as long as it&apos;s from someone you trust.</source>
</message>
<message>
<location filename="../ui/qml/Pages2/PageSetupWizardConfigSource.qml" line="89"/>
<source>QR code</source>
<source>QR-code</source>
<translation>QR-Code</translation>
</message>
<message>
@@ -2037,8 +2037,8 @@ It&apos;s okay as long as it&apos;s from someone you trust.</source>
</message>
<message>
<location filename="../ui/qml/Pages2/PageShare.qml" line="79"/>
<source>Save Shadowsocks config</source>
<translation>ذخیره تنظیمات Shadowsocks</translation>
<source>Save ShadowSocks config</source>
<translation>ذخیره تنظیمات ShadowSocks</translation>
</message>
<message>
<location filename="../ui/qml/Pages2/PageShare.qml" line="86"/>
@@ -2057,8 +2057,8 @@ It&apos;s okay as long as it&apos;s from someone you trust.</source>
</message>
<message>
<location filename="../ui/qml/Pages2/PageShare.qml" line="131"/>
<source>Shadowsocks native format</source>
<translation>فرمت Shadowsocks</translation>
<source>ShadowSocks native format</source>
<translation>فرمت ShadowSocks</translation>
</message>
<message>
<location filename="../ui/qml/Pages2/PageShare.qml" line="136"/>
@@ -2476,8 +2476,8 @@ It&apos;s okay as long as it&apos;s from someone you trust.</source>
</message>
<message>
<location filename="../core/errorstrings.cpp" line="12"/>
<source>Unknown error</source>
<translation>Unknown error</translation>
<source>Unknown Error</source>
<translation>Unknown Error</translation>
</message>
<message>
<location filename="../core/errorstrings.cpp" line="13"/>
@@ -2516,18 +2516,18 @@ It&apos;s okay as long as it&apos;s from someone you trust.</source>
</message>
<message>
<location filename="../core/errorstrings.cpp" line="24"/>
<source>SSH request was denied</source>
<translation>SSH request was denied</translation>
<source>Ssh request was denied</source>
<translation>Ssh request was denied</translation>
</message>
<message>
<location filename="../core/errorstrings.cpp" line="25"/>
<source>SSH request was interrupted</source>
<translation>SSH request was interrupted</translation>
<source>Ssh request was interrupted</source>
<translation>Ssh request was interrupted</translation>
</message>
<message>
<location filename="../core/errorstrings.cpp" line="26"/>
<source>SSH internal error</source>
<translation>SSH internal error</translation>
<source>Ssh internal error</source>
<translation>Ssh internal error</translation>
</message>
<message>
<location filename="../core/errorstrings.cpp" line="27"/>
@@ -2628,7 +2628,7 @@ It&apos;s okay as long as it&apos;s from someone you trust.</source>
</message>
<message>
<location filename="../core/errorstrings.cpp" line="32"/>
<source>SCP error: Generic failure</source>
<source>Scp error: Generic failure</source>
<translation type="unfinished"></translation>
</message>
<message>
@@ -2643,8 +2643,8 @@ It&apos;s okay as long as it&apos;s from someone you trust.</source>
</message>
<message>
<location filename="../core/errorstrings.cpp" line="40"/>
<source>Shadowsocks (ss-local) executable missing</source>
<translation>Shadowsocks (ss-local) executable missing</translation>
<source>ShadowSocks (ss-local) executable missing</source>
<translation>ShadowSocks (ss-local) executable missing</translation>
</message>
<message>
<location filename="../core/errorstrings.cpp" line="41"/>
@@ -2718,7 +2718,7 @@ It&apos;s okay as long as it&apos;s from someone you trust.</source>
</message>
<message>
<location filename="../containers/containers_defs.cpp" line="101"/>
<source>Shadowsocks - masks VPN traffic, making it similar to normal web traffic, but it may be recognized by analysis systems in some highly censored regions.</source>
<source>ShadowSocks - masks VPN traffic, making it similar to normal web traffic, but it may be recognized by analysis systems in some highly censored regions.</source>
<translation>شدوساکس - ترافیک VPN را پنهان می کند، به طوری که مشابه ترافیک وب عادی می شود، اما ممکن است توسط سیستم های تجزیه و تحلیل در برخی از مناطق با سانسور شدید شناسایی شود.</translation>
</message>
<message>
@@ -2819,8 +2819,8 @@ While it offers a blend of security, stability, and speed, it&apos;s essential t
</message>
<message>
<location filename="../containers/containers_defs.cpp" line="92"/>
<source>SFTP file sharing service</source>
<translation>سرویس فایل اشتراک SFTP</translation>
<source>Sftp file sharing service</source>
<translation>سرویس فایل اشتراک Sftp</translation>
</message>
<message>
<location filename="../containers/containers_defs.cpp" line="90"/>
@@ -2830,8 +2830,8 @@ While it offers a blend of security, stability, and speed, it&apos;s essential t
</message>
<message>
<location filename="../containers/containers_defs.cpp" line="91"/>
<source>AmneziaDNS</source>
<translation>AmneziaDNS</translation>
<source>Amnezia DNS</source>
<translation>Amnezia DNS</translation>
</message>
<message>
<location filename="../containers/containers_defs.cpp" line="98"/>
@@ -2850,8 +2850,8 @@ While it offers a blend of security, stability, and speed, it&apos;s essential t
</message>
<message>
<location filename="../containers/containers_defs.cpp" line="115"/>
<source>IKEv2/IPsec - Modern stable protocol, a bit faster than others, restores connection after signal loss.</source>
<translation>پروتکل IKEv2/IPsec پروتکلی پایدار و مدرن که مقداری سریعتر از سایر پروتکل‎هاست. بعد از قطع سیگنال دوباره اتصال را بازیابی می‎کند.</translation>
<source>IKEv2 - Modern stable protocol, a bit faster than others, restores connection after signal loss.</source>
<translation>پروتکل IKEv2 پروتکلی پایدار و مدرن که مقداری سریعتر از سایر پروتکل‎هاست. بعد از قطع سیگنال دوباره اتصال را بازیابی می‎کند.</translation>
</message>
<message>
<location filename="../containers/containers_defs.cpp" line="118"/>
@@ -2891,12 +2891,15 @@ It employs its unique security protocol, leveraging the strength of SSL/TLS for
<source>Shadowsocks, inspired by the SOCKS5 protocol, safeguards the connection using the AEAD cipher. Although Shadowsocks is designed to be discreet and challenging to identify, it isn&apos;t identical to a standard HTTPS connection.However, certain traffic analysis systems might still detect a Shadowsocks connection. Due to limited support in Amnezia, it&apos;s recommended to use AmneziaWG protocol.
* Available in the AmneziaVPN only on desktop platforms
* Normal power consumption on mobile devices
* Configurable encryption protocol
* Detectable by some DPI systems
* Works over TCP network protocol.</source>
<translation>پروتکل Shadowsocks، الهام گرفته از پروتکل Socks5، اتصال را با استفاده از رمزگذاری AEAD امن میکند. اگرچه Shadowsocks طوری طراحی شده که برای شناسایی در شبکه چالش‎برانگیز باشد و محتاط عمل کند اما این پروتکل مانند یک اتصال استاندارد HTTPS نیست و برخی از سیستم‎های تحلیل ترافیک مشخص ممکن است بتوانند اتصال Shadowsocks را شناسایی کنند. به دلیل محدودیت پشتیبانی در Amnezia پیشنهاد می‎شود که از َAmneziaWG استفاده شود.
* فقط بر روی پلتفرم دسکتاپ بر روی Amnezia قابل دسترس است
* مصرف انرژی عادی در دستگاه‎های موبایل
* پروتکل رمزنگاری قابل پیکربندی
* قابل شناسایی توسط برخی سیستم‎های تحلیل عمیق DPI
* عملکرد بر روی پروتکل شبکه TCP</translation>
@@ -2943,8 +2946,8 @@ For more detailed information, you can
</message>
<message>
<location filename="../protocols/protocols_defs.cpp" line="77"/>
<source>SFTP service</source>
<translation>سرویس SFTP</translation>
<source>Sftp service</source>
<translation>سرویس Sftp</translation>
</message>
<message>
<location filename="../3rd/qtkeychain/qtkeychain/libsecret.cpp" line="119"/>
+31 -27
View File
@@ -86,7 +86,7 @@
</message>
<message>
<location filename="../ui/controllers/connectionController.cpp" line="162"/>
<source>Settings updated successfully, reconnnection...</source>
<source>Settings updated successfully, Reconnnection...</source>
<translation>सेटिंग्स सफलतापूर्वक अपडेट हो गईं...</translation>
</message>
<message>
@@ -711,7 +711,7 @@ Already installed containers were found on the server. All installed containers
<name>PageProtocolShadowSocksSettings</name>
<message>
<location filename="../ui/qml/Pages2/PageProtocolShadowSocksSettings.qml" line="95"/>
<source>Shadowsocks settings</source>
<source>ShadowSocks settings</source>
<translation>शैडोसॉक्स सेटिंग्स</translation>
</message>
<message>
@@ -1055,13 +1055,13 @@ Already installed containers were found on the server. All installed containers
</message>
<message>
<location filename="../ui/qml/Pages2/PageSettingsAbout.qml" line="140"/>
<source>GitHub</source>
<translation>GitHub</translation>
<source>Github</source>
<translation>Github</translation>
</message>
<message>
<location filename="../ui/qml/Pages2/PageSettingsAbout.qml" line="147"/>
<source>https://github.com/amnezia-vpn/amnezia-client</source>
<translation>https://github.com/amnezia-vpn/amnezia-client</translation>
<translation></translation>
</message>
<message>
<location filename="../ui/qml/Pages2/PageSettingsAbout.qml" line="158"/>
@@ -1386,7 +1386,7 @@ Already installed containers were found on the server. All installed containers
<name>PageSettingsDns</name>
<message>
<location filename="../ui/qml/Pages2/PageSettingsDns.qml" line="46"/>
<source>Default server does not support custom DNS</source>
<source>Default server does not support custom dns</source>
<translation>डिफ़ॉल्ट सर्वर कस्टम डीएनएस का समर्थन नहीं करता है</translation>
</message>
<message>
@@ -1459,7 +1459,7 @@ Already installed containers were found on the server. All installed containers
</message>
<message>
<location filename="../ui/qml/Pages2/PageSettingsLogging.qml" line="69"/>
<source>Enabling this function will save application&apos;s logs automatically. By default, logging functionality is disabled. Enable log saving in case of application malfunction.</source>
<source>Enabling this function will save application&apos;s logs automatically, By default, logging functionality is disabled. Enable log saving in case of application malfunction.</source>
<translation>इस फ़ंक्शन को सक्षम करने से एप्लिकेशन के लॉग स्वचालित रूप से सहेजे जाएंगे, डिफ़ॉल्ट रूप से, लॉगिंग कार्यक्षमता अक्षम है। एप्लिकेशन की खराबी की स्थिति में लॉग सेविंग सक्षम करें.</translation>
</message>
<message>
@@ -1868,7 +1868,7 @@ Already installed containers were found on the server. All installed containers
</message>
<message>
<location filename="../ui/qml/Pages2/PageSetupWizardConfigSource.qml" line="102"/>
<source>QR code</source>
<source>QR-code</source>
<translation>क्यू आर संहिता</translation>
</message>
<message>
@@ -2164,7 +2164,7 @@ Already installed containers were found on the server. All installed containers
</message>
<message>
<location filename="../ui/qml/Pages2/PageShare.qml" line="81"/>
<source>Save Shadowsocks config</source>
<source>Save ShadowSocks config</source>
<translation>शैडोसॉक्स कॉन्फ़िगरेशन सहेजें</translation>
</message>
<message>
@@ -2199,7 +2199,7 @@ Already installed containers were found on the server. All installed containers
</message>
<message>
<location filename="../ui/qml/Pages2/PageShare.qml" line="140"/>
<source>Shadowsocks native format</source>
<source>ShadowSocks native format</source>
<translation>शैडोसॉक्स मूल प्रारूप</translation>
</message>
<message>
@@ -2663,7 +2663,7 @@ Already installed containers were found on the server. All installed containers
<name>QObject</name>
<message>
<location filename="../protocols/protocols_defs.cpp" line="78"/>
<source>SFTP service</source>
<source>Sftp service</source>
<translation>एसएफटीपी सेवा</translation>
</message>
<message>
@@ -2673,7 +2673,7 @@ Already installed containers were found on the server. All installed containers
</message>
<message>
<location filename="../core/errorstrings.cpp" line="12"/>
<source>Unknown error</source>
<source>Unknown Error</source>
<translation>अज्ञात त्रुटि</translation>
</message>
<message>
@@ -2718,18 +2718,18 @@ Already installed containers were found on the server. All installed containers
</message>
<message>
<location filename="../core/errorstrings.cpp" line="25"/>
<source>SSH request was denied</source>
<translation>SSH अनुरोध अस्वीकार कर दिया गया</translation>
<source>Ssh request was denied</source>
<translation>Ssh अनुरोध अस्वीकार कर दिया गया</translation>
</message>
<message>
<location filename="../core/errorstrings.cpp" line="26"/>
<source>SSH request was interrupted</source>
<translation>SSH अनुरोध बाधित हो गया था</translation>
<source>Ssh request was interrupted</source>
<translation>Ssh अनुरोध बाधित हो गया था</translation>
</message>
<message>
<location filename="../core/errorstrings.cpp" line="27"/>
<source>SSH internal error</source>
<translation>SSH आंतरिक त्रुटि</translation>
<source>Ssh internal error</source>
<translation>Ssh आंतरिक त्रुटि</translation>
</message>
<message>
<location filename="../core/errorstrings.cpp" line="28"/>
@@ -2773,7 +2773,7 @@ Already installed containers were found on the server. All installed containers
</message>
<message>
<location filename="../core/errorstrings.cpp" line="33"/>
<source>SCP error: Generic failure</source>
<source>Scp error: Generic failure</source>
<translation>एससीपी त्रुटि: सामान्य विफलता</translation>
</message>
<message>
@@ -2788,7 +2788,7 @@ Already installed containers were found on the server. All installed containers
</message>
<message>
<location filename="../core/errorstrings.cpp" line="41"/>
<source>Shadowsocks (ss-local) executable missing</source>
<source>ShadowSocks (ss-local) executable missing</source>
<translation>शैडोसॉक्स (एसएस-स्थानीय) निष्पादन योग्य गायब है</translation>
</message>
<message>
@@ -2874,13 +2874,13 @@ Already installed containers were found on the server. All installed containers
</message>
<message>
<location filename="../containers/containers_defs.cpp" line="97"/>
<source>AmneziaDNS</source>
<translation>AmneziaDNS</translation>
<source>Amnezia DNS</source>
<translation></translation>
</message>
<message>
<location filename="../containers/containers_defs.cpp" line="98"/>
<source>SFTP file sharing service</source>
<translation>SFTP फ़ाइल साझाकरण सेवा</translation>
<source>Sftp file sharing service</source>
<translation>Sftp फ़ाइल साझाकरण सेवा</translation>
</message>
<message>
<location filename="../containers/containers_defs.cpp" line="104"/>
@@ -2889,7 +2889,7 @@ Already installed containers were found on the server. All installed containers
</message>
<message>
<location filename="../containers/containers_defs.cpp" line="107"/>
<source>Shadowsocks - masks VPN traffic, making it similar to normal web traffic, but it may be recognized by analysis systems in some highly censored regions.</source>
<source>ShadowSocks - masks VPN traffic, making it similar to normal web traffic, but it may be recognized by analysis systems in some highly censored regions.</source>
<translation>शैडोसॉक्स - वीपीएन ट्रैफ़िक को मास्क करता है, जिससे यह सामान्य वेब ट्रैफ़िक के समान हो जाता है, लेकिन इसे कुछ अत्यधिक सेंसर किए गए क्षेत्रों में विश्लेषण प्रणालियों द्वारा पहचाना जा सकता है.</translation>
</message>
<message>
@@ -2998,8 +2998,8 @@ For more detailed information, you can
</message>
<message>
<location filename="../containers/containers_defs.cpp" line="124"/>
<source>IKEv2/IPsec - Modern stable protocol, a bit faster than others, restores connection after signal loss.</source>
<translation>IKEv2/IPsec - आधुनिक स्थिर प्रोटोकॉल, दूसरों की तुलना में थोड़ा तेज़, सिग्नल हानि के बाद कनेक्शन पुनर्स्थापित करता है।</translation>
<source>IKEv2 - Modern stable protocol, a bit faster than others, restores connection after signal loss.</source>
<translation>IKEv2 - आधुनिक स्थिर प्रोटोकॉल, दूसरों की तुलना में थोड़ा तेज़, सिग्नल हानि के बाद कनेक्शन पुनर्स्थापित करता है।</translation>
</message>
<message>
<location filename="../containers/containers_defs.cpp" line="127"/>
@@ -3035,12 +3035,16 @@ It employs its unique security protocol, leveraging the strength of SSL/TLS for
<source>Shadowsocks, inspired by the SOCKS5 protocol, safeguards the connection using the AEAD cipher. Although Shadowsocks is designed to be discreet and challenging to identify, it isn&apos;t identical to a standard HTTPS connection.However, certain traffic analysis systems might still detect a Shadowsocks connection. Due to limited support in Amnezia, it&apos;s recommended to use AmneziaWG protocol.
* Available in the AmneziaVPN only on desktop platforms
* Normal power consumption on mobile devices
* Configurable encryption protocol
* Detectable by some DPI systems
* Works over TCP network protocol.</source>
<translation>शैडोसॉक्स, SOCKS5 प्रोटोकॉल से प्रेरित होकर, AEAD सिफर का उपयोग करके कनेक्शन की सुरक्षा करता है। हालाँकि शैडोसॉक्स को विवेकपूर्ण और पहचानने में चुनौतीपूर्ण बनाया गया है, यह एक मानक HTTPS कनेक्शन के समान नहीं है। हालाँकि, कुछ ट्रैफ़िक विश्लेषण प्रणालियाँ अभी भी शैडोसॉक्स कनेक्शन का पता लगा सकती हैं। Amnezia में सीमित समर्थन के कारण, AmneziaWG प्रोटोकॉल का उपयोग करने की अनुशंसा की जाती है।
* AmneziaVPN केवल डेस्कटॉप प्लेटफ़ॉर्म पर उपलब्ध है
* मोबाइल उपकरणों पर सामान्य बिजली की खपत
* कॉन्फ़िगर करने योग्य एन्क्रिप्शन प्रोटोकॉल
* कुछ डीपीआई सिस्टम द्वारा पता लगाने योग्य
* टीसीपी नेटवर्क प्रोटोकॉल पर काम करता है।.</translation>
+37 -33
View File
@@ -22,7 +22,7 @@
</message>
<message>
<location filename="../ui/controllers/connectionController.cpp" line="115"/>
<source>Settings updated successfully, reconnnection...</source>
<source>Settings updated successfully, Reconnnection...</source>
<translation>ဆက်တင်များကို အောင်မြင်စွာ အပ်ဒိတ်လုပ်ပြီးပါပြီ၊ ပြန်လည်ချိတ်ဆက်နေပါသည်...</translation>
</message>
<message>
@@ -664,8 +664,8 @@ Already installed containers were found on the server. All installed containers
<name>PageProtocolShadowSocksSettings</name>
<message>
<location filename="../ui/qml/Pages2/PageProtocolShadowSocksSettings.qml" line="80"/>
<source>Shadowsocks settings</source>
<translation>Shadowsocks ဆက်တင်များ</translation>
<source>ShadowSocks settings</source>
<translation>ShadowSocks ဆက်တင်များ</translation>
</message>
<message>
<location filename="../ui/qml/Pages2/PageProtocolShadowSocksSettings.qml" line="89"/>
@@ -1002,8 +1002,8 @@ Already installed containers were found on the server. All installed containers
</message>
<message>
<location filename="../ui/qml/Pages2/PageSettingsAbout.qml" line="115"/>
<source>GitHub</source>
<translation>GitHub</translation>
<source>Github</source>
<translation>Github</translation>
</message>
<message>
<location filename="../ui/qml/Pages2/PageSettingsAbout.qml" line="119"/>
@@ -1250,8 +1250,8 @@ Already installed containers were found on the server. All installed containers
<name>PageSettingsDns</name>
<message>
<location filename="../ui/qml/Pages2/PageSettingsDns.qml" line="39"/>
<source>Default server does not support custom DNS</source>
<translation>မူရင်းဆာဗာသည် စိတ်ကြိုက် DNS ကို အထောက်အပံ့မပေးပါ</translation>
<source>Default server does not support custom dns</source>
<translation>မူရင်းဆာဗာသည် စိတ်ကြိုက် dns ကို အထောက်အပံ့မပေးပါ</translation>
</message>
<message>
<location filename="../ui/qml/Pages2/PageSettingsDns.qml" line="57"/>
@@ -1323,7 +1323,7 @@ Already installed containers were found on the server. All installed containers
</message>
<message>
<location filename="../ui/qml/Pages2/PageSettingsLogging.qml" line="64"/>
<source>Enabling this function will save application&apos;s logs automatically. By default, logging functionality is disabled. Enable log saving in case of application malfunction.</source>
<source>Enabling this function will save application&apos;s logs automatically, By default, logging functionality is disabled. Enable log saving in case of application malfunction.</source>
<translation>ဤလုပ်ဆောင်ချက်ကို ဖွင့်ခြင်းဖြင့် အပလီကေးရှင်း၏ မှတ်တမ်းများကို အလိုအလျောက် သိမ်းဆည်းပေးမည် ဖြစ်ပြီး မူရင်းအတိုင်း၊ မှတ်တမ်းလုပ်ဆောင်ချက်ကို ပိတ်ထားသည်။ အပလီကေးရှင်းချို့ယွင်းချက်ရှိသောအခါ မှတ်တမ်းသိမ်းဆည်းခြင်းကို ဖွင့်ပါ။</translation>
</message>
<message>
@@ -1711,7 +1711,7 @@ It&apos;s okay as long as it&apos;s from someone you trust.</source>
</message>
<message>
<location filename="../ui/qml/Pages2/PageSetupWizardConfigSource.qml" line="89"/>
<source>QR code</source>
<source>QR-code</source>
<translation>QR-ကုဒ်</translation>
</message>
<message>
@@ -2038,8 +2038,8 @@ It&apos;s okay as long as it&apos;s from someone you trust.</source>
</message>
<message>
<location filename="../ui/qml/Pages2/PageShare.qml" line="79"/>
<source>Save Shadowsocks config</source>
<translation>Shadowsocks config ကိုသိမ်းဆည်းမည်</translation>
<source>Save ShadowSocks config</source>
<translation>ShadowSocks config ကိုသိမ်းဆည်းမည်</translation>
</message>
<message>
<location filename="../ui/qml/Pages2/PageShare.qml" line="86"/>
@@ -2058,8 +2058,8 @@ It&apos;s okay as long as it&apos;s from someone you trust.</source>
</message>
<message>
<location filename="../ui/qml/Pages2/PageShare.qml" line="131"/>
<source>Shadowsocks native format</source>
<translation>Shadowsocks မူရင်းဖောမတ်</translation>
<source>ShadowSocks native format</source>
<translation>ShadowSocks မူရင်းဖောမတ်</translation>
</message>
<message>
<location filename="../ui/qml/Pages2/PageShare.qml" line="136"/>
@@ -2477,7 +2477,7 @@ It&apos;s okay as long as it&apos;s from someone you trust.</source>
</message>
<message>
<location filename="../core/errorstrings.cpp" line="12"/>
<source>Unknown error</source>
<source>Unknown Error</source>
<translation>အမည်မသိ မှားယွင်းမှု</translation>
</message>
<message>
@@ -2517,18 +2517,18 @@ It&apos;s okay as long as it&apos;s from someone you trust.</source>
</message>
<message>
<location filename="../core/errorstrings.cpp" line="24"/>
<source>SSH request was denied</source>
<translation>SSH တောင်းဆိုမှု ငြင်းဆိုခံလိုက်ရပါသည်</translation>
<source>Ssh request was denied</source>
<translation>Ssh တောင်းဆိုမှု ငြင်းဆိုခံလိုက်ရပါသည်</translation>
</message>
<message>
<location filename="../core/errorstrings.cpp" line="25"/>
<source>SSH request was interrupted</source>
<translation>SSH တောင်းဆိုမှု အနှောက်အယက်ခံလိုက်ရပါသည်</translation>
<source>Ssh request was interrupted</source>
<translation>Ssh တောင်းဆိုမှု အနှောက်အယက်ခံလိုက်ရပါသည်</translation>
</message>
<message>
<location filename="../core/errorstrings.cpp" line="26"/>
<source>SSH internal error</source>
<translation>စက်တွင်းဖြစ်သော SSH မှားယွင်းမှု</translation>
<source>Ssh internal error</source>
<translation>စက်တွင်းဖြစ်သော Ssh မှားယွင်းမှု</translation>
</message>
<message>
<location filename="../core/errorstrings.cpp" line="27"/>
@@ -2624,7 +2624,7 @@ It&apos;s okay as long as it&apos;s from someone you trust.</source>
</message>
<message>
<location filename="../core/errorstrings.cpp" line="32"/>
<source>SCP error: Generic failure</source>
<source>Scp error: Generic failure</source>
<translation type="unfinished"></translation>
</message>
<message>
@@ -2639,8 +2639,8 @@ It&apos;s okay as long as it&apos;s from someone you trust.</source>
</message>
<message>
<location filename="../core/errorstrings.cpp" line="40"/>
<source>Shadowsocks (ss-local) executable missing</source>
<translation>Shadowsocks (ss-local) executable ပျောက်နေပါသည်</translation>
<source>ShadowSocks (ss-local) executable missing</source>
<translation>ShadowSocks (ss-local) executable ပျောက်နေပါသည်</translation>
</message>
<message>
<location filename="../core/errorstrings.cpp" line="41"/>
@@ -2719,8 +2719,8 @@ It&apos;s okay as long as it&apos;s from someone you trust.</source>
</message>
<message>
<location filename="../containers/containers_defs.cpp" line="101"/>
<source>Shadowsocks - masks VPN traffic, making it similar to normal web traffic, but it may be recognized by analysis systems in some highly censored regions.</source>
<translation>Shadowsocks - ၎င်းသည် ပုံမှန်ဝဘ်လမ်းကြောင်းနှင့် ဆင်တူစေရန် VPN အသွားအလာကို ဖုံးကွယ်ထားသော်လည်း ၎င်းကို အချို့သော ဆင်ဆာဖြတ်ထားသော ဒေသများရှိ ခွဲခြမ်းစိတ်ဖြာမှုစနစ်များက ထောက်လှန်းသိရှိနိုင်ပါသည်.</translation>
<source>ShadowSocks - masks VPN traffic, making it similar to normal web traffic, but it may be recognized by analysis systems in some highly censored regions.</source>
<translation>ShadowSocks - ၎င်းသည် ပုံမှန်ဝဘ်လမ်းကြောင်းနှင့် ဆင်တူစေရန် VPN အသွားအလာကို ဖုံးကွယ်ထားသော်လည်း ၎င်းကို အချို့သော ဆင်ဆာဖြတ်ထားသော ဒေသများရှိ ခွဲခြမ်းစိတ်ဖြာမှုစနစ်များက ထောက်လှန်းသိရှိနိုင်ပါသည်.</translation>
</message>
<message>
<location filename="../containers/containers_defs.cpp" line="104"/>
@@ -2820,8 +2820,8 @@ IKEv2 သည် လုံခြုံရေး၊ တည်ငြိမ်မှ
</message>
<message>
<location filename="../containers/containers_defs.cpp" line="92"/>
<source>SFTP file sharing service</source>
<translation>SFTP ဖိုင်မျှဝေခြင်းဆားဗစ်</translation>
<source>Sftp file sharing service</source>
<translation>Sftp ဖိုင်မျှဝေခြင်းဆားဗစ်</translation>
</message>
<message>
<location filename="../containers/containers_defs.cpp" line="90"/>
@@ -2831,8 +2831,8 @@ IKEv2 သည် လုံခြုံရေး၊ တည်ငြိမ်မှ
</message>
<message>
<location filename="../containers/containers_defs.cpp" line="91"/>
<source>AmneziaDNS</source>
<translation>AmneziaDNS</translation>
<source>Amnezia DNS</source>
<translation>Amnezia DNS</translation>
</message>
<message>
<location filename="../containers/containers_defs.cpp" line="98"/>
@@ -2851,8 +2851,8 @@ IKEv2 သည် လုံခြုံရေး၊ တည်ငြိမ်မှ
</message>
<message>
<location filename="../containers/containers_defs.cpp" line="115"/>
<source>IKEv2/IPsec - Modern stable protocol, a bit faster than others, restores connection after signal loss.</source>
<translation>IKEv2/IPsec - ခေတ်မီတည်ငြိမ်သောပရိုတိုကော၊ အခြားအရာများထက်အနည်းငယ်ပိုမြန်သည်၊ signal ပျောက်ဆုံးပြီးနောက် ချိတ်ဆက်မှုကို ပြန်လည်ရယူပေးသည်.</translation>
<source>IKEv2 - Modern stable protocol, a bit faster than others, restores connection after signal loss.</source>
<translation>IKEv2 - ခေတ်မီတည်ငြိမ်သောပရိုတိုကော၊ အခြားအရာများထက်အနည်းငယ်ပိုမြန်သည်၊ signal ပျောက်ဆုံးပြီးနောက် ချိတ်ဆက်မှုကို ပြန်လည်ရယူပေးသည်.</translation>
</message>
<message>
<location filename="../containers/containers_defs.cpp" line="118"/>
@@ -2888,12 +2888,16 @@ It employs its unique security protocol, leveraging the strength of SSL/TLS for
<source>Shadowsocks, inspired by the SOCKS5 protocol, safeguards the connection using the AEAD cipher. Although Shadowsocks is designed to be discreet and challenging to identify, it isn&apos;t identical to a standard HTTPS connection.However, certain traffic analysis systems might still detect a Shadowsocks connection. Due to limited support in Amnezia, it&apos;s recommended to use AmneziaWG protocol.
* Available in the AmneziaVPN only on desktop platforms
* Normal power consumption on mobile devices
* Configurable encryption protocol
* Detectable by some DPI systems
* Works over TCP network protocol.</source>
<translation>SOCKS5 ပရိုတိုကောကို အတုယူအခြေခံတည်ဆောက်ထားသော Shadowsocks သည် AEAD cipher ကိုအသုံးပြု၍ ချိတ်ဆက်မှုကိုကာကွယ်ပေးသည်။ Shadowsocks သည် ထောက်လှန်းသိရှိခံရခြင်းမှရှောင်ရှားနိုင်ရန်နှင့် ထောက်လှန်းသည့်သူများခက်ခဲစေရန် ဒီဇိုင်းထုတ်ထားသော်လည်း စံသတ်မှတ်ထားသည့် HTTPS ချိတ်ဆက်မှုနှင့် ထပ်တူမကျပါ။ သို့သော်၊ အချို့သောလမ်းကြောင်းဆိုင်ရာ ခွဲခြမ်းစိတ်ဖြာမှုစနစ်များသည် Shadowsocks ချိတ်ဆက်မှုကို ရှာဖွေတွေ့ရှိနိုင်သေးသည်။ Amnezia တွင် ထောက်ပံ့မှုအကန့်အသတ်ရှိသောကြောင့် AmneziaWG ပရိုတိုကောကို အသုံးပြုရန် အကြံပြုထားသည်။
* Desktop ပလပ်ဖောင်းများတွင်ရှိ‌သော AmneziaVPN တွင်သာအသုံးပြုနိုင်ပါသည်။
* မိုဘိုင်းစက်ပစ္စည်းများတွင် ပုံမှန်ပါဝါသုံးစွဲမှုရှိခြင်း။
* ပြင်ဆင်သတ်မှတ်နိုင်သော စာဝှက်စနစ် ပရိုတိုကော
* အချို့သော DPI စနစ်များဖြင့် ထောက်လှန်းသိရှိနိုင်သည်။
* TCP ကွန်ရက် ပရိုတိုကောပေါ်တွင် အလုပ်လုပ်သည်။.</translation>
@@ -2940,8 +2944,8 @@ For more detailed information, you can
</message>
<message>
<location filename="../protocols/protocols_defs.cpp" line="77"/>
<source>SFTP service</source>
<translation>SFTP ဝန်ဆောင်မှု</translation>
<source>Sftp service</source>
<translation>Sftp ဝန်ဆောင်မှု</translation>
</message>
<message>
<location filename="../3rd/qtkeychain/qtkeychain/libsecret.cpp" line="119"/>
File diff suppressed because it is too large Load Diff
+39 -37
View File
@@ -86,8 +86,8 @@
</message>
<message>
<location filename="../ui/controllers/connectionController.cpp" line="161"/>
<source>Settings updated successfully, reconnnection...</source>
<translation>Налаштування оновлено, підключення...</translation>
<source>Settings updated successfully, Reconnnection...</source>
<translation>Налаштування оновлено, Підключення...</translation>
</message>
<message>
<location filename="../ui/controllers/connectionController.cpp" line="164"/>
@@ -771,8 +771,8 @@ Already installed containers were found on the server. All installed containers
<name>PageProtocolShadowSocksSettings</name>
<message>
<location filename="../ui/qml/Pages2/PageProtocolShadowSocksSettings.qml" line="80"/>
<source>Shadowsocks settings</source>
<translation>Налаштування Shadowsocks</translation>
<source>ShadowSocks settings</source>
<translation>Налаштування ShadowSocks</translation>
</message>
<message>
<location filename="../ui/qml/Pages2/PageProtocolShadowSocksSettings.qml" line="91"/>
@@ -1138,8 +1138,8 @@ Already installed containers were found on the server. All installed containers
</message>
<message>
<location filename="../ui/qml/Pages2/PageSettingsAbout.qml" line="115"/>
<source>GitHub</source>
<translation>GitHub</translation>
<source>Github</source>
<translation>Github</translation>
</message>
<message>
<location filename="../ui/qml/Pages2/PageSettingsAbout.qml" line="119"/>
@@ -1413,7 +1413,7 @@ Already installed containers were found on the server. All installed containers
<message>
<location filename="../ui/qml/Pages2/PageSettingsConnection.qml" line="50"/>
<source>Use AmneziaDNS</source>
<translation>Використовувати AmneziaDNS</translation>
<translation>Використовувати Amnezia DNS</translation>
</message>
<message>
<location filename="../ui/qml/Pages2/PageSettingsConnection.qml" line="51"/>
@@ -1459,7 +1459,7 @@ Already installed containers were found on the server. All installed containers
<name>PageSettingsDns</name>
<message>
<location filename="../ui/qml/Pages2/PageSettingsDns.qml" line="39"/>
<source>Default server does not support custom DNS</source>
<source>Default server does not support custom dns</source>
<translation type="unfinished">Сервер за замовчуванням не підтримує користувацький DNS</translation>
</message>
<message>
@@ -1536,7 +1536,7 @@ Already installed containers were found on the server. All installed containers
</message>
<message>
<location filename="../ui/qml/Pages2/PageSettingsLogging.qml" line="60"/>
<source>Enabling this function will save application&apos;s logs automatically. By default, logging functionality is disabled. Enable log saving in case of application malfunction.</source>
<source>Enabling this function will save application&apos;s logs automatically, By default, logging functionality is disabled. Enable log saving in case of application malfunction.</source>
<translation type="unfinished"></translation>
</message>
<message>
@@ -1975,7 +1975,7 @@ It&apos;s okay as long as it&apos;s from someone you trust.</source>
</message>
<message>
<location filename="../ui/qml/Pages2/PageSetupWizardConfigSource.qml" line="89"/>
<source>QR code</source>
<source>QR-code</source>
<translation>QR-код</translation>
</message>
<message>
@@ -2368,8 +2368,8 @@ and will not be shared or disclosed to the Amnezia or any third parties</source>
</message>
<message>
<location filename="../ui/qml/Pages2/PageShare.qml" line="81"/>
<source>Save Shadowsocks config</source>
<translation type="unfinished">Зберегти конфігурацію Shadowsocks</translation>
<source>Save ShadowSocks config</source>
<translation type="unfinished">Зберегти конфігурацію ShadowSocks</translation>
</message>
<message>
<location filename="../ui/qml/Pages2/PageShare.qml" line="88"/>
@@ -2393,8 +2393,8 @@ and will not be shared or disclosed to the Amnezia or any third parties</source>
</message>
<message>
<location filename="../ui/qml/Pages2/PageShare.qml" line="140"/>
<source>Shadowsocks native format</source>
<translation type="unfinished">Shadowsocks нативний формат</translation>
<source>ShadowSocks native format</source>
<translation type="unfinished">ShadowSocks нативний формат</translation>
</message>
<message>
<location filename="../ui/qml/Pages2/PageShare.qml" line="145"/>
@@ -2820,8 +2820,8 @@ and will not be shared or disclosed to the Amnezia or any third parties</source>
</message>
<message>
<location filename="../core/errorstrings.cpp" line="12"/>
<source>Unknown error</source>
<translation>Unknown error</translation>
<source>Unknown Error</source>
<translation>Unknown Error</translation>
</message>
<message>
<location filename="../core/errorstrings.cpp" line="13"/>
@@ -2865,18 +2865,18 @@ and will not be shared or disclosed to the Amnezia or any third parties</source>
</message>
<message>
<location filename="../core/errorstrings.cpp" line="25"/>
<source>SSH request was denied</source>
<translation>SSH request was denied</translation>
<source>Ssh request was denied</source>
<translation>Ssh request was denied</translation>
</message>
<message>
<location filename="../core/errorstrings.cpp" line="26"/>
<source>SSH request was interrupted</source>
<translation>SSH request was interrupted</translation>
<source>Ssh request was interrupted</source>
<translation>Ssh request was interrupted</translation>
</message>
<message>
<location filename="../core/errorstrings.cpp" line="27"/>
<source>SSH internal error</source>
<translation>SSH internal error</translation>
<source>Ssh internal error</source>
<translation>Ssh internal error</translation>
</message>
<message>
<location filename="../core/errorstrings.cpp" line="28"/>
@@ -2895,7 +2895,7 @@ and will not be shared or disclosed to the Amnezia or any third parties</source>
</message>
<message>
<location filename="../core/errorstrings.cpp" line="33"/>
<source>SCP error: Generic failure</source>
<source>Scp error: Generic failure</source>
<translation type="unfinished"></translation>
</message>
<message>
@@ -2991,8 +2991,8 @@ and will not be shared or disclosed to the Amnezia or any third parties</source>
</message>
<message>
<location filename="../core/errorstrings.cpp" line="41"/>
<source>Shadowsocks (ss-local) executable missing</source>
<translation>Shadowsocks (ss-local) executable missing</translation>
<source>ShadowSocks (ss-local) executable missing</source>
<translation>ShadowSocks (ss-local) executable missing</translation>
</message>
<message>
<location filename="../core/errorstrings.cpp" line="42"/>
@@ -3071,13 +3071,13 @@ and will not be shared or disclosed to the Amnezia or any third parties</source>
</message>
<message>
<location filename="../containers/containers_defs.cpp" line="107"/>
<source>Shadowsocks - masks VPN traffic, making it similar to normal web traffic, but it may be recognized by analysis systems in some highly censored regions.</source>
<translation type="unfinished">Shadowsocks - маскує VPN-трафік під звичайний веб-трафік, але розпізнається системами аналізу трафіка в деяких регіонах з високим рівнем цензури.</translation>
<source>ShadowSocks - masks VPN traffic, making it similar to normal web traffic, but it may be recognized by analysis systems in some highly censored regions.</source>
<translation type="unfinished">ShadowSocks - маскує VPN-трафік під звичайний веб-трафік, але розпізнається системами аналізу трафіка в деяких регіонах з високим рівнем цензури.</translation>
</message>
<message>
<location filename="../containers/containers_defs.cpp" line="110"/>
<source>OpenVPN over Cloak - OpenVPN with VPN masquerading as web traffic and protection against active-probing detection. Ideal for bypassing blocking in regions with the highest levels of censorship.</source>
<translation type="unfinished">OpenVPN over Cloak - OpenVPN з маскуванням VPN під HTTPS трафік і захистом від active-probing. Підходить для регіонів з самим високим рівнем цензури.</translation>
<translation type="unfinished">OpenVPN over Cloak - OpenVPN з маскуванням VPN під HTTPS трафік і захистом від active-probbing. Підходить для регіонів з самим високим рівнем цензури.</translation>
</message>
<message>
<location filename="../containers/containers_defs.cpp" line="131"/>
@@ -3142,7 +3142,7 @@ While it offers a blend of security, stability, and speed, it&apos;s essential t
Він може швидко переключись між мережами та пристроями, що робить його осболиво адаптованим під динамічні мережеві середовища.
Потрібно зазначити, що незважаючи на стабільність та швидкість, IKEv2 легко розпізнається та вразливий до блокувань.
* IKEv2/IPsec в AmneziaVPN тільки для Windows.
* IKEv2 в AmneziaVPN тільки для Windows.
* Низьке енергоспоживання, на мобільних пристроях
* Мінімальна конфігурація
* Розпізнається системами DPI-анализу
@@ -3155,8 +3155,8 @@ While it offers a blend of security, stability, and speed, it&apos;s essential t
</message>
<message>
<location filename="../containers/containers_defs.cpp" line="98"/>
<source>SFTP file sharing service</source>
<translation>Сервіс обміну файлами SFTP</translation>
<source>Sftp file sharing service</source>
<translation>Сервіс обміну файлами Sftp</translation>
</message>
<message>
<location filename="../containers/containers_defs.cpp" line="96"/>
@@ -3166,8 +3166,8 @@ While it offers a blend of security, stability, and speed, it&apos;s essential t
</message>
<message>
<location filename="../containers/containers_defs.cpp" line="97"/>
<source>AmneziaDNS</source>
<translation>AmneziaDNS</translation>
<source>Amnezia DNS</source>
<translation>Amnezia DNS</translation>
</message>
<message>
<location filename="../containers/containers_defs.cpp" line="104"/>
@@ -3191,8 +3191,8 @@ While it offers a blend of security, stability, and speed, it&apos;s essential t
</message>
<message>
<location filename="../containers/containers_defs.cpp" line="124"/>
<source>IKEv2/IPsec - Modern stable protocol, a bit faster than others, restores connection after signal loss.</source>
<translation>IKEv2/IPsec сучасний стабільний протокол, трішки швидше за інших відновлює підключення.</translation>
<source>IKEv2 - Modern stable protocol, a bit faster than others, restores connection after signal loss.</source>
<translation>IKEv2 сучасний стабільний протокол, трішки швидше за інших відновлює підключення.</translation>
</message>
<message>
<location filename="../containers/containers_defs.cpp" line="127"/>
@@ -3202,7 +3202,7 @@ While it offers a blend of security, stability, and speed, it&apos;s essential t
<message>
<location filename="../containers/containers_defs.cpp" line="129"/>
<source>Replace the current DNS server with your own. This will increase your privacy level.</source>
<translation>Замініть DNS-сервер на AmneziaDNS. Це підвищить вашу рівень захищеності в інтернеті.</translation>
<translation>Замініть DNS-сервер на Amnezia DNS. Це підвищить вашу рівень захищеності в інтернеті.</translation>
</message>
<message>
<location filename="../containers/containers_defs.cpp" line="138"/>
@@ -3228,6 +3228,8 @@ It employs its unique security protocol, leveraging the strength of SSL/TLS for
<source>Shadowsocks, inspired by the SOCKS5 protocol, safeguards the connection using the AEAD cipher. Although Shadowsocks is designed to be discreet and challenging to identify, it isn&apos;t identical to a standard HTTPS connection.However, certain traffic analysis systems might still detect a Shadowsocks connection. Due to limited support in Amnezia, it&apos;s recommended to use AmneziaWG protocol.
* Available in the AmneziaVPN only on desktop platforms
* Normal power consumption on mobile devices
* Configurable encryption protocol
* Detectable by some DPI systems
* Works over TCP network protocol.</source>
@@ -3338,7 +3340,7 @@ This means that AmneziaWG keeps the fast performance of the original while addin
</message>
<message>
<location filename="../protocols/protocols_defs.cpp" line="78"/>
<source>SFTP service</source>
<source>Sftp service</source>
<translation>Сервіс SFTP</translation>
</message>
<message>
+28 -26
View File
@@ -85,7 +85,7 @@
</message>
<message>
<location filename="../ui/controllers/connectionController.cpp" line="162"/>
<source>Settings updated successfully, reconnnection...</source>
<source>Settings updated successfully, Reconnnection...</source>
<translation>ترتیب ک ھوگی،دوبارہ جوڑنےکی کوشش...</translation>
</message>
<message>
@@ -711,7 +711,7 @@ Already installed containers were found on the server. All installed containers
<name>PageProtocolShadowSocksSettings</name>
<message>
<location filename="../ui/qml/Pages2/PageProtocolShadowSocksSettings.qml" line="95"/>
<source>Shadowsocks settings</source>
<source>ShadowSocks settings</source>
<translation>شیڈو ساکس ترتیبات</translation>
</message>
<message>
@@ -1057,13 +1057,13 @@ Already installed containers were found on the server. All installed containers
</message>
<message>
<location filename="../ui/qml/Pages2/PageSettingsAbout.qml" line="140"/>
<source>GitHub</source>
<source>Github</source>
<translation>گِٹ ہَب</translation>
</message>
<message>
<location filename="../ui/qml/Pages2/PageSettingsAbout.qml" line="147"/>
<source>https://github.com/amnezia-vpn/amnezia-client</source>
<translation>https://github.com/amnezia-vpn/amnezia-client</translation>
<translation></translation>
</message>
<message>
<location filename="../ui/qml/Pages2/PageSettingsAbout.qml" line="158"/>
@@ -1373,7 +1373,7 @@ Already installed containers were found on the server. All installed containers
<name>PageSettingsDns</name>
<message>
<location filename="../ui/qml/Pages2/PageSettingsDns.qml" line="46"/>
<source>Default server does not support custom DNS</source>
<source>Default server does not support custom dns</source>
<translation>افتراضی سرور کا مخصوص DNS کو سپورٹ نہیں کرتا ہے</translation>
</message>
<message>
@@ -1446,7 +1446,7 @@ Already installed containers were found on the server. All installed containers
</message>
<message>
<location filename="../ui/qml/Pages2/PageSettingsLogging.qml" line="69"/>
<source>Enabling this function will save application&apos;s logs automatically. By default, logging functionality is disabled. Enable log saving in case of application malfunction.</source>
<source>Enabling this function will save application&apos;s logs automatically, By default, logging functionality is disabled. Enable log saving in case of application malfunction.</source>
<translation>اس فعل کو فعال کرنے سے، ایپلیکیشن کے لاگ خود بخود محفوظ ہوجائیں گے۔ پہلے سے، لاگنگ کی فعالیت غیر فعال ہوتی ہے۔ اگر ایپلیکیشن میں کوئی خرابی ہو، تو لاگ کو بچانا فعال کریں.</translation>
</message>
<message>
@@ -1855,7 +1855,7 @@ Already installed containers were found on the server. All installed containers
</message>
<message>
<location filename="../ui/qml/Pages2/PageSetupWizardConfigSource.qml" line="102"/>
<source>QR code</source>
<source>QR-code</source>
<translation>QR کوڈ</translation>
</message>
<message>
@@ -2151,7 +2151,7 @@ Already installed containers were found on the server. All installed containers
</message>
<message>
<location filename="../ui/qml/Pages2/PageShare.qml" line="81"/>
<source>Save Shadowsocks config</source>
<source>Save ShadowSocks config</source>
<translation>شیڈو ساکس کی ترتیبات کو محفوظ کریں</translation>
</message>
<message>
@@ -2186,7 +2186,7 @@ Already installed containers were found on the server. All installed containers
</message>
<message>
<location filename="../ui/qml/Pages2/PageShare.qml" line="140"/>
<source>Shadowsocks native format</source>
<source>ShadowSocks native format</source>
<translation>شیڈو ساکس کا اصل فارمیٹ</translation>
</message>
<message>
@@ -2631,7 +2631,7 @@ Already installed containers were found on the server. All installed containers
<name>QObject</name>
<message>
<location filename="../protocols/protocols_defs.cpp" line="78"/>
<source>SFTP service</source>
<source>Sftp service</source>
<translation>ایس ایف ٹی پی سروس</translation>
</message>
<message>
@@ -2641,7 +2641,7 @@ Already installed containers were found on the server. All installed containers
</message>
<message>
<location filename="../core/errorstrings.cpp" line="12"/>
<source>Unknown error</source>
<source>Unknown Error</source>
<translation>نامعلوم خامی</translation>
</message>
<message>
@@ -2681,18 +2681,18 @@ Already installed containers were found on the server. All installed containers
</message>
<message>
<location filename="../core/errorstrings.cpp" line="25"/>
<source>SSH request was denied</source>
<translation>SSH درخواست مسترد کر دی گئی</translation>
<source>Ssh request was denied</source>
<translation>Ssh درخواست مسترد کر دی گئی</translation>
</message>
<message>
<location filename="../core/errorstrings.cpp" line="26"/>
<source>SSH request was interrupted</source>
<translation>SSH درخواست میں خلل پڑ</translation>
<source>Ssh request was interrupted</source>
<translation>Ssh درخواست میں خلل پڑ</translation>
</message>
<message>
<location filename="../core/errorstrings.cpp" line="27"/>
<source>SSH internal error</source>
<translation>SSH اندرونی خرابی</translation>
<source>Ssh internal error</source>
<translation>Ssh اندرونی خرابی</translation>
</message>
<message>
<location filename="../core/errorstrings.cpp" line="28"/>
@@ -2741,7 +2741,7 @@ Already installed containers were found on the server. All installed containers
</message>
<message>
<location filename="../core/errorstrings.cpp" line="33"/>
<source>SCP error: Generic failure</source>
<source>Scp error: Generic failure</source>
<translation>ایس سی پی کی خرابی: عام ناکامی</translation>
</message>
<message>
@@ -2756,7 +2756,7 @@ Already installed containers were found on the server. All installed containers
</message>
<message>
<location filename="../core/errorstrings.cpp" line="41"/>
<source>Shadowsocks (ss-local) executable missing</source>
<source>ShadowSocks (ss-local) executable missing</source>
<translation>شیڈو ساکس (ss-local) قابل عمل غائب</translation>
</message>
<message>
@@ -2842,13 +2842,13 @@ Already installed containers were found on the server. All installed containers
</message>
<message>
<location filename="../containers/containers_defs.cpp" line="97"/>
<source>AmneziaDNS</source>
<source>Amnezia DNS</source>
<translation>ایمنیزیا ڈی این ایس</translation>
</message>
<message>
<location filename="../containers/containers_defs.cpp" line="98"/>
<source>SFTP file sharing service</source>
<translation>SFTP فائل شیئرنگ سروس</translation>
<source>Sftp file sharing service</source>
<translation>Sftp فائل شیئرنگ سروس</translation>
</message>
<message>
<location filename="../containers/containers_defs.cpp" line="104"/>
@@ -2857,7 +2857,7 @@ Already installed containers were found on the server. All installed containers
</message>
<message>
<location filename="../containers/containers_defs.cpp" line="107"/>
<source>Shadowsocks - masks VPN traffic, making it similar to normal web traffic, but it may be recognized by analysis systems in some highly censored regions.</source>
<source>ShadowSocks - masks VPN traffic, making it similar to normal web traffic, but it may be recognized by analysis systems in some highly censored regions.</source>
<translation>شیڈو ساکس - VPN ٹریفک کو ماسک کرتا ہے، جو اسے عام ویب ٹریفک جیسا بناتا ہے، لیکن اسے کچھ انتہائی سنسر والے علاقوں میں تجزیہ کے نظام کے ذریعے پہچانا جا سکتا ہے.</translation>
</message>
<message>
@@ -2947,8 +2947,8 @@ For more detailed information, you can
</message>
<message>
<location filename="../containers/containers_defs.cpp" line="124"/>
<source>IKEv2/IPsec - Modern stable protocol, a bit faster than others, restores connection after signal loss.</source>
<translation>IKEv2/IPsec - جدید مستحکم پروٹوکول، دوسروں کے مقابلے میں تھوڑا تیز، سگنل ضائع ہونے کے بعد کنکشن بحال کرتا ہے۔</translation>
<source>IKEv2 - Modern stable protocol, a bit faster than others, restores connection after signal loss.</source>
<translation>IKEv2 - جدید مستحکم پروٹوکول، دوسروں کے مقابلے میں تھوڑا تیز، سگنل ضائع ہونے کے بعد کنکشن بحال کرتا ہے۔</translation>
</message>
<message>
<location filename="../containers/containers_defs.cpp" line="127"/>
@@ -2977,10 +2977,12 @@ It employs its unique security protocol, leveraging the strength of SSL/TLS for
<source>Shadowsocks, inspired by the SOCKS5 protocol, safeguards the connection using the AEAD cipher. Although Shadowsocks is designed to be discreet and challenging to identify, it isn&apos;t identical to a standard HTTPS connection.However, certain traffic analysis systems might still detect a Shadowsocks connection. Due to limited support in Amnezia, it&apos;s recommended to use AmneziaWG protocol.
* Available in the AmneziaVPN only on desktop platforms
* Normal power consumption on mobile devices
* Configurable encryption protocol
* Detectable by some DPI systems
* Works over TCP network protocol.</source>
<translation>شیڈو ساکس، SOCKS5 پروٹوکول سے متاثر، AEAD سائفر کا استعمال کرتے ہوئے کنکشن کی حفاظت کرتا ہے۔ اگرچہ شیڈو ساکس کو سمجھدار اور شناخت کرنے کے لیے چیلنج کرنے کے لیے ڈیزائن کیا گیا ہے، لیکن یہ معیاری HTTPS کنکشن سے مماثل نہیں ہے۔ تاہم، کچھ ٹریفک تجزیہ نظام اب بھی شیڈو ساکس کنکشن کا پتہ لگا سکتے ہیں۔ Amnezia میں محدود تعاون کی وجہ سے، AmneziaWG پروٹوکول استعمال کرنے کی سفارش کی جاتی ہے۔ * صرف ڈیسک ٹاپ پلیٹ فارمز پر AmneziaVPN میں دستیاب ہے * قابل ترتیب انکرپشن پروٹوکول * کچھ DPI سسٹمز کے ذریعے قابل شناخت * TCP نیٹ ورک پروٹوکول پر کام کرتا ہے.</translation>
<translation>شیڈو ساکس، SOCKS5 پروٹوکول سے متاثر، AEAD سائفر کا استعمال کرتے ہوئے کنکشن کی حفاظت کرتا ہے۔ اگرچہ شیڈو ساکس کو سمجھدار اور شناخت کرنے کے لیے چیلنج کرنے کے لیے ڈیزائن کیا گیا ہے، لیکن یہ معیاری HTTPS کنکشن سے مماثل نہیں ہے۔ تاہم، کچھ ٹریفک تجزیہ نظام اب بھی شیڈو ساکس کنکشن کا پتہ لگا سکتے ہیں۔ Amnezia میں محدود تعاون کی وجہ سے، AmneziaWG پروٹوکول استعمال کرنے کی سفارش کی جاتی ہے۔ * صرف ڈیسک ٹاپ پلیٹ فارمز پر AmneziaVPN میں دستیاب ہے * موبائل آلات پر بجلی کی عام کھپت * قابل ترتیب انکرپشن پروٹوکول * کچھ DPI سسٹمز کے ذریعے قابل شناخت * TCP نیٹ ورک پروٹوکول پر کام کرتا ہے.</translation>
</message>
<message>
<location filename="../containers/containers_defs.cpp" line="196"/>
+39 -35
View File
@@ -39,7 +39,7 @@
</message>
<message>
<location filename="../ui/controllers/connectionController.cpp" line="115"/>
<source>Settings updated successfully, reconnnection...</source>
<source>Settings updated successfully, Reconnnection...</source>
<translation>配置已更新, 重连中...</translation>
</message>
<message>
@@ -698,8 +698,8 @@ Already installed containers were found on the server. All installed containers
<name>PageProtocolShadowSocksSettings</name>
<message>
<location filename="../ui/qml/Pages2/PageProtocolShadowSocksSettings.qml" line="80"/>
<source>Shadowsocks settings</source>
<translation>Shadowsocks 配置</translation>
<source>ShadowSocks settings</source>
<translation>ShadowSocks 配置</translation>
</message>
<message>
<location filename="../ui/qml/Pages2/PageProtocolShadowSocksSettings.qml" line="89"/>
@@ -1039,13 +1039,13 @@ And if you don&apos;t like the app, all the more support it - the donation will
</message>
<message>
<location filename="../ui/qml/Pages2/PageSettingsAbout.qml" line="115"/>
<source>GitHub</source>
<translation>GitHub</translation>
<source>Github</source>
<translation></translation>
</message>
<message>
<location filename="../ui/qml/Pages2/PageSettingsAbout.qml" line="119"/>
<source>https://github.com/amnezia-vpn/amnezia-client</source>
<translation>https://github.com/amnezia-vpn/amnezia-client</translation>
<translation></translation>
</message>
<message>
<location filename="../ui/qml/Pages2/PageSettingsAbout.qml" line="128"/>
@@ -1323,8 +1323,8 @@ And if you don&apos;t like the app, all the more support it - the donation will
<name>PageSettingsDns</name>
<message>
<location filename="../ui/qml/Pages2/PageSettingsDns.qml" line="39"/>
<source>Default server does not support custom DNS</source>
<translation>默认服务器不支持自定义 DNS</translation>
<source>Default server does not support custom dns</source>
<translation>默认服务器不支持自定义 dns</translation>
</message>
<message>
<location filename="../ui/qml/Pages2/PageSettingsDns.qml" line="57"/>
@@ -1396,7 +1396,7 @@ And if you don&apos;t like the app, all the more support it - the donation will
</message>
<message>
<location filename="../ui/qml/Pages2/PageSettingsLogging.qml" line="64"/>
<source>Enabling this function will save application&apos;s logs automatically. By default, logging functionality is disabled. Enable log saving in case of application malfunction.</source>
<source>Enabling this function will save application&apos;s logs automatically, By default, logging functionality is disabled. Enable log saving in case of application malfunction.</source>
<translation>默认情况下,日志功能是禁用的。如果应用程序出现故障,则启用日志保存功能。</translation>
</message>
<message>
@@ -1834,7 +1834,7 @@ It&apos;s okay as long as it&apos;s from someone you trust.</source>
</message>
<message>
<location filename="../ui/qml/Pages2/PageSetupWizardConfigSource.qml" line="89"/>
<source>QR code</source>
<source>QR-code</source>
<translation>二维码</translation>
</message>
<message>
@@ -2167,8 +2167,8 @@ and will not be shared or disclosed to the Amnezia or any third parties</source>
</message>
<message>
<location filename="../ui/qml/Pages2/PageShare.qml" line="79"/>
<source>Save Shadowsocks config</source>
<translation>保存 Shadowsocks 配置</translation>
<source>Save ShadowSocks config</source>
<translation>保存 ShadowSocks 配置</translation>
</message>
<message>
<location filename="../ui/qml/Pages2/PageShare.qml" line="86"/>
@@ -2197,8 +2197,8 @@ and will not be shared or disclosed to the Amnezia or any third parties</source>
</message>
<message>
<location filename="../ui/qml/Pages2/PageShare.qml" line="131"/>
<source>Shadowsocks native format</source>
<translation>Shadowsocks原生格式</translation>
<source>ShadowSocks native format</source>
<translation>ShadowSocks原生格式</translation>
</message>
<message>
<location filename="../ui/qml/Pages2/PageShare.qml" line="136"/>
@@ -2681,8 +2681,8 @@ and will not be shared or disclosed to the Amnezia or any third parties</source>
<name>QObject</name>
<message>
<location filename="../protocols/protocols_defs.cpp" line="77"/>
<source>SFTP service</source>
<translation>SFTP 服务</translation>
<source>Sftp service</source>
<translation>Sftp 服务</translation>
</message>
<message>
<location filename="../core/errorstrings.cpp" line="11"/>
@@ -2691,7 +2691,7 @@ and will not be shared or disclosed to the Amnezia or any third parties</source>
</message>
<message>
<location filename="../core/errorstrings.cpp" line="12"/>
<source>Unknown error</source>
<source>Unknown Error</source>
<translation>未知错误</translation>
</message>
<message>
@@ -2731,18 +2731,18 @@ and will not be shared or disclosed to the Amnezia or any third parties</source>
</message>
<message>
<location filename="../core/errorstrings.cpp" line="24"/>
<source>SSH request was denied</source>
<translation>SSH请求被拒绝</translation>
<source>Ssh request was denied</source>
<translation>ssh请求被拒绝</translation>
</message>
<message>
<location filename="../core/errorstrings.cpp" line="25"/>
<source>SSH request was interrupted</source>
<translation>SSH请求中断</translation>
<source>Ssh request was interrupted</source>
<translation>ssh请求中断</translation>
</message>
<message>
<location filename="../core/errorstrings.cpp" line="26"/>
<source>SSH internal error</source>
<translation>SSH内部错误</translation>
<source>Ssh internal error</source>
<translation>ssh内部错误</translation>
</message>
<message>
<location filename="../core/errorstrings.cpp" line="27"/>
@@ -2761,7 +2761,7 @@ and will not be shared or disclosed to the Amnezia or any third parties</source>
</message>
<message>
<location filename="../core/errorstrings.cpp" line="32"/>
<source>SCP error: Generic failure</source>
<source>Scp error: Generic failure</source>
<translation type="unfinished"></translation>
</message>
<message>
@@ -2887,8 +2887,8 @@ and will not be shared or disclosed to the Amnezia or any third parties</source>
</message>
<message>
<location filename="../core/errorstrings.cpp" line="40"/>
<source>Shadowsocks (ss-local) executable missing</source>
<translation>Shadowsocks (ss-local) 执行文件丢失</translation>
<source>ShadowSocks (ss-local) executable missing</source>
<translation>ShadowSocks (ss-local) 执行文件丢失</translation>
</message>
<message>
<location filename="../core/errorstrings.cpp" line="41"/>
@@ -2947,12 +2947,12 @@ and will not be shared or disclosed to the Amnezia or any third parties</source>
</message>
<message>
<location filename="../containers/containers_defs.cpp" line="91"/>
<source>AmneziaDNS</source>
<translation>AmneziaDNS</translation>
<source>Amnezia DNS</source>
<translation></translation>
</message>
<message>
<location filename="../containers/containers_defs.cpp" line="92"/>
<source>SFTP file sharing service</source>
<source>Sftp file sharing service</source>
<translation>SFTP文件共享服务</translation>
</message>
<message>
@@ -2962,8 +2962,8 @@ and will not be shared or disclosed to the Amnezia or any third parties</source>
</message>
<message>
<location filename="../containers/containers_defs.cpp" line="101"/>
<source>Shadowsocks - masks VPN traffic, making it similar to normal web traffic, but it may be recognized by analysis systems in some highly censored regions.</source>
<translation>Shadowsocks - 掩盖VPN流量,使其类似于正常的网络流量,但在一些高度审查的地区可能会被分析系统识别.</translation>
<source>ShadowSocks - masks VPN traffic, making it similar to normal web traffic, but it may be recognized by analysis systems in some highly censored regions.</source>
<translation>ShadowSocks - 掩盖VPN流量,使其类似于正常的网络流量,但在一些高度审查的地区可能会被分析系统识别.</translation>
</message>
<message>
<location filename="../containers/containers_defs.cpp" line="217"/>
@@ -3037,8 +3037,8 @@ WireGuard非常容易被阻挡,因为其独特的数据包签名。与一些
通过UDP网络协议运行。</translation>
</message>
<message>
<source>Shadowsocks - masks VPN traffic, making it similar to normal web traffic, but is recognised by analysis systems in some highly censored regions.</source>
<translation type="vanished">Shadowsocks - 混淆 VPN 流量,使其与正常的 Web 流量相似,但在一些审查力度高的地区可以被分析系统识别。</translation>
<source>ShadowSocks - masks VPN traffic, making it similar to normal web traffic, but is recognised by analysis systems in some highly censored regions.</source>
<translation type="vanished">ShadowSocks - 混淆 VPN 流量,使其与正常的 Web 流量相似,但在一些审查力度高的地区可以被分析系统识别。</translation>
</message>
<message>
<location filename="../containers/containers_defs.cpp" line="104"/>
@@ -3057,8 +3057,8 @@ WireGuard非常容易被阻挡,因为其独特的数据包签名。与一些
</message>
<message>
<location filename="../containers/containers_defs.cpp" line="115"/>
<source>IKEv2/IPsec - Modern stable protocol, a bit faster than others, restores connection after signal loss.</source>
<translation>IKEv2/IPsec - 现代稳定协议,相比其他协议较快一些,在信号丢失后恢复连接。</translation>
<source>IKEv2 - Modern stable protocol, a bit faster than others, restores connection after signal loss.</source>
<translation>IKEv2 - 现代稳定协议,相比其他协议较快一些,在信号丢失后恢复连接。</translation>
</message>
<message>
<location filename="../containers/containers_defs.cpp" line="118"/>
@@ -3098,12 +3098,16 @@ It employs its unique security protocol, leveraging the strength of SSL/TLS for
<source>Shadowsocks, inspired by the SOCKS5 protocol, safeguards the connection using the AEAD cipher. Although Shadowsocks is designed to be discreet and challenging to identify, it isn&apos;t identical to a standard HTTPS connection.However, certain traffic analysis systems might still detect a Shadowsocks connection. Due to limited support in Amnezia, it&apos;s recommended to use AmneziaWG protocol.
* Available in the AmneziaVPN only on desktop platforms
* Normal power consumption on mobile devices
* Configurable encryption protocol
* Detectable by some DPI systems
* Works over TCP network protocol.</source>
<translation>Shadowsocks 受到 SOCKS5 协议的启发,使用 AEAD 密码保护连接。尽管 Shadowsocks 设计得谨慎且难以识别,但它与标准 HTTPS 连接并不相同。但是,某些流量分析系统可能仍会检测到 Shadowsocks 连接。由于Amnezia支持有限,建议使用AmneziaWG协议。
* 仅在桌面平台上的 AmneziaVPN 中可用
* 移动设备的正常功耗
* 可配置的加密协议
* 可以被某些 DPI 系统检测到
* 通过 TCP 网络协议工作。</translation>
@@ -123,7 +123,7 @@ void ConnectionController::onConnectionStateChanged(Vpn::ConnectionState state)
void ConnectionController::onCurrentContainerUpdated()
{
if (m_isConnected || m_isConnectionInProgress) {
emit reconnectWithUpdatedContainer(tr("Settings updated successfully, reconnnection..."));
emit reconnectWithUpdatedContainer(tr("Settings updated successfully, Reconnnection..."));
openConnection();
} else {
emit reconnectWithUpdatedContainer(tr("Settings updated successfully"));
-3
View File
@@ -41,7 +41,6 @@ QVariant ContainersModel::data(const QModelIndex &index, int role) const
case IsCurrentlyProcessedRole: return container == static_cast<DockerContainer>(m_processedContainerIndex);
case IsSupportedRole: return ContainerProps::isSupportedByCurrentPlatform(container);
case IsShareableRole: return ContainerProps::isShareable(container);
case InstallPageOrderRole: return ContainerProps::installPageOrder(container);
}
return QVariant();
@@ -113,7 +112,5 @@ QHash<int, QByteArray> ContainersModel::roleNames() const
roles[IsCurrentlyProcessedRole] = "isCurrentlyProcessed";
roles[IsSupportedRole] = "isSupported";
roles[IsShareableRole] = "isShareable";
roles[InstallPageOrderRole] = "installPageOrder";
return roles;
}
+1 -3
View File
@@ -31,9 +31,7 @@ public:
IsCurrentlyProcessedRole,
IsDefaultRole,
IsSupportedRole,
IsShareableRole,
InstallPageOrderRole
IsShareableRole
};
int rowCount(const QModelIndex &parent = QModelIndex()) const override;
+10 -11
View File
@@ -6,14 +6,13 @@ import Qt5Compat.GraphicalEffects
import ConnectionState 1.0
import PageEnum 1.0
import Style 1.0
Button {
id: root
property string defaultButtonColor: AmneziaStyle.color.white
property string progressButtonColor: AmneziaStyle.color.white
property string connectedButtonColor: AmneziaStyle.color.orange
property string defaultButtonColor: "#D7D8DB"
property string progressButtonColor: "#D7D8DB"
property string connectedButtonColor: "#FBB26A"
implicitWidth: 190
implicitHeight: 190
@@ -50,13 +49,13 @@ Button {
verticalOffset: 0
radius: 10
samples: 25
color: root.activeFocus ? AmneziaStyle.color.white : AmneziaStyle.color.orange
color: root.activeFocus ? "#D7D8DB" : "#FBB26A"
source: backgroundCircle
}
ShapePath {
fillColor: AmneziaStyle.color.transparent
strokeColor: AmneziaStyle.color.white
fillColor: "transparent"
strokeColor: "#D7D8DB"
strokeWidth: root.activeFocus ? 1 : 0
capStyle: ShapePath.RoundCap
@@ -71,10 +70,10 @@ Button {
}
ShapePath {
fillColor: AmneziaStyle.color.transparent
fillColor: "transparent"
strokeColor: {
if (ConnectionController.isConnectionInProgress) {
return AmneziaStyle.color.connectionInProgress
return "#261E1A"
} else if (ConnectionController.isConnected) {
return connectedButtonColor
} else {
@@ -114,8 +113,8 @@ Button {
visible: ConnectionController.isConnectionInProgress
ShapePath {
fillColor: AmneziaStyle.color.transparent
strokeColor: AmneziaStyle.color.white
fillColor: "transparent"
strokeColor: "#D7D8DB"
strokeWidth: 3
capStyle: ShapePath.RoundCap
@@ -8,7 +8,6 @@ import "../Controls2/TextTypes"
import SortFilterProxyModel 0.2
import InstalledAppsModel 1.0
import Style 1.0
DrawerType2 {
id: root
@@ -134,7 +133,7 @@ DrawerType2 {
anchors.rightMargin: 16
anchors.leftMargin: 16
backgroundColor: AmneziaStyle.color.greyDark
backgroundColor: "#2C2D30"
textFieldPlaceholderText: qsTr("application name")
}
+5 -7
View File
@@ -2,8 +2,6 @@ import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
import Style 1.0
import "../Controls2"
import "../Controls2/TextTypes"
@@ -88,11 +86,11 @@ DrawerType2 {
Layout.rightMargin: 16
Layout.leftMargin: 16
defaultColor: AmneziaStyle.color.transparent
hoveredColor: AmneziaStyle.color.blackHovered
pressedColor: AmneziaStyle.color.blackPressed
disabledColor: AmneziaStyle.color.grey
textColor: AmneziaStyle.color.white
defaultColor: "transparent"
hoveredColor: Qt.rgba(1, 1, 1, 0.08)
pressedColor: Qt.rgba(1, 1, 1, 0.12)
disabledColor: "#878B91"
textColor: "#D7D8DB"
borderWidth: 1
text: noButtonText
@@ -2,8 +2,6 @@ import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
import Style 1.0
import "../Controls2"
import "../Controls2/TextTypes"
import "../Config"
@@ -147,8 +145,8 @@ DrawerType2 {
indicator: Rectangle {
width: parent.width - 1
height: parent.height
color: radioButton.hovered ? AmneziaStyle.color.greyDark : AmneziaStyle.color.blackLight
border.color: radioButton.focus ? AmneziaStyle.color.white : AmneziaStyle.color.transparent
color: radioButton.hovered ? "#2C2D30" : "#1C1D21"
border.color: radioButton.focus ? "#D7D8DB" : "transparent"
border.width: radioButton.focus ? 1 : 0
Behavior on color {
@@ -9,7 +9,6 @@ import SortFilterProxyModel 0.2
import PageEnum 1.0
import ContainerProps 1.0
import Style 1.0
import "./"
import "../Controls2"
@@ -112,11 +111,11 @@ DrawerType2 {
Layout.fillWidth: true
Layout.topMargin: 8
defaultColor: AmneziaStyle.color.transparent
hoveredColor: AmneziaStyle.color.blackHovered
pressedColor: AmneziaStyle.color.blackPressed
disabledColor: AmneziaStyle.color.grey
textColor: AmneziaStyle.color.white
defaultColor: "transparent"
hoveredColor: Qt.rgba(1, 1, 1, 0.08)
pressedColor: Qt.rgba(1, 1, 1, 0.12)
disabledColor: "#878B91"
textColor: "#D7D8DB"
borderWidth: 1
text: qsTr("Copy")
@@ -135,11 +134,11 @@ DrawerType2 {
visible: false
defaultColor: AmneziaStyle.color.transparent
hoveredColor: AmneziaStyle.color.blackHovered
pressedColor: AmneziaStyle.color.blackPressed
disabledColor: AmneziaStyle.color.grey
textColor: AmneziaStyle.color.white
defaultColor: "transparent"
hoveredColor: Qt.rgba(1, 1, 1, 0.08)
pressedColor: Qt.rgba(1, 1, 1, 0.12)
disabledColor: "#878B91"
textColor: "#D7D8DB"
borderWidth: 1
text: qsTr("Copy config string")
@@ -154,11 +153,11 @@ DrawerType2 {
Layout.fillWidth: true
Layout.topMargin: 24
defaultColor: AmneziaStyle.color.transparent
hoveredColor: AmneziaStyle.color.blackHovered
pressedColor: AmneziaStyle.color.blackPressed
disabledColor: AmneziaStyle.color.grey
textColor: AmneziaStyle.color.white
defaultColor: "transparent"
hoveredColor: Qt.rgba(1, 1, 1, 0.08)
pressedColor: Qt.rgba(1, 1, 1, 0.12)
disabledColor: "#878B91"
textColor: "#D7D8DB"
borderWidth: 1
text: qsTr("Show connection settings")
@@ -282,9 +281,9 @@ DrawerType2 {
readOnly: true
activeFocusOnTab: false
color: AmneziaStyle.color.white
selectionColor: AmneziaStyle.color.brown
selectedTextColor: AmneziaStyle.color.white
color: "#D7D8DB"
selectionColor: "#633303"
selectedTextColor: "#D7D8DB"
font.pixelSize: 16
font.weight: Font.Medium
@@ -295,7 +294,7 @@ DrawerType2 {
wrapMode: Text.Wrap
background: Rectangle {
color: AmneziaStyle.color.transparent
color: "transparent"
}
}
}
@@ -2,8 +2,6 @@ import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
import Style 1.0
import "../Controls2"
import "../Controls2/TextTypes"
@@ -16,7 +14,7 @@ Rectangle {
implicitWidth: transportProtoButtonGroup.implicitWidth
implicitHeight: transportProtoButtonGroup.implicitHeight
color: AmneziaStyle.color.blackLight
color: "#1C1D21"
radius: 16
onFocusChanged: {
+2 -4
View File
@@ -2,8 +2,6 @@ import QtQuick
import QtQuick.Layouts
import Qt5Compat.GraphicalEffects
import Style 1.0
Item {
id: root
@@ -30,7 +28,7 @@ Item {
ImageButtonType {
id: backButton
image: backButtonImage
imageColor: AmneziaStyle.color.white
imageColor: "#D7D8DB"
implicitWidth: 40
implicitHeight: 40
@@ -48,7 +46,7 @@ Item {
id: background
Layout.fillWidth: true
color: AmneziaStyle.color.transparent
color: "transparent"
}
}
+9 -11
View File
@@ -3,22 +3,20 @@ import QtQuick.Controls
import QtQuick.Layouts
import Qt5Compat.GraphicalEffects
import Style 1.0
import "TextTypes"
Button {
id: root
property string hoveredColor: AmneziaStyle.color.whiteHovered
property string defaultColor: AmneziaStyle.color.white
property string disabledColor: AmneziaStyle.color.greyDisabled
property string pressedColor: AmneziaStyle.color.grey
property string hoveredColor: "#C1C2C5"
property string defaultColor: "#D7D8DB"
property string disabledColor: "#494B50"
property string pressedColor: "#979799"
property string textColor: AmneziaStyle.color.black
property string textColor: "#0E0E11"
property string borderColor: AmneziaStyle.color.white
property string borderFocusedColor: AmneziaStyle.color.white
property string borderColor: "#D7D8DB"
property string borderFocusedColor: "#D7D8DB"
property int borderWidth: 0
property int borderFocusedWidth: 1
@@ -48,8 +46,8 @@ Button {
background: Rectangle {
id: focusBorder
color: AmneziaStyle.color.transparent
border.color: root.activeFocus ? root.borderFocusedColor : AmneziaStyle.color.transparent
color: "transparent"
border.color: root.activeFocus ? root.borderFocusedColor : "transparent"
border.width: root.activeFocus ? root.borderFocusedWidth : 0
anchors.fill: parent
@@ -2,8 +2,6 @@ import QtQuick
import QtQuick.Controls
import QtQuick.Shapes
import Style 1.0
Popup {
id: root
anchors.centerIn: parent
@@ -18,7 +16,7 @@ Popup {
}
background: Rectangle {
color: AmneziaStyle.color.transparent
color: "transparent"
}
BusyIndicator {
@@ -42,8 +40,8 @@ Popup {
layer.samples: 4
ShapePath {
fillColor: AmneziaStyle.color.transparent
strokeColor: AmneziaStyle.color.greyDisabled
fillColor: "transparent"
strokeColor: "#787878"
strokeWidth: 3
capStyle: ShapePath.RoundCap
+11 -13
View File
@@ -2,8 +2,6 @@ import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
import Style 1.0
RadioButton {
id: root
@@ -11,17 +9,17 @@ RadioButton {
property string bodyText
property string footerText
property string hoveredColor: AmneziaStyle.color.blackHovered
property string defaultColor: AmneziaStyle.color.transparent
property string disabledColor: AmneziaStyle.color.transparent
property string pressedColor: AmneziaStyle.color.blackPressed
property string selectedColor: AmneziaStyle.color.transparent
property string hoveredColor: Qt.rgba(1, 1, 1, 0.05)
property string defaultColor: Qt.rgba(1, 1, 1, 0)
property string disabledColor: Qt.rgba(1, 1, 1, 0)
property string pressedColor: Qt.rgba(1, 1, 1, 0.05)
property string selectedColor: Qt.rgba(1, 1, 1, 0)
property string textColor: AmneziaStyle.color.black
property string textColor: "#0E0E11"
property string pressedBorderColor: Qt.rgba(251/255, 178/255, 106/255, 0.3)
property string selectedBorderColor: AmneziaStyle.color.orange
property string defaultBodredColor: AmneziaStyle.color.transparent
property string selectedBorderColor: "#FBB26A"
property string defaultBodredColor: "transparent"
property int borderWidth: 0
implicitWidth: content.implicitWidth
@@ -84,7 +82,7 @@ RadioButton {
Text {
text: root.headerText
wrapMode: Text.WordWrap
color: AmneziaStyle.color.white
color: "#D7D8DB"
font.pixelSize: 25
font.weight: 700
font.family: "PT Root UI VF"
@@ -99,7 +97,7 @@ RadioButton {
Text {
text: root.bodyText
wrapMode: Text.WordWrap
color: AmneziaStyle.color.white
color: "#D7D8DB"
font.pixelSize: 16
font.weight: 400
font.family: "PT Root UI VF"
@@ -115,7 +113,7 @@ RadioButton {
text: root.footerText
wrapMode: Text.WordWrap
visible: root.footerText !== ""
color: AmneziaStyle.color.grey
color: "#878B91"
font.pixelSize: 13
font.weight: 400
font.family: "PT Root UI VF"
+18 -20
View File
@@ -3,34 +3,32 @@ import QtQuick.Controls
import QtQuick.Layouts
import Qt5Compat.GraphicalEffects
import Style 1.0
import "TextTypes"
CheckBox {
id: root
property string descriptionText
property string descriptionTextColor: AmneziaStyle.color.grey
property string descriptionTextDisabledColor: AmneziaStyle.color.greyDisabled
property string descriptionTextColor: "#878B91"
property string descriptionTextDisabledColor: "#494B50"
property string textColor: AmneziaStyle.color.white
property string textDisabledColor: AmneziaStyle.color.grey
property string textColor: "#D7D8DB"
property string textDisabledColor: "#878B91"
property string hoveredColor: AmneziaStyle.color.blackHovered
property string defaultColor: AmneziaStyle.color.transparent
property string pressedColor: AmneziaStyle.color.blackPressed
property string hoveredColor: Qt.rgba(1, 1, 1, 0.05)
property string defaultColor: "transparent"
property string pressedColor: Qt.rgba(1, 1, 1, 0.05)
property string defaultBorderColor: AmneziaStyle.color.white
property string checkedBorderColor: AmneziaStyle.color.orange
property string checkedBorderDisabledColor: AmneziaStyle.color.brownDark
property string defaultBorderColor: "#D7D8DB"
property string checkedBorderColor: "#FBB26A"
property string checkedBorderDisabledColor: "#402102"
property string borderFocusedColor: AmneziaStyle.color.white
property string borderFocusedColor: "#D7D8DB"
property string checkedImageColor: AmneziaStyle.color.orange
property string pressedImageColor: AmneziaStyle.color.orangeDark
property string defaultImageColor: AmneziaStyle.color.transparent
property string checkedDisabledImageColor: AmneziaStyle.color.brownLight
property string checkedImageColor: "#FBB26A"
property string pressedImageColor: "#A85809"
property string defaultImageColor: "transparent"
property string checkedDisabledImageColor: "#84603D"
property string imageSource: "qrc:/images/controls/check.svg"
@@ -47,8 +45,8 @@ CheckBox {
focusPolicy: Qt.NoFocus
background: Rectangle {
color: AmneziaStyle.color.transparent
border.color: root.focus ? borderFocusedColor : AmneziaStyle.color.transparent
color: "transparent"
border.color: root.focus ? borderFocusedColor : "transparent"
border.width: 1
radius: 16
}
@@ -79,7 +77,7 @@ CheckBox {
anchors.centerIn: parent
width: 24
height: 24
color: AmneziaStyle.color.transparent
color: "transparent"
border.color: root.checked ?
(root.enabled ?
checkedBorderColor :
+1 -3
View File
@@ -1,8 +1,6 @@
import QtQuick
import QtQuick.Layouts
import Style 1.0
Rectangle {
Layout.fillWidth: true
@@ -10,5 +8,5 @@ Rectangle {
Layout.rightMargin: 16
height: 1
color: AmneziaStyle.color.greyDark
color: "#2C2D30"
}
+3 -5
View File
@@ -2,8 +2,6 @@ import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
import Style 1.0
import "TextTypes"
Item {
@@ -21,8 +19,8 @@ Item {
property Component collapsedContent
property Component expandedContent
property string defaultColor: AmneziaStyle.color.blackLight
property string borderColor: AmneziaStyle.color.greyDark
property string defaultColor: "#1C1D21"
property string borderColor: "#2C2D30"
property real expandedHeight
property real collapsedHeight: 0
@@ -92,7 +90,7 @@ Item {
id: background
anchors.fill: parent
color: root.isCollapsed ? AmneziaStyle.color.transparent : Qt.rgba(14/255, 14/255, 17/255, 0.8)
color: root.isCollapsed ? "transparent" : Qt.rgba(14/255, 14/255, 17/255, 0.8)
Behavior on color {
PropertyAnimation { duration: 200 }
+15 -17
View File
@@ -2,8 +2,6 @@ import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
import Style 1.0
import "TextTypes"
import "../Config"
@@ -11,31 +9,31 @@ Item {
id: root
property string text
property string textColor: AmneziaStyle.color.white
property string textDisabledColor: AmneziaStyle.color.grey
property string textColor: "#d7d8db"
property string textDisabledColor: "#878B91"
property int textMaximumLineCount: 2
property int textElide: Qt.ElideRight
property string descriptionText
property string descriptionTextColor: AmneziaStyle.color.grey
property string descriptionTextDisabledColor: AmneziaStyle.color.greyDisabled
property string descriptionTextColor: "#878B91"
property string descriptionTextDisabledColor: "#494B50"
property string headerText
property string headerBackButtonImage
property var rootButtonClickedFunction
property string rootButtonImage: "qrc:/images/controls/chevron-down.svg"
property string rootButtonImageColor: AmneziaStyle.color.white
property string rootButtonBackgroundColor: AmneziaStyle.color.blackLight
property string rootButtonBackgroundHoveredColor: AmneziaStyle.color.blackLight
property string rootButtonBackgroundPressedColor: AmneziaStyle.color.blackLight
property string rootButtonImageColor: "#D7D8DB"
property string rootButtonBackgroundColor: "#1C1D21"
property string rootButtonBackgroundHoveredColor: "#1C1D21"
property string rootButtonBackgroundPressedColor: "#1C1D21"
property string borderFocusedColor: AmneziaStyle.color.white
property string borderFocusedColor: "#D7D8DB"
property int borderFocusedWidth: 1
property string rootButtonHoveredBorderColor: AmneziaStyle.color.greyDisabled
property string rootButtonDefaultBorderColor: AmneziaStyle.color.greyDark
property string rootButtonPressedBorderColor: AmneziaStyle.color.white
property string rootButtonHoveredBorderColor: "#494B50"
property string rootButtonDefaultBorderColor: "#2C2D30"
property string rootButtonPressedBorderColor: "#D7D8DB"
property int rootButtonTextLeftMargins: 16
property int rootButtonTextTopMargin: 16
@@ -77,8 +75,8 @@ Item {
Rectangle {
id: focusBorder
color: AmneziaStyle.color.transparent
border.color: root.activeFocus ? root.borderFocusedColor : AmneziaStyle.color.transparent
color: "transparent"
border.color: root.activeFocus ? root.borderFocusedColor : "transparent"
border.width: root.activeFocus ? root.borderFocusedWidth : 0
anchors.fill: rootButtonContent
radius: 16
@@ -98,7 +96,7 @@ Item {
}
return root.hovered ? root.rootButtonBackgroundHoveredColor : root.rootButtonBackgroundColor
} else {
return AmneziaStyle.color.transparent
return "transparent"
}
}
+2 -4
View File
@@ -1,8 +1,6 @@
import QtQuick
import QtQuick.Layouts
import Style 1.0
import "TextTypes"
Item {
@@ -39,7 +37,7 @@ Item {
implicitHeight: 40
image: root.actionButtonImage
imageColor: AmneziaStyle.color.white
imageColor: "#D7D8DB"
visible: image ? true : false
@@ -59,7 +57,7 @@ Item {
text: root.descriptionText
color: AmneziaStyle.color.grey
color: "#878B91"
visible: root.descriptionText !== ""
}
+2 -4
View File
@@ -1,8 +1,6 @@
import QtQuick
import QtQuick.Layouts
import Style 1.0
import "TextTypes"
Item {
@@ -48,7 +46,7 @@ Item {
Layout.alignment: Qt.AlignRight
image: root.actionButtonImage
imageColor: AmneziaStyle.color.white
imageColor: "#D7D8DB"
visible: image ? true : false
@@ -68,7 +66,7 @@ Item {
text: root.descriptionText
color: AmneziaStyle.color.grey
color: "#878B91"
visible: root.descriptionText !== ""
}
@@ -2,26 +2,24 @@ import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
import Style 1.0
import "TextTypes"
RadioButton {
id: root
property string hoveredColor: AmneziaStyle.color.blackHovered
property string defaultColor: AmneziaStyle.color.transparent
property string checkedColor: AmneziaStyle.color.transparent
property string disabledColor: AmneziaStyle.color.transparent
property string hoveredColor: Qt.rgba(1, 1, 1, 0.05)
property string defaultColor: Qt.rgba(1, 1, 1, 0)
property string checkedColor: Qt.rgba(1, 1, 1, 0)
property string disabledColor: "transparent"
property string textColor: AmneziaStyle.color.white
property string textDisabledColor: AmneziaStyle.color.grey
property string textColor: "#D7D8DB"
property string textDisabledColor: "#878B91"
property string pressedBorderColor: AmneziaStyle.color.greyDisabled
property string checkedBorderColor: AmneziaStyle.color.orange
property string defaultBodredColor: AmneziaStyle.color.transparent
property string checkedDisabledBorderColor: AmneziaStyle.color.brownLight
property string borderFocusedColor: AmneziaStyle.color.white
property string pressedBorderColor: "#494B50"
property string checkedBorderColor: "#FBB26A"
property string defaultBodredColor: "transparent"
property string checkedDisabledBorderColor: "#84603D"
property string borderFocusedColor: "#D7D8DB"
property int borderWidth: 0
implicitWidth: content.implicitWidth
+8 -10
View File
@@ -2,25 +2,23 @@ import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
import Style 1.0
Button {
id: root
property string image
property string hoveredColor: AmneziaStyle.color.blackHovered
property string defaultColor: AmneziaStyle.color.transparent
property string pressedColor: AmneziaStyle.color.blackPressed
property string disableColor: AmneziaStyle.color.greyDark
property string hoveredColor: Qt.rgba(1, 1, 1, 0.08)
property string defaultColor: "transparent"
property string pressedColor: Qt.rgba(1, 1, 1, 0.12)
property string disableColor: "#2C2D30"
property string imageColor: AmneziaStyle.color.grey
property string disableImageColor: AmneziaStyle.color.greyDark
property string imageColor: "#878B91"
property string disableImageColor: "#2C2D30"
property alias backgroundColor: background.color
property alias backgroundRadius: background.radius
property string borderFocusedColor: AmneziaStyle.color.white
property string borderFocusedColor: "#D7D8DB"
property int borderFocusedWidth: 1
hoverEnabled: true
@@ -48,7 +46,7 @@ Button {
id: background
anchors.fill: parent
border.color: root.activeFocus ? root.borderFocusedColor : AmneziaStyle.color.transparent
border.color: root.activeFocus ? root.borderFocusedColor : "transparent"
border.width: root.activeFocus ? root.borderFocusedWidth : 0
color: {
+11 -13
View File
@@ -2,8 +2,6 @@ import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
import Style 1.0
import "TextTypes"
Item {
@@ -26,16 +24,16 @@ Item {
property alias eyeButton: eyeImage
property FlickableType parentFlickable
property string textColor: AmneziaStyle.color.white
property string textDisabledColor: AmneziaStyle.color.grey
property string descriptionColor: AmneziaStyle.color.grey
property string descriptionDisabledColor: AmneziaStyle.color.greyDisabled
property string textColor: "#d7d8db"
property string textDisabledColor: "#878B91"
property string descriptionColor: "#878B91"
property string descriptionDisabledColor: "#494B50"
property real textOpacity: 1.0
property string borderFocusedColor: AmneziaStyle.color.white
property string borderFocusedColor: "#D7D8DB"
property int borderFocusedWidth: 1
property string rightImageColor: AmneziaStyle.color.white
property string rightImageColor: "#d7d8db"
property bool descriptionOnTop: false
property bool hideDescription: true
@@ -119,7 +117,7 @@ Item {
Layout.rightMargin: rightImageSource || !isLeftImageHoverEnabled ? 16 : 0
radius: 12
color: AmneziaStyle.color.transparent
color: "transparent"
Behavior on color {
PropertyAnimation { duration: 200 }
@@ -222,7 +220,7 @@ Item {
id: eyeImageBackground
anchors.fill: parent
radius: 12
color: AmneziaStyle.color.transparent
color: "transparent"
Behavior on color {
PropertyAnimation { duration: 200 }
@@ -259,7 +257,7 @@ Item {
id: rightImageBackground
anchors.fill: parent
radius: 12
color: AmneziaStyle.color.transparent
color: "transparent"
Behavior on color {
PropertyAnimation { duration: 200 }
@@ -276,9 +274,9 @@ Item {
Rectangle {
id: background
anchors.fill: root
color: AmneziaStyle.color.transparent
color: "transparent"
border.color: root.activeFocus ? root.borderFocusedColor : AmneziaStyle.color.transparent
border.color: root.activeFocus ? root.borderFocusedColor : "transparent"
border.width: root.activeFocus ? root.borderFocusedWidth : 0
@@ -2,8 +2,6 @@ import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
import Style 1.0
import "TextTypes"
ListView {
@@ -105,8 +103,8 @@ ListView {
indicator: Rectangle {
width: parent.width - 1
height: parent.height
color: radioButton.hovered ? AmneziaStyle.color.greyDark : AmneziaStyle.color.blackLight
border.color: radioButton.focus ? AmneziaStyle.color.white : AmneziaStyle.color.transparent
color: radioButton.hovered ? "#2C2D30" : "#1C1D21"
border.color: radioButton.focus ? "#D7D8DB" : "transparent"
border.width: radioButton.focus ? 1 : 0
Behavior on color {
+4 -6
View File
@@ -2,8 +2,6 @@ import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
import Style 1.0
import "TextTypes"
Popup {
@@ -84,11 +82,11 @@ Popup {
implicitHeight: 32
defaultColor: "white"
hoveredColor: AmneziaStyle.color.whiteHovered
pressedColor: AmneziaStyle.color.whiteHovered
disabledColor: AmneziaStyle.color.greyDisabled
hoveredColor: "#C1C2C5"
pressedColor: "#AEB0B7"
disabledColor: "#494B50"
textColor: AmneziaStyle.color.black
textColor: "#0E0E11"
borderWidth: 0
text: qsTr("Close")
+2 -4
View File
@@ -2,22 +2,20 @@ import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
import Style 1.0
ProgressBar {
id: root
implicitHeight: 4
background: Rectangle {
color: AmneziaStyle.color.brown
color: "#633303"
}
contentItem: Item {
Rectangle {
width: root.visualPosition * parent.width
height: parent.height
color: AmneziaStyle.color.orange
color: "#FBB26A"
}
}
}
+17 -19
View File
@@ -2,38 +2,36 @@ import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
import Style 1.0
import "TextTypes"
Switch {
id: root
property alias descriptionText: description.text
property string descriptionTextColor: AmneziaStyle.color.grey
property string descriptionTextDisabledColor: AmneziaStyle.color.greyDisabled
property string descriptionTextColor: "#878B91"
property string descriptionTextDisabledColor: "#494B50"
property string textColor: AmneziaStyle.color.white
property string textDisabledColor: AmneziaStyle.color.grey
property string textColor: "#D7D8DB"
property string textDisabledColor: "#878B91"
property string checkedIndicatorColor: AmneziaStyle.color.brown
property string defaultIndicatorColor: AmneziaStyle.color.transparent
property string checkedDisabledIndicatorColor: AmneziaStyle.color.brownDark
property string checkedIndicatorColor: "#633303"
property string defaultIndicatorColor: "transparent"
property string checkedDisabledIndicatorColor: "#402102"
property string borderFocusedColor: AmneziaStyle.color.white
property string borderFocusedColor: "#D7D8DB"
property int borderFocusedWidth: 1
property string checkedIndicatorBorderColor: AmneziaStyle.color.brown
property string defaultIndicatorBorderColor: AmneziaStyle.color.greyDisabled
property string checkedDisabledIndicatorBorderColor: AmneziaStyle.color.brownDark
property string checkedIndicatorBorderColor: "#633303"
property string defaultIndicatorBorderColor: "#494B50"
property string checkedDisabledIndicatorBorderColor: "#402102"
property string checkedInnerCircleColor: AmneziaStyle.color.orange
property string defaultInnerCircleColor: AmneziaStyle.color.white
property string checkedDisabledInnerCircleColor: AmneziaStyle.color.brownLight
property string defaultDisabledInnerCircleColor: AmneziaStyle.color.greyDisabled
property string checkedInnerCircleColor: "#FBB26A"
property string defaultInnerCircleColor: "#D7D8DB"
property string checkedDisabledInnerCircleColor: "#84603D"
property string defaultDisabledInnerCircleColor: "#494B50"
property string hoveredIndicatorBackgroundColor: AmneziaStyle.color.blackHovered
property string defaultIndicatorBackgroundColor: AmneziaStyle.color.transparent
property string hoveredIndicatorBackgroundColor: Qt.rgba(1, 1, 1, 0.08)
property string defaultIndicatorBackgroundColor: "transparent"
hoverEnabled: enabled ? true : false
focusPolicy: Qt.TabFocus
+7 -9
View File
@@ -1,18 +1,16 @@
import QtQuick
import QtQuick.Controls
import Style 1.0
TabButton {
id: root
property string hoveredColor: AmneziaStyle.color.brown
property string defaultColor: AmneziaStyle.color.greyDark
property string selectedColor: AmneziaStyle.color.orange
property string hoveredColor: "#633303"
property string defaultColor: "#2C2D30"
property string selectedColor: "#FBB26A"
property string textColor: AmneziaStyle.color.white
property string textColor: "#D7D8DB"
property string borderFocusedColor: AmneziaStyle.color.white
property string borderFocusedColor: "#D7D8DB"
property int borderFocusedWidth: 1
property bool isSelected: false
@@ -26,9 +24,9 @@ TabButton {
id: background
anchors.fill: parent
color: AmneziaStyle.color.transparent
color: "transparent"
border.color: root.activeFocus ? root.borderFocusedColor : AmneziaStyle.color.transparent
border.color: root.activeFocus ? root.borderFocusedColor : "transparent"
border.width: root.activeFocus ? root.borderFocusedWidth : 0
Rectangle {
@@ -1,20 +1,18 @@
import QtQuick
import QtQuick.Controls
import Style 1.0
TabButton {
id: root
property string hoveredColor: AmneziaStyle.color.brown
property string defaultColor: AmneziaStyle.color.white
property string selectedColor: AmneziaStyle.color.orange
property string hoveredColor: "#633303"
property string defaultColor: "#D7D8DB"
property string selectedColor: "#FBB26A"
property string image
property bool isSelected: false
property string borderFocusedColor: AmneziaStyle.color.white
property string borderFocusedColor: "#D7D8DB"
property int borderFocusedWidth: 1
property var clickedFunc
@@ -28,10 +26,10 @@ TabButton {
background: Rectangle {
id: background
anchors.fill: parent
color: AmneziaStyle.color.transparent
color: "transparent"
radius: 10
border.color: root.activeFocus ? root.borderFocusedColor : AmneziaStyle.color.transparent
border.color: root.activeFocus ? root.borderFocusedColor : "transparent"
border.width: root.activeFocus ? root.borderFocusedWidth : 0
}
+8 -10
View File
@@ -1,8 +1,6 @@
import QtQuick
import QtQuick.Controls
import Style 1.0
Rectangle {
id: root
@@ -11,12 +9,12 @@ Rectangle {
property alias textArea: textArea
property alias textAreaText: textArea.text
property string borderHoveredColor: AmneziaStyle.color.greyDisabled
property string borderNormalColor: AmneziaStyle.color.greyDark
property string borderFocusedColor: AmneziaStyle.color.white
property string borderHoveredColor: "#494B50"
property string borderNormalColor: "#2C2D30"
property string borderFocusedColor: "#d7d8db"
height: 148
color: AmneziaStyle.color.blackLight
color: "#1C1D21"
border.width: 1
border.color: getBorderColor(borderNormalColor)
radius: 16
@@ -54,10 +52,10 @@ Rectangle {
anchors.topMargin: 16
anchors.bottomMargin: 16
color: AmneziaStyle.color.white
selectionColor: AmneziaStyle.color.brown
selectedTextColor: AmneziaStyle.color.white
placeholderTextColor: AmneziaStyle.color.grey
color: "#D7D8DB"
selectionColor: "#633303"
selectedTextColor: "#D7D8DB"
placeholderTextColor: "#878B91"
font.pixelSize: 16
font.weight: Font.Medium
@@ -2,16 +2,14 @@ import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
import Style 1.0
import "TextTypes"
Item {
id: root
property string headerText
property string headerTextDisabledColor: AmneziaStyle.color.greyDisabled
property string headerTextColor: AmneziaStyle.color.grey
property string headerTextDisabledColor: "#494B50"
property string headerTextColor: "#878b91"
property alias errorText: errorField.text
property bool checkEmptyText: false
@@ -23,18 +21,18 @@ Item {
property alias textField: textField
property alias textFieldText: textField.text
property string textFieldTextColor: AmneziaStyle.color.white
property string textFieldTextDisabledColor: AmneziaStyle.color.grey
property string textFieldTextColor: "#d7d8db"
property string textFieldTextDisabledColor: "#878B91"
property string textFieldPlaceholderText
property bool textFieldEditable: true
property string borderColor: AmneziaStyle.color.greyDark
property string borderFocusedColor: AmneziaStyle.color.white
property string borderColor: "#2C2D30"
property string borderFocusedColor: "#d7d8db"
property string backgroundColor: AmneziaStyle.color.blackLight
property string backgroundDisabledColor: AmneziaStyle.color.transparent
property string bgBorderHoveredColor: AmneziaStyle.color.greyDisabled
property string backgroundColor: "#1c1d21"
property string backgroundDisabledColor: "transparent"
property string bgBorderHoveredColor: "#494B50"
implicitWidth: content.implicitWidth
implicitHeight: content.implicitHeight
@@ -92,10 +90,10 @@ Item {
inputMethodHints: Qt.ImhNoAutoUppercase | Qt.ImhSensitiveData | Qt.ImhNoPredictiveText
placeholderText: root.textFieldPlaceholderText
placeholderTextColor: AmneziaStyle.color.greyDisabled
placeholderTextColor: "#494B50"
selectionColor: AmneziaStyle.color.brown
selectedTextColor: AmneziaStyle.color.white
selectionColor: "#633303"
selectedTextColor: "#D7D8DB"
font.pixelSize: 16
font.weight: 400
@@ -149,7 +147,7 @@ Item {
text: root.errorText
visible: root.errorText !== ""
color: AmneziaStyle.color.red
color: "#EB5757"
}
}
@@ -1,12 +1,10 @@
import QtQuick
import Style 1.0
Text {
lineHeight: 24
lineHeightMode: Text.FixedHeight
color: AmneziaStyle.color.white
color: "#D7D8DB"
font.pixelSize: 16
font.weight: 600
font.family: "PT Root UI VF"
@@ -1,12 +1,10 @@
import QtQuick
import Style 1.0
Text {
lineHeight: 16 + LanguageModel.getLineHeightAppend()
lineHeightMode: Text.FixedHeight
color: AmneziaStyle.color.black
color: "#0E0E11"
font.pixelSize: 13
font.weight: 400
font.family: "PT Root UI VF"
@@ -1,12 +1,10 @@
import QtQuick
import Style 1.0
Text {
lineHeight: 38 + LanguageModel.getLineHeightAppend()
lineHeightMode: Text.FixedHeight
color: AmneziaStyle.color.white
color: "#D7D8DB"
font.pixelSize: 36
font.weight: 700
font.family: "PT Root UI VF"
@@ -1,12 +1,10 @@
import QtQuick
import Style 1.0
Text {
lineHeight: 30 + LanguageModel.getLineHeightAppend()
lineHeightMode: Text.FixedHeight
color: AmneziaStyle.color.white
color: "#D7D8DB"
font.pixelSize: 25
font.weight: 700
font.family: "PT Root UI VF"
@@ -1,12 +1,10 @@
import QtQuick
import Style 1.0
Text {
lineHeight: 16 + LanguageModel.getLineHeightAppend()
lineHeightMode: Text.FixedHeight
color: AmneziaStyle.color.grey
color: "#878B91"
font.pixelSize: 13
font.weight: 400
font.family: "PT Root UI VF"
@@ -1,12 +1,10 @@
import QtQuick
import Style 1.0
Text {
lineHeight: 21.6 + LanguageModel.getLineHeightAppend()
lineHeightMode: Text.FixedHeight
color: AmneziaStyle.color.white
color: "#D7D8DB"
font.pixelSize: 18
font.weight: 400
font.family: "PT Root UI VF"
@@ -1,11 +1,10 @@
import QtQuick
import Style 1.0
Text {
lineHeight: 24 + LanguageModel.getLineHeightAppend()
lineHeightMode: Text.FixedHeight
color: AmneziaStyle.color.white
color: "#D7D8DB"
font.pixelSize: 16
font.weight: 400
font.family: "PT Root UI VF"
@@ -1,12 +1,10 @@
import QtQuick
import Style 1.0
Text {
lineHeight: 20 + LanguageModel.getLineHeightAppend()
lineHeightMode: Text.FixedHeight
color: AmneziaStyle.color.white
color: "#D7D8DB"
font.pixelSize: 14
font.weight: 400
font.family: "PT Root UI VF"
@@ -18,14 +18,14 @@ Popup {
}
background: Rectangle {
color: AmneziaStyle.color.transparent
color: "transparent"
}
ImageButtonType {
id: button
image: "qrc:/images/svg/close_black_24dp.svg"
imageColor: AmneziaStyle.color.white
imageColor: "#D7D8DB"
implicitWidth: 40
implicitHeight: 40
@@ -3,8 +3,6 @@ import QtQuick.Controls
import QtQuick.Layouts
import Qt5Compat.GraphicalEffects
import Style 1.0
import "TextTypes"
RadioButton {
@@ -14,15 +12,15 @@ RadioButton {
property int textElide: Qt.ElideRight
property string descriptionText
property string hoveredColor: AmneziaStyle.color.blackHovered
property string defaultColor: AmneziaStyle.color.transparent
property string disabledColor: AmneziaStyle.color.transparent
property string selectedColor: AmneziaStyle.color.transparent
property string hoveredColor: Qt.rgba(1, 1, 1, 0.05)
property string defaultColor: Qt.rgba(1, 1, 1, 0)
property string disabledColor: Qt.rgba(1, 1, 1, 0)
property string selectedColor: Qt.rgba(1, 1, 1, 0)
property string textColor: AmneziaStyle.color.white
property string selectedTextColor: AmneziaStyle.color.orange
property string textColor: "#D7D8DB"
property string selectedTextColor: "#FBB26A"
property string borderFocusedColor: AmneziaStyle.color.white
property string borderFocusedColor: "#D7D8DB"
property int borderFocusedWidth: 1
property string imageSource
@@ -36,7 +34,7 @@ RadioButton {
anchors.verticalCenter: parent.verticalCenter
border.color: root.focus ? root.borderFocusedColor : AmneziaStyle.color.transparent
border.color: root.focus ? root.borderFocusedColor : "transparent"
border.width: root.focus ? root.borderFocusedWidth : 0
implicitWidth: 56
@@ -139,7 +137,7 @@ RadioButton {
CaptionTextType {
id: description
color: AmneziaStyle.color.grey
color: "#878B91"
text: root.descriptionText
visible: root.descriptionText !== ""
+3 -5
View File
@@ -3,16 +3,14 @@ import QtQuick.Controls
import QtQuick.Layouts
import Qt5Compat.GraphicalEffects
import Style 1.0
import "TextTypes"
Rectangle {
id: root
property string textColor: AmneziaStyle.color.white
property string backGroundColor: AmneziaStyle.color.blackLight
property string imageColor: AmneziaStyle.color.white
property string textColor: "#D7D8DB"
property string backGroundColor: "#1C1D21"
property string imageColor: "#D7D8DB"
property string textString
property int textFormat: Text.PlainText
@@ -1,26 +0,0 @@
pragma Singleton
import QtQuick
QtObject {
property QtObject color: QtObject {
readonly property color transparent: 'transparent'
readonly property color white: '#D7D8DB'
readonly property color whiteHovered: '#C1C2C5'
readonly property color grey: '#878B91'
readonly property color greyDisabled: '#494B50'
readonly property color greyDark: '#2C2D30'
readonly property color blackLight: '#1C1D21'
readonly property color blackHovered: '#01010114'
readonly property color blackPressed: '#0101011f'
readonly property color black: '#0E0E11'
readonly property color orange: '#FBB26A'
readonly property color orangeDark: '#A85809'
readonly property color brownLight: '#84603D'
readonly property color brown: '#633303'
readonly property color brownDark: '#402102'
readonly property color red: '#EB5757'
readonly property color connectionInProgress: '#261E1A'
}
}
-3
View File
@@ -1,3 +0,0 @@
module Style
singleton AmneziaStyle 1.0 AmneziaStyle.qml
+18 -19
View File
@@ -8,7 +8,6 @@ import PageEnum 1.0
import ProtocolEnum 1.0
import ContainerProps 1.0
import ContainersModelFilters 1.0
import Style 1.0
import "./"
import "../Controls2"
@@ -56,11 +55,11 @@ PageType {
implicitHeight: 36
defaultColor: AmneziaStyle.color.transparent
hoveredColor: AmneziaStyle.color.blackHovered
pressedColor: AmneziaStyle.color.blackPressed
disabledColor: AmneziaStyle.color.grey
textColor: AmneziaStyle.color.grey
defaultColor: "transparent"
hoveredColor: Qt.rgba(1, 1, 1, 0.08)
pressedColor: Qt.rgba(1, 1, 1, 0.12)
disabledColor: "#878B91"
textColor: "#878B91"
borderWidth: 0
visible: isLoggingEnabled ? true : false
@@ -92,12 +91,12 @@ PageType {
implicitHeight: 36
defaultColor: AmneziaStyle.color.transparent
hoveredColor: AmneziaStyle.color.blackHovered
pressedColor: AmneziaStyle.color.blackPressed
disabledColor: AmneziaStyle.color.grey
textColor: AmneziaStyle.color.grey
leftImageColor: AmneziaStyle.color.transparent
defaultColor: "transparent"
hoveredColor: Qt.rgba(1, 1, 1, 0.08)
pressedColor: Qt.rgba(1, 1, 1, 0.12)
disabledColor: "#878B91"
textColor: "#878B91"
leftImageColor: "transparent"
borderWidth: 0
property bool isSplitTunnelingEnabled: SitesModel.isTunnelingEnabled || AppSplitTunnelingModel.isTunnelingEnabled ||
@@ -238,7 +237,7 @@ PageType {
hoverEnabled: false
image: "qrc:/images/controls/chevron-down.svg"
imageColor: AmneziaStyle.color.white
imageColor: "#d7d8db"
icon.width: 18
icon.height: 18
@@ -299,17 +298,17 @@ PageType {
DropDownType {
id: containersDropDown
rootButtonImageColor: AmneziaStyle.color.black
rootButtonBackgroundColor: AmneziaStyle.color.white
rootButtonImageColor: "#0E0E11"
rootButtonBackgroundColor: "#D7D8DB"
rootButtonBackgroundHoveredColor: Qt.rgba(215, 216, 219, 0.8)
rootButtonBackgroundPressedColor: Qt.rgba(215, 216, 219, 0.65)
rootButtonHoveredBorderColor: AmneziaStyle.color.transparent
rootButtonDefaultBorderColor: AmneziaStyle.color.transparent
rootButtonHoveredBorderColor: "transparent"
rootButtonDefaultBorderColor: "transparent"
rootButtonTextTopMargin: 8
rootButtonTextBottomMargin: 8
text: ServersModel.defaultServerDefaultContainerName
textColor: AmneziaStyle.color.black
textColor: "#0E0E11"
headerText: qsTr("VPN protocol")
headerBackButtonImage: "qrc:/images/controls/arrow-left.svg"
@@ -500,7 +499,7 @@ PageType {
ImageButtonType {
id: serverInfoButton
image: "qrc:/images/controls/settings.svg"
imageColor: AmneziaStyle.color.white
imageColor: "#D7D8DB"
implicitWidth: 56
implicitHeight: 56
@@ -6,7 +6,6 @@ import SortFilterProxyModel 0.2
import PageEnum 1.0
import ContainerEnum 1.0
import Style 1.0
import "./"
import "../Controls2"
@@ -295,7 +294,7 @@ PageType {
Layout.fillWidth: true
Layout.topMargin: 32
Layout.preferredHeight: checkboxLayout.implicitHeight
color: AmneziaStyle.color.blackLight
color: "#1C1D21"
radius: 16
Connections {
+5 -6
View File
@@ -8,7 +8,6 @@ import PageEnum 1.0
import ProtocolEnum 1.0
import ContainerEnum 1.0
import ContainerProps 1.0
import Style 1.0
import "./"
import "../Controls2"
@@ -192,9 +191,9 @@ PageType {
leftPadding: 0
height: 24
color: AmneziaStyle.color.white
selectionColor: AmneziaStyle.color.brown
selectedTextColor: AmneziaStyle.color.white
color: "#D7D8DB"
selectionColor: "#633303"
selectedTextColor: "#D7D8DB"
font.pixelSize: 16
font.weight: Font.Medium
@@ -205,7 +204,7 @@ PageType {
wrapMode: Text.Wrap
background: Rectangle {
color: AmneziaStyle.color.transparent
color: "transparent"
}
}
}
@@ -224,7 +223,7 @@ PageType {
visible: ServersModel.isProcessedServerHasWriteAccess()
text: qsTr("Remove ") + ContainersModel.getProcessedContainerName()
textColor: AmneziaStyle.color.red
textColor: "#EB5757"
Keys.onTabPressed: lastItemTabClicked(focusItem)
clickedFunction: function() {
@@ -92,7 +92,7 @@ PageType {
HeaderType {
Layout.fillWidth: true
headerText: qsTr("Shadowsocks settings")
headerText: qsTr("ShadowSocks settings")
}
TextFieldWithHeaderType {
@@ -5,7 +5,6 @@ import QtQuick.Layouts
import SortFilterProxyModel 0.2
import PageEnum 1.0
import Style 1.0
import "./"
import "../Controls2"
@@ -70,7 +69,7 @@ PageType {
width: parent.width
text: qsTr("Remove ") + ContainersModel.getProcessedContainerName()
textColor: AmneziaStyle.color.red
textColor: "#EB5757"
Keys.onTabPressed: root.lastItemTabClicked()
@@ -5,7 +5,6 @@ import QtQuick.Layouts
import SortFilterProxyModel 0.2
import PageEnum 1.0
import Style 1.0
import "./"
import "../Controls2"
@@ -115,7 +114,7 @@ PageType {
descriptionOnTop: true
rightImageSource: "qrc:/images/controls/copy.svg"
rightImageColor: AmneziaStyle.color.white
rightImageColor: "#D7D8DB"
clickedFunction: function() {
GC.copyToClipBoard(descriptionText)
@@ -139,7 +138,7 @@ PageType {
KeyNavigation.tab: usernameLabel.rightButton
rightImageSource: "qrc:/images/controls/copy.svg"
rightImageColor: AmneziaStyle.color.white
rightImageColor: "#D7D8DB"
clickedFunction: function() {
GC.copyToClipBoard(descriptionText)
@@ -163,7 +162,7 @@ PageType {
KeyNavigation.tab: passwordLabel.eyeButton
rightImageSource: "qrc:/images/controls/copy.svg"
rightImageColor: AmneziaStyle.color.white
rightImageColor: "#D7D8DB"
clickedFunction: function() {
GC.copyToClipBoard(descriptionText)
@@ -194,7 +193,7 @@ PageType {
}
rightImageSource: "qrc:/images/controls/copy.svg"
rightImageColor: AmneziaStyle.color.white
rightImageColor: "#D7D8DB"
buttonImageSource: hideDescription ? "qrc:/images/controls/eye.svg" : "qrc:/images/controls/eye-off.svg"
@@ -217,11 +216,11 @@ PageType {
Layout.leftMargin: 16
Layout.rightMargin: 16
defaultColor: AmneziaStyle.color.transparent
hoveredColor: AmneziaStyle.color.blackHovered
pressedColor: AmneziaStyle.color.blackPressed
disabledColor: AmneziaStyle.color.grey
textColor: AmneziaStyle.color.white
defaultColor: "transparent"
hoveredColor: Qt.rgba(1, 1, 1, 0.08)
pressedColor: Qt.rgba(1, 1, 1, 0.12)
disabledColor: "#878B91"
textColor: "#D7D8DB"
borderWidth: 1
parentFlickable: fl
@@ -281,11 +280,11 @@ PageType {
Layout.leftMargin: 8
implicitHeight: 32
defaultColor: AmneziaStyle.color.transparent
hoveredColor: AmneziaStyle.color.blackHovered
pressedColor: AmneziaStyle.color.blackPressed
disabledColor: AmneziaStyle.color.grey
textColor: AmneziaStyle.color.orange
defaultColor: "transparent"
hoveredColor: Qt.rgba(1, 1, 1, 0.08)
pressedColor: Qt.rgba(1, 1, 1, 0.12)
disabledColor: "#878B91"
textColor: "#FBB26A"
text: qsTr("Detailed instructions")
@@ -304,10 +303,10 @@ PageType {
Layout.leftMargin: 8
implicitHeight: 32
defaultColor: AmneziaStyle.color.transparent
hoveredColor: AmneziaStyle.color.blackHovered
pressedColor: AmneziaStyle.color.blackPressed
textColor: AmneziaStyle.color.red
defaultColor: "transparent"
hoveredColor: Qt.rgba(1, 1, 1, 0.08)
pressedColor: Qt.rgba(1, 1, 1, 0.12)
textColor: "#EB5757"
parentFlickable: fl
Keys.onTabPressed: lastItemTabClicked()
@@ -6,7 +6,6 @@ import SortFilterProxyModel 0.2
import PageEnum 1.0
import ContainerProps 1.0
import Style 1.0
import "./"
import "../Controls2"
@@ -83,10 +82,10 @@ PageType {
}
descriptionOnTop: true
textColor: AmneziaStyle.color.orange
textColor: "#FBB26A"
rightImageSource: "qrc:/images/controls/copy.svg"
rightImageColor: AmneziaStyle.color.white
rightImageColor: "#D7D8DB"
KeyNavigation.tab: removeButton
@@ -135,10 +134,10 @@ PageType {
Layout.leftMargin: 8
implicitHeight: 32
defaultColor: AmneziaStyle.color.transparent
hoveredColor: AmneziaStyle.color.blackHovered
pressedColor: AmneziaStyle.color.blackPressed
textColor: AmneziaStyle.color.red
defaultColor: "transparent"
hoveredColor: Qt.rgba(1, 1, 1, 0.08)
pressedColor: Qt.rgba(1, 1, 1, 0.12)
textColor: "#EB5757"
text: qsTr("Remove website")
+13 -14
View File
@@ -3,7 +3,6 @@ import QtQuick.Controls
import QtQuick.Layouts
import PageEnum 1.0
import Style 1.0
import "./"
import "../Controls2"
@@ -85,7 +84,7 @@ PageType {
font.pixelSize: 14
text: qsTr("Amnezia is a free and open-source application. You can support the developers if you like it.")
color: AmneziaStyle.color.white
color: "#CCCAC8"
}
ParagraphTextType {
@@ -138,7 +137,7 @@ PageType {
id: githubButton
Layout.fillWidth: true
text: qsTr("GitHub")
text: qsTr("Github")
leftImageSource: "qrc:/images/controls/github.svg"
KeyNavigation.tab: websiteButton
@@ -177,7 +176,7 @@ PageType {
horizontalAlignment: Text.AlignHCenter
text: qsTr("Software version: %1").arg(SettingsController.getAppVersion())
color: AmneziaStyle.color.grey
color: "#878B91"
}
BasicButtonType {
@@ -187,11 +186,11 @@ PageType {
Layout.bottomMargin: 16
implicitHeight: 32
defaultColor: AmneziaStyle.color.transparent
hoveredColor: AmneziaStyle.color.blackHovered
pressedColor: AmneziaStyle.color.blackPressed
disabledColor: AmneziaStyle.color.grey
textColor: AmneziaStyle.color.orange
defaultColor: "transparent"
hoveredColor: Qt.rgba(1, 1, 1, 0.08)
pressedColor: Qt.rgba(1, 1, 1, 0.12)
disabledColor: "#878B91"
textColor: "#FBB26A"
text: qsTr("Check for updates")
@@ -210,11 +209,11 @@ PageType {
Layout.topMargin: -15
implicitHeight: 25
defaultColor: AmneziaStyle.color.transparent
hoveredColor: AmneziaStyle.color.blackHovered
pressedColor: AmneziaStyle.color.blackPressed
disabledColor: AmneziaStyle.color.grey
textColor: AmneziaStyle.color.orange
defaultColor: "transparent"
hoveredColor: Qt.rgba(1, 1, 1, 0.08)
pressedColor: Qt.rgba(1, 1, 1, 0.12)
disabledColor: "#878B91"
textColor: "#FBB26A"
text: qsTr("Privacy Policy")
@@ -10,7 +10,6 @@ import SortFilterProxyModel 0.2
import PageEnum 1.0
import ProtocolEnum 1.0
import ContainerProps 1.0
import Style 1.0
import "./"
import "../Controls2"
@@ -215,7 +214,7 @@ PageType {
text: appPath
rightImageSource: "qrc:/images/controls/trash.svg"
rightImageColor: AmneziaStyle.color.white
rightImageColor: "#D7D8DB"
clickedFunction: function() {
var headerText = qsTr("Remove ") + appPath + "?"
@@ -242,7 +241,7 @@ PageType {
Rectangle {
anchors.fill: addAppButton
anchors.bottomMargin: -24
color: AmneziaStyle.color.black
color: "#0E0E11"
opacity: 0.8
}
@@ -3,7 +3,6 @@ import QtQuick.Controls
import QtQuick.Layouts
import PageEnum 1.0
import Style 1.0
import "./"
import "../Controls2"
@@ -222,7 +221,7 @@ PageType {
text: qsTr("Reset settings and remove all data from the application")
rightImageSource: "qrc:/images/controls/chevron-right.svg"
textColor: AmneziaStyle.color.red
textColor: "#EB5757"
Keys.onTabPressed: lastItemTabClicked()
parentFlickable: fl
+5 -6
View File
@@ -6,7 +6,6 @@ import QtQuick.Dialogs
import QtCore
import PageEnum 1.0
import Style 1.0
import "./"
import "../Controls2"
@@ -121,11 +120,11 @@ PageType {
Layout.fillWidth: true
Layout.topMargin: -8
defaultColor: AmneziaStyle.color.transparent
hoveredColor: AmneziaStyle.color.blackHovered
pressedColor: AmneziaStyle.color.blackPressed
disabledColor: AmneziaStyle.color.grey
textColor: AmneziaStyle.color.white
defaultColor: "transparent"
hoveredColor: Qt.rgba(1, 1, 1, 0.08)
pressedColor: Qt.rgba(1, 1, 1, 0.12)
disabledColor: "#878B91"
textColor: "#D7D8DB"
borderWidth: 1
text: qsTr("Restore from backup")
+6 -7
View File
@@ -3,7 +3,6 @@ import QtQuick.Controls
import QtQuick.Layouts
import PageEnum 1.0
import Style 1.0
import "./"
import "../Controls2"
@@ -44,7 +43,7 @@ PageType {
Component.onCompleted: {
if (isServerFromApi) {
PageController.showNotificationMessage(qsTr("Default server does not support custom DNS"))
PageController.showNotificationMessage(qsTr("Default server does not support custom dns"))
}
}
@@ -102,11 +101,11 @@ PageType {
id: restoreDefaultButton
Layout.fillWidth: true
defaultColor: AmneziaStyle.color.transparent
hoveredColor: AmneziaStyle.color.blackHovered
pressedColor: AmneziaStyle.color.blackPressed
disabledColor: AmneziaStyle.color.grey
textColor: AmneziaStyle.color.white
defaultColor: "transparent"
hoveredColor: Qt.rgba(1, 1, 1, 0.08)
pressedColor: Qt.rgba(1, 1, 1, 0.12)
disabledColor: "#878B91"
textColor: "#D7D8DB"
borderWidth: 1
text: qsTr("Restore default")
+4 -5
View File
@@ -6,7 +6,6 @@ import QtQuick.Dialogs
import QtCore
import PageEnum 1.0
import Style 1.0
import "../Controls2"
import "../Config"
@@ -67,7 +66,7 @@ disabled after 14 days, and all log files will be deleted.")
Layout.fillWidth: true
headerText: qsTr("Logging")
descriptionText: qsTr("Enabling this function will save application's logs automatically. " +
descriptionText: qsTr("Enabling this function will save application's logs automatically, " +
"By default, logging functionality is disabled. Enable log saving in case of application malfunction.")
}
@@ -115,7 +114,7 @@ disabled after 14 days, and all log files will be deleted.")
Layout.fillWidth: true
text: qsTr("Open folder with logs")
color: AmneziaStyle.color.white
color: "#D7D8DB"
}
}
@@ -160,7 +159,7 @@ disabled after 14 days, and all log files will be deleted.")
Layout.fillWidth: true
text: qsTr("Save logs to file")
color: AmneziaStyle.color.white
color: "#D7D8DB"
}
}
@@ -209,7 +208,7 @@ disabled after 14 days, and all log files will be deleted.")
Layout.fillWidth: true
text: qsTr("Clear logs")
color: AmneziaStyle.color.white
color: "#D7D8DB"
}
}
}
@@ -6,7 +6,6 @@ import SortFilterProxyModel 0.2
import PageEnum 1.0
import ProtocolEnum 1.0
import Style 1.0
import "../Controls2"
import "../Controls2/TextTypes"
@@ -119,7 +118,7 @@ PageType {
Layout.fillWidth: true
text: qsTr("Reboot server")
textColor: AmneziaStyle.color.red
textColor: "#EB5757"
KeyNavigation.tab: labelWithButton3
@@ -160,7 +159,7 @@ PageType {
Layout.fillWidth: true
text: qsTr("Remove server from application")
textColor: AmneziaStyle.color.red
textColor: "#EB5757"
Keys.onTabPressed: {
if (content.isServerWithWriteAccess) {
@@ -208,7 +207,7 @@ PageType {
Layout.fillWidth: true
text: qsTr("Clear server from Amnezia software")
textColor: AmneziaStyle.color.red
textColor: "#EB5757"
Keys.onTabPressed: labelWithButton5.visible ?
labelWithButton5.forceActiveFocus() :
@@ -251,7 +250,7 @@ PageType {
Layout.fillWidth: true
text: qsTr("Reset API config")
textColor: AmneziaStyle.color.red
textColor: "#EB5757"
Keys.onTabPressed: root.lastItemTabClickedSignal()
@@ -8,7 +8,6 @@ import PageEnum 1.0
import ProtocolEnum 1.0
import ContainerProps 1.0
import ProtocolProps 1.0
import Style 1.0
import "./"
import "../Controls2"
@@ -176,7 +175,7 @@ PageType {
&& !ServersModel.getProcessedServerData("hasInstalledContainers")) ? 2 : 0
background: Rectangle {
color: AmneziaStyle.color.transparent
color: "transparent"
}
activeFocusOnTab: true
@@ -8,7 +8,6 @@ import PageEnum 1.0
import ProtocolEnum 1.0
import ContainerEnum 1.0
import ContainerProps 1.0
import Style 1.0
import "./"
import "../Controls2"
@@ -183,7 +182,7 @@ PageType {
Keys.onTabPressed: lastItemTabClicked(focusItem)
text: qsTr("Remove ") + ContainersModel.getProcessedContainerName()
textColor: AmneziaStyle.color.red
textColor: "#EB5757"
clickedFunction: function() {
var headerText = qsTr("Remove %1 from server?").arg(ContainersModel.getProcessedContainerName())
@@ -60,8 +60,7 @@ PageType {
id: proxyContainersModel
sourceModel: ContainersModel
sorters: [
RoleSorter { roleName: "isInstalled"; sortOrder: Qt.DescendingOrder },
RoleSorter { roleName: "installPageOrder"; sortOrder: Qt.AscendingOrder }
RoleSorter { roleName: "isInstalled"; sortOrder: Qt.DescendingOrder }
]
}
@@ -10,7 +10,6 @@ import SortFilterProxyModel 0.2
import PageEnum 1.0
import ProtocolEnum 1.0
import ContainerProps 1.0
import Style 1.0
import "./"
import "../Controls2"
@@ -266,7 +265,7 @@ PageType {
text: url
descriptionText: ip
rightImageSource: "qrc:/images/controls/trash.svg"
rightImageColor: AmneziaStyle.color.white
rightImageColor: "#D7D8DB"
clickedFunction: function() {
var headerText = qsTr("Remove ") + url + "?"
@@ -300,7 +299,7 @@ PageType {
Rectangle {
anchors.fill: addSiteButton
anchors.bottomMargin: -24
color: AmneziaStyle.color.black
color: "#0E0E11"
opacity: 0.8
}
@@ -341,7 +340,7 @@ PageType {
implicitHeight: 56
image: "qrc:/images/controls/more-vertical.svg"
imageColor: AmneziaStyle.color.white
imageColor: "#D7D8DB"
onClicked: function () {
moreActionsDrawer.open()
@@ -99,7 +99,7 @@ PageType {
Layout.fillWidth: true
visible: SettingsController.isCameraPresent()
text: qsTr("QR code")
text: qsTr("QR-code")
rightImageSource: "qrc:/images/controls/chevron-right.svg"
leftImageSource: "qrc:/images/controls/qr-code.svg"
+5 -6
View File
@@ -7,7 +7,6 @@ import SortFilterProxyModel 0.2
import PageEnum 1.0
import ContainerProps 1.0
import ProtocolProps 1.0
import Style 1.0
import "./"
import "../Controls2"
@@ -186,11 +185,11 @@ PageType {
anchors.topMargin: 8
anchors.bottomMargin: 24
defaultColor: AmneziaStyle.color.transparent
hoveredColor: AmneziaStyle.color.blackHovered
pressedColor: AmneziaStyle.color.blackPressed
disabledColor: AmneziaStyle.color.grey
textColor: AmneziaStyle.color.white
defaultColor: "transparent"
hoveredColor: Qt.rgba(1, 1, 1, 0.08)
pressedColor: Qt.rgba(1, 1, 1, 0.12)
disabledColor: "#878B91"
textColor: "#D7D8DB"
borderWidth: 1
Keys.onTabPressed: lastItemTabClicked(focusItem)
@@ -50,9 +50,6 @@ PageType {
if (stackView.currentItem.objectName === PageController.getPagePath(PageEnum.PageSetupWizardStart)) {
PageController.replaceStartPage()
}
if (stackView.currentItem.objectName !== PageController.getPagePath(PageEnum.PageHome)) {
PageController.goToPageHome()
}
PageController.showNotificationMessage(finishedMessage)
}
@@ -7,7 +7,6 @@ import SortFilterProxyModel 0.2
import PageEnum 1.0
import ContainerProps 1.0
import ProtocolProps 1.0
import Style 1.0
import "./"
import "../Controls2"
@@ -94,11 +93,11 @@ PageType {
implicitHeight: 32
defaultColor: AmneziaStyle.color.transparent
hoveredColor: AmneziaStyle.color.blackHovered
pressedColor: AmneziaStyle.color.blackPressed
disabledColor: AmneziaStyle.color.grey
textColor: AmneziaStyle.color.orange
defaultColor: "transparent"
hoveredColor: Qt.rgba(1, 1, 1, 0.08)
pressedColor: Qt.rgba(1, 1, 1, 0.12)
disabledColor: "#878B91"
textColor: "#FBB26A"
text: qsTr("More detailed")
KeyNavigation.tab: transportProtoSelector
@@ -195,7 +194,7 @@ PageType {
Rectangle {
Layout.fillHeight: true
color: AmneziaStyle.color.transparent
color: "transparent"
}
BasicButtonType {
@@ -248,7 +247,7 @@ PageType {
Rectangle {
Layout.fillHeight: true
color: AmneziaStyle.color.transparent
color: "transparent"
}
BasicButtonType {
@@ -262,8 +261,7 @@ PageType {
Keys.onTabPressed: lastItemTabClicked(focusItem)
clickedFunc: function() {
if (!port.textField.acceptableInput &&
ContainerProps.containerTypeToString(dockerContainer) !== "torwebsite") {
if (!port.textField.acceptableInput) {
port.errorText = qsTr("The port must be in the range of 1 to 65535")
return
}
@@ -34,10 +34,6 @@ PageType {
value: true
}
]
sorters: RoleSorter {
roleName: "installPageOrder"
sortOrder: Qt.AscendingOrder
}
}
ColumnLayout {

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