From 0b8f3c9d9dc714e99102e6f4c3d5e5245cd39fd3 Mon Sep 17 00:00:00 2001 From: Mykola Baibuz Date: Mon, 12 Feb 2024 21:01:44 +0200 Subject: [PATCH 01/36] Update Cloak binary to v2.8.0 --- client/3rd-prebuilt | 2 +- client/3rd/OpenVPNAdapter | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/client/3rd-prebuilt b/client/3rd-prebuilt index e568e7d0..f285f0a7 160000 --- a/client/3rd-prebuilt +++ b/client/3rd-prebuilt @@ -1 +1 @@ -Subproject commit e568e7d0e8defe8fe009c0127323f2c55fd9be76 +Subproject commit f285f0a7340179f4fb07b58091330de95ba9f96e diff --git a/client/3rd/OpenVPNAdapter b/client/3rd/OpenVPNAdapter index f95f0b2b..6f71d074 160000 --- a/client/3rd/OpenVPNAdapter +++ b/client/3rd/OpenVPNAdapter @@ -1 +1 @@ -Subproject commit f95f0b2b569be3954b93a6a9c649208cda40b879 +Subproject commit 6f71d0743d96b022863e2e4d6ebf7984842669ee From 4de9a274dd0d1fd6eb050a6b808d092007750533 Mon Sep 17 00:00:00 2001 From: Igor Sorokin Date: Mon, 12 Feb 2024 23:25:11 +0300 Subject: [PATCH 02/36] Update amneziawg-apple to amneziawg-go v0.2.1 --- client/3rd/amneziawg-apple | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/3rd/amneziawg-apple b/client/3rd/amneziawg-apple index f23eee47..0829e99e 160000 --- a/client/3rd/amneziawg-apple +++ b/client/3rd/amneziawg-apple @@ -1 +1 @@ -Subproject commit f23eee4700ed4a2ef44a800d2c20466c9ab0222b +Subproject commit 0829e99ea9f4508fd1d4742546b62145d17587bb From 2b413736a475d3cf9e97e6406a7eaed7bafa620d Mon Sep 17 00:00:00 2001 From: albexk Date: Mon, 12 Feb 2024 14:43:13 +0300 Subject: [PATCH 03/36] Build with new version of awg lib. Move GoBackend to org.amnezia.vpn.protocol.wireguard package. --- client/3rd-prebuilt | 2 +- .../kotlin/{com/wireguard/android/backend => }/GoBackend.kt | 4 +--- .../{org/amnezia/vpn/protocol/wireguard => }/Wireguard.kt | 1 - .../amnezia/vpn/protocol/wireguard => }/WireguardConfig.kt | 0 client/cmake/android.cmake | 6 +++--- 5 files changed, 5 insertions(+), 8 deletions(-) rename client/android/wireguard/src/main/kotlin/{com/wireguard/android/backend => }/GoBackend.kt (62%) rename client/android/wireguard/src/main/kotlin/{org/amnezia/vpn/protocol/wireguard => }/Wireguard.kt (99%) rename client/android/wireguard/src/main/kotlin/{org/amnezia/vpn/protocol/wireguard => }/WireguardConfig.kt (100%) diff --git a/client/3rd-prebuilt b/client/3rd-prebuilt index e568e7d0..2fa21880 160000 --- a/client/3rd-prebuilt +++ b/client/3rd-prebuilt @@ -1 +1 @@ -Subproject commit e568e7d0e8defe8fe009c0127323f2c55fd9be76 +Subproject commit 2fa21880b9e5059cf9e8856c778bad97dcad3c91 diff --git a/client/android/wireguard/src/main/kotlin/com/wireguard/android/backend/GoBackend.kt b/client/android/wireguard/src/main/kotlin/GoBackend.kt similarity index 62% rename from client/android/wireguard/src/main/kotlin/com/wireguard/android/backend/GoBackend.kt rename to client/android/wireguard/src/main/kotlin/GoBackend.kt index 485df5a0..28e48a75 100644 --- a/client/android/wireguard/src/main/kotlin/com/wireguard/android/backend/GoBackend.kt +++ b/client/android/wireguard/src/main/kotlin/GoBackend.kt @@ -1,7 +1,5 @@ -package com.wireguard.android.backend +package org.amnezia.vpn.protocol.wireguard -// TODO: Refactor Amnezia wireguard project by changing the JNI method names -// to move this object to 'org.amnezia.vpn.protocol.wireguard.backend' package object GoBackend { external fun wgGetConfig(handle: Int): String? external fun wgGetSocketV4(handle: Int): Int diff --git a/client/android/wireguard/src/main/kotlin/org/amnezia/vpn/protocol/wireguard/Wireguard.kt b/client/android/wireguard/src/main/kotlin/Wireguard.kt similarity index 99% rename from client/android/wireguard/src/main/kotlin/org/amnezia/vpn/protocol/wireguard/Wireguard.kt rename to client/android/wireguard/src/main/kotlin/Wireguard.kt index 87d5e249..40fa4ec6 100644 --- a/client/android/wireguard/src/main/kotlin/org/amnezia/vpn/protocol/wireguard/Wireguard.kt +++ b/client/android/wireguard/src/main/kotlin/Wireguard.kt @@ -3,7 +3,6 @@ package org.amnezia.vpn.protocol.wireguard import android.content.Context import android.net.VpnService.Builder import java.util.TreeMap -import com.wireguard.android.backend.GoBackend import kotlinx.coroutines.flow.MutableStateFlow import org.amnezia.vpn.protocol.Protocol import org.amnezia.vpn.protocol.ProtocolState diff --git a/client/android/wireguard/src/main/kotlin/org/amnezia/vpn/protocol/wireguard/WireguardConfig.kt b/client/android/wireguard/src/main/kotlin/WireguardConfig.kt similarity index 100% rename from client/android/wireguard/src/main/kotlin/org/amnezia/vpn/protocol/wireguard/WireguardConfig.kt rename to client/android/wireguard/src/main/kotlin/WireguardConfig.kt diff --git a/client/cmake/android.cmake b/client/cmake/android.cmake index 7ffa680e..9458bd08 100644 --- a/client/cmake/android.cmake +++ b/client/cmake/android.cmake @@ -42,9 +42,9 @@ set(SOURCES ${SOURCES} foreach(abi IN ITEMS ${QT_ANDROID_ABIS}) set_property(TARGET ${PROJECT} PROPERTY QT_ANDROID_EXTRA_LIBS - ${CMAKE_CURRENT_SOURCE_DIR}/3rd-prebuilt/3rd-prebuilt/wireguard/android/${abi}/libwg.so - ${CMAKE_CURRENT_SOURCE_DIR}/3rd-prebuilt/3rd-prebuilt/wireguard/android/${abi}/libwg-go.so - ${CMAKE_CURRENT_SOURCE_DIR}/3rd-prebuilt/3rd-prebuilt/wireguard/android/${abi}/libwg-quick.so + ${CMAKE_CURRENT_SOURCE_DIR}/3rd-prebuilt/3rd-prebuilt/amneziawg/android/${abi}/libwg.so + ${CMAKE_CURRENT_SOURCE_DIR}/3rd-prebuilt/3rd-prebuilt/amneziawg/android/${abi}/libwg-go.so + ${CMAKE_CURRENT_SOURCE_DIR}/3rd-prebuilt/3rd-prebuilt/amneziawg/android/${abi}/libwg-quick.so ${CMAKE_CURRENT_SOURCE_DIR}/3rd-prebuilt/3rd-prebuilt/shadowsocks/android/${abi}/libredsocks.so ${CMAKE_CURRENT_SOURCE_DIR}/3rd-prebuilt/3rd-prebuilt/shadowsocks/android/${abi}/libsslocal.so ${CMAKE_CURRENT_SOURCE_DIR}/3rd-prebuilt/3rd-prebuilt/shadowsocks/android/${abi}/libtun2socks.so From 321ed810e3eb11146f07e9229b392df5d739f608 Mon Sep 17 00:00:00 2001 From: agalehaga Date: Tue, 13 Feb 2024 15:16:04 +0200 Subject: [PATCH 04/36] fixed bug with double button clear server from amnezia software --- .../ui/qml/Pages2/PageSettingsServerData.qml | 32 ------------------- 1 file changed, 32 deletions(-) diff --git a/client/ui/qml/Pages2/PageSettingsServerData.qml b/client/ui/qml/Pages2/PageSettingsServerData.qml index a9365af4..99d8a87a 100644 --- a/client/ui/qml/Pages2/PageSettingsServerData.qml +++ b/client/ui/qml/Pages2/PageSettingsServerData.qml @@ -227,38 +227,6 @@ PageType { visible: content.isServerWithWriteAccess } - LabelWithButtonType { - visible: content.isServerWithWriteAccess - Layout.fillWidth: true - - text: qsTr("Clear server from Amnezia software") - textColor: "#EB5757" - - clickedFunction: function() { - questionDrawer.headerText = qsTr("Do you want to clear server from Amnezia software?") - questionDrawer.descriptionText = qsTr("All containers will be deleted on the server. This means that configuration files, keys and certificates will be deleted.") - questionDrawer.yesButtonText = qsTr("Continue") - questionDrawer.noButtonText = qsTr("Cancel") - - questionDrawer.yesButtonFunction = function() { - questionDrawer.visible = false - PageController.goToPage(PageEnum.PageDeinstalling) - if (ServersModel.isDefaultServerCurrentlyProcessed() && ConnectionController.isConnected) { - ConnectionController.closeConnection() - } - InstallController.removeAllContainers() - } - questionDrawer.noButtonFunction = function() { - questionDrawer.visible = false - } - questionDrawer.visible = true - } - } - - DividerType { - visible: content.isServerWithWriteAccess - } - LabelWithButtonType { visible: ServersModel.isCurrentlyProcessedServerFromApi() Layout.fillWidth: true From 92fbbd481291ecded0afe6e1fec10886310b5451 Mon Sep 17 00:00:00 2001 From: Nethius Date: Tue, 13 Feb 2024 20:20:13 +0500 Subject: [PATCH 05/36] bugfix/default-container-index (#578) fixed get/set DefaultContainer --- client/amnezia_application.cpp | 3 --- .../ui/controllers/connectionController.cpp | 2 +- client/ui/controllers/installController.cpp | 2 +- client/ui/models/containers_model.cpp | 14 ------------ client/ui/models/containers_model.h | 5 ----- client/ui/models/servers_model.cpp | 10 ++++----- client/ui/models/servers_model.h | 4 ++-- client/ui/qml/Components/ConnectButton.qml | 1 + .../qml/Components/HomeContainersListView.qml | 22 ++----------------- .../qml/Pages2/PageSetupWizardInstalling.qml | 2 +- client/ui/qml/Pages2/PageShare.qml | 3 ++- 11 files changed, 15 insertions(+), 53 deletions(-) diff --git a/client/amnezia_application.cpp b/client/amnezia_application.cpp index 58e6b543..289b474b 100644 --- a/client/amnezia_application.cpp +++ b/client/amnezia_application.cpp @@ -290,9 +290,6 @@ void AmneziaApplication::initModels() m_engine->rootContext()->setContextProperty("ServersModel", m_serversModel.get()); connect(m_serversModel.get(), &ServersModel::containersUpdated, m_containersModel.get(), &ContainersModel::updateModel); - connect(m_serversModel.get(), &ServersModel::defaultContainerChanged, m_containersModel.get(), - &ContainersModel::setDefaultContainer); - m_containersModel->setDefaultContainer(m_serversModel->getDefaultContainer()); // make better? m_languageModel.reset(new LanguageModel(m_settings, this)); m_engine->rootContext()->setContextProperty("LanguageModel", m_languageModel.get()); diff --git a/client/ui/controllers/connectionController.cpp b/client/ui/controllers/connectionController.cpp index 12a16367..87d8801d 100644 --- a/client/ui/controllers/connectionController.cpp +++ b/client/ui/controllers/connectionController.cpp @@ -33,7 +33,7 @@ void ConnectionController::openConnection() int serverIndex = m_serversModel->getDefaultServerIndex(); ServerCredentials credentials = m_serversModel->getServerCredentials(serverIndex); - DockerContainer container = m_containersModel->getDefaultContainer(); + DockerContainer container = m_serversModel->getDefaultContainer(serverIndex); const QJsonObject &containerConfig = m_containersModel->getContainerConfig(container); if (container == DockerContainer::None) { diff --git a/client/ui/controllers/installController.cpp b/client/ui/controllers/installController.cpp index 1c510782..117c8116 100644 --- a/client/ui/controllers/installController.cpp +++ b/client/ui/controllers/installController.cpp @@ -284,7 +284,7 @@ void InstallController::updateContainer(QJsonObject config) m_protocolModel->updateModel(config); if ((serverIndex == m_serversModel->getDefaultServerIndex()) - && (container == m_containersModel->getDefaultContainer())) { + && (container == m_serversModel->getDefaultContainer(serverIndex))) { emit currentContainerUpdated(); } else { emit updateContainerFinished(tr("Settings updated successfully")); diff --git a/client/ui/models/containers_model.cpp b/client/ui/models/containers_model.cpp index 55ee5b28..c060343f 100644 --- a/client/ui/models/containers_model.cpp +++ b/client/ui/models/containers_model.cpp @@ -39,7 +39,6 @@ QVariant ContainersModel::data(const QModelIndex &index, int role) const case EasySetupOrderRole: return ContainerProps::easySetupOrder(container); case IsInstalledRole: return m_containers.contains(container); case IsCurrentlyProcessedRole: return container == static_cast(m_currentlyProcessedContainerIndex); - case IsDefaultRole: return container == m_defaultContainerIndex; case IsSupportedRole: return ContainerProps::isSupportedByCurrentPlatform(container); case IsShareableRole: return ContainerProps::isShareable(container); } @@ -64,18 +63,6 @@ void ContainersModel::updateModel(const QJsonArray &containers) endResetModel(); } -void ContainersModel::setDefaultContainer(const int containerIndex) -{ - m_defaultContainerIndex = static_cast(containerIndex); - emit dataChanged(index(containerIndex, 0), index(containerIndex, 0)); -} - - -DockerContainer ContainersModel::getDefaultContainer() -{ - return m_defaultContainerIndex; -} - void ContainersModel::setCurrentlyProcessedContainerIndex(int index) { m_currentlyProcessedContainerIndex = index; @@ -127,7 +114,6 @@ QHash ContainersModel::roleNames() const roles[IsInstalledRole] = "isInstalled"; roles[IsCurrentlyProcessedRole] = "isCurrentlyProcessed"; - roles[IsDefaultRole] = "isDefault"; roles[IsSupportedRole] = "isSupported"; roles[IsShareableRole] = "isShareable"; return roles; diff --git a/client/ui/models/containers_model.h b/client/ui/models/containers_model.h index 0deb0f4e..320a762a 100644 --- a/client/ui/models/containers_model.h +++ b/client/ui/models/containers_model.h @@ -42,9 +42,6 @@ public: public slots: void updateModel(const QJsonArray &containers); - DockerContainer getDefaultContainer(); - void setDefaultContainer(const int containerIndex); - void setCurrentlyProcessedContainerIndex(int containerIndex); int getCurrentlyProcessedContainerIndex(); @@ -58,14 +55,12 @@ protected: QHash roleNames() const override; signals: - void defaultContainerChanged(); void containersModelUpdated(); private: QMap m_containers; int m_currentlyProcessedContainerIndex; - DockerContainer m_defaultContainerIndex; }; #endif // CONTAINERS_MODEL_H diff --git a/client/ui/models/servers_model.cpp b/client/ui/models/servers_model.cpp index 36b3d574..af167f20 100644 --- a/client/ui/models/servers_model.cpp +++ b/client/ui/models/servers_model.cpp @@ -403,23 +403,23 @@ void ServersModel::addContainerConfig(const int containerIndex, const QJsonObjec } } -void ServersModel::setDefaultContainer(const int containerIndex) +void ServersModel::setDefaultContainer(const int serverIndex, const int containerIndex) { auto container = static_cast(containerIndex); - QJsonObject s = m_servers.at(m_currentlyProcessedServerIndex).toObject(); + QJsonObject s = m_servers.at(serverIndex).toObject(); s.insert(config_key::defaultContainer, ContainerProps::containerToString(container)); editServer(s); //check emit defaultContainerChanged(container); } -DockerContainer ServersModel::getDefaultContainer() +DockerContainer ServersModel::getDefaultContainer(const int serverIndex) { - return qvariant_cast(data(m_currentlyProcessedServerIndex, DefaultContainerRole)); + return qvariant_cast(data(serverIndex, DefaultContainerRole)); } const QString ServersModel::getDefaultContainerName() { - auto defaultContainer = getDefaultContainer(); + auto defaultContainer = getDefaultContainer(m_defaultServerIndex); return ContainerProps::containerHumanNames().value(defaultContainer); } diff --git a/client/ui/models/servers_model.h b/client/ui/models/servers_model.h index ce2ca7de..e9e1926c 100644 --- a/client/ui/models/servers_model.h +++ b/client/ui/models/servers_model.h @@ -91,8 +91,8 @@ public slots: ErrorCode removeAllContainers(); ErrorCode rebootServer(); - void setDefaultContainer(const int containerIndex); - DockerContainer getDefaultContainer(); + void setDefaultContainer(const int serverIndex, const int containerIndex); + DockerContainer getDefaultContainer(const int serverIndex); const QString getDefaultContainerName(); QStringList getAllInstalledServicesName(const int serverIndex); diff --git a/client/ui/qml/Components/ConnectButton.qml b/client/ui/qml/Components/ConnectButton.qml index f628b6a5..cb2b72dd 100644 --- a/client/ui/qml/Components/ConnectButton.qml +++ b/client/ui/qml/Components/ConnectButton.qml @@ -139,6 +139,7 @@ Button { onClicked: { if (!ConnectionController.isConnectionInProgress) { + ServersModel.setCurrentlyProcessedServerIndex(ServersModel.defaultIndex) ApiController.updateServerConfigFromApi() } } diff --git a/client/ui/qml/Components/HomeContainersListView.qml b/client/ui/qml/Components/HomeContainersListView.qml index 3043e97f..cca17c6f 100644 --- a/client/ui/qml/Components/HomeContainersListView.qml +++ b/client/ui/qml/Components/HomeContainersListView.qml @@ -26,24 +26,6 @@ ListView { id: containersRadioButtonGroup } - Connections { - target: ServersModel - - function onCurrentlyProcessedServerIndexChanged() { - if (ContainersModel.getDefaultContainer()) { - menuContent.checkCurrentItem() - } - } - } - - function checkCurrentItem() { - var item = menuContent.itemAtIndex(currentIndex) - if (item !== null) { - var radioButton = item.children[0].children[0] - radioButton.checked = true - } - } - delegate: Item { implicitWidth: rootWidth implicitHeight: content.implicitHeight @@ -69,7 +51,7 @@ ListView { showImage: !isInstalled checkable: isInstalled && !ConnectionController.isConnected && isSupported - checked: isDefault + checked: proxyContainersModel.mapToSource(index) === ServersModel.getDefaultContainer(ServersModel.defaultIndex) onClicked: { if (ConnectionController.isConnected && isInstalled) { @@ -79,7 +61,7 @@ ListView { if (checked) { containersDropDown.menuVisible = false - ServersModel.setDefaultContainer(proxyContainersModel.mapToSource(index)) + ServersModel.setDefaultContainer(ServersModel.defaultIndex, proxyContainersModel.mapToSource(index)) } else { if (!isSupported && isInstalled) { PageController.showErrorMessage(qsTr("The selected protocol is not supported on the current platform")) diff --git a/client/ui/qml/Pages2/PageSetupWizardInstalling.qml b/client/ui/qml/Pages2/PageSetupWizardInstalling.qml index 1a3e7c07..1ad3d95d 100644 --- a/client/ui/qml/Pages2/PageSetupWizardInstalling.qml +++ b/client/ui/qml/Pages2/PageSetupWizardInstalling.qml @@ -26,7 +26,7 @@ PageType { function onInstallContainerFinished(finishedMessage, isServiceInstall) { if (!ConnectionController.isConnected && !isServiceInstall) { - ServersModel.setDefaultContainer(ContainersModel.getCurrentlyProcessedContainerIndex()) + ServersModel.setDefaultContainer(ServersModel.currentlyProcessedIndex, ContainersModel.getCurrentlyProcessedContainerIndex()) } PageController.closePage() // close installing page diff --git a/client/ui/qml/Pages2/PageShare.qml b/client/ui/qml/Pages2/PageShare.qml index 3a769ebe..c7777fea 100644 --- a/client/ui/qml/Pages2/PageShare.qml +++ b/client/ui/qml/Pages2/PageShare.qml @@ -365,7 +365,8 @@ PageType { target: serverSelector function onSeverSelectorIndexChanged() { - protocolSelectorListView.currentIndex = proxyContainersModel.mapFromSource(ServersModel.getDefaultContainer()) + var defaultContainer = proxyContainersModel.mapFromSource(ServersModel.getDefaultContainer(ServersModel.currentlyProcessedIndex)) + protocolSelectorListView.currentIndex = defaultContainer protocolSelectorListView.triggerCurrentItem() } } From bf16298c40b9f72b2476adcaa35b0798d55bb14a Mon Sep 17 00:00:00 2001 From: pokamest Date: Tue, 13 Feb 2024 21:10:47 +0000 Subject: [PATCH 06/36] Version bump - 4.4.0.0 --- CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index aa8d800b..a17d3763 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,7 +2,7 @@ cmake_minimum_required(VERSION 3.25.0 FATAL_ERROR) set(PROJECT AmneziaVPN) -project(${PROJECT} VERSION 4.3.0.0 +project(${PROJECT} VERSION 4.4.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 44) +set(APP_ANDROID_VERSION_CODE 45) if(${CMAKE_SYSTEM_NAME} STREQUAL "Linux") set(MZ_PLATFORM_NAME "linux") From 82fa6b13c681e03978372f60cb0f7e6871d30c2f Mon Sep 17 00:00:00 2001 From: albexk Date: Wed, 14 Feb 2024 19:35:40 +0300 Subject: [PATCH 07/36] Fix foreground service type (#592) Fix foreground service type --- CMakeLists.txt | 2 +- client/android/AndroidManifest.xml | 9 ++++----- client/android/src/org/amnezia/vpn/AmneziaVpnService.kt | 4 ++-- 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index a17d3763..2c1a1934 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -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 45) +set(APP_ANDROID_VERSION_CODE 46) if(${CMAKE_SYSTEM_NAME} STREQUAL "Linux") set(MZ_PLATFORM_NAME "linux") diff --git a/client/android/AndroidManifest.xml b/client/android/AndroidManifest.xml index fb417f05..22eed003 100644 --- a/client/android/AndroidManifest.xml +++ b/client/android/AndroidManifest.xml @@ -22,7 +22,7 @@ - + @@ -137,14 +137,13 @@ android:name=".AmneziaVpnService" android:process=":amneziaVpnService" android:permission="android.permission.BIND_VPN_SERVICE" - android:foregroundServiceType="specialUse" - android:exported="false"> + android:foregroundServiceType="systemExempted" + android:exported="false" + tools:ignore="ForegroundServicePermission"> - - = Build.VERSION_CODES.UPSIDE_DOWN_CAKE -> FOREGROUND_SERVICE_TYPE_SPECIAL_USE + Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE -> FOREGROUND_SERVICE_TYPE_SYSTEM_EXEMPTED Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q -> FOREGROUND_SERVICE_TYPE_MANIFEST else -> 0 } From fd030a5fd4c34243e8be7b0dcff3acc86a98cd1e Mon Sep 17 00:00:00 2001 From: Shehab Ahmed Date: Fri, 16 Feb 2024 12:19:47 +0200 Subject: [PATCH 08/36] Arabic translation (#594) added Arabic translation --- client/CMakeLists.txt | 1 + client/translations/amneziavpn_ar.ts | 3247 ++++++++++++++++++++++++++ client/ui/models/languageModel.cpp | 3 + client/ui/models/languageModel.h | 3 +- 4 files changed, 3253 insertions(+), 1 deletion(-) create mode 100644 client/translations/amneziavpn_ar.ts diff --git a/client/CMakeLists.txt b/client/CMakeLists.txt index 0bc4e89c..9fb07d61 100644 --- a/client/CMakeLists.txt +++ b/client/CMakeLists.txt @@ -57,6 +57,7 @@ set(AMNEZIAVPN_TS_FILES ${CMAKE_CURRENT_LIST_DIR}/translations/amneziavpn_ru.ts ${CMAKE_CURRENT_LIST_DIR}/translations/amneziavpn_zh_CN.ts ${CMAKE_CURRENT_LIST_DIR}/translations/amneziavpn_fa_IR.ts + ${CMAKE_CURRENT_LIST_DIR}/translations/amneziavpn_ar.ts ) file(GLOB_RECURSE AMNEZIAVPN_TS_SOURCES *.qrc *.cpp *.h *.ui) diff --git a/client/translations/amneziavpn_ar.ts b/client/translations/amneziavpn_ar.ts new file mode 100644 index 00000000..2632e07d --- /dev/null +++ b/client/translations/amneziavpn_ar.ts @@ -0,0 +1,3247 @@ + + + + + ConnectionController + + + + + + Connect + اتصل + + + + VPN Protocols is not installed. + Please install VPN container at first + لم يتم تثبيت بروتوكولات VPN, من فضلك قم بتنزيل حاوية VPN اولاً + + + + Connection... + اتصال... + + + + Connected + تم الاتصال + + + + Reconnection... + إعادة الاتصال... + + + + Disconnection... + إنهاء الاتصال... + + + + Settings updated successfully, Reconnnection... + تم تحديث الاعدادات بنجاح, جاري إعادة الاتصال... + + + + Settings updated successfully + تم تحديث الاعدادات بنجاح + + + + ConnectionTypeSelectionDrawer + + + Add new connection + إضافة اتصال جديد + + + + Configure your server + قم بتهيئة الخادم الخاص بك + + + + Open config file, key or QR code + افتح ملف تعريف, مفتاح تعريف او رمز QR + + + + ContextMenuType + + + C&ut + ق&طع + + + + &Copy + &استنتاخ + + + + &Paste + &لصق + + + + &SelectAll + &تحديد الكل + + + + ExportController + + + Access error! + خطأ في الوصول! + + + + HomeContainersListView + + + Unable change protocol while there is an active connection + قم بتغيير البروتوكول عند تواجد اتصال + + + + The selected protocol is not supported on the current platform + البروتوكول المحدد غير مدعوم علي المنصة الحالية + + + + ImportController + + + Scanned %1 of %2. + تم فحص%1 من %2. + + + + InstallController + + installed successfully. + تم التثبيت بنجاح + + + is already installed on the server. + بالفعل مٌثبت علي الخادم + + + + + %1 installed successfully. + %1 تم التثبيت بنجاح. + + + + + %1 is already installed on the server. + %1 بالفعل مٌثبت علي الخادم. + + + + +Added containers that were already installed on the server + +تمت إضافة الحاويات التي كانت مٌثبتة بالفعل علي الخادم + + + + +Already installed containers were found on the server. All installed containers have been added to the application + +تم العثور علي حاويات مٌثبتة بالفعل علي الخادم +تمت إضافة جميع الحاويات المٌثبتة إلي التطبيق + + + + Settings updated successfully + تم تحديث الاعدادات بنجاح + + + + Server '%1' was rebooted + تمت إعادة تشغيل الخادم%1 + + + + Server '%1' was removed + تمت إزالة الخادم '%1' + + + + All containers from server '%1' have been removed + قد تم حذفها '%1' جميع الحاويات من الخادم + + + + %1 has been removed from the server '%2' + %1 تم حدف '%2' اسم الخادم + + + 1% has been removed from the server '%2' + %1 من الخادم '%2' تم مسحة + + + Server ' + خادم + + + ' was removed + تم حذفة + + + has been removed from the server ' + قد تمت إزالتة من الخادم + + + + Please login as the user + من فضلك قم بتسجيل الدخول كمستخدم + + + + Server added successfully + تمت إضافة الخادم بنجاح + + + + KeyChainClass + + + Read key failed: %1 + فشل مفتاح القراءة: %1 + + + + Write key failed: %1 + فشل مفتاح الكتابة: %1 + + + + Delete key failed: %1 + فشل مفتاح الحذف: %1 + + + + NotificationHandler + + + + AmneziaVPN + AmneziaVPN + + + + VPN Connected + تم الاتصال + + + + VPN Disconnected + تم إنهاء الاتصال + + + + AmneziaVPN notification + إشعار من AmneziaVPN + + + + Unsecured network detected: + تم العثور علي شبكة غير مؤمنة: + + + + PageDeinstalling + + + Removing services from %1 + من %1 مسح الخدمة + + + + Usually it takes no more than 5 minutes + في العادة تستغرق اقل من 5 دقائق + + + + PageHome + + + VPN protocol + بروتوكول VPN + + + + Servers + الخوادم + + + + Unable change server while there is an active connection + لا يمكن تغير الخادم بينما هناك اتصال مفعل + + + + PageProtocolAwgSettings + + + AmneziaWG settings + اعدادات AmneziaWG + + + + Port + منفذ + + + + Junk packet count + عدد الحزم الغير مرغوب فيها + + + + Junk packet minimum size + الحد الادني لحجم الحزمة الغير مرغوب فيها + + + + Junk packet maximum size + الحجم الاقصي للحزمة الغير مرغوب فيها + + + + Init packet junk size + Init packet junk size + + + + Response packet junk size + حجم حزمة الاستجابة الغير مرغوب فيها + + + + Init packet magic header + إطلاق حزمة magic header + + + + Response packet magic header + حزمة الرد magic header + + + + Transport packet magic header + نقل حزمة magic header + + + + Underload packet magic header + تحميل حزمة magic header + + + + Remove AmneziaWG + قم بحذف AmneziaWG + + + + Remove AmneziaWG from server? + قم بحذف AmneziaWG من الخادم؟ + + + + All users with whom you shared a connection will no longer be able to connect to it. + جميع المستخدمين الذين قمت بمشاركة اتصال معهم لن يستطيعو الاتصال. + + + + Continue + واصل + + + + Cancel + إلغاء + + + + Save and Restart Amnezia + احفظ و اعِد تشغيل Amnezia + + + + PageProtocolCloakSettings + + + Cloak settings + Cloak إعدادات + + + + Disguised as traffic from + متنكراً في حركة مرور من + + + + Port + منفذ + + + + + Cipher + الشفرة + + + + Save and Restart Amnezia + احفظ و اعِد تشغيل Amnezia + + + + PageProtocolOpenVpnSettings + + + OpenVPN settings + OpenVPN اعدادات + + + + VPN address subnet + الشبكة الفرعية لعنوان VPN + + + + Network protocol + بروتوكول الشبكة + + + + Port + منفذ + + + + Auto-negotiate encryption + التفاوض التلقائي علي الشبكة + + + + + Hash + + + + + SHA512 + + + + + SHA384 + + + + + SHA256 + + + + + SHA3-512 + + + + + SHA3-384 + + + + + SHA3-256 + + + + + whirlpool + + + + + BLAKE2b512 + + + + + BLAKE2s256 + + + + + SHA1 + + + + + + Cipher + شفرة + + + + AES-256-GCM + + + + + AES-192-GCM + + + + + AES-128-GCM + + + + + AES-256-CBC + + + + + AES-192-CBC + + + + + AES-128-CBC + + + + + ChaCha20-Poly1305 + + + + + ARIA-256-CBC + + + + + CAMELLIA-256-CBC + + + + + none + لا شئ + + + + TLS auth + TLS مصادقة + + + + Block DNS requests outside of VPN + احظر طلبات DNS خارج ال VPN + + + + Additional client configuration commands + اوامر تكوين العميل الاضافية + + + + + Commands: + الاوامر: + + + + Additional server configuration commands + اوامر تكوين الخادم الاضافية + + + + Remove OpenVPN + احذف OpenVPN + + + + Remove OpenVpn from server? + احذف OpenVPN من الخادم? + + + + All users with whom you shared a connection will no longer be able to connect to it. + جميع المستخدمين الذين شاركت معهم الاتصال لن يستطيعو الاتصال مجدداً. + + + All users with whom you shared a connection will no longer be able to connect to it + جميع المستخدمين الذين شاركت اتصال معهم لن يستطيعو الاتصال بعد الان + + + + Continue + واصل + + + + Cancel + إلغاء + + + + Save and Restart Amnezia + احفظ واعِد تشغيل Amnezia + + + + PageProtocolRaw + + + settings + إعدادات + + + + Show connection options + اظهر اختيارات الاتصال + + + Connection options + اختيارات الاتصال + + + + Connection options %1 + %1 اختيارات الاتصال + + + + Remove + احذف + + + + Remove %1 from server? + احذف %1 من الخادم ? + + + + All users with whom you shared a connection will no longer be able to connect to it. + جميع المستخدمين الذين شاركت معهم اتصال لن يستطيعو الاتصال بعد الان. + + + from server? + من الخادم + + + All users with whom you shared a connection will no longer be able to connect to it + جميع المستخدمين الذين شاركت اتصال معهم لن يستطيعو الاتصال بعد الان + + + + Continue + واصل + + + + Cancel + إلغاء + + + + PageProtocolShadowSocksSettings + + + ShadowSocks settings + ShadowSocks إعدادات + + + + Port + منفذ + + + + + Cipher + تشفير + + + + Save and Restart Amnezia + احفظ واعِد تشغيل Amnezia + + + + PageServiceDnsSettings + + + A DNS service is installed on your server, and it is only accessible via VPN. + + تم تثبيت خدمة DNS علي الخادم الخاص بك, و فقط متاح من خلال VPN. + + + + + The DNS address is the same as the address of your server. You can configure DNS in the settings, under the connections tab. + عنوان ال DNS متطابق لنفس عنوان الخادم بك, يمكنك تهيئة DNS في الاعدادات, تحت علامة تبويب الاتصال. + + + + Remove + احذف + + + + Remove %1 from server? + احذف %1 ? + + + from server? + من الخادم + + + + Continue + واصل + + + + Cancel + إلغاء + + + + PageServiceSftpSettings + + + Settings updated successfully + تم تحديث الإعدادات بنجاح + + + + SFTP settings + SFTP إعدادات + + + + Host + استضافة + + + + + + + Copied + تم الاستنساخ + + + + Port + منفذ + + + + Login + تسجيل الدخول + + + + Password + كلمة المرور + + + + Mount folder on device + قم بتثبيت المجلد علي الجهاز + + + + In order to mount remote SFTP folder as local drive, perform following steps: <br> + لتثبيت مجلد SFTP كمحرك اقراص محلي, اتبع هذه الخطوات : <br> + + + + + <br>1. Install the latest version of + <br>1. تحميل اخر اصدار من + + + + + <br>2. Install the latest version of + <br>2. تحمير اخر اصدار من + + + + Detailed instructions + تعليمات مفصلة + + + + Remove SFTP and all data stored there + امسح SFTP وجميع البيانات المخزنة + + + + Remove SFTP and all data stored there? + امسح SFTP وجميع البيانات المخزنة؟ + + + + Continue + واصل + + + + Cancel + إلغاء + + + + PageServiceTorWebsiteSettings + + + Settings updated successfully + تم تحديث الإعدادات بنجاح + + + + Tor website settings + Tor إعدادات متصفح + + + + Website address + عنوان المتصفح + + + + Copied + تم الاستنساخ + + + + Use <a href="https://www.torproject.org/download/" style="color: #FBB26A;">Tor Browser</a> to open this URL. + + + + + After creating your onion site, it takes a few minutes for the Tor network to make it available for use. + + + + + When configuring WordPress set the this onion address as domain. + عند تكوين WordPress قم بتعيين عنوان ال onion هذا ك domain. + + + + Remove website + احذف متصفح + + + + The site with all data will be removed from the tor network. + سيتم حذف الموقع وجميع البيانات من الشبكة. + + + + Continue + واصل + + + + Cancel + إلغاء + + + + PageSettings + + + Settings + إعدادات + + + + Servers + الخوادم + + + + Connection + الاتصال + + + + Application + تطبيق + + + + Backup + نسخة احتياطية + + + + About AmneziaVPN + عن AmneziaVPN + + + + Close application + إغلاق التطبيق + + + + PageSettingsAbout + + This is a free and open source application. If you like it, support the developers with a donation. +And if you don't like the app, all the more support it - the donation will be used to improve the app. + هذا تطبيق مجاني و مفتوح المصدر. إذا عجبك التطبيق, ادعم المطورين ب تبرع. + وإذا لما يعجبك, فهذا سبب اكبر لدعمة - تستخدم التبرعات في تطوير التطبيق + + + + Support Amnezia + دعم Amenzia + + + + This is a free and open source application. If you like it, support the developers with a donation. + هذا تطبيق مجاني ومفتوح المصدر. إذا عجبك التطبيق, ادعم المطورين ب تبرع. + + + + And if you don’t like the application, all the more reason to support it - the donation will be used for the improving the application. + وإذا لم يعجبك التطبيق,، فهذا سبب إضافي لدعمه - سيتم استخدام التبرع لتحسين التطبيق. + + + + Card on Patreon + البطاقة علي Patreon + + + + https://www.patreon.com/amneziavpn + + + + + Show other methods on Github + اظهر المزيد علي GitHub + + + + https://github.com/amnezia-vpn/amnezia-client#donate + + + + + Contacts + التواصل + + + + Telegram group + مجموعة ال Telegram + + + + To discuss features + لمناقشة الميزات + + + + https://t.me/amnezia_vpn_en + + + + + Mail + البريد + + + + For reviews and bug reports + لل مراجعات والابلاغات عن المشاكل + + + + Github + + + + + https://github.com/amnezia-vpn/amnezia-client + + + + + Website + موقع + + + + https://amnezia.org + + + + + Check for updates + تحقق من وجود تحديثات + + + + PageSettingsApplication + + + Application + تطبيق + + + + Allow application screenshots + اسمح بلقطات شاشة التطبيق + + + + Auto start + تشغيل تلقائي + + + Launch the application every time + شغل البرنامج كل مرة + + + starts + يبدأ + + + + Launch the application every time the device is starts + قم بتشغيل التطبيق فكل مرة يتم فيها تشغيل الجهاز + + + + Start minimized + ابدأ ب الحجم الادني + + + + Launch application minimized + تشغيل التطبيق في الحد الادني + + + + Language + اللغة + + + + Logging + تسجيل + + + + Enabled + مٌفعل + + + + Disabled + مٌعطل + + + + Reset settings and remove all data from the application + إعادة ضبط الاعدادات ومسح جميع البيانات من التطبيق + + + + Reset settings and remove all data from the application? + إعادة ضبط الاعدادات ومسح جميع البيانات من التطبيق؟ + + + + All settings will be reset to default. All installed AmneziaVPN services will still remain on the server. + سيتم ضبط الاعدادات الافتراضية. جميع خدمات AmneziaVPN المٌثبتة ستبقي علي الخادم. + + + + Continue + واصل + + + + Cancel + إلغاء + + + + PageSettingsBackup + + + Settings restored from backup file + تم إعادة الاعدادات من ملف نسخة احتياطية + + + + Backup + نسخة احتياطية + + + + Configuration backup + نسخ احتياطي للإعدادات + + + It will help you instantly restore connection settings at the next installation + سيساعدك علي إعادة إعدادات الاتصال بسرعة عند إعادة تثبيت التطبيق + + + + You can save your settings to a backup file to restore them the next time you install the application. + يمكنك حفظ الإعدادات في ملف نسخة احتياطية لأعادتهم في المرة القادمة التي تثبت فيها التطبيق. + + + + Make a backup + إضافة نسخة احتياطية + + + + Save backup file + احفظ ملف النسخه الاحتياطيه + + + + + Backup files (*.backup) + ملفات نٌسخ احتياطية (*.backup) + + + + Backup file saved + تم حفظ ملف النسخ الاحتياطي + + + + Restore from backup + استرجاع من ملف احتياطي + + + + Open backup file + افتح ملف نسخ احتياطي + + + + Import settings from a backup file? + استرد الإعدادات من ملف نسخ احتياطي؟ + + + + All current settings will be reset + ستتم إعادة ضبط جميع الإعدادات الحالية + + + + Continue + واصل + + + + Cancel + إلغاء + + + + PageSettingsConnection + + + Connection + الاتصال + + + + Auto connect + الاتصال التلقائي + + + + Connect to VPN on app start + اتصل ب ال VPN عند تشغيل التطبيق + + + + When AmneziaDNS is not used or installed + عندما يكون AmneziaDNS غير مٌثبت او غير مستخدم + + + + Allows you to use the VPN only for certain Apps + يسمح لك بأستخدام ال VPN علي تطبيقات معينة + + + Use AmneziaDNS if installed on the server + استخدم AmneziaDNS إذا كان مٌثبت علي الخادم + + + + Use AmneziaDNS + استخدم AmneziaDNS + + + + If AmneziaDNS is installed on the server + في حالة كان AmneziaDNS مٌثبت علي الخادم + + + + DNS servers + خوادم DNS + + + + Site-based split tunneling + انقسام الانفاق القائم علي الموقع + + + + Allows you to select which sites you want to access through the VPN + يسمح لك بتحديد اي موقع تريد الوصول له عن طريق ال VPN + + + + App-based split tunneling + انقسام الانفاق القائم علي التطبيق + + + Split site tunneling + قسم نفق الموقع + + + Allows you to connect to some sites through a secure connection, and to others bypassing it + يسمحلك بألاتصال ببعض المواقع بسرية, وعلي الاخرين تجاوزه + + + Separate application tunneling + فرق نفق التطبيق + + + + PageSettingsDns + + + Default server does not support custom dns + الخادم الافتراضي لا يدعم DNS مخصص + + + + DNS servers + خوادم ال DNS + + + + If AmneziaDNS is not used or installed + AmneziaVPN ليس مٌستخدم او مٌثبت + + + + Primary DNS + الرئيسي DNS + + + + Secondary DNS + الثانوي DNS + + + + Restore default + استعادة الافتراضي + + + + Restore default DNS settings? + قم بأعادة ضبط إعدادات ال DNS الافتراضية؟ + + + + Continue + واصل + + + + Cancel + إلغاء + + + + Settings have been reset + لم يتم إعادة ضبط الإعدادات + + + + Save + احفظ + + + + Settings saved + تم حفظ الإعدادات + + + + PageSettingsLogging + + + Logging + التسجيل + + + + Save logs + احفظ السجلات + + + + Open folder with logs + افتح مجلد يحتوي علي سجلات + + + + Save + احفظ + + + + Logs files (*.log) + ملفات الولوج (*.log) + + + + Logs file saved + تم حفظ ملف السجل + + + + Save logs to file + احفظ السجلات لملف + + + + Clear logs? + مسح السجلات؟ + + + + Continue + واصل + + + + Cancel + إلغاء + + + + Logs have been cleaned up + تم مسح السجلات + + + + Clear logs + احذف السجلات + + + + PageSettingsServerData + + + All installed containers have been added to the application + تمت إضافة جميع الحاويات المٌثبتة للتطبيق + + + + No new installed containers found + لم يتم العثور علي اي حاويات جديدة مٌثبتة + + + + Clear Amnezia cache + حذف ذاكرة تخزين Amnezia المؤقتة + + + + May be needed when changing other settings + قد يكون ضروري عند تغير الإعدادات الاخري + + + + Clear cached profiles? + حذف الملفات الشخصية المخزنة مؤقتاً؟ + + + + Do you want to reboot the server? + هل تريد إعادة تشغيل الخادم؟ + + + + + Do you want to clear server from Amnezia software? + هل تريد حذف الخادم من Amnezia? + + + + + + + + + + + + + + Continue + واصل + + + + + + + + + Cancel + إلغاء + + + + Check the server for previously installed Amnezia services + افحص الخادم عن اي خدمات Amnezia مٌثبتة سابقاُ + + + + Add them to the application if they were not displayed + اضفهم إلي التطبيق إذا لم يكونو ظاهرين + + + + Reboot server + إعادة تشغيل الخادم + + + + The reboot process may take approximately 30 seconds. Are you sure you wish to proceed? + عملية إعادة التشغيل قد تستغرق 30 ثانية, هل تريد الاستكمال؟ + + + + Remove server from application + احذف خادم من التطبيق + + + + Do you want to remove the server from application? + هل تريد حذف الخادم من التطبيق؟ + + + + Reset API config + إعادة تكوين API + + + + Do you want to reset API config? + هل تريد إعادة تكوين API? + + + + All installed AmneziaVPN services will still remain on the server. + جميع خدمات AmneziaVPN المٌثبتة ستظل علي الخادم. + + + + + Clear server from Amnezia software + احذف خادم من Amnezia + + + + + All containers will be deleted on the server. This means that configuration files, keys and certificates will be deleted. + سيتم حذف جميع الحاويات, هذا يعني ان جميع ملفات التكوين, شهادات و مفاتيح التعريف سيتم حذفهم. + + + + PageSettingsServerInfo + + + Server name + اسم الخادم + + + + Save + احفظ + + + + Protocols + البروتوكولات + + + + Services + الخدمات + + + + Data + البيانات + + + + PageSettingsServerProtocol + + + settings + الإعدادات + + + + Remove + احذف + + + + All users with whom you shared a connection will no longer be able to connect to it. + جميع المستخدمين الذين شاركت معاهم اتصال لن يستطيعو الاتصال بعد الان. + + + from server? + من الخادم؟ + + + + Remove %1 from server? + احذف %1 من الخادم ? + + + All users with whom you shared a connection will no longer be able to connect to it + جميع المستخدمين الذين شاركت اتصال معهم لن يستطيعو الاتصال بعد الان + + + + Continue + واصل + + + + Cancel + إلغاء + + + + PageSettingsServersList + + + Servers + الخوادم + + + + PageSettingsSplitTunneling + + Only the addresses in the list must be opened via VPN + يجب فتح العنواين التي في القائمة عبر VPN + + + Addresses from the list should never be opened via VPN + لا يجب ابداً فتح العنواين التي في القائمة عن طريق VPN + + + Split site tunneling + قسم نفق الموقع + + + + Default server does not support split tunneling function + السرفر الافتراضي لا يدعم ميزة تقسيم الانفاق + + + + Addresses from the list should not be accessed via VPN + لا يجب الولوج للعنواين المذكورة هنا من خلال ال VPN + + + + Split tunneling + تقسيم الانفاق + + + + Mode + وضع + + + + Remove + احذف + + + + Continue + واصل + + + + Cancel + إلغاء + + + + Only the sites listed here will be accessed through the VPN + سيتم الولوج للمواقع المذكورة هنا فقط عن طريق ال VPN + + + + website or IP + موقع او IP + + + + Import / Export Sites + + + + + Import + استرد + + + + Save site list + احفظ قائمة المواقع + + + + Save sites + احفظ المواقع + + + + + + Sites files (*.json) + + + + + Import a list of sites + استرد قائمة من المواقع + + + + Replace site list + تبديل قائمة المواقع + + + + + Open sites file + افتح ملف المواقع + + + + Add imported sites to existing ones + إضافة المواقع المستردة للمواقع الموجودة + + + + PageSetupWizardConfigSource + + + Server connection + اتصال الخادم + + + + Do not use connection code from public sources. It may have been created to intercept your data. + +It's okay as long as it's from someone you trust. + لا تستخدم رمز الاتصال من المصادر العامة. ربما تم إنشاؤه لاعتراض بياناتك + +لا بأس طالما انه من شخص تثق به. + + + + What do you have? + ماذا لديك؟ + + + + File with connection settings or backup + ملف إعدادات اتصال او نسخ احتياطي + + + + File with connection settings + ملف إعدادات اتصال + + + + Open config file + افتح ملف تكوين + + + + QR-code + رمز QR + + + + Key as text + مفتاح كنص + + + + PageSetupWizardCredentials + + + Configure your server + تكوين الخادم الخاص بك + + + + Server IP address [:port] + عنوان خادم IP [:منفذ] + + + + Login to connect via SSH + قم بتسجيل الدخول للأتصال عن طريق SSH + + + + Continue + واصل + + + + All data you enter will remain strictly confidential and will not be shared or disclosed to the Amnezia or any third parties + ستظل جميع البيانات التي تدخلها سرية للغاية ولن تتم مشاركتها أو الكشف عنها ل Amnezia أو أي طرف ثالث + + + + 255.255.255.255:22 + + + + + Password or SSH private key + كلمة مرور او مفتاح SSH خاص + + + + Ip address cannot be empty + لا يمكن لعنوان IP ان يكون فارغ + + + + Enter the address in the format 255.255.255.255:88 + ادخل العنوان في شكل 255.255.255.255:88 + + + + Login cannot be empty + تسجيل دخول لا يمكن ان يكون فارغ + + + + Password/private key cannot be empty + كلمة مرور/مفتاح خاص لأ يمكن ان يكونو فارغين + + + + PageSetupWizardEasy + + + What is the level of internet control in your region? + ما هو مستوي التحكم في الانترنت في منطقتك؟ + + + + Set up a VPN yourself + قم بإعداد VPN بنفسك + + + + I want to choose a VPN protocol + اريد اختيار بروتوكول VPN + + + + Continue + واصل + + + + Set up later + إعداد في وقت لاحق + + + + PageSetupWizardInstalling + + + + Usually it takes no more than 5 minutes + عادة لا تستغرق اكثر من 5 دقائق + + + + The server has already been added to the application + تمت إضافة الخادم بالفعل للتطبيق + + + + Amnezia has detected that your server is currently + اكتشف Amnezia الخادم الخاص بك موجود حاليًا + + + + busy installing other software. Amnezia installation + مشغول بتثبيت برامج اخري, تثبيت Amnezia + + + + Cancel installation + إلغاء التثبيت + + + + will pause until the server finishes installing other software + سيتوقف مؤقتًا حتى ينتهي الخادم من تثبيت البرامج الأخرى + + + + Installing + جاري التثبيت + + + + PageSetupWizardProtocolSettings + + + Installing %1 + جاري تثبيت %1 + + + + More detailed + اكثر تفصيلاً + + + + Close + اغلق + + + + Network protocol + بروتوكول شبكة + + + + Port + منفذ + + + + Install + تثبيت + + + + PageSetupWizardProtocols + + + VPN protocol + VPN بروتوكول + + + + Choose the one with the highest priority for you. Later, you can install other protocols and additional services, such as DNS proxy and SFTP. + اختر بالنسبة للأولوية القصوى بالنسبة لك. ويمكنك لاحقًا تثبيت بروتوكولات وخدمات إضافية أخرى، مثل وكيل DNS وSFTP. + + + + PageSetupWizardQrReader + + + Point the camera at the QR code and hold for a couple of seconds. + قم بتوجيه الكاميرا نحو رمز QR و اثبت لبضع ثوان. + + + + PageSetupWizardStart + + + Settings restored from backup file + تم استرداد الإعدادات من ملف نسخة احتياطية + + + + Free service for creating a personal VPN on your server. + خدمة مجانية لأنشاء VPN شخصي علي الخادم الشخصي. + + + + Helps you access blocked content without revealing your privacy, even to VPN providers. + يساعدك في الولوج للمحتوي المحظور بدون إظهار خصوصيات, حتي لمزود ال VPN. + + + + I have the data to connect + لدي البيانات المطلوبة للأتصال + + + + I have nothing + ليس لدي اي شئ + + + + https://amnezia.org/instructions/0_starter-guide + + + + + PageSetupWizardTextKey + + + Connection key + مفتاح اتصال + + + + A line that starts with vpn://... + سطر يبدأ ب vpn://... + + + + Key + مفتاح + + + + Insert + ادخل + + + + Continue + واصل + + + + PageSetupWizardViewConfig + + + New connection + اتصال جديد + + + + Do not use connection code from public sources. It could be created to intercept your data. + لا تستخدم رمز الاتصال من مصادر مفتوحة, قد تكون مصنوعة للتعارض مع بياناتك. + + + + Collapse content + طي المحتوي + + + + Show content + اظهر المحتوي + + + + Connect + اتصل + + + + PageShare + + + Save OpenVPN config + احفظ تكوين OpenVPN + + + + Save WireGuard config + احفظ تكوين WireGuard + + + + Save ShadowSocks config + احفظ تكوين ShadowSocks + + + + Save Cloak config + احفظ تكوين Cloak + + + + For the AmneziaVPN app + AmneziaVPN من اجل تطبيق + + + + OpenVpn native format + تنسيق OpenVpn الاصلي + + + + WireGuard native format + تنسيق WireGuard الاصلي + + + + ShadowSocks native format + تنسيق ShadowSocks الاصلي + + + + Cloak native format + تنسيق Cloak الاصلي + + + + Share VPN Access + شارك اتصال VPN + + + + Share full access to the server and VPN + شارك ولوج كامل للخادم و ال VPN + + + + Use for your own devices, or share with those you trust to manage the server. + استخدمه للأجهزة الخاصة بك، أو شاركه مع من تثق بهم لإدارة الخادم. + + + + + Users + المستخدمين + + + + Share VPN access without the ability to manage the server + شارك اتصال VPN بدون القدرة علي إدارة الخادم + + + + Search + ابحث + + + + Creation date: + تاريخ الإنشاء: + + + + Rename + إعادة التسمية + + + + Client name + اسم العميل + + + + Save + احفظ + + + + Revoke + سحب وإبطال + + + + Revoke the config for a user - %1? + سحب وإبطال للمستخدم - %1? + + + + The user will no longer be able to connect to your server. + المستخدم لن يكون قادر علي الاتصال بعد الان. + + + + Continue + واصل + + + + Cancel + إلغاء + + + + Connection + الاتصال + + + Full access to server + ولوج كامل للخادم + + + Servers + الخوادم + + + + + Server + خادم + + + + File with connection settings to + ملف بإعدادات إلي + + + Protocols + البروتوكولات + + + + + Protocol + بروتوكول + + + + Connection to + اتصال إلي + + + + Config revoked + تم سحب وإبطال التكوين + + + + User name + اسم المستخدم + + + + + Connection format + تنسيق الاتصال + + + + + Share + شارك + + + + PageShareFullAccess + + + Full access to the server and VPN + ولوج كامل للخادم و ال VPN + + + + We recommend that you use full access to the server only for your own additional devices. + + نحن ننصحك بأستخدام ولوج كامل للخادم فقط لأجهزتك الاضافية. + + + + + If you share full access with other people, they can remove and add protocols and services to the server, which will cause the VPN to work incorrectly for all users. + إذا شاركت ولوج كامل مع الاشخاص, سيكونو قادرين علي حذف وإضافة بروتوكولات و خدمات إلي الخادم, والذي سيجعل VPN يعمل بشكل غير صحيح لجميع المستخدمين. + + + + + Server + خادم + + + + Accessing + التواصل + + + + File with accessing settings to + ملف مع إعدادات الوصول إلي + + + + Share + مشاركة + + + + Connection to + اتصال إلي + + + + File with connection settings to + معلف مع إعدادات الاتصال إلي + + + + PopupType + + + Close + اغلاق + + + + QKeychain::DeletePasswordJobPrivate + + + Password entry not found + لم يتم العثور علي مدخلات كلمة المرور + + + + Could not decrypt data + فشل فك تشفير البيانات + + + + + Unknown error + خطأ غير معروف + + + + Could not open wallet: %1; %2 + فشل فتح المحفظة: %1; %2 + + + + Password not found + لم يتم العثور علي كلمة المرور + + + + Could not open keystore + فشل فتح مخزن المفاتيح + + + + Could not remove private key from keystore + فشل حذف المفتاح الخاص من مخزن المفاتيح + + + + QKeychain::JobPrivate + + + Unknown error + خطأ غير معروف + + + + Access to keychain denied + الولو سلسلة المفاتيح محظور + + + + QKeychain::PlainTextStore + + + Could not store data in settings: access error + فشل تخزين البيانات في الإعدادات: خطأ ولوج + + + + Could not store data in settings: format error + فشل تخزين البيانات في الإعدادات: خطأ في التنسيق + + + + Could not delete data from settings: access error + فشل في حذف البيانات من الإعدادات: خطأ ولوج + + + + Could not delete data from settings: format error + فشل حذف البيانات من الإعدادات: خطأ في التنسيق + + + + Entry not found + لم يتم العثور علي المدخلات + + + + QKeychain::ReadPasswordJobPrivate + + + Password entry not found + لم يتم العثور علي مدخلات كلمة المرور + + + + + Could not decrypt data + فشل فك تشفير البيانات + + + + D-Bus is not running + D-Bus لا يعمل + + + + + Unknown error + خطأ غير معروف + + + + No keychain service available + + + + + Could not open wallet: %1; %2 + فشل فتح المحفظة: %1; %2 + + + + Access to keychain denied + الولوج إلي سلسة المفاتيح محظور + + + + Could not determine data type: %1; %2 + فشل تحديد نوع البيانات: %1; %2 + + + + + Entry not found + لم يتم العثور علي المدخلات + + + + Unsupported entry type 'Map' + نوع مدخلات غير مٌدعم 'Map' + + + + Unknown kwallet entry type '%1' + نوع المدخلات kwaller غير معروف '%1' + + + + Password not found + لم يتم العثور علي كلمة المرور + + + + Could not open keystore + فشل في فتح مخزن المفاتيح + + + + Could not retrieve private key from keystore + فشل استرداد المفتاح الخاص من مخزن المفاتيح + + + + Could not create decryption cipher + فشل في إنشاء شفرة فك تشفير + + + + QKeychain::WritePasswordJobPrivate + + + Credential size exceeds maximum size of %1 + حجم الاعتماد يتجاوز الحجم الاقصي ل: %1 + + + + Credential key exceeds maximum size of %1 + مفتاح الاعتماد يتجاوز الحد الاقصي ل: %1 + + + + Writing credentials failed: Win32 error code %1 + فشل في كتابة الاعتماد: Win32 خطأ: %1 + + + + Encryption failed + فشل التشفير + + + + D-Bus is not running + D-Bus لا يعمل + + + + + Unknown error + خطأ غير معروف + + + + Could not open wallet: %1; %2 + فشل في فتح المحفظة: %1; %2 + + + + Password not found + لم يتم العثور علي كلمة المرور + + + + Could not open keystore + فشل في فتح مخزن المفاتيح + + + + Could not create private key generator + فشل ف إنشاء مولد المفاتيح الخاصة + + + + Could not generate new private key + فشل في إنشاء مفتاح خاص جديد + + + + Could not retrieve private key from keystore + فشل في استرداد مفتاح خاص من مخزن المفاتيح + + + + Could not create encryption cipher + فشل في إنشاء شفرة التشفير + + + + Could not encrypt data + فشل في تشفير الداتا + + + + QObject + + + Sftp service + خدمة Sftp + + + + No error + لا يوجد خطأ + + + + Unknown Error + خطأ غير معروف + + + + Function not implemented + لم يتم تنفيذ الوظيفة + + + + Server check failed + فشل في فحص الخادم + + + + Server port already used. Check for another software + منفذ الخادم بالفعل مٌستخدم, تحقق من باقي التطبيقات + + + + Server error: Docker container missing + خطأ من الخادم: حاوية Docker مفقودة + + + + Server error: Docker failed + خطأ من الخادم: فشل Docker + + + + Installation canceled by user + تم اغلاق التثبيت بواسطة المستخدم + + + + The user does not have permission to use sudo + ليس لدي المستخدم الصلحيات لأستخدام sudo + + + + Ssh request was denied + طلب Ssh محظو + + + + Ssh request was interrupted + إنقطع طلب Ssh + + + + Ssh internal error + مشكلة داخلية Ssh + + + + Invalid private key or invalid passphrase entered + مفتا ح خاص غير صحيح او عبارة مرور غير صحيحة + + + + The selected private key format is not supported, use openssh ED25519 key types or PEM key types + التنسيق المٌحدد للمفتاح الخاص غير مدعوم, استخدم نوع مفتاح openssh ED25519 او نوع مفتاح PEM + + + + Timeout connecting to server + انتهت مدة الاتصال بالخادم + + + + Sftp error: End-of-file encountered + + + + + Sftp error: File does not exist + خطأ Sftp: الملف غير موجود + + + + Sftp error: Permission denied + خطأ Sftp: تم حظر الصلحيات + + + + Sftp error: Generic failure + خطأ Sftp: فشل عام + + + + Sftp error: Garbage received from server + خطأ Sftp: تم استلام نفايات من الخادم + + + + Sftp error: No connection has been set up + خطأ Sftp: لم يتم إعداد اتصال + + + + Sftp error: There was a connection, but we lost it + خطأ Sftp: كان هناك اتصال, ولكن خسرناه + + + + Sftp error: Operation not supported by libssh yet + خطأ Sftp: العملية ليست مدعومة من libssh بعد + + + + Sftp error: Invalid file handle + + + + + Sftp error: No such file or directory path exists + خطأ Sftp: لا يوجد مسار ملف او مجلد مثل هذا + + + + Sftp error: An attempt to create an already existing file or directory has been made + خطأ Sftp: محاولة إنشاء ملف او مجلد موجود بالفعل + + + + Sftp error: Write-protected filesystem + خطأ Sftp: نظام كتابة الملفات محمي + + + + Sftp error: No media was in remote drive + خطأ Sftp: لا يوجد وسائط في القرص البعيد + + + + VPN connection error + + + + + Error when retrieving configuration from API + خطأ عند استرداد التكوين من API + + + + This config has already been added to the application + هذا التكوين بالفعل تمت إضافتة للبرنامج + + + + ErrorCode: %1. + + + + + OpenVPN config missing + OpenVpn تكوين مفقود + + + + OpenVPN management server error + OpenVpn خطأ في إدارة الخادم + + + + OpenVPN executable missing + OpenVpn executeable مفقود + + + + ShadowSocks (ss-local) executable missing + ShadowSocks (ss-local) executable مفقود + + + + Cloak (ck-client) executable missing + Cloak (ck-client) executable مفقود + + + + Amnezia helper service error + خطأ في خدمة مٌساعد Amnezia + + + + OpenSSL failed + فشل OpenSSL + + + + Can't connect: another VPN connection is active + لا يمكن الاتصال: هناك اتصال VPN اخر بالفعل يعمل + + + + Can't setup OpenVPN TAP network adapter + لا يمك نتثبيت محول شبكة OpenVPN TAP + + + + VPN pool error: no available addresses + VPN pool error: لا يوجد عنواين مٌتاحة + + + + The config does not contain any containers and credentials for connecting to the server + التكوين لا يحتوي علي اي حاويات و اعتماد للأتصال بالخادم + + + + Internal error + خطأ داخلي + + + + IPsec + + + + + + Website in Tor network + موقع في شبكة Tor + + + + Amnezia DNS + + + + + Sftp file sharing service + ملف Sftp: خدمة المشاركة + + + + OpenVPN is the most popular VPN protocol, with flexible configuration options. It uses its own security protocol with SSL/TLS for key exchange. + بروتوكول OpenVPN احد اشهر بروتوكولات VPN, مع مرونة في إعدادات التكوين. يستخدم بروتوكول امان خاص به مع SSL/TLS لتغير المفاتيح. + + + + ShadowSocks - masks VPN traffic, making it similar to normal web traffic, but it may be recognized by analysis systems in some highly censored regions. + بروتوكول ShadowSocks- يتنكر في حركة مرور VPN, يبدو ك حركة مرور الويب العادية +ولكن قد يتم التعرف عليه من خلال أنظمة التحليل في بعض المناطق شديدة الرقابة. + + + + 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. + بروتوكول OpenVPN over Cloak هو OpenVPN مع VPN يتنكر كحركة مرور على الويب ويوفر الحماية + ضد عمليات الكشف النشط. مثالية لتجاوز الحجب في المناطق ذات أعلى مستويات الرقابة. + + + + Create a file vault on your server to securely store and transfer files. + انشأ مخزن ملفات علي الخادم الخاص بك حتي تخزن الملفات و تنقلها بسرية. + + + + This is a combination of the OpenVPN protocol and the Cloak plugin designed specifically for protecting against blocking. + +OpenVPN provides a secure VPN connection by encrypting all internet traffic between the client and the server. + +Cloak protects OpenVPN from detection and blocking. + +Cloak can modify packet metadata so that it completely masks VPN traffic as normal web traffic, and also protects the VPN from detection by Active Probing. This makes it very resistant to being detected + +Immediately after receiving the first data packet, Cloak authenticates the incoming connection. If authentication fails, the plugin masks the server as a fake website and your VPN becomes invisible to analysis systems. + +If there is a extreme level of Internet censorship in your region, we advise you to use only OpenVPN over Cloak from the first connection + +* Available in the AmneziaVPN across all platforms +* High power consumption on mobile devices +* Flexible settings +* Not recognised by DPI analysis systems +* Works over TCP network protocol, 443 port. + + هذه مجموعة من بروتوكول OpenVPN و برنامج Cloak المساعد مٌصمم خصيصاً للحماية ضد الحجب + +يوفر OpenVPN اتصال VPN امن عن طريق تشفير جميع حركات المرور بين العميل والخادم + +Cloak يحمي OpenVPN من ان يٌكتشف والحجب + +يمكن ان يعدل Cloak حزمة البيانات حتي يجعل حركة مرور VPN تبدو بالكامل كحركة ويب طبيعية, +وايضاُ يحمي ال VPN من ان يٌكتشف عن طريق انظمة الكشف الفعالة. هذا يجعلة مقاوم جداُ لأن يٌكتشف + +فوراُ بعد استلام اول حزمة بيانات, يصادق Cloak الاتصال القادم. +إذا فشل التصادق, البرنامج المساعد يجعل الخادم يبدو ك موقع مزيف ويصبح ال VPN مخفي لأنظمة التحليل. + +إذا كان هناك رقابة شديدة علي الانترنت في منطقتك, نحن ننصحك بأن تستخدم OpenVPN over Cloak من اول اتصال + +* مٌتاح في AmneziaVPN عبر جميع المنصات +* استهلاك طاقة عالية علي اجهزة المحمول +* مرونة في الإعدادات +* لا يٌكتشف بواسطة انظمة تحليل DPI +* يعمل عبر بروتوكول شبكة TCK, منفذ 443. + + + + + A relatively new popular VPN protocol with a simplified architecture. +WireGuard provides stable VPN connection and high performance on all devices. It uses hard-coded encryption settings. WireGuard compared to OpenVPN has lower latency and better data transfer throughput. +WireGuard is very susceptible to blocking due to its distinct packet signatures. Unlike some other VPN protocols that employ obfuscation techniques, the consistent signature patterns of WireGuard packets can be more easily identified and thus blocked by advanced Deep Packet Inspection (DPI) systems and other network monitoring tools. + +* Available in the AmneziaVPN across all platforms +* Low power consumption +* Minimum number of settings +* Easily recognised by DPI analysis systems, susceptible to blocking +* Works over UDP network protocol. + بروتوكول VPN جديد وشارع ذو بنية مبسطة. +يوفر WireGuard اتصال VPN مستقر و اداء عالي علي جميع الاجهزة. يستعمل إعدادات تشفير معقدة. WireGuard مٌقارنة مع OpenVPN يتمتع بزمن وصول أقل وتحسين إنتاجية نقل البيانات. +بسبب توقيعات الحزمة المميزة WireGuard عرضة جداُ للحجب. علي عكس باقي برتوكولات VPN التي تستعمل تقنيات تشويش. حزمة أنماط التوقيع المتسقة الخاصة ب WireGuard يمكن التعرف عليها بسهولة ولذلك تٌحجب بواسطة أنظمة الفحص العميق للحزم (DPI) المتقدمة وأدوات مراقبة الشبكة الأخرى. + +* مٌتاح في AmneziaVPN عبر جميع المنصات +* استهلاك قليل للطاقة +* عدد قليل من الإعدادات +سهل التعرف علية بواسطة انظمة تحليل DPI, عرضة للحجب +* يعمل عبر بروتوكول شبكة UDP. + + + + WireGuard - New popular VPN protocol with high performance, high speed and low power consumption. Recommended for regions with low levels of censorship. + بروتوكول WireGuard - بروتوكول شائع ب اداء عالي, سرعة عالية واستهلاك قليل للطاقة. ينصح للمناطق ذات مستوي منخفض من الرقابة. + + + + AmneziaWG - Special protocol from Amnezia, based on WireGuard. It's fast like WireGuard, but very resistant to blockages. Recommended for regions with high levels of censorship. + بروتوكول AmneziaWG - بروتوكول خاص من Amnezia, يعتمد علي WireGuard. سريع مثل WireGuard, لكن مقاوم جداً للحجب. ينصح للمناطق ذات مستوي عالي من الرقابة. + + + + 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. + بروتوكول IKEv2 - بروتوكول مستقر حديث, اسرع بقليل من الباقي, يسترجع الاتصال بعد خسارة الاشارة. لدية يتمتع بدعم أصلي على أحدث إصدارات Android وiOS. + + + + Deploy a WordPress site on the Tor network in two clicks. + انشر موقع WordPress علي شبكة Tor في ضغطتين. + + + + Replace the current DNS server with your own. This will increase your privacy level. + استبدل خادم ال DNS الحالي مع الخادم الخاص بك, هذا سيزيد من خصوصيتك. + + + + OpenVPN stands as one of the most popular and time-tested VPN protocols available. +It employs its unique security protocol, leveraging the strength of SSL/TLS for encryption and key exchange. Furthermore, OpenVPN's support for a multitude of authentication methods makes it versatile and adaptable, catering to a wide range of devices and operating systems. Due to its open-source nature, OpenVPN benefits from extensive scrutiny by the global community, which continually reinforces its security. With a strong balance of performance, security, and compatibility, OpenVPN remains a top choice for privacy-conscious individuals and businesses alike. + +* Available in the AmneziaVPN across all platforms +* Normal power consumption on mobile devices +* Flexible customisation to suit user needs to work with different operating systems and devices +* Recognised by DPI analysis systems and therefore susceptible to blocking +* Can operate over both TCP and UDP network protocols. + يبقا OpenVPN كأحد اشهر بروتوكولات VPN و التي تم اختبارها عبر الزمن. +ينشأ بروتوكول امان مميز, يستفيد من SSL/TLS للتشفير و تغير المفاتيح. واكثر من ذلك, OpenVpn يدعم تعدد طرق المصادقة يجعلة متعدد الاستخدامات وقابلة للتكيف, تلبية مجموعة واسعة من الأجهزة وأنظمة التشغيل. بسبب طبيعتة مفتوحة المصدر, يستفيد OpenVPN من التدقيق الشامل من قبل المجتمع العالمي, مما يعزز أمنها باستمرار. مع توازن قوي بين الأداء والأمان والتوافق, يظل OpenVPN الخيار الأفضل للأفراد والشركات المهتمين بالخصوصية على حدٍ سواء. + +* مٌتاح في AmneziaVPN عبر جميع المنصات +* استهلاك طاقة عادي علي اجهزة المحمول +* مرونة في التخصيص كي يلائم احتياجات المستخدم حتي يعمل مع انظمة تشغيل واجهزة مختلفة +* يٌلاحظ بواسطة انظمة تحليل DPI و لذلك عرضة للحجب +* يمكن ان يعمل علي بروتوكولات شبكة TCP و UDP. + + + + 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'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'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. + Shadowsocks, مستوحي من بروتوكول SOCKS5, يحمي الاتصال بأستعمال شفرة AEAD. كذلك Shadowsocks صٌمم كي يكون متحفظاً ويصعب تحديدة, إنه ليس مطابقًا لاتصال HTTPS القياسي. عمتاُ. بعض انظمة تحليل حركات المرور قد تتعرف علي اتصال Shadowsocks. بسبب الدعم المحدود في Amnezia, يٌنصح بأستخدام بروتوكول AmneziaWG. + +* مٌتاح في AmneziaVPN عبر جميع المنصات +* استهلاك طاقة عادي علي اجهزة المحمول + +* بروتوكول تشفير قابل للتكوين +* قابل للكشف بواسطة بعض انظمة DPI +* يعمل عبر بروتوكول شبكة TCP. + + + + A modern iteration of the popular VPN protocol, AmneziaWG builds upon the foundation set by WireGuard, retaining its simplified architecture and high-performance capabilities across devices. +While WireGuard is known for its efficiency, it had issues with being easily detected due to its distinct packet signatures. AmneziaWG solves this problem by using better obfuscation methods, making its traffic blend in with regular internet traffic. +This means that AmneziaWG keeps the fast performance of the original while adding an extra layer of stealth, making it a great choice for those wanting a fast and discreet VPN connection. + +* Available in the AmneziaVPN across all platforms +* Low power consumption +* Minimum number of settings +* Not recognised by DPI analysis systems, resistant to blocking +* Works over UDP network protocol. + لفة سريعة من بروتوكولات VPN الحديثة والشائعة, يٌبني AmneziaWG علي الاساس الموضع من قبل WireGuard, مع الاحتفاظ ببنيته المبسطة وقدرات الأداء العالي عبر الاجهزة. +بينما WireGuard معروف بأدائة العالي. لدية مشاكل مع سهولة التعرف علية بسبب توقيعات الحزمة المميزة الخاصة بة. يٌصلح AmneziaWG هذه المشكلة عن طريق استخدام طرق تشويش افضل, يجعل حركة المرور تبقا مع حركة مرور انترنت عادية. +هذا يعني ان AmneziaWG يبقا الاداء العالي الاساسي بينما يضيف طبقة من العزل, هذا يجعلة اختيار ممتاز لهولاء الذين يريدون اتصال VPN سريع و متخفي. + +* مٌتاح في AmneziaVPN علي جميع المنصات +* استهلاك طاقة قليل +* اقل عدد من الإعدادات +* لا يٌكتشف من قبل انظمة تحليل DPI, مقاوم للحجب +* يعمل عبر بروتوكول شبكة UDP. + + + + IKEv2, paired with the IPSec encryption layer, stands as a modern and stable VPN protocol. +One of its distinguishing features is its ability to swiftly switch between networks and devices, making it particularly adaptive in dynamic network environments. +While it offers a blend of security, stability, and speed, it's essential to note that IKEv2 can be easily detected and is susceptible to blocking. + +* Available in the AmneziaVPN only on Windows +* Low power consumption, on mobile devices +* Minimal configuration +* Recognised by DPI analysis systems +* Works over UDP network protocol, ports 500 and 4500. + IKEv2, مقترن مع طبقة التشفير IPSec, يبقا بروتوكول VPN مستقر و حديث. +من مميزاتةقدرته على التبديل بسرعة بين الشبكات والأجهزة، مما يجعله قابلاً للتكيف بشكل خاص في بيئات الشبكات الديناميكية. + +*. مٌتاح في AmneziaVPN فقط علي منصة وندوز +* استهلاك طاقة قليل, علي اجهزة المحمول +* اقل تكوين +* يٌلاحظ بواسطة انظمة تحليل DPI +* يعمل عبر بروتوكول شبكة UDP, منفذ 500 و منفذ 4500. + + + + DNS Service + خدمة ال DNS + + + + Sftp file sharing service - is secure FTP service + خدمة نشر ملف Sftp - هي خدمة FTP امنة + + + + Entry not found + لم يتم العثور علي مدخلات + + + + Access to keychain denied + الولوج ل سلسلة المفاتيح محظور + + + + No keyring daemon + + + + + Already unlocked + بالفعل تم فتحة + + + + No such keyring + لا يوجد مثل هذه المفاتيح + + + + Bad arguments + معطيات سيئة + + + + I/O error + I/0 خطأ + + + + Cancelled + تم إغلاقة + + + + Keyring already exists + المفتاح موجود بالفعل + + + + No match + لا تطباق + + + + Unknown error + خطأ غير معروف + + + + error 0x%1: %2 + خطأ %1: %2 + + + + SelectLanguageDrawer + + + Choose language + اختر لغة + + + + Settings + + + Server #1 + خادم #1 + + + + + Server + خادم + + + + SettingsController + + + Software version + إصدار البرنامج + + + + Backup file is corrupted + ملف النسخه الاحتياطيه تالف + + + + All settings have been reset to default values + تم استرجاع جميع الإعدادات للإعدادات الافتراضية + + + + Cached profiles cleared + تم حذف الملفات الشخصية المٌخزنة مؤقتاُ + + + + ShareConnectionDrawer + + + + Save AmneziaVPN config + احفظ تكوين AmneziaVPN + + + + Share + شارك + + + + Copy + انسخ + + + + + Copied + تم النسخ + + + + Copy config string + انسخ نص التكوين + + + + Show connection settings + اظهر إعدادات الاتصال + + + Show content + 展示内容 + + + + To read the QR code in the Amnezia app, select "Add server" → "I have data to connect" → "QR code, key or settings file" + حتي تقرأ رمز ال QR في تطبيق Amnezia, اختار "إضافة خادم" - "لدي بيانات الاتصال" - "رمز Qr, او مفتاح تعريف او ملف إعدادات" + + + + SitesController + + + Hostname not look like ip adress or domain name + اسم المضيف لا يشبه عنوان IP أو اسم ال domain + + + + New site added: %1 + تمت إضافة موقع جديد: %1 + + + + Site removed: %1 + تم حذف الموقع: %1 + + + + Can't open file: %1 + لا يمكن فتح ملف: %1 + + + + Failed to parse JSON data from file: %1 + فشل قراءه بيانات JSON من الملف: %1 + + + + The JSON data is not an array in file: %1 + بيانات ال JSON ليست مصفوفة في الملف: %1 + + + + Import completed + اكتمل الاستيراد + + + + Export completed + اكتمل التصدير + + + + SystemTrayNotificationHandler + + + + Show + اظهر + + + + + Connect + اتصل + + + + + Disconnect + اقطع الاتصال + + + + + Visit Website + زور الموقع + + + + + Quit + اغلاق + + + + TextFieldWithHeaderType + + + The field can't be empty + الحقل لا يمكن ان يكون فارغ + + + + VpnConnection + + + Mbps + + + + + VpnProtocol + + + Unknown + غير معرف + + + + Disconnected + انقطع الاتصال + + + + Preparing + جاري التحضير + + + + Connecting... + جاري الاتصال... + + + + Connected + تم الاتصال + + + + Disconnecting... + جاري قطع الاتصال... + + + + Reconnecting... + جاري إعادة الاتصال... + + + + Error + خطأ + + + + amnezia::ContainerProps + + + Low + منخفض + + + + Medium or High + متوسط او عالي + + + + Extreme + شديد + + + + I just want to increase the level of my privacy. + انا فقط اريد زيادة مستوي الخصوصية. + + + + I want to bypass censorship. This option recommended in most cases. + أريد تجاوز الرقابة. يوصى بهذا الخيار في معظم الحالات. + + + + Most VPN protocols are blocked. Recommended if other options are not working. + يتم حظر معظم بروتوكولات VPN. يوصى به إذا كانت الخيارات الأخرى لا تعمل. + + + + main2 + + + Private key passphrase + عبارة المرور الخاصة بالمفتاح + + + + Save + احفظ + + + diff --git a/client/ui/models/languageModel.cpp b/client/ui/models/languageModel.cpp index c3552ea7..47e41708 100644 --- a/client/ui/models/languageModel.cpp +++ b/client/ui/models/languageModel.cpp @@ -45,6 +45,7 @@ QString LanguageModel::getLocalLanguageName(const LanguageSettings::AvailableLan case LanguageSettings::AvailableLanguageEnum::Russian: strLanguage = "Русский"; break; case LanguageSettings::AvailableLanguageEnum::China_cn: strLanguage = "\347\256\200\344\275\223\344\270\255\346\226\207"; break; case LanguageSettings::AvailableLanguageEnum::Persian: strLanguage = "فارسی"; break; + case LanguageSettings::AvailableLanguageEnum::Arabic: strLanguage = "العربية"; break; default: break; } @@ -59,6 +60,7 @@ void LanguageModel::changeLanguage(const LanguageSettings::AvailableLanguageEnum case LanguageSettings::AvailableLanguageEnum::Russian: emit updateTranslations(QLocale::Russian); break; case LanguageSettings::AvailableLanguageEnum::China_cn: emit updateTranslations(QLocale::Chinese); break; case LanguageSettings::AvailableLanguageEnum::Persian: emit updateTranslations(QLocale::Persian); break; + case LanguageSettings::AvailableLanguageEnum::Arabic: emit updateTranslations(QLocale::Arabic); break; default: emit updateTranslations(QLocale::English); break; } } @@ -71,6 +73,7 @@ int LanguageModel::getCurrentLanguageIndex() case QLocale::Russian: return static_cast(LanguageSettings::AvailableLanguageEnum::Russian); break; case QLocale::Chinese: return static_cast(LanguageSettings::AvailableLanguageEnum::China_cn); break; case QLocale::Persian: return static_cast(LanguageSettings::AvailableLanguageEnum::Persian); break; + case QLocale::Arabic: return static_cast(LanguageSettings::AvailableLanguageEnum::Arabic); break; default: return static_cast(LanguageSettings::AvailableLanguageEnum::English); break; } } diff --git a/client/ui/models/languageModel.h b/client/ui/models/languageModel.h index 8a55263c..b07a5c78 100644 --- a/client/ui/models/languageModel.h +++ b/client/ui/models/languageModel.h @@ -13,7 +13,8 @@ namespace LanguageSettings English, Russian, China_cn, - Persian + Persian, + Arabic }; Q_ENUM_NS(AvailableLanguageEnum) From 074562b14126dab43c408148603900e224059bbb Mon Sep 17 00:00:00 2001 From: Nethius Date: Fri, 16 Feb 2024 15:24:06 +0500 Subject: [PATCH 09/36] feature/custom-drawer (#563) Replaced all the DrawerType with DrawerType2 --- client/resources.qrc | 2 +- client/ui/controllers/pageController.cpp | 30 - client/ui/controllers/pageController.h | 11 - .../ConnectionTypeSelectionDrawer.qml | 16 +- .../qml/Components/HomeContainersListView.qml | 4 +- client/ui/qml/Components/QuestionDrawer.qml | 23 +- .../qml/Components/SelectLanguageDrawer.qml | 181 ++--- .../qml/Components/ShareConnectionDrawer.qml | 179 +++-- client/ui/qml/Controls2/DrawerType.qml | 84 --- client/ui/qml/Controls2/DrawerType2.qml | 241 ++++++ client/ui/qml/Controls2/DropDownType.qml | 98 +-- client/ui/qml/Pages2/PageHome.qml | 713 +++++++----------- .../ui/qml/Pages2/PageProtocolAwgSettings.qml | 20 +- .../qml/Pages2/PageProtocolCloakSettings.qml | 4 +- .../Pages2/PageProtocolOpenVpnSettings.qml | 29 +- client/ui/qml/Pages2/PageProtocolRaw.qml | 125 +-- .../PageProtocolShadowSocksSettings.qml | 4 +- .../ui/qml/Pages2/PageServiceDnsSettings.qml | 19 +- .../ui/qml/Pages2/PageServiceSftpSettings.qml | 19 +- .../Pages2/PageServiceTorWebsiteSettings.qml | 19 +- .../ui/qml/Pages2/PageSettingsApplication.qml | 32 +- client/ui/qml/Pages2/PageSettingsBackup.qml | 19 +- client/ui/qml/Pages2/PageSettingsDns.qml | 18 +- client/ui/qml/Pages2/PageSettingsLogging.qml | 19 +- .../ui/qml/Pages2/PageSettingsServerData.qml | 89 +-- .../ui/qml/Pages2/PageSettingsServerInfo.qml | 27 +- .../qml/Pages2/PageSettingsServerProtocol.qml | 23 +- .../qml/Pages2/PageSettingsSplitTunneling.qml | 272 +++---- client/ui/qml/Pages2/PageSetupWizardEasy.qml | 1 - .../PageSetupWizardProtocolSettings.qml | 110 +-- client/ui/qml/Pages2/PageSetupWizardStart.qml | 8 +- client/ui/qml/Pages2/PageShare.qml | 90 +-- client/ui/qml/Pages2/PageShareFullAccess.qml | 18 +- client/ui/qml/Pages2/PageStart.qml | 26 - client/ui/qml/main2.qml | 77 +- 35 files changed, 1331 insertions(+), 1319 deletions(-) delete mode 100644 client/ui/qml/Controls2/DrawerType.qml create mode 100644 client/ui/qml/Controls2/DrawerType2.qml diff --git a/client/resources.qrc b/client/resources.qrc index dfadcb20..59a540cc 100644 --- a/client/resources.qrc +++ b/client/resources.qrc @@ -160,7 +160,6 @@ ui/qml/Components/SettingsContainersListView.qml ui/qml/Controls2/TextTypes/ListItemTitleType.qml ui/qml/Controls2/DividerType.qml - ui/qml/Controls2/DrawerType.qml ui/qml/Controls2/StackViewType.qml ui/qml/Pages2/PageSettings.qml images/controls/amnezia.svg @@ -225,5 +224,6 @@ ui/qml/Pages2/PageShareFullAccess.qml images/controls/close.svg images/controls/search.svg + ui/qml/Controls2/DrawerType2.qml diff --git a/client/ui/controllers/pageController.cpp b/client/ui/controllers/pageController.cpp index 105f2115..467da3ac 100644 --- a/client/ui/controllers/pageController.cpp +++ b/client/ui/controllers/pageController.cpp @@ -118,36 +118,6 @@ void PageController::showOnStartup() } } -void PageController::updateDrawerRootPage(PageLoader::PageEnum page) -{ - m_drawerLayer = 0; - m_currentRootPage = page; -} - -void PageController::goToDrawerRootPage() -{ - - m_drawerLayer = 0; - - emit showTopCloseButton(false); - emit forceCloseDrawer(); -} - -void PageController::drawerOpen() -{ - m_drawerLayer = m_drawerLayer + 1; - emit showTopCloseButton(true); -} - -void PageController::drawerClose() -{ - m_drawerLayer = m_drawerLayer -1; - if (m_drawerLayer <= 0) { - emit showTopCloseButton(false); - m_drawerLayer = 0; - } -} - bool PageController::isTriggeredByConnectButton() { return m_isTriggeredByConnectButton; diff --git a/client/ui/controllers/pageController.h b/client/ui/controllers/pageController.h index f7e697fb..5c0909fb 100644 --- a/client/ui/controllers/pageController.h +++ b/client/ui/controllers/pageController.h @@ -82,11 +82,6 @@ public slots: void showOnStartup(); - void updateDrawerRootPage(PageLoader::PageEnum page); - void goToDrawerRootPage(); - void drawerOpen(); - void drawerClose(); - bool isTriggeredByConnectButton(); void setTriggeredBtConnectButton(bool trigger); @@ -118,17 +113,11 @@ signals: void showPassphraseRequestDrawer(); void passphraseRequestDrawerClosed(QString passphrase); - void showTopCloseButton(bool visible); - void forceCloseDrawer(); - private: QSharedPointer m_serversModel; std::shared_ptr m_settings; - PageLoader::PageEnum m_currentRootPage; - int m_drawerLayer; - bool m_isTriggeredByConnectButton; }; diff --git a/client/ui/qml/Components/ConnectionTypeSelectionDrawer.qml b/client/ui/qml/Components/ConnectionTypeSelectionDrawer.qml index 1f7b2f29..d9dc21f4 100644 --- a/client/ui/qml/Components/ConnectionTypeSelectionDrawer.qml +++ b/client/ui/qml/Components/ConnectionTypeSelectionDrawer.qml @@ -8,18 +8,24 @@ import "../Controls2" import "../Controls2/TextTypes" import "../Config" -DrawerType { +DrawerType2 { id: root width: parent.width - height: parent.height * 0.4375 + height: parent.height + + expandedContent: ColumnLayout { + id: content - ColumnLayout { anchors.top: parent.top anchors.left: parent.left anchors.right: parent.right spacing: 0 + Component.onCompleted: { + root.expandedHeight = content.implicitHeight + 32 + } + Header2Type { Layout.fillWidth: true Layout.topMargin: 24 @@ -40,7 +46,7 @@ DrawerType { clickedFunction: function() { PageController.goToPage(PageEnum.PageSetupWizardCredentials) - root.visible = false + root.close() } } @@ -54,7 +60,7 @@ DrawerType { clickedFunction: function() { PageController.goToPage(PageEnum.PageSetupWizardConfigSource) - root.visible = false + root.close() } } diff --git a/client/ui/qml/Components/HomeContainersListView.qml b/client/ui/qml/Components/HomeContainersListView.qml index cca17c6f..0a431ff5 100644 --- a/client/ui/qml/Components/HomeContainersListView.qml +++ b/client/ui/qml/Components/HomeContainersListView.qml @@ -60,7 +60,7 @@ ListView { } if (checked) { - containersDropDown.menuVisible = false + containersDropDown.close() ServersModel.setDefaultContainer(ServersModel.defaultIndex, proxyContainersModel.mapToSource(index)) } else { if (!isSupported && isInstalled) { @@ -71,7 +71,7 @@ ListView { ContainersModel.setCurrentlyProcessedContainerIndex(proxyContainersModel.mapToSource(index)) InstallController.setShouldCreateServer(false) PageController.goToPage(PageEnum.PageSetupWizardProtocolSettings) - containersDropDown.menuVisible = false + containersDropDown.close() } } diff --git a/client/ui/qml/Components/QuestionDrawer.qml b/client/ui/qml/Components/QuestionDrawer.qml index 16cdcb39..23592a3b 100644 --- a/client/ui/qml/Components/QuestionDrawer.qml +++ b/client/ui/qml/Components/QuestionDrawer.qml @@ -5,7 +5,7 @@ import QtQuick.Layouts import "../Controls2" import "../Controls2/TextTypes" -DrawerType { +DrawerType2 { id: root property string headerText @@ -16,23 +16,24 @@ DrawerType { property var yesButtonFunction property var noButtonFunction - width: parent.width - height: content.implicitHeight + 32 - - ColumnLayout { + expandedContent: ColumnLayout { id: content anchors.top: parent.top anchors.left: parent.left anchors.right: parent.right - anchors.topMargin: 16 - anchors.rightMargin: 16 - anchors.leftMargin: 16 spacing: 8 + onImplicitHeightChanged: { + root.expandedHeight = content.implicitHeight + 32 + } + Header2TextType { Layout.fillWidth: true + Layout.topMargin: 16 + Layout.rightMargin: 16 + Layout.leftMargin: 16 text: headerText } @@ -40,6 +41,8 @@ DrawerType { ParagraphTextType { Layout.fillWidth: true Layout.topMargin: 8 + Layout.rightMargin: 16 + Layout.leftMargin: 16 text: descriptionText } @@ -47,6 +50,8 @@ DrawerType { BasicButtonType { Layout.fillWidth: true Layout.topMargin: 16 + Layout.rightMargin: 16 + Layout.leftMargin: 16 text: yesButtonText @@ -59,6 +64,8 @@ DrawerType { BasicButtonType { Layout.fillWidth: true + Layout.rightMargin: 16 + Layout.leftMargin: 16 defaultColor: "transparent" hoveredColor: Qt.rgba(1, 1, 1, 0.08) diff --git a/client/ui/qml/Components/SelectLanguageDrawer.qml b/client/ui/qml/Components/SelectLanguageDrawer.qml index d318aab8..260a3a98 100644 --- a/client/ui/qml/Components/SelectLanguageDrawer.qml +++ b/client/ui/qml/Components/SelectLanguageDrawer.qml @@ -5,129 +5,136 @@ import QtQuick.Layouts import "../Controls2" import "../Controls2/TextTypes" -DrawerType { +DrawerType2 { id: root - width: parent.width - height: parent.height * 0.9 + expandedContent: Item { + id: container - ColumnLayout { - id: backButton + implicitHeight: root.height * 0.9 - anchors.top: parent.top - anchors.left: parent.left - anchors.right: parent.right - anchors.topMargin: 16 - - BackButtonType { - backButtonImage: "qrc:/images/controls/arrow-left.svg" - backButtonFunction: function() { - root.close() - } + Component.onCompleted: { + root.expandedHeight = container.implicitHeight } - } - - FlickableType { - anchors.top: backButton.bottom - anchors.left: parent.left - anchors.right: parent.right - anchors.bottom: parent.bottom - contentHeight: content.implicitHeight ColumnLayout { - id: content + id: backButton - anchors.fill: parent + anchors.top: parent.top + anchors.left: parent.left + anchors.right: parent.right + anchors.topMargin: 16 - Header2Type { - id: header - Layout.fillWidth: true - Layout.topMargin: 16 - Layout.rightMargin: 16 - Layout.leftMargin: 16 - - headerText: qsTr("Choose language") + BackButtonType { + backButtonImage: "qrc:/images/controls/arrow-left.svg" + backButtonFunction: function() { + root.close() + } } + } - ListView { - id: listView + FlickableType { + anchors.top: backButton.bottom + anchors.left: parent.left + anchors.right: parent.right + anchors.bottom: parent.bottom + contentHeight: content.implicitHeight - Layout.fillWidth: true - height: listView.contentItem.height + ColumnLayout { + id: content - clip: true - interactive: false + anchors.fill: parent - model: LanguageModel - currentIndex: LanguageModel.currentLanguageIndex + Header2Type { + id: header + Layout.fillWidth: true + Layout.topMargin: 16 + Layout.rightMargin: 16 + Layout.leftMargin: 16 - ButtonGroup { - id: buttonGroup + headerText: qsTr("Choose language") } - delegate: Item { - implicitWidth: root.width - implicitHeight: delegateContent.implicitHeight + ListView { + id: listView - ColumnLayout { - id: delegateContent + Layout.fillWidth: true + height: listView.contentItem.height - anchors.fill: parent + clip: true + interactive: false - RadioButton { - id: radioButton + model: LanguageModel + currentIndex: LanguageModel.currentLanguageIndex - implicitWidth: parent.width - implicitHeight: radioButtonContent.implicitHeight + ButtonGroup { + id: buttonGroup + } - hoverEnabled: true + delegate: Item { + implicitWidth: root.width + implicitHeight: delegateContent.implicitHeight - indicator: Rectangle { - anchors.fill: parent - color: radioButton.hovered ? "#2C2D30" : "#1C1D21" + ColumnLayout { + id: delegateContent - Behavior on color { - PropertyAnimation { duration: 200 } - } - } + anchors.fill: parent - RowLayout { - id: radioButtonContent - anchors.fill: parent + RadioButton { + id: radioButton - anchors.rightMargin: 16 - anchors.leftMargin: 16 + implicitWidth: parent.width + implicitHeight: radioButtonContent.implicitHeight - spacing: 0 + hoverEnabled: true - z: 1 + indicator: Rectangle { + anchors.fill: parent + color: radioButton.hovered ? "#2C2D30" : "#1C1D21" - ParagraphTextType { - Layout.fillWidth: true - Layout.topMargin: 20 - Layout.bottomMargin: 20 - - text: languageName + Behavior on color { + PropertyAnimation { duration: 200 } + } } - Image { - source: "qrc:/images/controls/check.svg" - visible: radioButton.checked + RowLayout { + id: radioButtonContent + anchors.fill: parent - width: 24 - height: 24 + anchors.rightMargin: 16 + anchors.leftMargin: 16 - Layout.rightMargin: 8 + spacing: 0 + + z: 1 + + ParagraphTextType { + Layout.fillWidth: true + Layout.topMargin: 20 + Layout.bottomMargin: 20 + + text: languageName + } + + Image { + source: "qrc:/images/controls/check.svg" + visible: radioButton.checked + + width: 24 + height: 24 + + Layout.rightMargin: 8 + } } - } - ButtonGroup.group: buttonGroup - checked: listView.currentIndex === index + ButtonGroup.group: buttonGroup + checked: listView.currentIndex === index - onClicked: { - listView.currentIndex = index - LanguageModel.changeLanguage(languageIndex) - root.close() + onClicked: { + listView.currentIndex = index + LanguageModel.changeLanguage(languageIndex) + root.close() + } } } } diff --git a/client/ui/qml/Components/ShareConnectionDrawer.qml b/client/ui/qml/Components/ShareConnectionDrawer.qml index 45ef84a6..a33dc7ee 100644 --- a/client/ui/qml/Components/ShareConnectionDrawer.qml +++ b/client/ui/qml/Components/ShareConnectionDrawer.qml @@ -16,19 +16,18 @@ import "../Controls2/TextTypes" import "../Config" import "../Components" -DrawerType { +DrawerType2 { id: root - property alias headerText: header.headerText - property alias configContentHeaderText: configContentHeader.headerText - property alias contentVisible: content.visible + property string headerText + property string configContentHeaderText + property string contentVisible property string configExtension: ".vpn" property string configCaption: qsTr("Save AmneziaVPN config") property string configFileName: "amnezia_config" - width: parent.width - height: parent.height * 0.9 + expandedHeight: parent.height * 0.9 onClosed: { configExtension = ".vpn" @@ -36,8 +35,8 @@ DrawerType { configFileName = "amnezia_config" } - Item { - anchors.fill: parent + expandedContent: Item { + implicitHeight: root.expandedHeight Header2Type { id: header @@ -47,6 +46,8 @@ DrawerType { anchors.topMargin: 20 anchors.leftMargin: 16 anchors.rightMargin: 16 + + headerText: root.headerText } FlickableType { @@ -64,6 +65,8 @@ DrawerType { anchors.leftMargin: 16 anchors.rightMargin: 16 + visible: root.contentVisible + BasicButtonType { Layout.fillWidth: true Layout.topMargin: 16 @@ -91,6 +94,7 @@ DrawerType { } BasicButtonType { + id: copyConfigTextButton Layout.fillWidth: true Layout.topMargin: 8 @@ -103,20 +107,14 @@ DrawerType { text: qsTr("Copy") imageSource: "qrc:/images/controls/copy.svg" - - onClicked: { - configText.selectAll() - configText.copy() - configText.select(0, 0) - PageController.showNotificationMessage(qsTr("Copied")) - } } BasicButtonType { + id: copyNativeConfigStringButton Layout.fillWidth: true Layout.topMargin: 8 - visible: nativeConfigString.text !== "" + visible: false defaultColor: "transparent" hoveredColor: Qt.rgba(1, 1, 1, 0.08) @@ -127,13 +125,6 @@ DrawerType { text: qsTr("Copy config string") imageSource: "qrc:/images/controls/copy.svg" - - onClicked: { - nativeConfigString.selectAll() - nativeConfigString.copy() - nativeConfigString.select(0, 0) - PageController.showNotificationMessage(qsTr("Copied")) - } } BasicButtonType { @@ -150,82 +141,116 @@ DrawerType { text: qsTr("Show connection settings") onClicked: { - configContentDrawer.visible = true + configContentDrawer.open() } } - DrawerType { + DrawerType2 { id: configContentDrawer - width: parent.width - height: parent.height * 0.9 + parent: root.parent - BackButtonType { - id: backButton + anchors.fill: parent + expandedHeight: parent.height * 0.9 - anchors.top: parent.top - anchors.left: parent.left - anchors.right: parent.right - anchors.topMargin: 16 + expandedContent: Item { + id: configContentContainer - backButtonFunction: function() { - configContentDrawer.visible = false + implicitHeight: configContentDrawer.expandedHeight + + Connections { + target: copyNativeConfigStringButton + function onClicked() { + nativeConfigString.selectAll() + nativeConfigString.copy() + nativeConfigString.select(0, 0) + PageController.showNotificationMessage(qsTr("Copied")) + } } - } - FlickableType { - anchors.top: backButton.bottom - anchors.left: parent.left - anchors.right: parent.right - anchors.bottom: parent.bottom - contentHeight: configContent.implicitHeight + configContent.anchors.topMargin + configContent.anchors.bottomMargin - - ColumnLayout { - id: configContent - - anchors.fill: parent - anchors.rightMargin: 16 - anchors.leftMargin: 16 - - Header2Type { - id: configContentHeader - Layout.fillWidth: true - Layout.topMargin: 16 + Connections { + target: copyConfigTextButton + function onClicked() { + configText.selectAll() + configText.copy() + configText.select(0, 0) + PageController.showNotificationMessage(qsTr("Copied")) } + } - TextField { - id: nativeConfigString - visible: false - text: ExportController.nativeConfigString + BackButtonType { + id: backButton + + anchors.top: parent.top + anchors.left: parent.left + anchors.right: parent.right + anchors.topMargin: 16 + + backButtonFunction: function() { + configContentDrawer.open() } + } - TextArea { - id: configText + FlickableType { + anchors.top: backButton.bottom + anchors.left: parent.left + anchors.right: parent.right + anchors.bottom: parent.bottom + contentHeight: configContent.implicitHeight + configContent.anchors.topMargin + configContent.anchors.bottomMargin - Layout.fillWidth: true - Layout.topMargin: 16 - Layout.bottomMargin: 16 + ColumnLayout { + id: configContent - padding: 0 - leftPadding: 0 - height: 24 + anchors.fill: parent + anchors.rightMargin: 16 + anchors.leftMargin: 16 - readOnly: true + Header2Type { + id: configContentHeader + Layout.fillWidth: true + Layout.topMargin: 16 - color: "#D7D8DB" - selectionColor: "#633303" - selectedTextColor: "#D7D8DB" + headerText: root.configContentHeaderText + } - font.pixelSize: 16 - font.weight: Font.Medium - font.family: "PT Root UI VF" + TextField { + id: nativeConfigString + visible: false + text: ExportController.nativeConfigString - text: ExportController.config + onTextChanged: { + copyNativeConfigStringButton.visible = nativeConfigString.text !== "" + } + } - wrapMode: Text.Wrap + TextArea { + id: configText - background: Rectangle { - color: "transparent" + Layout.fillWidth: true + Layout.topMargin: 16 + Layout.bottomMargin: 16 + + padding: 0 + leftPadding: 0 + height: 24 + + readOnly: true + + color: "#D7D8DB" + selectionColor: "#633303" + selectedTextColor: "#D7D8DB" + + font.pixelSize: 16 + font.weight: Font.Medium + font.family: "PT Root UI VF" + + text: ExportController.config + + wrapMode: Text.Wrap + + background: Rectangle { + color: "transparent" + } } } } diff --git a/client/ui/qml/Controls2/DrawerType.qml b/client/ui/qml/Controls2/DrawerType.qml deleted file mode 100644 index 830f59f9..00000000 --- a/client/ui/qml/Controls2/DrawerType.qml +++ /dev/null @@ -1,84 +0,0 @@ -import QtQuick -import QtQuick.Controls - -import "../Config" - -Drawer { - id: drawer - property bool needCloseButton: true - - Connections { - target: PageController - - function onForceCloseDrawer() { - visible = false - } - } - - edge: Qt.BottomEdge - - clip: true - modal: true - dragMargin: -10 - - enter: Transition { - SmoothedAnimation { - velocity: 4 - } - } - - exit: Transition { - SmoothedAnimation { - velocity: 4 - } - } - - background: Rectangle { - anchors.fill: parent - anchors.bottomMargin: -radius - radius: 16 - color: "#1C1D21" - - border.color: "#2C2D30" - border.width: 1 - - Rectangle { - visible: GC.isMobile() - - anchors.top: parent.top - anchors.horizontalCenter: parent.horizontalCenter - anchors.topMargin: 10 - - width: 20 - height: 2 - color: "#2C2D30" - } - } - - Overlay.modal: Rectangle { - color: Qt.rgba(14/255, 14/255, 17/255, 0.8) - } - - onAboutToShow: { - if (PageController.getInitialPageNavigationBarColor() !== 0xFF1C1D21) { - PageController.updateNavigationBarColor(0xFF1C1D21) - } - } - - onOpened: { - if (needCloseButton) { - PageController.drawerOpen() - } - } - - onClosed: { - if (needCloseButton) { - PageController.drawerClose() - } - - var initialPageNavigationBarColor = PageController.getInitialPageNavigationBarColor() - if (initialPageNavigationBarColor !== 0xFF1C1D21) { - PageController.updateNavigationBarColor(initialPageNavigationBarColor) - } - } -} diff --git a/client/ui/qml/Controls2/DrawerType2.qml b/client/ui/qml/Controls2/DrawerType2.qml new file mode 100644 index 00000000..160ca09a --- /dev/null +++ b/client/ui/qml/Controls2/DrawerType2.qml @@ -0,0 +1,241 @@ +import QtQuick +import QtQuick.Controls +import QtQuick.Layouts + +import "TextTypes" + +Item { + id: root + + readonly property string drawerExpanded: "expanded" + readonly property string drawerCollapsed: "collapsed" + + readonly property bool isOpened: drawerContent.state === root.drawerExpanded || (drawerContent.state === root.drawerCollapsed && dragArea.drag.active === true) + readonly property bool isClosed: drawerContent.state === root.drawerCollapsed && dragArea.drag.active === false + + readonly property bool isExpanded: drawerContent.state === root.drawerExpanded + readonly property bool isCollapsed: drawerContent.state === root.drawerCollapsed + + property Component collapsedContent + property Component expandedContent + + property string defaultColor: "#1C1D21" + property string borderColor: "#2C2D30" + + property real expandedHeight + property real collapsedHeight: 0 + + signal entered + signal exited + signal pressed(bool pressed, bool entered) + + signal aboutToHide + signal aboutToShow + signal close + signal open + signal closed + signal opened + + Connections { + target: root + + function onClose() { + if (isCollapsed) { + return + } + + aboutToHide() + + drawerContent.state = root.drawerCollapsed + closed() + } + + function onOpen() { + if (isExpanded) { + return + } + + aboutToShow() + + drawerContent.state = root.drawerExpanded + opened() + } + } + + /** Set once based on first implicit height change once all children are layed out */ + Component.onCompleted: { + if (root.isCollapsed && root.collapsedHeight == 0) { + root.collapsedHeight = drawerContent.implicitHeight + } + } + + Rectangle { + id: background + + anchors.fill: parent + color: root.isCollapsed ? "transparent" : Qt.rgba(14/255, 14/255, 17/255, 0.8) + + Behavior on color { + PropertyAnimation { duration: 200 } + } + } + + MouseArea { + id: emptyArea + anchors.fill: parent + enabled: root.isExpanded + onClicked: { + root.close() + } + } + + MouseArea { + id: dragArea + + anchors.fill: drawerContentBackground + cursorShape: root.isCollapsed ? Qt.PointingHandCursor : Qt.ArrowCursor + hoverEnabled: true + + enabled: drawerContent.implicitHeight > 0 + + drag.target: drawerContent + drag.axis: Drag.YAxis + drag.maximumY: root.height - root.collapsedHeight + drag.minimumY: root.height - root.expandedHeight + + /** If drag area is released at any point other than min or max y, transition to the other state */ + onReleased: { + if (root.isCollapsed && drawerContent.y < dragArea.drag.maximumY) { + root.open() + return + } + if (root.isExpanded && drawerContent.y > dragArea.drag.minimumY) { + root.close() + return + } + } + + onEntered: { + root.entered() + } + onExited: { + root.exited() + } + onPressedChanged: { + root.pressed(pressed, entered) + } + + onClicked: { + if (root.isCollapsed) { + root.open() + } + } + } + + Rectangle { + id: drawerContentBackground + + anchors { left: drawerContent.left; right: drawerContent.right; top: drawerContent.top } + height: root.height + radius: 16 + color: root.defaultColor + border.color: root.borderColor + border.width: 1 + + Rectangle { + width: parent.radius + height: parent.radius + anchors.bottom: parent.bottom + anchors.right: parent.right + anchors.left: parent.left + color: parent.color + } + } + + Item { + id: drawerContent + + Drag.active: dragArea.drag.active + anchors.right: root.right + anchors.left: root.left + y: root.height - drawerContent.height + state: root.drawerCollapsed + + implicitHeight: root.isCollapsed ? collapsedLoader.implicitHeight : expandedLoader.implicitHeight + + onStateChanged: { + if (root.isCollapsed) { + var initialPageNavigationBarColor = PageController.getInitialPageNavigationBarColor() + if (initialPageNavigationBarColor !== 0xFF1C1D21) { + PageController.updateNavigationBarColor(initialPageNavigationBarColor) + } + return + } + if (root.isExpanded) { + if (PageController.getInitialPageNavigationBarColor() !== 0xFF1C1D21) { + PageController.updateNavigationBarColor(0xFF1C1D21) + } + return + } + } + + states: [ + State { + name: root.drawerCollapsed + PropertyChanges { + target: drawerContent + y: root.height - root.collapsedHeight + } + }, + State { + name: root.drawerExpanded + PropertyChanges { + target: drawerContent + y: dragArea.drag.minimumY + + } + } + ] + + transitions: [ + Transition { + from: root.drawerCollapsed + to: root.drawerExpanded + PropertyAnimation { + target: drawerContent + properties: "y" + duration: 200 + } + }, + Transition { + from: root.drawerExpanded + to: root.drawerCollapsed + PropertyAnimation { + target: drawerContent + properties: "y" + duration: 200 + } + } + ] + + Loader { + id: collapsedLoader + + visible: root.isCollapsed + sourceComponent: root.collapsedContent + + anchors.right: parent.right + anchors.left: parent.left + } + + Loader { + id: expandedLoader + + visible: root.isExpanded + sourceComponent: root.expandedContent + + anchors.right: parent.right + anchors.left: parent.left + } + } +} diff --git a/client/ui/qml/Controls2/DropDownType.qml b/client/ui/qml/Controls2/DropDownType.qml index b91f0b7a..5b876d79 100644 --- a/client/ui/qml/Controls2/DropDownType.qml +++ b/client/ui/qml/Controls2/DropDownType.qml @@ -36,19 +36,23 @@ Item { property int rootButtonTextBottomMargin: 16 property real drawerHeight: 0.9 + property Item drawerParent property Component listView - property alias menuVisible: menu.visible + signal open + signal close implicitWidth: rootButtonContent.implicitWidth implicitHeight: rootButtonContent.implicitHeight - onMenuVisibleChanged: { - if (menuVisible) { - rootButtonBackground.border.color = rootButtonPressedBorderColor - } else { - rootButtonBackground.border.color = rootButtonDefaultBorderColor - } + onOpen: { + menu.open() + rootButtonBackground.border.color = rootButtonPressedBorderColor + } + + onClose: { + menu.close() + rootButtonBackground.border.color = rootButtonDefaultBorderColor } onEnabledChanged: { @@ -133,21 +137,21 @@ Item { hoverEnabled: root.enabled ? true : false onEntered: { - if (menu.visible === false) { + if (menu.isClosed) { rootButtonBackground.border.color = rootButtonHoveredBorderColor rootButtonBackground.color = rootButtonBackgroundHoveredColor } } onExited: { - if (menu.visible === false) { + if (menu.isClosed) { rootButtonBackground.border.color = rootButtonDefaultBorderColor rootButtonBackground.color = rootButtonBackgroundColor } } onPressed: { - if (menu.visible === false) { + if (menu.isClosed) { rootButtonBackground.color = pressed ? rootButtonBackgroundPressedColor : entered ? rootButtonHoveredBorderColor : rootButtonDefaultBorderColor } } @@ -156,60 +160,68 @@ Item { if (rootButtonClickedFunction && typeof rootButtonClickedFunction === "function") { rootButtonClickedFunction() } else { - menu.visible = true + menu.open() } } } - DrawerType { + DrawerType2 { id: menu - width: parent.width - height: parent.height * drawerHeight + parent: drawerParent - ColumnLayout { - id: header + anchors.fill: parent + expandedHeight: drawerParent.height * drawerHeight - anchors.top: parent.top - anchors.left: parent.left - anchors.right: parent.right - anchors.topMargin: 16 + expandedContent: Item { + id: container - BackButtonType { - backButtonImage: root.headerBackButtonImage - backButtonFunction: function() { - root.menuVisible = false - } - } - } + implicitHeight: menu.expandedHeight - FlickableType { - anchors.top: header.bottom - anchors.topMargin: 16 - contentHeight: col.implicitHeight + ColumnLayout { + id: header - Column { - id: col anchors.top: parent.top anchors.left: parent.left anchors.right: parent.right + anchors.topMargin: 16 - spacing: 16 + BackButtonType { + backButtonImage: root.headerBackButtonImage + backButtonFunction: function() { + menu.close() + } + } + } - Header2Type { + FlickableType { + anchors.top: header.bottom + anchors.topMargin: 16 + contentHeight: col.implicitHeight + + Column { + id: col + anchors.top: parent.top anchors.left: parent.left anchors.right: parent.right - anchors.leftMargin: 16 - anchors.rightMargin: 16 - headerText: root.headerText + spacing: 16 - width: parent.width - } + Header2Type { + anchors.left: parent.left + anchors.right: parent.right + anchors.leftMargin: 16 + anchors.rightMargin: 16 - Loader { - id: listViewLoader - sourceComponent: root.listView + headerText: root.headerText + + width: parent.width + } + + Loader { + id: listViewLoader + sourceComponent: root.listView + } } } } diff --git a/client/ui/qml/Pages2/PageHome.qml b/client/ui/qml/Pages2/PageHome.qml index db6ec11c..79906883 100644 --- a/client/ui/qml/Pages2/PageHome.qml +++ b/client/ui/qml/Pages2/PageHome.qml @@ -18,484 +18,355 @@ import "../Components" PageType { id: root - property string defaultColor: "#1C1D21" - - property string borderColor: "#2C2D30" - Connections { target: PageController function onRestorePageHomeState(isContainerInstalled) { - buttonContent.state = "expanded" + drawer.open() if (isContainerInstalled) { containersDropDown.rootButtonClickedFunction() } } - - function onForceCloseDrawer() { - buttonContent.state = "collapsed" - } - } - - MouseArea { - anchors.fill: parent - enabled: buttonContent.state === "expanded" - onClicked: { - buttonContent.state = "collapsed" - } } Item { anchors.fill: parent - anchors.bottomMargin: buttonContent.collapsedHeight + anchors.bottomMargin: drawer.collapsedHeight ConnectButton { anchors.centerIn: parent } } - MouseArea { - id: dragArea - anchors.fill: buttonBackground - cursorShape: buttonContent.state === "collapsed" ? Qt.PointingHandCursor : Qt.ArrowCursor - hoverEnabled: true + DrawerType2 { + id: drawer + anchors.fill: parent - drag.target: buttonContent - drag.axis: Drag.YAxis - drag.maximumY: root.height - buttonContent.collapsedHeight - drag.minimumY: root.height - root.height * 0.9 - - /** If drag area is released at any point other than min or max y, transition to the other state */ - onReleased: { - if (buttonContent.state === "collapsed" && buttonContent.y < dragArea.drag.maximumY) { - buttonContent.state = "expanded" - return - } - if (buttonContent.state === "expanded" && buttonContent.y > dragArea.drag.minimumY) { - buttonContent.state = "collapsed" - return - } - } - - onEntered: { - collapsedButtonChevron.backgroundColor = collapsedButtonChevron.hoveredColor - collapsedButtonHeader.opacity = 0.8 - } - onExited: { - collapsedButtonChevron.backgroundColor = collapsedButtonChevron.defaultColor - collapsedButtonHeader.opacity = 1 - } - onPressedChanged: { - collapsedButtonChevron.backgroundColor = pressed ? collapsedButtonChevron.pressedColor : entered ? collapsedButtonChevron.hoveredColor : collapsedButtonChevron.defaultColor - collapsedButtonHeader.opacity = 0.7 - } - - - onClicked: { - if (buttonContent.state === "collapsed") { - buttonContent.state = "expanded" - } - } - } - - Rectangle { - id: buttonBackground - - anchors { left: buttonContent.left; right: buttonContent.right; top: buttonContent.top } - height: root.height - radius: 16 - color: root.defaultColor - border.color: root.borderColor - border.width: 1 - - Rectangle { - width: parent.radius - height: parent.radius - anchors.bottom: parent.bottom - anchors.right: parent.right - anchors.left: parent.left - color: parent.color - } - } - - ColumnLayout { - id: buttonContent - - /** Initial height of button content */ - property int collapsedHeight: 0 - /** True when expanded objects should be visible */ - property bool expandedVisibility: buttonContent.state === "expanded" || (buttonContent.state === "collapsed" && dragArea.drag.active === true) - /** True when collapsed objects should be visible */ - property bool collapsedVisibility: buttonContent.state === "collapsed" && dragArea.drag.active === false - - Drag.active: dragArea.drag.active - anchors.right: root.right - anchors.left: root.left - y: root.height - buttonContent.height - - Component.onCompleted: { - buttonContent.state = "collapsed" - } - - /** Set once based on first implicit height change once all children are layed out */ - onImplicitHeightChanged: { - if (buttonContent.state === "collapsed" && collapsedHeight == 0) { - collapsedHeight = implicitHeight - } - } - - onStateChanged: { - if (buttonContent.state === "collapsed") { - var initialPageNavigationBarColor = PageController.getInitialPageNavigationBarColor() - if (initialPageNavigationBarColor !== 0xFF1C1D21) { - PageController.updateNavigationBarColor(initialPageNavigationBarColor) - } - PageController.drawerClose() - return - } - if (buttonContent.state === "expanded") { - if (PageController.getInitialPageNavigationBarColor() !== 0xFF1C1D21) { - PageController.updateNavigationBarColor(0xFF1C1D21) - } - PageController.drawerOpen() - return - } - } - - /** Two states of buttonContent, great place to add any future animations for the drawer */ - states: [ - State { - name: "collapsed" - PropertyChanges { - target: buttonContent - y: root.height - collapsedHeight - } - }, - State { - name: "expanded" - PropertyChanges { - target: buttonContent - y: dragArea.drag.minimumY - - } - } - ] - - transitions: [ - Transition { - from: "collapsed" - to: "expanded" - PropertyAnimation { - target: buttonContent - properties: "y" - duration: 200 - } - }, - Transition { - from: "expanded" - to: "collapsed" - PropertyAnimation { - target: buttonContent - properties: "y" - duration: 200 - } - } - ] - - DividerType { - Layout.topMargin: 10 - Layout.fillWidth: false - Layout.preferredWidth: 20 - Layout.preferredHeight: 2 - Layout.alignment: Qt.AlignHCenter | Qt.AlignVCenter - - visible: (buttonContent.collapsedVisibility || buttonContent.expandedVisibility) - } - - RowLayout { - Layout.topMargin: 14 - Layout.leftMargin: 24 - Layout.rightMargin: 24 - Layout.alignment: Qt.AlignHCenter | Qt.AlignVCenter - visible: buttonContent.collapsedVisibility - - spacing: 0 - - Header1TextType { - id: collapsedButtonHeader - Layout.maximumWidth: buttonContent.width - 48 - 18 - 12 // todo - - maximumLineCount: 2 - elide: Qt.ElideRight - - text: ServersModel.defaultServerName - horizontalAlignment: Qt.AlignHCenter - - Behavior on opacity { - PropertyAnimation { duration: 200 } - } - } - - ImageButtonType { - id: collapsedButtonChevron - - Layout.leftMargin: 8 - - hoverEnabled: false - image: "qrc:/images/controls/chevron-down.svg" - imageColor: "#d7d8db" - - icon.width: 18 - icon.height: 18 - backgroundRadius: 16 - horizontalPadding: 4 - topPadding: 4 - bottomPadding: 3 - - onClicked: { - if (buttonContent.state === "collapsed") { - buttonContent.state = "expanded" - } - } - } - } - - LabelTextType { - id: collapsedServerMenuDescription - Layout.bottomMargin: 44 - Layout.alignment: Qt.AlignHCenter | Qt.AlignVCenter - visible: buttonContent.collapsedVisibility - text: ServersModel.defaultServerDescriptionCollapsed - } - - ColumnLayout { - id: serversMenuHeader - - Layout.alignment: Qt.AlignTop | Qt.AlignHCenter - Layout.fillWidth: true - visible: buttonContent.expandedVisibility - - Header1TextType { - Layout.fillWidth: true - Layout.topMargin: 14 - Layout.leftMargin: 16 - Layout.rightMargin: 16 - - text: ServersModel.defaultServerName - horizontalAlignment: Qt.AlignHCenter - maximumLineCount: 2 - elide: Qt.ElideRight - } - - LabelTextType { - id: expandedServersMenuDescription - Layout.bottomMargin: 24 - Layout.fillWidth: true - horizontalAlignment: Qt.AlignHCenter - verticalAlignment: Qt.AlignVCenter - text: ServersModel.defaultServerDescriptionExpanded + collapsedContent: ColumnLayout { + DividerType { + Layout.topMargin: 10 + Layout.fillWidth: false + Layout.preferredWidth: 20 + Layout.preferredHeight: 2 + Layout.alignment: Qt.AlignHCenter | Qt.AlignVCenter } RowLayout { + Layout.topMargin: 14 + Layout.leftMargin: 24 + Layout.rightMargin: 24 Layout.alignment: Qt.AlignHCenter | Qt.AlignVCenter - spacing: 8 - DropDownType { - id: containersDropDown + spacing: 0 - rootButtonImageColor: "#0E0E11" - rootButtonBackgroundColor: "#D7D8DB" - rootButtonBackgroundHoveredColor: Qt.rgba(215, 216, 219, 0.8) - rootButtonBackgroundPressedColor: Qt.rgba(215, 216, 219, 0.65) - rootButtonHoveredBorderColor: "transparent" - rootButtonDefaultBorderColor: "transparent" - rootButtonTextTopMargin: 8 - rootButtonTextBottomMargin: 8 - - text: ServersModel.defaultContainerName - textColor: "#0E0E11" - headerText: qsTr("VPN protocol") - headerBackButtonImage: "qrc:/images/controls/arrow-left.svg" - - rootButtonClickedFunction: function() { - ServersModel.currentlyProcessedIndex = serversMenuContent.currentIndex - containersDropDown.menuVisible = true + Connections { + target: drawer + function onEntered() { + collapsedButtonChevron.backgroundColor = collapsedButtonChevron.hoveredColor + collapsedButtonHeader.opacity = 0.8 } - listView: HomeContainersListView { - rootWidth: root.width + function onExited() { + collapsedButtonChevron.backgroundColor = collapsedButtonChevron.defaultColor + collapsedButtonHeader.opacity = 1 + } + + function onPressed(pressed, entered) { + collapsedButtonChevron.backgroundColor = pressed ? collapsedButtonChevron.pressedColor : entered ? collapsedButtonChevron.hoveredColor : collapsedButtonChevron.defaultColor + collapsedButtonHeader.opacity = 0.7 + } + } + + Header1TextType { + id: collapsedButtonHeader + Layout.maximumWidth: drawer.width - 48 - 18 - 12 // todo + + maximumLineCount: 2 + elide: Qt.ElideRight + + text: ServersModel.defaultServerName + horizontalAlignment: Qt.AlignHCenter + + Behavior on opacity { + PropertyAnimation { duration: 200 } + } + } + + ImageButtonType { + id: collapsedButtonChevron + + Layout.leftMargin: 8 + + hoverEnabled: false + image: "qrc:/images/controls/chevron-down.svg" + imageColor: "#d7d8db" + + icon.width: 18 + icon.height: 18 + backgroundRadius: 16 + horizontalPadding: 4 + topPadding: 4 + bottomPadding: 3 + + onClicked: { + if (drawer.isCollapsed) { + drawer.open() + } + } + } + } + + LabelTextType { + id: collapsedServerMenuDescription + Layout.bottomMargin: 44 + Layout.alignment: Qt.AlignHCenter | Qt.AlignVCenter + text: ServersModel.defaultServerDescriptionCollapsed + } + + } + expandedContent: Item { + id: serverMenuContainer + + implicitHeight: root.height * 0.9 + + Component.onCompleted: { + drawer.expandedHeight = serverMenuContainer.implicitHeight + } + + ColumnLayout { + id: serversMenuHeader + + anchors.top: parent.top + anchors.right: parent.right + anchors.left: parent.left + + + Header1TextType { + Layout.fillWidth: true + Layout.topMargin: 14 + Layout.leftMargin: 16 + Layout.rightMargin: 16 + + text: ServersModel.defaultServerName + horizontalAlignment: Qt.AlignHCenter + maximumLineCount: 2 + elide: Qt.ElideRight + } + + LabelTextType { + id: expandedServersMenuDescription + Layout.bottomMargin: 24 + Layout.fillWidth: true + horizontalAlignment: Qt.AlignHCenter + verticalAlignment: Qt.AlignVCenter + text: ServersModel.defaultServerDescriptionExpanded + } + + RowLayout { + Layout.alignment: Qt.AlignHCenter | Qt.AlignVCenter + spacing: 8 + + DropDownType { + id: containersDropDown + + rootButtonImageColor: "#0E0E11" + rootButtonBackgroundColor: "#D7D8DB" + rootButtonBackgroundHoveredColor: Qt.rgba(215, 216, 219, 0.8) + rootButtonBackgroundPressedColor: Qt.rgba(215, 216, 219, 0.65) + rootButtonHoveredBorderColor: "transparent" + rootButtonDefaultBorderColor: "transparent" + rootButtonTextTopMargin: 8 + rootButtonTextBottomMargin: 8 + + text: ServersModel.defaultContainerName + textColor: "#0E0E11" + headerText: qsTr("VPN protocol") + headerBackButtonImage: "qrc:/images/controls/arrow-left.svg" + + rootButtonClickedFunction: function() { + ServersModel.currentlyProcessedIndex = serversMenuContent.currentIndex + containersDropDown.open() + } + + drawerParent: root + + listView: HomeContainersListView { + rootWidth: root.width + + Connections { + target: ServersModel + + function onCurrentlyProcessedServerIndexChanged() { + updateContainersModelFilters() + } + } + + function updateContainersModelFilters() { + if (ServersModel.isCurrentlyProcessedServerHasWriteAccess()) { + proxyContainersModel.filters = ContainersModelFilters.getWriteAccessProtocolsListFilters() + } else { + proxyContainersModel.filters = ContainersModelFilters.getReadAccessProtocolsListFilters() + } + } + + model: SortFilterProxyModel { + id: proxyContainersModel + sourceModel: ContainersModel + } + + Component.onCompleted: updateContainersModelFilters() + } + } + } + + Header2Type { + Layout.fillWidth: true + Layout.topMargin: 48 + Layout.leftMargin: 16 + Layout.rightMargin: 16 + + headerText: qsTr("Servers") + } + } + + Flickable { + id: serversContainer + + anchors.top: serversMenuHeader.bottom + anchors.right: parent.right + anchors.left: parent.left + anchors.topMargin: 16 + + contentHeight: col.height + col.anchors.bottomMargin + implicitHeight: parent.height - serversMenuHeader.implicitHeight + clip: true + + ScrollBar.vertical: ScrollBar { + id: scrollBar + policy: serversContainer.height >= serversContainer.contentHeight ? ScrollBar.AlwaysOff : ScrollBar.AlwaysOn + } + + Keys.onUpPressed: scrollBar.decrease() + Keys.onDownPressed: scrollBar.increase() + + Column { + id: col + anchors.top: parent.top + anchors.left: parent.left + anchors.right: parent.right + anchors.bottomMargin: 32 + + spacing: 16 + + ButtonGroup { + id: serversRadioButtonGroup + } + + ListView { + id: serversMenuContent + width: parent.width + height: serversMenuContent.contentItem.height + + model: ServersModel + currentIndex: ServersModel.defaultIndex Connections { target: ServersModel - - function onCurrentlyProcessedServerIndexChanged() { - updateContainersModelFilters() + function onDefaultServerIndexChanged(serverIndex) { + serversMenuContent.currentIndex = serverIndex } } - function updateContainersModelFilters() { - if (ServersModel.isCurrentlyProcessedServerHasWriteAccess()) { - proxyContainersModel.filters = ContainersModelFilters.getWriteAccessProtocolsListFilters() - } else { - proxyContainersModel.filters = ContainersModelFilters.getReadAccessProtocolsListFilters() - } - } + clip: true + interactive: false - model: SortFilterProxyModel { - id: proxyContainersModel - sourceModel: ContainersModel - } + delegate: Item { + id: menuContentDelegate - Component.onCompleted: updateContainersModelFilters() - } - } - } + property variant delegateData: model - Header2Type { - Layout.fillWidth: true - Layout.topMargin: 48 - Layout.leftMargin: 16 - Layout.rightMargin: 16 - visible: buttonContent.expandedVisibility + implicitWidth: serversMenuContent.width + implicitHeight: serverRadioButtonContent.implicitHeight - headerText: qsTr("Servers") - } - } + ColumnLayout { + id: serverRadioButtonContent - Flickable { - id: serversContainer - Layout.alignment: Qt.AlignTop | Qt.AlignHCenter - Layout.fillWidth: true - Layout.topMargin: 16 - contentHeight: col.implicitHeight - implicitHeight: root.height - (root.height * 0.1) - serversMenuHeader.implicitHeight - 52 //todo 52 is tabbar height - visible: buttonContent.expandedVisibility - clip: true + anchors.fill: parent + anchors.rightMargin: 16 + anchors.leftMargin: 16 - ScrollBar.vertical: ScrollBar { - id: scrollBar - policy: serversContainer.height >= serversContainer.contentHeight ? ScrollBar.AlwaysOff : ScrollBar.AlwaysOn - } + spacing: 0 - Keys.onUpPressed: scrollBar.decrease() - Keys.onDownPressed: scrollBar.increase() + RowLayout { + VerticalRadioButton { + id: serverRadioButton - Column { - id: col - anchors.top: parent.top - anchors.left: parent.left - anchors.right: parent.right + Layout.fillWidth: true - spacing: 16 + text: name + descriptionText: { + var fullDescription = "" + if (hasWriteAccess) { + if (SettingsController.isAmneziaDnsEnabled() + && ServersModel.isAmneziaDnsContainerInstalled(index)) { + fullDescription += "Amnezia DNS | " + } + } else { + if (containsAmneziaDns) { + fullDescription += "Amnezia DNS | " + } + } - ButtonGroup { - id: serversRadioButtonGroup - } + return fullDescription += serverDescription + } - ListView { - id: serversMenuContent - width: parent.width - height: serversMenuContent.contentItem.height + checked: index === serversMenuContent.currentIndex + checkable: !ConnectionController.isConnected - model: ServersModel - currentIndex: ServersModel.defaultIndex + ButtonGroup.group: serversRadioButtonGroup - Connections { - target: ServersModel - function onDefaultServerIndexChanged(serverIndex) { - serversMenuContent.currentIndex = serverIndex - } - } + onClicked: { + if (ConnectionController.isConnected) { + PageController.showNotificationMessage(qsTr("Unable change server while there is an active connection")) + return + } - clip: true - interactive: false + serversMenuContent.currentIndex = index - delegate: Item { - id: menuContentDelegate + ServersModel.currentlyProcessedIndex = index + ServersModel.defaultIndex = index + } - property variant delegateData: model + MouseArea { + anchors.fill: serverRadioButton + cursorShape: Qt.PointingHandCursor + enabled: false + } + } - implicitWidth: serversMenuContent.width - implicitHeight: serverRadioButtonContent.implicitHeight + ImageButtonType { + image: "qrc:/images/controls/settings.svg" + imageColor: "#D7D8DB" - ColumnLayout { - id: serverRadioButtonContent + implicitWidth: 56 + implicitHeight: 56 - anchors.fill: parent - anchors.rightMargin: 16 - anchors.leftMargin: 16 + z: 1 - spacing: 0 - - RowLayout { - VerticalRadioButton { - id: serverRadioButton + onClicked: function() { + ServersModel.currentlyProcessedIndex = index + PageController.goToPage(PageEnum.PageSettingsServerInfo) + drawer.close() + } + } + } + DividerType { Layout.fillWidth: true - - text: name - descriptionText: { - var fullDescription = "" - if (hasWriteAccess) { - if (SettingsController.isAmneziaDnsEnabled() - && ServersModel.isAmneziaDnsContainerInstalled(index)) { - fullDescription += "Amnezia DNS | " - } - } else { - if (containsAmneziaDns) { - fullDescription += "Amnezia DNS | " - } - } - - return fullDescription += serverDescription - } - - checked: index === serversMenuContent.currentIndex - checkable: !ConnectionController.isConnected - - ButtonGroup.group: serversRadioButtonGroup - - onClicked: { - if (ConnectionController.isConnected) { - PageController.showNotificationMessage(qsTr("Unable change server while there is an active connection")) - return - } - - serversMenuContent.currentIndex = index - - ServersModel.currentlyProcessedIndex = index - ServersModel.defaultIndex = index - } - - MouseArea { - anchors.fill: serverRadioButton - cursorShape: Qt.PointingHandCursor - enabled: false - } + Layout.leftMargin: 0 + Layout.rightMargin: 0 } - - ImageButtonType { - image: "qrc:/images/controls/settings.svg" - imageColor: "#D7D8DB" - - implicitWidth: 56 - implicitHeight: 56 - - z: 1 - - onClicked: function() { - ServersModel.currentlyProcessedIndex = index - PageController.goToPage(PageEnum.PageSettingsServerInfo) - buttonContent.state = "collapsed" - } - } - } - - DividerType { - Layout.fillWidth: true - Layout.leftMargin: 0 - Layout.rightMargin: 0 } } } diff --git a/client/ui/qml/Pages2/PageProtocolAwgSettings.qml b/client/ui/qml/Pages2/PageProtocolAwgSettings.qml index a4f5abe3..4fb472a0 100644 --- a/client/ui/qml/Pages2/PageProtocolAwgSettings.qml +++ b/client/ui/qml/Pages2/PageProtocolAwgSettings.qml @@ -275,20 +275,18 @@ PageType { text: qsTr("Remove AmneziaWG") onClicked: { - questionDrawer.headerText = qsTr("Remove AmneziaWG from server?") - questionDrawer.descriptionText = qsTr("All users with whom you shared a connection will no longer be able to connect to it.") - questionDrawer.yesButtonText = qsTr("Continue") - questionDrawer.noButtonText = qsTr("Cancel") + var headerText = qsTr("Remove AmneziaWG from server?") + var descriptionText = qsTr("All users with whom you shared a connection will no longer be able to connect to it.") + var yesButtonText = qsTr("Continue") + var noButtonText = qsTr("Cancel") - questionDrawer.yesButtonFunction = function() { - questionDrawer.visible = false + var yesButtonFunction = function() { PageController.goToPage(PageEnum.PageDeinstalling) InstallController.removeCurrentlyProcessedContainer() } - questionDrawer.noButtonFunction = function() { - questionDrawer.visible = false + var noButtonFunction = function() { } - questionDrawer.visible = true + showQuestionDrawer(headerText, descriptionText, yesButtonText, noButtonText, yesButtonFunction, noButtonFunction) } } @@ -320,9 +318,5 @@ PageType { } } } - - QuestionDrawer { - id: questionDrawer - } } } diff --git a/client/ui/qml/Pages2/PageProtocolCloakSettings.qml b/client/ui/qml/Pages2/PageProtocolCloakSettings.qml index 98e9c28f..7aedd884 100644 --- a/client/ui/qml/Pages2/PageProtocolCloakSettings.qml +++ b/client/ui/qml/Pages2/PageProtocolCloakSettings.qml @@ -122,6 +122,8 @@ PageType { descriptionText: qsTr("Cipher") headerText: qsTr("Cipher") + drawerParent: root + listView: ListViewWithRadioButtonType { id: cipherListView @@ -138,7 +140,7 @@ PageType { clickedFunction: function() { cipherDropDown.text = selectedText cipher = cipherDropDown.text - cipherDropDown.menuVisible = false + cipherDropDown.close() } Component.onCompleted: { diff --git a/client/ui/qml/Pages2/PageProtocolOpenVpnSettings.qml b/client/ui/qml/Pages2/PageProtocolOpenVpnSettings.qml index 571b8eaa..b662a46d 100644 --- a/client/ui/qml/Pages2/PageProtocolOpenVpnSettings.qml +++ b/client/ui/qml/Pages2/PageProtocolOpenVpnSettings.qml @@ -162,6 +162,8 @@ PageType { descriptionText: qsTr("Hash") headerText: qsTr("Hash") + drawerParent: root + listView: ListViewWithRadioButtonType { id: hashListView @@ -183,7 +185,7 @@ PageType { clickedFunction: function() { hashDropDown.text = selectedText hash = hashDropDown.text - hashDropDown.menuVisible = false + hashDropDown.close() } Component.onCompleted: { @@ -208,6 +210,8 @@ PageType { descriptionText: qsTr("Cipher") headerText: qsTr("Cipher") + drawerParent: root + listView: ListViewWithRadioButtonType { id: cipherListView @@ -229,7 +233,7 @@ PageType { clickedFunction: function() { cipherDropDown.text = selectedText cipher = cipherDropDown.text - cipherDropDown.menuVisible = false + cipherDropDown.close() } Component.onCompleted: { @@ -364,20 +368,19 @@ PageType { text: qsTr("Remove OpenVPN") onClicked: { - questionDrawer.headerText = qsTr("Remove OpenVpn from server?") - questionDrawer.descriptionText = qsTr("All users with whom you shared a connection will no longer be able to connect to it.") - questionDrawer.yesButtonText = qsTr("Continue") - questionDrawer.noButtonText = qsTr("Cancel") + var headerText = qsTr("Remove OpenVpn from server?") + var descriptionText = qsTr("All users with whom you shared a connection will no longer be able to connect to it.") + var yesButtonText = qsTr("Continue") + var noButtonText = qsTr("Cancel") - questionDrawer.yesButtonFunction = function() { - questionDrawer.visible = false + var yesButtonFunction = function() { PageController.goToPage(PageEnum.PageDeinstalling) InstallController.removeCurrentlyProcessedContainer() } - questionDrawer.noButtonFunction = function() { - questionDrawer.visible = false + var noButtonFunction = function() { } - questionDrawer.visible = true + + showQuestionDrawer(headerText, descriptionText, yesButtonText, noButtonText, yesButtonFunction, noButtonFunction) } } @@ -398,9 +401,5 @@ PageType { } } } - - QuestionDrawer { - id: questionDrawer - } } } diff --git a/client/ui/qml/Pages2/PageProtocolRaw.qml b/client/ui/qml/Pages2/PageProtocolRaw.qml index 967b605b..d8550fd1 100644 --- a/client/ui/qml/Pages2/PageProtocolRaw.qml +++ b/client/ui/qml/Pages2/PageProtocolRaw.qml @@ -90,71 +90,77 @@ PageType { DividerType {} - DrawerType { + DrawerType2 { id: configContentDrawer - width: parent.width - height: parent.height * 0.9 + expandedHeight: root.height * 0.9 - BackButtonType { - id: backButton + parent: root + anchors.fill: parent - anchors.top: parent.top - anchors.left: parent.left - anchors.right: parent.right - anchors.topMargin: 16 + expandedContent: Item { + implicitHeight: configContentDrawer.expandedHeight - backButtonFunction: function() { - configContentDrawer.visible = false - } - } + BackButtonType { + id: backButton - FlickableType { - anchors.top: backButton.bottom - anchors.left: parent.left - anchors.right: parent.right - anchors.bottom: parent.bottom - contentHeight: configContent.implicitHeight + configContent.anchors.topMargin + configContent.anchors.bottomMargin + anchors.top: parent.top + anchors.left: parent.left + anchors.right: parent.right + anchors.topMargin: 16 - ColumnLayout { - id: configContent - - anchors.fill: parent - anchors.rightMargin: 16 - anchors.leftMargin: 16 - - Header2Type { - Layout.fillWidth: true - Layout.topMargin: 16 - - headerText: qsTr("Connection options %1").arg(protocolName) + backButtonFunction: function() { + configContentDrawer.close() } + } - TextArea { - id: configText + FlickableType { + anchors.top: backButton.bottom + anchors.left: parent.left + anchors.right: parent.right + anchors.bottom: parent.bottom + contentHeight: configContent.implicitHeight + configContent.anchors.topMargin + configContent.anchors.bottomMargin - Layout.fillWidth: true - Layout.topMargin: 16 - Layout.bottomMargin: 16 + ColumnLayout { + id: configContent - padding: 0 - leftPadding: 0 - height: 24 + anchors.fill: parent + anchors.rightMargin: 16 + anchors.leftMargin: 16 - color: "#D7D8DB" - selectionColor: "#633303" - selectedTextColor: "#D7D8DB" + Header2Type { + Layout.fillWidth: true + Layout.topMargin: 16 - font.pixelSize: 16 - font.weight: Font.Medium - font.family: "PT Root UI VF" + headerText: qsTr("Connection options %1").arg(protocolName) + } - text: rawConfig + TextArea { + id: configText - wrapMode: Text.Wrap + Layout.fillWidth: true + Layout.topMargin: 16 + Layout.bottomMargin: 16 - background: Rectangle { - color: "transparent" + padding: 0 + leftPadding: 0 + height: 24 + + color: "#D7D8DB" + selectionColor: "#633303" + selectedTextColor: "#D7D8DB" + + font.pixelSize: 16 + font.weight: Font.Medium + font.family: "PT Root UI VF" + + text: rawConfig + + wrapMode: Text.Wrap + + background: Rectangle { + color: "transparent" + } } } } @@ -175,20 +181,19 @@ PageType { textColor: "#EB5757" clickedFunction: function() { - questionDrawer.headerText = qsTr("Remove %1 from server?").arg(ContainersModel.getCurrentlyProcessedContainerName()) - questionDrawer.descriptionText = qsTr("All users with whom you shared a connection will no longer be able to connect to it.") - questionDrawer.yesButtonText = qsTr("Continue") - questionDrawer.noButtonText = qsTr("Cancel") + var headerText = qsTr("Remove %1 from server?").arg(ContainersModel.getCurrentlyProcessedContainerName()) + var descriptionText = qsTr("All users with whom you shared a connection will no longer be able to connect to it.") + var yesButtonText = qsTr("Continue") + var noButtonText = qsTr("Cancel") - questionDrawer.yesButtonFunction = function() { - questionDrawer.visible = false + var yesButtonFunction = function() { PageController.goToPage(PageEnum.PageDeinstalling) InstallController.removeCurrentlyProcessedContainer() } - questionDrawer.noButtonFunction = function() { - questionDrawer.visible = false + var noButtonFunction = function() { } - questionDrawer.visible = true + + showQuestionDrawer(headerText, descriptionText, yesButtonText, noButtonText, yesButtonFunction, noButtonFunction) } MouseArea { @@ -200,9 +205,5 @@ PageType { DividerType {} } - - QuestionDrawer { - id: questionDrawer - } } } diff --git a/client/ui/qml/Pages2/PageProtocolShadowSocksSettings.qml b/client/ui/qml/Pages2/PageProtocolShadowSocksSettings.qml index 573aca06..18c64e76 100644 --- a/client/ui/qml/Pages2/PageProtocolShadowSocksSettings.qml +++ b/client/ui/qml/Pages2/PageProtocolShadowSocksSettings.qml @@ -100,6 +100,8 @@ PageType { descriptionText: qsTr("Cipher") headerText: qsTr("Cipher") + drawerParent: root + listView: ListViewWithRadioButtonType { id: cipherListView @@ -116,7 +118,7 @@ PageType { clickedFunction: function() { cipherDropDown.text = selectedText cipher = cipherDropDown.text - cipherDropDown.menuVisible = false + cipherDropDown.close() } Component.onCompleted: { diff --git a/client/ui/qml/Pages2/PageServiceDnsSettings.qml b/client/ui/qml/Pages2/PageServiceDnsSettings.qml index 10fe6f56..c24bdd42 100644 --- a/client/ui/qml/Pages2/PageServiceDnsSettings.qml +++ b/client/ui/qml/Pages2/PageServiceDnsSettings.qml @@ -63,19 +63,18 @@ PageType { textColor: "#EB5757" clickedFunction: function() { - questionDrawer.headerText = qsTr("Remove %1 from server?").arg(ContainersModel.getCurrentlyProcessedContainerName()) - questionDrawer.yesButtonText = qsTr("Continue") - questionDrawer.noButtonText = qsTr("Cancel") + var headerText = qsTr("Remove %1 from server?").arg(ContainersModel.getCurrentlyProcessedContainerName()) + var yesButtonText = qsTr("Continue") + var noButtonText = qsTr("Cancel") - questionDrawer.yesButtonFunction = function() { - questionDrawer.visible = false + var yesButtonFunction = function() { PageController.goToPage(PageEnum.PageDeinstalling) InstallController.removeCurrentlyProcessedContainer() } - questionDrawer.noButtonFunction = function() { - questionDrawer.visible = false + var noButtonFunction = function() { } - questionDrawer.visible = true + + showQuestionDrawer(headerText, "", yesButtonText, noButtonText, yesButtonFunction, noButtonFunction) } MouseArea { @@ -86,10 +85,6 @@ PageType { } DividerType {} - - QuestionDrawer { - id: questionDrawer - } } } } diff --git a/client/ui/qml/Pages2/PageServiceSftpSettings.qml b/client/ui/qml/Pages2/PageServiceSftpSettings.qml index b12302dd..1015be55 100644 --- a/client/ui/qml/Pages2/PageServiceSftpSettings.qml +++ b/client/ui/qml/Pages2/PageServiceSftpSettings.qml @@ -248,28 +248,23 @@ PageType { text: qsTr("Remove SFTP and all data stored there") onClicked: { - questionDrawer.headerText = qsTr("Remove SFTP and all data stored there?") - questionDrawer.yesButtonText = qsTr("Continue") - questionDrawer.noButtonText = qsTr("Cancel") + var headerText = qsTr("Remove SFTP and all data stored there?") + var yesButtonText = qsTr("Continue") + var noButtonText = qsTr("Cancel") - questionDrawer.yesButtonFunction = function() { - questionDrawer.visible = false + var yesButtonFunction = function() { PageController.goToPage(PageEnum.PageDeinstalling) InstallController.removeCurrentlyProcessedContainer() } - questionDrawer.noButtonFunction = function() { - questionDrawer.visible = false + var noButtonFunction = function() { } - questionDrawer.visible = true + + showQuestionDrawer(headerText, "", yesButtonText, noButtonText, yesButtonFunction, noButtonFunction) } } } } } } - - QuestionDrawer { - id: questionDrawer - } } } diff --git a/client/ui/qml/Pages2/PageServiceTorWebsiteSettings.qml b/client/ui/qml/Pages2/PageServiceTorWebsiteSettings.qml index eef174c3..0d18425f 100644 --- a/client/ui/qml/Pages2/PageServiceTorWebsiteSettings.qml +++ b/client/ui/qml/Pages2/PageServiceTorWebsiteSettings.qml @@ -126,25 +126,20 @@ PageType { text: qsTr("Remove website") onClicked: { - questionDrawer.headerText = qsTr("The site with all data will be removed from the tor network.") - questionDrawer.yesButtonText = qsTr("Continue") - questionDrawer.noButtonText = qsTr("Cancel") + var headerText = qsTr("The site with all data will be removed from the tor network.") + var yesButtonText = qsTr("Continue") + var noButtonText = qsTr("Cancel") - questionDrawer.yesButtonFunction = function() { - questionDrawer.visible = false + var yesButtonFunction = function() { PageController.goToPage(PageEnum.PageDeinstalling) InstallController.removeCurrentlyProcessedContainer() } - questionDrawer.noButtonFunction = function() { - questionDrawer.visible = false + var noButtonFunction = function() { } - questionDrawer.visible = true + + showQuestionDrawer(headerText, "", yesButtonText, noButtonText, yesButtonFunction, noButtonFunction) } } } - - QuestionDrawer { - id: questionDrawer - } } } diff --git a/client/ui/qml/Pages2/PageSettingsApplication.qml b/client/ui/qml/Pages2/PageSettingsApplication.qml index 05e468f0..6a3c077b 100644 --- a/client/ui/qml/Pages2/PageSettingsApplication.qml +++ b/client/ui/qml/Pages2/PageSettingsApplication.qml @@ -117,10 +117,6 @@ PageType { } } - SelectLanguageDrawer { - id: selectLanguageDrawer - } - DividerType {} @@ -145,28 +141,30 @@ PageType { rightImageSource: "qrc:/images/controls/chevron-right.svg" clickedFunction: function() { - questionDrawer.headerText = qsTr("Reset settings and remove all data from the application?") - questionDrawer.descriptionText = qsTr("All settings will be reset to default. All installed AmneziaVPN services will still remain on the server.") - questionDrawer.yesButtonText = qsTr("Continue") - questionDrawer.noButtonText = qsTr("Cancel") + var headerText = qsTr("Reset settings and remove all data from the application?") + var descriptionText = qsTr("All settings will be reset to default. All installed AmneziaVPN services will still remain on the server.") + var yesButtonText = qsTr("Continue") + var noButtonText = qsTr("Cancel") - questionDrawer.yesButtonFunction = function() { - questionDrawer.visible = false + var yesButtonFunction = function() { SettingsController.clearSettings() PageController.replaceStartPage() } - questionDrawer.noButtonFunction = function() { - questionDrawer.visible = false + var noButtonFunction = function() { } - questionDrawer.visible = true + + showQuestionDrawer(headerText, descriptionText, yesButtonText, noButtonText, yesButtonFunction, noButtonFunction) } } DividerType {} - - QuestionDrawer { - id: questionDrawer - } } } + + SelectLanguageDrawer { + id: selectLanguageDrawer + + width: root.width + height: root.height + } } diff --git a/client/ui/qml/Pages2/PageSettingsBackup.qml b/client/ui/qml/Pages2/PageSettingsBackup.qml index 81be0465..b3308d54 100644 --- a/client/ui/qml/Pages2/PageSettingsBackup.qml +++ b/client/ui/qml/Pages2/PageSettingsBackup.qml @@ -133,24 +133,19 @@ PageType { } function restoreBackup(filePath) { - questionDrawer.headerText = qsTr("Import settings from a backup file?") - questionDrawer.descriptionText = qsTr("All current settings will be reset"); - questionDrawer.yesButtonText = qsTr("Continue") - questionDrawer.noButtonText = qsTr("Cancel") + var headerText = qsTr("Import settings from a backup file?") + var descriptionText = qsTr("All current settings will be reset"); + var yesButtonText = qsTr("Continue") + var noButtonText = qsTr("Cancel") - questionDrawer.yesButtonFunction = function() { - questionDrawer.visible = false + var yesButtonFunction = function() { PageController.showBusyIndicator(true) SettingsController.restoreAppConfig(filePath) PageController.showBusyIndicator(false) } - questionDrawer.noButtonFunction = function() { - questionDrawer.visible = false + var noButtonFunction = function() { } - questionDrawer.visible = true - } - QuestionDrawer { - id: questionDrawer + showQuestionDrawer(headerText, descriptionText, yesButtonText, noButtonText, yesButtonFunction, noButtonFunction) } } diff --git a/client/ui/qml/Pages2/PageSettingsDns.qml b/client/ui/qml/Pages2/PageSettingsDns.qml index 1970da52..2f138060 100644 --- a/client/ui/qml/Pages2/PageSettingsDns.qml +++ b/client/ui/qml/Pages2/PageSettingsDns.qml @@ -95,22 +95,21 @@ PageType { text: qsTr("Restore default") onClicked: function() { - questionDrawer.headerText = qsTr("Restore default DNS settings?") - questionDrawer.yesButtonText = qsTr("Continue") - questionDrawer.noButtonText = qsTr("Cancel") + var headerText = qsTr("Restore default DNS settings?") + var yesButtonText = qsTr("Continue") + var noButtonText = qsTr("Cancel") - questionDrawer.yesButtonFunction = function() { - questionDrawer.visible = false + var yesButtonFunction = function() { SettingsController.primaryDns = "1.1.1.1" primaryDns.textFieldText = SettingsController.primaryDns SettingsController.secondaryDns = "1.0.0.1" secondaryDns.textFieldText = SettingsController.secondaryDns PageController.showNotificationMessage(qsTr("Settings have been reset")) } - questionDrawer.noButtonFunction = function() { - questionDrawer.visible = false + var noButtonFunction = function() { } - questionDrawer.visible = true + + showQuestionDrawer(headerText, "", yesButtonText, noButtonText, yesButtonFunction, noButtonFunction) } } @@ -130,8 +129,5 @@ PageType { } } } - QuestionDrawer { - id: questionDrawer - } } } diff --git a/client/ui/qml/Pages2/PageSettingsLogging.qml b/client/ui/qml/Pages2/PageSettingsLogging.qml index b302bffc..b05ffd2b 100644 --- a/client/ui/qml/Pages2/PageSettingsLogging.qml +++ b/client/ui/qml/Pages2/PageSettingsLogging.qml @@ -143,21 +143,20 @@ PageType { image: "qrc:/images/controls/delete.svg" onClicked: function() { - questionDrawer.headerText = qsTr("Clear logs?") - questionDrawer.yesButtonText = qsTr("Continue") - questionDrawer.noButtonText = qsTr("Cancel") + var headerText = qsTr("Clear logs?") + var yesButtonText = qsTr("Continue") + var noButtonText = qsTr("Cancel") - questionDrawer.yesButtonFunction = function() { - questionDrawer.visible = false + var yesButtonFunction = function() { PageController.showBusyIndicator(true) SettingsController.clearLogs() PageController.showBusyIndicator(false) PageController.showNotificationMessage(qsTr("Logs have been cleaned up")) } - questionDrawer.noButtonFunction = function() { - questionDrawer.visible = false + var noButtonFunction = function() { } - questionDrawer.visible = true + + showQuestionDrawer(headerText, "", yesButtonText, noButtonText, yesButtonFunction, noButtonFunction) } } @@ -170,10 +169,6 @@ PageType { } } } - - QuestionDrawer { - id: questionDrawer - } } } } diff --git a/client/ui/qml/Pages2/PageSettingsServerData.qml b/client/ui/qml/Pages2/PageSettingsServerData.qml index 99d8a87a..c233714d 100644 --- a/client/ui/qml/Pages2/PageSettingsServerData.qml +++ b/client/ui/qml/Pages2/PageSettingsServerData.qml @@ -92,21 +92,20 @@ PageType { descriptionText: qsTr("May be needed when changing other settings") clickedFunction: function() { - questionDrawer.headerText = qsTr("Clear cached profiles?") - questionDrawer.descriptionText = qsTr("") - questionDrawer.yesButtonText = qsTr("Continue") - questionDrawer.noButtonText = qsTr("Cancel") + var headerText = qsTr("Clear cached profiles?") + var descriptionText = qsTr("") + var yesButtonText = qsTr("Continue") + var noButtonText = qsTr("Cancel") - questionDrawer.yesButtonFunction = function() { - questionDrawer.visible = false + var yesButtonFunction = function() { PageController.showBusyIndicator(true) SettingsController.clearCachedProfiles() PageController.showBusyIndicator(false) } - questionDrawer.noButtonFunction = function() { - questionDrawer.visible = false + var noButtonFunction = function() { } - questionDrawer.visible = true + + showQuestionDrawer(headerText, descriptionText, yesButtonText, noButtonText, yesButtonFunction, noButtonFunction) } } @@ -140,13 +139,12 @@ PageType { textColor: "#EB5757" clickedFunction: function() { - questionDrawer.headerText = qsTr("Do you want to reboot the server?") - questionDrawer.descriptionText = qsTr("The reboot process may take approximately 30 seconds. Are you sure you wish to proceed?") - questionDrawer.yesButtonText = qsTr("Continue") - questionDrawer.noButtonText = qsTr("Cancel") + var headerText = qsTr("Do you want to reboot the server?") + var descriptionText = qsTr("The reboot process may take approximately 30 seconds. Are you sure you wish to proceed?") + var yesButtonText = qsTr("Continue") + var noButtonText = qsTr("Cancel") - questionDrawer.yesButtonFunction = function() { - questionDrawer.visible = false + var yesButtonFunction = function() { PageController.showBusyIndicator(true) if (ServersModel.isDefaultServerCurrentlyProcessed() && ConnectionController.isConnected) { ConnectionController.closeConnection() @@ -154,10 +152,10 @@ PageType { InstallController.rebootCurrentlyProcessedServer() PageController.showBusyIndicator(false) } - questionDrawer.noButtonFunction = function() { - questionDrawer.visible = false + var noButtonFunction = function() { } - questionDrawer.visible = true + + showQuestionDrawer(headerText, descriptionText, yesButtonText, noButtonText, yesButtonFunction, noButtonFunction) } } @@ -172,13 +170,12 @@ PageType { textColor: "#EB5757" clickedFunction: function() { - questionDrawer.headerText = qsTr("Do you want to remove the server from application?") - questionDrawer.descriptionText = qsTr("All installed AmneziaVPN services will still remain on the server.") - questionDrawer.yesButtonText = qsTr("Continue") - questionDrawer.noButtonText = qsTr("Cancel") + var headerText = qsTr("Do you want to remove the server from application?") + var descriptionText = qsTr("All installed AmneziaVPN services will still remain on the server.") + var yesButtonText = qsTr("Continue") + var noButtonText = qsTr("Cancel") - questionDrawer.yesButtonFunction = function() { - questionDrawer.visible = false + var yesButtonFunction = function() { PageController.showBusyIndicator(true) if (ServersModel.isDefaultServerCurrentlyProcessed() && ConnectionController.isConnected) { ConnectionController.closeConnection() @@ -186,10 +183,10 @@ PageType { InstallController.removeCurrentlyProcessedServer() PageController.showBusyIndicator(false) } - questionDrawer.noButtonFunction = function() { - questionDrawer.visible = false + var noButtonFunction = function() { } - questionDrawer.visible = true + + showQuestionDrawer(headerText, descriptionText, yesButtonText, noButtonText, yesButtonFunction, noButtonFunction) } } @@ -203,23 +200,22 @@ PageType { textColor: "#EB5757" clickedFunction: function() { - questionDrawer.headerText = qsTr("Do you want to clear server from Amnezia software?") - questionDrawer.descriptionText = qsTr("All containers will be deleted on the server. This means that configuration files, keys and certificates will be deleted.") - questionDrawer.yesButtonText = qsTr("Continue") - questionDrawer.noButtonText = qsTr("Cancel") + var headerText = qsTr("Do you want to clear server from Amnezia software?") + var descriptionText = qsTr("All containers will be deleted on the server. This means that configuration files, keys and certificates will be deleted.") + var yesButtonText = qsTr("Continue") + var noButtonText = qsTr("Cancel") - questionDrawer.yesButtonFunction = function() { - questionDrawer.visible = false + var yesButtonFunction = function() { PageController.goToPage(PageEnum.PageDeinstalling) if (ServersModel.isDefaultServerCurrentlyProcessed() && ConnectionController.isConnected) { ConnectionController.closeConnection() } InstallController.removeAllContainers() } - questionDrawer.noButtonFunction = function() { - questionDrawer.visible = false + var noButtonFunction = function() { } - questionDrawer.visible = true + + showQuestionDrawer(headerText, descriptionText, yesButtonText, noButtonText, yesButtonFunction, noButtonFunction) } } @@ -235,31 +231,26 @@ PageType { textColor: "#EB5757" clickedFunction: function() { - questionDrawer.headerText = qsTr("Do you want to reset API config?") - questionDrawer.descriptionText = "" - questionDrawer.yesButtonText = qsTr("Continue") - questionDrawer.noButtonText = qsTr("Cancel") + var headerText = qsTr("Do you want to reset API config?") + var descriptionText = "" + var yesButtonText = qsTr("Continue") + var noButtonText = qsTr("Cancel") - questionDrawer.yesButtonFunction = function() { - questionDrawer.visible = false + var yesButtonFunction = function() { PageController.showBusyIndicator(true) ApiController.clearApiConfig() PageController.showBusyIndicator(false) } - questionDrawer.noButtonFunction = function() { - questionDrawer.visible = false + var noButtonFunction = function() { } - questionDrawer.visible = true + + showQuestionDrawer(headerText, descriptionText, yesButtonText, noButtonText, yesButtonFunction, noButtonFunction) } } DividerType { visible: ServersModel.isCurrentlyProcessedServerFromApi() } - - QuestionDrawer { - id: questionDrawer - } } } } diff --git a/client/ui/qml/Pages2/PageSettingsServerInfo.qml b/client/ui/qml/Pages2/PageSettingsServerInfo.qml index df740ff9..750aaddf 100644 --- a/client/ui/qml/Pages2/PageSettingsServerInfo.qml +++ b/client/ui/qml/Pages2/PageSettingsServerInfo.qml @@ -71,30 +71,33 @@ PageType { } actionButtonFunction: function() { - serverNameEditDrawer.visible = true + serverNameEditDrawer.open() } } - DrawerType { + DrawerType2 { id: serverNameEditDrawer - width: root.width - height: root.height * 0.35 + parent: root - onVisibleChanged: { - if (serverNameEditDrawer.visible) { - serverName.textField.forceActiveFocus() - } - } + anchors.fill: parent + expandedHeight: root.height * 0.35 - ColumnLayout { + expandedContent: ColumnLayout { anchors.top: parent.top anchors.left: parent.left anchors.right: parent.right - anchors.topMargin: 16 + anchors.topMargin: 32 anchors.leftMargin: 16 anchors.rightMargin: 16 + Connections { + target: serverNameEditDrawer + function onOpened() { + serverName.textField.forceActiveFocus() + } + } + TextFieldWithHeaderType { id: serverName @@ -118,7 +121,7 @@ PageType { if (serverName.textFieldText !== name) { name = serverName.textFieldText } - serverNameEditDrawer.visible = false + serverNameEditDrawer.close() } } } diff --git a/client/ui/qml/Pages2/PageSettingsServerProtocol.qml b/client/ui/qml/Pages2/PageSettingsServerProtocol.qml index a961cf56..0d901d61 100644 --- a/client/ui/qml/Pages2/PageSettingsServerProtocol.qml +++ b/client/ui/qml/Pages2/PageSettingsServerProtocol.qml @@ -113,20 +113,19 @@ PageType { textColor: "#EB5757" clickedFunction: function() { - questionDrawer.headerText = qsTr("Remove %1 from server?").arg(ContainersModel.getCurrentlyProcessedContainerName()) - questionDrawer.descriptionText = qsTr("All users with whom you shared a connection will no longer be able to connect to it.") - questionDrawer.yesButtonText = qsTr("Continue") - questionDrawer.noButtonText = qsTr("Cancel") + var headerText = qsTr("Remove %1 from server?").arg(ContainersModel.getCurrentlyProcessedContainerName()) + var descriptionText = qsTr("All users with whom you shared a connection will no longer be able to connect to it.") + var yesButtonText = qsTr("Continue") + var noButtonText = qsTr("Cancel") - questionDrawer.yesButtonFunction = function() { - questionDrawer.visible = false + var yesButtonFunction = function() { PageController.goToPage(PageEnum.PageDeinstalling) InstallController.removeCurrentlyProcessedContainer() } - questionDrawer.noButtonFunction = function() { - questionDrawer.visible = false + var noButtonFunction = function() { } - questionDrawer.visible = true + + showQuestionDrawer(headerText, descriptionText, yesButtonText, noButtonText, yesButtonFunction, noButtonFunction) } MouseArea { @@ -138,9 +137,9 @@ PageType { DividerType {} } + } - QuestionDrawer { - id: questionDrawer - } + QuestionDrawer { + id: questionDrawer } } diff --git a/client/ui/qml/Pages2/PageSettingsSplitTunneling.qml b/client/ui/qml/Pages2/PageSettingsSplitTunneling.qml index 3aa5742a..ba31522c 100644 --- a/client/ui/qml/Pages2/PageSettingsSplitTunneling.qml +++ b/client/ui/qml/Pages2/PageSettingsSplitTunneling.qml @@ -121,6 +121,7 @@ PageType { Layout.rightMargin: 16 drawerHeight: 0.4375 + drawerParent: root enabled: root.pageEnabled @@ -135,7 +136,7 @@ PageType { clickedFunction: function() { selector.text = selectedText - selector.menuVisible = false + selector.close() if (SitesModel.routeMode !== root.routeModesModel[currentIndex].type) { SitesModel.routeMode = root.routeModesModel[currentIndex].type } @@ -202,26 +203,21 @@ PageType { rightImageColor: "#D7D8DB" clickedFunction: function() { - questionDrawer.headerText = qsTr("Remove ") + url + "?" - questionDrawer.yesButtonText = qsTr("Continue") - questionDrawer.noButtonText = qsTr("Cancel") + var headerText = qsTr("Remove ") + url + "?" + var yesButtonText = qsTr("Continue") + var noButtonText = qsTr("Cancel") - questionDrawer.yesButtonFunction = function() { - questionDrawer.visible = false + var yesButtonFunction = function() { SitesController.removeSite(index) } - questionDrawer.noButtonFunction = function() { - questionDrawer.visible = false + var noButtonFunction = function() { } - questionDrawer.visible = true + + showQuestionDrawer(headerText, "", yesButtonText, noButtonText, yesButtonFunction, noButtonFunction) } } DividerType {} - - QuestionDrawer { - id: questionDrawer - } } } } @@ -275,151 +271,155 @@ PageType { } } - DrawerType { + DrawerType2 { id: moreActionsDrawer - width: parent.width - height: parent.height * 0.4375 + anchors.fill: parent + expandedHeight: parent.height * 0.4375 - FlickableType { - anchors.fill: parent - contentHeight: moreActionsDrawerContent.height - ColumnLayout { - id: moreActionsDrawerContent - - anchors.top: parent.top - anchors.left: parent.left - anchors.right: parent.right - - Header2Type { - Layout.fillWidth: true - Layout.margins: 16 - - headerText: qsTr("Import / Export Sites") - } - - LabelWithButtonType { - Layout.fillWidth: true - - text: qsTr("Import") - rightImageSource: "qrc:/images/controls/chevron-right.svg" - - clickedFunction: function() { - importSitesDrawer.open() - } - } - - DividerType {} - - LabelWithButtonType { - Layout.fillWidth: true - text: qsTr("Save site list") - - clickedFunction: function() { - var fileName = "" - if (GC.isMobile()) { - fileName = "amnezia_sites.json" - } else { - fileName = SystemController.getFileName(qsTr("Save sites"), - qsTr("Sites files (*.json)"), - StandardPaths.standardLocations(StandardPaths.DocumentsLocation) + "/amnezia_sites", - true, - ".json") - } - if (fileName !== "") { - PageController.showBusyIndicator(true) - SitesController.exportSites(fileName) - moreActionsDrawer.close() - PageController.showBusyIndicator(false) - } - } - } - - DividerType {} - } - } - } - - DrawerType { - id: importSitesDrawer - - width: parent.width - height: parent.height * 0.4375 - - BackButtonType { - id: importSitesDrawerBackButton + expandedContent: ColumnLayout { + id: moreActionsDrawerContent anchors.top: parent.top anchors.left: parent.left anchors.right: parent.right - anchors.topMargin: 16 - backButtonFunction: function() { - importSitesDrawer.close() + Header2Type { + Layout.fillWidth: true + Layout.margins: 16 + + headerText: qsTr("Import / Export Sites") } + + LabelWithButtonType { + Layout.fillWidth: true + + text: qsTr("Import") + rightImageSource: "qrc:/images/controls/chevron-right.svg" + + clickedFunction: function() { + importSitesDrawer.open() + } + } + + DividerType {} + + LabelWithButtonType { + Layout.fillWidth: true + text: qsTr("Save site list") + + clickedFunction: function() { + var fileName = "" + if (GC.isMobile()) { + fileName = "amnezia_sites.json" + } else { + fileName = SystemController.getFileName(qsTr("Save sites"), + qsTr("Sites files (*.json)"), + StandardPaths.standardLocations(StandardPaths.DocumentsLocation) + "/amnezia_sites", + true, + ".json") + } + if (fileName !== "") { + PageController.showBusyIndicator(true) + SitesController.exportSites(fileName) + moreActionsDrawer.close() + PageController.showBusyIndicator(false) + } + } + } + + DividerType {} } + } - FlickableType { - anchors.top: importSitesDrawerBackButton.bottom - anchors.left: parent.left - anchors.right: parent.right - anchors.bottom: parent.bottom + DrawerType2 { + id: importSitesDrawer - contentHeight: importSitesDrawerContent.height + anchors.fill: parent + expandedHeight: parent.height * 0.4375 - ColumnLayout { - id: importSitesDrawerContent + expandedContent: Item { + implicitHeight: importSitesDrawer.expandedHeight + + BackButtonType { + id: importSitesDrawerBackButton anchors.top: parent.top anchors.left: parent.left anchors.right: parent.right + anchors.topMargin: 16 - Header2Type { - Layout.fillWidth: true - Layout.margins: 16 - - headerText: qsTr("Import a list of sites") - } - - LabelWithButtonType { - Layout.fillWidth: true - - text: qsTr("Replace site list") - - clickedFunction: function() { - var fileName = SystemController.getFileName(qsTr("Open sites file"), - qsTr("Sites files (*.json)")) - if (fileName !== "") { - importSitesDrawerContent.importSites(fileName, true) - } - } - } - - DividerType {} - - LabelWithButtonType { - Layout.fillWidth: true - text: qsTr("Add imported sites to existing ones") - - clickedFunction: function() { - var fileName = SystemController.getFileName(qsTr("Open sites file"), - qsTr("Sites files (*.json)")) - if (fileName !== "") { - importSitesDrawerContent.importSites(fileName, false) - } - } - } - - function importSites(fileName, replaceExistingSites) { - PageController.showBusyIndicator(true) - SitesController.importSites(fileName, replaceExistingSites) - PageController.showBusyIndicator(false) + backButtonFunction: function() { importSitesDrawer.close() - moreActionsDrawer.close() } + } - DividerType {} + FlickableType { + anchors.top: importSitesDrawerBackButton.bottom + anchors.left: parent.left + anchors.right: parent.right + anchors.bottom: parent.bottom + + contentHeight: importSitesDrawerContent.height + + ColumnLayout { + id: importSitesDrawerContent + + anchors.top: parent.top + anchors.left: parent.left + anchors.right: parent.right + + Header2Type { + Layout.fillWidth: true + Layout.margins: 16 + + headerText: qsTr("Import a list of sites") + } + + LabelWithButtonType { + Layout.fillWidth: true + + text: qsTr("Replace site list") + + clickedFunction: function() { + var fileName = SystemController.getFileName(qsTr("Open sites file"), + qsTr("Sites files (*.json)")) + if (fileName !== "") { + importSitesDrawerContent.importSites(fileName, true) + } + } + } + + DividerType {} + + LabelWithButtonType { + Layout.fillWidth: true + text: qsTr("Add imported sites to existing ones") + + clickedFunction: function() { + var fileName = SystemController.getFileName(qsTr("Open sites file"), + qsTr("Sites files (*.json)")) + if (fileName !== "") { + importSitesDrawerContent.importSites(fileName, false) + } + } + } + + function importSites(fileName, replaceExistingSites) { + PageController.showBusyIndicator(true) + SitesController.importSites(fileName, replaceExistingSites) + PageController.showBusyIndicator(false) + importSitesDrawer.close() + moreActionsDrawer.close() + } + + DividerType {} + } } } } + + QuestionDrawer { + id: questionDrawer + } } diff --git a/client/ui/qml/Pages2/PageSetupWizardEasy.qml b/client/ui/qml/Pages2/PageSetupWizardEasy.qml index 95951507..8268e55d 100644 --- a/client/ui/qml/Pages2/PageSetupWizardEasy.qml +++ b/client/ui/qml/Pages2/PageSetupWizardEasy.qml @@ -192,7 +192,6 @@ PageType { return ContainersModel.isAnyContainerInstalled() } - return true } diff --git a/client/ui/qml/Pages2/PageSetupWizardProtocolSettings.qml b/client/ui/qml/Pages2/PageSetupWizardProtocolSettings.qml index 7698c755..01aa0292 100644 --- a/client/ui/qml/Pages2/PageSetupWizardProtocolSettings.qml +++ b/client/ui/qml/Pages2/PageSetupWizardProtocolSettings.qml @@ -97,76 +97,80 @@ PageType { } } - DrawerType { + DrawerType2 { id: showDetailsDrawer + parent: root - width: parent.width - height: parent.height * 0.9 + anchors.fill: parent + expandedHeight: parent.height * 0.9 + expandedContent: Item { + implicitHeight: showDetailsDrawer.expandedHeight - BackButtonType { - id: showDetailsBackButton - - anchors.top: parent.top - anchors.left: parent.left - anchors.right: parent.right - anchors.topMargin: 16 - - backButtonFunction: function() { - showDetailsDrawer.close() - } - } - - FlickableType { - anchors.top: showDetailsBackButton.bottom - anchors.left: parent.left - anchors.right: parent.right - anchors.bottom: parent.bottom - contentHeight: { - var emptySpaceHeight = parent.height - showDetailsBackButton.implicitHeight - showDetailsBackButton.anchors.topMargin - return (showDetailsDrawerContent.height > emptySpaceHeight) ? - showDetailsDrawerContent.height : emptySpaceHeight - } - - ColumnLayout { - id: showDetailsDrawerContent + BackButtonType { + id: showDetailsBackButton anchors.top: parent.top anchors.left: parent.left anchors.right: parent.right - anchors.rightMargin: 16 - anchors.leftMargin: 16 + anchors.topMargin: 16 - Header2Type { - id: showDetailsDrawerHeader - Layout.fillWidth: true - Layout.topMargin: 16 + backButtonFunction: function() { + showDetailsDrawer.close() + } + } - headerText: name + FlickableType { + anchors.top: showDetailsBackButton.bottom + anchors.left: parent.left + anchors.right: parent.right + anchors.bottom: parent.bottom + contentHeight: { + var emptySpaceHeight = parent.height - showDetailsBackButton.implicitHeight - showDetailsBackButton.anchors.topMargin + return (showDetailsDrawerContent.height > emptySpaceHeight) ? + showDetailsDrawerContent.height : emptySpaceHeight } - ParagraphTextType { - Layout.fillWidth: true - Layout.topMargin: 16 - Layout.bottomMargin: 16 + ColumnLayout { + id: showDetailsDrawerContent - text: detailedDescription - textFormat: Text.MarkdownText - } + anchors.top: parent.top + anchors.left: parent.left + anchors.right: parent.right + anchors.rightMargin: 16 + anchors.leftMargin: 16 + + Header2Type { + id: showDetailsDrawerHeader + Layout.fillWidth: true + Layout.topMargin: 16 + + headerText: name + } + + ParagraphTextType { + Layout.fillWidth: true + Layout.topMargin: 16 + Layout.bottomMargin: 16 + + text: detailedDescription + textFormat: Text.MarkdownText + } - Rectangle { - Layout.fillHeight: true - color: "transparent" - } + Rectangle { + Layout.fillHeight: true + color: "transparent" + } - BasicButtonType { - Layout.fillWidth: true - Layout.bottomMargin: 32 + BasicButtonType { + Layout.fillWidth: true + Layout.bottomMargin: 32 - text: qsTr("Close") + text: qsTr("Close") - onClicked: function() { - showDetailsDrawer.close() + onClicked: function() { + showDetailsDrawer.close() + } } } } diff --git a/client/ui/qml/Pages2/PageSetupWizardStart.qml b/client/ui/qml/Pages2/PageSetupWizardStart.qml index a820ac71..da722be1 100644 --- a/client/ui/qml/Pages2/PageSetupWizardStart.qml +++ b/client/ui/qml/Pages2/PageSetupWizardStart.qml @@ -116,7 +116,7 @@ PageType { text: qsTr("I have the data to connect") onClicked: { - connectionTypeSelection.visible = true + connectionTypeSelection.open() } } @@ -138,10 +138,10 @@ PageType { onClicked: Qt.openUrlExternally(qsTr("https://amnezia.org/instructions/0_starter-guide")) } } + } - ConnectionTypeSelectionDrawer { - id: connectionTypeSelection - } + ConnectionTypeSelectionDrawer { + id: connectionTypeSelection } BusyIndicatorType { diff --git a/client/ui/qml/Pages2/PageShare.qml b/client/ui/qml/Pages2/PageShare.qml index c7777fea..dc37c3f8 100644 --- a/client/ui/qml/Pages2/PageShare.qml +++ b/client/ui/qml/Pages2/PageShare.qml @@ -41,8 +41,6 @@ PageType { shareConnectionDrawer.headerText = qsTr("Connection to ") + serverSelector.text shareConnectionDrawer.configContentHeaderText = qsTr("File with connection settings to ") + serverSelector.text - shareConnectionDrawer.needCloseButton = false - shareConnectionDrawer.open() shareConnectionDrawer.contentVisible = false PageController.showBusyIndicator(true) @@ -80,11 +78,6 @@ PageType { } PageController.showBusyIndicator(false) - - shareConnectionDrawer.needCloseButton = true - PageController.showTopCloseButton(true) - - shareConnectionDrawer.contentVisible = true } function onExportErrorOccurred(errorMessage) { @@ -154,14 +147,15 @@ PageType { shareFullAccessDrawer.open() } - DrawerType { + DrawerType2 { id: shareFullAccessDrawer - width: root.width - height: root.height * 0.45 + parent: root + anchors.fill: parent + expandedHeight: root.height * 0.45 - ColumnLayout { + expandedContent: ColumnLayout { anchors.top: parent.top anchors.left: parent.left anchors.right: parent.right @@ -276,6 +270,7 @@ PageType { Layout.topMargin: 16 drawerHeight: 0.4375 + drawerParent: root descriptionText: qsTr("Server") headerText: qsTr("Server") @@ -305,7 +300,7 @@ PageType { serverSelector.severSelectorIndexChanged() } - serverSelector.menuVisible = false + serverSelector.close() } Component.onCompleted: { @@ -328,6 +323,7 @@ PageType { Layout.topMargin: 16 drawerHeight: 0.5 + drawerParent: root descriptionText: qsTr("Protocol") headerText: qsTr("Protocol") @@ -358,7 +354,7 @@ PageType { clickedFunction: function() { handler() - protocolSelector.menuVisible = false + protocolSelector.close() } Connections { @@ -423,6 +419,7 @@ PageType { Layout.topMargin: 16 drawerHeight: 0.4375 + drawerParent: root visible: accessTypeSelector.currentIndex === 0 enabled: root.connectionTypesModel.length > 1 @@ -446,7 +443,7 @@ PageType { clickedFunction: function() { exportTypeSelector.text = selectedText exportTypeSelector.currentIndex = currentIndex - exportTypeSelector.menuVisible = false + exportTypeSelector.close() } Component.onCompleted: { @@ -456,10 +453,6 @@ PageType { } } - ShareConnectionDrawer { - id: shareConnectionDrawer - } - BasicButtonType { Layout.fillWidth: true Layout.topMargin: 40 @@ -561,13 +554,15 @@ PageType { DividerType {} - DrawerType { + DrawerType2 { id: clientInfoDrawer - width: root.width - height: root.height * 0.5 + parent: root - ColumnLayout { + anchors.fill: parent + expandedHeight: root.height * 0.5 + + expandedContent: ColumnLayout { anchors.top: parent.top anchors.left: parent.left anchors.right: parent.right @@ -602,26 +597,29 @@ PageType { clientNameEditDrawer.open() } - DrawerType { + DrawerType2 { id: clientNameEditDrawer - width: root.width - height: root.height * 0.35 + parent: root - onVisibleChanged: { - if (clientNameEditDrawer.visible) { - clientNameEditor.textField.forceActiveFocus() - } - } + anchors.fill: parent + expandedHeight: root.height * 0.35 - ColumnLayout { + expandedContent: ColumnLayout { anchors.top: parent.top anchors.left: parent.left anchors.right: parent.right - anchors.topMargin: 16 + anchors.topMargin: 32 anchors.leftMargin: 16 anchors.rightMargin: 16 + Connections { + target: clientNameEditDrawer + function onOpened() { + clientNameEditor.textField.forceActiveFocus() + } + } + TextFieldWithHeaderType { id: clientNameEditor Layout.fillWidth: true @@ -669,20 +667,19 @@ PageType { text: qsTr("Revoke") onClicked: function() { - questionDrawer.headerText = qsTr("Revoke the config for a user - %1?").arg(clientName) - questionDrawer.descriptionText = qsTr("The user will no longer be able to connect to your server.") - questionDrawer.yesButtonText = qsTr("Continue") - questionDrawer.noButtonText = qsTr("Cancel") + var headerText = qsTr("Revoke the config for a user - %1?").arg(clientName) + var descriptionText = qsTr("The user will no longer be able to connect to your server.") + var yesButtonText = qsTr("Continue") + var noButtonText = qsTr("Cancel") - questionDrawer.yesButtonFunction = function() { - questionDrawer.close() + var yesButtonFunction = function() { clientInfoDrawer.close() root.revokeConfig(index) } - questionDrawer.noButtonFunction = function() { - questionDrawer.close() + var noButtonFunction = function() { } - questionDrawer.open() + + showQuestionDrawer(headerText, descriptionText, yesButtonText, noButtonText, yesButtonFunction, noButtonFunction) } } } @@ -690,12 +687,15 @@ PageType { } } } - - QuestionDrawer { - id: questionDrawer - } } } + + ShareConnectionDrawer { + id: shareConnectionDrawer + + anchors.fill: parent + } + MouseArea { anchors.fill: parent onPressed: function(mouse) { diff --git a/client/ui/qml/Pages2/PageShareFullAccess.qml b/client/ui/qml/Pages2/PageShareFullAccess.qml index df0e2a00..f4490a91 100644 --- a/client/ui/qml/Pages2/PageShareFullAccess.qml +++ b/client/ui/qml/Pages2/PageShareFullAccess.qml @@ -69,6 +69,7 @@ PageType { Layout.topMargin: 16 drawerHeight: 0.4375 + drawerParent: root descriptionText: qsTr("Server") headerText: qsTr("Server") @@ -99,7 +100,7 @@ PageType { shareConnectionDrawer.headerText = qsTr("Accessing ") + serverSelector.text shareConnectionDrawer.configContentHeaderText = qsTr("File with accessing settings to ") + serverSelector.text - serverSelector.menuVisible = false + serverSelector.close() } Component.onCompleted: { @@ -126,8 +127,6 @@ PageType { shareConnectionDrawer.headerText = qsTr("Connection to ") + serverSelector.text shareConnectionDrawer.configContentHeaderText = qsTr("File with connection settings to ") + serverSelector.text - shareConnectionDrawer.needCloseButton = false - shareConnectionDrawer.open() shareConnectionDrawer.contentVisible = false PageController.showBusyIndicator(true) @@ -140,16 +139,15 @@ PageType { PageController.showBusyIndicator(false) - shareConnectionDrawer.needCloseButton = true - PageController.showTopCloseButton(true) - shareConnectionDrawer.contentVisible = true } } - - ShareConnectionDrawer { - id: shareConnectionDrawer - } } } + + ShareConnectionDrawer { + id: shareConnectionDrawer + + anchors.fill: parent + } } diff --git a/client/ui/qml/Pages2/PageStart.qml b/client/ui/qml/Pages2/PageStart.qml index 3ade9af8..bd55827e 100644 --- a/client/ui/qml/Pages2/PageStart.qml +++ b/client/ui/qml/Pages2/PageStart.qml @@ -20,22 +20,16 @@ PageType { function onGoToPageHome() { tabBar.setCurrentIndex(0) tabBarStackView.goToTabBarPage(PageEnum.PageHome) - - PageController.updateDrawerRootPage(PageEnum.PageHome) } function onGoToPageSettings() { tabBar.setCurrentIndex(2) tabBarStackView.goToTabBarPage(PageEnum.PageSettings) - - PageController.updateDrawerRootPage(PageEnum.PageSettings) } function onGoToPageViewConfig() { var pagePath = PageController.getPagePath(PageEnum.PageSetupWizardViewConfig) tabBarStackView.push(pagePath, { "objectName" : pagePath }, StackView.PushTransition) - - PageController.updateDrawerRootPage(PageEnum.PageSetupWizardViewConfig) } function onShowBusyIndicator(visible) { @@ -44,10 +38,6 @@ PageType { tabBar.enabled = !visible } -// function onShowTopCloseButton(visible) { -// topCloseButton.visible = visible -// } - function onEnableTabBar(enabled) { tabBar.enabled = enabled } @@ -66,8 +56,6 @@ PageType { } else { tabBarStackView.push(pagePath, { "objectName" : pagePath }, StackView.Immediate) } - - PageController.updateDrawerRootPage(page) } function onGoToStartPage() { @@ -146,8 +134,6 @@ PageType { var pagePath = PageController.getPagePath(page) tabBarStackView.clear(StackView.Immediate) tabBarStackView.replace(pagePath, { "objectName" : pagePath }, StackView.Immediate) - - PageController.updateDrawerRootPage(page) } Component.onCompleted: { @@ -155,11 +141,6 @@ PageType { ServersModel.currentlyProcessedIndex = ServersModel.defaultIndex tabBarStackView.push(pagePath, { "objectName" : pagePath }) } - -// onWidthChanged: { -// topCloseButton.x = tabBarStackView.x + tabBarStackView.width - -// topCloseButton.buttonWidth - topCloseButton.rightPadding -// } } TabBar { @@ -253,13 +234,6 @@ PageType { z: 1 } -// TopCloseButtonType { -// id: topCloseButton - -// x: tabBarStackView.width - topCloseButton.buttonWidth - topCloseButton.rightPadding -// z: 1 -// } - ConnectionTypeSelectionDrawer { id: connectionTypeSelection diff --git a/client/ui/qml/main2.qml b/client/ui/qml/main2.qml index 073fb4ad..a10c1d13 100644 --- a/client/ui/qml/main2.qml +++ b/client/ui/qml/main2.qml @@ -8,6 +8,7 @@ import PageEnum 1.0 import "Config" import "Controls2" +import "Components" Window { id: root @@ -130,32 +131,15 @@ Window { } Item { - anchors.right: parent.right - anchors.left: parent.left - anchors.bottom: parent.bottom + anchors.fill: parent - implicitHeight: popupErrorMessage.height - - DrawerType { + DrawerType2 { id: privateKeyPassphraseDrawer - width: root.width - height: root.height * 0.35 + anchors.fill: parent + expandedHeight: root.height * 0.35 - onVisibleChanged: { - if (privateKeyPassphraseDrawer.visible) { - passphrase.textFieldText = "" - passphrase.textField.forceActiveFocus() - } - } - onAboutToHide: { - PageController.showBusyIndicator(true) - } - onAboutToShow: { - PageController.showBusyIndicator(false) - } - - ColumnLayout { + expandedContent: ColumnLayout { anchors.top: parent.top anchors.left: parent.left anchors.right: parent.right @@ -163,6 +147,24 @@ Window { anchors.leftMargin: 16 anchors.rightMargin: 16 + Connections { + target: privateKeyPassphraseDrawer + function onOpened() { + passphrase.textFieldText = "" + passphrase.textField.forceActiveFocus() + } + + function onAboutToHide() { + if (passphrase.textFieldText !== "") { + PageController.showBusyIndicator(true) + } + } + + function onAboutToShow() { + PageController.showBusyIndicator(false) + } + } + TextFieldWithHeaderType { id: passphrase @@ -199,6 +201,37 @@ Window { } } + Item { + anchors.fill: parent + + QuestionDrawer { + id: questionDrawer + + anchors.fill: parent + } + } + + function showQuestionDrawer(headerText, descriptionText, yesButtonText, noButtonText, yesButtonFunction, noButtonFunction) { + questionDrawer.headerText = headerText + questionDrawer.descriptionText = descriptionText + questionDrawer.yesButtonText = yesButtonText + questionDrawer.noButtonText = noButtonText + + questionDrawer.yesButtonFunction = function() { + questionDrawer.close() + if (yesButtonFunction && typeof yesButtonFunction === "function") { + yesButtonFunction() + } + } + questionDrawer.noButtonFunction = function() { + questionDrawer.close() + if (noButtonFunction && typeof noButtonFunction === "function") { + noButtonFunction() + } + } + questionDrawer.open() + } + FileDialog { id: mainFileDialog From f640d4b5f5ea47695dcae03023451b3e377e9b7e Mon Sep 17 00:00:00 2001 From: isamnezia <156459471+isamnezia@users.noreply.github.com> Date: Fri, 16 Feb 2024 13:30:00 +0300 Subject: [PATCH 10/36] Remove config string dependency (#577) Remove WG/AWG config string dependency --- client/ios/networkextension/CMakeLists.txt | 1 + .../platforms/ios/PacketTunnelProvider.swift | 14 +- client/platforms/ios/WGConfig.swift | 133 ++++++++++++++++++ client/platforms/ios/ios_controller.mm | 10 +- 4 files changed, 146 insertions(+), 12 deletions(-) create mode 100644 client/platforms/ios/WGConfig.swift diff --git a/client/ios/networkextension/CMakeLists.txt b/client/ios/networkextension/CMakeLists.txt index b09753c9..e48215f6 100644 --- a/client/ios/networkextension/CMakeLists.txt +++ b/client/ios/networkextension/CMakeLists.txt @@ -85,6 +85,7 @@ target_sources(networkextension PRIVATE ${CLIENT_ROOT_DIR}/platforms/ios/LogRecord.swift ${CLIENT_ROOT_DIR}/platforms/ios/PacketTunnelProvider.swift ${CLIENT_ROOT_DIR}/platforms/ios/PacketTunnelProvider+OpenVPNAdapterDelegate.swift + ${CLIENT_ROOT_DIR}/platforms/ios/WGConfig.swift ${CLIENT_ROOT_DIR}/platforms/ios/iosglue.mm ) diff --git a/client/platforms/ios/PacketTunnelProvider.swift b/client/platforms/ios/PacketTunnelProvider.swift index 52f7084b..36097c0d 100644 --- a/client/platforms/ios/PacketTunnelProvider.swift +++ b/client/platforms/ios/PacketTunnelProvider.swift @@ -59,10 +59,6 @@ class PacketTunnelProvider: NEPacketTunnelProvider { var stopHandler: (() -> Void)? var protoType: TunnelProtoType = .none - override init() { - super.init() - } - override func handleAppMessage(_ messageData: Data, completionHandler: ((Data?) -> Void)? = nil) { let tmpStr = String(data: messageData, encoding: .utf8)! wg_log(.error, message: tmpStr) @@ -71,7 +67,7 @@ class PacketTunnelProvider: NEPacketTunnelProvider { return } - guard let completionHandler = completionHandler else { + guard let completionHandler else { log(.error, message: "Missing message completion handler") return } @@ -179,14 +175,16 @@ class PacketTunnelProvider: NEPacketTunnelProvider { return } - let wgConfigStr = String(data: wgConfig, encoding: .utf8)! - - guard let tunnelConfiguration = try? TunnelConfiguration(fromWgQuickConfig: wgConfigStr) else { + guard let wgConfigStr = try? JSONDecoder().decode(WGConfig.self, from: wgConfig).wg, + let tunnelConfiguration = try? TunnelConfiguration(fromWgQuickConfig: wgConfigStr) + else { wg_log(.error, message: "Can't parse WireGuard config") completionHandler(nil) return } + log(.info, message: "wgConfig: \(wgConfigStr.replacingOccurrences(of: "\n", with: " "))") + if tunnelConfiguration.peers.first!.allowedIPs .map({ $0.stringRepresentation }) .joined(separator: ", ") == "0.0.0.0/0, ::/0" { diff --git a/client/platforms/ios/WGConfig.swift b/client/platforms/ios/WGConfig.swift new file mode 100644 index 00000000..d86dd471 --- /dev/null +++ b/client/platforms/ios/WGConfig.swift @@ -0,0 +1,133 @@ +import Foundation + +struct WGConfigData: Decodable { + let h1, h2, h3, h4: String? + let jc, jmax, jmin: String? + let s1, s2: String? + + var settings: String { + jc == nil ? "" : + """ + Jc = \(jc!) + Jmin = \(jmin!) + Jmax = \(jmax!) + S1 = \(s1!) + S2 = \(s2!) + H1 = \(h1!) + H2 = \(h2!) + H3 = \(h3!) + H4 = \(h4!) + + """ + } + + let clientIP: String + let clientPrivateKey: String + let clientPublicKey: String + let serverPublicKey: String + let presharedKey: String + let hostName: String + let port: Int + + var allowedIPs: [String] + var persistentKeepAlive: String + + enum CodingKeys: String, CodingKey { + case h1 = "H1", h2 = "H2", h3 = "H3", h4 = "H4" + case jc = "Jc", jmax = "Jmax", jmin = "Jmin" + case s1 = "S1", s2 = "S2" + + case clientIP = "client_ip" // "10.8.1.16" + case clientPrivateKey = "client_priv_key" + case clientPublicKey = "client_pub_key" + case serverPublicKey = "server_pub_key" + case presharedKey = "psk_key" + + case allowedIPs = "allowed_ips" + case persistentKeepAlive = "persistent_keep_alive" + case hostName + case port + } + + init(from decoder: Decoder) throws { + let container = try decoder.container(keyedBy: CodingKeys.self) + self.h1 = try container.decodeIfPresent(String.self, forKey: .h1) + self.h2 = try container.decodeIfPresent(String.self, forKey: .h2) + self.h3 = try container.decodeIfPresent(String.self, forKey: .h3) + self.h4 = try container.decodeIfPresent(String.self, forKey: .h4) + self.jc = try container.decodeIfPresent(String.self, forKey: .jc) + self.jmax = try container.decodeIfPresent(String.self, forKey: .jmax) + self.jmin = try container.decodeIfPresent(String.self, forKey: .jmin) + self.s1 = try container.decodeIfPresent(String.self, forKey: .s1) + self.s2 = try container.decodeIfPresent(String.self, forKey: .s2) + self.clientIP = try container.decode(String.self, forKey: .clientIP) + self.clientPrivateKey = try container.decode(String.self, forKey: .clientPrivateKey) + self.clientPublicKey = try container.decode(String.self, forKey: .clientPublicKey) + self.serverPublicKey = try container.decode(String.self, forKey: .serverPublicKey) + self.presharedKey = try container.decode(String.self, forKey: .presharedKey) + self.allowedIPs = try container.decodeIfPresent([String].self, forKey: .allowedIPs) ?? ["0.0.0.0/0", "::/0"] + self.persistentKeepAlive = try container.decodeIfPresent(String.self, forKey: .persistentKeepAlive) ?? "25" + self.hostName = try container.decode(String.self, forKey: .hostName) + self.port = try container.decode(Int.self, forKey: .port) + } +} + +struct WGConfig: Decodable { + let data: WGConfigData + let configVersion: Int + let description: String + let dns1: String + let dns2: String + let hostName: String + let `protocol`: String + let splitTunnelSites: [String] + let splitTunnelType: Int + + enum CodingKeys: String, CodingKey { + case awgConfigData = "awg_config_data", wgConfigData = "wireguard_config_data" + case configData + case configVersion = "config_version" + case description + case dns1 + case dns2 + case hostName + case `protocol` + case splitTunnelSites + case splitTunnelType + } + + init(from decoder: Decoder) throws { + let container = try decoder.container(keyedBy: CodingKeys.self) + + if container.contains(.awgConfigData) { + self.data = try container.decode(WGConfigData.self, forKey: .awgConfigData) + } else { + self.data = try container.decode(WGConfigData.self, forKey: .wgConfigData) + } + + self.configVersion = try container.decode(Int.self, forKey: .configVersion) + self.description = try container.decode(String.self, forKey: .description) + self.dns1 = try container.decode(String.self, forKey: .dns1) + self.dns2 = try container.decode(String.self, forKey: .dns2) + self.hostName = try container.decode(String.self, forKey: .hostName) + self.protocol = try container.decode(String.self, forKey: .protocol) + self.splitTunnelSites = try container.decode([String].self, forKey: .splitTunnelSites) + self.splitTunnelType = try container.decode(Int.self, forKey: .splitTunnelType) + } + + var wg: String { + """ + [Interface] + Address = \(data.clientIP)/32 + DNS = \(dns1), \(dns2) + PrivateKey = \(data.clientPrivateKey) + \(data.settings) + [Peer] + PublicKey = \(data.serverPublicKey) + PresharedKey = \(data.presharedKey) + AllowedIPs = \(data.allowedIPs.joined(separator: ", ")) + Endpoint = \(data.hostName):\(data.port) + PersistentKeepalive = \(data.persistentKeepAlive) + """ + } +} diff --git a/client/platforms/ios/ios_controller.mm b/client/platforms/ios/ios_controller.mm index 8fb8283d..0d5eadbc 100644 --- a/client/platforms/ios/ios_controller.mm +++ b/client/platforms/ios/ios_controller.mm @@ -400,9 +400,10 @@ bool IosController::setupCloak() bool IosController::setupWireGuard() { QJsonObject config = m_rawConfig[ProtocolProps::key_proto_config_data(amnezia::Proto::WireGuard)].toObject(); - - QString wgConfig = config[config_key::config].toString(); + QJsonDocument doc(m_rawConfig); + QString wgConfig(doc.toJson(QJsonDocument::Compact)); + return startWireGuard(wgConfig); } @@ -410,8 +411,9 @@ bool IosController::setupAwg() { QJsonObject config = m_rawConfig[ProtocolProps::key_proto_config_data(amnezia::Proto::Awg)].toObject(); - QString wgConfig = config[config_key::config].toString(); - + QJsonDocument doc(m_rawConfig); + QString wgConfig(doc.toJson(QJsonDocument::Compact)); + return startWireGuard(wgConfig); } From fab167bb34a9f7199359e3d8589a1cd1ac2cfff5 Mon Sep 17 00:00:00 2001 From: KsZnak Date: Sat, 17 Feb 2024 20:29:25 +0200 Subject: [PATCH 11/36] Update amneziavpn_ru.ts --- client/translations/amneziavpn_ru.ts | 34 ++++++++++++++-------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/client/translations/amneziavpn_ru.ts b/client/translations/amneziavpn_ru.ts index 0ccda3e8..99e1dff8 100644 --- a/client/translations/amneziavpn_ru.ts +++ b/client/translations/amneziavpn_ru.ts @@ -854,11 +854,11 @@ Already installed containers were found on the server. All installed containers - Use <a href="https://www.torproject.org/download/" style="color: #FBB26A;">Tor Browser</a> to open this url. + Use <a href="https://www.torproject.org/download/" style="color: #FBB26A;">Tor Browser</a> to open this URL. Используйте <a href="https://www.torproject.org/download/" style="color: #FBB26A;">Tor Browser</a> для открытия этой ссылки. - After installation it takes several minutes while your onion site will become available in the Tor Network. + After creating your onion site, it takes a few minutes for the Tor network to make it available for use. Через несколько минут после установки ваш Onion сайт станет доступен в сети Tor. @@ -1202,7 +1202,7 @@ Already installed containers were found on the server. All installed containers - If AmneziaDNS is installed on the server + When AmneziaDNS is installed on the server Если он уставновлен на сервере @@ -1221,7 +1221,7 @@ Already installed containers were found on the server. All installed containers - If AmneziaDNS is not used or installed + When AmneziaDNS is not used or installed Эти адреса будут использоваться, если не включен AmneziaDNS @@ -1258,7 +1258,7 @@ Already installed containers were found on the server. All installed containers - If AmneziaDNS is not used or installed + When AmneziaDNS is not used or installed Эти адреса будут использоваться, если не включен или не установлен AmneziaDNS @@ -1431,27 +1431,27 @@ Already installed containers were found on the server. All installed containers Reboot server - + Перезагрузить сервер Do you want to reboot the server? - + Вы уверены, что хотите перезагрузить сервер? The reboot process may take approximately 30 seconds. Are you sure you wish to proceed? - + Процесс перезагрузки может занять около 30 секунд. Вы уверены, что хотите продолжить? Do you want to remove the server from application? - + Вы уверена что хотите удалить сервер из приложения? Do you want to clear server from Amnezia software? - + Вы хотите очистить сервер от всех сервисов Amnezia? @@ -1563,7 +1563,7 @@ Already installed containers were found on the server. All installed containers - Addresses from the list should be accessed via VPN + Only the sites listed here will be accesed via VPN Только адреса из списка должны открываться через VPN @@ -1597,11 +1597,11 @@ Already installed containers were found on the server. All installed containers Отменить - Site or IP + Website or IP Сайт или IP - Import/Export Sites + Import / Export Sites Импорт/экспорт Сайтов @@ -2126,7 +2126,7 @@ and will not be shared or disclosed to the Amnezia or any third parties Creation date: - + Дата создания @@ -2808,11 +2808,11 @@ While it offers a blend of security, stability, and speed, it's essential t OpenVPN - популярный VPN-протокол, с гибкой настройкой. Имеет собственный протокол безопасности с SSL/TLS для обмена ключами. - ShadowSocks - masks VPN traffic, making it similar to normal web traffic, but is recognised by analysis systems in some highly censored regions. + ShadowSocks - masks VPN traffic, making it similar to normal web traffic, but it may be recognised by analysis systems in some highly censored regions. ShadowSocks - маскирует VPN-трафик под обычный веб-трафик, но распознается системами анализа в некоторых регионах с высоким уровнем цензуры. - OpenVPN over Cloak - OpenVPN with VPN masquerading as web traffic and protection against active-probbing detection. Ideal for bypassing blocking in regions with the highest levels of censorship. + 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. OpenVPN over Cloak - OpenVPN с маскировкой VPN под web-трафик и защитой от обнаружения active-probbing. Подходит для регионов с самым высоким уровнем цензуры. @@ -2841,7 +2841,7 @@ While it offers a blend of security, stability, and speed, it's essential t Замените DNS-сервер на Amnezia DNS. Это повысит уровень конфиденциальности. - Creates a file vault on your server to securely store and transfer files. + Create a file vault on your server to securely store and transfer files. Создайте на сервере файловое хранилище для безопасного хранения и передачи файлов. From 68fe20ddf637acc45e459f84d1619887e0501f4f Mon Sep 17 00:00:00 2001 From: Andrey Zaharow <59512038+andr13@users.noreply.github.com> Date: Sat, 17 Feb 2024 21:48:41 +0200 Subject: [PATCH 12/36] UI fixes (#596) UI fixes --- client/ui/qml/Pages2/PageSettingsApplication.qml | 1 + client/ui/qml/Pages2/PageStart.qml | 10 ++++++++-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/client/ui/qml/Pages2/PageSettingsApplication.qml b/client/ui/qml/Pages2/PageSettingsApplication.qml index 6a3c077b..372cd69e 100644 --- a/client/ui/qml/Pages2/PageSettingsApplication.qml +++ b/client/ui/qml/Pages2/PageSettingsApplication.qml @@ -139,6 +139,7 @@ PageType { text: qsTr("Reset settings and remove all data from the application") rightImageSource: "qrc:/images/controls/chevron-right.svg" + textColor: "#EB5757" clickedFunction: function() { var headerText = qsTr("Reset settings and remove all data from the application?") diff --git a/client/ui/qml/Pages2/PageStart.qml b/client/ui/qml/Pages2/PageStart.qml index bd55827e..d7c63755 100644 --- a/client/ui/qml/Pages2/PageStart.qml +++ b/client/ui/qml/Pages2/PageStart.qml @@ -43,6 +43,8 @@ PageType { } function onClosePage() { + tabBar.isServerInfoShow = tabBarStackView.currentItem.objectName !== PageController.getPagePath(PageEnum.PageSettingsServerInfo) + if (tabBarStackView.depth <= 1) { return } @@ -56,6 +58,8 @@ PageType { } else { tabBarStackView.push(pagePath, { "objectName" : pagePath }, StackView.Immediate) } + + tabBar.isServerInfoShow = page === PageEnum.PageSettingsServerInfo || tabBar.isServerInfoShow } function onGoToStartPage() { @@ -134,6 +138,7 @@ PageType { var pagePath = PageController.getPagePath(page) tabBarStackView.clear(StackView.Immediate) tabBarStackView.replace(pagePath, { "objectName" : pagePath }, StackView.Immediate) + tabBar.isServerInfoShow = false } Component.onCompleted: { @@ -147,6 +152,7 @@ PageType { id: tabBar property int previousIndex: 0 + property bool isServerInfoShow: false anchors.right: parent.right anchors.left: parent.left @@ -177,7 +183,7 @@ PageType { } TabImageButtonType { - isSelected: tabBar.currentIndex === 0 + isSelected: tabBar.isServerInfoShow ? false : tabBar.currentIndex === 0 image: "qrc:/images/controls/home.svg" onClicked: { tabBarStackView.goToTabBarPage(PageEnum.PageHome) @@ -211,7 +217,7 @@ PageType { } TabImageButtonType { - isSelected: tabBar.currentIndex === 2 + isSelected: tabBar.isServerInfoShow ? true : tabBar.currentIndex === 2 image: "qrc:/images/controls/settings-2.svg" onClicked: { tabBarStackView.goToTabBarPage(PageEnum.PageSettings) From b05a5ee1c6a0ca87592c438d670990db3844973f Mon Sep 17 00:00:00 2001 From: Andrey Zaharow <59512038+andr13@users.noreply.github.com> Date: Sat, 17 Feb 2024 21:57:31 +0200 Subject: [PATCH 13/36] fix connection button behavior (#595) Fix connection button behavior --- client/amnezia_application.cpp | 12 +++++++++--- client/ui/controllers/apiController.cpp | 19 +++++++++++++++---- client/ui/controllers/apiController.h | 2 ++ client/ui/qml/Components/ConnectButton.qml | 6 ++---- client/ui/qml/Pages2/PageStart.qml | 8 -------- 5 files changed, 28 insertions(+), 19 deletions(-) diff --git a/client/amnezia_application.cpp b/client/amnezia_application.cpp index 289b474b..dbd4160d 100644 --- a/client/amnezia_application.cpp +++ b/client/amnezia_application.cpp @@ -385,7 +385,13 @@ void AmneziaApplication::initControllers() m_engine->rootContext()->setContextProperty("ApiController", m_apiController.get()); connect(m_apiController.get(), &ApiController::updateStarted, this, [this]() { emit m_vpnConnection->connectionStateChanged(Vpn::ConnectionState::Connecting); }); - connect(m_apiController.get(), &ApiController::errorOccurred, this, - [this]() { emit m_vpnConnection->connectionStateChanged(Vpn::ConnectionState::Disconnected); }); - connect(m_apiController.get(), &ApiController::updateFinished, m_connectionController.get(), &ConnectionController::toggleConnection); + connect(m_apiController.get(), &ApiController::errorOccurred, this, [this](const QString &errorMessage) { + if (m_connectionController->isConnectionInProgress()) { + emit m_pageController->showErrorMessage(errorMessage); + } + + emit m_vpnConnection->connectionStateChanged(Vpn::ConnectionState::Disconnected); + }); + connect(m_apiController.get(), &ApiController::updateFinished, m_connectionController.get(), + &ConnectionController::toggleConnection); } diff --git a/client/ui/controllers/apiController.cpp b/client/ui/controllers/apiController.cpp index 43bea9fc..808fd2eb 100644 --- a/client/ui/controllers/apiController.cpp +++ b/client/ui/controllers/apiController.cpp @@ -70,14 +70,17 @@ QJsonObject ApiController::fillApiPayload(const QString &protocol, const ApiCont void ApiController::updateServerConfigFromApi() { QtConcurrent::run([this]() { + if (m_isConfigUpdateStarted) { + emit updateFinished(false); + return; + } + auto serverConfig = m_serversModel->getDefaultServerConfig(); auto containerConfig = serverConfig.value(config_key::containers).toArray(); - bool isConfigUpdateStarted = false; - if (serverConfig.value(config_key::configVersion).toInt() && containerConfig.isEmpty()) { emit updateStarted(); - isConfigUpdateStarted = true; + m_isConfigUpdateStarted = true; QNetworkAccessManager manager; @@ -110,6 +113,12 @@ void ApiController::updateServerConfigFromApi() QByteArray ba = QByteArray::fromBase64(data.toUtf8(), QByteArray::Base64UrlEncoding | QByteArray::OmitTrailingEquals); + if (ba.isEmpty()) { + emit errorOccurred(errorString(ApiConfigDownloadError)); + m_isConfigUpdateStarted = false; + return; + } + QByteArray ba_uncompressed = qUncompress(ba); if (!ba_uncompressed.isEmpty()) { ba = ba_uncompressed; @@ -133,11 +142,13 @@ void ApiController::updateServerConfigFromApi() qDebug() << reply->error(); qDebug() << reply->attribute(QNetworkRequest::HttpStatusCodeAttribute); emit errorOccurred(errorString(ApiConfigDownloadError)); + m_isConfigUpdateStarted = false; return; } } - emit updateFinished(isConfigUpdateStarted); + emit updateFinished(m_isConfigUpdateStarted); + m_isConfigUpdateStarted = false; return; }); } diff --git a/client/ui/controllers/apiController.h b/client/ui/controllers/apiController.h index c5d79ded..2a1393c4 100644 --- a/client/ui/controllers/apiController.h +++ b/client/ui/controllers/apiController.h @@ -39,6 +39,8 @@ private: QSharedPointer m_serversModel; QSharedPointer m_containersModel; + + bool m_isConfigUpdateStarted = false; }; #endif // APICONTROLLER_H diff --git a/client/ui/qml/Components/ConnectButton.qml b/client/ui/qml/Components/ConnectButton.qml index cb2b72dd..7d6b1455 100644 --- a/client/ui/qml/Components/ConnectButton.qml +++ b/client/ui/qml/Components/ConnectButton.qml @@ -138,9 +138,7 @@ Button { } onClicked: { - if (!ConnectionController.isConnectionInProgress) { - ServersModel.setCurrentlyProcessedServerIndex(ServersModel.defaultIndex) - ApiController.updateServerConfigFromApi() - } + ServersModel.setCurrentlyProcessedServerIndex(ServersModel.defaultIndex) + ApiController.updateServerConfigFromApi() } } diff --git a/client/ui/qml/Pages2/PageStart.qml b/client/ui/qml/Pages2/PageStart.qml index d7c63755..a6b79bfa 100644 --- a/client/ui/qml/Pages2/PageStart.qml +++ b/client/ui/qml/Pages2/PageStart.qml @@ -113,14 +113,6 @@ PageType { } } - Connections { - target: ApiController - - function onErrorOccurred(errorMessage) { - PageController.showErrorMessage(errorMessage) - } - } - StackViewType { id: tabBarStackView From 16db23c1594f87c7c7f717b9c4fdf95afb0ce75e Mon Sep 17 00:00:00 2001 From: pokamest Date: Sat, 17 Feb 2024 13:07:17 -0800 Subject: [PATCH 14/36] Rewrite sftp file copy to Qt way (#562) Rewrite sftp file copy to Qt way --- client/core/controllers/serverController.cpp | 8 +----- client/core/sshclient.cpp | 28 +++++++++----------- client/core/sshclient.h | 6 ++--- 3 files changed, 17 insertions(+), 25 deletions(-) diff --git a/client/core/controllers/serverController.cpp b/client/core/controllers/serverController.cpp index 8b250f18..9a170a85 100644 --- a/client/core/controllers/serverController.cpp +++ b/client/core/controllers/serverController.cpp @@ -211,13 +211,7 @@ ErrorCode ServerController::uploadFileToHost(const ServerCredentials &credential localFile.write(data); localFile.close(); -#ifdef Q_OS_WINDOWS - error = m_sshClient.sftpFileCopy(overwriteMode, localFile.fileName().toLocal8Bit().toStdString(), remotePath.toStdString(), - "non_desc"); -#else - error = m_sshClient.sftpFileCopy(overwriteMode, localFile.fileName().toStdString(), remotePath.toStdString(), - "non_desc"); -#endif + error = m_sshClient.sftpFileCopy(overwriteMode, localFile.fileName(), remotePath, "non_desc"); if (error != ErrorCode::NoError) { return error; diff --git a/client/core/sshclient.cpp b/client/core/sshclient.cpp index 0ac95662..03670b30 100644 --- a/client/core/sshclient.cpp +++ b/client/core/sshclient.cpp @@ -222,7 +222,7 @@ namespace libssh { return fromLibsshErrorCode(); } - ErrorCode Client::sftpFileCopy(const SftpOverwriteMode overwriteMode, const std::string& localPath, const std::string& remotePath, const std::string& fileDesc) + ErrorCode Client::sftpFileCopy(const SftpOverwriteMode overwriteMode, const QString& localPath, const QString& remotePath, const QString &fileDesc) { m_sftpSession = sftp_new(m_session); @@ -245,40 +245,38 @@ namespace libssh { const size_t bufferSize = 16384; char buffer[bufferSize]; - file = sftp_open(m_sftpSession, remotePath.c_str(), accessType, S_IRWXU); + file = sftp_open(m_sftpSession, remotePath.toStdString().c_str(), accessType, S_IRWXU); if (file == nullptr) { return closeSftpSession(); } - int localFileSize = std::filesystem::file_size(localPath); + int localFileSize = QFileInfo(localPath).size(); int chunksCount = localFileSize / (bufferSize); - std::ifstream fin(localPath, std::ios::binary | std::ios::in); + QFile fin(localPath); - if (fin.is_open()) { + if (fin.open(QIODevice::ReadOnly)) { for (int currentChunkId = 0; currentChunkId < chunksCount; currentChunkId++) { - fin.read(buffer, bufferSize); + QByteArray chunk = fin.read(bufferSize); + if (chunk.size() != bufferSize) return ErrorCode::SshSftpEofError; - int bytesWritten = sftp_write(file, buffer, bufferSize); + int bytesWritten = sftp_write(file, chunk.data(), chunk.size()); - std::string chunk(buffer, bufferSize); - - if (bytesWritten != bufferSize) { + if (bytesWritten != chunk.size()) { fin.close(); sftp_close(file); return closeSftpSession(); } } - int lastChunkSize = localFileSize % (bufferSize); + int lastChunkSize = localFileSize % bufferSize; if (lastChunkSize != 0) { - fin.read(buffer, lastChunkSize); + QByteArray lastChunk = fin.read(lastChunkSize); + if (lastChunk.size() != lastChunkSize) return ErrorCode::SshSftpEofError; - std::string chunk(buffer, lastChunkSize); - - int bytesWritten = sftp_write(file, buffer, lastChunkSize); + int bytesWritten = sftp_write(file, lastChunk.data(), lastChunkSize); if (bytesWritten != lastChunkSize) { fin.close(); diff --git a/client/core/sshclient.h b/client/core/sshclient.h index 4e08faaa..74c3b724 100644 --- a/client/core/sshclient.h +++ b/client/core/sshclient.h @@ -33,9 +33,9 @@ namespace libssh { const std::function &cbReadStdErr); ErrorCode writeResponse(const QString &data); ErrorCode sftpFileCopy(const SftpOverwriteMode overwriteMode, - const std::string& localPath, - const std::string& remotePath, - const std::string& fileDesc); + const QString &localPath, + const QString &remotePath, + const QString& fileDesc); ErrorCode getDecryptedPrivateKey(const ServerCredentials &credentials, QString &decryptedPrivateKey, const std::function &passphraseCallback); private: ErrorCode closeChannel(); From 698cfe910c22ccbd98915dbfb0e4e76b53761008 Mon Sep 17 00:00:00 2001 From: agalehaga <157917463+agalehaga@users.noreply.github.com> Date: Sat, 17 Feb 2024 23:09:05 +0200 Subject: [PATCH 15/36] =?UTF-8?q?add=20navigation=20using=20enter=20+=20bu?= =?UTF-8?q?ttons=20will=20be=20clicked=20if=20enter=20(if=20but=E2=80=A6?= =?UTF-8?q?=20(#556)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Enter navigation --- client/translations/amneziavpn_ar.ts | 473 ++- client/translations/amneziavpn_fa_IR.ts | 2535 ++++++++--------- client/translations/amneziavpn_ru.ts | 2292 +++++++-------- client/translations/amneziavpn_zh_CN.ts | 2380 +++++++--------- client/ui/qml/Components/QuestionDrawer.qml | 4 +- .../qml/Components/ShareConnectionDrawer.qml | 18 +- client/ui/qml/Controls2/BasicButtonType.qml | 89 +- client/ui/qml/Controls2/PageType.qml | 15 + client/ui/qml/Controls2/PopupType.qml | 2 +- .../qml/Controls2/TextFieldWithHeaderType.qml | 11 +- .../ui/qml/Pages2/PageProtocolAwgSettings.qml | 34 +- .../qml/Pages2/PageProtocolCloakSettings.qml | 16 +- .../Pages2/PageProtocolOpenVpnSettings.qml | 21 +- .../PageProtocolShadowSocksSettings.qml | 12 +- .../ui/qml/Pages2/PageServiceSftpSettings.qml | 6 +- .../Pages2/PageServiceTorWebsiteSettings.qml | 2 +- client/ui/qml/Pages2/PageSettingsAbout.qml | 8 +- client/ui/qml/Pages2/PageSettingsBackup.qml | 4 +- client/ui/qml/Pages2/PageSettingsDns.qml | 13 +- .../ui/qml/Pages2/PageSettingsServerInfo.qml | 12 +- .../qml/Pages2/PageSettingsSplitTunneling.qml | 4 + .../qml/Pages2/PageSetupWizardCredentials.qml | 12 +- client/ui/qml/Pages2/PageSetupWizardEasy.qml | 4 +- .../qml/Pages2/PageSetupWizardInstalling.qml | 2 +- .../PageSetupWizardProtocolSettings.qml | 12 +- client/ui/qml/Pages2/PageSetupWizardStart.qml | 6 +- .../ui/qml/Pages2/PageSetupWizardTextKey.qml | 8 +- .../qml/Pages2/PageSetupWizardViewConfig.qml | 4 +- client/ui/qml/Pages2/PageShare.qml | 20 +- client/ui/qml/Pages2/PageShareFullAccess.qml | 2 +- client/ui/qml/Pages2/PageStart.qml | 1 + client/ui/qml/main2.qml | 6 +- 32 files changed, 3655 insertions(+), 4373 deletions(-) diff --git a/client/translations/amneziavpn_ar.ts b/client/translations/amneziavpn_ar.ts index 2632e07d..4214ffa8 100644 --- a/client/translations/amneziavpn_ar.ts +++ b/client/translations/amneziavpn_ar.ts @@ -51,17 +51,17 @@ ConnectionTypeSelectionDrawer - + Add new connection إضافة اتصال جديد - + Configure your server قم بتهيئة الخادم الخاص بك - + Open config file, key or QR code افتح ملف تعريف, مفتاح تعريف او رمز QR @@ -100,12 +100,12 @@ HomeContainersListView - + Unable change protocol while there is an active connection قم بتغيير البروتوكول عند تواجد اتصال - + The selected protocol is not supported on the current platform البروتوكول المحدد غير مدعوم علي المنصة الحالية @@ -270,17 +270,17 @@ Already installed containers were found on the server. All installed containers PageHome - + VPN protocol بروتوكول VPN - + Servers الخوادم - + Unable change server while there is an active connection لا يمكن تغير الخادم بينما هناك اتصال مفعل @@ -288,87 +288,87 @@ Already installed containers were found on the server. All installed containers PageProtocolAwgSettings - + AmneziaWG settings اعدادات AmneziaWG - + Port منفذ - + Junk packet count عدد الحزم الغير مرغوب فيها - + Junk packet minimum size الحد الادني لحجم الحزمة الغير مرغوب فيها - + Junk packet maximum size الحجم الاقصي للحزمة الغير مرغوب فيها - + Init packet junk size Init packet junk size - + Response packet junk size حجم حزمة الاستجابة الغير مرغوب فيها - + Init packet magic header إطلاق حزمة magic header - + Response packet magic header حزمة الرد magic header - + Transport packet magic header نقل حزمة magic header - + Underload packet magic header تحميل حزمة magic header - + Remove AmneziaWG قم بحذف AmneziaWG - + Remove AmneziaWG from server? قم بحذف AmneziaWG من الخادم؟ - + All users with whom you shared a connection will no longer be able to connect to it. جميع المستخدمين الذين قمت بمشاركة اتصال معهم لن يستطيعو الاتصال. - + Continue واصل - + Cancel إلغاء - + Save and Restart Amnezia احفظ و اعِد تشغيل Amnezia @@ -376,28 +376,28 @@ Already installed containers were found on the server. All installed containers PageProtocolCloakSettings - + Cloak settings Cloak إعدادات - + Disguised as traffic from متنكراً في حركة مرور من - + Port منفذ - - + + Cipher الشفرة - + Save and Restart Amnezia احفظ و اعِد تشغيل Amnezia @@ -405,180 +405,180 @@ Already installed containers were found on the server. All installed containers PageProtocolOpenVpnSettings - + OpenVPN settings OpenVPN اعدادات - + VPN address subnet الشبكة الفرعية لعنوان VPN - + Network protocol بروتوكول الشبكة - + Port منفذ - + Auto-negotiate encryption التفاوض التلقائي علي الشبكة - - + + Hash - + SHA512 - + SHA384 - + SHA256 - + SHA3-512 - + SHA3-384 - + SHA3-256 - + whirlpool - + BLAKE2b512 - + BLAKE2s256 - + SHA1 - - + + Cipher شفرة - + AES-256-GCM - + AES-192-GCM - + AES-128-GCM - + AES-256-CBC - + AES-192-CBC - + AES-128-CBC - + ChaCha20-Poly1305 - + ARIA-256-CBC - + CAMELLIA-256-CBC - + none لا شئ - + TLS auth TLS مصادقة - + Block DNS requests outside of VPN احظر طلبات DNS خارج ال VPN - + Additional client configuration commands اوامر تكوين العميل الاضافية - - + + Commands: الاوامر: - + Additional server configuration commands اوامر تكوين الخادم الاضافية - + Remove OpenVPN احذف OpenVPN - + Remove OpenVpn from server? احذف OpenVPN من الخادم? - + All users with whom you shared a connection will no longer be able to connect to it. جميع المستخدمين الذين شاركت معهم الاتصال لن يستطيعو الاتصال مجدداً. @@ -587,17 +587,17 @@ Already installed containers were found on the server. All installed containers جميع المستخدمين الذين شاركت اتصال معهم لن يستطيعو الاتصال بعد الان - + Continue واصل - + Cancel إلغاء - + Save and Restart Amnezia احفظ واعِد تشغيل Amnezia @@ -619,22 +619,22 @@ Already installed containers were found on the server. All installed containers اختيارات الاتصال - + Connection options %1 %1 اختيارات الاتصال - + Remove احذف - + Remove %1 from server? احذف %1 من الخادم ? - + All users with whom you shared a connection will no longer be able to connect to it. جميع المستخدمين الذين شاركت معهم اتصال لن يستطيعو الاتصال بعد الان. @@ -647,12 +647,12 @@ Already installed containers were found on the server. All installed containers جميع المستخدمين الذين شاركت اتصال معهم لن يستطيعو الاتصال بعد الان - + Continue واصل - + Cancel إلغاء @@ -660,23 +660,23 @@ Already installed containers were found on the server. All installed containers PageProtocolShadowSocksSettings - + ShadowSocks settings ShadowSocks إعدادات - + Port منفذ - - + + Cipher تشفير - + Save and Restart Amnezia احفظ واعِد تشغيل Amnezia @@ -943,62 +943,62 @@ And if you don't like the app, all the more support it - the donation will اظهر المزيد علي GitHub - + https://github.com/amnezia-vpn/amnezia-client#donate - + Contacts التواصل - + Telegram group مجموعة ال Telegram - + To discuss features لمناقشة الميزات - + https://t.me/amnezia_vpn_en - + Mail البريد - + For reviews and bug reports لل مراجعات والابلاغات عن المشاكل - + Github - + https://github.com/amnezia-vpn/amnezia-client - + Website موقع - + https://amnezia.org - + Check for updates تحقق من وجود تحديثات @@ -1049,42 +1049,42 @@ And if you don't like the app, all the more support it - the donation will اللغة - + Logging تسجيل - + Enabled مٌفعل - + Disabled مٌعطل - + Reset settings and remove all data from the application إعادة ضبط الاعدادات ومسح جميع البيانات من التطبيق - + Reset settings and remove all data from the application? إعادة ضبط الاعدادات ومسح جميع البيانات من التطبيق؟ - + All settings will be reset to default. All installed AmneziaVPN services will still remain on the server. سيتم ضبط الاعدادات الافتراضية. جميع خدمات AmneziaVPN المٌثبتة ستبقي علي الخادم. - + Continue واصل - + Cancel إلغاء @@ -1244,62 +1244,62 @@ And if you don't like the app, all the more support it - the donation will PageSettingsDns - + Default server does not support custom dns الخادم الافتراضي لا يدعم DNS مخصص - + DNS servers خوادم ال DNS - + If AmneziaDNS is not used or installed AmneziaVPN ليس مٌستخدم او مٌثبت - + Primary DNS الرئيسي DNS - + Secondary DNS الثانوي DNS - + Restore default استعادة الافتراضي - + Restore default DNS settings? قم بأعادة ضبط إعدادات ال DNS الافتراضية؟ - + Continue واصل - + Cancel إلغاء - + Settings have been reset لم يتم إعادة ضبط الإعدادات - + Save احفظ - + Settings saved تم حفظ الإعدادات @@ -1357,12 +1357,12 @@ And if you don't like the app, all the more support it - the donation will إلغاء - + Logs have been cleaned up تم مسح السجلات - + Clear logs احذف السجلات @@ -1395,13 +1395,12 @@ And if you don't like the app, all the more support it - the donation will حذف الملفات الشخصية المخزنة مؤقتاً؟ - + Do you want to reboot the server? هل تريد إعادة تشغيل الخادم؟ - - + Do you want to clear server from Amnezia software? هل تريد حذف الخادم من Amnezia? @@ -1412,78 +1411,74 @@ And if you don't like the app, all the more support it - the donation will - - - - - + + + + Continue واصل - - - - - + + + + Cancel إلغاء - + Check the server for previously installed Amnezia services افحص الخادم عن اي خدمات Amnezia مٌثبتة سابقاُ - + Add them to the application if they were not displayed اضفهم إلي التطبيق إذا لم يكونو ظاهرين - + Reboot server إعادة تشغيل الخادم - + The reboot process may take approximately 30 seconds. Are you sure you wish to proceed? عملية إعادة التشغيل قد تستغرق 30 ثانية, هل تريد الاستكمال؟ - + Remove server from application احذف خادم من التطبيق - + Do you want to remove the server from application? هل تريد حذف الخادم من التطبيق؟ - + Reset API config إعادة تكوين API - + Do you want to reset API config? هل تريد إعادة تكوين API? - + All installed AmneziaVPN services will still remain on the server. جميع خدمات AmneziaVPN المٌثبتة ستظل علي الخادم. - - + Clear server from Amnezia software احذف خادم من Amnezia - - + All containers will be deleted on the server. This means that configuration files, keys and certificates will be deleted. سيتم حذف جميع الحاويات, هذا يعني ان جميع ملفات التكوين, شهادات و مفاتيح التعريف سيتم حذفهم. @@ -1491,27 +1486,27 @@ And if you don't like the app, all the more support it - the donation will PageSettingsServerInfo - + Server name اسم الخادم - + Save احفظ - + Protocols البروتوكولات - + Services الخدمات - + Data البيانات @@ -1580,42 +1575,42 @@ And if you don't like the app, all the more support it - the donation will قسم نفق الموقع - + Default server does not support split tunneling function السرفر الافتراضي لا يدعم ميزة تقسيم الانفاق - + Addresses from the list should not be accessed via VPN لا يجب الولوج للعنواين المذكورة هنا من خلال ال VPN - + Split tunneling تقسيم الانفاق - + Mode وضع - + Remove احذف - + Continue واصل - + Cancel إلغاء - + Only the sites listed here will be accessed through the VPN سيتم الولوج للمواقع المذكورة هنا فقط عن طريق ال VPN @@ -1625,50 +1620,50 @@ And if you don't like the app, all the more support it - the donation will موقع او IP - + Import / Export Sites - + Import استرد - + Save site list احفظ قائمة المواقع - + Save sites احفظ المواقع - - - + + + Sites files (*.json) - + Import a list of sites استرد قائمة من المواقع - + Replace site list تبديل قائمة المواقع - - + + Open sites file افتح ملف المواقع - + Add imported sites to existing ones إضافة المواقع المستردة للمواقع الموجودة @@ -1723,57 +1718,57 @@ It's okay as long as it's from someone you trust. PageSetupWizardCredentials - + Configure your server تكوين الخادم الخاص بك - + Server IP address [:port] عنوان خادم IP [:منفذ] - + Login to connect via SSH قم بتسجيل الدخول للأتصال عن طريق SSH - + Continue واصل - + All data you enter will remain strictly confidential and will not be shared or disclosed to the Amnezia or any third parties ستظل جميع البيانات التي تدخلها سرية للغاية ولن تتم مشاركتها أو الكشف عنها ل Amnezia أو أي طرف ثالث - + 255.255.255.255:22 - + Password or SSH private key كلمة مرور او مفتاح SSH خاص - + Ip address cannot be empty لا يمكن لعنوان IP ان يكون فارغ - + Enter the address in the format 255.255.255.255:88 ادخل العنوان في شكل 255.255.255.255:88 - + Login cannot be empty تسجيل دخول لا يمكن ان يكون فارغ - + Password/private key cannot be empty كلمة مرور/مفتاح خاص لأ يمكن ان يكونو فارغين @@ -1801,7 +1796,7 @@ It's okay as long as it's from someone you trust. واصل - + Set up later إعداد في وقت لاحق @@ -1848,32 +1843,32 @@ It's okay as long as it's from someone you trust. PageSetupWizardProtocolSettings - + Installing %1 جاري تثبيت %1 - + More detailed اكثر تفصيلاً - + Close اغلق - + Network protocol بروتوكول شبكة - + Port منفذ - + Install تثبيت @@ -1927,7 +1922,7 @@ It's okay as long as it's from someone you trust. ليس لدي اي شئ - + https://amnezia.org/instructions/0_starter-guide @@ -1935,27 +1930,27 @@ It's okay as long as it's from someone you trust. PageSetupWizardTextKey - + Connection key مفتاح اتصال - + A line that starts with vpn://... سطر يبدأ ب vpn://... - + Key مفتاح - + Insert ادخل - + Continue واصل @@ -2011,53 +2006,53 @@ It's okay as long as it's from someone you trust. احفظ تكوين Cloak - + For the AmneziaVPN app AmneziaVPN من اجل تطبيق - + OpenVpn native format تنسيق OpenVpn الاصلي - + WireGuard native format تنسيق WireGuard الاصلي - + ShadowSocks native format تنسيق ShadowSocks الاصلي - + Cloak native format تنسيق Cloak الاصلي - + Share VPN Access شارك اتصال VPN - + Share full access to the server and VPN شارك ولوج كامل للخادم و ال VPN - + Use for your own devices, or share with those you trust to manage the server. استخدمه للأجهزة الخاصة بك، أو شاركه مع من تثق بهم لإدارة الخادم. - + Users المستخدمين - + Share VPN access without the ability to manage the server شارك اتصال VPN بدون القدرة علي إدارة الخادم @@ -2067,52 +2062,52 @@ It's okay as long as it's from someone you trust. ابحث - + Creation date: تاريخ الإنشاء: - + Rename إعادة التسمية - + Client name اسم العميل - + Save احفظ - + Revoke سحب وإبطال - + Revoke the config for a user - %1? سحب وإبطال للمستخدم - %1? - + The user will no longer be able to connect to your server. المستخدم لن يكون قادر علي الاتصال بعد الان. - + Continue واصل - + Cancel إلغاء - + Connection الاتصال @@ -2125,13 +2120,13 @@ It's okay as long as it's from someone you trust. الخوادم + - Server خادم - + File with connection settings to ملف بإعدادات إلي @@ -2146,28 +2141,28 @@ It's okay as long as it's from someone you trust. بروتوكول - + Connection to اتصال إلي - + Config revoked تم سحب وإبطال التكوين - + User name اسم المستخدم - - + + Connection format تنسيق الاتصال - + Share شارك @@ -2193,33 +2188,33 @@ It's okay as long as it's from someone you trust. إذا شاركت ولوج كامل مع الاشخاص, سيكونو قادرين علي حذف وإضافة بروتوكولات و خدمات إلي الخادم, والذي سيجعل VPN يعمل بشكل غير صحيح لجميع المستخدمين. - + Server خادم - + Accessing التواصل - + File with accessing settings to ملف مع إعدادات الوصول إلي - + Share مشاركة - + Connection to اتصال إلي - + File with connection settings to معلف مع إعدادات الاتصال إلي @@ -2977,7 +2972,7 @@ While it offers a blend of security, stability, and speed, it's essential t SelectLanguageDrawer - + Choose language اختر لغة @@ -3023,33 +3018,35 @@ While it offers a blend of security, stability, and speed, it's essential t ShareConnectionDrawer - + Save AmneziaVPN config احفظ تكوين AmneziaVPN - + Share شارك - + Copy انسخ - - + + + + Copied تم النسخ - + Copy config string انسخ نص التكوين - + Show connection settings اظهر إعدادات الاتصال @@ -3058,7 +3055,7 @@ While it offers a blend of security, stability, and speed, it's essential t 展示内容 - + To read the QR code in the Amnezia app, select "Add server" → "I have data to connect" → "QR code, key or settings file" حتي تقرأ رمز ال QR في تطبيق Amnezia, اختار "إضافة خادم" - "لدي بيانات الاتصال" - "رمز Qr, او مفتاح تعريف او ملف إعدادات" @@ -3142,7 +3139,7 @@ While it offers a blend of security, stability, and speed, it's essential t TextFieldWithHeaderType - + The field can't be empty الحقل لا يمكن ان يكون فارغ @@ -3234,12 +3231,12 @@ While it offers a blend of security, stability, and speed, it's essential t main2 - + Private key passphrase عبارة المرور الخاصة بالمفتاح - + Save احفظ diff --git a/client/translations/amneziavpn_fa_IR.ts b/client/translations/amneziavpn_fa_IR.ts index 488d6564..d941cc8a 100644 --- a/client/translations/amneziavpn_fa_IR.ts +++ b/client/translations/amneziavpn_fa_IR.ts @@ -1,102 +1,69 @@ - - AmneziaApplication - - Split tunneling for WireGuard is not implemented, the option was disabled - Раздельное туннелирование для "Wireguard" не реализовано,опция отключена - - - Split tunneling for %1 is not implemented, the option was disabled - جداسازی ترافیک برای %1 پیاده سازی نشده، این گزینه غیرفعال است - - - - AndroidController - - AmneziaVPN - AmneziaVPN - - - VPN Connected - Refers to the app - which is currently running the background and waiting - وی‎پی‎ان متصل است - - - - ApiController - - - Error when retrieving configuration from cloud server - خطا در حین دریافت پیکربندی از سمت سرور - - ConnectionController - - VPN Protocols is not installed. - Please install VPN container at first - پروتکل وی‎پی‎ان نصب نشده است -لطفا کانتینر وی‎پی‎ان را نصب کنید + + + + + Connect + - - Connection... - در حال ارتباط... + + VPN Protocols is not installed. + Please install VPN container at first + + Connection... + + + + Connected - متصل + - - Settings updated successfully, Reconnnection... - تنظیمات به روز رسانی شد -در حال اتصال دوباره... - - - - Settings updated successfully - تنظیمات با موفقیت به‎روز‎رسانی شدند - - - - Reconnection... - اتصال دوباره... - - - - - - Connect - اتصال + Reconnection... + - + Disconnection... - قطع ارتباط... + + + + + Settings updated successfully, Reconnnection... + + + + + Settings updated successfully + ConnectionTypeSelectionDrawer - + Add new connection - ایجاد ارتباط جدید + - + Configure your server - تنظیم سرور + - + Open config file, key or QR code - بارگذاری فایل تنظیمات، کلید یا QR Code + @@ -104,22 +71,22 @@ C&ut - &بریدن + &Copy - &کپی + &Paste - &پیوست + &SelectAll - &انتخاب همه + @@ -127,32 +94,28 @@ Access error! - خطای دسترسی! + HomeContainersListView - + Unable change protocol while there is an active connection - امکان تغییر پروتکل در هنگام متصل بودن وجود ندارد + - + The selected protocol is not supported on the current platform - پروتکل انتخاب شده بر روی این پلتفرم پشتیبانی نمی‎‎شود - - - Reconnect via VPN Procotol: - Переподключение через VPN протокол: + ImportController - + Scanned %1 of %2. - ارزیابی %1 از %2. + @@ -161,32 +124,30 @@ %1 installed successfully. - %1 با موفقیت نصب شد + %1 is already installed on the server. - %1 در حال حاضر بر روی سرور نصب شده است + Added containers that were already installed on the server - -کانتینرهایی که بر روی سرور موجود بودند اضافه شدند + Already installed containers were found on the server. All installed containers have been added to the application - -کانتینرهای نصب شده بر روی سرور شناسایی شدند. تمام کانتینترهای نصب شده به نرم افزار اضافه شدند + Settings updated successfully - تنظیمات با موفقیت به‎روز‎رسانی شدند + @@ -196,27 +157,27 @@ Already installed containers were found on the server. All installed containers Server '%1' was removed - سرور %1 حذف شد + All containers from server '%1' have been removed - تمام کانتینترها از سرور %1 حذف شدند + %1 has been removed from the server '%2' - %1 از سرور %2 حذف شد + Please login as the user - لطفا به عنوان کاربر وارد شوید + Server added successfully - سرور با موفقیت اضافه شد + @@ -224,17 +185,17 @@ Already installed containers were found on the server. All installed containers Read key failed: %1 - خواندن کلید انجام نشد: %1 + Write key failed: %1 - نوشتن کلید انجام نشد: %1 + Delete key failed: %1 - حذف کلید انجام نشد: %1 + @@ -243,27 +204,27 @@ Already installed containers were found on the server. All installed containers AmneziaVPN - AmneziaVPN + VPN Connected - وی‎پی‎ان وصل شد + VPN Disconnected - وی‎پی‎ان قطع شد + AmneziaVPN notification - اخطار AmneziaVPN + Unsecured network detected: - شبکه ناامن شناسایی شد: + @@ -271,355 +232,343 @@ Already installed containers were found on the server. All installed containers Removing services from %1 - حذف سرویس‎ها از %1 + Usually it takes no more than 5 minutes - معمولا بیش از 5 دقیقه طول نمی‎کشد + PageHome - + VPN protocol - پروتکل وی‎پی‎ان + - + Servers - سرورها + - + Unable change server while there is an active connection - امکان تغییر سرور در هنگام متصل بودن وجود ندارد + PageProtocolAwgSettings - + AmneziaWG settings - تنظیمات AmneziaWG + - + Port - پورت + - + Junk packet count - تعداد بسته‎های ناخواسته + - + Junk packet minimum size - Junk packet minimum size + - + Junk packet maximum size - Junk packet maximum size + - + Init packet junk size - Init packet junk size + - + Response packet junk size - Response packet junk size + - + Init packet magic header - Init packet magic header + - + Response packet magic header - Response packet magic header + - + Transport packet magic header - Transport packet magic header - - - - Underload packet magic header - Underload packet magic header - - - - Remove AmneziaWG - حذف AmneziaWG - - - - Remove AmneziaWG from server? - آیا میخواهید AmneziaWG از سرور حذف شود؟ + + Underload packet magic header + + + + + Remove AmneziaWG + + + + + Remove AmneziaWG from server? + + + + All users with whom you shared a connection will no longer be able to connect to it. - تمام کاربرانی که این اتصال را با آن‎ها با اشتراک گذاشته‎اید دیگر نمی‎توانند به آن متصل شوند. + - All users who you shared a connection with will no longer be able to connect to it. - Все пользователи, с которыми вы поделились этим VPN-протоколом, больше не смогут к нему подключаться. - - - + Continue - ادامه + - + Cancel - کنسل + - + Save and Restart Amnezia - ذخیره و راه اندازی مجدد Amnezia + PageProtocolCloakSettings - + Cloak settings - تنظیمات Cloak + - + Disguised as traffic from - پنهان کردن به عنوان ترافیک از + - + Port - پورت + - - + + Cipher - رمزگذاری + - + Save and Restart Amnezia - ذخیره و راه اندازی دوباره Amnezia + PageProtocolOpenVpnSettings - + OpenVPN settings - تنظیمات OpenVPN + - VPN Addresses Subnet - آدرس زیرشبکه وی‎پی‎ان - - - + VPN address subnet - + Network protocol - پروتکل شبکه + - + Port - پورت + - + Auto-negotiate encryption - رمزگذاری خودکار - - - - - Hash - هش - - - - SHA512 - SHA512 - - - - SHA384 - SHA384 - - - - SHA256 - SHA256 - - - - SHA3-512 - SHA3-512 + - SHA3-384 - SHA3-384 - - + Hash + + + + + SHA512 + + + + + SHA384 + + + + + SHA256 + + + + + SHA3-512 + + + + + SHA3-384 + + + + SHA3-256 - SHA3-256 + - + whirlpool - whirlpool + - + BLAKE2b512 - BLAKE2b512 + - + BLAKE2s256 - BLAKE2s256 + - + SHA1 - SHA1 - - - - - Cipher - رمزگذاری - - - - AES-256-GCM - AES-256-GCM - - - - AES-192-GCM - AES-192-GCM - - - - AES-128-GCM - AES-128-GCM - - - - AES-256-CBC - AES-256-CBC - - - - AES-192-CBC - AES-192-CBC - - - - AES-128-CBC - AES-128-CBC + - ChaCha20-Poly1305 - ChaCha20-Poly1305 - - + Cipher + + + + + AES-256-GCM + + + + + AES-192-GCM + + + + + AES-128-GCM + + + + + AES-256-CBC + + + + + AES-192-CBC + + + + + AES-128-CBC + + + + + ChaCha20-Poly1305 + + + + ARIA-256-CBC - ARIA-256-CBC + - + CAMELLIA-256-CBC - CAMELLIA-256-CBC + - + none - none + - + TLS auth - اعتبار TLS + - + Block DNS requests outside of VPN - مسدود کردن درخواست‎های DNS خارج از وی‎پی‎ان + - + Additional client configuration commands - تنظیمات و دستورات اضافه برنامه متصل شونده + - - + + Commands: - دستورات: + - + Additional server configuration commands - تنظیمات و دستورات اضافه سرور + - + Remove OpenVPN - حذف OpenVPN + - + Remove OpenVpn from server? - آیا میخواهید OpenVPN از سرور حذف شود؟ + - + All users with whom you shared a connection will no longer be able to connect to it. - تمام کاربرانی که این اتصال را با آن‎ها با اشتراک گذاشته‎اید دیگر نمی‎توانند به آن متصل شوند. + - All users who you shared a connection with will no longer be able to connect to it. - Все пользователи, с которыми вы поделились этим VPN-протоколом, больше не смогут к нему подключаться. - - - + Continue - ادامه + - + Cancel - کنسل + - + Save and Restart Amnezia - ذخیره و راه اندازی دوباره Amnezia + @@ -627,77 +576,66 @@ Already installed containers were found on the server. All installed containers settings - تنظیمات + Show connection options - نمایش تنظیمات اتصال + - + Connection options %1 - تنظیمات اتصال %1 - - - - Remove - حذف - - - - Remove %1 from server? - %1 از سرور حذف شود؟ - - - - All users with whom you shared a connection will no longer be able to connect to it. - تمام کاربرانی که این اتصال را با آن‎ها با اشتراک گذاشته‎اید دیگر نمی‎توانند به آن متصل شوند. - - - All users who you shared a connection with will no longer be able to connect to it. - Все пользователи, с которыми вы поделились этим VPN-протоколом, больше не смогут к нему подключаться. + - Continue - ادامه + Remove + - + + Remove %1 from server? + + + + + All users with whom you shared a connection will no longer be able to connect to it. + + + + + Continue + + + + Cancel - کنسل + PageProtocolShadowSocksSettings - + ShadowSocks settings - تنظیمات ShadowSocks + - + Port - پورت + - - + + Cipher - رمزگذاری + - + Save and Restart Amnezia - ذخیره و راه اندازی دوباره Amnezia - - - - PageServerContainers - - Continue - Продолжить + @@ -706,33 +644,32 @@ Already installed containers were found on the server. All installed containers A DNS service is installed on your server, and it is only accessible via VPN. - یک سرویس DSN بر روی سرور شما نصب شده و فقط از طریق وی‎پی‎ان قابل دسترسی می‎باشد - + The DNS address is the same as the address of your server. You can configure DNS in the settings, under the connections tab. - آدرس DSN همان آدرس سرور شماست. میتوانید از قسمت تنظیمات و تب اتصالات DSN خود را تنظیم کنید + Remove - جذف + Remove %1 from server? - %1 از سرور حذف شود؟ + Continue - ادامه + Cancel - کنسل + @@ -740,17 +677,17 @@ Already installed containers were found on the server. All installed containers Settings updated successfully - تنظیمات با موفقیت به‎روز‎رسانی شد + SFTP settings - تنظیمات SFTP + Host - هاست + @@ -758,69 +695,69 @@ Already installed containers were found on the server. All installed containers Copied - کپی شد + Port - پورت + Login - ورود + Password - رمز عبور + Mount folder on device - بارگذاری پوشه بر روی دستگاه + In order to mount remote SFTP folder as local drive, perform following steps: <br> - برای بارگذاری پوشه SFTP بر روی درایو محلی قدم‎های زیر را انجام دهید: <br> + <br>1. Install the latest version of - <br> 1. آخرین نسخه را نصب کنید: + <br>2. Install the latest version of - <br> 2. آخرین نسخه را نصب کنید: + Detailed instructions - جزییات دستورالعمل‎ها + Remove SFTP and all data stored there - حذف SFTP و تمام داده‎های ذخیره شده در آن + Remove SFTP and all data stored there? - پوشه SFTP و تمام داده‎های آن حذف شوند؟ + Continue - ادامه + Cancel - کنسل + @@ -828,22 +765,22 @@ Already installed containers were found on the server. All installed containers Settings updated successfully - تنظیمات با موفقیت به‎روز‎‌رسانی شد + Tor website settings - تنظیمات وب‎سایت Tor + Website address - آدرس وب‎سایت + Copied - کپی شد + @@ -855,42 +792,30 @@ Already installed containers were found on the server. All installed containers After creating your onion site, it takes a few minutes for the Tor network to make it available for use. - - Use <a href="https://www.torproject.org/download/" style="color: #FBB26A;">Tor Browser</a> to open this url. - از <a href="https://www.torproject.org/download/" style="color: #FBB26A;">Tor Browser</a> برای باز کردن این url استفاده کنید. - - - After installation it takes several minutes while your onion site will become available in the Tor Network. - بعد از نصب چند دقیقه طول میکشد که سایت پیازی شما در شبکه Tor در دسترس قرار گیرد. - When configuring WordPress set the this onion address as domain. - زمانی که سایت وردپرس را تنظیم میکنید این آدرس پیازی را به عنوان دامنه قرار دهید. - - - When configuring WordPress set the this address as domain. - При настройке WordPress укажите этот onion адрес в качестве домена. + Remove website - حذف وب سایت + The site with all data will be removed from the tor network. - سایت با تمام داده‎ها از شبکه Tor حذف خواهد شد. + Continue - ادامه + Cancel - کنسل + @@ -898,45 +823,41 @@ Already installed containers were found on the server. All installed containers Settings - تنظیمات + Servers - سرورها + Connection - ارتباط + Application - نرم‎افزار + Backup - بک‎آپ + About AmneziaVPN - درباره Amnezia + Close application - بستن نرم‎افزار + PageSettingsAbout - - Support the project with a donation - حمایت از پروژه با کمک‎های مالی - Support Amnezia @@ -945,87 +866,87 @@ Already installed containers were found on the server. All installed containers This is a free and open source application. If you like it, support the developers with a donation. - این نرم‎افزار یک پروژه رایگان است. اگر آن را دوست دارید با کمک‎های مالی از توسعه‎دهندگان آن حمایت کنید. + And if you don’t like the application, all the more reason to support it - the donation will be used for the improving the application. - و اگر آن‎را دوست ندارید دلایل بیشتری برای کمک به نرم‎افزار است، کمک‎های مالی شما برای بهبود نرم‎افزار استفاده میشود. + Card on Patreon - کارت روی Patreon + https://www.patreon.com/amneziavpn - https://www.patreon.com/amneziavpn + Show other methods on Github - نمایش متد‎های دیگر در گیت هاب + - + https://github.com/amnezia-vpn/amnezia-client#donate - + Contacts - مخاطب + - + Telegram group - گروه تلگرام + - + To discuss features - برای گفتگو در مورد ویژگی‎ها + - + https://t.me/amnezia_vpn_en - https://t.me/amnezia_vpn + - + Mail - ایمیل + - + For reviews and bug reports - برای ارائه نظرات و گزارشات باگ + - + Github - Github + - + https://github.com/amnezia-vpn/amnezia-client - https://github.com/amnezia-vpn/amnezia-client + - + Website - وب سایت + - + https://amnezia.org - https://amnezia.org + - + Check for updates - بررسی بروز‎رسانی + @@ -1033,151 +954,151 @@ Already installed containers were found on the server. All installed containers Application - نرم افزار + Allow application screenshots - مجوز اسکرین‎شات در برنامه + Auto start - شروع خودکار + Launch the application every time the device is starts - راه‎اندازی نرم‎افزار با هر بار روشن شدن دستگاه + Start minimized - شروع به صورت کوچک + Launch application minimized - راه‎اندازی برنامه به صورت کوچک + Language - زبان + - + Logging - گزارشات + - + Enabled - فعال + - + Disabled - غیر فعال + + + + + Reset settings and remove all data from the application + - Reset settings and remove all data from the application - ریست کردن تنظیمات و حذف تمام داده‎ها از نرم‎افزار - - - Reset settings and remove all data from the application? - ریست کردن تنظیمات و حذف تمام داده‎ها از نرم‎افزار؟ + - + All settings will be reset to default. All installed AmneziaVPN services will still remain on the server. - تمام تنظیمات به حالت پیش‎فرض ریست می‎شوند. تمام سرویس‎های Amnezia بر روی سرور باقی می‎مانند. + - + Continue - ادامه + - + Cancel - کنسل + PageSettingsBackup - - - Backup - پشتیبان‎گیری - Settings restored from backup file - تنظیمات از فایل پشتیبان بازیابی شد + + + + + Backup + Configuration backup - پشتیبان‎گیری از پیکربندی + You can save your settings to a backup file to restore them the next time you install the application. - می‎توانید تنظیمات را در یک فایل پشتیبان ذخیره کرده و دفعه بعد که نرم‎افزار را نصب کردید آن‎ها را بازیابی کنید. + Make a backup - ایجاد یک پشتیبان + Save backup file - ذخیره فایل پشتیبان + Backup files (*.backup) - Backup files (*.backup) + Backup file saved - فایل پشتیبان ذخیره شد + Restore from backup - بازیابی از پشتیبان + Open backup file - باز کردن فایل پشتیبان + Import settings from a backup file? - ورود تنظیمات از فایل پشتیبان؟ + All current settings will be reset - تمام تنظیمات جاری ریست خواهد شد + Continue - ادامه + Cancel - کنسل + @@ -1185,128 +1106,120 @@ Already installed containers were found on the server. All installed containers Connection - ارتباط + Auto connect - اتصال خودکار + Connect to VPN on app start - اتصال به وی‎‎پی‎ان با شروع نرم‎افزار + Use AmneziaDNS - استفاده از AmneziaDNS + If AmneziaDNS is installed on the server - اگر AmneziaDNS بر روی سرور نصب شده باشد + DNS servers - سرورهای DNS + When AmneziaDNS is not used or installed - - - Allows you to use the VPN only for certain Apps - - - - If AmneziaDNS is not used or installed - اگر AmneziaDNS نصب نشده یا استفاده نشود - Site-based split tunneling - جداسازی ترافیک بر اساس سایت + Allows you to select which sites you want to access through the VPN - میتوانید مشخص کنید که چه سایت‎هایی از وی‎پی‎ان استفاده کنند + App-based split tunneling - جداسازی ترافیک بر اساس نرم‎افزار + - Allows you to use the VPN only for certain applications - میتوانید مشخص کنید که چه نرم‎افزارهایی از وی‎پی‎ان استفاده کنند + + Allows you to use the VPN only for certain Apps + PageSettingsDns - + Default server does not support custom dns - + DNS servers - سرورهای DNS + - + If AmneziaDNS is not used or installed - اگر AmneziaDNS نصب نباشد یا استفاده نشود + - + Primary DNS - DNS اصلی + - + Secondary DNS - DNS ثانویه + - + Restore default - بازگشت به پیش‎فرض + - + Restore default DNS settings? - بازگشت به تنظیمات پیش‎فرض DNS؟ + - + Continue - ادامه + - + Cancel - کنسل + - + Settings have been reset - تنظیمات ریست شد + - + Save - ذخیره + - + Settings saved - ذخیره تنظیمات + @@ -1314,62 +1227,62 @@ Already installed containers were found on the server. All installed containers Logging - گزارشات + Save logs - ذخیره گزارشات + Open folder with logs - باز کردن پوشه گزارشات + Save - ذخیره + Logs files (*.log) - Logs files (*.log) + Logs file saved - فایل گزارشات ذخیره شد + Save logs to file - ذخیره گزارشات در فایل + Clear logs? - پاک کردن گزارشات؟ + Continue - ادامه + Cancel - کنسل + - + Logs have been cleaned up - گزارشات پاک شدند + - + Clear logs - پاک کردن گزارشات + @@ -1377,139 +1290,143 @@ Already installed containers were found on the server. All installed containers All installed containers have been added to the application - تمام کانتینرهای نصب شده به نرم‎افزار اضافه شدند - - - - Clear Amnezia cache - پاک کردن حافظه داخلی Amnezia - - - - May be needed when changing other settings - وقتی تنظیمات دیگر را تغییر دهید ممکن است نیاز باشد - - - - Clear cached profiles? - پاک کردن پروفایل ذخیره شده؟ + No new installed containers found - کانتینر نصب شده جدیدی پیدا نشد + + + + + Clear Amnezia cache + + May be needed when changing other settings + + + + + Clear cached profiles? + + + + - - - + + + + Continue - ادامه + - - - + + + + Cancel - کنسل + + + + + Check the server for previously installed Amnezia services + - Check the server for previously installed Amnezia services - چک کردن سرویس‎های نصب شده Amnezia بر روی سرور - - - Add them to the application if they were not displayed - اضافه کردن آنها به نرم‎افزار اگر نمایش داده نشده‎اند + - + Reboot server - + Do you want to reboot the server? - + The reboot process may take approximately 30 seconds. Are you sure you wish to proceed? - + + Remove server from application + + + + Do you want to remove the server from application? - + + All installed AmneziaVPN services will still remain on the server. + + + + + Clear server from Amnezia software + + + + Do you want to clear server from Amnezia software? - - Remove server from application - حذف کردن سرور از نرم‎افزار - - - Remove server? - حذف سرور؟ - - - - All installed AmneziaVPN services will still remain on the server. - تمام سرویس‎های نصب‎شده Amnezia همچنان بر روی سرور باقی خواهند ماند. - - - - Clear server from Amnezia software - پاک کردن سرور از نرم‎افزار Amnezia - - - Clear server from Amnezia software? - سرور از نرم‎افزار Amnezia پاک شود؟ - - - + All containers will be deleted on the server. This means that configuration files, keys and certificates will be deleted. - تمام کانتینرها از سرور پاک شوند، به این معنی که تمام فایل‎های پیکربندی، کلیدها و مجوزها حذف خواهند شد. + + + + + Reset API config + + + + + Do you want to reset API config? + PageSettingsServerInfo - + Server name - نام سرور + - + Save - ذخیره + - + Protocols - پروتکل‎ها + - + Services - سرویس‎ها + - + Data - داده + @@ -1517,36 +1434,32 @@ Already installed containers were found on the server. All installed containers settings - تنظیمات + Remove - حذف + Remove %1 from server? - حذف %1 از سرور؟ + All users with whom you shared a connection will no longer be able to connect to it. - تمام کاربرانی که این ارتباط را با آنها به اشتراک گذاشته‎اید دیگر نمی‎توانند به آن متصل شوند. - - - All users who you shared a connection with will no longer be able to connect to it. - Все пользователи, которым вы поделились VPN, больше не смогут к нему подключаться. + Continue - ادامه + Cancel - کنسل + @@ -1554,115 +1467,103 @@ Already installed containers were found on the server. All installed containers Servers - سرورها + PageSettingsSplitTunneling - + Default server does not support split tunneling function - Addresses from the list should be accessed via VPN - دسترسی به آدرس‎های لیست از طریق وی‎پی‎ان - - - - Addresses from the list should not be accessed via VPN - دسترسی به آدرس‎های لیست بدون وی‎پی‎ان - - - - Split tunneling - جداسازی ترافیک - - - - Mode - حالت - - - - Remove - حذف - - - - Continue - ادامه - - - - Cancel - کنسل - - - Site or IP - سایت یا آی‎پی - - - Import/Export Sites - بارگذاری / خروجی‎گرفتن از سایت‎ها - - - + Only the sites listed here will be accessed through the VPN + + + Addresses from the list should not be accessed via VPN + + + + + Split tunneling + + + + + Mode + + + + + Remove + + + + + Continue + + + + + Cancel + + website or IP - + Import / Export Sites - + Import - بارگذاری + - + Save site list - ذخیره لیست سایت‎ها + - + Save sites - ذخیره سایت‎ها - - - - - - Sites files (*.json) - Sites files (*.json) - - - - Import a list of sites - بارگذاری لیست سایت‎ها - - - - Replace site list - جایگزین کردن لیست سایت + + - Open sites file - باز کردن فایل سایت‎ها + Sites files (*.json) + - + + Import a list of sites + + + + + Replace site list + + + + + + Open sites file + + + + Add imported sites to existing ones - اضافه کردن سایت‎های بارگذاری شده به سایت‎های موجود + @@ -1670,121 +1571,102 @@ Already installed containers were found on the server. All installed containers Server connection - ارتباط سرور + Do not use connection code from public sources. It may have been created to intercept your data. It's okay as long as it's from someone you trust. - از کد اتصالاتی که در منابع عمومی هستند استفاده نکنید. ممکن است برای شنود اطلاعات شما ایجاد شده باشند. - -ایرادی ندارد که از طرف کسی باشد که به او اعتماد دارید. + What do you have? - چی داری؟ - - - - File with connection settings - فایل شامل تنظیمات اتصال + File with connection settings or backup - فایل شامل تنظیمات اتصال یا بک‎آپ + + + + + File with connection settings + Open config file - باز کردن فایل تنظیمات + QR-code - QR-Code + Key as text - متن شامل کلید + PageSetupWizardCredentials - Server connection - Подключение к серверу - - - - Server IP address [:port] - آدرس آی‎پی سرور (:پورت) - - - 255.255.255.255:88 - 255.255.255.255:88 - - - Password / SSH private key - Password / SSH private key - - - - Continue - ادامه - - - All data you enter will remain strictly confidential -and will not be shared or disclosed to the Amnezia or any third parties - تمام داده‎هایی که شما وارد می‎کنید به شدت محرمانه‎ است و با Amnezia یا هر شخص ثالث دیگری به اشتراک گذاشته نمی‎شود - - - - Enter the address in the format 255.255.255.255:88 - آدرس را با فرمت 255.255.255.255:88 وارد کنید - - - - Login to connect via SSH - ورود و اتصال با استفاده از SSH - - - + Configure your server - سرور خود را پیکربندی کنید + - + + Server IP address [:port] + + + + 255.255.255.255:22 - + + Login to connect via SSH + + + + Password or SSH private key - + + Continue + + + + All data you enter will remain strictly confidential and will not be shared or disclosed to the Amnezia or any third parties - تمام داده‎هایی که شما وارد می‎کنید به شدت محرمانه‎ است و با Amnezia یا هر شخص ثالث دیگری به اشتراک گذاشته نمی‎شود + - + Ip address cannot be empty - آدرس آی‎پی نمی‎تواند خالی باشد + - + + Enter the address in the format 255.255.255.255:88 + + + + Login cannot be empty - نام‎کاربری نمی‎تواند خالی باشد + - + Password/private key cannot be empty - پسورد یا کلید خصوصی نمی‎تواند خالی باشد + @@ -1792,107 +1674,99 @@ and will not be shared or disclosed to the Amnezia or any third parties What is the level of internet control in your region? - سطح کنترل اینترنت در منطقه شما چگونه است؟ + Set up a VPN yourself - یک وی‎پی‎ان برای خودتان بسازید + I want to choose a VPN protocol - می‎خواهم پروتکل وی‎پی‎ان را انتخاب کنم + Continue - ادامه + - + Set up later - بعدا تنظیم شود + PageSetupWizardInstalling + + + + Usually it takes no more than 5 minutes + + The server has already been added to the application - سرور در حال حاضر به نرم‎افزار اضافه شده است - - - Amnesia has detected that your server is currently - Amnesia обнаружила, что ваш сервер в настоящее время - - - busy installing other software. Amnesia installation - занят установкой других протоколов или сервисов. Установка Amnesia + Amnezia has detected that your server is currently - برنامه Amnezia تشخیص داده است که سرور در حال حاضر + busy installing other software. Amnezia installation - مشغول نصب نرم‎افزار دیگری است. نصب Amnezia + will pause until the server finishes installing other software - متوقف شده تا زمانی که سرور نصب نرم‎افزار دیگر را تمام کند + Installing - در حال نصب + Cancel installation - لغو عملیات نصب - - - - - Usually it takes no more than 5 minutes - معمولا بیش از 5 دقیقه طول نمی‎کشد + PageSetupWizardProtocolSettings - + Installing %1 - در حال نصب %1 + - + More detailed - جزییات بیشتر + - + Close - بستن + - + Network protocol - پروتکل شبکه + - + Port - پورت + - + Install - نصب + @@ -1900,12 +1774,12 @@ and will not be shared or disclosed to the Amnezia or any third parties VPN protocol - پروتکل وی‎پی‎ان + Choose the one with the highest priority for you. Later, you can install other protocols and additional services, such as DNS proxy and SFTP. - پروتکلی که بیشترین اولویت را برای شما دارد انتخاب کنید. بعدا، میتوانید پروتکل‎ها و سرویس‎های اضافه مانند پروکسی DNS و SFTP را هم نصب کنید + @@ -1913,7 +1787,7 @@ and will not be shared or disclosed to the Amnezia or any third parties Point the camera at the QR code and hold for a couple of seconds. - دوربین را روی QR Code بگیرید و برای چند ثانیه آن را نگه دارید. + @@ -1921,30 +1795,30 @@ and will not be shared or disclosed to the Amnezia or any third parties Settings restored from backup file - تنظیمات از فایل بک‎آپ بازیابی شدند + Free service for creating a personal VPN on your server. - سرویس رایگان برای ایجاد وی‎پی‎ان شخصی بر روی سرور خودتان. + Helps you access blocked content without revealing your privacy, even to VPN providers. - به شما کمک می‎کند که بدون فاش کردن حریم شخصی خودتان حتی برای ارائه دهنده وی‎پی‎ان به محتوای مسدود شده دسترسی پیدا کنید. + I have the data to connect - من داده برای اتصال دارم + I have nothing - من هیچی ندارم + - + https://amnezia.org/instructions/0_starter-guide @@ -1952,262 +1826,230 @@ and will not be shared or disclosed to the Amnezia or any third parties PageSetupWizardTextKey - + Connection key - کلید ارتباط + - + A line that starts with vpn://... - یک کلید متنی که با vpn:// شروع می‎شود - - - - Key - کلید + - Insert - وارد کردن + Key + - + + Insert + + + + Continue - ادامه + PageSetupWizardViewConfig - + New connection - ارتباط جدید + - + Do not use connection code from public sources. It could be created to intercept your data. - از کد اتصالی که در منابع عمومی هست استفاده نکنید. ممکن است برای شنود اطلاعات شما ایجاد شده باشد. + - + Collapse content - جمع کردن محتوا + - + Show content - نمایش محتوا + - + Connect - اتصال + PageShare - - OpenVpn native format - فرمت OpenVPN - - - - WireGuard native format - فرمت WireGuard - - - VPN Access - VPN-Доступ - - - - Connection - ارتباط - - - VPN access without the ability to manage the server - Доступ к VPN, без возможности управления сервером - - - Access to server management. The user with whom you share full access to the connection will be able to add and remove your protocols and services to the server, as well as change settings. - Доступ к управлению сервером. Пользователь, с которым вы делитесь полным доступом к соединению, сможет добавлять и удалять ваши протоколы и службы на сервере, а также изменять настройки. - - - - - Server - سرور - - - Accessing - در حال دسترسی به - - - File with accessing settings to - فایل شامل تنظیمات دسترسی به - - - + Config revoked - تنظیمات ابطال‎شد + - + Connection to - ارتباط با + - + File with connection settings to - فایل شامل تنظیمات ارتباط با + Save OpenVPN config - ذخیره تنظیمات OpenVPN + Save WireGuard config - ذخیره تنظیمات WireGuard + Save ShadowSocks config - ذخیره تنظیمات ShadowSocks + Save Cloak config - ذخیره تنظیمات Cloak + + + + + For the AmneziaVPN app + - For the AmneziaVPN app - برای نرم‎افزار AmneziaVPN + OpenVpn native format + + + + + WireGuard native format + + + + + ShadowSocks native format + - ShadowSocks native format - فرمت ShadowSocks - - - Cloak native format - فرمت Cloak + - + Share VPN Access - به اشتراک گذاشتن دسترسی وی‎پی‎ان + - + Share full access to the server and VPN - به اشتراک گذاشتن دسترسی کامل به سرور و وی‎پی‎ان + - + Use for your own devices, or share with those you trust to manage the server. - برای دستگاه‎های خودتان استفاده کنید یا با آنهایی که برای مدیریت سرور به آن‎ها اعتماد دارید به اشتراک بگذارید. + - + + + Share + + + + + Connection + + + + Users - کاربران - - - - User name - نام کاربری - - - - Search - جستجو - - - - Creation date: - - Rename - تغییر نام - - - - Client name - نام کلاینت - - - - Save - ذخیره - - - - Revoke - ابطال - - - - Revoke the config for a user - %1? - - - - Revoke the config for a user - - ابطال تنظیمات برای کاربر - - - - The user will no longer be able to connect to your server. - کاربر دیگر نمی‎تواند به سرور وصل شود. - - - - Continue - ادامه - - - - Cancel - کنسل - - - Full access - دسترسی کامل - - - + Share VPN access without the ability to manage the server - به اشتراک گذاشتن دسترسی وی‎پی‎ان بدون امکان مدیریت سرور + - Share access to server management. The user with whom you share full access to the server will be able to add and remove any protocols and services to the server, as well as change settings. - به اشتراک گذاری دسترسی به مدیریت سرور. کاربری که دسترسی کامل سرور با او به اشتراک گذاشته می‎شود می‎تواند پروتکل‌‎ها و سرویس‎ها را در سرور حذف یا اضافه کند و یا تنظیمات سرور را تغییر دهد. + + User name + + + + + + Server + Protocol - پروتکل + - - + + Connection format - فرمت ارتباط + - - - Share - اشتراک‎گذاری + + Search + + + + + Creation date: + + + + + Rename + + + + + Client name + + + + + Save + + + + + Revoke + + + + + Revoke the config for a user - %1? + + + + + The user will no longer be able to connect to your server. + + + + + Continue + + + + + Cancel + @@ -2215,50 +2057,49 @@ and will not be shared or disclosed to the Amnezia or any third parties Full access to the server and VPN - دسترسی کامل به سرور و وی‎پی‎ان + We recommend that you use full access to the server only for your own additional devices. - ما پیشنهاد میکنیم که ازحالت دسترسی کامل به سرور فقط برای دستگاه‎های دیگر خودتان استفاده کنید - + If you share full access with other people, they can remove and add protocols and services to the server, which will cause the VPN to work incorrectly for all users. - اگر دسترسی کامل را با دیگران به اشتراک بگذارید، آن‎ها می‎توانند پروتکل‎ها و سرویس‎ها را حذف یا اضافه کنند که باعث می‎شود که وی‎پی‎ان دیگر برای سایر کاربران کار نکند. + - + Server - سرور - - - - Accessing - در حال دسترسی به + + Accessing + + + + File with accessing settings to - فایل شامل تنظیمات دسترسی به + - + Share - اشتراک‎گذاری - - - - Connection to - ارتباط با + + Connection to + + + + File with connection settings to - فایل شامل تنظیمات ارتباط با + @@ -2266,7 +2107,7 @@ and will not be shared or disclosed to the Amnezia or any third parties Close - بستن + @@ -2274,38 +2115,38 @@ and will not be shared or disclosed to the Amnezia or any third parties Password entry not found - Password entry not found + Could not decrypt data - Could not decrypt data + Unknown error - Unknown error + Could not open wallet: %1; %2 - Could not open wallet: %1; %2 + Password not found - Password not found + Could not open keystore - Could not open keystore + Could not remove private key from keystore - Could not remove private key from keystore + @@ -2313,12 +2154,12 @@ and will not be shared or disclosed to the Amnezia or any third parties Unknown error - Unknown error + Access to keychain denied - Access to keychain denied + @@ -2326,27 +2167,27 @@ and will not be shared or disclosed to the Amnezia or any third parties Could not store data in settings: access error - Could not store data in settings: access error + Could not store data in settings: format error - Could not store data in settings: format error + Could not delete data from settings: access error - Could not delete data from settings: access error + Could not delete data from settings: format error - Could not delete data from settings: format error + Entry not found - Entry not found + @@ -2354,80 +2195,80 @@ and will not be shared or disclosed to the Amnezia or any third parties Password entry not found - Password entry not found + Could not decrypt data - Could not decrypt data + D-Bus is not running - D-Bus is not running + Unknown error - Unknown error + No keychain service available - No keychain service available + Could not open wallet: %1; %2 - Could not open wallet: %1; %2 + Access to keychain denied - Access to keychain denied + Could not determine data type: %1; %2 - Could not determine data type: %1; %2 + Entry not found - Entry not found + Unsupported entry type 'Map' - Unsupported entry type 'Map' + Unknown kwallet entry type '%1' - Unknown kwallet entry type '%1' + Password not found - Password not found + Could not open keystore - Could not open keystore + Could not retrieve private key from keystore - Could not retrieve private key from keystore + Could not create decryption cipher - Could not create decryption cipher + @@ -2435,221 +2276,276 @@ and will not be shared or disclosed to the Amnezia or any third parties Credential size exceeds maximum size of %1 - Credential size exceeds maximum size of %1 + Credential key exceeds maximum size of %1 - Credential key exceeds maximum size of %1 + Writing credentials failed: Win32 error code %1 - Writing credentials failed: Win32 error code %1 + Encryption failed - Encryption failed + D-Bus is not running - D-Bus is not running + Unknown error - Unknown error + Could not open wallet: %1; %2 - Could not open wallet: %1; %2 + Password not found - Password not found + Could not open keystore - Could not open keystore + Could not create private key generator - Could not create private key generator + Could not generate new private key - Could not generate new private key + Could not retrieve private key from keystore - Could not retrieve private key from keystore + Could not create encryption cipher - Could not create encryption cipher + Could not encrypt data - Could not encrypt data + QObject + + + Sftp service + + No error - No error + Unknown Error - Unknown Error + Function not implemented - Function not implemented + Server check failed - Server check failed + Server port already used. Check for another software - Server port already used. Check for another software + Server error: Docker container missing - Server error: Docker container missing + Server error: Docker failed - Server error: Docker failed + Installation canceled by user - Installation canceled by user + The user does not have permission to use sudo - The user does not have permission to use sudo + Ssh request was denied - Ssh request was denied + Ssh request was interrupted - Ssh request was interrupted + Ssh internal error - Ssh internal error + Invalid private key or invalid passphrase entered - Invalid private key or invalid passphrase entered + The selected private key format is not supported, use openssh ED25519 key types or PEM key types - The selected private key format is not supported, use openssh ED25519 key types or PEM key types + Timeout connecting to server - Timeout connecting to server + Sftp error: End-of-file encountered - Sftp error: End-of-file encountered + Sftp error: File does not exist - Sftp error: File does not exist + Sftp error: Permission denied - Sftp error: Permission denied + Sftp error: Generic failure - Sftp error: Generic failure + Sftp error: Garbage received from server - Sftp error: Garbage received from server + Sftp error: No connection has been set up - Sftp error: No connection has been set up + Sftp error: There was a connection, but we lost it - Sftp error: There was a connection, but we lost it + Sftp error: Operation not supported by libssh yet - Sftp error: Operation not supported by libssh yet + Sftp error: Invalid file handle - Sftp error: Invalid file handle + Sftp error: No such file or directory path exists - Sftp error: No such file or directory path exists + Sftp error: An attempt to create an already existing file or directory has been made - Sftp error: An attempt to create an already existing file or directory has been made + Sftp error: Write-protected filesystem - Sftp error: Write-protected filesystem + Sftp error: No media was in remote drive - Sftp error: No media was in remote drive + + + + + OpenVPN config missing + + + + + OpenVPN management server error + + + + + OpenVPN executable missing + + + + + ShadowSocks (ss-local) executable missing + + + + + Cloak (ck-client) executable missing + + + + + Amnezia helper service error + + + + + OpenSSL failed + + + + + Can't connect: another VPN connection is active + + + + + Can't setup OpenVPN TAP network adapter + + + + + VPN pool error: no available addresses + The config does not contain any containers and credentials for connecting to the server - تنظیمات شامل هیچ کانتینر یا اعتبارنامه‎ای برای اتصال به سرور نیست + @@ -2657,77 +2553,50 @@ and will not be shared or disclosed to the Amnezia or any third parties - + + Error when retrieving configuration from API + + + + + This config has already been added to the application + + + + + Internal error + + + + ErrorCode: %1. - - Failed to save config to disk - Failed to save config to disk - - - - OpenVPN config missing - OpenVPN config missing - - - - OpenVPN management server error - OpenVPN management server error - - - - OpenVPN executable missing - OpenVPN executable missing - - - - ShadowSocks (ss-local) executable missing - ShadowSocks (ss-local) executable missing - - - - Cloak (ck-client) executable missing - Cloak (ck-client) executable missing - - - - Amnezia helper service error - Amnezia helper service error - - - - OpenSSL failed - OpenSSL failed - - - - Can't connect: another VPN connection is active - Can't connect: another VPN connection is active - - - - Can't setup OpenVPN TAP network adapter - Can't setup OpenVPN TAP network adapter - - - - VPN pool error: no available addresses - VPN pool error: no available addresses - - - The config does not contain any containers and credentiaks for connecting to the server - The config does not contain any containers and credentiaks for connecting to the server - - - - Internal error - Internal error - IPsec - IPsec + + + + + + Website in Tor network + + + + + Amnezia DNS + + + + + Sftp file sharing service + + + + + OpenVPN is the most popular VPN protocol, with flexible configuration options. It uses its own security protocol with SSL/TLS for key exchange. + @@ -2739,11 +2608,60 @@ and will not be shared or disclosed to the Amnezia or any third parties 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. + + + WireGuard - New popular VPN protocol with high performance, high speed and low power consumption. Recommended for regions with low levels of censorship. + + + + + AmneziaWG - Special protocol from Amnezia, based on WireGuard. It's fast like WireGuard, but very resistant to blockages. Recommended for regions with high levels of censorship. + + + + + 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. + + + + + Deploy a WordPress site on the Tor network in two clicks. + + + + + Replace the current DNS server with your own. This will increase your privacy level. + + Create a file vault on your server to securely store and transfer files. + + + OpenVPN stands as one of the most popular and time-tested VPN protocols available. +It employs its unique security protocol, leveraging the strength of SSL/TLS for encryption and key exchange. Furthermore, OpenVPN's support for a multitude of authentication methods makes it versatile and adaptable, catering to a wide range of devices and operating systems. Due to its open-source nature, OpenVPN benefits from extensive scrutiny by the global community, which continually reinforces its security. With a strong balance of performance, security, and compatibility, OpenVPN remains a top choice for privacy-conscious individuals and businesses alike. + +* Available in the AmneziaVPN across all platforms +* Normal power consumption on mobile devices +* Flexible customisation to suit user needs to work with different operating systems and devices +* Recognised by DPI analysis systems and therefore susceptible to blocking +* Can operate over both TCP and UDP network protocols. + + + + + 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'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'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. + + This is a combination of the OpenVPN protocol and the Cloak plugin designed specifically for protecting against blocking. @@ -2779,190 +2697,6 @@ WireGuard is very susceptible to blocking due to its distinct packet signatures. * Works over UDP network protocol. - - - IKEv2, paired with the IPSec encryption layer, stands as a modern and stable VPN protocol. -One of its distinguishing features is its ability to swiftly switch between networks and devices, making it particularly adaptive in dynamic network environments. -While it offers a blend of security, stability, and speed, it's essential to note that IKEv2 can be easily detected and is susceptible to blocking. - -* Available in the AmneziaVPN only on Windows -* Low power consumption, on mobile devices -* Minimal configuration -* Recognised by DPI analysis systems -* Works over UDP network protocol, ports 500 and 4500. - پروتکل IKEv2 به همراه لایه رمزنگاری IPSec به عنوان پروتکل وی‎پی‎ان مدرن و پایدار است. -یکی از قابلیت‎‎های متمایز این پروتکل قابلیت سوییچ بین شبکه‎ها و دستگاه‎هاست که قابلیت انطباق بالایی در محیط شبکه‎های دینامیک را دارد -در حالیکه ترکیبی از امنیت، پایداری و سرعت را ارائه میدهد اما مهم است که اشاره کنیم IKEv2 به راحتی قابل تشخیص در شبکه و بلاک شدن میباشد. - -* در AmneziaVPN فقط بر روی ویندوز در دسترس است -* مصرف باتری کم روی دستگاه‎های موبایل -* تنظیمات ساده -* امکان شناسایی شدن در شبکه‎های تحلیل DPI -* روی پروتکل شبکه UDP، پورت‎های 500 و 4500 کار می‎کند. - - - - DNS Service - سرویس DNS - - - - Sftp file sharing service - سرویس اشتراک گذاری فایل Sftp - - - - - Website in Tor network - وب سایت در شبکه Tor - - - - Amnezia DNS - Amnezia DNS - - - - OpenVPN is the most popular VPN protocol, with flexible configuration options. It uses its own security protocol with SSL/TLS for key exchange. - پروتکل OpenVPN یکی از پروتکل‎های وی‎پی‎ان محبوب می‎باشد با تنظیمات و پیکربندی‎های قابل تغییر. از پروتکل امنیتی داخلی خود با تبادل کلید SSL/TLS استفاده می‎کند. - - - ShadowSocks - masks VPN traffic, making it similar to normal web traffic, but is recognised by analysis systems in some highly censored regions. - پروتکل ShadowSocks ترافیک وی‎پی‎ان را پنهان و آن را شبیه ترافیک عادی وب می‎کند، اما در مناطقی که سانسور شدیدی اعمال می‎شود با سیستم‎های تحلیلی قابل شناسایی است. - - - OpenVPN over Cloak - OpenVPN with VPN masquerading as web traffic and protection against active-probbing detection. Ideal for bypassing blocking in regions with the highest levels of censorship. - پروتکل OpenVPN over Cloak که همان پروتکل OpenVPN با قابلیت پنهان کردن ترافیک از سیستم‎های تحلیل فعال برروی شبکه. ایده‎آل برای گذر از ممنوعیت در مناطقی که سانسور شدیدی اعمال می‎کنند. - - - - WireGuard - New popular VPN protocol with high performance, high speed and low power consumption. Recommended for regions with low levels of censorship. - پروتکل WireGuard یک پروتکل وی‎پی‎ان جدید با عملکرد بسیار خوب، سرعت بالا و مصرف انرژی پایین. برای مناطقی که سطح سانسور پایینی دارند پیشنهاد می‎شود. - - - - AmneziaWG - Special protocol from Amnezia, based on WireGuard. It's fast like WireGuard, but very resistant to blockages. Recommended for regions with high levels of censorship. - پروتکل AmneziaWG یک پروتکل اختصاصی Amnezia که بر اساس WireGaurd کار میکند. به اندازه WireGaurd پرسرعت است و در عین حال بسیار مقاوم به بلاک شدن توسط شبکه ست. مناسب برای مناطق با سطح سانسور بالاست. - - - - 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. - پروتکل IKEv2 پروتکلی پایدار و مدرن که مقداری سریعتر از سایر پروتکل‎هاست. بعد از قطع سیگنال دوباره اتصال را بازیابی می‎کند. به صورت پیش‎فرض بر روی آخرین نسخه دستگاه‎های اندروید و iOS پیشتیبانی می‎شود. - - - - Deploy a WordPress site on the Tor network in two clicks. - با دو کلیک یک سایت وردپرس در شبکه Tor راه‎اندازی کنید. - - - - Replace the current DNS server with your own. This will increase your privacy level. - سرور DNS را با مال خودتان جایگزین کنید. این کار سطح حریم خصوصی شما را افزایش می‎دهد. - - - Creates a file vault on your server to securely store and transfer files. - یک محفظه ایمن بر روی سرور خودتان ایجاد کنید که به طور امن بتوانید فایل‎ها را ذخیره و جابجا کنید. - - - - OpenVPN stands as one of the most popular and time-tested VPN protocols available. -It employs its unique security protocol, leveraging the strength of SSL/TLS for encryption and key exchange. Furthermore, OpenVPN's support for a multitude of authentication methods makes it versatile and adaptable, catering to a wide range of devices and operating systems. Due to its open-source nature, OpenVPN benefits from extensive scrutiny by the global community, which continually reinforces its security. With a strong balance of performance, security, and compatibility, OpenVPN remains a top choice for privacy-conscious individuals and businesses alike. - -* Available in the AmneziaVPN across all platforms -* Normal power consumption on mobile devices -* Flexible customisation to suit user needs to work with different operating systems and devices -* Recognised by DPI analysis systems and therefore susceptible to blocking -* Can operate over both TCP and UDP network protocols. - پروتکل OpenVPN یکی از پروتکل‎های محبوب و تست شده در دسترس می‎باشد که از پروتکل امنیتی مخصوص خودش استفاده میکند. -از امتیازات SSL/TLS برای رمزنگاری و تبادل کلید استفاده میکند. -همچنین OpenVPN از روش‎های چندگانه‎ای برای احراز هویت پشتیبانی می‎کند که آن را قابل انطباق و منعطف میکند. -از طیف وسیعی از دستگاه‎ها و سیستم عامل‎ها نیز پشتیبانی می‎کند. -به دلیل طبیعت متن-باز آن، OpenVPN از بررسی گسترده توسط یک جامعه جهانی سود می‎برد که باعث بهتر شدن وضعیت امنیتی آن می‎شود. -به دلیل تعادل قوی بین عملکرد، امنیت و سازگاری OpenVPN تبدیل به یکی از انتخاب‎های اصلی برای اشخاص آگاه بر حریم خصوصی و تجارت‎های مشابه شده است. - -* بر روی تمام سیستم‎عامل‎ها در AmneziaVPN در دسترس است. -* مصرف انرژی عادی بر روی دستگاه‎های موبایل -* قابلیت شخصی‎سازی منعطف مطابق با نیاز شما که امکان کار بر روی دستگاه‎ها و سیستم عامل‎های مختلف را می‎دهد. -* قابل شناسایی توسط سیستم‎های تحلیل عمیق DPI در شبکه و در نتیجه امکان بلاک شدن -* امکان کار بر روی دو پروتکل TCP و UDP - - - - 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'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'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. - پروتکل Shadowsocks، الهام گرفته از پروتکل Socks5، اتصال را با استفاده از رمزگذاری AEAD امن میکند. اگرچه Shadowsocks طوری طراحی شده که برای شناسایی در شبکه چالش‎برانگیز باشد و محتاط عمل کند اما این پروتکل مانند یک اتصال استاندارد HTTPS نیست و برخی از سیستم‎های تحلیل ترافیک مشخص ممکن است بتوانند اتصال Shadowsocks را شناسایی کنند. به دلیل محدودیت پشتیبانی در Amnezia پیشنهاد می‎شود که از َAmneziaWG استفاده شود. - -* فقط بر روی پلتفرم دسکتاپ بر روی Amnezia قابل دسترس است -* مصرف انرژی عادی در دستگاه‎های موبایل -* پروتکل رمزنگاری قابل پیکربندی -* قابل شناسایی توسط برخی سیستم‎های تحلیل عمیق DPI -* عملکرد بر روی پروتکل شبکه TCP - - - This is a combination of the OpenVPN protocol and the Cloak plugin designed specifically for blocking protection. - -OpenVPN provides a secure VPN connection by encrypting all Internet traffic between the client and the server. - -Cloak protects OpenVPN from detection and blocking. - -Cloak can modify packet metadata so that it completely masks VPN traffic as normal web traffic, and also protects the VPN from detection by Active Probing. This makes it very resistant to being detected - -Immediately after receiving the first data packet, Cloak authenticates the incoming connection. If authentication fails, the plugin masks the server as a fake website and your VPN becomes invisible to analysis systems. - -If there is a extreme level of Internet censorship in your region, we advise you to use only OpenVPN over Cloak from the first connection - -* Available in the AmneziaVPN across all platforms -* High power consumption on mobile devices -* Flexible settings -* Not recognised by DPI analysis systems -* Works over TCP network protocol, 443 port. - - این یک ترکیب از پروتکل OpenVPN و افزونه Cloak می‎باشد که به طور خاص برای محافظت از بلاک شدن طراحی شده است. - -پروتکل OpenVPN با رمزنگاری تمام ترافیک اینترنت بین دستگاه و سرور یک اتصال وی‎پی‎ان امن را فراهم می‎کند. - -افزونه Cloak از OpenVPN در مقابل شناسایی و بلاک شدن محافظت می‎کند - -افزونه Cloak می‎تواند داده‎های بسته ترافیکی را تغییر دهد و در نتیجه ترافیک وی‎پی‎ان شبیه ترافیک عادی وب می‎شود و همچنین از وی‎پی‎ان در مقابل شناسایی شدن توسط DPI محافظت می‎کند. این باعث می‎شود که این پروتکل به شناسایی‎شدن بسیار مقاوم باشد - -درست بعد از دریافت اولین بسته داده،افزونه Cloak اتصال ورودی را احراز هویت می‎کند و اگر عملیات احراز هویت انجام نشود Cloak سرور را به عنوان یک وب سایت جعلی در‎ می‎آورد و وی‎پی‎ان شما را از تحلیل شبکه پنهان می‎کند. - -اگر در منطقه شما سطح بالایی از سانسور وجود دارد ما به شما پیشنهاد می‎کنیم از اولین ارتباط تنها از OpenVPN over Cloak استفاده کنید. - - -* بر روی تمام پلتفرم‎ها در AmneziaVPN در دسترس است -* مصرف بالای انرژی در دستگاه‎های موبایل -* تنظیمات منطعف -* غیرقابل تشخیص و شناسایی توسط سیستم‎های تحلیل عمیق DPI -* کار کردن روی پروتکل شبکه TCP، پورت 443 - - - - A relatively new popular VPN protocol with a simplified architecture. -Provides stable VPN connection, high performance on all devices. Uses hard-coded encryption settings. WireGuard compared to OpenVPN has lower latency and better data transfer throughput. -WireGuard is very susceptible to blocking due to its distinct packet signatures. Unlike some other VPN protocols that employ obfuscation techniques, the consistent signature patterns of WireGuard packets can be more easily identified and thus blocked by advanced Deep Packet Inspection (DPI) systems and other network monitoring tools. - -* Available in the AmneziaVPN across all platforms -* Low power consumption -* Minimum number of settings -* Easily recognised by DPI analysis systems, susceptible to blocking -* Works over UDP network protocol. - یک پروتکل نسبتا محبوب وی‎پی‎ان با معماری ساده -اتصال وی‎پی‎‎ان پایدار با عملکرد بالا بر روی تمام دستگاه‎‌ها فراهم می‎کند. از تنظیمات ثابت برای رمزنگاری استفاده می‎کند و در مقایسه با OpenVPN سرعت بهتری در انتقال اطلاعات دارد. -پروتکل WireGaurd به دلیل امضای بسته داده مخصوص، احتمال بسیار بالایی برای شناسایی و بلاک شدن دارد.برعکس سایر پروتکل‎های وی‎پی‎ان که از روش‎های مخفی کردن استفاده می‎کنند، امضای ثابت WireGuard به راحتی می‎تواند توسط سیستم‎های تحلیل عمیق DPI یا سایر روش‎های بررسی شبکه شناسایی و بلاک شود. - -* بر روی تمام پلتفرم‌ها در AmneziaVPN قابل دسترسی است. -* مصرف انرژی پایین -* کمترین میزان تنظیمات -* امکان شناسایی شدن توسط سیستم‎های تحلیل عمیق DPI به آسانی و بلاک شدن -* کار بر روی پروتکل شبکه UDP - A modern iteration of the popular VPN protocol, AmneziaWG builds upon the foundation set by WireGuard, retaining its simplified architecture and high-performance capabilities across devices. @@ -2974,105 +2708,98 @@ This means that AmneziaWG keeps the fast performance of the original while addin * Minimum number of settings * Not recognised by DPI analysis systems, resistant to blocking * Works over UDP network protocol. - یک نسخه مدرن از پروتکل وی‎پی‎ان محبوب، AmneziaWG بر روی پایه‎های WireGuard ساخته شده و معماری ساده و عملکرد بالای آن را بر روی تمام دستگاه‎ها حفظ کرده است. -در حالی‎که WireGuard به دلیل بازدهی آن شناخته می‎شود اما امکان شناسایی شدن بالا به دلیل امضای ثابت بسته داده‎های آن یکی از مشکلات آن است. AmneziaWG این مشکل را با استفاده از متدهای مخفی سازی حل کرده و در نتیجه ترافیک آن همانند با ترافیک عادی اینترنت است. -این بدین معنی است که AmneziaWG عملکرد سریع اصلی را حفظ کرده و یک لایه پنهان سازی به آن اضافه کرده که باعث می‎شود که به انتخابی عالی برای آنها که وی‎پی‎ان امن و سریع می‎خواهند تبدیل شود. - -* بر روی تمام پلتفرم‌ها در AmneziaVPN قابل دسترسی است. -* مصرف انرژی پایین -* کمترین میزان تنظیمات -* غیرقابل تشخیص توسط سیستم‎های تحلیل عمیق DPI و مقاوم به بلاک شدن -* کار بر روی پروتکل شبکه UDP + - AmneziaWG container - AmneziaWG протокол + + IKEv2, paired with the IPSec encryption layer, stands as a modern and stable VPN protocol. +One of its distinguishing features is its ability to swiftly switch between networks and devices, making it particularly adaptive in dynamic network environments. +While it offers a blend of security, stability, and speed, it's essential to note that IKEv2 can be easily detected and is susceptible to blocking. + +* Available in the AmneziaVPN only on Windows +* Low power consumption, on mobile devices +* Minimal configuration +* Recognised by DPI analysis systems +* Works over UDP network protocol, ports 500 and 4500. + + + + + DNS Service + Sftp file sharing service - is secure FTP service - سرویس اشتراک فایل Sftp یک سرویس امن FTP می‎باشد - - - - Sftp service - سرویس Sftp + Entry not found - Entry not found + Access to keychain denied - Access to keychain denied + No keyring daemon - No keyring daemon + Already unlocked - Already unlocked + No such keyring - No such keyring + Bad arguments - Bad arguments + I/O error - I/O error + Cancelled - Cancelled + Keyring already exists - Keyring already exists + No match - No match + Unknown error - Unknown error + error 0x%1: %2 - error 0x%1: %2 - - - WireGuard Configuration Highlighter - هایلایتر پیکربندی WireGuard - - - &Randomize colors - رنگ‎های تصادفی + SelectLanguageDrawer - + Choose language - انتخاب زبان + @@ -3080,76 +2807,78 @@ This means that AmneziaWG keeps the fast performance of the original while addin Server #1 - Server #1 + Server - Server + SettingsController - + Software version - نسخه نرم‎افزار + - - All settings have been reset to default values - تمام تنظیمات به مقادیر پیش فرض ریست شد - - - - Cached profiles cleared - پروفایل ذخیره شده پاک شد - - - + Backup file is corrupted - فایل بک‎آپ خراب شده است + + + + + All settings have been reset to default values + + + + + Cached profiles cleared + ShareConnectionDrawer - + Save AmneziaVPN config - ذخیره تنظیمات AmneziaVPN + - + Share - اشتراک‎گذاری + - + Copy - کپی + - - + + + + Copied - کپی شد + - + Copy config string - کپی‎کردن متن تنظیمات + - + Show connection settings - نمایش تنظیمات ارتباط + - + To read the QR code in the Amnezia app, select "Add server" → "I have data to connect" → "QR code, key or settings file" - برای خواندن QR Code در نرم‎افزار AmneziaVPN "اضافه کردن سرور" -> "من داده برای اتصال دارم" -> "QR Code، کلید یا فایل تنظیمات" + @@ -3157,42 +2886,42 @@ This means that AmneziaWG keeps the fast performance of the original while addin Hostname not look like ip adress or domain name - فرمت هاست شبیه آدرس آی‎پی یا نام دامنه نیست + New site added: %1 - سایت جدید اضافه‎شد: %1 + Site removed: %1 - سایت حذف شد: %1 + Can't open file: %1 - فایل باز نشد: %1 + Failed to parse JSON data from file: %1 - مشکل در تحلیل داده‎های JSON در فایل: %1 + The JSON data is not an array in file: %1 - داده‎های JSON در فایل به صورت آرایه نیستند: %1 + Import completed - بارگذاری کامل شد + Export completed - خروجی گرفتن کامل شد + @@ -3201,39 +2930,39 @@ This means that AmneziaWG keeps the fast performance of the original while addin Show - نمایش + Connect - اتصال + Disconnect - قطع ارتباط + Visit Website - بازدید وب سایت + Quit - خروج + TextFieldWithHeaderType - + The field can't be empty - Поле не может быть пустым + @@ -3241,7 +2970,7 @@ This means that AmneziaWG keeps the fast performance of the original while addin Mbps - Mbps + @@ -3249,42 +2978,42 @@ This means that AmneziaWG keeps the fast performance of the original while addin Unknown - ناشناخته + Disconnected - قطع شده + Preparing - درحال آماده‎سازی + Connecting... - برقراری ارتباط... + Connected - وصل شد + Disconnecting... - در حال قطع شدن... + Reconnecting... - برقراری ارتباط دوباره... + Error - خطا + @@ -3292,65 +3021,45 @@ This means that AmneziaWG keeps the fast performance of the original while addin Low - پایین + Medium or High - متوسط یا بالا + Extreme - شدید + I just want to increase the level of my privacy. - من فقط میخواهم سطح حریم شخصی خودم را بالا ببرم + I want to bypass censorship. This option recommended in most cases. - من میخواهم از سانسور عبور کنم. این گزینه در اکثر موارد توصیه می‎‌شود + Most VPN protocols are blocked. Recommended if other options are not working. - اکثر پروتکل‎های وی‎پی‎ان مسدود شده‎اند. در مواردی که بقیه گزینه‎ها کار نمی‎کنند توصی می‎شود. - - - High - Высокий - - - Medium - Средний - - - Many foreign websites and VPN providers are blocked - Многие иностранные сайты и VPN-провайдеры заблокированы - - - Some foreign sites are blocked, but VPN providers are not blocked - Некоторые иностранные сайты заблокированы, но VPN-провайдеры не блокируются - - - I just want to increase the level of privacy - Хочу просто повысить уровень приватности + main2 - + Private key passphrase - عبارت کلید خصوصی + - + Save - ذخیره + diff --git a/client/translations/amneziavpn_ru.ts b/client/translations/amneziavpn_ru.ts index 99e1dff8..29a10ec7 100644 --- a/client/translations/amneziavpn_ru.ts +++ b/client/translations/amneziavpn_ru.ts @@ -1,101 +1,69 @@ - - AmneziaApplication - - Split tunneling for WireGuard is not implemented, the option was disabled - Раздельное туннелирование для "Wireguard" не реализовано,опция отключена - - - Split tunneling for %1 is not implemented, the option was disabled - Раздельное туннелирование для %1 не реализовано, опция отключена - - - - AndroidController - - AmneziaVPN - AmneziaVPN - - - VPN Connected - Refers to the app - which is currently running the background and waiting - VPN Подключен - - - - ApiController - - - Error when retrieving configuration from cloud server - - - ConnectionController - - VPN Protocols is not installed. - Please install VPN container at first - VPN протоколы не установлены. - Пожалуйста, установите протокол + + + + + Connect + - - Connection... - Подключение... + + VPN Protocols is not installed. + Please install VPN container at first + + Connection... + + + + Connected - Подключено + - - Settings updated successfully, Reconnnection... - Настройки успешно обновлены. Подключение... - - - - Settings updated successfully - Настройки успешно обновлены - - - - Reconnection... - Переподключение... - - - - - - Connect - Подключиться + Reconnection... + - + Disconnection... - Отключение... + + + + + Settings updated successfully, Reconnnection... + + + + + Settings updated successfully + ConnectionTypeSelectionDrawer - + Add new connection - Добавить новое соединение + - + Configure your server - Настроить свой сервер + - + Open config file, key or QR code - Открыть файл конфига, ключ или QR код + @@ -103,22 +71,22 @@ C&ut - &Вырезать + &Copy - &Копировать + &Paste - &Вставить + &SelectAll - &ВыбратьВсе + @@ -126,32 +94,28 @@ Access error! - Ошибка доступа! + HomeContainersListView - + Unable change protocol while there is an active connection - Невозможно изменить протокол при активном соединении + - + The selected protocol is not supported on the current platform - Выбранный протокол не поддерживается на данном устройстве - - - Reconnect via VPN Procotol: - Переподключение через VPN протокол: + ImportController - + Scanned %1 of %2. - Отсканировано %1 из%2. + @@ -160,31 +124,30 @@ %1 installed successfully. - %1 успешно установлен. + %1 is already installed on the server. - %1 уже установлен на сервер. + Added containers that were already installed on the server - Добавлены сервисы и протоколы, которые были ранее установлены на сервер + Already installed containers were found on the server. All installed containers have been added to the application - -На сервере обнаружены установленные протоколы и сервисы, все они добавлены в приложение + Settings updated successfully - Настройки успешно обновлены + @@ -194,27 +157,27 @@ Already installed containers were found on the server. All installed containers Server '%1' was removed - Сервер '%1' был удален + All containers from server '%1' have been removed - Все протоколы и сервисы были удалены с сервера '%1' + %1 has been removed from the server '%2' - %1 был удален с сервера '%2' + Please login as the user - Пожалуйста, войдите в систему от имени пользователя + Server added successfully - Сервер успешно добавлен + @@ -222,17 +185,17 @@ Already installed containers were found on the server. All installed containers Read key failed: %1 - Не удалось считать ключ: %1 + Write key failed: %1 - Не удалось записать ключ: %1 + Delete key failed: %1 - Не удалось удалить ключ: %1 + @@ -241,27 +204,27 @@ Already installed containers were found on the server. All installed containers AmneziaVPN - AmneziaVPN + VPN Connected - VPN Подключен + VPN Disconnected - VPN Выключен + AmneziaVPN notification - Уведомление AmneziaVPN + Unsecured network detected: - Обнаружена незащищенная сеть: + @@ -269,355 +232,343 @@ Already installed containers were found on the server. All installed containers Removing services from %1 - Удаление сервисов c %1 + Usually it takes no more than 5 minutes - Обычно это занимает не более 5 минут + PageHome - + VPN protocol - VPN протокол + - + Servers - Серверы + - + Unable change server while there is an active connection - Невозможно изменить сервер при активном соединении + PageProtocolAwgSettings - + AmneziaWG settings - AmneziaWG настройки + - + Port - Порт + - + Junk packet count - Junk packet count + - + Junk packet minimum size - Junk packet minimum size + - + Junk packet maximum size - Junk packet maximum size + - + Init packet junk size - Init packet junk size + - + Response packet junk size - Response packet junk size + - + Init packet magic header - Init packet magic header + - + Response packet magic header - Response packet magic header + - + Transport packet magic header - Transport packet magic header - - - - Underload packet magic header - Underload packet magic header - - - - Remove AmneziaWG - Удалить AmneziaWG - - - - Remove AmneziaWG from server? - Удалить AmneziaWG с сервера? + + Underload packet magic header + + + + + Remove AmneziaWG + + + + + Remove AmneziaWG from server? + + + + All users with whom you shared a connection will no longer be able to connect to it. - Все пользователи, с которыми вы поделились этим VPN-протоколом, больше не смогут к нему подключаться. + - All users who you shared a connection with will no longer be able to connect to it. - Все пользователи, с которыми вы поделились этим VPN-протоколом, больше не смогут к нему подключаться. - - - + Continue - Продолжить + - + Cancel - Отменить + - + Save and Restart Amnezia - Сохранить и перезагрузить Amnezia + PageProtocolCloakSettings - + Cloak settings - Настройки Cloak + - + Disguised as traffic from - Замаскировать трафик под + - + Port - Порт + - - + + Cipher - Шифрование + - + Save and Restart Amnezia - Сохранить и перезагрузить Amnezia + PageProtocolOpenVpnSettings - + OpenVPN settings - OpenVPN настройки + - VPN Addresses Subnet - Подсеть для VPN - - - + VPN address subnet - + Network protocol - Сетевой протокол + - + Port - Порт + - + Auto-negotiate encryption - Шифрование с автоматическим согласованием - - - - - Hash - Хэш - - - - SHA512 - SHA512 - - - - SHA384 - SHA384 - - - - SHA256 - SHA256 - - - - SHA3-512 - SHA3-512 + - SHA3-384 - SHA3-384 - - + Hash + + + + + SHA512 + + + + + SHA384 + + + + + SHA256 + + + + + SHA3-512 + + + + + SHA3-384 + + + + SHA3-256 - SHA3-256 + - + whirlpool - whirlpool + - + BLAKE2b512 - BLAKE2b512 + - + BLAKE2s256 - BLAKE2s256 + - + SHA1 - SHA1 - - - - - Cipher - Шифрование - - - - AES-256-GCM - AES-256-GCM - - - - AES-192-GCM - AES-192-GCM - - - - AES-128-GCM - AES-128-GCM - - - - AES-256-CBC - AES-256-CBC - - - - AES-192-CBC - AES-192-CBC - - - - AES-128-CBC - AES-128-CBC + - ChaCha20-Poly1305 - ChaCha20-Poly1305 - - + Cipher + + + + + AES-256-GCM + + + + + AES-192-GCM + + + + + AES-128-GCM + + + + + AES-256-CBC + + + + + AES-192-CBC + + + + + AES-128-CBC + + + + + ChaCha20-Poly1305 + + + + ARIA-256-CBC - ARIA-256-CBC + - + CAMELLIA-256-CBC - CAMELLIA-256-CBC + - + none - none + - + TLS auth - TLS авторизация + - + Block DNS requests outside of VPN - Блокировать DNS запросы за пределами VPN + - + Additional client configuration commands - Дополнительные команды конфигурации клиента + - - + + Commands: - Commands: + - + Additional server configuration commands - Дополнительные команды конфигурации сервера + - + Remove OpenVPN - Удалить OpenVPN + - + Remove OpenVpn from server? - Удалить OpenVpn с сервера? + - + All users with whom you shared a connection will no longer be able to connect to it. - Все пользователи, с которыми вы поделились этим VPN-протоколом, больше не смогут к нему подключаться. + - All users who you shared a connection with will no longer be able to connect to it. - Все пользователи, с которыми вы поделились этим VPN-протоколом, больше не смогут к нему подключаться. - - - + Continue - Продолжить + - + Cancel - Отменить + - + Save and Restart Amnezia - Сохранить и перезагрузить + @@ -625,77 +576,66 @@ Already installed containers were found on the server. All installed containers settings - настройки + Show connection options - Показать параметры подключения + - + Connection options %1 - Параметры подключения %1 - - - - Remove - Удалить - - - - Remove %1 from server? - Удалить %1 с сервера? - - - - All users with whom you shared a connection will no longer be able to connect to it. - Все пользователи, с которыми вы поделились этим VPN-протоколом, больше не смогут к нему подключаться. - - - All users who you shared a connection with will no longer be able to connect to it. - Все пользователи, с которыми вы поделились этим VPN-протоколом, больше не смогут к нему подключаться. + - Continue - Продолжить + Remove + - + + Remove %1 from server? + + + + + All users with whom you shared a connection will no longer be able to connect to it. + + + + + Continue + + + + Cancel - Отменить + PageProtocolShadowSocksSettings - + ShadowSocks settings - Настройки ShadowSocks + - + Port - Порт + - - + + Cipher - Шифрование + - + Save and Restart Amnezia - Сохранить и перезагрузить Amnezia - - - - PageServerContainers - - Continue - Продолжить + @@ -704,33 +644,32 @@ Already installed containers were found on the server. All installed containers A DNS service is installed on your server, and it is only accessible via VPN. - На вашем сервере установлен DNS-сервис, доступ к нему возможен только через VPN. - + The DNS address is the same as the address of your server. You can configure DNS in the settings, under the connections tab. - Адрес DNS совпадает с адресом вашего сервера. Настроить DNS можно во вкладке "Соединения" настроек приложения + Remove - Удалить + Remove %1 from server? - Удалить %1 с сервера? + Continue - Продолжить + Cancel - Отменить + @@ -738,17 +677,17 @@ Already installed containers were found on the server. All installed containers Settings updated successfully - Настройки успешно обновлены + SFTP settings - Настройки SFTP + Host - Хост + @@ -756,69 +695,69 @@ Already installed containers were found on the server. All installed containers Copied - Скопировано + Port - Порт + Login - Логин + Password - Пароль + Mount folder on device - Смонтировать папку на вашем устройстве + In order to mount remote SFTP folder as local drive, perform following steps: <br> - Чтобы смонтировать SFTP-папку как локальный диск на вашем устройстве, выполните следующие действия + <br>1. Install the latest version of - <br>1. Установите последнюю версию + <br>2. Install the latest version of - <br>2. Установите последнюю версию + Detailed instructions - Подробные инструкции + Remove SFTP and all data stored there - Удалить SFTP-хранилище со всеми данными + Remove SFTP and all data stored there? - Удалить SFTP-хранилище и все хранящиеся на нем данные? + Continue - Продолжить + Cancel - Отменить + @@ -826,22 +765,22 @@ Already installed containers were found on the server. All installed containers Settings updated successfully - Настройки успешно обновлены + Tor website settings - Настройки сайта в сети Тоr + Website address - Адрес сайта + Copied - Скопировано + @@ -864,31 +803,27 @@ Already installed containers were found on the server. All installed containers When configuring WordPress set the this onion address as domain. - При настройке WordPress укажите этот onion адрес в качестве домена. - - - When configuring WordPress set the this address as domain. - При настройке WordPress укажите этот onion адрес в качестве домена. + Remove website - Удалить сайт + The site with all data will be removed from the tor network. - Сайт со всеми данными будет удален из сети Tor. + Continue - Продолжить + Cancel - Отменить + @@ -896,45 +831,41 @@ Already installed containers were found on the server. All installed containers Settings - Настройки + Servers - Серверы + Connection - Соединение + Application - Приложение + Backup - Резервное копирование + About AmneziaVPN - Об AmneziaVPN + Close application - Закрыть приложение + PageSettingsAbout - - Support the project with a donation - Поддержите проект пожертвованием - Support Amnezia @@ -943,87 +874,87 @@ Already installed containers were found on the server. All installed containers This is a free and open source application. If you like it, support the developers with a donation. - Это бесплатное приложение с открытым исходным кодом. Если, оно вам нравится - поддержите разработчиков пожертвованием. + And if you don’t like the application, all the more reason to support it - the donation will be used for the improving the application. - А, если оно вам не нравится, тем более поддержите-пожертвование пойдет на улучшение приложения. + Card on Patreon - Картой на Patreon + https://www.patreon.com/amneziavpn - https://www.patreon.com/amneziavpn + Show other methods on Github - Показать другие способы на Github + - + https://github.com/amnezia-vpn/amnezia-client#donate - + Contacts - Контакты + - + Telegram group - Группа в Telegram + - + To discuss features - Для обсуждений + - + https://t.me/amnezia_vpn_en - https://t.me/amnezia_vpn + - + Mail - Почта + - + For reviews and bug reports - Для отзывов и сообщений об ошибках + - + Github - Github + - + https://github.com/amnezia-vpn/amnezia-client - https://github.com/amnezia-vpn/amnezia-client + - + Website - Веб-сайт + - + https://amnezia.org - https://amnezia.org + - + Check for updates - Проверить обновления + @@ -1031,151 +962,151 @@ Already installed containers were found on the server. All installed containers Application - Приложение + Allow application screenshots - Разрешить скриншоты приложения + Auto start - Автозапуск + Launch the application every time the device is starts - Открывать приложение при запуске устройства + Start minimized - Запускать в свернутом виде + Launch application minimized - Запускать приложение в свернутом виде + Language - Язык + - + Logging - Логирование + - + Enabled - Включено + - + Disabled - Отключено + + + + + Reset settings and remove all data from the application + - Reset settings and remove all data from the application - Сбросить настройки и удалить все данные из приложения - - - Reset settings and remove all data from the application? - Сбросить настройки и удалить все данные из приложения? + - + All settings will be reset to default. All installed AmneziaVPN services will still remain on the server. - Все данные из приложения будут удалены, все установленные сервисы AmneziaVPN останутся на сервере. + - + Continue - Продолжить + - + Cancel - Отменить + PageSettingsBackup - - - Backup - Резервное копирование - Settings restored from backup file - Восстановление настроек из бэкап файла + + + + + Backup + Configuration backup - Бэкап конфигурация + You can save your settings to a backup file to restore them the next time you install the application. - Поможет мгновенно восстановить настройки соединений при следующей установке. + Make a backup - Сделать бэкап + Save backup file - Сохранить бэкап файл + Backup files (*.backup) - Файлы резервного копирования (*.backup) + Backup file saved - Бэкап файл сохранен + Restore from backup - Восстановить из бэкапа + Open backup file - Открыть бэкап файл + Import settings from a backup file? - Импортировать настройки из бэкап файла? + All current settings will be reset - Все текущие настройки будут сброшены + Continue - Продолжить + Cancel - Отменить + @@ -1183,22 +1114,22 @@ Already installed containers were found on the server. All installed containers Connection - Соединение + Auto connect - Автоподключение + Connect to VPN on app start - Подключение к VPN при запуске приложения + Use AmneziaDNS - Использовать Amnezia DNS + @@ -1208,7 +1139,7 @@ Already installed containers were found on the server. All installed containers DNS servers - DNS сервер + @@ -1227,34 +1158,35 @@ Already installed containers were found on the server. All installed containers Site-based split tunneling - Раздельное туннелирование сайтов + Allows you to select which sites you want to access through the VPN - Позволяет подключаться к одним сайтам через VPN, а к другим в обход него + App-based split tunneling - Раздельное VPN-туннелирование приложений + - Allows you to use the VPN only for certain applications - Позволяет использовать VPN только для определённых приложений + + Allows you to use the VPN only for certain Apps + PageSettingsDns - + Default server does not support custom dns - + DNS servers - DNS сервер + @@ -1262,49 +1194,49 @@ Already installed containers were found on the server. All installed containers Эти адреса будут использоваться, если не включен или не установлен AmneziaDNS - + Primary DNS - Первичный DNS + - + Secondary DNS - Вторичный DNS + - + Restore default - Восстановить по умолчанию + - + Restore default DNS settings? - Восстановить настройки DNS по умолчанию? + - + Continue - Продолжить + - + Cancel - Отменить + - + Settings have been reset - Настройки сброшены + - + Save - Сохранить + - + Settings saved - Сохранить настройки + @@ -1312,62 +1244,62 @@ Already installed containers were found on the server. All installed containers Logging - Логирование + Save logs - Сохранять логи + Open folder with logs - Открыть папку с логами + Save - Сохранить + Logs files (*.log) - Logs files (*.log) + Logs file saved - Файл с логами сохранен + Save logs to file - Сохранить логи в файл + Clear logs? - Очистить логи? + Continue - Продолжить + Cancel - Отменить + - + Logs have been cleaned up - Логи удалены + - + Clear logs - Удалить логи + @@ -1375,71 +1307,73 @@ Already installed containers were found on the server. All installed containers All installed containers have been added to the application - Все установленные протоколы и сервисы были добавлены в приложение - - - - Clear Amnezia cache - Очистить кэш Amnezia - - - - May be needed when changing other settings - Может понадобиться при изменении других настроек - - - - Clear cached profiles? - Удалить кэш Amnezia? + No new installed containers found - Новые установленные протоколы и сервисы не обнаружены + + + + + Clear Amnezia cache + + May be needed when changing other settings + + + + + Clear cached profiles? + + + + - - - + + + + Continue - Продолжить + - - - + + + + Cancel - Отменить + + + + + Check the server for previously installed Amnezia services + - Check the server for previously installed Amnezia services - Проверить сервер на наличие ранее установленных сервисов Amnezia - - - Add them to the application if they were not displayed - Добавить их в приложение, если они не были отображены + - + Reboot server Перезагрузить сервер - + Do you want to reboot the server? Вы уверены, что хотите перезагрузить сервер? - + The reboot process may take approximately 30 seconds. Are you sure you wish to proceed? Процесс перезагрузки может занять около 30 секунд. Вы уверены, что хотите продолжить? @@ -1454,60 +1388,62 @@ Already installed containers were found on the server. All installed containers Вы хотите очистить сервер от всех сервисов Amnezia? - - Remove server from application - Удалить сервер из приложения - - - Remove server? - Удалить сервер? - - - + All installed AmneziaVPN services will still remain on the server. - Все установленные сервисы и протоколы Amnezia всё ещё останутся на сервере. + - + Clear server from Amnezia software - Очистить сервер от протоколов и сервисов Amnezia + - Clear server from Amnezia software? - Удалить все сервисы и протоколы Amnezia с сервера? + + Do you want to clear server from Amnezia software? + - + All containers will be deleted on the server. This means that configuration files, keys and certificates will be deleted. - На сервере будут удалены все данные, связанные с Amnezia: протоколы, сервисы, конфигурационные файлы, ключи и сертификаты. + + + + + Reset API config + + + + + Do you want to reset API config? + PageSettingsServerInfo - + Server name - Имя сервера + - + Save - Сохранить + - + Protocols - Протоколы + - + Services - Сервисы + - + Data - Данные + @@ -1515,36 +1451,32 @@ Already installed containers were found on the server. All installed containers settings - настройки + Remove - Удалить + Remove %1 from server? - Удалить %1 с сервера? + All users with whom you shared a connection will no longer be able to connect to it. - Все пользователи, с которыми вы поделились этим VPN-протоколом, больше не смогут к нему подключаться. - - - All users who you shared a connection with will no longer be able to connect to it. - Все пользователи, которым вы поделились VPN, больше не смогут к нему подключаться. + Continue - Продолжить + Cancel - Отменить + @@ -1552,13 +1484,13 @@ Already installed containers were found on the server. All installed containers Servers - Серверы + PageSettingsSplitTunneling - + Default server does not support split tunneling function @@ -1567,32 +1499,32 @@ Already installed containers were found on the server. All installed containers Только адреса из списка должны открываться через VPN - + Addresses from the list should not be accessed via VPN - Адреса из списка не должны открываться через VPN + - + Split tunneling - Раздельное VPN-туннелирование + - + Mode - Режим + - + Remove - Удалить + - + Continue - Продолжить + - + Cancel Отменить @@ -1615,52 +1547,52 @@ Already installed containers were found on the server. All installed containers - + Import / Export Sites - + Import - Импорт + - + Save site list - Сохранить список сайтов + - + Save sites - Сохранить - - - - - - Sites files (*.json) - Sites files (*.json) - - - - Import a list of sites - Импортировать список с сайтами - - - - Replace site list - Заменить список сайтов + + - Open sites file - Открыть список с сайтами + Sites files (*.json) + - + + Import a list of sites + + + + + Replace site list + + + + + + Open sites file + + + + Add imported sites to existing ones - Добавить импортированные сайты к существующим + @@ -1668,121 +1600,102 @@ Already installed containers were found on the server. All installed containers Server connection - Подключение к серверу + Do not use connection code from public sources. It may have been created to intercept your data. It's okay as long as it's from someone you trust. - Не используйте код подключения из публичных источников. Его могли создать, чтобы перехватывать ваши данные.. - -Всё в порядке, если кодом поделился пользователь, которому вы доверяете. + What do you have? - Выберете что у вас есть - - - - File with connection settings - Файл с настройками подключения + File with connection settings or backup - Файл с настройками подключения или бэкап + + + + + File with connection settings + Open config file - Открыть файл с конфигурацией + QR-code - QR-код + Key as text - Ключ в виде текста + PageSetupWizardCredentials - Server connection - Подключение к серверу - - - - Server IP address [:port] - Server IP address [:port] - - - 255.255.255.255:88 - 255.255.255.255:88 - - - Password / SSH private key - Password / SSH private key - - - - Continue - Продолжить - - - All data you enter will remain strictly confidential -and will not be shared or disclosed to the Amnezia or any third parties - Все данные, которые вы вводите, останутся строго конфиденциальными и не будут переданы или раскрыты Amnezia или каким-либо третьим сторонам - - - - Enter the address in the format 255.255.255.255:88 - Введите адрес в формате 255.255.255.255:88 - - - - Login to connect via SSH - Login to connect via SSH - - - + Configure your server - Настроить ваш сервер + - + + Server IP address [:port] + + + + 255.255.255.255:22 - + + Login to connect via SSH + + + + Password or SSH private key - + + Continue + + + + All data you enter will remain strictly confidential and will not be shared or disclosed to the Amnezia or any third parties - Все введенные вами данные останутся строго конфиденциальными и не будут переданы или раскрыты Amnezia или третьим лицам + - + Ip address cannot be empty - Поле Ip address не может быть пустым + - + + Enter the address in the format 255.255.255.255:88 + + + + Login cannot be empty - Поле Login не может быть пустым + - + Password/private key cannot be empty - Поле Password/private key не может быть пустым + @@ -1790,107 +1703,99 @@ and will not be shared or disclosed to the Amnezia or any third parties What is the level of internet control in your region? - Какой уровень контроля интернета в вашем регионе? + Set up a VPN yourself - Настроить VPN самостоятельно + I want to choose a VPN protocol - Выбрать VPN-протокол + Continue - Продолжить + - + Set up later - Настроить позднее + PageSetupWizardInstalling + + + + Usually it takes no more than 5 minutes + + The server has already been added to the application - Сервер уже был добавлен в приложение - - - Amnesia has detected that your server is currently - Amnesia обнаружила, что ваш сервер в настоящее время - - - busy installing other software. Amnesia installation - занят установкой других протоколов или сервисов. Установка Amnesia + Amnezia has detected that your server is currently - Amnezia обнаружила, что ваш сервер в настоящее время + busy installing other software. Amnezia installation - занят установкой другого программного обеспечения. Установка Amnezia + will pause until the server finishes installing other software - будет приостановлена до тех пор, пока сервер не завершит установку + Installing - Установка + Cancel installation - - - - Usually it takes no more than 5 minutes - Обычно это занимает не более 5 минут - PageSetupWizardProtocolSettings - + Installing %1 - Установить %1 + - + More detailed - Подробнее + - + Close - Закрыть + - + Network protocol - Сетевой протокол + - + Port - Порт + - + Install - Установить + @@ -1898,12 +1803,12 @@ and will not be shared or disclosed to the Amnezia or any third parties VPN protocol - VPN протокол + Choose the one with the highest priority for you. Later, you can install other protocols and additional services, such as DNS proxy and SFTP. - Выберите протокол, который вам больше подходит. В дальнейшем можно установить другие протоколы и дополнительные сервисы, такие как DNS-прокси, TOR-сайт и SFTP. + @@ -1911,7 +1816,7 @@ and will not be shared or disclosed to the Amnezia or any third parties Point the camera at the QR code and hold for a couple of seconds. - Наведите камеру на QR-код и удерживайте ее в течение нескольких секунд. + @@ -1919,30 +1824,30 @@ and will not be shared or disclosed to the Amnezia or any third parties Settings restored from backup file - Восстановление настроек из бэкап файла + Free service for creating a personal VPN on your server. - Простое и бесплатное приложение для запуска self-hosted VPN с высокими требованиями к приватности. + Helps you access blocked content without revealing your privacy, even to VPN providers. - Помогает получить доступ к заблокированному контенту, не раскрывая вашу конфиденциальность даже провайдерам VPN. + I have the data to connect - У меня есть данные для подключения + I have nothing - У меня ничего нет + - + https://amnezia.org/instructions/0_starter-guide @@ -1950,173 +1855,180 @@ and will not be shared or disclosed to the Amnezia or any third parties PageSetupWizardTextKey - + Connection key - Ключ для подключения + - + A line that starts with vpn://... - Строка, которая начинается с vpn://... - - - - Key - Ключ + - Insert - Вставить + Key + - + + Insert + + + + Continue - Продолжить + PageSetupWizardViewConfig - + New connection - Новое соединение + - + Do not use connection code from public sources. It could be created to intercept your data. - Не используйте код подключения из публичных источников. Его могли создать, чтобы перехватывать ваши данные. + - + Collapse content - Свернуть + - + Show content - Показать содержимое ключа + - + Connect - Подключиться + PageShare - - OpenVpn native format - OpenVpn нативный формат - - - - WireGuard native format - WireGuard нативный формат - - - VPN Access - VPN-Доступ - - - - Connection - Соединение - - - VPN access without the ability to manage the server - Доступ к VPN, без возможности управления сервером - - - Access to server management. The user with whom you share full access to the connection will be able to add and remove your protocols and services to the server, as well as change settings. - Доступ к управлению сервером. Пользователь, с которым вы делитесь полным доступом к соединению, сможет добавлять и удалять ваши протоколы и службы на сервере, а также изменять настройки. - - - - - Server - Сервер - - - Accessing - Доступ - - - + Config revoked - + Connection to - Подключение к + - + File with connection settings to - Файл с настройками доступа к + Save OpenVPN config - Сохранить OpenVPN config + Save WireGuard config - Сохранить WireGuard config + Save ShadowSocks config - Сохранить конфигурацию ShadowSocks + Save Cloak config - Сохранить конфигурацию Cloak + + + + + For the AmneziaVPN app + - For the AmneziaVPN app - Для AmneziaVPN + OpenVpn native format + + + + + WireGuard native format + + + + + ShadowSocks native format + - ShadowSocks native format - ShadowSocks нативный формат - - - Cloak native format - Cloak нативный формат + - + Share VPN Access - Поделиться VPN + - + Share full access to the server and VPN - Поделиться полным доступом к серверу + - + Use for your own devices, or share with those you trust to manage the server. - Используйте для собственных устройств или передайте управление сервером тем, кому вы доверяете. + - + + + Share + + + + + Connection + + + + Users - Пользователи + - + + Share VPN access without the ability to manage the server + + + + User name - Имя пользователя + + + + + + Server + + + + + + Protocol + + + + + + Connection format + @@ -2124,76 +2036,49 @@ and will not be shared or disclosed to the Amnezia or any third parties - + Creation date: Дата создания - + Rename - Переименовать + - + Client name - + Save - Сохранить + - + Revoke - Отозвать + - + Revoke the config for a user - %1? - Отозвать доступ для пользователя - %1? + - + The user will no longer be able to connect to your server. - Пользователь больше не сможет подключаться к вашему серверу + - + Continue - Продолжить + - + Cancel - Отменить - - - Full access - Полный доступ - - - - Share VPN access without the ability to manage the server - Поделиться доступом к VPN, без возможности управления сервером - - - - - Protocol - Протокол - - - - - Connection format - Формат подключения - - - - - Share - Поделиться + @@ -2201,49 +2086,49 @@ and will not be shared or disclosed to the Amnezia or any third parties Full access to the server and VPN - Полный доступ к серверу и VPN + We recommend that you use full access to the server only for your own additional devices. - Мы рекомендуем использовать полный доступ к серверу только для собственных устройств. + If you share full access with other people, they can remove and add protocols and services to the server, which will cause the VPN to work incorrectly for all users. - Если вы поделитесь полным доступом с другими людьми, то они смогут удалять и добавлять протоколы и сервисы на сервер, что приведет к некорректной работе VPN для всех пользователей. + - + Server - Сервер - - - - Accessing - Доступ + + Accessing + + + + File with accessing settings to - + Share - Поделиться - - - - Connection to - Подключение к + + Connection to + + + + File with connection settings to - Файл с настройками доступа к + @@ -2251,7 +2136,7 @@ and will not be shared or disclosed to the Amnezia or any third parties Close - Закрыть + @@ -2259,38 +2144,38 @@ and will not be shared or disclosed to the Amnezia or any third parties Password entry not found - Password entry not found + Could not decrypt data - Could not decrypt data + Unknown error - Unknown error + Could not open wallet: %1; %2 - Could not open wallet: %1; %2 + Password not found - Password not found + Could not open keystore - Could not open keystore + Could not remove private key from keystore - Could not remove private key from keystore + @@ -2298,12 +2183,12 @@ and will not be shared or disclosed to the Amnezia or any third parties Unknown error - Unknown error + Access to keychain denied - Access to keychain denied + @@ -2311,27 +2196,27 @@ and will not be shared or disclosed to the Amnezia or any third parties Could not store data in settings: access error - Could not store data in settings: access error + Could not store data in settings: format error - Could not store data in settings: format error + Could not delete data from settings: access error - Could not delete data from settings: access error + Could not delete data from settings: format error - Could not delete data from settings: format error + Entry not found - Entry not found + @@ -2339,80 +2224,80 @@ and will not be shared or disclosed to the Amnezia or any third parties Password entry not found - Password entry not found + Could not decrypt data - Could not decrypt data + D-Bus is not running - D-Bus is not running + Unknown error - Unknown error + No keychain service available - No keychain service available + Could not open wallet: %1; %2 - Could not open wallet: %1; %2 + Access to keychain denied - Access to keychain denied + Could not determine data type: %1; %2 - Could not determine data type: %1; %2 + Entry not found - Entry not found + Unsupported entry type 'Map' - Unsupported entry type 'Map' + Unknown kwallet entry type '%1' - Unknown kwallet entry type '%1' + Password not found - Password not found + Could not open keystore - Could not open keystore + Could not retrieve private key from keystore - Could not retrieve private key from keystore + Could not create decryption cipher - Could not create decryption cipher + @@ -2420,309 +2305,387 @@ and will not be shared or disclosed to the Amnezia or any third parties Credential size exceeds maximum size of %1 - Credential size exceeds maximum size of %1 + Credential key exceeds maximum size of %1 - Credential key exceeds maximum size of %1 + Writing credentials failed: Win32 error code %1 - Writing credentials failed: Win32 error code %1 + Encryption failed - Encryption failed + D-Bus is not running - D-Bus is not running + Unknown error - Unknown error + Could not open wallet: %1; %2 - Could not open wallet: %1; %2 + Password not found - Password not found + Could not open keystore - Could not open keystore + Could not create private key generator - Could not create private key generator + Could not generate new private key - Could not generate new private key + Could not retrieve private key from keystore - Could not retrieve private key from keystore + Could not create encryption cipher - Could not create encryption cipher + Could not encrypt data - Could not encrypt data + QObject + + + Sftp service + + No error - No error + Unknown Error - Unknown Error + Function not implemented - Function not implemented + Server check failed - Server check failed + Server port already used. Check for another software - Server port already used. Check for another software + Server error: Docker container missing - Server error: Docker container missing + Server error: Docker failed - Server error: Docker failed + Installation canceled by user - Installation canceled by user + The user does not have permission to use sudo - The user does not have permission to use sudo + Ssh request was denied - Ssh request was denied + Ssh request was interrupted - Ssh request was interrupted + Ssh internal error - Ssh internal error + Invalid private key or invalid passphrase entered - Invalid private key or invalid passphrase entered + The selected private key format is not supported, use openssh ED25519 key types or PEM key types - The selected private key format is not supported, use openssh ED25519 key types or PEM key types + Timeout connecting to server - Timeout connecting to server + Sftp error: End-of-file encountered - Sftp error: End-of-file encountered + Sftp error: File does not exist - Sftp error: File does not exist + Sftp error: Permission denied - Sftp error: Permission denied + Sftp error: Generic failure - Sftp error: Generic failure + Sftp error: Garbage received from server - Sftp error: Garbage received from server + Sftp error: No connection has been set up - Sftp error: No connection has been set up + Sftp error: There was a connection, but we lost it - Sftp error: There was a connection, but we lost it + Sftp error: Operation not supported by libssh yet - Sftp error: Operation not supported by libssh yet + Sftp error: Invalid file handle - Sftp error: Invalid file handle + Sftp error: No such file or directory path exists - Sftp error: No such file or directory path exists + Sftp error: An attempt to create an already existing file or directory has been made - Sftp error: An attempt to create an already existing file or directory has been made + Sftp error: Write-protected filesystem - Sftp error: Write-protected filesystem + Sftp error: No media was in remote drive - Sftp error: No media was in remote drive - - - - The config does not contain any containers and credentials for connecting to the server - Конфиг не содержит контейнеров и учетных данных для подключения к серверу - - - - ErrorCode: %1. - - Failed to save config to disk - Failed to save config to disk - OpenVPN config missing - OpenVPN config missing + OpenVPN management server error - OpenVPN management server error + OpenVPN executable missing - OpenVPN executable missing + ShadowSocks (ss-local) executable missing - ShadowSocks (ss-local) executable missing + Cloak (ck-client) executable missing - Cloak (ck-client) executable missing + Amnezia helper service error - Amnezia helper service error + OpenSSL failed - OpenSSL failed + Can't connect: another VPN connection is active - Can't connect: another VPN connection is active + Can't setup OpenVPN TAP network adapter - Can't setup OpenVPN TAP network adapter + VPN pool error: no available addresses - VPN pool error: no available addresses + + + + + The config does not contain any containers and credentials for connecting to the server + VPN connection error + + + Error when retrieving configuration from API + + + This config has already been added to the application + + + + Internal error - Internal error + + + + + ErrorCode: %1. + IPsec - IPsec - - - - ShadowSocks - masks VPN traffic, making it similar to normal web traffic, but it may be recognized by analysis systems in some highly censored regions. - + + + Website in Tor network + + + + + Amnezia DNS + + + + + Sftp file sharing service + + + + + OpenVPN is the most popular VPN protocol, with flexible configuration options. It uses its own security protocol with SSL/TLS for key exchange. + + + + ShadowSocks - masks VPN traffic, making it similar to normal web traffic, but it may be recognised by analysis systems in some highly censored regions. + ShadowSocks - маскирует VPN-трафик под обычный веб-трафик, но распознается системами анализа в некоторых регионах с высоким уровнем цензуры. + + 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. + OpenVPN over Cloak - OpenVPN с маскировкой VPN под web-трафик и защитой от обнаружения active-probbing. Подходит для регионов с самым высоким уровнем цензуры. + + + + WireGuard - New popular VPN protocol with high performance, high speed and low power consumption. Recommended for regions with low levels of censorship. + + + + + AmneziaWG - Special protocol from Amnezia, based on WireGuard. It's fast like WireGuard, but very resistant to blockages. Recommended for regions with high levels of censorship. + + + + + 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. + + + + + Deploy a WordPress site on the Tor network in two clicks. + + + + + Replace the current DNS server with your own. This will increase your privacy level. - Create a file vault on your server to securely store and transfer files. + Создайте на сервере файловое хранилище для безопасного хранения и передачи файлов. + + + + OpenVPN stands as one of the most popular and time-tested VPN protocols available. +It employs its unique security protocol, leveraging the strength of SSL/TLS for encryption and key exchange. Furthermore, OpenVPN's support for a multitude of authentication methods makes it versatile and adaptable, catering to a wide range of devices and operating systems. Due to its open-source nature, OpenVPN benefits from extensive scrutiny by the global community, which continually reinforces its security. With a strong balance of performance, security, and compatibility, OpenVPN remains a top choice for privacy-conscious individuals and businesses alike. + +* Available in the AmneziaVPN across all platforms +* Normal power consumption on mobile devices +* Flexible customisation to suit user needs to work with different operating systems and devices +* Recognised by DPI analysis systems and therefore susceptible to blocking +* Can operate over both TCP and UDP network protocols. + + + + + 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'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'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. @@ -2760,184 +2723,6 @@ WireGuard is very susceptible to blocking due to its distinct packet signatures. * Works over UDP network protocol. - - - IKEv2, paired with the IPSec encryption layer, stands as a modern and stable VPN protocol. -One of its distinguishing features is its ability to swiftly switch between networks and devices, making it particularly adaptive in dynamic network environments. -While it offers a blend of security, stability, and speed, it's essential to note that IKEv2 can be easily detected and is susceptible to blocking. - -* Available in the AmneziaVPN only on Windows -* Low power consumption, on mobile devices -* Minimal configuration -* Recognised by DPI analysis systems -* Works over UDP network protocol, ports 500 and 4500. - IKEv2 в сочетании с уровнем шифрования IPSec это современный и стабильный протокол VPN. -Он может быстро переключаться между сетями и устройствами, что делает его особенно адаптивным в динамичных сетевых средах. -Несмотря на сочетание безопасности, стабильности и скорости, необходимо отметить, что IKEv2 легко обнаруживается и подвержен блокировке. - -* Доступно в AmneziaVPN только для Windows. -* Низкое энергопотребление, на мобильных устройствах -* Минимальная конфигурация -* Распознается системами DPI-анализа -* Работает по сетевому протоколу UDP, порты 500 и 4500. - - - - DNS Service - DNS Сервис - - - - Sftp file sharing service - Сервис обмена файлами Sftp - - - - - Website in Tor network - Веб-сайт в сети Tor - - - - Amnezia DNS - Amnezia DNS - - - - OpenVPN is the most popular VPN protocol, with flexible configuration options. It uses its own security protocol with SSL/TLS for key exchange. - OpenVPN - популярный VPN-протокол, с гибкой настройкой. Имеет собственный протокол безопасности с SSL/TLS для обмена ключами. - - - ShadowSocks - masks VPN traffic, making it similar to normal web traffic, but it may be recognised by analysis systems in some highly censored regions. - ShadowSocks - маскирует VPN-трафик под обычный веб-трафик, но распознается системами анализа в некоторых регионах с высоким уровнем цензуры. - - - 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. - OpenVPN over Cloak - OpenVPN с маскировкой VPN под web-трафик и защитой от обнаружения active-probbing. Подходит для регионов с самым высоким уровнем цензуры. - - - - WireGuard - New popular VPN protocol with high performance, high speed and low power consumption. Recommended for regions with low levels of censorship. - WireGuard - Популярный VPN-протокол с высокой производительностью, высокой скоростью и низким энергопотреблением. Для регионов с низким уровнем цензуры. - - - - AmneziaWG - Special protocol from Amnezia, based on WireGuard. It's fast like WireGuard, but very resistant to blockages. Recommended for regions with high levels of censorship. - AmneziaWG - Специальный протокол от Amnezia, основанный на протоколе WireGuard. Он такой же быстрый, как WireGuard, но очень устойчив к блокировкам. Рекомендуется для регионов с высоким уровнем цензуры. - - - - 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. - IKEv2 Современный стабильный протокол, немного быстрее других восстанавливает соединение после потери сигнала. Имеет нативную поддержку последних версиий Android и iOS. - - - - Deploy a WordPress site on the Tor network in two clicks. - Разверните сайт на WordPress в сети Tor в два клика. - - - - Replace the current DNS server with your own. This will increase your privacy level. - Замените DNS-сервер на Amnezia DNS. Это повысит уровень конфиденциальности. - - - Create a file vault on your server to securely store and transfer files. - Создайте на сервере файловое хранилище для безопасного хранения и передачи файлов. - - - - OpenVPN stands as one of the most popular and time-tested VPN protocols available. -It employs its unique security protocol, leveraging the strength of SSL/TLS for encryption and key exchange. Furthermore, OpenVPN's support for a multitude of authentication methods makes it versatile and adaptable, catering to a wide range of devices and operating systems. Due to its open-source nature, OpenVPN benefits from extensive scrutiny by the global community, which continually reinforces its security. With a strong balance of performance, security, and compatibility, OpenVPN remains a top choice for privacy-conscious individuals and businesses alike. - -* Available in the AmneziaVPN across all platforms -* Normal power consumption on mobile devices -* Flexible customisation to suit user needs to work with different operating systems and devices -* Recognised by DPI analysis systems and therefore susceptible to blocking -* Can operate over both TCP and UDP network protocols. - OpenVPN однин из самых популярных и проверенных временем VPN-протоколов. -В нем используется уникальный протокол безопасности, опирающийся на протокол SSL/TLS для шифрования и обмена ключами. Кроме того, поддержка OpenVPN множества методов аутентификации делает его универсальным и адаптируемым к широкому спектру устройств и операционных систем. Благодаря открытому исходному коду OpenVPN подвергается тщательному анализу со стороны мирового сообщества, что постоянно повышает его безопасность. Благодаря оптимальному соотношению производительности, безопасности и совместимости OpenVPN остается лучшим выбором как для частных лиц, так и для компаний, заботящихся о конфиденциальности. - -* Доступность AmneziaVPN для всех платформ -* Нормальное энергопотребление на мобильных устройствах -* Гибкая настройка под нужды пользователя для работы с различными операционными системами и устройствами -* Распознается системами DPI-анализа и поэтому подвержен блокировке -* Может работать по сетевым протоколам TCP и UDP. - - - - 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'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'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. - Shadowsocks, создан на основе протокола SOCKS5, защищает соединение с помощью шифра AEAD. Несмотря на то, что протокол Shadowsocks разработан таким образом, чтобы быть незаметным и сложным для идентификации, он не идентичен стандартному HTTPS-соединению. Однако некоторые системы анализа трафика все же могут обнаружить соединение Shadowsocks. В связи с ограниченной поддержкой в Amnezia рекомендуется использовать протокол AmneziaWG, или OpenVPN over Cloak. - -* Доступен в AmneziaVPN только на ПК ноутбуках. -* Настраиваемый протокол шифрования -* Обнаруживается некоторыми DPI-системами -* Работает по сетевому протоколу TCP. - - - This is a combination of the OpenVPN protocol and the Cloak plugin designed specifically for blocking protection. - -OpenVPN provides a secure VPN connection by encrypting all Internet traffic between the client and the server. - -Cloak protects OpenVPN from detection and blocking. - -Cloak can modify packet metadata so that it completely masks VPN traffic as normal web traffic, and also protects the VPN from detection by Active Probing. This makes it very resistant to being detected - -Immediately after receiving the first data packet, Cloak authenticates the incoming connection. If authentication fails, the plugin masks the server as a fake website and your VPN becomes invisible to analysis systems. - -If there is a extreme level of Internet censorship in your region, we advise you to use only OpenVPN over Cloak from the first connection - -* Available in the AmneziaVPN across all platforms -* High power consumption on mobile devices -* Flexible settings -* Not recognised by DPI analysis systems -* Works over TCP network protocol, 443 port. - - OpenVPN over Cloak - это комбинация протокола OpenVPN и плагина Cloak, разработанного специально для защиты от блокировок. - -OpenVPN обеспечивает безопасное VPN-соединение за счет шифрования всего интернет-трафика между клиентом и сервером. - -Cloak защищает OpenVPN от обнаружения и блокировок. - -Cloak может изменять метаданные пакетов. Он полностью маскирует VPN-трафик под обычный веб-трафик, а также защищает VPN от обнаружения с помощью Active Probing. Это делает его очень устойчивым к обнаружению - -Сразу же после получения первого пакета данных Cloak проверяет подлинность входящего соединения. Если аутентификация не проходит, плагин маскирует сервер под поддельный сайт, и ваш VPN становится невидимым для аналитических систем. - -Если в вашем регионе существует экстремальный уровень цензуры в Интернете, мы советуем вам при первом подключении использовать только OpenVPN через Cloak - -* Доступность AmneziaVPN на всех платформах -* Высокое энергопотребление на мобильных устройствах -* Гибкие настройки -* Не распознается системами DPI-анализа -* Работает по сетевому протоколу TCP, 443 порт. - - - - A relatively new popular VPN protocol with a simplified architecture. -Provides stable VPN connection, high performance on all devices. Uses hard-coded encryption settings. WireGuard compared to OpenVPN has lower latency and better data transfer throughput. -WireGuard is very susceptible to blocking due to its distinct packet signatures. Unlike some other VPN protocols that employ obfuscation techniques, the consistent signature patterns of WireGuard packets can be more easily identified and thus blocked by advanced Deep Packet Inspection (DPI) systems and other network monitoring tools. - -* Available in the AmneziaVPN across all platforms -* Low power consumption -* Minimum number of settings -* Easily recognised by DPI analysis systems, susceptible to blocking -* Works over UDP network protocol. - WireGuard - относительно новый популярный VPN-протокол с упрощенной архитектурой. -Обеспечивает стабильное VPN-соединение, высокую производительность на всех устройствах. Использует жестко заданные настройки шифрования. WireGuard по сравнению с OpenVPN имеет меньшую задержку и лучшую пропускную способность при передаче данных. -WireGuard очень восприимчив к блокированию из-за особенностей сигнатур пакетов. В отличие от некоторых других VPN-протоколов, использующих методы обфускации, последовательные сигнатуры пакетов WireGuard легче выявляются и, соответственно, блокируются современными системами глубокой проверки пакетов (DPI) и другими средствами сетевого мониторинга. - -* Доступность AmneziaVPN для всех платформ -* Низкое энергопотребление -* Минимальное количество настроек -* Легко распознается системами DPI-анализа, подвержен блокировке -* Работает по сетевому протоколу UDP. - A modern iteration of the popular VPN protocol, AmneziaWG builds upon the foundation set by WireGuard, retaining its simplified architecture and high-performance capabilities across devices. @@ -2949,97 +2734,98 @@ This means that AmneziaWG keeps the fast performance of the original while addin * Minimum number of settings * Not recognised by DPI analysis systems, resistant to blocking * Works over UDP network protocol. - AmneziaWG - усовершенствованная версия популярного VPN-протокола Wireguard. AmneziaWG опирается на фундамент, заложенный WireGuard, сохраняя упрощенную архитектуру и высокопроизводительные возможности работы на разных устройствах. -Хотя WireGuard известен своей эффективностью, у него были проблемы с обнаружением из-за характерных сигнатур пакетов. AmneziaWG решает эту проблему за счет использования более совершенных методов обфускации, благодаря чему его трафик сливается с обычным интернет-трафиком. -Таким образом, AmneziaWG сохраняет высокую производительность оригинала, добавляя при этом дополнительный уровень скрытности, что делает его отличным выбором для тех, кому нужно быстрое и незаметное VPN-соединение. - -* Доступность AmneziaVPN на всех платформах -* Низкое энергопотребление -* Минимальное количество настроек -* Не распознается системами DPI-анализа, устойчив к блокировке -* Работает по сетевому протоколу UDP. + - AmneziaWG container - AmneziaWG протокол + + IKEv2, paired with the IPSec encryption layer, stands as a modern and stable VPN protocol. +One of its distinguishing features is its ability to swiftly switch between networks and devices, making it particularly adaptive in dynamic network environments. +While it offers a blend of security, stability, and speed, it's essential to note that IKEv2 can be easily detected and is susceptible to blocking. + +* Available in the AmneziaVPN only on Windows +* Low power consumption, on mobile devices +* Minimal configuration +* Recognised by DPI analysis systems +* Works over UDP network protocol, ports 500 and 4500. + + + + + DNS Service + Sftp file sharing service - is secure FTP service - Файловое хранилище для безопасного хранения данных - - - - Sftp service - Сервис SFTP + Entry not found - Entry not found + Access to keychain denied - Access to keychain denied + No keyring daemon - No keyring daemon + Already unlocked - Already unlocked + No such keyring - No such keyring + Bad arguments - Bad arguments + I/O error - I/O error + Cancelled - Cancelled + Keyring already exists - Keyring already exists + No match - No match + Unknown error - Unknown error + error 0x%1: %2 - error 0x%1: %2 + SelectLanguageDrawer - + Choose language - Выберите язык + @@ -3047,76 +2833,78 @@ This means that AmneziaWG keeps the fast performance of the original while addin Server #1 - Server #1 + Server - Server + SettingsController - + Software version - Версия ПО + - - All settings have been reset to default values - Все настройки были сброшены к значению "По умолчанию" - - - - Cached profiles cleared - Кэш профиля очищен - - - + Backup file is corrupted - Backup файл поврежден + + + + + All settings have been reset to default values + + + + + Cached profiles cleared + ShareConnectionDrawer - + Save AmneziaVPN config - Сохранить config AmneziaVPN + - + Share - Поделиться + - + Copy - Скопировать + - - + + + + Copied - Скопировано + - + Copy config string - + Show connection settings - Показать настройки подключения + - + To read the QR code in the Amnezia app, select "Add server" → "I have data to connect" → "QR code, key or settings file" - Для считывания QR-кода в приложении Amnezia выберите "Добавить сервер" → "У меня есть данные для подключения" → "QR-код, ключ или файл настроек" + @@ -3124,42 +2912,42 @@ This means that AmneziaWG keeps the fast performance of the original while addin Hostname not look like ip adress or domain name - Имя хоста не похоже на ip-адрес или доменное имя + New site added: %1 - Добавлен новый сайт %1 + Site removed: %1 - Сайт удален %1 + Can't open file: %1 - Невозможно открыть файл: %1 + Failed to parse JSON data from file: %1 - Не удалось разобрать JSON-данные из файла: %1 + The JSON data is not an array in file: %1 - Данные JSON не являются массивом в файле: %1 + Import completed - Импорт завершен + Export completed - Экспорт завершен + @@ -3168,39 +2956,39 @@ This means that AmneziaWG keeps the fast performance of the original while addin Show - Показать + Connect - Подключиться + Disconnect - Отключиться + Visit Website - Посетить сайт + Quit - Закрыть + TextFieldWithHeaderType - + The field can't be empty - Поле не может быть пустым + @@ -3208,7 +2996,7 @@ This means that AmneziaWG keeps the fast performance of the original while addin Mbps - Mbps + @@ -3216,42 +3004,42 @@ This means that AmneziaWG keeps the fast performance of the original while addin Unknown - Неизвестный + Disconnected - Отключен + Preparing - Подготовка + Connecting... - Подключение... + Connected - Подключено + Disconnecting... - Отключение... + Reconnecting... - Переподключение... + Error - Ошибка + @@ -3259,65 +3047,45 @@ This means that AmneziaWG keeps the fast performance of the original while addin Low - Низкий + Medium or High - Средний или Высокий + Extreme - Экстремальный + I just want to increase the level of my privacy. - Я просто хочу повысить уровень своей приватности. + I want to bypass censorship. This option recommended in most cases. - Я хочу обойти блокировки. Этот вариант рекомендуется в большинстве случаев. + Most VPN protocols are blocked. Recommended if other options are not working. - Большинство VPN протоколов заблокированы. Рекомендуется, если другие варианты не работают. - - - High - Высокий - - - Medium - Средний - - - Many foreign websites and VPN providers are blocked - Многие иностранные сайты и VPN-провайдеры заблокированы - - - Some foreign sites are blocked, but VPN providers are not blocked - Некоторые иностранные сайты заблокированы, но VPN-провайдеры не блокируются - - - I just want to increase the level of privacy - Хочу просто повысить уровень приватности + main2 - + Private key passphrase - Кодовая фраза для закрытого ключа + - + Save - Сохранить + diff --git a/client/translations/amneziavpn_zh_CN.ts b/client/translations/amneziavpn_zh_CN.ts index 1f400b99..720d7ce3 100644 --- a/client/translations/amneziavpn_zh_CN.ts +++ b/client/translations/amneziavpn_zh_CN.ts @@ -1,104 +1,69 @@ - - AmneziaApplication - - Split tunneling for WireGuard is not implemented, the option was disabled - 未启用选项,还未实现基于WireGuard协议的VPN分离 - - - - AndroidController - - VPN Connected - Refers to the app - which is currently running the background and waiting - VPN已连接 - - - - ApiController - - - Error when retrieving configuration from cloud server - - - ConnectionController - - - - + + + + Connect - 连接 + - + VPN Protocols is not installed. Please install VPN container at first - 请先安装VPN协议 - - - - Connection... - 连接中 + + Connection... + + + + Connected - 已连接 + - + Reconnection... - 重连中 + - + Disconnection... - 断开中 + - + Settings updated successfully, Reconnnection... - 配置已更新,重连中 + - + Settings updated successfully - 配置更新成功 + ConnectionTypeSelectionDrawer - Connection data - 连接方式 - - - + Add new connection - 添加新连接 + - + Configure your server - 配置您的服务器 + - + Open config file, key or QR code - 配置文件,授权码或二维码 - - - Server IP, login and password - 服务器IP,用户名和密码 - - - QR code, key or configuration file - 二维码,授权码或者配置文件 + @@ -106,22 +71,22 @@ C&ut - 剪切 + &Copy - 拷贝 + &Paste - 粘贴 + &SelectAll - 全选 + @@ -129,73 +94,60 @@ Access error! - 访问错误 + HomeContainersListView - + Unable change protocol while there is an active connection - 已建立连接时无法更改服务器配置 + - + The selected protocol is not supported on the current platform - 当前平台不支持所选协议 - - - Reconnect via VPN Procotol: - 重连VPN基于协议: + ImportController - + Scanned %1 of %2. - 扫描 %1 of %2. + InstallController - - installed successfully. - 安装成功 - - - is already installed on the server. - 已安装在服务器上 - %1 installed successfully. - %1 安装成功。 + %1 is already installed on the server. - 服务器上已经安装 %1。 + Added containers that were already installed on the server - 添加已安装在服务器上的容器 + Already installed containers were found on the server. All installed containers have been added to the application - -在服务上发现已经安装协议并添加至应用 + Settings updated successfully - 配置更新成功 + @@ -205,43 +157,27 @@ Already installed containers were found on the server. All installed containers Server '%1' was removed - 已移除服务器 '%1' + All containers from server '%1' have been removed - 服务器 '%1' 的所有容器已移除 + %1 has been removed from the server '%2' - %1 已从服务器 '%2' 上移除 - - - 1% has been removed from the server '%2' - %1 已从服务器 '%2' 上移除 - - - Server ' - 服务器 - - - ' was removed - 已经移除 - - - has been removed from the server ' - 协议已从 + Please login as the user - 请以用户身份登录 + Server added successfully - 增加服务器成功 + @@ -249,17 +185,17 @@ Already installed containers were found on the server. All installed containers Read key failed: %1 - 获取授权码失败: %1 + Write key failed: %1 - 写入授权码失败: %1 + Delete key failed: %1 - 删除授权码失败: %1 + @@ -268,27 +204,27 @@ Already installed containers were found on the server. All installed containers AmneziaVPN - + VPN Connected - 已连接到VPN + VPN Disconnected - 已从VPN断开 + AmneziaVPN notification - AmneziaVPN 提示 + Unsecured network detected: - 发现不安全网络 + @@ -296,359 +232,343 @@ Already installed containers were found on the server. All installed containers Removing services from %1 - 正从 %1 移除服务 + Usually it takes no more than 5 minutes - 大约5分钟之内完成 + PageHome - + VPN protocol - VPN协议 + - + Servers - 服务器 + - + Unable change server while there is an active connection - 已建立连接时无法更改服务器配置 + PageProtocolAwgSettings - + AmneziaWG settings - AmneziaWG 配置 + - + Port - 端口 + - + Junk packet count - 垃圾包数量 + - + Junk packet minimum size - 垃圾包最小值 + - + Junk packet maximum size - 垃圾包最大值 + - + Init packet junk size - 初始化垃圾包大小 + - + Response packet junk size - 响应垃圾包大小 + - + Init packet magic header - 初始化数据包魔数头 + - + Response packet magic header - 响应包魔数头 + - + Transport packet magic header - 传输包魔数头 - - - - Underload packet magic header - 低负载数据包魔数头 - - - - Remove AmneziaWG - 移除AmneziaWG - - - - Remove AmneziaWG from server? - 从服务上移除AmneziaWG? + + Underload packet magic header + + + + + Remove AmneziaWG + + + + + Remove AmneziaWG from server? + + + + All users with whom you shared a connection will no longer be able to connect to it. - 与您共享连接的所有用户将无法再连接到该连接。 + - All users who you shared a connection with will no longer be able to connect to it. - 使用此共享连接的所有用户,将无法再连接它。 - - - + Continue - 继续 + - + Cancel - 取消 + - + Save and Restart Amnezia - 保存并重启Amnezia + PageProtocolCloakSettings - + Cloak settings - Cloak 配置 + - + Disguised as traffic from - 伪装流量为 + - + Port - 端口 + - - + + Cipher - 加密算法 + - + Save and Restart Amnezia - 保存并重启Amnezia + PageProtocolOpenVpnSettings - + OpenVPN settings - OpenVPN 配置 + - VPN Addresses Subnet - VPN子网掩码 - - - + VPN address subnet - + Network protocol - 网络协议 + - + Port - 端口 + - + Auto-negotiate encryption - 自定义加密方式 - - - - - Hash - - - - - SHA512 - - - - - SHA384 - - - - - SHA256 - - - - - SHA3-512 - + - SHA3-384 - - - + Hash + + + + + SHA512 + + + + + SHA384 + + + + + SHA256 + + + + + SHA3-512 + + + + + SHA3-384 + + + + SHA3-256 - + - + whirlpool - + - + BLAKE2b512 - + - + BLAKE2s256 - + - + SHA1 - - - - - - Cipher - - - - - AES-256-GCM - - - - - AES-192-GCM - - - - - AES-128-GCM - - - - - AES-256-CBC - - - - - AES-192-CBC - - - - - AES-128-CBC - + - ChaCha20-Poly1305 - - - + Cipher + + + + + AES-256-GCM + + + + + AES-192-GCM + + + + + AES-128-GCM + + + + + AES-256-CBC + + + + + AES-192-CBC + + + + + AES-128-CBC + + + + + ChaCha20-Poly1305 + + + + ARIA-256-CBC - + - + CAMELLIA-256-CBC - + - + none - + - + TLS auth - TLS认证 + - + Block DNS requests outside of VPN - 阻止VPN外的DNS请求 + - + Additional client configuration commands - 附加客户端配置命令 + - - + + Commands: - 命令: + - + Additional server configuration commands - 附加服务器端配置命令 + - + Remove OpenVPN - 移除OpenVPN + - + Remove OpenVpn from server? - 从服务器移除OpenVPN吗? + - + All users with whom you shared a connection will no longer be able to connect to it. - 与您共享连接的所有用户将无法再连接到该连接。 + - All users who you shared a connection with will no longer be able to connect to it. - 使用此共享连接的所有用户,将无法再连接它。 - - - All users with whom you shared a connection will no longer be able to connect to it - 与您共享连接的所有用户将无法再连接到此链接 - - - + Continue - 继续 + - + Cancel - 取消 + - + Save and Restart Amnezia - 保存并重启Amnezia + @@ -656,82 +576,66 @@ Already installed containers were found on the server. All installed containers settings - 配置 + Show connection options - 显示连接选项 + - Connection options - 连接选项 - - - + Connection options %1 - %1 连接选项 - - - - Remove - 移除 - - - - Remove %1 from server? - 从服务器移除 %1 ? - - - - All users with whom you shared a connection will no longer be able to connect to it. - 与您共享连接的所有用户将无法再连接到该连接。 - - - All users who you shared a connection with will no longer be able to connect to it. - 使用此共享连接的所有用户,将无法再连接它。 - - - from server? - 从服务器 - - - All users with whom you shared a connection will no longer be able to connect to it - 与您共享连接的所有用户将无法再连接到此链接 + - Continue - 继续 + Remove + - + + Remove %1 from server? + + + + + All users with whom you shared a connection will no longer be able to connect to it. + + + + + Continue + + + + Cancel - 取消 + PageProtocolShadowSocksSettings - + ShadowSocks settings - ShadowSocks 配置 + - + Port - 端口 + - - + + Cipher - 加密算法 + - + Save and Restart Amnezia - 保存并重启Amnezia + @@ -740,37 +644,32 @@ Already installed containers were found on the server. All installed containers A DNS service is installed on your server, and it is only accessible via VPN. - 您的服务器已安装DNS服务,仅能通过VPN访问。 - + The DNS address is the same as the address of your server. You can configure DNS in the settings, under the connections tab. - 其地址与您的服务器地址相同。您可以在 设置 连接 中进行配置。 + Remove - 移除 + Remove %1 from server? - 从服务器移除 %1 ? - - - from server? - 从服务器 + Continue - 继续 + Cancel - 取消 + @@ -778,17 +677,17 @@ Already installed containers were found on the server. All installed containers Settings updated successfully - 配置更新成功 + SFTP settings - SFTP 配置 + Host - 主机 + @@ -796,69 +695,69 @@ Already installed containers were found on the server. All installed containers Copied - 拷贝 + Port - 端口 + Login - 用户 + Password - 密码 + Mount folder on device - 挂载文件夹 + In order to mount remote SFTP folder as local drive, perform following steps: <br> - 为将远程 SFTP 文件夹挂载到本地,请执行以下步骤: <br> + <br>1. Install the latest version of - <br>1. 安装最新版的 + <br>2. Install the latest version of - <br>2. 安装最新版的 + Detailed instructions - 详细说明 + Remove SFTP and all data stored there - 移除SFTP和其本地所有数据 + Remove SFTP and all data stored there? - 移除SFTP和其本地所有数据? + Continue - 继续 + Cancel - 取消 + @@ -866,22 +765,22 @@ Already installed containers were found on the server. All installed containers Settings updated successfully - 配置更新成功 + Tor website settings - Tor网站配置 + Website address - 网址 + Copied - 已拷贝 + @@ -893,42 +792,30 @@ Already installed containers were found on the server. All installed containers After creating your onion site, it takes a few minutes for the Tor network to make it available for use. - - Use <a href="https://www.torproject.org/download/" style="color: #FBB26A;">Tor Browser</a> to open this url. - 用 <a href="https://www.torproject.org/download/" style="color: #FBB26A;">Tor 浏览器</a> 打开上面网址 - - - After installation it takes several minutes while your onion site will become available in the Tor Network. - 完成安装几分钟后,洋葱站点才会在 Tor 网络中生效。 - When configuring WordPress set the this onion address as domain. - 配置 WordPress 时,将此洋葱地址设置为域。 - - - When configuring WordPress set the domain as this onion address. - 配置 WordPress 时,将域设置为此洋葱地址。 + Remove website - 移除网站 + The site with all data will be removed from the tor network. - 网站及其所有数据将从 Tor 网络中删除 + Continue - 继续 + Cancel - 取消 + @@ -936,51 +823,41 @@ Already installed containers were found on the server. All installed containers Settings - 设置 + Servers - 服务器 + Connection - 连接 + Application - 应用 + Backup - 备份 + About AmneziaVPN - 关于 + Close application - 关闭应用 + PageSettingsAbout - - Support the project with a donation - 捐款 - - - This is a free and open source application. If you like it, support the developers with a donation. -And if you don't like the app, all the more support it - the donation will be used to improve the app. - 这是一个免费且开源的应用软件。如果您喜欢它,请捐助支持我们继续研发。 -如果您不喜欢,请捐助支持我们改进它。 - Support Amnezia @@ -989,88 +866,87 @@ And if you don't like the app, all the more support it - the donation will This is a free and open source application. If you like it, support the developers with a donation. - 这是一个免费且开源的软件。如果您喜欢它,请捐助开发者们。 - + And if you don’t like the application, all the more reason to support it - the donation will be used for the improving the application. - 如果您不喜欢,请捐助支持我们改进它。 + Card on Patreon - Patreon订阅 + https://www.patreon.com/amneziavpn - + Show other methods on Github - 其他捐款途径 + - + https://github.com/amnezia-vpn/amnezia-client#donate - + Contacts - 联系方式 + - + Telegram group - 电报群 + - + To discuss features - 用于功能讨论 + - + https://t.me/amnezia_vpn_en - + - + Mail - 邮件 + - + For reviews and bug reports - 用于评论和提交软件的缺陷 + - + Github - + - + https://github.com/amnezia-vpn/amnezia-client - + - + Website - 官网 + - + https://amnezia.org - + - + Check for updates - 检查更新 + @@ -1078,89 +954,77 @@ And if you don't like the app, all the more support it - the donation will Application - 应用 + Allow application screenshots - 允许截屏 + Auto start - 自动运行 - - - Launch the application every time - 总是在系统 - - - starts - 启动时自动运行运用程序 - - - Launch the application every time %1 starts - 运行应用软件在%1系统启动时 + Launch the application every time the device is starts - 每次设备启动时启动应用程序 + Start minimized - 最小化 + Launch application minimized - 开启应用软件时窗口最小化 + Language - 语言 + - + Logging - 日志 + - + Enabled - 开启 + - + Disabled - 禁用 + + + + + Reset settings and remove all data from the application + - Reset settings and remove all data from the application - 重置并清理应用的所有数据 - - - Reset settings and remove all data from the application? - 重置并清理应用的所有数据? + - + All settings will be reset to default. All installed AmneziaVPN services will still remain on the server. - 所有配置恢复为默认值。服务器已安装的AmneziaVPN服务将被保留。 + - + Continue - 继续 + - + Cancel - 取消 + @@ -1168,77 +1032,73 @@ And if you don't like the app, all the more support it - the donation will Settings restored from backup file - 从备份文件还原配置 + Backup - 备份 + Configuration backup - 备份设置 - - - It will help you instantly restore connection settings at the next installation - 帮助您在下次安装时立即恢复连接设置 + You can save your settings to a backup file to restore them the next time you install the application. - 您可以将配置信息备份到文件中,以便在下次安装应用软件时恢复配置 + Make a backup - 进行备份 + Save backup file - 保存备份 + Backup files (*.backup) - + Backup file saved - 备份文件已保存 + Restore from backup - 从备份还原 + Open backup file - 打开备份文件 + Import settings from a backup file? - 从备份文件导入设置? + All current settings will be reset - 当前所有设置将重置 + Continue - 继续 + Cancel - 取消 + @@ -1246,144 +1106,120 @@ And if you don't like the app, all the more support it - the donation will Connection - 连接 + Auto connect - 自动连接 + Connect to VPN on app start - 应用开启时连接VPN + + + + + Use AmneziaDNS + + + + + If AmneziaDNS is installed on the server + + + + + DNS servers + When AmneziaDNS is not used or installed - - - Allows you to use the VPN only for certain Apps - - - - Use AmneziaDNS if installed on the server - 使用AmneziaDNS,如其已安装在服务器上 - - - - Use AmneziaDNS - 使用AmneziaDNS - - - - If AmneziaDNS is installed on the server - 如果已在服务器安装AmneziaDNS - - - - DNS servers - DNS服务器 - - - If AmneziaDNS is not used or installed - 如果未使用或未安装AmneziaDNS - Site-based split tunneling - 基于网站的隧道分离 + Allows you to select which sites you want to access through the VPN - 配置想要通过VPN访问网站 + App-based split tunneling - 基于应用的隧道分离 + - Split site tunneling - 网站级VPN分流 - - - Allows you to connect to some sites through a secure connection, and to others bypassing it - 使用VPN访问指定网站,其他的则绕过 - - - Separate application tunneling - 应用级VPN分流 - - - Allows you to use the VPN only for certain applications - 仅指定应用使用VPN + + Allows you to use the VPN only for certain Apps + PageSettingsDns - + Default server does not support custom dns - + DNS servers - DNS服务器 + - + If AmneziaDNS is not used or installed - 如果未使用或未安装AmneziaDNS + - + Primary DNS - 首选 DNS + - + Secondary DNS - 备用 DNS + - + Restore default - 恢复默认配置 + - + Restore default DNS settings? - 是否恢复默认DNS配置? + - + Continue - 继续 + - + Cancel - 取消 + - + Settings have been reset - 已重置 + - + Save - 保存 + - + Settings saved - 配置已保存 + @@ -1391,62 +1227,62 @@ And if you don't like the app, all the more support it - the donation will Logging - 日志 + Save logs - 记录日志 + Open folder with logs - 打开日志文件夹 + Save - 保存 + Logs files (*.log) - + Logs file saved - 日志文件已保存 + Save logs to file - 保存日志到文件 + Clear logs? - 清理日志? + Continue - 继续 + Cancel - 取消 + - + Logs have been cleaned up - 日志已清理 + - + Clear logs - 清理日志 + @@ -1454,139 +1290,143 @@ And if you don't like the app, all the more support it - the donation will All installed containers have been added to the application - 所有已安装的容器,已被添加到应用软件 + No new installed containers found - 未发现新安装的容器 + Clear Amnezia cache - 清除 Amnezia 缓存 + May be needed when changing other settings - 更改其他设置时可能需要缓存 + Clear cached profiles? - 清除缓存? - - - - Do you want to reboot the server? - - Do you want to clear server from Amnezia software? - - - - + - - - + + + + Continue - 继续 + - - - + + + + Cancel - 取消 + + + + + Check the server for previously installed Amnezia services + - Check the server for previously installed Amnezia services - 检查服务器上,是否存在之前安装的 Amnezia 服务 - - - Add them to the application if they were not displayed - 如果存在且未显示,则添加到应用软件 + - + Reboot server - + + Do you want to reboot the server? + + + + The reboot process may take approximately 30 seconds. Are you sure you wish to proceed? - + Remove server from application - 移除本地服务器信息 + - + Do you want to remove the server from application? - Remove server? - 移除本地服务器信息? - - - + All installed AmneziaVPN services will still remain on the server. - 所有已安装的 AmneziaVPN 服务仍将保留在服务器上。 + - + Clear server from Amnezia software - 清理Amnezia中服务器信息 + - Clear server from Amnezia software? - 清理Amnezia中服务器信息 + + Do you want to clear server from Amnezia software? + - + All containers will be deleted on the server. This means that configuration files, keys and certificates will be deleted. - 服务器上的所有容器都将被删除。配置文件、密钥和证书也将被删除。 + + + + + Reset API config + + + + + Do you want to reset API config? + PageSettingsServerInfo - + Server name - 服务器名 + - + Save - 保存 + - + Protocols - 协议 + - + Services - 服务 + - + Data - 数据 + @@ -1594,44 +1434,32 @@ And if you don't like the app, all the more support it - the donation will settings - 配置 + Remove - 移除 - - - - All users with whom you shared a connection will no longer be able to connect to it. - 与您共享连接的所有用户将无法再连接到该连接。 - - - All users who you shared a connection with will no longer be able to connect to it. - 使用此共享连接的所有用户,将无法再连接它。 - - - from server? - 从服务器 + Remove %1 from server? - 从服务器移除 %1 ? + - All users with whom you shared a connection will no longer be able to connect to it - 与您共享连接的所有用户将无法再连接到此链接 + + All users with whom you shared a connection will no longer be able to connect to it. + Continue - 继续 + Cancel - 取消 + @@ -1639,127 +1467,103 @@ And if you don't like the app, all the more support it - the donation will Servers - 服务器 + PageSettingsSplitTunneling - Only the addresses in the list must be opened via VPN - 仅列表中的地址须通过VPN访问 - - - Addresses from the list should never be opened via VPN - 勿通过VPN访问列表中的地址 - - - Split site tunneling - 网站级VPN分流 - - - + Default server does not support split tunneling function - Addresses from the list should be accessed via VPN - 仅使用VPN访问 - - - - Addresses from the list should not be accessed via VPN - 不使用VPN访问 - - - - Split tunneling - 隧道分离 - - - - Mode - 规则 - - - - Remove - 移除 - - - - Continue - 继续 - - - - Cancel - 取消 - - - Site or IP - 网站或IP地址 - - - Import/Export Sites - 导入/导出网站 - - - + Only the sites listed here will be accessed through the VPN + + + Addresses from the list should not be accessed via VPN + + + + + Split tunneling + + + + + Mode + + + + + Remove + + + + + Continue + + + + + Cancel + + website or IP - + Import / Export Sites - + Import - 导入 + - + Save site list - 保存网址 + - + Save sites - 保存网址 - - - - - - Sites files (*.json) - - - - - Import a list of sites - 导入网址列表 - - - - Replace site list - 替换网址列表 + + - Open sites file - 打开网址文件 + Sites files (*.json) + - + + Import a list of sites + + + + + Replace site list + + + + + + Open sites file + + + + Add imported sites to existing ones - 将导入的网址添加到现有网址中 + @@ -1767,117 +1571,102 @@ And if you don't like the app, all the more support it - the donation will Server connection - 服务器连接 + Do not use connection code from public sources. It may have been created to intercept your data. It's okay as long as it's from someone you trust. - 请勿使用公共来源的连接码。它可能是为了拦截您的数据而创建的。 -请确保连接码来源可信。 + What do you have? - 你用什么方式创建连接? + File with connection settings or backup - 包含连接配置或备份的文件 + File with connection settings - 包含连接配置的文件 + Open config file - 打开配置文件 + QR-code - 二维码 + Key as text - 授权码文本 + PageSetupWizardCredentials - Server connection - 连接服务器 - - - + Configure your server - 配置服务器 - - - - Server IP address [:port] - 服务器IP [:端口] - - - - Login to connect via SSH - 用户 - - - Password / SSH private key - 密码 或 私钥 - - - - Continue - 继续 - - - - All data you enter will remain strictly confidential and will not be shared or disclosed to the Amnezia or any third parties - All data you enter will remain strictly confidential -and will not be shared or disclosed to the Amnezia or any third parties - 您输入的所有数据将严格保密 -不会向 Amnezia 或任何第三方分享或披露 + + Server IP address [:port] + - + 255.255.255.255:22 - + + Login to connect via SSH + + + + Password or SSH private key - + + Continue + + + + + All data you enter will remain strictly confidential and will not be shared or disclosed to the Amnezia or any third parties + + + + Ip address cannot be empty - IP不能为空 + - + Enter the address in the format 255.255.255.255:88 - 按照这种格式输入 255.255.255.255:88 + - + Login cannot be empty - 账号不能为空 + - + Password/private key cannot be empty - 密码或私钥不能为空 + @@ -1885,27 +1674,27 @@ and will not be shared or disclosed to the Amnezia or any third parties What is the level of internet control in your region? - 您所在地区的互联网管控力度如何? + Set up a VPN yourself - 自己架设VPN + I want to choose a VPN protocol - 我想选择VPN协议 + Continue - 继续 + - + Set up later - 稍后设置 + @@ -1914,78 +1703,70 @@ and will not be shared or disclosed to the Amnezia or any third parties Usually it takes no more than 5 minutes - 通常不超过5分钟 + The server has already been added to the application - 服务器已添加到应用软件中 + Amnezia has detected that your server is currently - Amnezia 检测到您的服务器当前 + busy installing other software. Amnezia installation - 正安装其他软件。Amnezia安装 + + + + + will pause until the server finishes installing other software + + + + + Installing + Cancel installation - - Amnesia has detected that your server is currently - Amnezia 检测到您的服务器当前 - - - busy installing other software. Amnesia installation - 正安装其他软件。Amnezia安装 - - - - will pause until the server finishes installing other software - 将暂停,直到其他软件安装完成。 - - - - Installing - 安装中 - PageSetupWizardProtocolSettings - + Installing %1 - 正在安装 %1 + - + More detailed - 更多细节 + - + Close - 关闭 + - + Network protocol - 网络协议 + - + Port - 端口 + - + Install - 安装 + @@ -1993,12 +1774,12 @@ and will not be shared or disclosed to the Amnezia or any third parties VPN protocol - VPN 协议 + Choose the one with the highest priority for you. Later, you can install other protocols and additional services, such as DNS proxy and SFTP. - 选择你认为优先级最高的一项。稍后,您可以安装其他协议和附加服务,例如 DNS 代理和 SFTP。 + @@ -2006,7 +1787,7 @@ and will not be shared or disclosed to the Amnezia or any third parties Point the camera at the QR code and hold for a couple of seconds. - 将相机对准二维码并按住几秒钟 + @@ -2014,30 +1795,30 @@ and will not be shared or disclosed to the Amnezia or any third parties Settings restored from backup file - 从备份文件还原配置 + Free service for creating a personal VPN on your server. - 在您的服务器上架设私人免费VPN服务。 + Helps you access blocked content without revealing your privacy, even to VPN providers. - 帮助您访问受限内容,保护您的隐私,即使是VPN提供商也无法获取。 + I have the data to connect - 我有连接配置 + I have nothing - 我没有 + - + https://amnezia.org/instructions/0_starter-guide @@ -2045,70 +1826,85 @@ and will not be shared or disclosed to the Amnezia or any third parties PageSetupWizardTextKey - + Connection key - 连接授权码 + - + A line that starts with vpn://... - 以 vpn://... 开始的行 - - - - Key - 授权码 + - Insert - 插入 + Key + - + + Insert + + + + Continue - 继续 + PageSetupWizardViewConfig - + New connection - 新连接 + - + Do not use connection code from public sources. It could be created to intercept your data. - 请勿使用公共来源的连接码。它可以被创建来拦截您的数据。 + - + Collapse content - 折叠内容 + - + Show content - 显示内容 + - + Connect - 连接 + PageShare + + + Config revoked + + + + + Connection to + + + + + File with connection settings to + + Save OpenVPN config - 保存OpenVPN配置 + Save WireGuard config - 保存WireGuard配置 + @@ -2121,55 +1917,89 @@ and will not be shared or disclosed to the Amnezia or any third parties - + For the AmneziaVPN app - AmneziaVPN 应用 + + + + + OpenVpn native format + - OpenVpn native format - OpenVPN原生格式 + WireGuard native format + - WireGuard native format - WireGuard原生格式 - - - ShadowSocks native format - + Cloak native format - + Share VPN Access - 共享 VPN 访问 + - + Share full access to the server and VPN - + Use for your own devices, or share with those you trust to manage the server. - + + + Share + + + + + Connection + + + + Users - + Share VPN access without the ability to manage the server - 共享 VPN 访问,无需管理服务器 + + + + + User name + + + + + + Server + + + + + + Protocol + + + + + + Connection format + @@ -2177,143 +2007,50 @@ and will not be shared or disclosed to the Amnezia or any third parties - + Creation date: - + Rename - + Client name - + Save - 保存 + - + Revoke - + Revoke the config for a user - %1? - + The user will no longer be able to connect to your server. - + Continue - 继续 + - + Cancel - 取消 - - - Share access to server management. The user with whom you share full access to the server will be able to add and remove any protocols and services to the server, as well as change settings. - 共享服务器管理访问权限。与您共享服务器全部访问权限的用户将可以添加和删除服务器上的任何协议和服务,以及更改设置。 - - - VPN Access - 访问VPN - - - - Connection - 连接 - - - Full access - 完全访问 - - - VPN access without the ability to manage the server - 访问VPN,但没有权限管理服务。 - - - Access to server management. The user with whom you share full access to the connection will be able to add and remove your protocols and services to the server, as well as change settings. - 除访问VPN外,用户还能添加和删除协议、服务以及更改配置信息 - - - Access to server management. The user with whom you share full access to the connection will be able to add and remove your protocols and services to the servers, as well as change settings. - 除访问VPN外,用户还能添加和删除协议、服务以及更改配置信息 - - - Full access to server - 获得服务器完整授权 - - - Servers - 服务器 - - - - - Server - 服务器 - - - Accessing - 访问 - - - File with accessing settings to - 访问配置文件的内容为: - - - - File with connection settings to - 连接配置文件的内容为: - - - Protocols - 协议 - - - - - Protocol - 协议 - - - - Connection to - 连接到 - - - - Config revoked - - - User name - - - - - - Connection format - 连接格式 - - - - - Share - 共享 - PageShareFullAccess @@ -2334,35 +2071,35 @@ and will not be shared or disclosed to the Amnezia or any third parties - + Server - 服务器 - - - - Accessing - 访问 + + Accessing + + + + File with accessing settings to - 访问配置文件的内容为: + - + Share - 共享 - - - - Connection to - 连接到 + + Connection to + + + + File with connection settings to - 连接配置文件的内容为: + @@ -2370,7 +2107,7 @@ and will not be shared or disclosed to the Amnezia or any third parties Close - 关闭 + @@ -2378,38 +2115,38 @@ and will not be shared or disclosed to the Amnezia or any third parties Password entry not found - 未发现秘密 + Could not decrypt data - 数据无法加密 + Unknown error - 未知错误 + Could not open wallet: %1; %2 - 无法打开钱包: %1; %2 + Password not found - 未发现密码 + Could not open keystore - 无法打开密钥库 + Could not remove private key from keystore - 无法从密钥库中删除私钥 + @@ -2417,12 +2154,12 @@ and will not be shared or disclosed to the Amnezia or any third parties Unknown error - 未知错误 + Access to keychain denied - 访问钥匙串被拒绝 + @@ -2430,27 +2167,27 @@ and will not be shared or disclosed to the Amnezia or any third parties Could not store data in settings: access error - 无法在配置中存储数据:访问错误 + Could not store data in settings: format error - 无法在陪置中存储数据:格式错误 + Could not delete data from settings: access error - 无法在配置中删除数据:访问错误 + Could not delete data from settings: format error - 无法在配置中删除数据:格式错误 + Entry not found - 未找到条目 + @@ -2458,80 +2195,80 @@ and will not be shared or disclosed to the Amnezia or any third parties Password entry not found - 未发现密码 + Could not decrypt data - 数据无法加密 + D-Bus is not running - D-Bus未运行 + Unknown error - 未知错误 + No keychain service available - 没有有效的钥匙串服务 + Could not open wallet: %1; %2 - 无法打开钱包: %1; %2 + Access to keychain denied - 访问钥匙串被拒绝 + Could not determine data type: %1; %2 - 无法确定数据类型: %1; %2 + Entry not found - 未找到记录 + Unsupported entry type 'Map' - 不支持的记录类型 'Map' + Unknown kwallet entry type '%1' - 未知钱包类型 '%1' + Password not found - 未发现密码 + Could not open keystore - 无法打开密钥库 + Could not retrieve private key from keystore - 无法从密钥存储库中检索私钥 + Could not create decryption cipher - 无法创建解密算法 + @@ -2539,73 +2276,73 @@ and will not be shared or disclosed to the Amnezia or any third parties Credential size exceeds maximum size of %1 - 证书大小超过上限,最大为: %1 + Credential key exceeds maximum size of %1 - 凭证密钥大小超过上限,最大为: %1 + Writing credentials failed: Win32 error code %1 - 写入凭证失败,Win32错误码: %1 + Encryption failed - 加密失败 + D-Bus is not running - D-Bus未运行 + Unknown error - 未知错误 + Could not open wallet: %1; %2 - 无法打开钱包: %1; %2 + Password not found - 未发现密码 + Could not open keystore - 无法打开密钥库 + Could not create private key generator - 无法创建私钥生成器 + Could not generate new private key - 无法生成新的私钥 + Could not retrieve private key from keystore - 无法从密钥库检索私钥 + Could not create encryption cipher - 无法创建加密密码 + Could not encrypt data - 无法加密数据 + @@ -2613,211 +2350,197 @@ and will not be shared or disclosed to the Amnezia or any third parties Sftp service - Sftp 服务 + No error - 没有错误 + Unknown Error - 未知错误 + Function not implemented - 功能未实现 + Server check failed - 服务器检测失败 + Server port already used. Check for another software - 检测服务器该端口是否被其他软件被占用 + Server error: Docker container missing - 服务器错误: Docker容器丢失 + Server error: Docker failed - 服务器错误: Docker失败 + Installation canceled by user - 用户取消安装 + The user does not have permission to use sudo - 用户没有root权限 + Ssh request was denied - ssh请求被拒绝 + Ssh request was interrupted - ssh请求中断 + Ssh internal error - ssh内部错误 + Invalid private key or invalid passphrase entered - 输入的私钥或密码无效 + The selected private key format is not supported, use openssh ED25519 key types or PEM key types - 不支持所选私钥格式,请使用 openssh ED25519 密钥类型或 PEM 密钥类型 + Timeout connecting to server - 连接服务器超时 + Sftp error: End-of-file encountered - Sftp错误: End-of-file encountered + Sftp error: File does not exist - Sftp错误: 文件不存在 + Sftp error: Permission denied - Sftp错误: 权限不足 + Sftp error: Generic failure - Sftp错误: 一般失败 + Sftp error: Garbage received from server - Sftp错误: 从服务器收到垃圾信息 + Sftp error: No connection has been set up - Sftp 错误: 未建立连接 + Sftp error: There was a connection, but we lost it - Sftp 错误: 已有连接丢失 + Sftp error: Operation not supported by libssh yet - Sftp error: libssh不支持该操作 + Sftp error: Invalid file handle - Sftp error: 无效的文件句柄 + Sftp error: No such file or directory path exists - Sftp 错误: 文件夹或文件不存在 + Sftp error: An attempt to create an already existing file or directory has been made - Sftp 错误: 文件或目录已存在 + Sftp error: Write-protected filesystem - Sftp 错误: 文件系统写保护 + Sftp error: No media was in remote drive - Sftp 错误: 远程驱动器中没有媒介 - - - - VPN connection error - - - ErrorCode: %1. - - - - Failed to save config to disk - 配置保存到磁盘失败 - OpenVPN config missing - OpenVPN配置丢失 + OpenVPN management server error - OpenVPN 管理服务器错误 + OpenVPN executable missing - OpenVPN 可执行文件丢失 + ShadowSocks (ss-local) executable missing - ShadowSocks (ss-local) 执行文件丢失 + Cloak (ck-client) executable missing - Cloak (ck-client) 执行文件丢失 + Amnezia helper service error - Amnezia 服务连接失败 + OpenSSL failed - OpenSSL错误 + Can't connect: another VPN connection is active - 无法连接:另一个VPN连接处于活跃状态 + Can't setup OpenVPN TAP network adapter - 无法设置 OpenVPN TAP 网络适配器 + VPN pool error: no available addresses - VPN 池错误:没有可用地址 + @@ -2825,39 +2548,55 @@ and will not be shared or disclosed to the Amnezia or any third parties - The config does not contain any containers and credentiaks for connecting to the server - 该配置不包含任何用于连接到服务器的容器和凭据。 + + VPN connection error + + + + + Error when retrieving configuration from API + + This config has already been added to the application + + + + Internal error - 内部错误 + + + + + ErrorCode: %1. + IPsec - + Website in Tor network - 在 Tor 网络中架设网站 + Amnezia DNS - + Sftp file sharing service - SFTP文件共享服务 + OpenVPN is the most popular VPN protocol, with flexible configuration options. It uses its own security protocol with SSL/TLS for key exchange. - OpenVPN 是最流行的 VPN 协议,具有灵活的配置选项。它使用自己的安全协议与 SSL/TLS 进行密钥交换。 + @@ -2869,11 +2608,60 @@ and will not be shared or disclosed to the Amnezia or any third parties 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. + + + WireGuard - New popular VPN protocol with high performance, high speed and low power consumption. Recommended for regions with low levels of censorship. + + + + + AmneziaWG - Special protocol from Amnezia, based on WireGuard. It's fast like WireGuard, but very resistant to blockages. Recommended for regions with high levels of censorship. + + + + + 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. + + + + + Deploy a WordPress site on the Tor network in two clicks. + + + + + Replace the current DNS server with your own. This will increase your privacy level. + + Create a file vault on your server to securely store and transfer files. + + + OpenVPN stands as one of the most popular and time-tested VPN protocols available. +It employs its unique security protocol, leveraging the strength of SSL/TLS for encryption and key exchange. Furthermore, OpenVPN's support for a multitude of authentication methods makes it versatile and adaptable, catering to a wide range of devices and operating systems. Due to its open-source nature, OpenVPN benefits from extensive scrutiny by the global community, which continually reinforces its security. With a strong balance of performance, security, and compatibility, OpenVPN remains a top choice for privacy-conscious individuals and businesses alike. + +* Available in the AmneziaVPN across all platforms +* Normal power consumption on mobile devices +* Flexible customisation to suit user needs to work with different operating systems and devices +* Recognised by DPI analysis systems and therefore susceptible to blocking +* Can operate over both TCP and UDP network protocols. + + + + + 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'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'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. + + This is a combination of the OpenVPN protocol and the Cloak plugin designed specifically for protecting against blocking. @@ -2909,138 +2697,6 @@ WireGuard is very susceptible to blocking due to its distinct packet signatures. * Works over UDP network protocol. - - ShadowSocks - masks VPN traffic, making it similar to normal web traffic, but is recognised by analysis systems in some highly censored regions. - ShadowSocks - 混淆 VPN 流量,使其与正常的 Web 流量相似,但在一些审查力度高的地区可以被分析系统识别。 - - - OpenVPN over Cloak - OpenVPN with VPN masquerading as web traffic and protection against active-probbing detection. Ideal for bypassing blocking in regions with the highest levels of censorship. - OpenVPN over Cloak - OpenVPN 与 VPN 具有伪装成网络流量和防止主动探测检测的保护。非常适合绕过审查力度特别强的地区的封锁。 - - - - WireGuard - New popular VPN protocol with high performance, high speed and low power consumption. Recommended for regions with low levels of censorship. - WireGuard - 新型流行的VPN协议,具有高性能、高速度和低功耗。建议用于审查力度较低的地区 - - - - AmneziaWG - Special protocol from Amnezia, based on WireGuard. It's fast like WireGuard, but very resistant to blockages. Recommended for regions with high levels of censorship. - AmneziaWG - Amnezia 的特殊协议,基于 WireGuard。它的速度像 WireGuard 一样快,但非常抗堵塞。推荐用于审查较严的地区。 - - - - 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. - IKEv2 - 现代稳定协议,相比其他协议较快一些,在信号丢失后恢复连接。Android 和 iOS最新版原生支持。 - - - - Deploy a WordPress site on the Tor network in two clicks. - 只需点击两次即可架设 WordPress 网站到 Tor 网络 - - - - Replace the current DNS server with your own. This will increase your privacy level. - 将当前的 DNS 服务器替换为您自己的。这将提高您的隐私保护级别。 - - - Creates a file vault on your server to securely store and transfer files. - 在您的服务器上创建文件仓库,以便安全地存储和传输文件 - - - - OpenVPN stands as one of the most popular and time-tested VPN protocols available. -It employs its unique security protocol, leveraging the strength of SSL/TLS for encryption and key exchange. Furthermore, OpenVPN's support for a multitude of authentication methods makes it versatile and adaptable, catering to a wide range of devices and operating systems. Due to its open-source nature, OpenVPN benefits from extensive scrutiny by the global community, which continually reinforces its security. With a strong balance of performance, security, and compatibility, OpenVPN remains a top choice for privacy-conscious individuals and businesses alike. - -* Available in the AmneziaVPN across all platforms -* Normal power consumption on mobile devices -* Flexible customisation to suit user needs to work with different operating systems and devices -* Recognised by DPI analysis systems and therefore susceptible to blocking -* Can operate over both TCP and UDP network protocols. - OpenVPN 是最流行且经过时间考验的 VPN 协议之一。 -它采用其独特的安全协议,利用 SSL/TLS 的优势进行加密和密钥交换。此外,OpenVPN 支持多种身份验证方法,使其具有多功能性和适应性,可适应各种设备和操作系统。由于其开源性质,OpenVPN 受益于全球社区的广泛审查,这不断增强了其安全性。凭借性能、安全性和兼容性的强大平衡,OpenVPN 仍然是注重隐私的个人和企业的首选。 - -* 可在所有平台的 AmneziaVPN 中使用 -* 移动设备的正常功耗 -* 灵活定制,满足用户使用不同操作系统和设备的需求 -* 被DPI分析系统识别,因此容易被阻塞 -* 可以通过 TCP 和 UDP 网络协议运行 - - - - 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'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'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. - Shadowsocks 受到 SOCKS5 协议的启发,使用 AEAD 密码保护连接。尽管 Shadowsocks 设计得谨慎且难以识别,但它与标准 HTTPS 连接并不相同。但是,某些流量分析系统可能仍会检测到 Shadowsocks 连接。由于Amnezia支持有限,建议使用AmneziaWG协议。 - -* 仅在桌面平台上的 AmneziaVPN 中可用 -* 移动设备的正常功耗 - -* 可配置的加密协议 -* 可以被某些 DPI 系统检测到 -* 通过 TCP 网络协议工作。 - - - This is a combination of the OpenVPN protocol and the Cloak plugin designed specifically for blocking protection. - -OpenVPN provides a secure VPN connection by encrypting all Internet traffic between the client and the server. - -Cloak protects OpenVPN from detection and blocking. - -Cloak can modify packet metadata so that it completely masks VPN traffic as normal web traffic, and also protects the VPN from detection by Active Probing. This makes it very resistant to being detected - -Immediately after receiving the first data packet, Cloak authenticates the incoming connection. If authentication fails, the plugin masks the server as a fake website and your VPN becomes invisible to analysis systems. - -If there is a extreme level of Internet censorship in your region, we advise you to use only OpenVPN over Cloak from the first connection - -* Available in the AmneziaVPN across all platforms -* High power consumption on mobile devices -* Flexible settings -* Not recognised by DPI analysis systems -* Works over TCP network protocol, 443 port. - - 这是 OpenVPN 协议和专门用于阻止保护的 Cloak 插件的组合。 - -OpenVPN 通过加密客户端和服务器之间的所有 Internet 流量来提供安全的 VPN 连接。 - -Cloak 可保护 OpenVPN 免遭检测和阻止。 - -Cloak 可以修改数据包元数据,以便将 VPN 流量完全屏蔽为正常 Web 流量,并且还可以保护 VPN 免受主动探测的检测。这使得它非常难以被发现 - -收到第一个数据包后,Cloak 立即对传入连接进行身份验证。如果身份验证失败,该插件会将服务器伪装成虚假网站,并且您的 VPN 对分析系统来说将变得不可见。 - -如果您所在地区的互联网审查非常严格,我们建议您在第一次连接时仅使用 OpenVPN over Cloak - -* 可在所有平台的 AmneziaVPN 中使用 -* 移动设备功耗高 -* 配置灵活 -* 不被 DPI 分析系统识别 -* 通过 TCP 网络协议、443 端口工作。 - - - A relatively new popular VPN protocol with a simplified architecture. -Provides stable VPN connection, high performance on all devices. Uses hard-coded encryption settings. WireGuard compared to OpenVPN has lower latency and better data transfer throughput. -WireGuard is very susceptible to blocking due to its distinct packet signatures. Unlike some other VPN protocols that employ obfuscation techniques, the consistent signature patterns of WireGuard packets can be more easily identified and thus blocked by advanced Deep Packet Inspection (DPI) systems and other network monitoring tools. - -* Available in the AmneziaVPN across all platforms -* Low power consumption -* Minimum number of settings -* Easily recognised by DPI analysis systems, susceptible to blocking -* Works over UDP network protocol. - 一种相对较新的流行 VPN 协议,具有简化的架构。 -在所有设备上提供稳定的 VPN 连接和高性能。使用硬编码的加密设置。 WireGuard 与 OpenVPN 相比具有更低的延迟和更好的数据传输吞吐量。 -由于其独特的数据包签名,WireGuard 非常容易受到阻塞。与其他一些采用混淆技术的 VPN 协议不同,WireGuard 数据包的一致签名模式可以更容易地被高级深度数据包检测 (DPI) 系统和其他网络监控工具识别并阻止。 - -* 可在所有平台的 AmneziaVPN 中使用 -* 低功耗 -* 配置简单 -* 容易被DPI分析系统识别,容易被阻塞 -* 通过 UDP 网络协议工作。 - A modern iteration of the popular VPN protocol, AmneziaWG builds upon the foundation set by WireGuard, retaining its simplified architecture and high-performance capabilities across devices. @@ -3052,15 +2708,7 @@ This means that AmneziaWG keeps the fast performance of the original while addin * Minimum number of settings * Not recognised by DPI analysis systems, resistant to blocking * Works over UDP network protocol. - AmneziaWG 是流行 VPN 协议的现代迭代,它建立在 WireGuard 的基础上,保留了其简化的架构和跨设备的高性能功能。 -虽然 WireGuard 以其高效而闻名,但由于其独特的数据包签名,它存在容易被检测到的问题。 AmneziaWG 通过使用更好的混淆方法解决了这个问题,使其流量与常规互联网流量融合在一起。 -这意味着 AmneziaWG 保留了原始版本的快速性能,同时添加了额外的隐秘层,使其成为那些想要快速且谨慎的 VPN 连接的人的绝佳选择。 - -* 可在所有平台的 AmneziaVPN 中使用 -* 低功耗 -* 配置简单 -* 不被DPI分析系统识别,抗阻塞 -* 通过 UDP 网络协议工作。 + @@ -3073,113 +2721,85 @@ While it offers a blend of security, stability, and speed, it's essential t * Minimal configuration * Recognised by DPI analysis systems * Works over UDP network protocol, ports 500 and 4500. - IKEv2 与 IPSec 加密层配合使用,是一种现代且稳定的 VPN 协议。 -其显着特征之一是能够在网络和设备之间快速切换,使其特别适应动态网络环境。 -虽然 IKEv2 兼具安全性、稳定性和速度,但必须注意的是,IKEv2 很容易被检测到,并且容易受到阻止。 - -* 仅在 Windows 上的 AmneziaVPN 中可用 -* 低功耗,在移动设备上 -* 最低配置 -* 获得DPI分析系统认可 -* 通过 UDP 网络协议、端口 500 和 4500 工作。 - - - OpenVPN container - OpenVPN容器 - - - Container with OpenVpn and ShadowSocks - 含 OpenVpn 和 ShadowSocks 的容器 - - - Container with OpenVpn and ShadowSocks protocols configured with traffic masking by Cloak plugin - 含 OpenVpn 和 ShadowSocks 协议的容器,通过 Cloak 插件配置混淆流量 - - - WireGuard container - WireGuard 容器 - - - IPsec container - IPsec 容器 + DNS Service - DNS 服务 + Sftp file sharing service - is secure FTP service - Sftp 文件共享服务 - 安全的 FTP 服务 + Entry not found - 未找到记录 + Access to keychain denied - 访问钥匙串被拒绝 + No keyring daemon - 没有密钥环守护进程 + Already unlocked - 已经解锁 + No such keyring - 没有这样的密钥环 + Bad arguments - 错误参数 + I/O error - I/O错误 + Cancelled - 已取消 + Keyring already exists - 密匙环已经存在 + No match - 不匹配 + Unknown error - 未知错误 + error 0x%1: %2 - 错误 0x%1: %2 + SelectLanguageDrawer - + Choose language - 选择语言 + @@ -3187,80 +2807,78 @@ While it offers a blend of security, stability, and speed, it's essential t Server #1 - + Server - 服务器 + SettingsController - + Software version - 软件版本 + - + Backup file is corrupted - 备份文件已损坏 + - + All settings have been reset to default values - 所配置恢复为默认值 + - + Cached profiles cleared - 缓存的配置文件已清除 + ShareConnectionDrawer - + Save AmneziaVPN config - 保存配置 + - + Share - 共享 + - + Copy - 拷贝 + - - + + + + Copied - 已拷贝 + - + Copy config string - + Show connection settings - 显示连接配置 + - Show content - 展示内容 - - - + To read the QR code in the Amnezia app, select "Add server" → "I have data to connect" → "QR code, key or settings file" - 要应用二维码到 Amnezia,请底部工具栏点击“+”→“连接方式”→“二维码、授权码或配置文件” + @@ -3268,42 +2886,42 @@ While it offers a blend of security, stability, and speed, it's essential t Hostname not look like ip adress or domain name - 请输入有效的域名或IP地址 + New site added: %1 - 已经添加新网站: %1 + Site removed: %1 - 已移除网站: %1 + Can't open file: %1 - 无法打开文件: %1 + Failed to parse JSON data from file: %1 - JSON解析失败,文件: %1 + The JSON data is not an array in file: %1 - 文件中的JSON数据不是一个数组,文件: %1 + Import completed - 完成导入 + Export completed - 完成导出 + @@ -3312,39 +2930,39 @@ While it offers a blend of security, stability, and speed, it's essential t Show - 显示 + Connect - 连接 + Disconnect - 断开 + Visit Website - 官网 + Quit - 退出 + TextFieldWithHeaderType - + The field can't be empty - 输入不能为空 + @@ -3352,7 +2970,7 @@ While it offers a blend of security, stability, and speed, it's essential t Mbps - + @@ -3360,42 +2978,42 @@ While it offers a blend of security, stability, and speed, it's essential t Unknown - 未知 + Disconnected - 连接已断开 + Preparing - 准备中 + Connecting... - 连接中 + Connected - 已连接 + Disconnecting... - 断开中 + Reconnecting... - 重连中 + Error - 错误 + @@ -3403,65 +3021,45 @@ While it offers a blend of security, stability, and speed, it's essential t Low - + Medium or High - 中或高 + Extreme - 极度 + I just want to increase the level of my privacy. - 只是想提高隐私保护级别。 + I want to bypass censorship. This option recommended in most cases. - 想要绕过审查制度。大多数情况下推荐使用此选项。 + Most VPN protocols are blocked. Recommended if other options are not working. - 大多数 VPN 协议都被阻止。如果其他选项不起作用,推荐此选项。 - - - High - - - - Medium - - - - I just want to increase the level of privacy - 我只是想提高隐私保护级别 - - - Many foreign websites and VPN providers are blocked - 大多国外网站和VPN提供商被屏蔽 - - - Some foreign sites are blocked, but VPN providers are not blocked - 一些国外网站被屏蔽,但VPN提供商未被屏蔽 + main2 - + Private key passphrase - 私钥密码 + - + Save - 保存 + diff --git a/client/ui/qml/Components/QuestionDrawer.qml b/client/ui/qml/Components/QuestionDrawer.qml index 23592a3b..c63c07b4 100644 --- a/client/ui/qml/Components/QuestionDrawer.qml +++ b/client/ui/qml/Components/QuestionDrawer.qml @@ -55,7 +55,7 @@ DrawerType2 { text: yesButtonText - onClicked: { + clickedFunc: function() { if (yesButtonFunction && typeof yesButtonFunction === "function") { yesButtonFunction() } @@ -76,7 +76,7 @@ DrawerType2 { text: noButtonText - onClicked: { + clickedFunc: function() { if (noButtonFunction && typeof noButtonFunction === "function") { noButtonFunction() } diff --git a/client/ui/qml/Components/ShareConnectionDrawer.qml b/client/ui/qml/Components/ShareConnectionDrawer.qml index a33dc7ee..c209c1ce 100644 --- a/client/ui/qml/Components/ShareConnectionDrawer.qml +++ b/client/ui/qml/Components/ShareConnectionDrawer.qml @@ -74,7 +74,7 @@ DrawerType2 { text: qsTr("Share") imageSource: "qrc:/images/controls/share-2.svg" - onClicked: { + clickedFunc: function() { var fileName = "" if (GC.isMobile()) { fileName = configFileName + configExtension @@ -107,6 +107,13 @@ DrawerType2 { text: qsTr("Copy") imageSource: "qrc:/images/controls/copy.svg" + + clickedFunc: function() { + configText.selectAll() + configText.copy() + configText.select(0, 0) + PageController.showNotificationMessage(qsTr("Copied")) + } } BasicButtonType { @@ -125,6 +132,13 @@ DrawerType2 { text: qsTr("Copy config string") imageSource: "qrc:/images/controls/copy.svg" + + clickedFunc: function() { + nativeConfigString.selectAll() + nativeConfigString.copy() + nativeConfigString.select(0, 0) + PageController.showNotificationMessage(qsTr("Copied")) + } } BasicButtonType { @@ -140,7 +154,7 @@ DrawerType2 { text: qsTr("Show connection settings") - onClicked: { + clickedFunc: function() { configContentDrawer.open() } } diff --git a/client/ui/qml/Controls2/BasicButtonType.qml b/client/ui/qml/Controls2/BasicButtonType.qml index a5cde951..77d4b5fb 100644 --- a/client/ui/qml/Controls2/BasicButtonType.qml +++ b/client/ui/qml/Controls2/BasicButtonType.qml @@ -16,47 +16,37 @@ Button { property string textColor: "#0E0E11" property string borderColor: "#D7D8DB" + property string borderFocusedColor: "#D7D8DB" property int borderWidth: 0 + property int borderFocusedWidth: 1 property string imageSource property bool squareLeftSide: false + property var clickedFunc + implicitHeight: 56 hoverEnabled: true background: Rectangle { - id: background + id: background_border + + color: "transparent" + border.color: root.activeFocus ? root.borderFocusedColor : "transparent" + border.width: root.activeFocus ? root.borderFocusedWidth : "transparent" + anchors.fill: parent radius: 16 - color: { - if (root.enabled) { - if (root.pressed) { - return pressedColor - } - return root.hovered ? hoveredColor : defaultColor - } else { - return disabledColor - } - } - border.color: borderColor - border.width: borderWidth - - Behavior on color { - PropertyAnimation { duration: 200 } - } Rectangle { - visible: root.squareLeftSide + id: background - z: 1 + anchors.fill: background_border + anchors.margins: root.activeFocus ? 2: 0 - width: parent.radius - height: parent.radius - anchors.top: parent.top - anchors.bottom: parent.bottom - anchors.left: parent.left + radius: 16 color: { if (root.enabled) { if (root.pressed) { @@ -67,24 +57,53 @@ Button { return disabledColor } } + border.color: root.activeFocus ? "transparent" : borderColor + border.width: root.activeFocus ? 0 : borderWidth Behavior on color { PropertyAnimation { duration: 200 } } + + Rectangle { + visible: root.squareLeftSide + + z: 1 + + width: parent.radius + height: parent.radius + anchors.top: parent.top + anchors.bottom: parent.bottom + anchors.left: parent.left + color: { + if (root.enabled) { + if (root.pressed) { + return pressedColor + } + return root.hovered ? hoveredColor : defaultColor + } else { + return disabledColor + } + } + + Behavior on color { + PropertyAnimation { duration: 200 } + } + } } } MouseArea { - anchors.fill: background + anchors.fill: background_border enabled: false cursorShape: Qt.PointingHandCursor } contentItem: Item { - anchors.fill: background + anchors.fill: background_border implicitWidth: content.implicitWidth implicitHeight: content.implicitHeight + RowLayout { id: content anchors.centerIn: parent @@ -114,4 +133,22 @@ Button { } } } + + Keys.onEnterPressed: { + if (root.clickedFunc && typeof root.clickedFunc === "function") { + root.clickedFunc() + } + } + + Keys.onReturnPressed: { + if (root.clickedFunc && typeof root.clickedFunc === "function") { + root.clickedFunc() + } + } + + onClicked: { + if (root.clickedFunc && typeof root.clickedFunc === "function") { + root.clickedFunc() + } + } } diff --git a/client/ui/qml/Controls2/PageType.qml b/client/ui/qml/Controls2/PageType.qml index 2c176b40..706a32e1 100644 --- a/client/ui/qml/Controls2/PageType.qml +++ b/client/ui/qml/Controls2/PageType.qml @@ -7,6 +7,8 @@ Item { property StackView stackView: StackView.view + property var defaultActiveFocusItem: null + // MouseArea { // id: globalMouseArea // z: 99 @@ -19,4 +21,17 @@ Item { // mouse.accepted = false // } // } + + // Set a timer to set focus after a short delay + Timer { + id: timer + interval: 100 // Milliseconds + onTriggered: { + if (defaultActiveFocusItem) { + defaultActiveFocusItem.forceActiveFocus() + } + } + repeat: false // Stop the timer after one trigger + running: true // Start the timer + } } diff --git a/client/ui/qml/Controls2/PopupType.qml b/client/ui/qml/Controls2/PopupType.qml index e4d2a449..c85997dc 100644 --- a/client/ui/qml/Controls2/PopupType.qml +++ b/client/ui/qml/Controls2/PopupType.qml @@ -66,7 +66,7 @@ Popup { borderWidth: 0 text: qsTr("Close") - onClicked: { + clickedFunc: function() { root.close() } } diff --git a/client/ui/qml/Controls2/TextFieldWithHeaderType.qml b/client/ui/qml/Controls2/TextFieldWithHeaderType.qml index ac0473cf..13405e4b 100644 --- a/client/ui/qml/Controls2/TextFieldWithHeaderType.qml +++ b/client/ui/qml/Controls2/TextFieldWithHeaderType.qml @@ -69,6 +69,7 @@ Item { TextField { id: textField + activeFocusOnTab: false enabled: root.textFieldEditable color: root.enabled ? root.textFieldTextColor : root.textFieldTextDisabledColor @@ -142,7 +143,7 @@ Item { Layout.preferredWidth: content.implicitHeight squareLeftSide: true - onClicked: { + clickedFunc: function() { if (root.clickedFunc && typeof root.clickedFunc === "function") { root.clickedFunc() } @@ -186,4 +187,12 @@ Item { function getBackgroundBorderColor(noneFocusedColor) { return textField.focus ? root.borderFocusedColor : noneFocusedColor } + + Keys.onEnterPressed: { + KeyNavigation.tab.forceActiveFocus(); + } + + Keys.onReturnPressed: { + KeyNavigation.tab.forceActiveFocus(); + } } diff --git a/client/ui/qml/Pages2/PageProtocolAwgSettings.qml b/client/ui/qml/Pages2/PageProtocolAwgSettings.qml index 4fb472a0..8b7dcdff 100644 --- a/client/ui/qml/Pages2/PageProtocolAwgSettings.qml +++ b/client/ui/qml/Pages2/PageProtocolAwgSettings.qml @@ -12,9 +12,12 @@ import "../Controls2/TextTypes" import "../Config" import "../Components" + PageType { id: root + defaultActiveFocusItem: listview.currentItem.portTextField.textField + ColumnLayout { id: backButton @@ -44,6 +47,8 @@ PageType { enabled: ServersModel.isCurrentlyProcessedServerHasWriteAccess() ListView { + + id: listview width: parent.width @@ -55,9 +60,13 @@ PageType { model: AwgConfigModel delegate: Item { + id: _delegate + implicitWidth: listview.width implicitHeight: col.implicitHeight + property alias portTextField:portTextField + ColumnLayout { id: col @@ -93,6 +102,8 @@ PageType { } checkEmptyText: true + + KeyNavigation.tab: junkPacketCountTextField.textField } TextFieldWithHeaderType { @@ -116,6 +127,8 @@ PageType { } checkEmptyText: true + + KeyNavigation.tab: junkPacketMinSizeTextField.textField } TextFieldWithHeaderType { @@ -134,6 +147,8 @@ PageType { } checkEmptyText: true + + KeyNavigation.tab: junkPacketMaxSizeTextField.textField } TextFieldWithHeaderType { @@ -152,6 +167,8 @@ PageType { } checkEmptyText: true + + KeyNavigation.tab: initPacketJunkSizeTextField.textField } TextFieldWithHeaderType { @@ -170,6 +187,8 @@ PageType { } checkEmptyText: true + + KeyNavigation.tab: responsePacketJunkSizeTextField.textField } TextFieldWithHeaderType { @@ -188,6 +207,8 @@ PageType { } checkEmptyText: true + + KeyNavigation.tab: initPacketMagicHeaderTextField.textField } TextFieldWithHeaderType { @@ -206,6 +227,8 @@ PageType { } checkEmptyText: true + + KeyNavigation.tab: responsePacketMagicHeaderTextField.textField } TextFieldWithHeaderType { @@ -224,6 +247,8 @@ PageType { } checkEmptyText: true + + KeyNavigation.tab: transportPacketMagicHeaderTextField.textField } TextFieldWithHeaderType { @@ -242,6 +267,8 @@ PageType { } checkEmptyText: true + + KeyNavigation.tab: underloadPacketMagicHeaderTextField.textField } TextFieldWithHeaderType { @@ -260,6 +287,8 @@ PageType { } checkEmptyText: true + + KeyNavigation.tab: saveRestartButton } BasicButtonType { @@ -291,6 +320,8 @@ PageType { } BasicButtonType { + id: saveRestartButton + Layout.fillWidth: true Layout.topMargin: 24 Layout.bottomMargin: 24 @@ -308,7 +339,7 @@ PageType { text: qsTr("Save and Restart Amnezia") - onClicked: { + clickedFunc: function() { forceActiveFocus() PageController.goToPage(PageEnum.PageSetupWizardInstalling); InstallController.updateContainer(AwgConfigModel.getConfig()) @@ -316,6 +347,7 @@ PageType { } } } + } } } diff --git a/client/ui/qml/Pages2/PageProtocolCloakSettings.qml b/client/ui/qml/Pages2/PageProtocolCloakSettings.qml index 7aedd884..1ae59fb3 100644 --- a/client/ui/qml/Pages2/PageProtocolCloakSettings.qml +++ b/client/ui/qml/Pages2/PageProtocolCloakSettings.qml @@ -15,6 +15,8 @@ import "../Components" PageType { id: root + defaultActiveFocusItem: listview.currentItem.trafficFromField.textField + ColumnLayout { id: backButton @@ -58,6 +60,8 @@ PageType { implicitWidth: listview.width implicitHeight: col.implicitHeight + property alias trafficFromField: trafficFromField + ColumnLayout { id: col @@ -77,6 +81,8 @@ PageType { } TextFieldWithHeaderType { + id: trafficFromField + Layout.fillWidth: true Layout.topMargin: 32 @@ -96,9 +102,13 @@ PageType { } } } + + KeyNavigation.tab: portTextField.textField } TextFieldWithHeaderType { + id: portTextField + Layout.fillWidth: true Layout.topMargin: 16 @@ -112,6 +122,8 @@ PageType { port = textFieldText } } + + KeyNavigation.tab: saveRestartButton } DropDownType { @@ -156,13 +168,15 @@ PageType { } BasicButtonType { + id: saveRestartButton + Layout.fillWidth: true Layout.topMargin: 24 Layout.bottomMargin: 24 text: qsTr("Save and Restart Amnezia") - onClicked: { + clickedFunc: function() { forceActiveFocus() PageController.goToPage(PageEnum.PageSetupWizardInstalling); InstallController.updateContainer(CloakConfigModel.getConfig()) diff --git a/client/ui/qml/Pages2/PageProtocolOpenVpnSettings.qml b/client/ui/qml/Pages2/PageProtocolOpenVpnSettings.qml index b662a46d..7e8af1e1 100644 --- a/client/ui/qml/Pages2/PageProtocolOpenVpnSettings.qml +++ b/client/ui/qml/Pages2/PageProtocolOpenVpnSettings.qml @@ -16,6 +16,8 @@ import "../Components" PageType { id: root + defaultActiveFocusItem: listview.currentItem.vpnAddressSubnetTextField.textField + ColumnLayout { id: backButton @@ -53,12 +55,14 @@ PageType { clip: true interactive: false - model: OpenVpnConfigModel + model: OpenVpnConfigModel delegate: Item { implicitWidth: listview.width implicitHeight: col.implicitHeight + property alias vpnAddressSubnetTextField: vpnAddressSubnetTextField + ColumnLayout { id: col @@ -78,6 +82,8 @@ PageType { } TextFieldWithHeaderType { + id: vpnAddressSubnetTextField + Layout.fillWidth: true Layout.topMargin: 32 @@ -89,6 +95,8 @@ PageType { subnetAddress = textFieldText } } + + KeyNavigation.tab: portTextField.enabled ? portTextField.textField : saveRestartButton } ParagraphTextType { @@ -119,6 +127,9 @@ PageType { } TextFieldWithHeaderType { + id: portTextField + + Layout.fillWidth: true Layout.topMargin: 40 @@ -134,6 +145,8 @@ PageType { port = textFieldText } } + + KeyNavigation.tab: saveRestartButton } SwitcherType { @@ -367,7 +380,7 @@ PageType { text: qsTr("Remove OpenVPN") - onClicked: { + clickedFunc: function() { var headerText = qsTr("Remove OpenVpn from server?") var descriptionText = qsTr("All users with whom you shared a connection will no longer be able to connect to it.") var yesButtonText = qsTr("Continue") @@ -385,13 +398,15 @@ PageType { } BasicButtonType { + id: saveRestartButton + Layout.fillWidth: true Layout.topMargin: 24 Layout.bottomMargin: 24 text: qsTr("Save and Restart Amnezia") - onClicked: { + clickedFunc: function() { forceActiveFocus() PageController.goToPage(PageEnum.PageSetupWizardInstalling); InstallController.updateContainer(OpenVpnConfigModel.getConfig()) diff --git a/client/ui/qml/Pages2/PageProtocolShadowSocksSettings.qml b/client/ui/qml/Pages2/PageProtocolShadowSocksSettings.qml index 18c64e76..7bb4455b 100644 --- a/client/ui/qml/Pages2/PageProtocolShadowSocksSettings.qml +++ b/client/ui/qml/Pages2/PageProtocolShadowSocksSettings.qml @@ -15,6 +15,8 @@ import "../Components" PageType { id: root + defaultActiveFocusItem: listview.currentItem.portTextField.textField + ColumnLayout { id: backButton @@ -58,6 +60,8 @@ PageType { implicitWidth: listview.width implicitHeight: col.implicitHeight + property alias portTextField: portTextField + ColumnLayout { id: col @@ -77,6 +81,8 @@ PageType { } TextFieldWithHeaderType { + id: portTextField + Layout.fillWidth: true Layout.topMargin: 40 @@ -90,6 +96,8 @@ PageType { port = textFieldText } } + + KeyNavigation.tab: saveRestartButton } DropDownType { @@ -134,13 +142,15 @@ PageType { } BasicButtonType { + id: saveRestartButton + Layout.fillWidth: true Layout.topMargin: 24 Layout.bottomMargin: 24 text: qsTr("Save and Restart Amnezia") - onClicked: { + clickedFunc: function() { forceActiveFocus() PageController.goToPage(PageEnum.PageSetupWizardInstalling); InstallController.updateContainer(ShadowSocksConfigModel.getConfig()) diff --git a/client/ui/qml/Pages2/PageServiceSftpSettings.qml b/client/ui/qml/Pages2/PageServiceSftpSettings.qml index 1015be55..3a58553e 100644 --- a/client/ui/qml/Pages2/PageServiceSftpSettings.qml +++ b/client/ui/qml/Pages2/PageServiceSftpSettings.qml @@ -170,7 +170,7 @@ PageType { text: qsTr("Mount folder on device") - onClicked: { + clickedFunc: function() { PageController.showBusyIndicator(true) InstallController.mountSftpDrive(port, password, username) PageController.showBusyIndicator(false) @@ -229,7 +229,7 @@ PageType { text: qsTr("Detailed instructions") - onClicked: { + clickedFunc: function() { // Qt.openUrlExternally("https://github.com/amnezia-vpn/desktop-client/releases/latest") } } @@ -247,7 +247,7 @@ PageType { text: qsTr("Remove SFTP and all data stored there") - onClicked: { + clickedFunc: function() { var headerText = qsTr("Remove SFTP and all data stored there?") var yesButtonText = qsTr("Continue") var noButtonText = qsTr("Cancel") diff --git a/client/ui/qml/Pages2/PageServiceTorWebsiteSettings.qml b/client/ui/qml/Pages2/PageServiceTorWebsiteSettings.qml index 0d18425f..002e0310 100644 --- a/client/ui/qml/Pages2/PageServiceTorWebsiteSettings.qml +++ b/client/ui/qml/Pages2/PageServiceTorWebsiteSettings.qml @@ -125,7 +125,7 @@ PageType { text: qsTr("Remove website") - onClicked: { + clickedFunc: function() { var headerText = qsTr("The site with all data will be removed from the tor network.") var yesButtonText = qsTr("Continue") var noButtonText = qsTr("Cancel") diff --git a/client/ui/qml/Pages2/PageSettingsAbout.qml b/client/ui/qml/Pages2/PageSettingsAbout.qml index f8128507..b20c7440 100644 --- a/client/ui/qml/Pages2/PageSettingsAbout.qml +++ b/client/ui/qml/Pages2/PageSettingsAbout.qml @@ -81,7 +81,7 @@ PageType { text: qsTr("Card on Patreon") - onClicked: function() { + clickedFunc: function() { Qt.openUrlExternally(qsTr("https://www.patreon.com/amneziavpn")) } } @@ -101,7 +101,9 @@ PageType { text: qsTr("Show other methods on Github") - onClicked: Qt.openUrlExternally(qsTr("https://github.com/amnezia-vpn/amnezia-client#donate")) + clickedFunc: function() { + Qt.openUrlExternally(qsTr("https://github.com/amnezia-vpn/amnezia-client#donate")) + } } ParagraphTextType { @@ -191,7 +193,7 @@ PageType { text: qsTr("Check for updates") - onClicked: { + clickedFunc: function() { Qt.openUrlExternally("https://github.com/amnezia-vpn/desktop-client/releases/latest") } } diff --git a/client/ui/qml/Pages2/PageSettingsBackup.qml b/client/ui/qml/Pages2/PageSettingsBackup.qml index b3308d54..6b3b3fb5 100644 --- a/client/ui/qml/Pages2/PageSettingsBackup.qml +++ b/client/ui/qml/Pages2/PageSettingsBackup.qml @@ -88,7 +88,7 @@ PageType { text: qsTr("Make a backup") - onClicked: { + clickedFunc: function() { var fileName = "" if (GC.isMobile()) { fileName = "AmneziaVPN.backup" @@ -121,7 +121,7 @@ PageType { text: qsTr("Restore from backup") - onClicked: { + clickedFunc: function() { var filePath = SystemController.getFileName(qsTr("Open backup file"), qsTr("Backup files (*.backup)")) if (filePath !== "") { diff --git a/client/ui/qml/Pages2/PageSettingsDns.qml b/client/ui/qml/Pages2/PageSettingsDns.qml index 2f138060..f5aec54e 100644 --- a/client/ui/qml/Pages2/PageSettingsDns.qml +++ b/client/ui/qml/Pages2/PageSettingsDns.qml @@ -13,6 +13,8 @@ import "../Components" PageType { id: root + defaultActiveFocusItem: primaryDns.textField + BackButtonType { id: backButton @@ -68,6 +70,8 @@ PageType { textField.validator: RegularExpressionValidator { regularExpression: InstallController.ipAddressRegExp() } + + KeyNavigation.tab: secondaryDns.textField } TextFieldWithHeaderType { @@ -80,6 +84,8 @@ PageType { textField.validator: RegularExpressionValidator { regularExpression: InstallController.ipAddressRegExp() } + + KeyNavigation.tab: saveButton } BasicButtonType { @@ -94,7 +100,7 @@ PageType { text: qsTr("Restore default") - onClicked: function() { + clickedFunc: function() { var headerText = qsTr("Restore default DNS settings?") var yesButtonText = qsTr("Continue") var noButtonText = qsTr("Cancel") @@ -114,11 +120,13 @@ PageType { } BasicButtonType { + id: saveButton + Layout.fillWidth: true text: qsTr("Save") - onClicked: function() { + clickedFunc: function() { if (primaryDns.textFieldText !== SettingsController.primaryDns) { SettingsController.primaryDns = primaryDns.textFieldText } @@ -130,4 +138,5 @@ PageType { } } } + } diff --git a/client/ui/qml/Pages2/PageSettingsServerInfo.qml b/client/ui/qml/Pages2/PageSettingsServerInfo.qml index 750aaddf..5e2f8b12 100644 --- a/client/ui/qml/Pages2/PageSettingsServerInfo.qml +++ b/client/ui/qml/Pages2/PageSettingsServerInfo.qml @@ -106,14 +106,18 @@ PageType { textFieldText: name textField.maximumLength: 30 checkEmptyText: true + + KeyNavigation.tab: saveButton } BasicButtonType { + id: saveButton + Layout.fillWidth: true text: qsTr("Save") - onClicked: { + clickedFunc: function() { if (serverName.textFieldText === "") { return } @@ -124,6 +128,12 @@ PageType { serverNameEditDrawer.close() } } + + Component.onCompleted: { + if (header.itemAt(0)) { + defaultActiveFocusItem = serverName.textField + } + } } } } diff --git a/client/ui/qml/Pages2/PageSettingsSplitTunneling.qml b/client/ui/qml/Pages2/PageSettingsSplitTunneling.qml index ba31522c..9916609b 100644 --- a/client/ui/qml/Pages2/PageSettingsSplitTunneling.qml +++ b/client/ui/qml/Pages2/PageSettingsSplitTunneling.qml @@ -20,6 +20,8 @@ import "../Components" PageType { id: root + defaultActiveFocusItem: website_ip_field.textField + property bool pageEnabled: { return !ConnectionController.isConnected && !ServersModel.isDefaultServerFromApi() } @@ -245,6 +247,8 @@ PageType { anchors.bottomMargin: 24 TextFieldWithHeaderType { + id: website_ip_field + Layout.fillWidth: true textFieldPlaceholderText: qsTr("website or IP") diff --git a/client/ui/qml/Pages2/PageSetupWizardCredentials.qml b/client/ui/qml/Pages2/PageSetupWizardCredentials.qml index 60ff9baa..c256f3a4 100644 --- a/client/ui/qml/Pages2/PageSetupWizardCredentials.qml +++ b/client/ui/qml/Pages2/PageSetupWizardCredentials.qml @@ -12,6 +12,8 @@ import "../Controls2/TextTypes" PageType { id: root + defaultActiveFocusItem: hostname.textField + BackButtonType { id: backButton @@ -57,6 +59,8 @@ PageType { onFocusChanged: { textField.text = textField.text.replace(/^\s+|\s+$/g, ''); } + + KeyNavigation.tab: username.textField } TextFieldWithHeaderType { @@ -65,6 +69,8 @@ PageType { Layout.fillWidth: true headerText: qsTr("Login to connect via SSH") textFieldPlaceholderText: "root" + + KeyNavigation.tab: secretData.textField } TextFieldWithHeaderType { @@ -85,15 +91,19 @@ PageType { onFocusChanged: { textField.text = textField.text.replace(/^\s+|\s+$/g, ''); } + + KeyNavigation.tab: continueButton } BasicButtonType { + id: continueButton + Layout.fillWidth: true Layout.topMargin: 24 text: qsTr("Continue") - onClicked: function() { + clickedFunc: function() { forceActiveFocus() if (!isCredentialsFilled()) { return diff --git a/client/ui/qml/Pages2/PageSetupWizardEasy.qml b/client/ui/qml/Pages2/PageSetupWizardEasy.qml index 8268e55d..69109a85 100644 --- a/client/ui/qml/Pages2/PageSetupWizardEasy.qml +++ b/client/ui/qml/Pages2/PageSetupWizardEasy.qml @@ -158,7 +158,7 @@ PageType { text: qsTr("Continue") - onClicked: function() { + clickedFunc: function() { if (root.isEasySetup) { ContainersModel.setCurrentlyProcessedContainerIndex(containers.dockerContainer) PageController.goToPage(PageEnum.PageSetupWizardInstalling) @@ -197,7 +197,7 @@ PageType { text: qsTr("Set up later") - onClicked: function() { + clickedFunc: function() { PageController.goToPage(PageEnum.PageSetupWizardInstalling) InstallController.addEmptyServer() } diff --git a/client/ui/qml/Pages2/PageSetupWizardInstalling.qml b/client/ui/qml/Pages2/PageSetupWizardInstalling.qml index 1ad3d95d..7c8a7718 100644 --- a/client/ui/qml/Pages2/PageSetupWizardInstalling.qml +++ b/client/ui/qml/Pages2/PageSetupWizardInstalling.qml @@ -165,7 +165,7 @@ PageType { text: qsTr("Cancel installation") - onClicked: { + clickedFunc: function() { InstallController.cancelInstallation() PageController.showBusyIndicator(true) } diff --git a/client/ui/qml/Pages2/PageSetupWizardProtocolSettings.qml b/client/ui/qml/Pages2/PageSetupWizardProtocolSettings.qml index 01aa0292..02e4ee6c 100644 --- a/client/ui/qml/Pages2/PageSetupWizardProtocolSettings.qml +++ b/client/ui/qml/Pages2/PageSetupWizardProtocolSettings.qml @@ -52,6 +52,8 @@ PageType { implicitWidth: processedContainerListView.width implicitHeight: (delegateContent.implicitHeight > root.height) ? delegateContent.implicitHeight : root.height + property alias port:port + ColumnLayout { id: delegateContent @@ -92,7 +94,7 @@ PageType { text: qsTr("More detailed") - onClicked: { + clickedFunc: function() { showDetailsDrawer.open() } } @@ -168,7 +170,7 @@ PageType { text: qsTr("Close") - onClicked: function() { + clickedFunc: function() { showDetailsDrawer.close() } } @@ -201,6 +203,8 @@ PageType { headerText: qsTr("Port") textField.maximumLength: 5 textField.validator: IntValidator { bottom: 1; top: 65535 } + + KeyNavigation.tab: installButton } Rectangle { @@ -216,7 +220,7 @@ PageType { text: qsTr("Install") - onClicked: function() { + clickedFunc: function() { PageController.goToPage(PageEnum.PageSetupWizardInstalling); InstallController.install(dockerContainer, port.textFieldText, transportProtoSelector.currentIndex) } @@ -236,6 +240,8 @@ PageType { var protocolSelectorVisible = ProtocolProps.defaultTransportProtoChangeable(defaultContainerProto) transportProtoSelector.visible = protocolSelectorVisible transportProtoHeader.visible = protocolSelectorVisible + + defaultActiveFocusItem = port.textField } } } diff --git a/client/ui/qml/Pages2/PageSetupWizardStart.qml b/client/ui/qml/Pages2/PageSetupWizardStart.qml index da722be1..161b85da 100644 --- a/client/ui/qml/Pages2/PageSetupWizardStart.qml +++ b/client/ui/qml/Pages2/PageSetupWizardStart.qml @@ -115,7 +115,7 @@ PageType { text: qsTr("I have the data to connect") - onClicked: { + clickedFunc: function() { connectionTypeSelection.open() } } @@ -135,7 +135,9 @@ PageType { text: qsTr("I have nothing") - onClicked: Qt.openUrlExternally(qsTr("https://amnezia.org/instructions/0_starter-guide")) + clickedFunc: function() { + Qt.openUrlExternally(qsTr("https://amnezia.org/instructions/0_starter-guide")) + } } } } diff --git a/client/ui/qml/Pages2/PageSetupWizardTextKey.qml b/client/ui/qml/Pages2/PageSetupWizardTextKey.qml index 4cdfc444..4a322042 100644 --- a/client/ui/qml/Pages2/PageSetupWizardTextKey.qml +++ b/client/ui/qml/Pages2/PageSetupWizardTextKey.qml @@ -12,6 +12,8 @@ import "../Config" PageType { id: root + defaultActiveFocusItem: textKey.textField + FlickableType { id: fl anchors.top: parent.top @@ -56,11 +58,15 @@ PageType { textField.text = "" textField.paste() } + + KeyNavigation.tab: continueButton } } } BasicButtonType { + id: continueButton + anchors.bottom: parent.bottom anchors.left: parent.left anchors.right: parent.right @@ -70,7 +76,7 @@ PageType { text: qsTr("Continue") - onClicked: function() { + clickedFunc: function() { ImportController.extractConfigFromCode(textKey.textFieldText) PageController.goToPage(PageEnum.PageSetupWizardViewConfig) } diff --git a/client/ui/qml/Pages2/PageSetupWizardViewConfig.qml b/client/ui/qml/Pages2/PageSetupWizardViewConfig.qml index 79b51bdb..8a8a3e77 100644 --- a/client/ui/qml/Pages2/PageSetupWizardViewConfig.qml +++ b/client/ui/qml/Pages2/PageSetupWizardViewConfig.qml @@ -109,7 +109,7 @@ PageType { text: showContent ? qsTr("Collapse content") : qsTr("Show content") - onClicked: { + clickedFunc: function() { showContent = !showContent } } @@ -151,7 +151,7 @@ PageType { Layout.bottomMargin: 32 text: qsTr("Connect") - onClicked: { + clickedFunc: function() { ImportController.importConfig() } } diff --git a/client/ui/qml/Pages2/PageShare.qml b/client/ui/qml/Pages2/PageShare.qml index dc37c3f8..477cefe1 100644 --- a/client/ui/qml/Pages2/PageShare.qml +++ b/client/ui/qml/Pages2/PageShare.qml @@ -16,6 +16,8 @@ import "../Components" PageType { id: root + defaultActiveFocusItem: clientNameTextField.textField + enum ConfigType { AmneziaConnection, OpenVpn, @@ -122,7 +124,7 @@ PageType { FlickableType { anchors.top: parent.top anchors.bottom: parent.bottom - contentHeight: content.height + contentHeight: content.height + 10 ColumnLayout { id: content @@ -258,6 +260,8 @@ PageType { textField.maximumLength: 20 checkEmptyText: true + + KeyNavigation.tab: shareButton } DropDownType { @@ -454,6 +458,8 @@ PageType { } BasicButtonType { + id: shareButton + Layout.fillWidth: true Layout.topMargin: 40 @@ -463,7 +469,7 @@ PageType { text: qsTr("Share") imageSource: "qrc:/images/controls/share-2.svg" - onClicked: { + clickedFunc: function(){ if (clientNameTextField.textFieldText !== "") { ExportController.generateConfig(root.connectionTypesModel[exportTypeSelector.currentIndex].type) } @@ -593,7 +599,7 @@ PageType { text: qsTr("Rename") - onClicked: function() { + clickedFunc: function() { clientNameEditDrawer.open() } @@ -627,14 +633,18 @@ PageType { textFieldText: clientName textField.maximumLength: 20 checkEmptyText: true + + KeyNavigation.tab: saveButton } BasicButtonType { + id: saveButton + Layout.fillWidth: true text: qsTr("Save") - onClicked: { + clickedFunc: function() { if (clientNameEditor.textFieldText === "") { return } @@ -666,7 +676,7 @@ PageType { text: qsTr("Revoke") - onClicked: function() { + clickedFunc: function() { var headerText = qsTr("Revoke the config for a user - %1?").arg(clientName) var descriptionText = qsTr("The user will no longer be able to connect to your server.") var yesButtonText = qsTr("Continue") diff --git a/client/ui/qml/Pages2/PageShareFullAccess.qml b/client/ui/qml/Pages2/PageShareFullAccess.qml index f4490a91..03097819 100644 --- a/client/ui/qml/Pages2/PageShareFullAccess.qml +++ b/client/ui/qml/Pages2/PageShareFullAccess.qml @@ -123,7 +123,7 @@ PageType { text: qsTr("Share") imageSource: "qrc:/images/controls/share-2.svg" - onClicked: function() { + clickedFunc: function() { shareConnectionDrawer.headerText = qsTr("Connection to ") + serverSelector.text shareConnectionDrawer.configContentHeaderText = qsTr("File with connection settings to ") + serverSelector.text diff --git a/client/ui/qml/Pages2/PageStart.qml b/client/ui/qml/Pages2/PageStart.qml index a6b79bfa..93bfd79e 100644 --- a/client/ui/qml/Pages2/PageStart.qml +++ b/client/ui/qml/Pages2/PageStart.qml @@ -53,6 +53,7 @@ PageType { function onGoToPage(page, slide) { var pagePath = PageController.getPagePath(page) + if (slide) { tabBarStackView.push(pagePath, { "objectName" : pagePath }, StackView.PushTransition) } else { diff --git a/client/ui/qml/main2.qml b/client/ui/qml/main2.qml index a10c1d13..bfecf46b 100644 --- a/client/ui/qml/main2.qml +++ b/client/ui/qml/main2.qml @@ -178,9 +178,13 @@ Window { clickedFunc: function() { hidePassword = !hidePassword } + + KeyNavigation.tab: saveButton } BasicButtonType { + id: saveButton + Layout.fillWidth: true defaultColor: "transparent" @@ -192,7 +196,7 @@ Window { text: qsTr("Save") - onClicked: { + clickedFunc: function() { privateKeyPassphraseDrawer.close() PageController.passphraseRequestDrawerClosed(passphrase.textFieldText) } From 86c31c3766dd31e149c1c60734c4ee5be5b1b9a7 Mon Sep 17 00:00:00 2001 From: "vladimir.kuznetsov" Date: Sun, 18 Feb 2024 13:24:21 +0500 Subject: [PATCH 16/36] show installed protocols first in services tab and page home containers listview --- client/ui/qml/Pages2/PageHome.qml | 3 +++ client/ui/qml/Pages2/PageSettingsServerServices.qml | 3 +++ 2 files changed, 6 insertions(+) diff --git a/client/ui/qml/Pages2/PageHome.qml b/client/ui/qml/Pages2/PageHome.qml index 79906883..10243369 100644 --- a/client/ui/qml/Pages2/PageHome.qml +++ b/client/ui/qml/Pages2/PageHome.qml @@ -213,6 +213,9 @@ PageType { model: SortFilterProxyModel { id: proxyContainersModel sourceModel: ContainersModel + sorters: [ + RoleSorter { roleName: "isInstalled"; sortOrder: Qt.DescendingOrder } + ] } Component.onCompleted: updateContainersModelFilters() diff --git a/client/ui/qml/Pages2/PageSettingsServerServices.qml b/client/ui/qml/Pages2/PageSettingsServerServices.qml index 4f832651..94fd4f94 100644 --- a/client/ui/qml/Pages2/PageSettingsServerServices.qml +++ b/client/ui/qml/Pages2/PageSettingsServerServices.qml @@ -55,6 +55,9 @@ PageType { model: SortFilterProxyModel { id: proxyContainersModel sourceModel: ContainersModel + sorters: [ + RoleSorter { roleName: "isInstalled"; sortOrder: Qt.DescendingOrder } + ] } Component.onCompleted: updateContainersModelFilters() From a98cd248d6d3ca7458d665d3ba35091a7eea97d9 Mon Sep 17 00:00:00 2001 From: "vladimir.kuznetsov" Date: Mon, 19 Feb 2024 09:31:31 +0500 Subject: [PATCH 17/36] returned translation files to commit fab167bb34a9f7199359e3d8589a1cd1ac2cfff5 --- client/translations/amneziavpn_ar.ts | 473 ++--- client/translations/amneziavpn_fa_IR.ts | 2457 +++++++++++++---------- client/translations/amneziavpn_ru.ts | 2322 +++++++++++---------- client/translations/amneziavpn_zh_CN.ts | 2418 ++++++++++++---------- 4 files changed, 4299 insertions(+), 3371 deletions(-) diff --git a/client/translations/amneziavpn_ar.ts b/client/translations/amneziavpn_ar.ts index 4214ffa8..2632e07d 100644 --- a/client/translations/amneziavpn_ar.ts +++ b/client/translations/amneziavpn_ar.ts @@ -51,17 +51,17 @@ ConnectionTypeSelectionDrawer - + Add new connection إضافة اتصال جديد - + Configure your server قم بتهيئة الخادم الخاص بك - + Open config file, key or QR code افتح ملف تعريف, مفتاح تعريف او رمز QR @@ -100,12 +100,12 @@ HomeContainersListView - + Unable change protocol while there is an active connection قم بتغيير البروتوكول عند تواجد اتصال - + The selected protocol is not supported on the current platform البروتوكول المحدد غير مدعوم علي المنصة الحالية @@ -270,17 +270,17 @@ Already installed containers were found on the server. All installed containers PageHome - + VPN protocol بروتوكول VPN - + Servers الخوادم - + Unable change server while there is an active connection لا يمكن تغير الخادم بينما هناك اتصال مفعل @@ -288,87 +288,87 @@ Already installed containers were found on the server. All installed containers PageProtocolAwgSettings - + AmneziaWG settings اعدادات AmneziaWG - + Port منفذ - + Junk packet count عدد الحزم الغير مرغوب فيها - + Junk packet minimum size الحد الادني لحجم الحزمة الغير مرغوب فيها - + Junk packet maximum size الحجم الاقصي للحزمة الغير مرغوب فيها - + Init packet junk size Init packet junk size - + Response packet junk size حجم حزمة الاستجابة الغير مرغوب فيها - + Init packet magic header إطلاق حزمة magic header - + Response packet magic header حزمة الرد magic header - + Transport packet magic header نقل حزمة magic header - + Underload packet magic header تحميل حزمة magic header - + Remove AmneziaWG قم بحذف AmneziaWG - + Remove AmneziaWG from server? قم بحذف AmneziaWG من الخادم؟ - + All users with whom you shared a connection will no longer be able to connect to it. جميع المستخدمين الذين قمت بمشاركة اتصال معهم لن يستطيعو الاتصال. - + Continue واصل - + Cancel إلغاء - + Save and Restart Amnezia احفظ و اعِد تشغيل Amnezia @@ -376,28 +376,28 @@ Already installed containers were found on the server. All installed containers PageProtocolCloakSettings - + Cloak settings Cloak إعدادات - + Disguised as traffic from متنكراً في حركة مرور من - + Port منفذ - - + + Cipher الشفرة - + Save and Restart Amnezia احفظ و اعِد تشغيل Amnezia @@ -405,180 +405,180 @@ Already installed containers were found on the server. All installed containers PageProtocolOpenVpnSettings - + OpenVPN settings OpenVPN اعدادات - + VPN address subnet الشبكة الفرعية لعنوان VPN - + Network protocol بروتوكول الشبكة - + Port منفذ - + Auto-negotiate encryption التفاوض التلقائي علي الشبكة - - + + Hash - + SHA512 - + SHA384 - + SHA256 - + SHA3-512 - + SHA3-384 - + SHA3-256 - + whirlpool - + BLAKE2b512 - + BLAKE2s256 - + SHA1 - - + + Cipher شفرة - + AES-256-GCM - + AES-192-GCM - + AES-128-GCM - + AES-256-CBC - + AES-192-CBC - + AES-128-CBC - + ChaCha20-Poly1305 - + ARIA-256-CBC - + CAMELLIA-256-CBC - + none لا شئ - + TLS auth TLS مصادقة - + Block DNS requests outside of VPN احظر طلبات DNS خارج ال VPN - + Additional client configuration commands اوامر تكوين العميل الاضافية - - + + Commands: الاوامر: - + Additional server configuration commands اوامر تكوين الخادم الاضافية - + Remove OpenVPN احذف OpenVPN - + Remove OpenVpn from server? احذف OpenVPN من الخادم? - + All users with whom you shared a connection will no longer be able to connect to it. جميع المستخدمين الذين شاركت معهم الاتصال لن يستطيعو الاتصال مجدداً. @@ -587,17 +587,17 @@ Already installed containers were found on the server. All installed containers جميع المستخدمين الذين شاركت اتصال معهم لن يستطيعو الاتصال بعد الان - + Continue واصل - + Cancel إلغاء - + Save and Restart Amnezia احفظ واعِد تشغيل Amnezia @@ -619,22 +619,22 @@ Already installed containers were found on the server. All installed containers اختيارات الاتصال - + Connection options %1 %1 اختيارات الاتصال - + Remove احذف - + Remove %1 from server? احذف %1 من الخادم ? - + All users with whom you shared a connection will no longer be able to connect to it. جميع المستخدمين الذين شاركت معهم اتصال لن يستطيعو الاتصال بعد الان. @@ -647,12 +647,12 @@ Already installed containers were found on the server. All installed containers جميع المستخدمين الذين شاركت اتصال معهم لن يستطيعو الاتصال بعد الان - + Continue واصل - + Cancel إلغاء @@ -660,23 +660,23 @@ Already installed containers were found on the server. All installed containers PageProtocolShadowSocksSettings - + ShadowSocks settings ShadowSocks إعدادات - + Port منفذ - - + + Cipher تشفير - + Save and Restart Amnezia احفظ واعِد تشغيل Amnezia @@ -943,62 +943,62 @@ And if you don't like the app, all the more support it - the donation will اظهر المزيد علي GitHub - + https://github.com/amnezia-vpn/amnezia-client#donate - + Contacts التواصل - + Telegram group مجموعة ال Telegram - + To discuss features لمناقشة الميزات - + https://t.me/amnezia_vpn_en - + Mail البريد - + For reviews and bug reports لل مراجعات والابلاغات عن المشاكل - + Github - + https://github.com/amnezia-vpn/amnezia-client - + Website موقع - + https://amnezia.org - + Check for updates تحقق من وجود تحديثات @@ -1049,42 +1049,42 @@ And if you don't like the app, all the more support it - the donation will اللغة - + Logging تسجيل - + Enabled مٌفعل - + Disabled مٌعطل - + Reset settings and remove all data from the application إعادة ضبط الاعدادات ومسح جميع البيانات من التطبيق - + Reset settings and remove all data from the application? إعادة ضبط الاعدادات ومسح جميع البيانات من التطبيق؟ - + All settings will be reset to default. All installed AmneziaVPN services will still remain on the server. سيتم ضبط الاعدادات الافتراضية. جميع خدمات AmneziaVPN المٌثبتة ستبقي علي الخادم. - + Continue واصل - + Cancel إلغاء @@ -1244,62 +1244,62 @@ And if you don't like the app, all the more support it - the donation will PageSettingsDns - + Default server does not support custom dns الخادم الافتراضي لا يدعم DNS مخصص - + DNS servers خوادم ال DNS - + If AmneziaDNS is not used or installed AmneziaVPN ليس مٌستخدم او مٌثبت - + Primary DNS الرئيسي DNS - + Secondary DNS الثانوي DNS - + Restore default استعادة الافتراضي - + Restore default DNS settings? قم بأعادة ضبط إعدادات ال DNS الافتراضية؟ - + Continue واصل - + Cancel إلغاء - + Settings have been reset لم يتم إعادة ضبط الإعدادات - + Save احفظ - + Settings saved تم حفظ الإعدادات @@ -1357,12 +1357,12 @@ And if you don't like the app, all the more support it - the donation will إلغاء - + Logs have been cleaned up تم مسح السجلات - + Clear logs احذف السجلات @@ -1395,12 +1395,13 @@ And if you don't like the app, all the more support it - the donation will حذف الملفات الشخصية المخزنة مؤقتاً؟ - + Do you want to reboot the server? هل تريد إعادة تشغيل الخادم؟ - + + Do you want to clear server from Amnezia software? هل تريد حذف الخادم من Amnezia? @@ -1411,74 +1412,78 @@ And if you don't like the app, all the more support it - the donation will - - - - + + + + + Continue واصل - - - - + + + + + Cancel إلغاء - + Check the server for previously installed Amnezia services افحص الخادم عن اي خدمات Amnezia مٌثبتة سابقاُ - + Add them to the application if they were not displayed اضفهم إلي التطبيق إذا لم يكونو ظاهرين - + Reboot server إعادة تشغيل الخادم - + The reboot process may take approximately 30 seconds. Are you sure you wish to proceed? عملية إعادة التشغيل قد تستغرق 30 ثانية, هل تريد الاستكمال؟ - + Remove server from application احذف خادم من التطبيق - + Do you want to remove the server from application? هل تريد حذف الخادم من التطبيق؟ - + Reset API config إعادة تكوين API - + Do you want to reset API config? هل تريد إعادة تكوين API? - + All installed AmneziaVPN services will still remain on the server. جميع خدمات AmneziaVPN المٌثبتة ستظل علي الخادم. - + + Clear server from Amnezia software احذف خادم من Amnezia - + + All containers will be deleted on the server. This means that configuration files, keys and certificates will be deleted. سيتم حذف جميع الحاويات, هذا يعني ان جميع ملفات التكوين, شهادات و مفاتيح التعريف سيتم حذفهم. @@ -1486,27 +1491,27 @@ And if you don't like the app, all the more support it - the donation will PageSettingsServerInfo - + Server name اسم الخادم - + Save احفظ - + Protocols البروتوكولات - + Services الخدمات - + Data البيانات @@ -1575,42 +1580,42 @@ And if you don't like the app, all the more support it - the donation will قسم نفق الموقع - + Default server does not support split tunneling function السرفر الافتراضي لا يدعم ميزة تقسيم الانفاق - + Addresses from the list should not be accessed via VPN لا يجب الولوج للعنواين المذكورة هنا من خلال ال VPN - + Split tunneling تقسيم الانفاق - + Mode وضع - + Remove احذف - + Continue واصل - + Cancel إلغاء - + Only the sites listed here will be accessed through the VPN سيتم الولوج للمواقع المذكورة هنا فقط عن طريق ال VPN @@ -1620,50 +1625,50 @@ And if you don't like the app, all the more support it - the donation will موقع او IP - + Import / Export Sites - + Import استرد - + Save site list احفظ قائمة المواقع - + Save sites احفظ المواقع - - - + + + Sites files (*.json) - + Import a list of sites استرد قائمة من المواقع - + Replace site list تبديل قائمة المواقع - - + + Open sites file افتح ملف المواقع - + Add imported sites to existing ones إضافة المواقع المستردة للمواقع الموجودة @@ -1718,57 +1723,57 @@ It's okay as long as it's from someone you trust. PageSetupWizardCredentials - + Configure your server تكوين الخادم الخاص بك - + Server IP address [:port] عنوان خادم IP [:منفذ] - + Login to connect via SSH قم بتسجيل الدخول للأتصال عن طريق SSH - + Continue واصل - + All data you enter will remain strictly confidential and will not be shared or disclosed to the Amnezia or any third parties ستظل جميع البيانات التي تدخلها سرية للغاية ولن تتم مشاركتها أو الكشف عنها ل Amnezia أو أي طرف ثالث - + 255.255.255.255:22 - + Password or SSH private key كلمة مرور او مفتاح SSH خاص - + Ip address cannot be empty لا يمكن لعنوان IP ان يكون فارغ - + Enter the address in the format 255.255.255.255:88 ادخل العنوان في شكل 255.255.255.255:88 - + Login cannot be empty تسجيل دخول لا يمكن ان يكون فارغ - + Password/private key cannot be empty كلمة مرور/مفتاح خاص لأ يمكن ان يكونو فارغين @@ -1796,7 +1801,7 @@ It's okay as long as it's from someone you trust. واصل - + Set up later إعداد في وقت لاحق @@ -1843,32 +1848,32 @@ It's okay as long as it's from someone you trust. PageSetupWizardProtocolSettings - + Installing %1 جاري تثبيت %1 - + More detailed اكثر تفصيلاً - + Close اغلق - + Network protocol بروتوكول شبكة - + Port منفذ - + Install تثبيت @@ -1922,7 +1927,7 @@ It's okay as long as it's from someone you trust. ليس لدي اي شئ - + https://amnezia.org/instructions/0_starter-guide @@ -1930,27 +1935,27 @@ It's okay as long as it's from someone you trust. PageSetupWizardTextKey - + Connection key مفتاح اتصال - + A line that starts with vpn://... سطر يبدأ ب vpn://... - + Key مفتاح - + Insert ادخل - + Continue واصل @@ -2006,53 +2011,53 @@ It's okay as long as it's from someone you trust. احفظ تكوين Cloak - + For the AmneziaVPN app AmneziaVPN من اجل تطبيق - + OpenVpn native format تنسيق OpenVpn الاصلي - + WireGuard native format تنسيق WireGuard الاصلي - + ShadowSocks native format تنسيق ShadowSocks الاصلي - + Cloak native format تنسيق Cloak الاصلي - + Share VPN Access شارك اتصال VPN - + Share full access to the server and VPN شارك ولوج كامل للخادم و ال VPN - + Use for your own devices, or share with those you trust to manage the server. استخدمه للأجهزة الخاصة بك، أو شاركه مع من تثق بهم لإدارة الخادم. - + Users المستخدمين - + Share VPN access without the ability to manage the server شارك اتصال VPN بدون القدرة علي إدارة الخادم @@ -2062,52 +2067,52 @@ It's okay as long as it's from someone you trust. ابحث - + Creation date: تاريخ الإنشاء: - + Rename إعادة التسمية - + Client name اسم العميل - + Save احفظ - + Revoke سحب وإبطال - + Revoke the config for a user - %1? سحب وإبطال للمستخدم - %1? - + The user will no longer be able to connect to your server. المستخدم لن يكون قادر علي الاتصال بعد الان. - + Continue واصل - + Cancel إلغاء - + Connection الاتصال @@ -2120,13 +2125,13 @@ It's okay as long as it's from someone you trust. الخوادم - + Server خادم - + File with connection settings to ملف بإعدادات إلي @@ -2141,28 +2146,28 @@ It's okay as long as it's from someone you trust. بروتوكول - + Connection to اتصال إلي - + Config revoked تم سحب وإبطال التكوين - + User name اسم المستخدم - - + + Connection format تنسيق الاتصال - + Share شارك @@ -2188,33 +2193,33 @@ It's okay as long as it's from someone you trust. إذا شاركت ولوج كامل مع الاشخاص, سيكونو قادرين علي حذف وإضافة بروتوكولات و خدمات إلي الخادم, والذي سيجعل VPN يعمل بشكل غير صحيح لجميع المستخدمين. + - Server خادم - + Accessing التواصل - + File with accessing settings to ملف مع إعدادات الوصول إلي - + Share مشاركة - + Connection to اتصال إلي - + File with connection settings to معلف مع إعدادات الاتصال إلي @@ -2972,7 +2977,7 @@ While it offers a blend of security, stability, and speed, it's essential t SelectLanguageDrawer - + Choose language اختر لغة @@ -3018,35 +3023,33 @@ While it offers a blend of security, stability, and speed, it's essential t ShareConnectionDrawer - + Save AmneziaVPN config احفظ تكوين AmneziaVPN - + Share شارك - + Copy انسخ - - - - + + Copied تم النسخ - + Copy config string انسخ نص التكوين - + Show connection settings اظهر إعدادات الاتصال @@ -3055,7 +3058,7 @@ While it offers a blend of security, stability, and speed, it's essential t 展示内容 - + To read the QR code in the Amnezia app, select "Add server" → "I have data to connect" → "QR code, key or settings file" حتي تقرأ رمز ال QR في تطبيق Amnezia, اختار "إضافة خادم" - "لدي بيانات الاتصال" - "رمز Qr, او مفتاح تعريف او ملف إعدادات" @@ -3139,7 +3142,7 @@ While it offers a blend of security, stability, and speed, it's essential t TextFieldWithHeaderType - + The field can't be empty الحقل لا يمكن ان يكون فارغ @@ -3231,12 +3234,12 @@ While it offers a blend of security, stability, and speed, it's essential t main2 - + Private key passphrase عبارة المرور الخاصة بالمفتاح - + Save احفظ diff --git a/client/translations/amneziavpn_fa_IR.ts b/client/translations/amneziavpn_fa_IR.ts index d941cc8a..488d6564 100644 --- a/client/translations/amneziavpn_fa_IR.ts +++ b/client/translations/amneziavpn_fa_IR.ts @@ -2,68 +2,101 @@ - ConnectionController + AmneziaApplication - - - - - Connect - + Split tunneling for WireGuard is not implemented, the option was disabled + Раздельное туннелирование для "Wireguard" не реализовано,опция отключена - + Split tunneling for %1 is not implemented, the option was disabled + جداسازی ترافیک برای %1 پیاده سازی نشده، این گزینه غیرفعال است + + + + AndroidController + + AmneziaVPN + AmneziaVPN + + + VPN Connected + Refers to the app - which is currently running the background and waiting + وی‎پی‎ان متصل است + + + + ApiController + + + Error when retrieving configuration from cloud server + خطا در حین دریافت پیکربندی از سمت سرور + + + + ConnectionController + + VPN Protocols is not installed. Please install VPN container at first - + پروتکل وی‎پی‎ان نصب نشده است +لطفا کانتینر وی‎پی‎ان را نصب کنید + + + + Connection... + در حال ارتباط... - Connection... - - - - Connected - + متصل - - Reconnection... - - - - - Disconnection... - - - - + Settings updated successfully, Reconnnection... - + تنظیمات به روز رسانی شد +در حال اتصال دوباره... - + Settings updated successfully - + تنظیمات با موفقیت به‎روز‎رسانی شدند + + + + Reconnection... + اتصال دوباره... + + + + + + + Connect + اتصال + + + + Disconnection... + قطع ارتباط... ConnectionTypeSelectionDrawer - + Add new connection - + ایجاد ارتباط جدید - + Configure your server - + تنظیم سرور - + Open config file, key or QR code - + بارگذاری فایل تنظیمات، کلید یا QR Code @@ -71,22 +104,22 @@ C&ut - + &بریدن &Copy - + &کپی &Paste - + &پیوست &SelectAll - + &انتخاب همه @@ -94,28 +127,32 @@ Access error! - + خطای دسترسی! HomeContainersListView - + Unable change protocol while there is an active connection - + امکان تغییر پروتکل در هنگام متصل بودن وجود ندارد - + The selected protocol is not supported on the current platform - + پروتکل انتخاب شده بر روی این پلتفرم پشتیبانی نمی‎‎شود + + + Reconnect via VPN Procotol: + Переподключение через VPN протокол: ImportController - + Scanned %1 of %2. - + ارزیابی %1 از %2. @@ -124,30 +161,32 @@ %1 installed successfully. - + %1 با موفقیت نصب شد %1 is already installed on the server. - + %1 در حال حاضر بر روی سرور نصب شده است Added containers that were already installed on the server - + +کانتینرهایی که بر روی سرور موجود بودند اضافه شدند Already installed containers were found on the server. All installed containers have been added to the application - + +کانتینرهای نصب شده بر روی سرور شناسایی شدند. تمام کانتینترهای نصب شده به نرم افزار اضافه شدند Settings updated successfully - + تنظیمات با موفقیت به‎روز‎رسانی شدند @@ -157,27 +196,27 @@ Already installed containers were found on the server. All installed containers Server '%1' was removed - + سرور %1 حذف شد All containers from server '%1' have been removed - + تمام کانتینترها از سرور %1 حذف شدند %1 has been removed from the server '%2' - + %1 از سرور %2 حذف شد Please login as the user - + لطفا به عنوان کاربر وارد شوید Server added successfully - + سرور با موفقیت اضافه شد @@ -185,17 +224,17 @@ Already installed containers were found on the server. All installed containers Read key failed: %1 - + خواندن کلید انجام نشد: %1 Write key failed: %1 - + نوشتن کلید انجام نشد: %1 Delete key failed: %1 - + حذف کلید انجام نشد: %1 @@ -204,27 +243,27 @@ Already installed containers were found on the server. All installed containers AmneziaVPN - + AmneziaVPN VPN Connected - + وی‎پی‎ان وصل شد VPN Disconnected - + وی‎پی‎ان قطع شد AmneziaVPN notification - + اخطار AmneziaVPN Unsecured network detected: - + شبکه ناامن شناسایی شد: @@ -232,343 +271,355 @@ Already installed containers were found on the server. All installed containers Removing services from %1 - + حذف سرویس‎ها از %1 Usually it takes no more than 5 minutes - + معمولا بیش از 5 دقیقه طول نمی‎کشد PageHome - + VPN protocol - + پروتکل وی‎پی‎ان - + Servers - + سرورها - + Unable change server while there is an active connection - + امکان تغییر سرور در هنگام متصل بودن وجود ندارد PageProtocolAwgSettings - + AmneziaWG settings - + تنظیمات AmneziaWG - + Port - + پورت - + Junk packet count - + تعداد بسته‎های ناخواسته - + Junk packet minimum size - + Junk packet minimum size - + Junk packet maximum size - + Junk packet maximum size - + Init packet junk size - + Init packet junk size - + Response packet junk size - + Response packet junk size - + Init packet magic header - + Init packet magic header - + Response packet magic header - + Response packet magic header - + Transport packet magic header - + Transport packet magic header + + + + Underload packet magic header + Underload packet magic header + + + + Remove AmneziaWG + حذف AmneziaWG + + + + Remove AmneziaWG from server? + آیا میخواهید AmneziaWG از سرور حذف شود؟ - Underload packet magic header - - - - - Remove AmneziaWG - - - - - Remove AmneziaWG from server? - - - - All users with whom you shared a connection will no longer be able to connect to it. - + تمام کاربرانی که این اتصال را با آن‎ها با اشتراک گذاشته‎اید دیگر نمی‎توانند به آن متصل شوند. - + All users who you shared a connection with will no longer be able to connect to it. + Все пользователи, с которыми вы поделились этим VPN-протоколом, больше не смогут к нему подключаться. + + + Continue - + ادامه - + Cancel - + کنسل - + Save and Restart Amnezia - + ذخیره و راه اندازی مجدد Amnezia PageProtocolCloakSettings - + Cloak settings - + تنظیمات Cloak - + Disguised as traffic from - + پنهان کردن به عنوان ترافیک از - + Port - + پورت - - + + Cipher - + رمزگذاری - + Save and Restart Amnezia - + ذخیره و راه اندازی دوباره Amnezia PageProtocolOpenVpnSettings - + OpenVPN settings - + تنظیمات OpenVPN - + VPN Addresses Subnet + آدرس زیرشبکه وی‎پی‎ان + + + VPN address subnet - + Network protocol - + پروتکل شبکه - + Port - + پورت - + Auto-negotiate encryption - + رمزگذاری خودکار + + + + + Hash + هش + + + + SHA512 + SHA512 + + + + SHA384 + SHA384 + + + + SHA256 + SHA256 + + + + SHA3-512 + SHA3-512 - - Hash - - - - - SHA512 - - - - - SHA384 - - - - - SHA256 - - - - - SHA3-512 - - - - SHA3-384 - + SHA3-384 - + SHA3-256 - + SHA3-256 - + whirlpool - + whirlpool - + BLAKE2b512 - + BLAKE2b512 - + BLAKE2s256 - + BLAKE2s256 - + SHA1 - + SHA1 + + + + + Cipher + رمزگذاری + + + + AES-256-GCM + AES-256-GCM + + + + AES-192-GCM + AES-192-GCM + + + + AES-128-GCM + AES-128-GCM + + + + AES-256-CBC + AES-256-CBC + + + + AES-192-CBC + AES-192-CBC + + + + AES-128-CBC + AES-128-CBC - - Cipher - - - - - AES-256-GCM - - - - - AES-192-GCM - - - - - AES-128-GCM - - - - - AES-256-CBC - - - - - AES-192-CBC - - - - - AES-128-CBC - - - - ChaCha20-Poly1305 - + ChaCha20-Poly1305 - + ARIA-256-CBC - + ARIA-256-CBC - + CAMELLIA-256-CBC - + CAMELLIA-256-CBC - + none - + none - + TLS auth - + اعتبار TLS - + Block DNS requests outside of VPN - + مسدود کردن درخواست‎های DNS خارج از وی‎پی‎ان - + Additional client configuration commands - + تنظیمات و دستورات اضافه برنامه متصل شونده - - + + Commands: - + دستورات: - + Additional server configuration commands - + تنظیمات و دستورات اضافه سرور - + Remove OpenVPN - + حذف OpenVPN - + Remove OpenVpn from server? - + آیا میخواهید OpenVPN از سرور حذف شود؟ - + All users with whom you shared a connection will no longer be able to connect to it. - + تمام کاربرانی که این اتصال را با آن‎ها با اشتراک گذاشته‎اید دیگر نمی‎توانند به آن متصل شوند. - + All users who you shared a connection with will no longer be able to connect to it. + Все пользователи, с которыми вы поделились этим VPN-протоколом, больше не смогут к нему подключаться. + + + Continue - + ادامه - + Cancel - + کنسل - + Save and Restart Amnezia - + ذخیره و راه اندازی دوباره Amnezia @@ -576,66 +627,77 @@ Already installed containers were found on the server. All installed containers settings - + تنظیمات Show connection options - + نمایش تنظیمات اتصال - + Connection options %1 - + تنظیمات اتصال %1 + + + + Remove + حذف + + + + Remove %1 from server? + %1 از سرور حذف شود؟ + + + + All users with whom you shared a connection will no longer be able to connect to it. + تمام کاربرانی که این اتصال را با آن‎ها با اشتراک گذاشته‎اید دیگر نمی‎توانند به آن متصل شوند. + + + All users who you shared a connection with will no longer be able to connect to it. + Все пользователи, с которыми вы поделились этим VPN-протоколом, больше не смогут к нему подключаться. - Remove - - - - - Remove %1 from server? - - - - - All users with whom you shared a connection will no longer be able to connect to it. - - - - Continue - + ادامه - + Cancel - + کنسل PageProtocolShadowSocksSettings - + ShadowSocks settings - + تنظیمات ShadowSocks - + Port - + پورت - - + + Cipher - + رمزگذاری - + Save and Restart Amnezia - + ذخیره و راه اندازی دوباره Amnezia + + + + PageServerContainers + + Continue + Продолжить @@ -644,32 +706,33 @@ Already installed containers were found on the server. All installed containers A DNS service is installed on your server, and it is only accessible via VPN. - + یک سرویس DSN بر روی سرور شما نصب شده و فقط از طریق وی‎پی‎ان قابل دسترسی می‎باشد + The DNS address is the same as the address of your server. You can configure DNS in the settings, under the connections tab. - + آدرس DSN همان آدرس سرور شماست. میتوانید از قسمت تنظیمات و تب اتصالات DSN خود را تنظیم کنید Remove - + جذف Remove %1 from server? - + %1 از سرور حذف شود؟ Continue - + ادامه Cancel - + کنسل @@ -677,17 +740,17 @@ Already installed containers were found on the server. All installed containers Settings updated successfully - + تنظیمات با موفقیت به‎روز‎رسانی شد SFTP settings - + تنظیمات SFTP Host - + هاست @@ -695,69 +758,69 @@ Already installed containers were found on the server. All installed containers Copied - + کپی شد Port - + پورت Login - + ورود Password - + رمز عبور Mount folder on device - + بارگذاری پوشه بر روی دستگاه In order to mount remote SFTP folder as local drive, perform following steps: <br> - + برای بارگذاری پوشه SFTP بر روی درایو محلی قدم‎های زیر را انجام دهید: <br> <br>1. Install the latest version of - + <br> 1. آخرین نسخه را نصب کنید: <br>2. Install the latest version of - + <br> 2. آخرین نسخه را نصب کنید: Detailed instructions - + جزییات دستورالعمل‎ها Remove SFTP and all data stored there - + حذف SFTP و تمام داده‎های ذخیره شده در آن Remove SFTP and all data stored there? - + پوشه SFTP و تمام داده‎های آن حذف شوند؟ Continue - + ادامه Cancel - + کنسل @@ -765,22 +828,22 @@ Already installed containers were found on the server. All installed containers Settings updated successfully - + تنظیمات با موفقیت به‎روز‎‌رسانی شد Tor website settings - + تنظیمات وب‎سایت Tor Website address - + آدرس وب‎سایت Copied - + کپی شد @@ -792,30 +855,42 @@ Already installed containers were found on the server. All installed containers After creating your onion site, it takes a few minutes for the Tor network to make it available for use. + + Use <a href="https://www.torproject.org/download/" style="color: #FBB26A;">Tor Browser</a> to open this url. + از <a href="https://www.torproject.org/download/" style="color: #FBB26A;">Tor Browser</a> برای باز کردن این url استفاده کنید. + + + After installation it takes several minutes while your onion site will become available in the Tor Network. + بعد از نصب چند دقیقه طول میکشد که سایت پیازی شما در شبکه Tor در دسترس قرار گیرد. + When configuring WordPress set the this onion address as domain. - + زمانی که سایت وردپرس را تنظیم میکنید این آدرس پیازی را به عنوان دامنه قرار دهید. + + + When configuring WordPress set the this address as domain. + При настройке WordPress укажите этот onion адрес в качестве домена. Remove website - + حذف وب سایت The site with all data will be removed from the tor network. - + سایت با تمام داده‎ها از شبکه Tor حذف خواهد شد. Continue - + ادامه Cancel - + کنسل @@ -823,41 +898,45 @@ Already installed containers were found on the server. All installed containers Settings - + تنظیمات Servers - + سرورها Connection - + ارتباط Application - + نرم‎افزار Backup - + بک‎آپ About AmneziaVPN - + درباره Amnezia Close application - + بستن نرم‎افزار PageSettingsAbout + + Support the project with a donation + حمایت از پروژه با کمک‎های مالی + Support Amnezia @@ -866,87 +945,87 @@ Already installed containers were found on the server. All installed containers This is a free and open source application. If you like it, support the developers with a donation. - + این نرم‎افزار یک پروژه رایگان است. اگر آن را دوست دارید با کمک‎های مالی از توسعه‎دهندگان آن حمایت کنید. And if you don’t like the application, all the more reason to support it - the donation will be used for the improving the application. - + و اگر آن‎را دوست ندارید دلایل بیشتری برای کمک به نرم‎افزار است، کمک‎های مالی شما برای بهبود نرم‎افزار استفاده میشود. Card on Patreon - + کارت روی Patreon https://www.patreon.com/amneziavpn - + https://www.patreon.com/amneziavpn Show other methods on Github - + نمایش متد‎های دیگر در گیت هاب - + https://github.com/amnezia-vpn/amnezia-client#donate - + Contacts - + مخاطب - + Telegram group - + گروه تلگرام - + To discuss features - + برای گفتگو در مورد ویژگی‎ها - + https://t.me/amnezia_vpn_en - + https://t.me/amnezia_vpn - + Mail - + ایمیل - + For reviews and bug reports - + برای ارائه نظرات و گزارشات باگ - + Github - + Github - + https://github.com/amnezia-vpn/amnezia-client - + https://github.com/amnezia-vpn/amnezia-client - + Website - + وب سایت - + https://amnezia.org - + https://amnezia.org - + Check for updates - + بررسی بروز‎رسانی @@ -954,151 +1033,151 @@ Already installed containers were found on the server. All installed containers Application - + نرم افزار Allow application screenshots - + مجوز اسکرین‎شات در برنامه Auto start - + شروع خودکار Launch the application every time the device is starts - + راه‎اندازی نرم‎افزار با هر بار روشن شدن دستگاه Start minimized - + شروع به صورت کوچک Launch application minimized - + راه‎اندازی برنامه به صورت کوچک Language - + زبان - + Logging - + گزارشات - + Enabled - + فعال - + Disabled - - - - - Reset settings and remove all data from the application - + غیر فعال + Reset settings and remove all data from the application + ریست کردن تنظیمات و حذف تمام داده‎ها از نرم‎افزار + + + Reset settings and remove all data from the application? - + ریست کردن تنظیمات و حذف تمام داده‎ها از نرم‎افزار؟ - + All settings will be reset to default. All installed AmneziaVPN services will still remain on the server. - + تمام تنظیمات به حالت پیش‎فرض ریست می‎شوند. تمام سرویس‎های Amnezia بر روی سرور باقی می‎مانند. - + Continue - + ادامه - + Cancel - + کنسل PageSettingsBackup - - - Settings restored from backup file - - Backup - + پشتیبان‎گیری + + + + Settings restored from backup file + تنظیمات از فایل پشتیبان بازیابی شد Configuration backup - + پشتیبان‎گیری از پیکربندی You can save your settings to a backup file to restore them the next time you install the application. - + می‎توانید تنظیمات را در یک فایل پشتیبان ذخیره کرده و دفعه بعد که نرم‎افزار را نصب کردید آن‎ها را بازیابی کنید. Make a backup - + ایجاد یک پشتیبان Save backup file - + ذخیره فایل پشتیبان Backup files (*.backup) - + Backup files (*.backup) Backup file saved - + فایل پشتیبان ذخیره شد Restore from backup - + بازیابی از پشتیبان Open backup file - + باز کردن فایل پشتیبان Import settings from a backup file? - + ورود تنظیمات از فایل پشتیبان؟ All current settings will be reset - + تمام تنظیمات جاری ریست خواهد شد Continue - + ادامه Cancel - + کنسل @@ -1106,120 +1185,128 @@ Already installed containers were found on the server. All installed containers Connection - + ارتباط Auto connect - + اتصال خودکار Connect to VPN on app start - + اتصال به وی‎‎پی‎ان با شروع نرم‎افزار Use AmneziaDNS - + استفاده از AmneziaDNS If AmneziaDNS is installed on the server - + اگر AmneziaDNS بر روی سرور نصب شده باشد DNS servers - + سرورهای DNS When AmneziaDNS is not used or installed + + + Allows you to use the VPN only for certain Apps + + + + If AmneziaDNS is not used or installed + اگر AmneziaDNS نصب نشده یا استفاده نشود + Site-based split tunneling - + جداسازی ترافیک بر اساس سایت Allows you to select which sites you want to access through the VPN - + میتوانید مشخص کنید که چه سایت‎هایی از وی‎پی‎ان استفاده کنند App-based split tunneling - + جداسازی ترافیک بر اساس نرم‎افزار - - Allows you to use the VPN only for certain Apps - + Allows you to use the VPN only for certain applications + میتوانید مشخص کنید که چه نرم‎افزارهایی از وی‎پی‎ان استفاده کنند PageSettingsDns - + Default server does not support custom dns - + DNS servers - + سرورهای DNS - + If AmneziaDNS is not used or installed - + اگر AmneziaDNS نصب نباشد یا استفاده نشود - + Primary DNS - + DNS اصلی - + Secondary DNS - + DNS ثانویه - + Restore default - + بازگشت به پیش‎فرض - + Restore default DNS settings? - + بازگشت به تنظیمات پیش‎فرض DNS؟ - + Continue - + ادامه - + Cancel - + کنسل - + Settings have been reset - + تنظیمات ریست شد - + Save - + ذخیره - + Settings saved - + ذخیره تنظیمات @@ -1227,62 +1314,62 @@ Already installed containers were found on the server. All installed containers Logging - + گزارشات Save logs - + ذخیره گزارشات Open folder with logs - + باز کردن پوشه گزارشات Save - + ذخیره Logs files (*.log) - + Logs files (*.log) Logs file saved - + فایل گزارشات ذخیره شد Save logs to file - + ذخیره گزارشات در فایل Clear logs? - + پاک کردن گزارشات؟ Continue - + ادامه Cancel - + کنسل - + Logs have been cleaned up - + گزارشات پاک شدند - + Clear logs - + پاک کردن گزارشات @@ -1290,143 +1377,139 @@ Already installed containers were found on the server. All installed containers All installed containers have been added to the application - - - - - No new installed containers found - + تمام کانتینرهای نصب شده به نرم‎افزار اضافه شدند Clear Amnezia cache - + پاک کردن حافظه داخلی Amnezia May be needed when changing other settings - + وقتی تنظیمات دیگر را تغییر دهید ممکن است نیاز باشد Clear cached profiles? - + پاک کردن پروفایل ذخیره شده؟ - + + No new installed containers found + کانتینر نصب شده جدیدی پیدا نشد + + + - - - - + + + Continue - + ادامه - - - - + + + Cancel - - - - - Check the server for previously installed Amnezia services - + کنسل - Add them to the application if they were not displayed - + Check the server for previously installed Amnezia services + چک کردن سرویس‎های نصب شده Amnezia بر روی سرور - + + Add them to the application if they were not displayed + اضافه کردن آنها به نرم‎افزار اگر نمایش داده نشده‎اند + + + Reboot server - + Do you want to reboot the server? - + The reboot process may take approximately 30 seconds. Are you sure you wish to proceed? - - Remove server from application - - - - + Do you want to remove the server from application? - - All installed AmneziaVPN services will still remain on the server. - - - - - Clear server from Amnezia software - - - - + Do you want to clear server from Amnezia software? - + + Remove server from application + حذف کردن سرور از نرم‎افزار + + + Remove server? + حذف سرور؟ + + + + All installed AmneziaVPN services will still remain on the server. + تمام سرویس‎های نصب‎شده Amnezia همچنان بر روی سرور باقی خواهند ماند. + + + + Clear server from Amnezia software + پاک کردن سرور از نرم‎افزار Amnezia + + + Clear server from Amnezia software? + سرور از نرم‎افزار Amnezia پاک شود؟ + + + All containers will be deleted on the server. This means that configuration files, keys and certificates will be deleted. - - - - - Reset API config - - - - - Do you want to reset API config? - + تمام کانتینرها از سرور پاک شوند، به این معنی که تمام فایل‎های پیکربندی، کلیدها و مجوزها حذف خواهند شد. PageSettingsServerInfo - + Server name - + نام سرور - + Save - + ذخیره - + Protocols - + پروتکل‎ها - + Services - + سرویس‎ها - + Data - + داده @@ -1434,32 +1517,36 @@ Already installed containers were found on the server. All installed containers settings - + تنظیمات Remove - + حذف Remove %1 from server? - + حذف %1 از سرور؟ All users with whom you shared a connection will no longer be able to connect to it. - + تمام کاربرانی که این ارتباط را با آنها به اشتراک گذاشته‎اید دیگر نمی‎توانند به آن متصل شوند. + + + All users who you shared a connection with will no longer be able to connect to it. + Все пользователи, которым вы поделились VPN, больше не смогут к нему подключаться. Continue - + ادامه Cancel - + کنسل @@ -1467,49 +1554,61 @@ Already installed containers were found on the server. All installed containers Servers - + سرورها PageSettingsSplitTunneling - + Default server does not support split tunneling function - - Only the sites listed here will be accessed through the VPN - + Addresses from the list should be accessed via VPN + دسترسی به آدرس‎های لیست از طریق وی‎پی‎ان - + Addresses from the list should not be accessed via VPN - + دسترسی به آدرس‎های لیست بدون وی‎پی‎ان - + Split tunneling - + جداسازی ترافیک - + Mode - + حالت - + Remove - + حذف - + Continue - + ادامه - + Cancel + کنسل + + + Site or IP + سایت یا آی‎پی + + + Import/Export Sites + بارگذاری / خروجی‎گرفتن از سایت‎ها + + + + Only the sites listed here will be accessed through the VPN @@ -1518,52 +1617,52 @@ Already installed containers were found on the server. All installed containers - + Import / Export Sites - + Import - + بارگذاری - + Save site list - + ذخیره لیست سایت‎ها - + Save sites - + ذخیره سایت‎ها + + + + + + Sites files (*.json) + Sites files (*.json) + + + + Import a list of sites + بارگذاری لیست سایت‎ها + + + + Replace site list + جایگزین کردن لیست سایت - - Sites files (*.json) - - - - - Import a list of sites - - - - - Replace site list - - - - - Open sites file - + باز کردن فایل سایت‎ها - + Add imported sites to existing ones - + اضافه کردن سایت‎های بارگذاری شده به سایت‎های موجود @@ -1571,102 +1670,121 @@ Already installed containers were found on the server. All installed containers Server connection - + ارتباط سرور Do not use connection code from public sources. It may have been created to intercept your data. It's okay as long as it's from someone you trust. - + از کد اتصالاتی که در منابع عمومی هستند استفاده نکنید. ممکن است برای شنود اطلاعات شما ایجاد شده باشند. + +ایرادی ندارد که از طرف کسی باشد که به او اعتماد دارید. What do you have? - - - - - File with connection settings or backup - + چی داری؟ File with connection settings - + فایل شامل تنظیمات اتصال + + + + File with connection settings or backup + فایل شامل تنظیمات اتصال یا بک‎آپ Open config file - + باز کردن فایل تنظیمات QR-code - + QR-Code Key as text - + متن شامل کلید PageSetupWizardCredentials - - Configure your server - + Server connection + Подключение к серверу - + Server IP address [:port] - + آدرس آی‎پی سرور (:پورت) - + 255.255.255.255:88 + 255.255.255.255:88 + + + Password / SSH private key + Password / SSH private key + + + + Continue + ادامه + + + All data you enter will remain strictly confidential +and will not be shared or disclosed to the Amnezia or any third parties + تمام داده‎هایی که شما وارد می‎کنید به شدت محرمانه‎ است و با Amnezia یا هر شخص ثالث دیگری به اشتراک گذاشته نمی‎شود + + + + Enter the address in the format 255.255.255.255:88 + آدرس را با فرمت 255.255.255.255:88 وارد کنید + + + + Login to connect via SSH + ورود و اتصال با استفاده از SSH + + + + Configure your server + سرور خود را پیکربندی کنید + + + 255.255.255.255:22 - - Login to connect via SSH - - - - + Password or SSH private key - - Continue - - - - + All data you enter will remain strictly confidential and will not be shared or disclosed to the Amnezia or any third parties - + تمام داده‎هایی که شما وارد می‎کنید به شدت محرمانه‎ است و با Amnezia یا هر شخص ثالث دیگری به اشتراک گذاشته نمی‎شود - + Ip address cannot be empty - + آدرس آی‎پی نمی‎تواند خالی باشد - - Enter the address in the format 255.255.255.255:88 - - - - + Login cannot be empty - + نام‎کاربری نمی‎تواند خالی باشد - + Password/private key cannot be empty - + پسورد یا کلید خصوصی نمی‎تواند خالی باشد @@ -1674,99 +1792,107 @@ It's okay as long as it's from someone you trust. What is the level of internet control in your region? - + سطح کنترل اینترنت در منطقه شما چگونه است؟ Set up a VPN yourself - + یک وی‎پی‎ان برای خودتان بسازید I want to choose a VPN protocol - + می‎خواهم پروتکل وی‎پی‎ان را انتخاب کنم Continue - + ادامه - + Set up later - + بعدا تنظیم شود PageSetupWizardInstalling - - - - Usually it takes no more than 5 minutes - - The server has already been added to the application - + سرور در حال حاضر به نرم‎افزار اضافه شده است + + + Amnesia has detected that your server is currently + Amnesia обнаружила, что ваш сервер в настоящее время + + + busy installing other software. Amnesia installation + занят установкой других протоколов или сервисов. Установка Amnesia Amnezia has detected that your server is currently - + برنامه Amnezia تشخیص داده است که سرور در حال حاضر busy installing other software. Amnezia installation - + مشغول نصب نرم‎افزار دیگری است. نصب Amnezia will pause until the server finishes installing other software - + متوقف شده تا زمانی که سرور نصب نرم‎افزار دیگر را تمام کند Installing - + در حال نصب Cancel installation - + لغو عملیات نصب + + + + + Usually it takes no more than 5 minutes + معمولا بیش از 5 دقیقه طول نمی‎کشد PageSetupWizardProtocolSettings - + Installing %1 - + در حال نصب %1 - + More detailed - + جزییات بیشتر - + Close - + بستن - + Network protocol - + پروتکل شبکه - + Port - + پورت - + Install - + نصب @@ -1774,12 +1900,12 @@ It's okay as long as it's from someone you trust. VPN protocol - + پروتکل وی‎پی‎ان Choose the one with the highest priority for you. Later, you can install other protocols and additional services, such as DNS proxy and SFTP. - + پروتکلی که بیشترین اولویت را برای شما دارد انتخاب کنید. بعدا، میتوانید پروتکل‎ها و سرویس‎های اضافه مانند پروکسی DNS و SFTP را هم نصب کنید @@ -1787,7 +1913,7 @@ It's okay as long as it's from someone you trust. Point the camera at the QR code and hold for a couple of seconds. - + دوربین را روی QR Code بگیرید و برای چند ثانیه آن را نگه دارید. @@ -1795,30 +1921,30 @@ It's okay as long as it's from someone you trust. Settings restored from backup file - + تنظیمات از فایل بک‎آپ بازیابی شدند Free service for creating a personal VPN on your server. - + سرویس رایگان برای ایجاد وی‎پی‎ان شخصی بر روی سرور خودتان. Helps you access blocked content without revealing your privacy, even to VPN providers. - + به شما کمک می‎کند که بدون فاش کردن حریم شخصی خودتان حتی برای ارائه دهنده وی‎پی‎ان به محتوای مسدود شده دسترسی پیدا کنید. I have the data to connect - + من داده برای اتصال دارم I have nothing - + من هیچی ندارم - + https://amnezia.org/instructions/0_starter-guide @@ -1826,230 +1952,262 @@ It's okay as long as it's from someone you trust. PageSetupWizardTextKey - + Connection key - + کلید ارتباط - + A line that starts with vpn://... - + یک کلید متنی که با vpn:// شروع می‎شود + + + + Key + کلید - Key - - - - Insert - + وارد کردن - + Continue - + ادامه PageSetupWizardViewConfig - + New connection - + ارتباط جدید - + Do not use connection code from public sources. It could be created to intercept your data. - + از کد اتصالی که در منابع عمومی هست استفاده نکنید. ممکن است برای شنود اطلاعات شما ایجاد شده باشد. - + Collapse content - + جمع کردن محتوا - + Show content - + نمایش محتوا - + Connect - + اتصال PageShare - + + OpenVpn native format + فرمت OpenVPN + + + + WireGuard native format + فرمت WireGuard + + + VPN Access + VPN-Доступ + + + + Connection + ارتباط + + + VPN access without the ability to manage the server + Доступ к VPN, без возможности управления сервером + + + Access to server management. The user with whom you share full access to the connection will be able to add and remove your protocols and services to the server, as well as change settings. + Доступ к управлению сервером. Пользователь, с которым вы делитесь полным доступом к соединению, сможет добавлять и удалять ваши протоколы и службы на сервере, а также изменять настройки. + + + + + Server + سرور + + + Accessing + در حال دسترسی به + + + File with accessing settings to + فایل شامل تنظیمات دسترسی به + + + Config revoked - + تنظیمات ابطال‎شد - + Connection to - + ارتباط با - + File with connection settings to - + فایل شامل تنظیمات ارتباط با Save OpenVPN config - + ذخیره تنظیمات OpenVPN Save WireGuard config - + ذخیره تنظیمات WireGuard Save ShadowSocks config - + ذخیره تنظیمات ShadowSocks Save Cloak config - - - - - For the AmneziaVPN app - + ذخیره تنظیمات Cloak - OpenVpn native format - - - - - WireGuard native format - - - - - ShadowSocks native format - + For the AmneziaVPN app + برای نرم‎افزار AmneziaVPN + ShadowSocks native format + فرمت ShadowSocks + + + Cloak native format - + فرمت Cloak - + Share VPN Access - + به اشتراک گذاشتن دسترسی وی‎پی‎ان - + Share full access to the server and VPN - + به اشتراک گذاشتن دسترسی کامل به سرور و وی‎پی‎ان - + Use for your own devices, or share with those you trust to manage the server. - + برای دستگاه‎های خودتان استفاده کنید یا با آنهایی که برای مدیریت سرور به آن‎ها اعتماد دارید به اشتراک بگذارید. - - - Share - - - - - Connection - - - - + Users - + کاربران - - Share VPN access without the ability to manage the server - - - - + User name + نام کاربری + + + + Search + جستجو + + + + Creation date: - - - Server + + Rename + تغییر نام + + + + Client name + نام کلاینت + + + + Save + ذخیره + + + + Revoke + ابطال + + + + Revoke the config for a user - %1? + + Revoke the config for a user - + ابطال تنظیمات برای کاربر + + + + The user will no longer be able to connect to your server. + کاربر دیگر نمی‎تواند به سرور وصل شود. + + + + Continue + ادامه + + + + Cancel + کنسل + + + Full access + دسترسی کامل + + + + Share VPN access without the ability to manage the server + به اشتراک گذاشتن دسترسی وی‎پی‎ان بدون امکان مدیریت سرور + + + Share access to server management. The user with whom you share full access to the server will be able to add and remove any protocols and services to the server, as well as change settings. + به اشتراک گذاری دسترسی به مدیریت سرور. کاربری که دسترسی کامل سرور با او به اشتراک گذاشته می‎شود می‎تواند پروتکل‌‎ها و سرویس‎ها را در سرور حذف یا اضافه کند و یا تنظیمات سرور را تغییر دهد. + Protocol - + پروتکل - - + + Connection format - + فرمت ارتباط - - Search - - - - - Creation date: - - - - - Rename - - - - - Client name - - - - - Save - - - - - Revoke - - - - - Revoke the config for a user - %1? - - - - - The user will no longer be able to connect to your server. - - - - - Continue - - - - - Cancel - + + + Share + اشتراک‎گذاری @@ -2057,49 +2215,50 @@ It's okay as long as it's from someone you trust. Full access to the server and VPN - + دسترسی کامل به سرور و وی‎پی‎ان We recommend that you use full access to the server only for your own additional devices. - + ما پیشنهاد میکنیم که ازحالت دسترسی کامل به سرور فقط برای دستگاه‎های دیگر خودتان استفاده کنید + If you share full access with other people, they can remove and add protocols and services to the server, which will cause the VPN to work incorrectly for all users. - + اگر دسترسی کامل را با دیگران به اشتراک بگذارید، آن‎ها می‎توانند پروتکل‎ها و سرویس‎ها را حذف یا اضافه کنند که باعث می‎شود که وی‎پی‎ان دیگر برای سایر کاربران کار نکند. + - Server - + سرور + + + + Accessing + در حال دسترسی به - Accessing - - - - File with accessing settings to - + فایل شامل تنظیمات دسترسی به - + Share - + اشتراک‎گذاری + + + + Connection to + ارتباط با - Connection to - - - - File with connection settings to - + فایل شامل تنظیمات ارتباط با @@ -2107,7 +2266,7 @@ It's okay as long as it's from someone you trust. Close - + بستن @@ -2115,38 +2274,38 @@ It's okay as long as it's from someone you trust. Password entry not found - + Password entry not found Could not decrypt data - + Could not decrypt data Unknown error - + Unknown error Could not open wallet: %1; %2 - + Could not open wallet: %1; %2 Password not found - + Password not found Could not open keystore - + Could not open keystore Could not remove private key from keystore - + Could not remove private key from keystore @@ -2154,12 +2313,12 @@ It's okay as long as it's from someone you trust. Unknown error - + Unknown error Access to keychain denied - + Access to keychain denied @@ -2167,27 +2326,27 @@ It's okay as long as it's from someone you trust. Could not store data in settings: access error - + Could not store data in settings: access error Could not store data in settings: format error - + Could not store data in settings: format error Could not delete data from settings: access error - + Could not delete data from settings: access error Could not delete data from settings: format error - + Could not delete data from settings: format error Entry not found - + Entry not found @@ -2195,80 +2354,80 @@ It's okay as long as it's from someone you trust. Password entry not found - + Password entry not found Could not decrypt data - + Could not decrypt data D-Bus is not running - + D-Bus is not running Unknown error - + Unknown error No keychain service available - + No keychain service available Could not open wallet: %1; %2 - + Could not open wallet: %1; %2 Access to keychain denied - + Access to keychain denied Could not determine data type: %1; %2 - + Could not determine data type: %1; %2 Entry not found - + Entry not found Unsupported entry type 'Map' - + Unsupported entry type 'Map' Unknown kwallet entry type '%1' - + Unknown kwallet entry type '%1' Password not found - + Password not found Could not open keystore - + Could not open keystore Could not retrieve private key from keystore - + Could not retrieve private key from keystore Could not create decryption cipher - + Could not create decryption cipher @@ -2276,276 +2435,221 @@ It's okay as long as it's from someone you trust. Credential size exceeds maximum size of %1 - + Credential size exceeds maximum size of %1 Credential key exceeds maximum size of %1 - + Credential key exceeds maximum size of %1 Writing credentials failed: Win32 error code %1 - + Writing credentials failed: Win32 error code %1 Encryption failed - + Encryption failed D-Bus is not running - + D-Bus is not running Unknown error - + Unknown error Could not open wallet: %1; %2 - + Could not open wallet: %1; %2 Password not found - + Password not found Could not open keystore - + Could not open keystore Could not create private key generator - + Could not create private key generator Could not generate new private key - + Could not generate new private key Could not retrieve private key from keystore - + Could not retrieve private key from keystore Could not create encryption cipher - + Could not create encryption cipher Could not encrypt data - + Could not encrypt data QObject - - - Sftp service - - No error - + No error Unknown Error - + Unknown Error Function not implemented - + Function not implemented Server check failed - + Server check failed Server port already used. Check for another software - + Server port already used. Check for another software Server error: Docker container missing - + Server error: Docker container missing Server error: Docker failed - + Server error: Docker failed Installation canceled by user - + Installation canceled by user The user does not have permission to use sudo - + The user does not have permission to use sudo Ssh request was denied - + Ssh request was denied Ssh request was interrupted - + Ssh request was interrupted Ssh internal error - + Ssh internal error Invalid private key or invalid passphrase entered - + Invalid private key or invalid passphrase entered The selected private key format is not supported, use openssh ED25519 key types or PEM key types - + The selected private key format is not supported, use openssh ED25519 key types or PEM key types Timeout connecting to server - + Timeout connecting to server Sftp error: End-of-file encountered - + Sftp error: End-of-file encountered Sftp error: File does not exist - + Sftp error: File does not exist Sftp error: Permission denied - + Sftp error: Permission denied Sftp error: Generic failure - + Sftp error: Generic failure Sftp error: Garbage received from server - + Sftp error: Garbage received from server Sftp error: No connection has been set up - + Sftp error: No connection has been set up Sftp error: There was a connection, but we lost it - + Sftp error: There was a connection, but we lost it Sftp error: Operation not supported by libssh yet - + Sftp error: Operation not supported by libssh yet Sftp error: Invalid file handle - + Sftp error: Invalid file handle Sftp error: No such file or directory path exists - + Sftp error: No such file or directory path exists Sftp error: An attempt to create an already existing file or directory has been made - + Sftp error: An attempt to create an already existing file or directory has been made Sftp error: Write-protected filesystem - + Sftp error: Write-protected filesystem Sftp error: No media was in remote drive - - - - - OpenVPN config missing - - - - - OpenVPN management server error - - - - - OpenVPN executable missing - - - - - ShadowSocks (ss-local) executable missing - - - - - Cloak (ck-client) executable missing - - - - - Amnezia helper service error - - - - - OpenSSL failed - - - - - Can't connect: another VPN connection is active - - - - - Can't setup OpenVPN TAP network adapter - - - - - VPN pool error: no available addresses - + Sftp error: No media was in remote drive The config does not contain any containers and credentials for connecting to the server - + تنظیمات شامل هیچ کانتینر یا اعتبارنامه‎ای برای اتصال به سرور نیست @@ -2553,50 +2657,77 @@ It's okay as long as it's from someone you trust. - - Error when retrieving configuration from API - - - - - This config has already been added to the application - - - - - Internal error - - - - + ErrorCode: %1. + + Failed to save config to disk + Failed to save config to disk + + + + OpenVPN config missing + OpenVPN config missing + + + + OpenVPN management server error + OpenVPN management server error + + + + OpenVPN executable missing + OpenVPN executable missing + + + + ShadowSocks (ss-local) executable missing + ShadowSocks (ss-local) executable missing + + + + Cloak (ck-client) executable missing + Cloak (ck-client) executable missing + + + + Amnezia helper service error + Amnezia helper service error + + + + OpenSSL failed + OpenSSL failed + + + + Can't connect: another VPN connection is active + Can't connect: another VPN connection is active + + + + Can't setup OpenVPN TAP network adapter + Can't setup OpenVPN TAP network adapter + + + + VPN pool error: no available addresses + VPN pool error: no available addresses + + + The config does not contain any containers and credentiaks for connecting to the server + The config does not contain any containers and credentiaks for connecting to the server + + + + Internal error + Internal error + IPsec - - - - - - Website in Tor network - - - - - Amnezia DNS - - - - - Sftp file sharing service - - - - - OpenVPN is the most popular VPN protocol, with flexible configuration options. It uses its own security protocol with SSL/TLS for key exchange. - + IPsec @@ -2608,60 +2739,11 @@ It's okay as long as it's from someone you trust. 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. - - - WireGuard - New popular VPN protocol with high performance, high speed and low power consumption. Recommended for regions with low levels of censorship. - - - - - AmneziaWG - Special protocol from Amnezia, based on WireGuard. It's fast like WireGuard, but very resistant to blockages. Recommended for regions with high levels of censorship. - - - - - 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. - - - - - Deploy a WordPress site on the Tor network in two clicks. - - - - - Replace the current DNS server with your own. This will increase your privacy level. - - Create a file vault on your server to securely store and transfer files. - - - OpenVPN stands as one of the most popular and time-tested VPN protocols available. -It employs its unique security protocol, leveraging the strength of SSL/TLS for encryption and key exchange. Furthermore, OpenVPN's support for a multitude of authentication methods makes it versatile and adaptable, catering to a wide range of devices and operating systems. Due to its open-source nature, OpenVPN benefits from extensive scrutiny by the global community, which continually reinforces its security. With a strong balance of performance, security, and compatibility, OpenVPN remains a top choice for privacy-conscious individuals and businesses alike. - -* Available in the AmneziaVPN across all platforms -* Normal power consumption on mobile devices -* Flexible customisation to suit user needs to work with different operating systems and devices -* Recognised by DPI analysis systems and therefore susceptible to blocking -* Can operate over both TCP and UDP network protocols. - - - - - 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'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'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. - - This is a combination of the OpenVPN protocol and the Cloak plugin designed specifically for protecting against blocking. @@ -2694,19 +2776,6 @@ WireGuard is very susceptible to blocking due to its distinct packet signatures. * Low power consumption * Minimum number of settings * Easily recognised by DPI analysis systems, susceptible to blocking -* Works over UDP network protocol. - - - - - A modern iteration of the popular VPN protocol, AmneziaWG builds upon the foundation set by WireGuard, retaining its simplified architecture and high-performance capabilities across devices. -While WireGuard is known for its efficiency, it had issues with being easily detected due to its distinct packet signatures. AmneziaWG solves this problem by using better obfuscation methods, making its traffic blend in with regular internet traffic. -This means that AmneziaWG keeps the fast performance of the original while adding an extra layer of stealth, making it a great choice for those wanting a fast and discreet VPN connection. - -* Available in the AmneziaVPN across all platforms -* Low power consumption -* Minimum number of settings -* Not recognised by DPI analysis systems, resistant to blocking * Works over UDP network protocol. @@ -2721,85 +2790,289 @@ While it offers a blend of security, stability, and speed, it's essential t * Minimal configuration * Recognised by DPI analysis systems * Works over UDP network protocol, ports 500 and 4500. - + پروتکل IKEv2 به همراه لایه رمزنگاری IPSec به عنوان پروتکل وی‎پی‎ان مدرن و پایدار است. +یکی از قابلیت‎‎های متمایز این پروتکل قابلیت سوییچ بین شبکه‎ها و دستگاه‎هاست که قابلیت انطباق بالایی در محیط شبکه‎های دینامیک را دارد +در حالیکه ترکیبی از امنیت، پایداری و سرعت را ارائه میدهد اما مهم است که اشاره کنیم IKEv2 به راحتی قابل تشخیص در شبکه و بلاک شدن میباشد. + +* در AmneziaVPN فقط بر روی ویندوز در دسترس است +* مصرف باتری کم روی دستگاه‎های موبایل +* تنظیمات ساده +* امکان شناسایی شدن در شبکه‎های تحلیل DPI +* روی پروتکل شبکه UDP، پورت‎های 500 و 4500 کار می‎کند. DNS Service - + سرویس DNS + + + + Sftp file sharing service + سرویس اشتراک گذاری فایل Sftp + + + + + Website in Tor network + وب سایت در شبکه Tor + + + + Amnezia DNS + Amnezia DNS + + + + OpenVPN is the most popular VPN protocol, with flexible configuration options. It uses its own security protocol with SSL/TLS for key exchange. + پروتکل OpenVPN یکی از پروتکل‎های وی‎پی‎ان محبوب می‎باشد با تنظیمات و پیکربندی‎های قابل تغییر. از پروتکل امنیتی داخلی خود با تبادل کلید SSL/TLS استفاده می‎کند. + + + ShadowSocks - masks VPN traffic, making it similar to normal web traffic, but is recognised by analysis systems in some highly censored regions. + پروتکل ShadowSocks ترافیک وی‎پی‎ان را پنهان و آن را شبیه ترافیک عادی وب می‎کند، اما در مناطقی که سانسور شدیدی اعمال می‎شود با سیستم‎های تحلیلی قابل شناسایی است. + + + OpenVPN over Cloak - OpenVPN with VPN masquerading as web traffic and protection against active-probbing detection. Ideal for bypassing blocking in regions with the highest levels of censorship. + پروتکل OpenVPN over Cloak که همان پروتکل OpenVPN با قابلیت پنهان کردن ترافیک از سیستم‎های تحلیل فعال برروی شبکه. ایده‎آل برای گذر از ممنوعیت در مناطقی که سانسور شدیدی اعمال می‎کنند. + + + + WireGuard - New popular VPN protocol with high performance, high speed and low power consumption. Recommended for regions with low levels of censorship. + پروتکل WireGuard یک پروتکل وی‎پی‎ان جدید با عملکرد بسیار خوب، سرعت بالا و مصرف انرژی پایین. برای مناطقی که سطح سانسور پایینی دارند پیشنهاد می‎شود. + + + + AmneziaWG - Special protocol from Amnezia, based on WireGuard. It's fast like WireGuard, but very resistant to blockages. Recommended for regions with high levels of censorship. + پروتکل AmneziaWG یک پروتکل اختصاصی Amnezia که بر اساس WireGaurd کار میکند. به اندازه WireGaurd پرسرعت است و در عین حال بسیار مقاوم به بلاک شدن توسط شبکه ست. مناسب برای مناطق با سطح سانسور بالاست. + + + + 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. + پروتکل IKEv2 پروتکلی پایدار و مدرن که مقداری سریعتر از سایر پروتکل‎هاست. بعد از قطع سیگنال دوباره اتصال را بازیابی می‎کند. به صورت پیش‎فرض بر روی آخرین نسخه دستگاه‎های اندروید و iOS پیشتیبانی می‎شود. + + + + Deploy a WordPress site on the Tor network in two clicks. + با دو کلیک یک سایت وردپرس در شبکه Tor راه‎اندازی کنید. + + + + Replace the current DNS server with your own. This will increase your privacy level. + سرور DNS را با مال خودتان جایگزین کنید. این کار سطح حریم خصوصی شما را افزایش می‎دهد. + + + Creates a file vault on your server to securely store and transfer files. + یک محفظه ایمن بر روی سرور خودتان ایجاد کنید که به طور امن بتوانید فایل‎ها را ذخیره و جابجا کنید. + + + + OpenVPN stands as one of the most popular and time-tested VPN protocols available. +It employs its unique security protocol, leveraging the strength of SSL/TLS for encryption and key exchange. Furthermore, OpenVPN's support for a multitude of authentication methods makes it versatile and adaptable, catering to a wide range of devices and operating systems. Due to its open-source nature, OpenVPN benefits from extensive scrutiny by the global community, which continually reinforces its security. With a strong balance of performance, security, and compatibility, OpenVPN remains a top choice for privacy-conscious individuals and businesses alike. + +* Available in the AmneziaVPN across all platforms +* Normal power consumption on mobile devices +* Flexible customisation to suit user needs to work with different operating systems and devices +* Recognised by DPI analysis systems and therefore susceptible to blocking +* Can operate over both TCP and UDP network protocols. + پروتکل OpenVPN یکی از پروتکل‎های محبوب و تست شده در دسترس می‎باشد که از پروتکل امنیتی مخصوص خودش استفاده میکند. +از امتیازات SSL/TLS برای رمزنگاری و تبادل کلید استفاده میکند. +همچنین OpenVPN از روش‎های چندگانه‎ای برای احراز هویت پشتیبانی می‎کند که آن را قابل انطباق و منعطف میکند. +از طیف وسیعی از دستگاه‎ها و سیستم عامل‎ها نیز پشتیبانی می‎کند. +به دلیل طبیعت متن-باز آن، OpenVPN از بررسی گسترده توسط یک جامعه جهانی سود می‎برد که باعث بهتر شدن وضعیت امنیتی آن می‎شود. +به دلیل تعادل قوی بین عملکرد، امنیت و سازگاری OpenVPN تبدیل به یکی از انتخاب‎های اصلی برای اشخاص آگاه بر حریم خصوصی و تجارت‎های مشابه شده است. + +* بر روی تمام سیستم‎عامل‎ها در AmneziaVPN در دسترس است. +* مصرف انرژی عادی بر روی دستگاه‎های موبایل +* قابلیت شخصی‎سازی منعطف مطابق با نیاز شما که امکان کار بر روی دستگاه‎ها و سیستم عامل‎های مختلف را می‎دهد. +* قابل شناسایی توسط سیستم‎های تحلیل عمیق DPI در شبکه و در نتیجه امکان بلاک شدن +* امکان کار بر روی دو پروتکل TCP و UDP + + + + 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'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'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. + پروتکل Shadowsocks، الهام گرفته از پروتکل Socks5، اتصال را با استفاده از رمزگذاری AEAD امن میکند. اگرچه Shadowsocks طوری طراحی شده که برای شناسایی در شبکه چالش‎برانگیز باشد و محتاط عمل کند اما این پروتکل مانند یک اتصال استاندارد HTTPS نیست و برخی از سیستم‎های تحلیل ترافیک مشخص ممکن است بتوانند اتصال Shadowsocks را شناسایی کنند. به دلیل محدودیت پشتیبانی در Amnezia پیشنهاد می‎شود که از َAmneziaWG استفاده شود. + +* فقط بر روی پلتفرم دسکتاپ بر روی Amnezia قابل دسترس است +* مصرف انرژی عادی در دستگاه‎های موبایل +* پروتکل رمزنگاری قابل پیکربندی +* قابل شناسایی توسط برخی سیستم‎های تحلیل عمیق DPI +* عملکرد بر روی پروتکل شبکه TCP + + + This is a combination of the OpenVPN protocol and the Cloak plugin designed specifically for blocking protection. + +OpenVPN provides a secure VPN connection by encrypting all Internet traffic between the client and the server. + +Cloak protects OpenVPN from detection and blocking. + +Cloak can modify packet metadata so that it completely masks VPN traffic as normal web traffic, and also protects the VPN from detection by Active Probing. This makes it very resistant to being detected + +Immediately after receiving the first data packet, Cloak authenticates the incoming connection. If authentication fails, the plugin masks the server as a fake website and your VPN becomes invisible to analysis systems. + +If there is a extreme level of Internet censorship in your region, we advise you to use only OpenVPN over Cloak from the first connection + +* Available in the AmneziaVPN across all platforms +* High power consumption on mobile devices +* Flexible settings +* Not recognised by DPI analysis systems +* Works over TCP network protocol, 443 port. + + این یک ترکیب از پروتکل OpenVPN و افزونه Cloak می‎باشد که به طور خاص برای محافظت از بلاک شدن طراحی شده است. + +پروتکل OpenVPN با رمزنگاری تمام ترافیک اینترنت بین دستگاه و سرور یک اتصال وی‎پی‎ان امن را فراهم می‎کند. + +افزونه Cloak از OpenVPN در مقابل شناسایی و بلاک شدن محافظت می‎کند + +افزونه Cloak می‎تواند داده‎های بسته ترافیکی را تغییر دهد و در نتیجه ترافیک وی‎پی‎ان شبیه ترافیک عادی وب می‎شود و همچنین از وی‎پی‎ان در مقابل شناسایی شدن توسط DPI محافظت می‎کند. این باعث می‎شود که این پروتکل به شناسایی‎شدن بسیار مقاوم باشد + +درست بعد از دریافت اولین بسته داده،افزونه Cloak اتصال ورودی را احراز هویت می‎کند و اگر عملیات احراز هویت انجام نشود Cloak سرور را به عنوان یک وب سایت جعلی در‎ می‎آورد و وی‎پی‎ان شما را از تحلیل شبکه پنهان می‎کند. + +اگر در منطقه شما سطح بالایی از سانسور وجود دارد ما به شما پیشنهاد می‎کنیم از اولین ارتباط تنها از OpenVPN over Cloak استفاده کنید. + + +* بر روی تمام پلتفرم‎ها در AmneziaVPN در دسترس است +* مصرف بالای انرژی در دستگاه‎های موبایل +* تنظیمات منطعف +* غیرقابل تشخیص و شناسایی توسط سیستم‎های تحلیل عمیق DPI +* کار کردن روی پروتکل شبکه TCP، پورت 443 + + + + A relatively new popular VPN protocol with a simplified architecture. +Provides stable VPN connection, high performance on all devices. Uses hard-coded encryption settings. WireGuard compared to OpenVPN has lower latency and better data transfer throughput. +WireGuard is very susceptible to blocking due to its distinct packet signatures. Unlike some other VPN protocols that employ obfuscation techniques, the consistent signature patterns of WireGuard packets can be more easily identified and thus blocked by advanced Deep Packet Inspection (DPI) systems and other network monitoring tools. + +* Available in the AmneziaVPN across all platforms +* Low power consumption +* Minimum number of settings +* Easily recognised by DPI analysis systems, susceptible to blocking +* Works over UDP network protocol. + یک پروتکل نسبتا محبوب وی‎پی‎ان با معماری ساده +اتصال وی‎پی‎‎ان پایدار با عملکرد بالا بر روی تمام دستگاه‎‌ها فراهم می‎کند. از تنظیمات ثابت برای رمزنگاری استفاده می‎کند و در مقایسه با OpenVPN سرعت بهتری در انتقال اطلاعات دارد. +پروتکل WireGaurd به دلیل امضای بسته داده مخصوص، احتمال بسیار بالایی برای شناسایی و بلاک شدن دارد.برعکس سایر پروتکل‎های وی‎پی‎ان که از روش‎های مخفی کردن استفاده می‎کنند، امضای ثابت WireGuard به راحتی می‎تواند توسط سیستم‎های تحلیل عمیق DPI یا سایر روش‎های بررسی شبکه شناسایی و بلاک شود. + +* بر روی تمام پلتفرم‌ها در AmneziaVPN قابل دسترسی است. +* مصرف انرژی پایین +* کمترین میزان تنظیمات +* امکان شناسایی شدن توسط سیستم‎های تحلیل عمیق DPI به آسانی و بلاک شدن +* کار بر روی پروتکل شبکه UDP + + + + A modern iteration of the popular VPN protocol, AmneziaWG builds upon the foundation set by WireGuard, retaining its simplified architecture and high-performance capabilities across devices. +While WireGuard is known for its efficiency, it had issues with being easily detected due to its distinct packet signatures. AmneziaWG solves this problem by using better obfuscation methods, making its traffic blend in with regular internet traffic. +This means that AmneziaWG keeps the fast performance of the original while adding an extra layer of stealth, making it a great choice for those wanting a fast and discreet VPN connection. + +* Available in the AmneziaVPN across all platforms +* Low power consumption +* Minimum number of settings +* Not recognised by DPI analysis systems, resistant to blocking +* Works over UDP network protocol. + یک نسخه مدرن از پروتکل وی‎پی‎ان محبوب، AmneziaWG بر روی پایه‎های WireGuard ساخته شده و معماری ساده و عملکرد بالای آن را بر روی تمام دستگاه‎ها حفظ کرده است. +در حالی‎که WireGuard به دلیل بازدهی آن شناخته می‎شود اما امکان شناسایی شدن بالا به دلیل امضای ثابت بسته داده‎های آن یکی از مشکلات آن است. AmneziaWG این مشکل را با استفاده از متدهای مخفی سازی حل کرده و در نتیجه ترافیک آن همانند با ترافیک عادی اینترنت است. +این بدین معنی است که AmneziaWG عملکرد سریع اصلی را حفظ کرده و یک لایه پنهان سازی به آن اضافه کرده که باعث می‎شود که به انتخابی عالی برای آنها که وی‎پی‎ان امن و سریع می‎خواهند تبدیل شود. + +* بر روی تمام پلتفرم‌ها در AmneziaVPN قابل دسترسی است. +* مصرف انرژی پایین +* کمترین میزان تنظیمات +* غیرقابل تشخیص توسط سیستم‎های تحلیل عمیق DPI و مقاوم به بلاک شدن +* کار بر روی پروتکل شبکه UDP + + + AmneziaWG container + AmneziaWG протокол Sftp file sharing service - is secure FTP service - + سرویس اشتراک فایل Sftp یک سرویس امن FTP می‎باشد + + + + Sftp service + سرویس Sftp Entry not found - + Entry not found Access to keychain denied - + Access to keychain denied No keyring daemon - + No keyring daemon Already unlocked - + Already unlocked No such keyring - + No such keyring Bad arguments - + Bad arguments I/O error - + I/O error Cancelled - + Cancelled Keyring already exists - + Keyring already exists No match - + No match Unknown error - + Unknown error error 0x%1: %2 - + error 0x%1: %2 + + + WireGuard Configuration Highlighter + هایلایتر پیکربندی WireGuard + + + &Randomize colors + رنگ‎های تصادفی SelectLanguageDrawer - + Choose language - + انتخاب زبان @@ -2807,78 +3080,76 @@ While it offers a blend of security, stability, and speed, it's essential t Server #1 - + Server #1 Server - + Server SettingsController - + Software version - + نسخه نرم‎افزار - - Backup file is corrupted - - - - + All settings have been reset to default values - + تمام تنظیمات به مقادیر پیش فرض ریست شد - + Cached profiles cleared - + پروفایل ذخیره شده پاک شد + + + + Backup file is corrupted + فایل بک‎آپ خراب شده است ShareConnectionDrawer - + Save AmneziaVPN config - + ذخیره تنظیمات AmneziaVPN - + Share - + اشتراک‎گذاری - + Copy - + کپی - - - - + + Copied - + کپی شد - + Copy config string - + کپی‎کردن متن تنظیمات - + Show connection settings - + نمایش تنظیمات ارتباط - + To read the QR code in the Amnezia app, select "Add server" → "I have data to connect" → "QR code, key or settings file" - + برای خواندن QR Code در نرم‎افزار AmneziaVPN "اضافه کردن سرور" -> "من داده برای اتصال دارم" -> "QR Code، کلید یا فایل تنظیمات" @@ -2886,42 +3157,42 @@ While it offers a blend of security, stability, and speed, it's essential t Hostname not look like ip adress or domain name - + فرمت هاست شبیه آدرس آی‎پی یا نام دامنه نیست New site added: %1 - + سایت جدید اضافه‎شد: %1 Site removed: %1 - + سایت حذف شد: %1 Can't open file: %1 - + فایل باز نشد: %1 Failed to parse JSON data from file: %1 - + مشکل در تحلیل داده‎های JSON در فایل: %1 The JSON data is not an array in file: %1 - + داده‎های JSON در فایل به صورت آرایه نیستند: %1 Import completed - + بارگذاری کامل شد Export completed - + خروجی گرفتن کامل شد @@ -2930,39 +3201,39 @@ While it offers a blend of security, stability, and speed, it's essential t Show - + نمایش Connect - + اتصال Disconnect - + قطع ارتباط Visit Website - + بازدید وب سایت Quit - + خروج TextFieldWithHeaderType - + The field can't be empty - + Поле не может быть пустым @@ -2970,7 +3241,7 @@ While it offers a blend of security, stability, and speed, it's essential t Mbps - + Mbps @@ -2978,42 +3249,42 @@ While it offers a blend of security, stability, and speed, it's essential t Unknown - + ناشناخته Disconnected - + قطع شده Preparing - + درحال آماده‎سازی Connecting... - + برقراری ارتباط... Connected - + وصل شد Disconnecting... - + در حال قطع شدن... Reconnecting... - + برقراری ارتباط دوباره... Error - + خطا @@ -3021,45 +3292,65 @@ While it offers a blend of security, stability, and speed, it's essential t Low - + پایین Medium or High - + متوسط یا بالا Extreme - + شدید I just want to increase the level of my privacy. - + من فقط میخواهم سطح حریم شخصی خودم را بالا ببرم I want to bypass censorship. This option recommended in most cases. - + من میخواهم از سانسور عبور کنم. این گزینه در اکثر موارد توصیه می‎‌شود Most VPN protocols are blocked. Recommended if other options are not working. - + اکثر پروتکل‎های وی‎پی‎ان مسدود شده‎اند. در مواردی که بقیه گزینه‎ها کار نمی‎کنند توصی می‎شود. + + + High + Высокий + + + Medium + Средний + + + Many foreign websites and VPN providers are blocked + Многие иностранные сайты и VPN-провайдеры заблокированы + + + Some foreign sites are blocked, but VPN providers are not blocked + Некоторые иностранные сайты заблокированы, но VPN-провайдеры не блокируются + + + I just want to increase the level of privacy + Хочу просто повысить уровень приватности main2 - + Private key passphrase - + عبارت کلید خصوصی - + Save - + ذخیره diff --git a/client/translations/amneziavpn_ru.ts b/client/translations/amneziavpn_ru.ts index 29a10ec7..99e1dff8 100644 --- a/client/translations/amneziavpn_ru.ts +++ b/client/translations/amneziavpn_ru.ts @@ -2,68 +2,100 @@ - ConnectionController + AmneziaApplication - - - - - Connect - + Split tunneling for WireGuard is not implemented, the option was disabled + Раздельное туннелирование для "Wireguard" не реализовано,опция отключена - + Split tunneling for %1 is not implemented, the option was disabled + Раздельное туннелирование для %1 не реализовано, опция отключена + + + + AndroidController + + AmneziaVPN + AmneziaVPN + + + VPN Connected + Refers to the app - which is currently running the background and waiting + VPN Подключен + + + + ApiController + + + Error when retrieving configuration from cloud server + + + + + ConnectionController + + VPN Protocols is not installed. Please install VPN container at first - + VPN протоколы не установлены. + Пожалуйста, установите протокол + + + + Connection... + Подключение... - Connection... - - - - Connected - + Подключено - - Reconnection... - - - - - Disconnection... - - - - + Settings updated successfully, Reconnnection... - + Настройки успешно обновлены. Подключение... - + Settings updated successfully - + Настройки успешно обновлены + + + + Reconnection... + Переподключение... + + + + + + + Connect + Подключиться + + + + Disconnection... + Отключение... ConnectionTypeSelectionDrawer - + Add new connection - + Добавить новое соединение - + Configure your server - + Настроить свой сервер - + Open config file, key or QR code - + Открыть файл конфига, ключ или QR код @@ -71,22 +103,22 @@ C&ut - + &Вырезать &Copy - + &Копировать &Paste - + &Вставить &SelectAll - + &ВыбратьВсе @@ -94,28 +126,32 @@ Access error! - + Ошибка доступа! HomeContainersListView - + Unable change protocol while there is an active connection - + Невозможно изменить протокол при активном соединении - + The selected protocol is not supported on the current platform - + Выбранный протокол не поддерживается на данном устройстве + + + Reconnect via VPN Procotol: + Переподключение через VPN протокол: ImportController - + Scanned %1 of %2. - + Отсканировано %1 из%2. @@ -124,30 +160,31 @@ %1 installed successfully. - + %1 успешно установлен. %1 is already installed on the server. - + %1 уже установлен на сервер. Added containers that were already installed on the server - + Добавлены сервисы и протоколы, которые были ранее установлены на сервер Already installed containers were found on the server. All installed containers have been added to the application - + +На сервере обнаружены установленные протоколы и сервисы, все они добавлены в приложение Settings updated successfully - + Настройки успешно обновлены @@ -157,27 +194,27 @@ Already installed containers were found on the server. All installed containers Server '%1' was removed - + Сервер '%1' был удален All containers from server '%1' have been removed - + Все протоколы и сервисы были удалены с сервера '%1' %1 has been removed from the server '%2' - + %1 был удален с сервера '%2' Please login as the user - + Пожалуйста, войдите в систему от имени пользователя Server added successfully - + Сервер успешно добавлен @@ -185,17 +222,17 @@ Already installed containers were found on the server. All installed containers Read key failed: %1 - + Не удалось считать ключ: %1 Write key failed: %1 - + Не удалось записать ключ: %1 Delete key failed: %1 - + Не удалось удалить ключ: %1 @@ -204,27 +241,27 @@ Already installed containers were found on the server. All installed containers AmneziaVPN - + AmneziaVPN VPN Connected - + VPN Подключен VPN Disconnected - + VPN Выключен AmneziaVPN notification - + Уведомление AmneziaVPN Unsecured network detected: - + Обнаружена незащищенная сеть: @@ -232,343 +269,355 @@ Already installed containers were found on the server. All installed containers Removing services from %1 - + Удаление сервисов c %1 Usually it takes no more than 5 minutes - + Обычно это занимает не более 5 минут PageHome - + VPN protocol - + VPN протокол - + Servers - + Серверы - + Unable change server while there is an active connection - + Невозможно изменить сервер при активном соединении PageProtocolAwgSettings - + AmneziaWG settings - + AmneziaWG настройки - + Port - + Порт - + Junk packet count - + Junk packet count - + Junk packet minimum size - + Junk packet minimum size - + Junk packet maximum size - + Junk packet maximum size - + Init packet junk size - + Init packet junk size - + Response packet junk size - + Response packet junk size - + Init packet magic header - + Init packet magic header - + Response packet magic header - + Response packet magic header - + Transport packet magic header - + Transport packet magic header + + + + Underload packet magic header + Underload packet magic header + + + + Remove AmneziaWG + Удалить AmneziaWG + + + + Remove AmneziaWG from server? + Удалить AmneziaWG с сервера? - Underload packet magic header - - - - - Remove AmneziaWG - - - - - Remove AmneziaWG from server? - - - - All users with whom you shared a connection will no longer be able to connect to it. - + Все пользователи, с которыми вы поделились этим VPN-протоколом, больше не смогут к нему подключаться. - + All users who you shared a connection with will no longer be able to connect to it. + Все пользователи, с которыми вы поделились этим VPN-протоколом, больше не смогут к нему подключаться. + + + Continue - + Продолжить - + Cancel - + Отменить - + Save and Restart Amnezia - + Сохранить и перезагрузить Amnezia PageProtocolCloakSettings - + Cloak settings - + Настройки Cloak - + Disguised as traffic from - + Замаскировать трафик под - + Port - + Порт - - + + Cipher - + Шифрование - + Save and Restart Amnezia - + Сохранить и перезагрузить Amnezia PageProtocolOpenVpnSettings - + OpenVPN settings - + OpenVPN настройки - + VPN Addresses Subnet + Подсеть для VPN + + + VPN address subnet - + Network protocol - + Сетевой протокол - + Port - + Порт - + Auto-negotiate encryption - + Шифрование с автоматическим согласованием + + + + + Hash + Хэш + + + + SHA512 + SHA512 + + + + SHA384 + SHA384 + + + + SHA256 + SHA256 + + + + SHA3-512 + SHA3-512 - - Hash - - - - - SHA512 - - - - - SHA384 - - - - - SHA256 - - - - - SHA3-512 - - - - SHA3-384 - + SHA3-384 - + SHA3-256 - + SHA3-256 - + whirlpool - + whirlpool - + BLAKE2b512 - + BLAKE2b512 - + BLAKE2s256 - + BLAKE2s256 - + SHA1 - + SHA1 + + + + + Cipher + Шифрование + + + + AES-256-GCM + AES-256-GCM + + + + AES-192-GCM + AES-192-GCM + + + + AES-128-GCM + AES-128-GCM + + + + AES-256-CBC + AES-256-CBC + + + + AES-192-CBC + AES-192-CBC + + + + AES-128-CBC + AES-128-CBC - - Cipher - - - - - AES-256-GCM - - - - - AES-192-GCM - - - - - AES-128-GCM - - - - - AES-256-CBC - - - - - AES-192-CBC - - - - - AES-128-CBC - - - - ChaCha20-Poly1305 - + ChaCha20-Poly1305 - + ARIA-256-CBC - + ARIA-256-CBC - + CAMELLIA-256-CBC - + CAMELLIA-256-CBC - + none - + none - + TLS auth - + TLS авторизация - + Block DNS requests outside of VPN - + Блокировать DNS запросы за пределами VPN - + Additional client configuration commands - + Дополнительные команды конфигурации клиента - - + + Commands: - + Commands: - + Additional server configuration commands - + Дополнительные команды конфигурации сервера - + Remove OpenVPN - + Удалить OpenVPN - + Remove OpenVpn from server? - + Удалить OpenVpn с сервера? - + All users with whom you shared a connection will no longer be able to connect to it. - + Все пользователи, с которыми вы поделились этим VPN-протоколом, больше не смогут к нему подключаться. - + All users who you shared a connection with will no longer be able to connect to it. + Все пользователи, с которыми вы поделились этим VPN-протоколом, больше не смогут к нему подключаться. + + + Continue - + Продолжить - + Cancel - + Отменить - + Save and Restart Amnezia - + Сохранить и перезагрузить @@ -576,66 +625,77 @@ Already installed containers were found on the server. All installed containers settings - + настройки Show connection options - + Показать параметры подключения - + Connection options %1 - + Параметры подключения %1 + + + + Remove + Удалить + + + + Remove %1 from server? + Удалить %1 с сервера? + + + + All users with whom you shared a connection will no longer be able to connect to it. + Все пользователи, с которыми вы поделились этим VPN-протоколом, больше не смогут к нему подключаться. + + + All users who you shared a connection with will no longer be able to connect to it. + Все пользователи, с которыми вы поделились этим VPN-протоколом, больше не смогут к нему подключаться. - Remove - - - - - Remove %1 from server? - - - - - All users with whom you shared a connection will no longer be able to connect to it. - - - - Continue - + Продолжить - + Cancel - + Отменить PageProtocolShadowSocksSettings - + ShadowSocks settings - + Настройки ShadowSocks - + Port - + Порт - - + + Cipher - + Шифрование - + Save and Restart Amnezia - + Сохранить и перезагрузить Amnezia + + + + PageServerContainers + + Continue + Продолжить @@ -644,32 +704,33 @@ Already installed containers were found on the server. All installed containers A DNS service is installed on your server, and it is only accessible via VPN. - + На вашем сервере установлен DNS-сервис, доступ к нему возможен только через VPN. + The DNS address is the same as the address of your server. You can configure DNS in the settings, under the connections tab. - + Адрес DNS совпадает с адресом вашего сервера. Настроить DNS можно во вкладке "Соединения" настроек приложения Remove - + Удалить Remove %1 from server? - + Удалить %1 с сервера? Continue - + Продолжить Cancel - + Отменить @@ -677,17 +738,17 @@ Already installed containers were found on the server. All installed containers Settings updated successfully - + Настройки успешно обновлены SFTP settings - + Настройки SFTP Host - + Хост @@ -695,69 +756,69 @@ Already installed containers were found on the server. All installed containers Copied - + Скопировано Port - + Порт Login - + Логин Password - + Пароль Mount folder on device - + Смонтировать папку на вашем устройстве In order to mount remote SFTP folder as local drive, perform following steps: <br> - + Чтобы смонтировать SFTP-папку как локальный диск на вашем устройстве, выполните следующие действия <br>1. Install the latest version of - + <br>1. Установите последнюю версию <br>2. Install the latest version of - + <br>2. Установите последнюю версию Detailed instructions - + Подробные инструкции Remove SFTP and all data stored there - + Удалить SFTP-хранилище со всеми данными Remove SFTP and all data stored there? - + Удалить SFTP-хранилище и все хранящиеся на нем данные? Continue - + Продолжить Cancel - + Отменить @@ -765,22 +826,22 @@ Already installed containers were found on the server. All installed containers Settings updated successfully - + Настройки успешно обновлены Tor website settings - + Настройки сайта в сети Тоr Website address - + Адрес сайта Copied - + Скопировано @@ -803,27 +864,31 @@ Already installed containers were found on the server. All installed containers When configuring WordPress set the this onion address as domain. - + При настройке WordPress укажите этот onion адрес в качестве домена. + + + When configuring WordPress set the this address as domain. + При настройке WordPress укажите этот onion адрес в качестве домена. Remove website - + Удалить сайт The site with all data will be removed from the tor network. - + Сайт со всеми данными будет удален из сети Tor. Continue - + Продолжить Cancel - + Отменить @@ -831,41 +896,45 @@ Already installed containers were found on the server. All installed containers Settings - + Настройки Servers - + Серверы Connection - + Соединение Application - + Приложение Backup - + Резервное копирование About AmneziaVPN - + Об AmneziaVPN Close application - + Закрыть приложение PageSettingsAbout + + Support the project with a donation + Поддержите проект пожертвованием + Support Amnezia @@ -874,87 +943,87 @@ Already installed containers were found on the server. All installed containers This is a free and open source application. If you like it, support the developers with a donation. - + Это бесплатное приложение с открытым исходным кодом. Если, оно вам нравится - поддержите разработчиков пожертвованием. And if you don’t like the application, all the more reason to support it - the donation will be used for the improving the application. - + А, если оно вам не нравится, тем более поддержите-пожертвование пойдет на улучшение приложения. Card on Patreon - + Картой на Patreon https://www.patreon.com/amneziavpn - + https://www.patreon.com/amneziavpn Show other methods on Github - + Показать другие способы на Github - + https://github.com/amnezia-vpn/amnezia-client#donate - + Contacts - + Контакты - + Telegram group - + Группа в Telegram - + To discuss features - + Для обсуждений - + https://t.me/amnezia_vpn_en - + https://t.me/amnezia_vpn - + Mail - + Почта - + For reviews and bug reports - + Для отзывов и сообщений об ошибках - + Github - + Github - + https://github.com/amnezia-vpn/amnezia-client - + https://github.com/amnezia-vpn/amnezia-client - + Website - + Веб-сайт - + https://amnezia.org - + https://amnezia.org - + Check for updates - + Проверить обновления @@ -962,151 +1031,151 @@ Already installed containers were found on the server. All installed containers Application - + Приложение Allow application screenshots - + Разрешить скриншоты приложения Auto start - + Автозапуск Launch the application every time the device is starts - + Открывать приложение при запуске устройства Start minimized - + Запускать в свернутом виде Launch application minimized - + Запускать приложение в свернутом виде Language - + Язык - + Logging - + Логирование - + Enabled - + Включено - + Disabled - - - - - Reset settings and remove all data from the application - + Отключено + Reset settings and remove all data from the application + Сбросить настройки и удалить все данные из приложения + + + Reset settings and remove all data from the application? - + Сбросить настройки и удалить все данные из приложения? - + All settings will be reset to default. All installed AmneziaVPN services will still remain on the server. - + Все данные из приложения будут удалены, все установленные сервисы AmneziaVPN останутся на сервере. - + Continue - + Продолжить - + Cancel - + Отменить PageSettingsBackup - - - Settings restored from backup file - - Backup - + Резервное копирование + + + + Settings restored from backup file + Восстановление настроек из бэкап файла Configuration backup - + Бэкап конфигурация You can save your settings to a backup file to restore them the next time you install the application. - + Поможет мгновенно восстановить настройки соединений при следующей установке. Make a backup - + Сделать бэкап Save backup file - + Сохранить бэкап файл Backup files (*.backup) - + Файлы резервного копирования (*.backup) Backup file saved - + Бэкап файл сохранен Restore from backup - + Восстановить из бэкапа Open backup file - + Открыть бэкап файл Import settings from a backup file? - + Импортировать настройки из бэкап файла? All current settings will be reset - + Все текущие настройки будут сброшены Continue - + Продолжить Cancel - + Отменить @@ -1114,22 +1183,22 @@ Already installed containers were found on the server. All installed containers Connection - + Соединение Auto connect - + Автоподключение Connect to VPN on app start - + Подключение к VPN при запуске приложения Use AmneziaDNS - + Использовать Amnezia DNS @@ -1139,7 +1208,7 @@ Already installed containers were found on the server. All installed containers DNS servers - + DNS сервер @@ -1158,35 +1227,34 @@ Already installed containers were found on the server. All installed containers Site-based split tunneling - + Раздельное туннелирование сайтов Allows you to select which sites you want to access through the VPN - + Позволяет подключаться к одним сайтам через VPN, а к другим в обход него App-based split tunneling - + Раздельное VPN-туннелирование приложений - - Allows you to use the VPN only for certain Apps - + Allows you to use the VPN only for certain applications + Позволяет использовать VPN только для определённых приложений PageSettingsDns - + Default server does not support custom dns - + DNS servers - + DNS сервер @@ -1194,49 +1262,49 @@ Already installed containers were found on the server. All installed containers Эти адреса будут использоваться, если не включен или не установлен AmneziaDNS - + Primary DNS - + Первичный DNS - + Secondary DNS - + Вторичный DNS - + Restore default - + Восстановить по умолчанию - + Restore default DNS settings? - + Восстановить настройки DNS по умолчанию? - + Continue - + Продолжить - + Cancel - + Отменить - + Settings have been reset - + Настройки сброшены - + Save - + Сохранить - + Settings saved - + Сохранить настройки @@ -1244,62 +1312,62 @@ Already installed containers were found on the server. All installed containers Logging - + Логирование Save logs - + Сохранять логи Open folder with logs - + Открыть папку с логами Save - + Сохранить Logs files (*.log) - + Logs files (*.log) Logs file saved - + Файл с логами сохранен Save logs to file - + Сохранить логи в файл Clear logs? - + Очистить логи? Continue - + Продолжить Cancel - + Отменить - + Logs have been cleaned up - + Логи удалены - + Clear logs - + Удалить логи @@ -1307,73 +1375,71 @@ Already installed containers were found on the server. All installed containers All installed containers have been added to the application - - - - - No new installed containers found - + Все установленные протоколы и сервисы были добавлены в приложение Clear Amnezia cache - + Очистить кэш Amnezia May be needed when changing other settings - + Может понадобиться при изменении других настроек Clear cached profiles? - + Удалить кэш Amnezia? - + + No new installed containers found + Новые установленные протоколы и сервисы не обнаружены + + + - - - - + + + Continue - + Продолжить - - - - + + + Cancel - - - - - Check the server for previously installed Amnezia services - + Отменить - Add them to the application if they were not displayed - + Check the server for previously installed Amnezia services + Проверить сервер на наличие ранее установленных сервисов Amnezia - + + Add them to the application if they were not displayed + Добавить их в приложение, если они не были отображены + + + Reboot server Перезагрузить сервер - + Do you want to reboot the server? Вы уверены, что хотите перезагрузить сервер? - + The reboot process may take approximately 30 seconds. Are you sure you wish to proceed? Процесс перезагрузки может занять около 30 секунд. Вы уверены, что хотите продолжить? @@ -1388,62 +1454,60 @@ Already installed containers were found on the server. All installed containers Вы хотите очистить сервер от всех сервисов Amnezia? - + + Remove server from application + Удалить сервер из приложения + + + Remove server? + Удалить сервер? + + + All installed AmneziaVPN services will still remain on the server. - + Все установленные сервисы и протоколы Amnezia всё ещё останутся на сервере. - + Clear server from Amnezia software - + Очистить сервер от протоколов и сервисов Amnezia - - Do you want to clear server from Amnezia software? - + Clear server from Amnezia software? + Удалить все сервисы и протоколы Amnezia с сервера? - + All containers will be deleted on the server. This means that configuration files, keys and certificates will be deleted. - - - - - Reset API config - - - - - Do you want to reset API config? - + На сервере будут удалены все данные, связанные с Amnezia: протоколы, сервисы, конфигурационные файлы, ключи и сертификаты. PageSettingsServerInfo - + Server name - + Имя сервера - + Save - + Сохранить - + Protocols - + Протоколы - + Services - + Сервисы - + Data - + Данные @@ -1451,32 +1515,36 @@ Already installed containers were found on the server. All installed containers settings - + настройки Remove - + Удалить Remove %1 from server? - + Удалить %1 с сервера? All users with whom you shared a connection will no longer be able to connect to it. - + Все пользователи, с которыми вы поделились этим VPN-протоколом, больше не смогут к нему подключаться. + + + All users who you shared a connection with will no longer be able to connect to it. + Все пользователи, которым вы поделились VPN, больше не смогут к нему подключаться. Continue - + Продолжить Cancel - + Отменить @@ -1484,13 +1552,13 @@ Already installed containers were found on the server. All installed containers Servers - + Серверы PageSettingsSplitTunneling - + Default server does not support split tunneling function @@ -1499,32 +1567,32 @@ Already installed containers were found on the server. All installed containers Только адреса из списка должны открываться через VPN - + Addresses from the list should not be accessed via VPN - + Адреса из списка не должны открываться через VPN - + Split tunneling - + Раздельное VPN-туннелирование - + Mode - + Режим - + Remove - + Удалить - + Continue - + Продолжить - + Cancel Отменить @@ -1547,52 +1615,52 @@ Already installed containers were found on the server. All installed containers - + Import / Export Sites - + Import - + Импорт - + Save site list - + Сохранить список сайтов - + Save sites - + Сохранить + + + + + + Sites files (*.json) + Sites files (*.json) + + + + Import a list of sites + Импортировать список с сайтами + + + + Replace site list + Заменить список сайтов - - Sites files (*.json) - - - - - Import a list of sites - - - - - Replace site list - - - - - Open sites file - + Открыть список с сайтами - + Add imported sites to existing ones - + Добавить импортированные сайты к существующим @@ -1600,102 +1668,121 @@ Already installed containers were found on the server. All installed containers Server connection - + Подключение к серверу Do not use connection code from public sources. It may have been created to intercept your data. It's okay as long as it's from someone you trust. - + Не используйте код подключения из публичных источников. Его могли создать, чтобы перехватывать ваши данные.. + +Всё в порядке, если кодом поделился пользователь, которому вы доверяете. What do you have? - - - - - File with connection settings or backup - + Выберете что у вас есть File with connection settings - + Файл с настройками подключения + + + + File with connection settings or backup + Файл с настройками подключения или бэкап Open config file - + Открыть файл с конфигурацией QR-code - + QR-код Key as text - + Ключ в виде текста PageSetupWizardCredentials - - Configure your server - + Server connection + Подключение к серверу - + Server IP address [:port] - + Server IP address [:port] - + 255.255.255.255:88 + 255.255.255.255:88 + + + Password / SSH private key + Password / SSH private key + + + + Continue + Продолжить + + + All data you enter will remain strictly confidential +and will not be shared or disclosed to the Amnezia or any third parties + Все данные, которые вы вводите, останутся строго конфиденциальными и не будут переданы или раскрыты Amnezia или каким-либо третьим сторонам + + + + Enter the address in the format 255.255.255.255:88 + Введите адрес в формате 255.255.255.255:88 + + + + Login to connect via SSH + Login to connect via SSH + + + + Configure your server + Настроить ваш сервер + + + 255.255.255.255:22 - - Login to connect via SSH - - - - + Password or SSH private key - - Continue - - - - + All data you enter will remain strictly confidential and will not be shared or disclosed to the Amnezia or any third parties - + Все введенные вами данные останутся строго конфиденциальными и не будут переданы или раскрыты Amnezia или третьим лицам - + Ip address cannot be empty - + Поле Ip address не может быть пустым - - Enter the address in the format 255.255.255.255:88 - - - - + Login cannot be empty - + Поле Login не может быть пустым - + Password/private key cannot be empty - + Поле Password/private key не может быть пустым @@ -1703,99 +1790,107 @@ It's okay as long as it's from someone you trust. What is the level of internet control in your region? - + Какой уровень контроля интернета в вашем регионе? Set up a VPN yourself - + Настроить VPN самостоятельно I want to choose a VPN protocol - + Выбрать VPN-протокол Continue - + Продолжить - + Set up later - + Настроить позднее PageSetupWizardInstalling - - - - Usually it takes no more than 5 minutes - - The server has already been added to the application - + Сервер уже был добавлен в приложение + + + Amnesia has detected that your server is currently + Amnesia обнаружила, что ваш сервер в настоящее время + + + busy installing other software. Amnesia installation + занят установкой других протоколов или сервисов. Установка Amnesia Amnezia has detected that your server is currently - + Amnezia обнаружила, что ваш сервер в настоящее время busy installing other software. Amnezia installation - + занят установкой другого программного обеспечения. Установка Amnezia will pause until the server finishes installing other software - + будет приостановлена до тех пор, пока сервер не завершит установку Installing - + Установка Cancel installation + + + + Usually it takes no more than 5 minutes + Обычно это занимает не более 5 минут + PageSetupWizardProtocolSettings - + Installing %1 - + Установить %1 - + More detailed - + Подробнее - + Close - + Закрыть - + Network protocol - + Сетевой протокол - + Port - + Порт - + Install - + Установить @@ -1803,12 +1898,12 @@ It's okay as long as it's from someone you trust. VPN protocol - + VPN протокол Choose the one with the highest priority for you. Later, you can install other protocols and additional services, such as DNS proxy and SFTP. - + Выберите протокол, который вам больше подходит. В дальнейшем можно установить другие протоколы и дополнительные сервисы, такие как DNS-прокси, TOR-сайт и SFTP. @@ -1816,7 +1911,7 @@ It's okay as long as it's from someone you trust. Point the camera at the QR code and hold for a couple of seconds. - + Наведите камеру на QR-код и удерживайте ее в течение нескольких секунд. @@ -1824,30 +1919,30 @@ It's okay as long as it's from someone you trust. Settings restored from backup file - + Восстановление настроек из бэкап файла Free service for creating a personal VPN on your server. - + Простое и бесплатное приложение для запуска self-hosted VPN с высокими требованиями к приватности. Helps you access blocked content without revealing your privacy, even to VPN providers. - + Помогает получить доступ к заблокированному контенту, не раскрывая вашу конфиденциальность даже провайдерам VPN. I have the data to connect - + У меня есть данные для подключения I have nothing - + У меня ничего нет - + https://amnezia.org/instructions/0_starter-guide @@ -1855,180 +1950,173 @@ It's okay as long as it's from someone you trust. PageSetupWizardTextKey - + Connection key - + Ключ для подключения - + A line that starts with vpn://... - + Строка, которая начинается с vpn://... + + + + Key + Ключ - Key - - - - Insert - + Вставить - + Continue - + Продолжить PageSetupWizardViewConfig - + New connection - + Новое соединение - + Do not use connection code from public sources. It could be created to intercept your data. - + Не используйте код подключения из публичных источников. Его могли создать, чтобы перехватывать ваши данные. - + Collapse content - + Свернуть - + Show content - + Показать содержимое ключа - + Connect - + Подключиться PageShare - + + OpenVpn native format + OpenVpn нативный формат + + + + WireGuard native format + WireGuard нативный формат + + + VPN Access + VPN-Доступ + + + + Connection + Соединение + + + VPN access without the ability to manage the server + Доступ к VPN, без возможности управления сервером + + + Access to server management. The user with whom you share full access to the connection will be able to add and remove your protocols and services to the server, as well as change settings. + Доступ к управлению сервером. Пользователь, с которым вы делитесь полным доступом к соединению, сможет добавлять и удалять ваши протоколы и службы на сервере, а также изменять настройки. + + + + + Server + Сервер + + + Accessing + Доступ + + + Config revoked - + Connection to - + Подключение к - + File with connection settings to - + Файл с настройками доступа к Save OpenVPN config - + Сохранить OpenVPN config Save WireGuard config - + Сохранить WireGuard config Save ShadowSocks config - + Сохранить конфигурацию ShadowSocks Save Cloak config - - - - - For the AmneziaVPN app - + Сохранить конфигурацию Cloak - OpenVpn native format - - - - - WireGuard native format - - - - - ShadowSocks native format - + For the AmneziaVPN app + Для AmneziaVPN + ShadowSocks native format + ShadowSocks нативный формат + + + Cloak native format - + Cloak нативный формат - + Share VPN Access - + Поделиться VPN - + Share full access to the server and VPN - + Поделиться полным доступом к серверу - + Use for your own devices, or share with those you trust to manage the server. - + Используйте для собственных устройств или передайте управление сервером тем, кому вы доверяете. - - - Share - - - - - Connection - - - - + Users - + Пользователи - - Share VPN access without the ability to manage the server - - - - + User name - - - - - - Server - - - - - - Protocol - - - - - - Connection format - + Имя пользователя @@ -2036,49 +2124,76 @@ It's okay as long as it's from someone you trust. - + Creation date: Дата создания - + Rename - + Переименовать - + Client name - + Save - + Сохранить - + Revoke - + Отозвать - + Revoke the config for a user - %1? - + Отозвать доступ для пользователя - %1? - + The user will no longer be able to connect to your server. - + Пользователь больше не сможет подключаться к вашему серверу - + Continue - + Продолжить - + Cancel - + Отменить + + + Full access + Полный доступ + + + + Share VPN access without the ability to manage the server + Поделиться доступом к VPN, без возможности управления сервером + + + + + Protocol + Протокол + + + + + Connection format + Формат подключения + + + + + Share + Поделиться @@ -2086,49 +2201,49 @@ It's okay as long as it's from someone you trust. Full access to the server and VPN - + Полный доступ к серверу и VPN We recommend that you use full access to the server only for your own additional devices. - + Мы рекомендуем использовать полный доступ к серверу только для собственных устройств. If you share full access with other people, they can remove and add protocols and services to the server, which will cause the VPN to work incorrectly for all users. - + Если вы поделитесь полным доступом с другими людьми, то они смогут удалять и добавлять протоколы и сервисы на сервер, что приведет к некорректной работе VPN для всех пользователей. + - Server - + Сервер + + + + Accessing + Доступ - Accessing - - - - File with accessing settings to - + Share - + Поделиться + + + + Connection to + Подключение к - Connection to - - - - File with connection settings to - + Файл с настройками доступа к @@ -2136,7 +2251,7 @@ It's okay as long as it's from someone you trust. Close - + Закрыть @@ -2144,38 +2259,38 @@ It's okay as long as it's from someone you trust. Password entry not found - + Password entry not found Could not decrypt data - + Could not decrypt data Unknown error - + Unknown error Could not open wallet: %1; %2 - + Could not open wallet: %1; %2 Password not found - + Password not found Could not open keystore - + Could not open keystore Could not remove private key from keystore - + Could not remove private key from keystore @@ -2183,12 +2298,12 @@ It's okay as long as it's from someone you trust. Unknown error - + Unknown error Access to keychain denied - + Access to keychain denied @@ -2196,27 +2311,27 @@ It's okay as long as it's from someone you trust. Could not store data in settings: access error - + Could not store data in settings: access error Could not store data in settings: format error - + Could not store data in settings: format error Could not delete data from settings: access error - + Could not delete data from settings: access error Could not delete data from settings: format error - + Could not delete data from settings: format error Entry not found - + Entry not found @@ -2224,80 +2339,80 @@ It's okay as long as it's from someone you trust. Password entry not found - + Password entry not found Could not decrypt data - + Could not decrypt data D-Bus is not running - + D-Bus is not running Unknown error - + Unknown error No keychain service available - + No keychain service available Could not open wallet: %1; %2 - + Could not open wallet: %1; %2 Access to keychain denied - + Access to keychain denied Could not determine data type: %1; %2 - + Could not determine data type: %1; %2 Entry not found - + Entry not found Unsupported entry type 'Map' - + Unsupported entry type 'Map' Unknown kwallet entry type '%1' - + Unknown kwallet entry type '%1' Password not found - + Password not found Could not open keystore - + Could not open keystore Could not retrieve private key from keystore - + Could not retrieve private key from keystore Could not create decryption cipher - + Could not create decryption cipher @@ -2305,387 +2420,309 @@ It's okay as long as it's from someone you trust. Credential size exceeds maximum size of %1 - + Credential size exceeds maximum size of %1 Credential key exceeds maximum size of %1 - + Credential key exceeds maximum size of %1 Writing credentials failed: Win32 error code %1 - + Writing credentials failed: Win32 error code %1 Encryption failed - + Encryption failed D-Bus is not running - + D-Bus is not running Unknown error - + Unknown error Could not open wallet: %1; %2 - + Could not open wallet: %1; %2 Password not found - + Password not found Could not open keystore - + Could not open keystore Could not create private key generator - + Could not create private key generator Could not generate new private key - + Could not generate new private key Could not retrieve private key from keystore - + Could not retrieve private key from keystore Could not create encryption cipher - + Could not create encryption cipher Could not encrypt data - + Could not encrypt data QObject - - - Sftp service - - No error - + No error Unknown Error - + Unknown Error Function not implemented - + Function not implemented Server check failed - + Server check failed Server port already used. Check for another software - + Server port already used. Check for another software Server error: Docker container missing - + Server error: Docker container missing Server error: Docker failed - + Server error: Docker failed Installation canceled by user - + Installation canceled by user The user does not have permission to use sudo - + The user does not have permission to use sudo Ssh request was denied - + Ssh request was denied Ssh request was interrupted - + Ssh request was interrupted Ssh internal error - + Ssh internal error Invalid private key or invalid passphrase entered - + Invalid private key or invalid passphrase entered The selected private key format is not supported, use openssh ED25519 key types or PEM key types - + The selected private key format is not supported, use openssh ED25519 key types or PEM key types Timeout connecting to server - + Timeout connecting to server Sftp error: End-of-file encountered - + Sftp error: End-of-file encountered Sftp error: File does not exist - + Sftp error: File does not exist Sftp error: Permission denied - + Sftp error: Permission denied Sftp error: Generic failure - + Sftp error: Generic failure Sftp error: Garbage received from server - + Sftp error: Garbage received from server Sftp error: No connection has been set up - + Sftp error: No connection has been set up Sftp error: There was a connection, but we lost it - + Sftp error: There was a connection, but we lost it Sftp error: Operation not supported by libssh yet - + Sftp error: Operation not supported by libssh yet Sftp error: Invalid file handle - + Sftp error: Invalid file handle Sftp error: No such file or directory path exists - + Sftp error: No such file or directory path exists Sftp error: An attempt to create an already existing file or directory has been made - + Sftp error: An attempt to create an already existing file or directory has been made Sftp error: Write-protected filesystem - + Sftp error: Write-protected filesystem Sftp error: No media was in remote drive - - - - - OpenVPN config missing - - - - - OpenVPN management server error - - - - - OpenVPN executable missing - - - - - ShadowSocks (ss-local) executable missing - - - - - Cloak (ck-client) executable missing - - - - - Amnezia helper service error - - - - - OpenSSL failed - - - - - Can't connect: another VPN connection is active - - - - - Can't setup OpenVPN TAP network adapter - - - - - VPN pool error: no available addresses - + Sftp error: No media was in remote drive The config does not contain any containers and credentials for connecting to the server + Конфиг не содержит контейнеров и учетных данных для подключения к серверу + + + + ErrorCode: %1. + + Failed to save config to disk + Failed to save config to disk + + + + OpenVPN config missing + OpenVPN config missing + + + + OpenVPN management server error + OpenVPN management server error + + + + OpenVPN executable missing + OpenVPN executable missing + + + + ShadowSocks (ss-local) executable missing + ShadowSocks (ss-local) executable missing + + + + Cloak (ck-client) executable missing + Cloak (ck-client) executable missing + + + + Amnezia helper service error + Amnezia helper service error + + + + OpenSSL failed + OpenSSL failed + + + + Can't connect: another VPN connection is active + Can't connect: another VPN connection is active + + + + Can't setup OpenVPN TAP network adapter + Can't setup OpenVPN TAP network adapter + + + + VPN pool error: no available addresses + VPN pool error: no available addresses + VPN connection error - - - Error when retrieving configuration from API - - - This config has already been added to the application - - - - Internal error - - - - - ErrorCode: %1. - + Internal error IPsec + IPsec + + + + ShadowSocks - masks VPN traffic, making it similar to normal web traffic, but it may be recognized by analysis systems in some highly censored regions. - - - Website in Tor network - - - - - Amnezia DNS - - - - - Sftp file sharing service - - - - - OpenVPN is the most popular VPN protocol, with flexible configuration options. It uses its own security protocol with SSL/TLS for key exchange. - - - - ShadowSocks - masks VPN traffic, making it similar to normal web traffic, but it may be recognised by analysis systems in some highly censored regions. - ShadowSocks - маскирует VPN-трафик под обычный веб-трафик, но распознается системами анализа в некоторых регионах с высоким уровнем цензуры. - - + 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. - OpenVPN over Cloak - OpenVPN с маскировкой VPN под web-трафик и защитой от обнаружения active-probbing. Подходит для регионов с самым высоким уровнем цензуры. - - - - WireGuard - New popular VPN protocol with high performance, high speed and low power consumption. Recommended for regions with low levels of censorship. - - - - - AmneziaWG - Special protocol from Amnezia, based on WireGuard. It's fast like WireGuard, but very resistant to blockages. Recommended for regions with high levels of censorship. - - - - - 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. - - - - - Deploy a WordPress site on the Tor network in two clicks. - - - - - Replace the current DNS server with your own. This will increase your privacy level. + Create a file vault on your server to securely store and transfer files. - Создайте на сервере файловое хранилище для безопасного хранения и передачи файлов. - - - - OpenVPN stands as one of the most popular and time-tested VPN protocols available. -It employs its unique security protocol, leveraging the strength of SSL/TLS for encryption and key exchange. Furthermore, OpenVPN's support for a multitude of authentication methods makes it versatile and adaptable, catering to a wide range of devices and operating systems. Due to its open-source nature, OpenVPN benefits from extensive scrutiny by the global community, which continually reinforces its security. With a strong balance of performance, security, and compatibility, OpenVPN remains a top choice for privacy-conscious individuals and businesses alike. - -* Available in the AmneziaVPN across all platforms -* Normal power consumption on mobile devices -* Flexible customisation to suit user needs to work with different operating systems and devices -* Recognised by DPI analysis systems and therefore susceptible to blocking -* Can operate over both TCP and UDP network protocols. - - - - - 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'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'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. @@ -2720,19 +2757,6 @@ WireGuard is very susceptible to blocking due to its distinct packet signatures. * Low power consumption * Minimum number of settings * Easily recognised by DPI analysis systems, susceptible to blocking -* Works over UDP network protocol. - - - - - A modern iteration of the popular VPN protocol, AmneziaWG builds upon the foundation set by WireGuard, retaining its simplified architecture and high-performance capabilities across devices. -While WireGuard is known for its efficiency, it had issues with being easily detected due to its distinct packet signatures. AmneziaWG solves this problem by using better obfuscation methods, making its traffic blend in with regular internet traffic. -This means that AmneziaWG keeps the fast performance of the original while adding an extra layer of stealth, making it a great choice for those wanting a fast and discreet VPN connection. - -* Available in the AmneziaVPN across all platforms -* Low power consumption -* Minimum number of settings -* Not recognised by DPI analysis systems, resistant to blocking * Works over UDP network protocol. @@ -2747,85 +2771,275 @@ While it offers a blend of security, stability, and speed, it's essential t * Minimal configuration * Recognised by DPI analysis systems * Works over UDP network protocol, ports 500 and 4500. - + IKEv2 в сочетании с уровнем шифрования IPSec это современный и стабильный протокол VPN. +Он может быстро переключаться между сетями и устройствами, что делает его особенно адаптивным в динамичных сетевых средах. +Несмотря на сочетание безопасности, стабильности и скорости, необходимо отметить, что IKEv2 легко обнаруживается и подвержен блокировке. + +* Доступно в AmneziaVPN только для Windows. +* Низкое энергопотребление, на мобильных устройствах +* Минимальная конфигурация +* Распознается системами DPI-анализа +* Работает по сетевому протоколу UDP, порты 500 и 4500. DNS Service - + DNS Сервис + + + + Sftp file sharing service + Сервис обмена файлами Sftp + + + + + Website in Tor network + Веб-сайт в сети Tor + + + + Amnezia DNS + Amnezia DNS + + + + OpenVPN is the most popular VPN protocol, with flexible configuration options. It uses its own security protocol with SSL/TLS for key exchange. + OpenVPN - популярный VPN-протокол, с гибкой настройкой. Имеет собственный протокол безопасности с SSL/TLS для обмена ключами. + + + ShadowSocks - masks VPN traffic, making it similar to normal web traffic, but it may be recognised by analysis systems in some highly censored regions. + ShadowSocks - маскирует VPN-трафик под обычный веб-трафик, но распознается системами анализа в некоторых регионах с высоким уровнем цензуры. + + + 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. + OpenVPN over Cloak - OpenVPN с маскировкой VPN под web-трафик и защитой от обнаружения active-probbing. Подходит для регионов с самым высоким уровнем цензуры. + + + + WireGuard - New popular VPN protocol with high performance, high speed and low power consumption. Recommended for regions with low levels of censorship. + WireGuard - Популярный VPN-протокол с высокой производительностью, высокой скоростью и низким энергопотреблением. Для регионов с низким уровнем цензуры. + + + + AmneziaWG - Special protocol from Amnezia, based on WireGuard. It's fast like WireGuard, but very resistant to blockages. Recommended for regions with high levels of censorship. + AmneziaWG - Специальный протокол от Amnezia, основанный на протоколе WireGuard. Он такой же быстрый, как WireGuard, но очень устойчив к блокировкам. Рекомендуется для регионов с высоким уровнем цензуры. + + + + 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. + IKEv2 Современный стабильный протокол, немного быстрее других восстанавливает соединение после потери сигнала. Имеет нативную поддержку последних версиий Android и iOS. + + + + Deploy a WordPress site on the Tor network in two clicks. + Разверните сайт на WordPress в сети Tor в два клика. + + + + Replace the current DNS server with your own. This will increase your privacy level. + Замените DNS-сервер на Amnezia DNS. Это повысит уровень конфиденциальности. + + + Create a file vault on your server to securely store and transfer files. + Создайте на сервере файловое хранилище для безопасного хранения и передачи файлов. + + + + OpenVPN stands as one of the most popular and time-tested VPN protocols available. +It employs its unique security protocol, leveraging the strength of SSL/TLS for encryption and key exchange. Furthermore, OpenVPN's support for a multitude of authentication methods makes it versatile and adaptable, catering to a wide range of devices and operating systems. Due to its open-source nature, OpenVPN benefits from extensive scrutiny by the global community, which continually reinforces its security. With a strong balance of performance, security, and compatibility, OpenVPN remains a top choice for privacy-conscious individuals and businesses alike. + +* Available in the AmneziaVPN across all platforms +* Normal power consumption on mobile devices +* Flexible customisation to suit user needs to work with different operating systems and devices +* Recognised by DPI analysis systems and therefore susceptible to blocking +* Can operate over both TCP and UDP network protocols. + OpenVPN однин из самых популярных и проверенных временем VPN-протоколов. +В нем используется уникальный протокол безопасности, опирающийся на протокол SSL/TLS для шифрования и обмена ключами. Кроме того, поддержка OpenVPN множества методов аутентификации делает его универсальным и адаптируемым к широкому спектру устройств и операционных систем. Благодаря открытому исходному коду OpenVPN подвергается тщательному анализу со стороны мирового сообщества, что постоянно повышает его безопасность. Благодаря оптимальному соотношению производительности, безопасности и совместимости OpenVPN остается лучшим выбором как для частных лиц, так и для компаний, заботящихся о конфиденциальности. + +* Доступность AmneziaVPN для всех платформ +* Нормальное энергопотребление на мобильных устройствах +* Гибкая настройка под нужды пользователя для работы с различными операционными системами и устройствами +* Распознается системами DPI-анализа и поэтому подвержен блокировке +* Может работать по сетевым протоколам TCP и UDP. + + + + 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'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'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. + Shadowsocks, создан на основе протокола SOCKS5, защищает соединение с помощью шифра AEAD. Несмотря на то, что протокол Shadowsocks разработан таким образом, чтобы быть незаметным и сложным для идентификации, он не идентичен стандартному HTTPS-соединению. Однако некоторые системы анализа трафика все же могут обнаружить соединение Shadowsocks. В связи с ограниченной поддержкой в Amnezia рекомендуется использовать протокол AmneziaWG, или OpenVPN over Cloak. + +* Доступен в AmneziaVPN только на ПК ноутбуках. +* Настраиваемый протокол шифрования +* Обнаруживается некоторыми DPI-системами +* Работает по сетевому протоколу TCP. + + + This is a combination of the OpenVPN protocol and the Cloak plugin designed specifically for blocking protection. + +OpenVPN provides a secure VPN connection by encrypting all Internet traffic between the client and the server. + +Cloak protects OpenVPN from detection and blocking. + +Cloak can modify packet metadata so that it completely masks VPN traffic as normal web traffic, and also protects the VPN from detection by Active Probing. This makes it very resistant to being detected + +Immediately after receiving the first data packet, Cloak authenticates the incoming connection. If authentication fails, the plugin masks the server as a fake website and your VPN becomes invisible to analysis systems. + +If there is a extreme level of Internet censorship in your region, we advise you to use only OpenVPN over Cloak from the first connection + +* Available in the AmneziaVPN across all platforms +* High power consumption on mobile devices +* Flexible settings +* Not recognised by DPI analysis systems +* Works over TCP network protocol, 443 port. + + OpenVPN over Cloak - это комбинация протокола OpenVPN и плагина Cloak, разработанного специально для защиты от блокировок. + +OpenVPN обеспечивает безопасное VPN-соединение за счет шифрования всего интернет-трафика между клиентом и сервером. + +Cloak защищает OpenVPN от обнаружения и блокировок. + +Cloak может изменять метаданные пакетов. Он полностью маскирует VPN-трафик под обычный веб-трафик, а также защищает VPN от обнаружения с помощью Active Probing. Это делает его очень устойчивым к обнаружению + +Сразу же после получения первого пакета данных Cloak проверяет подлинность входящего соединения. Если аутентификация не проходит, плагин маскирует сервер под поддельный сайт, и ваш VPN становится невидимым для аналитических систем. + +Если в вашем регионе существует экстремальный уровень цензуры в Интернете, мы советуем вам при первом подключении использовать только OpenVPN через Cloak + +* Доступность AmneziaVPN на всех платформах +* Высокое энергопотребление на мобильных устройствах +* Гибкие настройки +* Не распознается системами DPI-анализа +* Работает по сетевому протоколу TCP, 443 порт. + + + + A relatively new popular VPN protocol with a simplified architecture. +Provides stable VPN connection, high performance on all devices. Uses hard-coded encryption settings. WireGuard compared to OpenVPN has lower latency and better data transfer throughput. +WireGuard is very susceptible to blocking due to its distinct packet signatures. Unlike some other VPN protocols that employ obfuscation techniques, the consistent signature patterns of WireGuard packets can be more easily identified and thus blocked by advanced Deep Packet Inspection (DPI) systems and other network monitoring tools. + +* Available in the AmneziaVPN across all platforms +* Low power consumption +* Minimum number of settings +* Easily recognised by DPI analysis systems, susceptible to blocking +* Works over UDP network protocol. + WireGuard - относительно новый популярный VPN-протокол с упрощенной архитектурой. +Обеспечивает стабильное VPN-соединение, высокую производительность на всех устройствах. Использует жестко заданные настройки шифрования. WireGuard по сравнению с OpenVPN имеет меньшую задержку и лучшую пропускную способность при передаче данных. +WireGuard очень восприимчив к блокированию из-за особенностей сигнатур пакетов. В отличие от некоторых других VPN-протоколов, использующих методы обфускации, последовательные сигнатуры пакетов WireGuard легче выявляются и, соответственно, блокируются современными системами глубокой проверки пакетов (DPI) и другими средствами сетевого мониторинга. + +* Доступность AmneziaVPN для всех платформ +* Низкое энергопотребление +* Минимальное количество настроек +* Легко распознается системами DPI-анализа, подвержен блокировке +* Работает по сетевому протоколу UDP. + + + + A modern iteration of the popular VPN protocol, AmneziaWG builds upon the foundation set by WireGuard, retaining its simplified architecture and high-performance capabilities across devices. +While WireGuard is known for its efficiency, it had issues with being easily detected due to its distinct packet signatures. AmneziaWG solves this problem by using better obfuscation methods, making its traffic blend in with regular internet traffic. +This means that AmneziaWG keeps the fast performance of the original while adding an extra layer of stealth, making it a great choice for those wanting a fast and discreet VPN connection. + +* Available in the AmneziaVPN across all platforms +* Low power consumption +* Minimum number of settings +* Not recognised by DPI analysis systems, resistant to blocking +* Works over UDP network protocol. + AmneziaWG - усовершенствованная версия популярного VPN-протокола Wireguard. AmneziaWG опирается на фундамент, заложенный WireGuard, сохраняя упрощенную архитектуру и высокопроизводительные возможности работы на разных устройствах. +Хотя WireGuard известен своей эффективностью, у него были проблемы с обнаружением из-за характерных сигнатур пакетов. AmneziaWG решает эту проблему за счет использования более совершенных методов обфускации, благодаря чему его трафик сливается с обычным интернет-трафиком. +Таким образом, AmneziaWG сохраняет высокую производительность оригинала, добавляя при этом дополнительный уровень скрытности, что делает его отличным выбором для тех, кому нужно быстрое и незаметное VPN-соединение. + +* Доступность AmneziaVPN на всех платформах +* Низкое энергопотребление +* Минимальное количество настроек +* Не распознается системами DPI-анализа, устойчив к блокировке +* Работает по сетевому протоколу UDP. + + + AmneziaWG container + AmneziaWG протокол Sftp file sharing service - is secure FTP service - + Файловое хранилище для безопасного хранения данных + + + + Sftp service + Сервис SFTP Entry not found - + Entry not found Access to keychain denied - + Access to keychain denied No keyring daemon - + No keyring daemon Already unlocked - + Already unlocked No such keyring - + No such keyring Bad arguments - + Bad arguments I/O error - + I/O error Cancelled - + Cancelled Keyring already exists - + Keyring already exists No match - + No match Unknown error - + Unknown error error 0x%1: %2 - + error 0x%1: %2 SelectLanguageDrawer - + Choose language - + Выберите язык @@ -2833,78 +3047,76 @@ While it offers a blend of security, stability, and speed, it's essential t Server #1 - + Server #1 Server - + Server SettingsController - + Software version - + Версия ПО - - Backup file is corrupted - - - - + All settings have been reset to default values - + Все настройки были сброшены к значению "По умолчанию" - + Cached profiles cleared - + Кэш профиля очищен + + + + Backup file is corrupted + Backup файл поврежден ShareConnectionDrawer - + Save AmneziaVPN config - + Сохранить config AmneziaVPN - + Share - + Поделиться - + Copy - + Скопировать - - - - + + Copied - + Скопировано - + Copy config string - + Show connection settings - + Показать настройки подключения - + To read the QR code in the Amnezia app, select "Add server" → "I have data to connect" → "QR code, key or settings file" - + Для считывания QR-кода в приложении Amnezia выберите "Добавить сервер" → "У меня есть данные для подключения" → "QR-код, ключ или файл настроек" @@ -2912,42 +3124,42 @@ While it offers a blend of security, stability, and speed, it's essential t Hostname not look like ip adress or domain name - + Имя хоста не похоже на ip-адрес или доменное имя New site added: %1 - + Добавлен новый сайт %1 Site removed: %1 - + Сайт удален %1 Can't open file: %1 - + Невозможно открыть файл: %1 Failed to parse JSON data from file: %1 - + Не удалось разобрать JSON-данные из файла: %1 The JSON data is not an array in file: %1 - + Данные JSON не являются массивом в файле: %1 Import completed - + Импорт завершен Export completed - + Экспорт завершен @@ -2956,39 +3168,39 @@ While it offers a blend of security, stability, and speed, it's essential t Show - + Показать Connect - + Подключиться Disconnect - + Отключиться Visit Website - + Посетить сайт Quit - + Закрыть TextFieldWithHeaderType - + The field can't be empty - + Поле не может быть пустым @@ -2996,7 +3208,7 @@ While it offers a blend of security, stability, and speed, it's essential t Mbps - + Mbps @@ -3004,42 +3216,42 @@ While it offers a blend of security, stability, and speed, it's essential t Unknown - + Неизвестный Disconnected - + Отключен Preparing - + Подготовка Connecting... - + Подключение... Connected - + Подключено Disconnecting... - + Отключение... Reconnecting... - + Переподключение... Error - + Ошибка @@ -3047,45 +3259,65 @@ While it offers a blend of security, stability, and speed, it's essential t Low - + Низкий Medium or High - + Средний или Высокий Extreme - + Экстремальный I just want to increase the level of my privacy. - + Я просто хочу повысить уровень своей приватности. I want to bypass censorship. This option recommended in most cases. - + Я хочу обойти блокировки. Этот вариант рекомендуется в большинстве случаев. Most VPN protocols are blocked. Recommended if other options are not working. - + Большинство VPN протоколов заблокированы. Рекомендуется, если другие варианты не работают. + + + High + Высокий + + + Medium + Средний + + + Many foreign websites and VPN providers are blocked + Многие иностранные сайты и VPN-провайдеры заблокированы + + + Some foreign sites are blocked, but VPN providers are not blocked + Некоторые иностранные сайты заблокированы, но VPN-провайдеры не блокируются + + + I just want to increase the level of privacy + Хочу просто повысить уровень приватности main2 - + Private key passphrase - + Кодовая фраза для закрытого ключа - + Save - + Сохранить diff --git a/client/translations/amneziavpn_zh_CN.ts b/client/translations/amneziavpn_zh_CN.ts index 720d7ce3..1f400b99 100644 --- a/client/translations/amneziavpn_zh_CN.ts +++ b/client/translations/amneziavpn_zh_CN.ts @@ -2,68 +2,103 @@ - ConnectionController + AmneziaApplication - - - - - Connect + Split tunneling for WireGuard is not implemented, the option was disabled + 未启用选项,还未实现基于WireGuard协议的VPN分离 + + + + AndroidController + + VPN Connected + Refers to the app - which is currently running the background and waiting + VPN已连接 + + + + ApiController + + + Error when retrieving configuration from cloud server + + + ConnectionController - + + + + + Connect + 连接 + + + VPN Protocols is not installed. Please install VPN container at first - + 请先安装VPN协议 + + + + Connection... + 连接中 - Connection... - - - - Connected - + 已连接 - + Reconnection... - + 重连中 - + Disconnection... - + 断开中 - + Settings updated successfully, Reconnnection... - + 配置已更新,重连中 - + Settings updated successfully - + 配置更新成功 ConnectionTypeSelectionDrawer - + Connection data + 连接方式 + + + Add new connection - + 添加新连接 - + Configure your server - + 配置您的服务器 - + Open config file, key or QR code - + 配置文件,授权码或二维码 + + + Server IP, login and password + 服务器IP,用户名和密码 + + + QR code, key or configuration file + 二维码,授权码或者配置文件 @@ -71,22 +106,22 @@ C&ut - + 剪切 &Copy - + 拷贝 &Paste - + 粘贴 &SelectAll - + 全选 @@ -94,60 +129,73 @@ Access error! - + 访问错误 HomeContainersListView - + Unable change protocol while there is an active connection - + 已建立连接时无法更改服务器配置 - + The selected protocol is not supported on the current platform - + 当前平台不支持所选协议 + + + Reconnect via VPN Procotol: + 重连VPN基于协议: ImportController - + Scanned %1 of %2. - + 扫描 %1 of %2. InstallController + + installed successfully. + 安装成功 + + + is already installed on the server. + 已安装在服务器上 + %1 installed successfully. - + %1 安装成功。 %1 is already installed on the server. - + 服务器上已经安装 %1。 Added containers that were already installed on the server - + 添加已安装在服务器上的容器 Already installed containers were found on the server. All installed containers have been added to the application - + +在服务上发现已经安装协议并添加至应用 Settings updated successfully - + 配置更新成功 @@ -157,27 +205,43 @@ Already installed containers were found on the server. All installed containers Server '%1' was removed - + 已移除服务器 '%1' All containers from server '%1' have been removed - + 服务器 '%1' 的所有容器已移除 %1 has been removed from the server '%2' - + %1 已从服务器 '%2' 上移除 + + + 1% has been removed from the server '%2' + %1 已从服务器 '%2' 上移除 + + + Server ' + 服务器 + + + ' was removed + 已经移除 + + + has been removed from the server ' + 协议已从 Please login as the user - + 请以用户身份登录 Server added successfully - + 增加服务器成功 @@ -185,17 +249,17 @@ Already installed containers were found on the server. All installed containers Read key failed: %1 - + 获取授权码失败: %1 Write key failed: %1 - + 写入授权码失败: %1 Delete key failed: %1 - + 删除授权码失败: %1 @@ -204,27 +268,27 @@ Already installed containers were found on the server. All installed containers AmneziaVPN - + VPN Connected - + 已连接到VPN VPN Disconnected - + 已从VPN断开 AmneziaVPN notification - + AmneziaVPN 提示 Unsecured network detected: - + 发现不安全网络 @@ -232,343 +296,359 @@ Already installed containers were found on the server. All installed containers Removing services from %1 - + 正从 %1 移除服务 Usually it takes no more than 5 minutes - + 大约5分钟之内完成 PageHome - + VPN protocol - + VPN协议 - + Servers - + 服务器 - + Unable change server while there is an active connection - + 已建立连接时无法更改服务器配置 PageProtocolAwgSettings - + AmneziaWG settings - + AmneziaWG 配置 - + Port - + 端口 - + Junk packet count - + 垃圾包数量 - + Junk packet minimum size - + 垃圾包最小值 - + Junk packet maximum size - + 垃圾包最大值 - + Init packet junk size - + 初始化垃圾包大小 - + Response packet junk size - + 响应垃圾包大小 - + Init packet magic header - + 初始化数据包魔数头 - + Response packet magic header - + 响应包魔数头 - + Transport packet magic header - + 传输包魔数头 + + + + Underload packet magic header + 低负载数据包魔数头 + + + + Remove AmneziaWG + 移除AmneziaWG + + + + Remove AmneziaWG from server? + 从服务上移除AmneziaWG? - Underload packet magic header - - - - - Remove AmneziaWG - - - - - Remove AmneziaWG from server? - - - - All users with whom you shared a connection will no longer be able to connect to it. - + 与您共享连接的所有用户将无法再连接到该连接。 - + All users who you shared a connection with will no longer be able to connect to it. + 使用此共享连接的所有用户,将无法再连接它。 + + + Continue - + 继续 - + Cancel - + 取消 - + Save and Restart Amnezia - + 保存并重启Amnezia PageProtocolCloakSettings - + Cloak settings - + Cloak 配置 - + Disguised as traffic from - + 伪装流量为 - + Port - + 端口 - - + + Cipher - + 加密算法 - + Save and Restart Amnezia - + 保存并重启Amnezia PageProtocolOpenVpnSettings - + OpenVPN settings - + OpenVPN 配置 - + VPN Addresses Subnet + VPN子网掩码 + + + VPN address subnet - + Network protocol - + 网络协议 - + Port - + 端口 - + Auto-negotiate encryption - + 自定义加密方式 + + + + + Hash + + + + + SHA512 + + + + + SHA384 + + + + + SHA256 + + + + + SHA3-512 + - - Hash - - - - - SHA512 - - - - - SHA384 - - - - - SHA256 - - - - - SHA3-512 - - - - SHA3-384 - + - + SHA3-256 - + - + whirlpool - + - + BLAKE2b512 - + - + BLAKE2s256 - + - + SHA1 - + + + + + + Cipher + + + + + AES-256-GCM + + + + + AES-192-GCM + + + + + AES-128-GCM + + + + + AES-256-CBC + + + + + AES-192-CBC + + + + + AES-128-CBC + - - Cipher - - - - - AES-256-GCM - - - - - AES-192-GCM - - - - - AES-128-GCM - - - - - AES-256-CBC - - - - - AES-192-CBC - - - - - AES-128-CBC - - - - ChaCha20-Poly1305 - + - + ARIA-256-CBC - + - + CAMELLIA-256-CBC - + - + none - + - + TLS auth - + TLS认证 - + Block DNS requests outside of VPN - + 阻止VPN外的DNS请求 - + Additional client configuration commands - + 附加客户端配置命令 - - + + Commands: - + 命令: - + Additional server configuration commands - + 附加服务器端配置命令 - + Remove OpenVPN - + 移除OpenVPN - + Remove OpenVpn from server? - + 从服务器移除OpenVPN吗? - + All users with whom you shared a connection will no longer be able to connect to it. - + 与您共享连接的所有用户将无法再连接到该连接。 - + All users who you shared a connection with will no longer be able to connect to it. + 使用此共享连接的所有用户,将无法再连接它。 + + + All users with whom you shared a connection will no longer be able to connect to it + 与您共享连接的所有用户将无法再连接到此链接 + + + Continue - + 继续 - + Cancel - + 取消 - + Save and Restart Amnezia - + 保存并重启Amnezia @@ -576,66 +656,82 @@ Already installed containers were found on the server. All installed containers settings - + 配置 Show connection options - + 显示连接选项 - + Connection options + 连接选项 + + + Connection options %1 - + %1 连接选项 + + + + Remove + 移除 + + + + Remove %1 from server? + 从服务器移除 %1 ? + + + + All users with whom you shared a connection will no longer be able to connect to it. + 与您共享连接的所有用户将无法再连接到该连接。 + + + All users who you shared a connection with will no longer be able to connect to it. + 使用此共享连接的所有用户,将无法再连接它。 + + + from server? + 从服务器 + + + All users with whom you shared a connection will no longer be able to connect to it + 与您共享连接的所有用户将无法再连接到此链接 - Remove - - - - - Remove %1 from server? - - - - - All users with whom you shared a connection will no longer be able to connect to it. - - - - Continue - + 继续 - + Cancel - + 取消 PageProtocolShadowSocksSettings - + ShadowSocks settings - + ShadowSocks 配置 - + Port - + 端口 - - + + Cipher - + 加密算法 - + Save and Restart Amnezia - + 保存并重启Amnezia @@ -644,32 +740,37 @@ Already installed containers were found on the server. All installed containers A DNS service is installed on your server, and it is only accessible via VPN. - + 您的服务器已安装DNS服务,仅能通过VPN访问。 + The DNS address is the same as the address of your server. You can configure DNS in the settings, under the connections tab. - + 其地址与您的服务器地址相同。您可以在 设置 连接 中进行配置。 Remove - + 移除 Remove %1 from server? - + 从服务器移除 %1 ? + + + from server? + 从服务器 Continue - + 继续 Cancel - + 取消 @@ -677,17 +778,17 @@ Already installed containers were found on the server. All installed containers Settings updated successfully - + 配置更新成功 SFTP settings - + SFTP 配置 Host - + 主机 @@ -695,69 +796,69 @@ Already installed containers were found on the server. All installed containers Copied - + 拷贝 Port - + 端口 Login - + 用户 Password - + 密码 Mount folder on device - + 挂载文件夹 In order to mount remote SFTP folder as local drive, perform following steps: <br> - + 为将远程 SFTP 文件夹挂载到本地,请执行以下步骤: <br> <br>1. Install the latest version of - + <br>1. 安装最新版的 <br>2. Install the latest version of - + <br>2. 安装最新版的 Detailed instructions - + 详细说明 Remove SFTP and all data stored there - + 移除SFTP和其本地所有数据 Remove SFTP and all data stored there? - + 移除SFTP和其本地所有数据? Continue - + 继续 Cancel - + 取消 @@ -765,22 +866,22 @@ Already installed containers were found on the server. All installed containers Settings updated successfully - + 配置更新成功 Tor website settings - + Tor网站配置 Website address - + 网址 Copied - + 已拷贝 @@ -792,30 +893,42 @@ Already installed containers were found on the server. All installed containers After creating your onion site, it takes a few minutes for the Tor network to make it available for use. + + Use <a href="https://www.torproject.org/download/" style="color: #FBB26A;">Tor Browser</a> to open this url. + 用 <a href="https://www.torproject.org/download/" style="color: #FBB26A;">Tor 浏览器</a> 打开上面网址 + + + After installation it takes several minutes while your onion site will become available in the Tor Network. + 完成安装几分钟后,洋葱站点才会在 Tor 网络中生效。 + When configuring WordPress set the this onion address as domain. - + 配置 WordPress 时,将此洋葱地址设置为域。 + + + When configuring WordPress set the domain as this onion address. + 配置 WordPress 时,将域设置为此洋葱地址。 Remove website - + 移除网站 The site with all data will be removed from the tor network. - + 网站及其所有数据将从 Tor 网络中删除 Continue - + 继续 Cancel - + 取消 @@ -823,41 +936,51 @@ Already installed containers were found on the server. All installed containers Settings - + 设置 Servers - + 服务器 Connection - + 连接 Application - + 应用 Backup - + 备份 About AmneziaVPN - + 关于 Close application - + 关闭应用 PageSettingsAbout + + Support the project with a donation + 捐款 + + + This is a free and open source application. If you like it, support the developers with a donation. +And if you don't like the app, all the more support it - the donation will be used to improve the app. + 这是一个免费且开源的应用软件。如果您喜欢它,请捐助支持我们继续研发。 +如果您不喜欢,请捐助支持我们改进它。 + Support Amnezia @@ -866,87 +989,88 @@ Already installed containers were found on the server. All installed containers This is a free and open source application. If you like it, support the developers with a donation. - + 这是一个免费且开源的软件。如果您喜欢它,请捐助开发者们。 + And if you don’t like the application, all the more reason to support it - the donation will be used for the improving the application. - + 如果您不喜欢,请捐助支持我们改进它。 Card on Patreon - + Patreon订阅 https://www.patreon.com/amneziavpn - + Show other methods on Github - + 其他捐款途径 - + https://github.com/amnezia-vpn/amnezia-client#donate - + Contacts - + 联系方式 - + Telegram group - + 电报群 - + To discuss features - + 用于功能讨论 - + https://t.me/amnezia_vpn_en - + - + Mail - + 邮件 - + For reviews and bug reports - + 用于评论和提交软件的缺陷 - + Github - + - + https://github.com/amnezia-vpn/amnezia-client - + - + Website - + 官网 - + https://amnezia.org - + - + Check for updates - + 检查更新 @@ -954,77 +1078,89 @@ Already installed containers were found on the server. All installed containers Application - + 应用 Allow application screenshots - + 允许截屏 Auto start - + 自动运行 + + + Launch the application every time + 总是在系统 + + + starts + 启动时自动运行运用程序 + + + Launch the application every time %1 starts + 运行应用软件在%1系统启动时 Launch the application every time the device is starts - + 每次设备启动时启动应用程序 Start minimized - + 最小化 Launch application minimized - + 开启应用软件时窗口最小化 Language - + 语言 - + Logging - + 日志 - + Enabled - + 开启 - + Disabled - - - - - Reset settings and remove all data from the application - + 禁用 + Reset settings and remove all data from the application + 重置并清理应用的所有数据 + + + Reset settings and remove all data from the application? - + 重置并清理应用的所有数据? - + All settings will be reset to default. All installed AmneziaVPN services will still remain on the server. - + 所有配置恢复为默认值。服务器已安装的AmneziaVPN服务将被保留。 - + Continue - + 继续 - + Cancel - + 取消 @@ -1032,73 +1168,77 @@ Already installed containers were found on the server. All installed containers Settings restored from backup file - + 从备份文件还原配置 Backup - + 备份 Configuration backup - + 备份设置 + + + It will help you instantly restore connection settings at the next installation + 帮助您在下次安装时立即恢复连接设置 You can save your settings to a backup file to restore them the next time you install the application. - + 您可以将配置信息备份到文件中,以便在下次安装应用软件时恢复配置 Make a backup - + 进行备份 Save backup file - + 保存备份 Backup files (*.backup) - + Backup file saved - + 备份文件已保存 Restore from backup - + 从备份还原 Open backup file - + 打开备份文件 Import settings from a backup file? - + 从备份文件导入设置? All current settings will be reset - + 当前所有设置将重置 Continue - + 继续 Cancel - + 取消 @@ -1106,120 +1246,144 @@ Already installed containers were found on the server. All installed containers Connection - + 连接 Auto connect - + 自动连接 Connect to VPN on app start - - - - - Use AmneziaDNS - - - - - If AmneziaDNS is installed on the server - - - - - DNS servers - + 应用开启时连接VPN When AmneziaDNS is not used or installed + + + Allows you to use the VPN only for certain Apps + + + + Use AmneziaDNS if installed on the server + 使用AmneziaDNS,如其已安装在服务器上 + + + + Use AmneziaDNS + 使用AmneziaDNS + + + + If AmneziaDNS is installed on the server + 如果已在服务器安装AmneziaDNS + + + + DNS servers + DNS服务器 + + + If AmneziaDNS is not used or installed + 如果未使用或未安装AmneziaDNS + Site-based split tunneling - + 基于网站的隧道分离 Allows you to select which sites you want to access through the VPN - + 配置想要通过VPN访问网站 App-based split tunneling - + 基于应用的隧道分离 - - Allows you to use the VPN only for certain Apps - + Split site tunneling + 网站级VPN分流 + + + Allows you to connect to some sites through a secure connection, and to others bypassing it + 使用VPN访问指定网站,其他的则绕过 + + + Separate application tunneling + 应用级VPN分流 + + + Allows you to use the VPN only for certain applications + 仅指定应用使用VPN PageSettingsDns - + Default server does not support custom dns - + DNS servers - + DNS服务器 - + If AmneziaDNS is not used or installed - + 如果未使用或未安装AmneziaDNS - + Primary DNS - + 首选 DNS - + Secondary DNS - + 备用 DNS - + Restore default - + 恢复默认配置 - + Restore default DNS settings? - + 是否恢复默认DNS配置? - + Continue - + 继续 - + Cancel - + 取消 - + Settings have been reset - + 已重置 - + Save - + 保存 - + Settings saved - + 配置已保存 @@ -1227,62 +1391,62 @@ Already installed containers were found on the server. All installed containers Logging - + 日志 Save logs - + 记录日志 Open folder with logs - + 打开日志文件夹 Save - + 保存 Logs files (*.log) - + Logs file saved - + 日志文件已保存 Save logs to file - + 保存日志到文件 Clear logs? - + 清理日志? Continue - + 继续 Cancel - + 取消 - + Logs have been cleaned up - + 日志已清理 - + Clear logs - + 清理日志 @@ -1290,143 +1454,139 @@ Already installed containers were found on the server. All installed containers All installed containers have been added to the application - + 所有已安装的容器,已被添加到应用软件 No new installed containers found - + 未发现新安装的容器 Clear Amnezia cache - + 清除 Amnezia 缓存 May be needed when changing other settings - + 更改其他设置时可能需要缓存 Clear cached profiles? + 清除缓存? + + + + Do you want to reboot the server? - + + Do you want to clear server from Amnezia software? + + + + - - - - + + + Continue - + 继续 - - - - + + + Cancel - - - - - Check the server for previously installed Amnezia services - + 取消 - Add them to the application if they were not displayed - + Check the server for previously installed Amnezia services + 检查服务器上,是否存在之前安装的 Amnezia 服务 - + + Add them to the application if they were not displayed + 如果存在且未显示,则添加到应用软件 + + + Reboot server - - Do you want to reboot the server? - - - - + The reboot process may take approximately 30 seconds. Are you sure you wish to proceed? - + Remove server from application - + 移除本地服务器信息 - + Do you want to remove the server from application? - + Remove server? + 移除本地服务器信息? + + + All installed AmneziaVPN services will still remain on the server. - + 所有已安装的 AmneziaVPN 服务仍将保留在服务器上。 - + Clear server from Amnezia software - + 清理Amnezia中服务器信息 - - Do you want to clear server from Amnezia software? - + Clear server from Amnezia software? + 清理Amnezia中服务器信息 - + All containers will be deleted on the server. This means that configuration files, keys and certificates will be deleted. - - - - - Reset API config - - - - - Do you want to reset API config? - + 服务器上的所有容器都将被删除。配置文件、密钥和证书也将被删除。 PageSettingsServerInfo - + Server name - + 服务器名 - + Save - + 保存 - + Protocols - + 协议 - + Services - + 服务 - + Data - + 数据 @@ -1434,32 +1594,44 @@ Already installed containers were found on the server. All installed containers settings - + 配置 Remove - - - - - Remove %1 from server? - + 移除 All users with whom you shared a connection will no longer be able to connect to it. - + 与您共享连接的所有用户将无法再连接到该连接。 + + + All users who you shared a connection with will no longer be able to connect to it. + 使用此共享连接的所有用户,将无法再连接它。 + + + from server? + 从服务器 + + + + Remove %1 from server? + 从服务器移除 %1 ? + + + All users with whom you shared a connection will no longer be able to connect to it + 与您共享连接的所有用户将无法再连接到此链接 Continue - + 继续 Cancel - + 取消 @@ -1467,49 +1639,73 @@ Already installed containers were found on the server. All installed containers Servers - + 服务器 PageSettingsSplitTunneling - + Only the addresses in the list must be opened via VPN + 仅列表中的地址须通过VPN访问 + + + Addresses from the list should never be opened via VPN + 勿通过VPN访问列表中的地址 + + + Split site tunneling + 网站级VPN分流 + + + Default server does not support split tunneling function - - Only the sites listed here will be accessed through the VPN - + Addresses from the list should be accessed via VPN + 仅使用VPN访问 - + Addresses from the list should not be accessed via VPN - + 不使用VPN访问 - + Split tunneling - + 隧道分离 - + Mode - + 规则 - + Remove - + 移除 - + Continue - + 继续 - + Cancel + 取消 + + + Site or IP + 网站或IP地址 + + + Import/Export Sites + 导入/导出网站 + + + + Only the sites listed here will be accessed through the VPN @@ -1518,52 +1714,52 @@ Already installed containers were found on the server. All installed containers - + Import / Export Sites - + Import - + 导入 - + Save site list - + 保存网址 - + Save sites - + 保存网址 + + + + + + Sites files (*.json) + + + + + Import a list of sites + 导入网址列表 + + + + Replace site list + 替换网址列表 - - Sites files (*.json) - - - - - Import a list of sites - - - - - Replace site list - - - - - Open sites file - + 打开网址文件 - + Add imported sites to existing ones - + 将导入的网址添加到现有网址中 @@ -1571,102 +1767,117 @@ Already installed containers were found on the server. All installed containers Server connection - + 服务器连接 Do not use connection code from public sources. It may have been created to intercept your data. It's okay as long as it's from someone you trust. - + 请勿使用公共来源的连接码。它可能是为了拦截您的数据而创建的。 +请确保连接码来源可信。 What do you have? - + 你用什么方式创建连接? File with connection settings or backup - + 包含连接配置或备份的文件 File with connection settings - + 包含连接配置的文件 Open config file - + 打开配置文件 QR-code - + 二维码 Key as text - + 授权码文本 PageSetupWizardCredentials - + Server connection + 连接服务器 + + + Configure your server - + 配置服务器 - + Server IP address [:port] - + 服务器IP [:端口] - - 255.255.255.255:22 - - - - + Login to connect via SSH - + 用户 - - Password or SSH private key - + Password / SSH private key + 密码 或 私钥 - + Continue - + 继续 - + All data you enter will remain strictly confidential and will not be shared or disclosed to the Amnezia or any third parties - + All data you enter will remain strictly confidential +and will not be shared or disclosed to the Amnezia or any third parties + 您输入的所有数据将严格保密 +不会向 Amnezia 或任何第三方分享或披露 + + + + 255.255.255.255:22 + + + + + Password or SSH private key + + + + Ip address cannot be empty - + IP不能为空 - + Enter the address in the format 255.255.255.255:88 - + 按照这种格式输入 255.255.255.255:88 - + Login cannot be empty - + 账号不能为空 - + Password/private key cannot be empty - + 密码或私钥不能为空 @@ -1674,27 +1885,27 @@ It's okay as long as it's from someone you trust. What is the level of internet control in your region? - + 您所在地区的互联网管控力度如何? Set up a VPN yourself - + 自己架设VPN I want to choose a VPN protocol - + 我想选择VPN协议 Continue - + 继续 - + Set up later - + 稍后设置 @@ -1703,70 +1914,78 @@ It's okay as long as it's from someone you trust. Usually it takes no more than 5 minutes - + 通常不超过5分钟 The server has already been added to the application - + 服务器已添加到应用软件中 Amnezia has detected that your server is currently - + Amnezia 检测到您的服务器当前 busy installing other software. Amnezia installation - - - - - will pause until the server finishes installing other software - - - - - Installing - + 正安装其他软件。Amnezia安装 Cancel installation + + Amnesia has detected that your server is currently + Amnezia 检测到您的服务器当前 + + + busy installing other software. Amnesia installation + 正安装其他软件。Amnezia安装 + + + + will pause until the server finishes installing other software + 将暂停,直到其他软件安装完成。 + + + + Installing + 安装中 + PageSetupWizardProtocolSettings - + Installing %1 - + 正在安装 %1 - + More detailed - + 更多细节 - + Close - + 关闭 - + Network protocol - + 网络协议 - + Port - + 端口 - + Install - + 安装 @@ -1774,12 +1993,12 @@ It's okay as long as it's from someone you trust. VPN protocol - + VPN 协议 Choose the one with the highest priority for you. Later, you can install other protocols and additional services, such as DNS proxy and SFTP. - + 选择你认为优先级最高的一项。稍后,您可以安装其他协议和附加服务,例如 DNS 代理和 SFTP。 @@ -1787,7 +2006,7 @@ It's okay as long as it's from someone you trust. Point the camera at the QR code and hold for a couple of seconds. - + 将相机对准二维码并按住几秒钟 @@ -1795,30 +2014,30 @@ It's okay as long as it's from someone you trust. Settings restored from backup file - + 从备份文件还原配置 Free service for creating a personal VPN on your server. - + 在您的服务器上架设私人免费VPN服务。 Helps you access blocked content without revealing your privacy, even to VPN providers. - + 帮助您访问受限内容,保护您的隐私,即使是VPN提供商也无法获取。 I have the data to connect - + 我有连接配置 I have nothing - + 我没有 - + https://amnezia.org/instructions/0_starter-guide @@ -1826,85 +2045,70 @@ It's okay as long as it's from someone you trust. PageSetupWizardTextKey - + Connection key - + 连接授权码 - + A line that starts with vpn://... - + 以 vpn://... 开始的行 + + + + Key + 授权码 - Key - - - - Insert - + 插入 - + Continue - + 继续 PageSetupWizardViewConfig - + New connection - + 新连接 - + Do not use connection code from public sources. It could be created to intercept your data. - + 请勿使用公共来源的连接码。它可以被创建来拦截您的数据。 - + Collapse content - + 折叠内容 - + Show content - + 显示内容 - + Connect - + 连接 PageShare - - - Config revoked - - - - - Connection to - - - - - File with connection settings to - - Save OpenVPN config - + 保存OpenVPN配置 Save WireGuard config - + 保存WireGuard配置 @@ -1916,90 +2120,56 @@ It's okay as long as it's from someone you trust. Save Cloak config - - - For the AmneziaVPN app - - - OpenVpn native format - + For the AmneziaVPN app + AmneziaVPN 应用 - WireGuard native format - + OpenVpn native format + OpenVPN原生格式 + WireGuard native format + WireGuard原生格式 + + + ShadowSocks native format - + Cloak native format - + Share VPN Access - + 共享 VPN 访问 - + Share full access to the server and VPN - + Use for your own devices, or share with those you trust to manage the server. - - - Share - - - - - Connection - - - - + Users - + Share VPN access without the ability to manage the server - - - - - User name - - - - - - Server - - - - - - Protocol - - - - - - Connection format - + 共享 VPN 访问,无需管理服务器 @@ -2007,50 +2177,143 @@ It's okay as long as it's from someone you trust. - + Creation date: - + Rename - + Client name - + Save - + 保存 - + Revoke - + Revoke the config for a user - %1? - + The user will no longer be able to connect to your server. - + Continue + 继续 + + + + Cancel + 取消 + + + Share access to server management. The user with whom you share full access to the server will be able to add and remove any protocols and services to the server, as well as change settings. + 共享服务器管理访问权限。与您共享服务器全部访问权限的用户将可以添加和删除服务器上的任何协议和服务,以及更改设置。 + + + VPN Access + 访问VPN + + + + Connection + 连接 + + + Full access + 完全访问 + + + VPN access without the ability to manage the server + 访问VPN,但没有权限管理服务。 + + + Access to server management. The user with whom you share full access to the connection will be able to add and remove your protocols and services to the server, as well as change settings. + 除访问VPN外,用户还能添加和删除协议、服务以及更改配置信息 + + + Access to server management. The user with whom you share full access to the connection will be able to add and remove your protocols and services to the servers, as well as change settings. + 除访问VPN外,用户还能添加和删除协议、服务以及更改配置信息 + + + Full access to server + 获得服务器完整授权 + + + Servers + 服务器 + + + + + Server + 服务器 + + + Accessing + 访问 + + + File with accessing settings to + 访问配置文件的内容为: + + + + File with connection settings to + 连接配置文件的内容为: + + + Protocols + 协议 + + + + + Protocol + 协议 + + + + Connection to + 连接到 + + + + Config revoked - - Cancel + + User name + + + + Connection format + 连接格式 + + + + + Share + 共享 + PageShareFullAccess @@ -2071,35 +2334,35 @@ It's okay as long as it's from someone you trust. + - Server - + 服务器 + + + + Accessing + 访问 - Accessing - - - - File with accessing settings to - + 访问配置文件的内容为: - + Share - + 共享 + + + + Connection to + 连接到 - Connection to - - - - File with connection settings to - + 连接配置文件的内容为: @@ -2107,7 +2370,7 @@ It's okay as long as it's from someone you trust. Close - + 关闭 @@ -2115,38 +2378,38 @@ It's okay as long as it's from someone you trust. Password entry not found - + 未发现秘密 Could not decrypt data - + 数据无法加密 Unknown error - + 未知错误 Could not open wallet: %1; %2 - + 无法打开钱包: %1; %2 Password not found - + 未发现密码 Could not open keystore - + 无法打开密钥库 Could not remove private key from keystore - + 无法从密钥库中删除私钥 @@ -2154,12 +2417,12 @@ It's okay as long as it's from someone you trust. Unknown error - + 未知错误 Access to keychain denied - + 访问钥匙串被拒绝 @@ -2167,27 +2430,27 @@ It's okay as long as it's from someone you trust. Could not store data in settings: access error - + 无法在配置中存储数据:访问错误 Could not store data in settings: format error - + 无法在陪置中存储数据:格式错误 Could not delete data from settings: access error - + 无法在配置中删除数据:访问错误 Could not delete data from settings: format error - + 无法在配置中删除数据:格式错误 Entry not found - + 未找到条目 @@ -2195,80 +2458,80 @@ It's okay as long as it's from someone you trust. Password entry not found - + 未发现密码 Could not decrypt data - + 数据无法加密 D-Bus is not running - + D-Bus未运行 Unknown error - + 未知错误 No keychain service available - + 没有有效的钥匙串服务 Could not open wallet: %1; %2 - + 无法打开钱包: %1; %2 Access to keychain denied - + 访问钥匙串被拒绝 Could not determine data type: %1; %2 - + 无法确定数据类型: %1; %2 Entry not found - + 未找到记录 Unsupported entry type 'Map' - + 不支持的记录类型 'Map' Unknown kwallet entry type '%1' - + 未知钱包类型 '%1' Password not found - + 未发现密码 Could not open keystore - + 无法打开密钥库 Could not retrieve private key from keystore - + 无法从密钥存储库中检索私钥 Could not create decryption cipher - + 无法创建解密算法 @@ -2276,73 +2539,73 @@ It's okay as long as it's from someone you trust. Credential size exceeds maximum size of %1 - + 证书大小超过上限,最大为: %1 Credential key exceeds maximum size of %1 - + 凭证密钥大小超过上限,最大为: %1 Writing credentials failed: Win32 error code %1 - + 写入凭证失败,Win32错误码: %1 Encryption failed - + 加密失败 D-Bus is not running - + D-Bus未运行 Unknown error - + 未知错误 Could not open wallet: %1; %2 - + 无法打开钱包: %1; %2 Password not found - + 未发现密码 Could not open keystore - + 无法打开密钥库 Could not create private key generator - + 无法创建私钥生成器 Could not generate new private key - + 无法生成新的私钥 Could not retrieve private key from keystore - + 无法从密钥库检索私钥 Could not create encryption cipher - + 无法创建加密密码 Could not encrypt data - + 无法加密数据 @@ -2350,202 +2613,147 @@ It's okay as long as it's from someone you trust. Sftp service - + Sftp 服务 No error - + 没有错误 Unknown Error - + 未知错误 Function not implemented - + 功能未实现 Server check failed - + 服务器检测失败 Server port already used. Check for another software - + 检测服务器该端口是否被其他软件被占用 Server error: Docker container missing - + 服务器错误: Docker容器丢失 Server error: Docker failed - + 服务器错误: Docker失败 Installation canceled by user - + 用户取消安装 The user does not have permission to use sudo - + 用户没有root权限 Ssh request was denied - + ssh请求被拒绝 Ssh request was interrupted - + ssh请求中断 Ssh internal error - + ssh内部错误 Invalid private key or invalid passphrase entered - + 输入的私钥或密码无效 The selected private key format is not supported, use openssh ED25519 key types or PEM key types - + 不支持所选私钥格式,请使用 openssh ED25519 密钥类型或 PEM 密钥类型 Timeout connecting to server - + 连接服务器超时 Sftp error: End-of-file encountered - + Sftp错误: End-of-file encountered Sftp error: File does not exist - + Sftp错误: 文件不存在 Sftp error: Permission denied - + Sftp错误: 权限不足 Sftp error: Generic failure - + Sftp错误: 一般失败 Sftp error: Garbage received from server - + Sftp错误: 从服务器收到垃圾信息 Sftp error: No connection has been set up - + Sftp 错误: 未建立连接 Sftp error: There was a connection, but we lost it - + Sftp 错误: 已有连接丢失 Sftp error: Operation not supported by libssh yet - + Sftp error: libssh不支持该操作 Sftp error: Invalid file handle - + Sftp error: 无效的文件句柄 Sftp error: No such file or directory path exists - + Sftp 错误: 文件夹或文件不存在 Sftp error: An attempt to create an already existing file or directory has been made - + Sftp 错误: 文件或目录已存在 Sftp error: Write-protected filesystem - + Sftp 错误: 文件系统写保护 Sftp error: No media was in remote drive - - - - - OpenVPN config missing - - - - - OpenVPN management server error - - - - - OpenVPN executable missing - - - - - ShadowSocks (ss-local) executable missing - - - - - Cloak (ck-client) executable missing - - - - - Amnezia helper service error - - - - - OpenSSL failed - - - - - Can't connect: another VPN connection is active - - - - - Can't setup OpenVPN TAP network adapter - - - - - VPN pool error: no available addresses - - - - - The config does not contain any containers and credentials for connecting to the server - + Sftp 错误: 远程驱动器中没有媒介 @@ -2553,50 +2761,103 @@ It's okay as long as it's from someone you trust. - - Error when retrieving configuration from API - - - - - This config has already been added to the application - - - - - Internal error - - - - + ErrorCode: %1. + + Failed to save config to disk + 配置保存到磁盘失败 + + + + OpenVPN config missing + OpenVPN配置丢失 + + + + OpenVPN management server error + OpenVPN 管理服务器错误 + + + + OpenVPN executable missing + OpenVPN 可执行文件丢失 + + + + ShadowSocks (ss-local) executable missing + ShadowSocks (ss-local) 执行文件丢失 + + + + Cloak (ck-client) executable missing + Cloak (ck-client) 执行文件丢失 + + + + Amnezia helper service error + Amnezia 服务连接失败 + + + + OpenSSL failed + OpenSSL错误 + + + + Can't connect: another VPN connection is active + 无法连接:另一个VPN连接处于活跃状态 + + + + Can't setup OpenVPN TAP network adapter + 无法设置 OpenVPN TAP 网络适配器 + + + + VPN pool error: no available addresses + VPN 池错误:没有可用地址 + + + + The config does not contain any containers and credentials for connecting to the server + + + + The config does not contain any containers and credentiaks for connecting to the server + 该配置不包含任何用于连接到服务器的容器和凭据。 + + + + Internal error + 内部错误 + IPsec - + Website in Tor network - + 在 Tor 网络中架设网站 Amnezia DNS - + Sftp file sharing service - + SFTP文件共享服务 OpenVPN is the most popular VPN protocol, with flexible configuration options. It uses its own security protocol with SSL/TLS for key exchange. - + OpenVPN 是最流行的 VPN 协议,具有灵活的配置选项。它使用自己的安全协议与 SSL/TLS 进行密钥交换。 @@ -2608,60 +2869,11 @@ It's okay as long as it's from someone you trust. 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. - - - WireGuard - New popular VPN protocol with high performance, high speed and low power consumption. Recommended for regions with low levels of censorship. - - - - - AmneziaWG - Special protocol from Amnezia, based on WireGuard. It's fast like WireGuard, but very resistant to blockages. Recommended for regions with high levels of censorship. - - - - - 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. - - - - - Deploy a WordPress site on the Tor network in two clicks. - - - - - Replace the current DNS server with your own. This will increase your privacy level. - - Create a file vault on your server to securely store and transfer files. - - - OpenVPN stands as one of the most popular and time-tested VPN protocols available. -It employs its unique security protocol, leveraging the strength of SSL/TLS for encryption and key exchange. Furthermore, OpenVPN's support for a multitude of authentication methods makes it versatile and adaptable, catering to a wide range of devices and operating systems. Due to its open-source nature, OpenVPN benefits from extensive scrutiny by the global community, which continually reinforces its security. With a strong balance of performance, security, and compatibility, OpenVPN remains a top choice for privacy-conscious individuals and businesses alike. - -* Available in the AmneziaVPN across all platforms -* Normal power consumption on mobile devices -* Flexible customisation to suit user needs to work with different operating systems and devices -* Recognised by DPI analysis systems and therefore susceptible to blocking -* Can operate over both TCP and UDP network protocols. - - - - - 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'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'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. - - This is a combination of the OpenVPN protocol and the Cloak plugin designed specifically for protecting against blocking. @@ -2697,6 +2909,138 @@ WireGuard is very susceptible to blocking due to its distinct packet signatures. * Works over UDP network protocol. + + ShadowSocks - masks VPN traffic, making it similar to normal web traffic, but is recognised by analysis systems in some highly censored regions. + ShadowSocks - 混淆 VPN 流量,使其与正常的 Web 流量相似,但在一些审查力度高的地区可以被分析系统识别。 + + + OpenVPN over Cloak - OpenVPN with VPN masquerading as web traffic and protection against active-probbing detection. Ideal for bypassing blocking in regions with the highest levels of censorship. + OpenVPN over Cloak - OpenVPN 与 VPN 具有伪装成网络流量和防止主动探测检测的保护。非常适合绕过审查力度特别强的地区的封锁。 + + + + WireGuard - New popular VPN protocol with high performance, high speed and low power consumption. Recommended for regions with low levels of censorship. + WireGuard - 新型流行的VPN协议,具有高性能、高速度和低功耗。建议用于审查力度较低的地区 + + + + AmneziaWG - Special protocol from Amnezia, based on WireGuard. It's fast like WireGuard, but very resistant to blockages. Recommended for regions with high levels of censorship. + AmneziaWG - Amnezia 的特殊协议,基于 WireGuard。它的速度像 WireGuard 一样快,但非常抗堵塞。推荐用于审查较严的地区。 + + + + 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. + IKEv2 - 现代稳定协议,相比其他协议较快一些,在信号丢失后恢复连接。Android 和 iOS最新版原生支持。 + + + + Deploy a WordPress site on the Tor network in two clicks. + 只需点击两次即可架设 WordPress 网站到 Tor 网络 + + + + Replace the current DNS server with your own. This will increase your privacy level. + 将当前的 DNS 服务器替换为您自己的。这将提高您的隐私保护级别。 + + + Creates a file vault on your server to securely store and transfer files. + 在您的服务器上创建文件仓库,以便安全地存储和传输文件 + + + + OpenVPN stands as one of the most popular and time-tested VPN protocols available. +It employs its unique security protocol, leveraging the strength of SSL/TLS for encryption and key exchange. Furthermore, OpenVPN's support for a multitude of authentication methods makes it versatile and adaptable, catering to a wide range of devices and operating systems. Due to its open-source nature, OpenVPN benefits from extensive scrutiny by the global community, which continually reinforces its security. With a strong balance of performance, security, and compatibility, OpenVPN remains a top choice for privacy-conscious individuals and businesses alike. + +* Available in the AmneziaVPN across all platforms +* Normal power consumption on mobile devices +* Flexible customisation to suit user needs to work with different operating systems and devices +* Recognised by DPI analysis systems and therefore susceptible to blocking +* Can operate over both TCP and UDP network protocols. + OpenVPN 是最流行且经过时间考验的 VPN 协议之一。 +它采用其独特的安全协议,利用 SSL/TLS 的优势进行加密和密钥交换。此外,OpenVPN 支持多种身份验证方法,使其具有多功能性和适应性,可适应各种设备和操作系统。由于其开源性质,OpenVPN 受益于全球社区的广泛审查,这不断增强了其安全性。凭借性能、安全性和兼容性的强大平衡,OpenVPN 仍然是注重隐私的个人和企业的首选。 + +* 可在所有平台的 AmneziaVPN 中使用 +* 移动设备的正常功耗 +* 灵活定制,满足用户使用不同操作系统和设备的需求 +* 被DPI分析系统识别,因此容易被阻塞 +* 可以通过 TCP 和 UDP 网络协议运行 + + + + 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'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'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. + Shadowsocks 受到 SOCKS5 协议的启发,使用 AEAD 密码保护连接。尽管 Shadowsocks 设计得谨慎且难以识别,但它与标准 HTTPS 连接并不相同。但是,某些流量分析系统可能仍会检测到 Shadowsocks 连接。由于Amnezia支持有限,建议使用AmneziaWG协议。 + +* 仅在桌面平台上的 AmneziaVPN 中可用 +* 移动设备的正常功耗 + +* 可配置的加密协议 +* 可以被某些 DPI 系统检测到 +* 通过 TCP 网络协议工作。 + + + This is a combination of the OpenVPN protocol and the Cloak plugin designed specifically for blocking protection. + +OpenVPN provides a secure VPN connection by encrypting all Internet traffic between the client and the server. + +Cloak protects OpenVPN from detection and blocking. + +Cloak can modify packet metadata so that it completely masks VPN traffic as normal web traffic, and also protects the VPN from detection by Active Probing. This makes it very resistant to being detected + +Immediately after receiving the first data packet, Cloak authenticates the incoming connection. If authentication fails, the plugin masks the server as a fake website and your VPN becomes invisible to analysis systems. + +If there is a extreme level of Internet censorship in your region, we advise you to use only OpenVPN over Cloak from the first connection + +* Available in the AmneziaVPN across all platforms +* High power consumption on mobile devices +* Flexible settings +* Not recognised by DPI analysis systems +* Works over TCP network protocol, 443 port. + + 这是 OpenVPN 协议和专门用于阻止保护的 Cloak 插件的组合。 + +OpenVPN 通过加密客户端和服务器之间的所有 Internet 流量来提供安全的 VPN 连接。 + +Cloak 可保护 OpenVPN 免遭检测和阻止。 + +Cloak 可以修改数据包元数据,以便将 VPN 流量完全屏蔽为正常 Web 流量,并且还可以保护 VPN 免受主动探测的检测。这使得它非常难以被发现 + +收到第一个数据包后,Cloak 立即对传入连接进行身份验证。如果身份验证失败,该插件会将服务器伪装成虚假网站,并且您的 VPN 对分析系统来说将变得不可见。 + +如果您所在地区的互联网审查非常严格,我们建议您在第一次连接时仅使用 OpenVPN over Cloak + +* 可在所有平台的 AmneziaVPN 中使用 +* 移动设备功耗高 +* 配置灵活 +* 不被 DPI 分析系统识别 +* 通过 TCP 网络协议、443 端口工作。 + + + A relatively new popular VPN protocol with a simplified architecture. +Provides stable VPN connection, high performance on all devices. Uses hard-coded encryption settings. WireGuard compared to OpenVPN has lower latency and better data transfer throughput. +WireGuard is very susceptible to blocking due to its distinct packet signatures. Unlike some other VPN protocols that employ obfuscation techniques, the consistent signature patterns of WireGuard packets can be more easily identified and thus blocked by advanced Deep Packet Inspection (DPI) systems and other network monitoring tools. + +* Available in the AmneziaVPN across all platforms +* Low power consumption +* Minimum number of settings +* Easily recognised by DPI analysis systems, susceptible to blocking +* Works over UDP network protocol. + 一种相对较新的流行 VPN 协议,具有简化的架构。 +在所有设备上提供稳定的 VPN 连接和高性能。使用硬编码的加密设置。 WireGuard 与 OpenVPN 相比具有更低的延迟和更好的数据传输吞吐量。 +由于其独特的数据包签名,WireGuard 非常容易受到阻塞。与其他一些采用混淆技术的 VPN 协议不同,WireGuard 数据包的一致签名模式可以更容易地被高级深度数据包检测 (DPI) 系统和其他网络监控工具识别并阻止。 + +* 可在所有平台的 AmneziaVPN 中使用 +* 低功耗 +* 配置简单 +* 容易被DPI分析系统识别,容易被阻塞 +* 通过 UDP 网络协议工作。 + A modern iteration of the popular VPN protocol, AmneziaWG builds upon the foundation set by WireGuard, retaining its simplified architecture and high-performance capabilities across devices. @@ -2708,7 +3052,15 @@ This means that AmneziaWG keeps the fast performance of the original while addin * Minimum number of settings * Not recognised by DPI analysis systems, resistant to blocking * Works over UDP network protocol. - + AmneziaWG 是流行 VPN 协议的现代迭代,它建立在 WireGuard 的基础上,保留了其简化的架构和跨设备的高性能功能。 +虽然 WireGuard 以其高效而闻名,但由于其独特的数据包签名,它存在容易被检测到的问题。 AmneziaWG 通过使用更好的混淆方法解决了这个问题,使其流量与常规互联网流量融合在一起。 +这意味着 AmneziaWG 保留了原始版本的快速性能,同时添加了额外的隐秘层,使其成为那些想要快速且谨慎的 VPN 连接的人的绝佳选择。 + +* 可在所有平台的 AmneziaVPN 中使用 +* 低功耗 +* 配置简单 +* 不被DPI分析系统识别,抗阻塞 +* 通过 UDP 网络协议工作。 @@ -2721,85 +3073,113 @@ While it offers a blend of security, stability, and speed, it's essential t * Minimal configuration * Recognised by DPI analysis systems * Works over UDP network protocol, ports 500 and 4500. - + IKEv2 与 IPSec 加密层配合使用,是一种现代且稳定的 VPN 协议。 +其显着特征之一是能够在网络和设备之间快速切换,使其特别适应动态网络环境。 +虽然 IKEv2 兼具安全性、稳定性和速度,但必须注意的是,IKEv2 很容易被检测到,并且容易受到阻止。 + +* 仅在 Windows 上的 AmneziaVPN 中可用 +* 低功耗,在移动设备上 +* 最低配置 +* 获得DPI分析系统认可 +* 通过 UDP 网络协议、端口 500 和 4500 工作。 + + + OpenVPN container + OpenVPN容器 + + + Container with OpenVpn and ShadowSocks + 含 OpenVpn 和 ShadowSocks 的容器 + + + Container with OpenVpn and ShadowSocks protocols configured with traffic masking by Cloak plugin + 含 OpenVpn 和 ShadowSocks 协议的容器,通过 Cloak 插件配置混淆流量 + + + WireGuard container + WireGuard 容器 + + + IPsec container + IPsec 容器 DNS Service - + DNS 服务 Sftp file sharing service - is secure FTP service - + Sftp 文件共享服务 - 安全的 FTP 服务 Entry not found - + 未找到记录 Access to keychain denied - + 访问钥匙串被拒绝 No keyring daemon - + 没有密钥环守护进程 Already unlocked - + 已经解锁 No such keyring - + 没有这样的密钥环 Bad arguments - + 错误参数 I/O error - + I/O错误 Cancelled - + 已取消 Keyring already exists - + 密匙环已经存在 No match - + 不匹配 Unknown error - + 未知错误 error 0x%1: %2 - + 错误 0x%1: %2 SelectLanguageDrawer - + Choose language - + 选择语言 @@ -2807,78 +3187,80 @@ While it offers a blend of security, stability, and speed, it's essential t Server #1 - + Server - + 服务器 SettingsController - + Software version - + 软件版本 - + Backup file is corrupted - + 备份文件已损坏 - + All settings have been reset to default values - + 所配置恢复为默认值 - + Cached profiles cleared - + 缓存的配置文件已清除 ShareConnectionDrawer - + Save AmneziaVPN config - + 保存配置 - + Share - + 共享 - + Copy - + 拷贝 - - - - + + Copied - + 已拷贝 - + Copy config string - + Show connection settings - + 显示连接配置 - + Show content + 展示内容 + + + To read the QR code in the Amnezia app, select "Add server" → "I have data to connect" → "QR code, key or settings file" - + 要应用二维码到 Amnezia,请底部工具栏点击“+”→“连接方式”→“二维码、授权码或配置文件” @@ -2886,42 +3268,42 @@ While it offers a blend of security, stability, and speed, it's essential t Hostname not look like ip adress or domain name - + 请输入有效的域名或IP地址 New site added: %1 - + 已经添加新网站: %1 Site removed: %1 - + 已移除网站: %1 Can't open file: %1 - + 无法打开文件: %1 Failed to parse JSON data from file: %1 - + JSON解析失败,文件: %1 The JSON data is not an array in file: %1 - + 文件中的JSON数据不是一个数组,文件: %1 Import completed - + 完成导入 Export completed - + 完成导出 @@ -2930,39 +3312,39 @@ While it offers a blend of security, stability, and speed, it's essential t Show - + 显示 Connect - + 连接 Disconnect - + 断开 Visit Website - + 官网 Quit - + 退出 TextFieldWithHeaderType - + The field can't be empty - + 输入不能为空 @@ -2970,7 +3352,7 @@ While it offers a blend of security, stability, and speed, it's essential t Mbps - + @@ -2978,42 +3360,42 @@ While it offers a blend of security, stability, and speed, it's essential t Unknown - + 未知 Disconnected - + 连接已断开 Preparing - + 准备中 Connecting... - + 连接中 Connected - + 已连接 Disconnecting... - + 断开中 Reconnecting... - + 重连中 Error - + 错误 @@ -3021,45 +3403,65 @@ While it offers a blend of security, stability, and speed, it's essential t Low - + Medium or High - + 中或高 Extreme - + 极度 I just want to increase the level of my privacy. - + 只是想提高隐私保护级别。 I want to bypass censorship. This option recommended in most cases. - + 想要绕过审查制度。大多数情况下推荐使用此选项。 Most VPN protocols are blocked. Recommended if other options are not working. - + 大多数 VPN 协议都被阻止。如果其他选项不起作用,推荐此选项。 + + + High + + + + Medium + + + + I just want to increase the level of privacy + 我只是想提高隐私保护级别 + + + Many foreign websites and VPN providers are blocked + 大多国外网站和VPN提供商被屏蔽 + + + Some foreign sites are blocked, but VPN providers are not blocked + 一些国外网站被屏蔽,但VPN提供商未被屏蔽 main2 - + Private key passphrase - + 私钥密码 - + Save - + 保存 From dc9069f1f4ee2cec9423e0814eb65dc0e94688d1 Mon Sep 17 00:00:00 2001 From: KsZnak Date: Mon, 19 Feb 2024 13:37:40 +0200 Subject: [PATCH 18/36] Update_2_amneziavpn_ru.ts Add new change --- client/translations/amneziavpn_ru.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/client/translations/amneziavpn_ru.ts b/client/translations/amneziavpn_ru.ts index 99e1dff8..e0ae9b79 100644 --- a/client/translations/amneziavpn_ru.ts +++ b/client/translations/amneziavpn_ru.ts @@ -938,7 +938,7 @@ Already installed containers were found on the server. All installed containers Support Amnezia - + Поддержите Amnezia @@ -1202,7 +1202,7 @@ Already installed containers were found on the server. All installed containers - When AmneziaDNS is installed on the server + If AmneziaDNS is installed on the server Если он уставновлен на сервере @@ -2808,7 +2808,7 @@ While it offers a blend of security, stability, and speed, it's essential t OpenVPN - популярный VPN-протокол, с гибкой настройкой. Имеет собственный протокол безопасности с SSL/TLS для обмена ключами. - ShadowSocks - masks VPN traffic, making it similar to normal web traffic, but it may be recognised by analysis systems in some highly censored regions. + ShadowSocks - masks VPN traffic, making it similar to normal web traffic, but it may be recognized by analysis systems in some highly censored regions. ShadowSocks - маскирует VPN-трафик под обычный веб-трафик, но распознается системами анализа в некоторых регионах с высоким уровнем цензуры. From 9c4ee4014da66bff3b0455aa273a644395af39ac Mon Sep 17 00:00:00 2001 From: isamnezia <156459471+isamnezia@users.noreply.github.com> Date: Mon, 19 Feb 2024 16:13:10 +0300 Subject: [PATCH 19/36] Fix for Codacy: variable name should be between 3 and 40 characters long (#608) Tiny fixes for iOS --- .../platforms/ios/PacketTunnelProvider.swift | 2 +- client/platforms/ios/WGConfig.swift | 54 ++++++++++--------- 2 files changed, 29 insertions(+), 27 deletions(-) diff --git a/client/platforms/ios/PacketTunnelProvider.swift b/client/platforms/ios/PacketTunnelProvider.swift index 36097c0d..dc0403e3 100644 --- a/client/platforms/ios/PacketTunnelProvider.swift +++ b/client/platforms/ios/PacketTunnelProvider.swift @@ -175,7 +175,7 @@ class PacketTunnelProvider: NEPacketTunnelProvider { return } - guard let wgConfigStr = try? JSONDecoder().decode(WGConfig.self, from: wgConfig).wg, + guard let wgConfigStr = try? JSONDecoder().decode(WGConfig.self, from: wgConfig).str, let tunnelConfiguration = try? TunnelConfiguration(fromWgQuickConfig: wgConfigStr) else { wg_log(.error, message: "Can't parse WireGuard config") diff --git a/client/platforms/ios/WGConfig.swift b/client/platforms/ios/WGConfig.swift index d86dd471..9593d289 100644 --- a/client/platforms/ios/WGConfig.swift +++ b/client/platforms/ios/WGConfig.swift @@ -1,22 +1,23 @@ import Foundation struct WGConfigData: Decodable { - let h1, h2, h3, h4: String? - let jc, jmax, jmin: String? - let s1, s2: String? + let initPacketMagicHeader, responsePacketMagicHeader: String? + let underloadPacketMagicHeader, transportPacketMagicHeader: String? + let junkPacketCount, junkPacketMinSize, junkPacketMaxSize: String? + let initPacketJunkSize, responsePacketJunkSize: String? var settings: String { - jc == nil ? "" : + junkPacketCount == nil ? "" : """ - Jc = \(jc!) - Jmin = \(jmin!) - Jmax = \(jmax!) - S1 = \(s1!) - S2 = \(s2!) - H1 = \(h1!) - H2 = \(h2!) - H3 = \(h3!) - H4 = \(h4!) + Jc = \(junkPacketCount!) + Jmin = \(junkPacketMinSize!) + Jmax = \(junkPacketMaxSize!) + S1 = \(initPacketJunkSize!) + S2 = \(responsePacketJunkSize!) + H1 = \(initPacketMagicHeader!) + H2 = \(responsePacketMagicHeader!) + H3 = \(underloadPacketMagicHeader!) + H4 = \(transportPacketMagicHeader!) """ } @@ -33,9 +34,10 @@ struct WGConfigData: Decodable { var persistentKeepAlive: String enum CodingKeys: String, CodingKey { - case h1 = "H1", h2 = "H2", h3 = "H3", h4 = "H4" - case jc = "Jc", jmax = "Jmax", jmin = "Jmin" - case s1 = "S1", s2 = "S2" + case initPacketMagicHeader = "H1", responsePacketMagicHeader = "H2" + case underloadPacketMagicHeader = "H3", transportPacketMagicHeader = "H4" + case junkPacketCount = "Jc", junkPacketMinSize = "Jmin", junkPacketMaxSize = "Jmax" + case initPacketJunkSize = "S1", responsePacketJunkSize = "S2" case clientIP = "client_ip" // "10.8.1.16" case clientPrivateKey = "client_priv_key" @@ -51,15 +53,15 @@ struct WGConfigData: Decodable { init(from decoder: Decoder) throws { let container = try decoder.container(keyedBy: CodingKeys.self) - self.h1 = try container.decodeIfPresent(String.self, forKey: .h1) - self.h2 = try container.decodeIfPresent(String.self, forKey: .h2) - self.h3 = try container.decodeIfPresent(String.self, forKey: .h3) - self.h4 = try container.decodeIfPresent(String.self, forKey: .h4) - self.jc = try container.decodeIfPresent(String.self, forKey: .jc) - self.jmax = try container.decodeIfPresent(String.self, forKey: .jmax) - self.jmin = try container.decodeIfPresent(String.self, forKey: .jmin) - self.s1 = try container.decodeIfPresent(String.self, forKey: .s1) - self.s2 = try container.decodeIfPresent(String.self, forKey: .s2) + self.initPacketMagicHeader = try container.decodeIfPresent(String.self, forKey: .initPacketMagicHeader) + self.responsePacketMagicHeader = try container.decodeIfPresent(String.self, forKey: .responsePacketMagicHeader) + self.underloadPacketMagicHeader = try container.decodeIfPresent(String.self, forKey: .underloadPacketMagicHeader) + self.transportPacketMagicHeader = try container.decodeIfPresent(String.self, forKey: .transportPacketMagicHeader) + self.junkPacketCount = try container.decodeIfPresent(String.self, forKey: .junkPacketCount) + self.junkPacketMinSize = try container.decodeIfPresent(String.self, forKey: .junkPacketMinSize) + self.junkPacketMaxSize = try container.decodeIfPresent(String.self, forKey: .junkPacketMaxSize) + self.initPacketJunkSize = try container.decodeIfPresent(String.self, forKey: .initPacketJunkSize) + self.responsePacketJunkSize = try container.decodeIfPresent(String.self, forKey: .responsePacketJunkSize) self.clientIP = try container.decode(String.self, forKey: .clientIP) self.clientPrivateKey = try container.decode(String.self, forKey: .clientPrivateKey) self.clientPublicKey = try container.decode(String.self, forKey: .clientPublicKey) @@ -115,7 +117,7 @@ struct WGConfig: Decodable { self.splitTunnelType = try container.decode(Int.self, forKey: .splitTunnelType) } - var wg: String { + var str: String { """ [Interface] Address = \(data.clientIP)/32 From a32952fde689d2559193c4308abe8f1232993b68 Mon Sep 17 00:00:00 2001 From: pokamest Date: Mon, 19 Feb 2024 14:06:18 +0000 Subject: [PATCH 20/36] Qt.ImhNoAutoUppercase | Qt.ImhSensitiveData | Qt.ImhNoPredictiveText for all TextFields --- client/ui/qml/Controls2/TextFieldWithHeaderType.qml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/client/ui/qml/Controls2/TextFieldWithHeaderType.qml b/client/ui/qml/Controls2/TextFieldWithHeaderType.qml index 13405e4b..606aa83e 100644 --- a/client/ui/qml/Controls2/TextFieldWithHeaderType.qml +++ b/client/ui/qml/Controls2/TextFieldWithHeaderType.qml @@ -74,6 +74,8 @@ Item { enabled: root.textFieldEditable color: root.enabled ? root.textFieldTextColor : root.textFieldTextDisabledColor + inputMethodHints: Qt.ImhNoAutoUppercase | Qt.ImhSensitiveData | Qt.ImhNoPredictiveText + placeholderText: root.textFieldPlaceholderText placeholderTextColor: "#494B50" From b3943ae5e3a98646dd6c3c40267b52849c948549 Mon Sep 17 00:00:00 2001 From: Nethius Date: Mon, 19 Feb 2024 19:54:15 +0500 Subject: [PATCH 21/36] serversModel cleanup (#599) --- .gitignore | 3 + client/amnezia_application.cpp | 8 +- client/amnezia_application.h | 1 + client/ui/controllers/apiController.cpp | 5 +- .../ui/controllers/connectionController.cpp | 2 +- client/ui/controllers/exportController.cpp | 14 +- client/ui/controllers/installController.cpp | 28 +-- client/ui/controllers/installController.h | 8 +- client/ui/models/servers_model.cpp | 235 +++++++++--------- client/ui/models/servers_model.h | 61 ++--- client/ui/qml/Components/ConnectButton.qml | 2 +- .../qml/Components/HomeContainersListView.qml | 7 +- client/ui/qml/Pages2/PageHome.qml | 35 +-- .../ui/qml/Pages2/PageProtocolAwgSettings.qml | 2 +- .../qml/Pages2/PageProtocolCloakSettings.qml | 2 +- .../Pages2/PageProtocolOpenVpnSettings.qml | 2 +- client/ui/qml/Pages2/PageProtocolRaw.qml | 2 +- .../PageProtocolShadowSocksSettings.qml | 2 +- .../ui/qml/Pages2/PageServiceSftpSettings.qml | 4 +- client/ui/qml/Pages2/PageSettingsDns.qml | 6 +- .../ui/qml/Pages2/PageSettingsServerData.qml | 18 +- .../ui/qml/Pages2/PageSettingsServerInfo.qml | 2 +- .../qml/Pages2/PageSettingsServerProtocol.qml | 2 +- .../Pages2/PageSettingsServerProtocols.qml | 4 +- .../qml/Pages2/PageSettingsServerServices.qml | 4 +- .../ui/qml/Pages2/PageSettingsServersList.qml | 2 +- .../qml/Pages2/PageSettingsSplitTunneling.qml | 6 +- .../qml/Pages2/PageSetupWizardInstalling.qml | 6 +- .../qml/Pages2/PageSetupWizardViewConfig.qml | 2 +- client/ui/qml/Pages2/PageShare.qml | 12 +- client/ui/qml/Pages2/PageShareFullAccess.qml | 2 +- client/ui/qml/Pages2/PageStart.qml | 6 +- 32 files changed, 255 insertions(+), 240 deletions(-) diff --git a/.gitignore b/.gitignore index 7de64e4b..5b90fd55 100644 --- a/.gitignore +++ b/.gitignore @@ -131,3 +131,6 @@ client/3rd/ShadowSocks/ss_ios.xcconfig # UML generated pics out/ + +# CMake files +CMakeFiles/ \ No newline at end of file diff --git a/client/amnezia_application.cpp b/client/amnezia_application.cpp index dbd4160d..0831b1a2 100644 --- a/client/amnezia_application.cpp +++ b/client/amnezia_application.cpp @@ -286,10 +286,16 @@ void AmneziaApplication::initModels() m_containersModel.reset(new ContainersModel(this)); m_engine->rootContext()->setContextProperty("ContainersModel", m_containersModel.get()); + m_defaultServerContainersModel.reset(new ContainersModel(this)); + m_engine->rootContext()->setContextProperty("DefaultServerContainersModel", m_defaultServerContainersModel.get()); + m_serversModel.reset(new ServersModel(m_settings, this)); m_engine->rootContext()->setContextProperty("ServersModel", m_serversModel.get()); connect(m_serversModel.get(), &ServersModel::containersUpdated, m_containersModel.get(), &ContainersModel::updateModel); + connect(m_serversModel.get(), &ServersModel::defaultServerContainersUpdated, m_defaultServerContainersModel.get(), + &ContainersModel::updateModel); + m_serversModel->resetModel(); m_languageModel.reset(new LanguageModel(m_settings, this)); m_engine->rootContext()->setContextProperty("LanguageModel", m_languageModel.get()); @@ -333,7 +339,7 @@ void AmneziaApplication::initModels() connect(m_configurator.get(), &VpnConfigurator::newVpnConfigCreated, this, [this](const QString &clientId, const QString &clientName, const DockerContainer container, ServerCredentials credentials) { - m_serversModel->reloadContainerConfig(); + m_serversModel->reloadDefaultServerContainerConfig(); m_clientManagementModel->appendClient(clientId, clientName, container, credentials); emit m_configurator->clientModelUpdated(); }); diff --git a/client/amnezia_application.h b/client/amnezia_application.h index 0161cd3a..bdbc52a6 100644 --- a/client/amnezia_application.h +++ b/client/amnezia_application.h @@ -92,6 +92,7 @@ private: QCommandLineParser m_parser; QSharedPointer m_containersModel; + QSharedPointer m_defaultServerContainersModel; QSharedPointer m_serversModel; QSharedPointer m_languageModel; QSharedPointer m_protocolsModel; diff --git a/client/ui/controllers/apiController.cpp b/client/ui/controllers/apiController.cpp index 808fd2eb..0d8c75e3 100644 --- a/client/ui/controllers/apiController.cpp +++ b/client/ui/controllers/apiController.cpp @@ -136,8 +136,7 @@ void ApiController::updateServerConfigFromApi() auto defaultContainer = apiConfig.value(config_key::defaultContainer).toString(); serverConfig.insert(config_key::defaultContainer, defaultContainer); - m_serversModel->editServer(serverConfig); - emit m_serversModel->defaultContainerChanged(ContainerProps::containerFromString(defaultContainer)); + m_serversModel->editServer(serverConfig, m_serversModel->getDefaultServerIndex()); } else { qDebug() << reply->error(); qDebug() << reply->attribute(QNetworkRequest::HttpStatusCodeAttribute); @@ -164,5 +163,5 @@ void ApiController::clearApiConfig() serverConfig.insert(config_key::defaultContainer, ContainerProps::containerToString(DockerContainer::None)); - m_serversModel->editServer(serverConfig); + m_serversModel->editServer(serverConfig, m_serversModel->getDefaultServerIndex()); } diff --git a/client/ui/controllers/connectionController.cpp b/client/ui/controllers/connectionController.cpp index 87d8801d..7b59c901 100644 --- a/client/ui/controllers/connectionController.cpp +++ b/client/ui/controllers/connectionController.cpp @@ -33,7 +33,7 @@ void ConnectionController::openConnection() int serverIndex = m_serversModel->getDefaultServerIndex(); ServerCredentials credentials = m_serversModel->getServerCredentials(serverIndex); - DockerContainer container = m_serversModel->getDefaultContainer(serverIndex); + DockerContainer container = qvariant_cast(m_serversModel->data(serverIndex, ServersModel::Roles::DefaultContainerRole)); const QJsonObject &containerConfig = m_containersModel->getContainerConfig(container); if (container == DockerContainer::None) { diff --git a/client/ui/controllers/exportController.cpp b/client/ui/controllers/exportController.cpp index 2b102e13..0c328326 100644 --- a/client/ui/controllers/exportController.cpp +++ b/client/ui/controllers/exportController.cpp @@ -45,7 +45,7 @@ void ExportController::generateFullAccessConfig() { clearPreviousConfig(); - int serverIndex = m_serversModel->getCurrentlyProcessedServerIndex(); + int serverIndex = m_serversModel->getProcessedServerIndex(); QJsonObject config = m_settings->server(serverIndex); QJsonArray containers = config.value(config_key::containers).toArray(); @@ -99,7 +99,7 @@ void ExportController::generateConnectionConfig(const QString &clientName) { clearPreviousConfig(); - int serverIndex = m_serversModel->getCurrentlyProcessedServerIndex(); + int serverIndex = m_serversModel->getProcessedServerIndex(); ServerCredentials credentials = m_serversModel->getServerCredentials(serverIndex); DockerContainer container = static_cast(m_containersModel->getCurrentlyProcessedContainerIndex()); @@ -155,7 +155,7 @@ void ExportController::generateOpenVpnConfig(const QString &clientName) { clearPreviousConfig(); - int serverIndex = m_serversModel->getCurrentlyProcessedServerIndex(); + int serverIndex = m_serversModel->getProcessedServerIndex(); ServerCredentials credentials = m_serversModel->getServerCredentials(serverIndex); DockerContainer container = static_cast(m_containersModel->getCurrentlyProcessedContainerIndex()); @@ -193,7 +193,7 @@ void ExportController::generateWireGuardConfig(const QString &clientName) { clearPreviousConfig(); - int serverIndex = m_serversModel->getCurrentlyProcessedServerIndex(); + int serverIndex = m_serversModel->getProcessedServerIndex(); ServerCredentials credentials = m_serversModel->getServerCredentials(serverIndex); DockerContainer container = static_cast(m_containersModel->getCurrentlyProcessedContainerIndex()); @@ -232,7 +232,7 @@ void ExportController::generateShadowSocksConfig() { clearPreviousConfig(); - int serverIndex = m_serversModel->getCurrentlyProcessedServerIndex(); + int serverIndex = m_serversModel->getProcessedServerIndex(); ServerCredentials credentials = m_serversModel->getServerCredentials(serverIndex); DockerContainer container = static_cast(m_containersModel->getCurrentlyProcessedContainerIndex()); @@ -268,7 +268,7 @@ void ExportController::generateCloakConfig() { clearPreviousConfig(); - int serverIndex = m_serversModel->getCurrentlyProcessedServerIndex(); + int serverIndex = m_serversModel->getProcessedServerIndex(); ServerCredentials credentials = m_serversModel->getServerCredentials(serverIndex); DockerContainer container = static_cast(m_containersModel->getCurrentlyProcessedContainerIndex()); @@ -328,7 +328,7 @@ void ExportController::updateClientManagementModel(const DockerContainer contain void ExportController::revokeConfig(const int row, const DockerContainer container, ServerCredentials credentials) { ErrorCode errorCode = m_clientManagementModel->revokeClient(row, container, credentials, - m_serversModel->getCurrentlyProcessedServerIndex()); + m_serversModel->getProcessedServerIndex()); if (errorCode != ErrorCode::NoError) { emit exportErrorOccurred(errorString(errorCode)); } diff --git a/client/ui/controllers/installController.cpp b/client/ui/controllers/installController.cpp index 117c8116..25ce155f 100644 --- a/client/ui/controllers/installController.cpp +++ b/client/ui/controllers/installController.cpp @@ -176,7 +176,7 @@ void InstallController::installServer(DockerContainer container, QJsonObject &co void InstallController::installContainer(DockerContainer container, QJsonObject &config) { - int serverIndex = m_serversModel->getCurrentlyProcessedServerIndex(); + int serverIndex = m_serversModel->getProcessedServerIndex(); ServerCredentials serverCredentials = qvariant_cast(m_serversModel->data(serverIndex, ServersModel::Roles::CredentialsRole)); @@ -238,7 +238,7 @@ bool InstallController::isServerAlreadyExists() void InstallController::scanServerForInstalledContainers() { - int serverIndex = m_serversModel->getCurrentlyProcessedServerIndex(); + int serverIndex = m_serversModel->getProcessedServerIndex(); ServerCredentials serverCredentials = qvariant_cast(m_serversModel->data(serverIndex, ServersModel::Roles::CredentialsRole)); @@ -267,7 +267,7 @@ void InstallController::scanServerForInstalledContainers() void InstallController::updateContainer(QJsonObject config) { - int serverIndex = m_serversModel->getCurrentlyProcessedServerIndex(); + int serverIndex = m_serversModel->getProcessedServerIndex(); ServerCredentials serverCredentials = qvariant_cast(m_serversModel->data(serverIndex, ServersModel::Roles::CredentialsRole)); @@ -283,8 +283,8 @@ void InstallController::updateContainer(QJsonObject config) m_serversModel->updateContainerConfig(container, config); m_protocolModel->updateModel(config); - if ((serverIndex == m_serversModel->getDefaultServerIndex()) - && (container == m_serversModel->getDefaultContainer(serverIndex))) { + auto defaultContainer = qvariant_cast(m_serversModel->data(serverIndex, ServersModel::Roles::DefaultContainerRole)); + if ((serverIndex == m_serversModel->getDefaultServerIndex()) && (container == defaultContainer)) { emit currentContainerUpdated(); } else { emit updateContainerFinished(tr("Settings updated successfully")); @@ -296,27 +296,27 @@ void InstallController::updateContainer(QJsonObject config) emit installationErrorOccurred(errorString(errorCode)); } -void InstallController::rebootCurrentlyProcessedServer() +void InstallController::rebootProcessedServer() { - int serverIndex = m_serversModel->getCurrentlyProcessedServerIndex(); + int serverIndex = m_serversModel->getProcessedServerIndex(); QString serverName = m_serversModel->data(serverIndex, ServersModel::Roles::NameRole).toString(); m_serversModel->rebootServer(); - emit rebootCurrentlyProcessedServerFinished(tr("Server '%1' was rebooted").arg(serverName)); + emit rebootProcessedServerFinished(tr("Server '%1' was rebooted").arg(serverName)); } -void InstallController::removeCurrentlyProcessedServer() +void InstallController::removeProcessedServer() { - int serverIndex = m_serversModel->getCurrentlyProcessedServerIndex(); + int serverIndex = m_serversModel->getProcessedServerIndex(); QString serverName = m_serversModel->data(serverIndex, ServersModel::Roles::NameRole).toString(); m_serversModel->removeServer(); - emit removeCurrentlyProcessedServerFinished(tr("Server '%1' was removed").arg(serverName)); + emit removeProcessedServerFinished(tr("Server '%1' was removed").arg(serverName)); } void InstallController::removeAllContainers() { - int serverIndex = m_serversModel->getCurrentlyProcessedServerIndex(); + int serverIndex = m_serversModel->getProcessedServerIndex(); QString serverName = m_serversModel->data(serverIndex, ServersModel::Roles::NameRole).toString(); ErrorCode errorCode = m_serversModel->removeAllContainers(); @@ -329,7 +329,7 @@ void InstallController::removeAllContainers() void InstallController::removeCurrentlyProcessedContainer() { - int serverIndex = m_serversModel->getCurrentlyProcessedServerIndex(); + int serverIndex = m_serversModel->getProcessedServerIndex(); QString serverName = m_serversModel->data(serverIndex, ServersModel::Roles::NameRole).toString(); int container = m_containersModel->getCurrentlyProcessedContainerIndex(); @@ -377,7 +377,7 @@ void InstallController::mountSftpDrive(const QString &port, const QString &passw QString mountPath; QString cmd; - int serverIndex = m_serversModel->getCurrentlyProcessedServerIndex(); + int serverIndex = m_serversModel->getProcessedServerIndex(); ServerCredentials serverCredentials = qvariant_cast(m_serversModel->data(serverIndex, ServersModel::Roles::CredentialsRole)); QString hostname = serverCredentials.hostName; diff --git a/client/ui/controllers/installController.h b/client/ui/controllers/installController.h index a67912cf..6b5295dc 100644 --- a/client/ui/controllers/installController.h +++ b/client/ui/controllers/installController.h @@ -30,8 +30,8 @@ public slots: void updateContainer(QJsonObject config); - void removeCurrentlyProcessedServer(); - void rebootCurrentlyProcessedServer(); + void removeProcessedServer(); + void rebootProcessedServer(); void removeAllContainers(); void removeCurrentlyProcessedContainer(); @@ -54,8 +54,8 @@ signals: void scanServerFinished(bool isInstalledContainerFound); - void rebootCurrentlyProcessedServerFinished(const QString &finishedMessage); - void removeCurrentlyProcessedServerFinished(const QString &finishedMessage); + void rebootProcessedServerFinished(const QString &finishedMessage); + void removeProcessedServerFinished(const QString &finishedMessage); void removeAllContainersFinished(const QString &finishedMessage); void removeCurrentlyProcessedContainerFinished(const QString &finishedMessage); diff --git a/client/ui/models/servers_model.cpp b/client/ui/models/servers_model.cpp index af167f20..a4420255 100644 --- a/client/ui/models/servers_model.cpp +++ b/client/ui/models/servers_model.cpp @@ -5,19 +5,13 @@ ServersModel::ServersModel(std::shared_ptr settings, QObject *parent) : m_settings(settings), QAbstractListModel(parent) { - m_servers = m_settings->serversArray(); - m_defaultServerIndex = m_settings->defaultServerIndex(); - m_currentlyProcessedServerIndex = m_defaultServerIndex; - connect(this, &ServersModel::defaultServerIndexChanged, this, &ServersModel::defaultServerNameChanged); - connect(this, &ServersModel::defaultContainerChanged, this, &ServersModel::defaultServerDescriptionChanged); + connect(this, &ServersModel::defaultServerIndexChanged, this, [this](const int serverIndex) { auto defaultContainer = ContainerProps::containerFromString(m_servers.at(serverIndex).toObject().value(config_key::defaultContainer).toString()); - emit ServersModel::defaultContainerChanged(defaultContainer); - }); - connect(this, &ServersModel::currentlyProcessedServerIndexChanged, this, [this](const int serverIndex) { - auto defaultContainer = ContainerProps::containerFromString(m_servers.at(serverIndex).toObject().value(config_key::defaultContainer).toString()); - emit ServersModel::defaultContainerChanged(defaultContainer); + emit ServersModel::defaultServerDefaultContainerChanged(defaultContainer); + emit ServersModel::defaultServerNameChanged(); + updateDefaultServerContainersModel(); }); } @@ -74,16 +68,14 @@ QVariant ServersModel::data(const QModelIndex &index, int role) const return name; } case ServerDescriptionRole: { - if (configVersion) { - return server.value(config_key::description).toString(); - } - return server.value(config_key::hostName).toString(); + auto description = getServerDescription(server, index.row()); + return configVersion ? description : description + server.value(config_key::hostName).toString(); } case HostNameRole: return server.value(config_key::hostName).toString(); case CredentialsRole: return QVariant::fromValue(serverCredentials(index.row())); case CredentialsLoginRole: return serverCredentials(index.row()).userName; case IsDefaultRole: return index.row() == m_defaultServerIndex; - case IsCurrentlyProcessedRole: return index.row() == m_currentlyProcessedServerIndex; + case IsCurrentlyProcessedRole: return index.row() == m_processedServerIndex; case HasWriteAccessRole: { auto credentials = serverCredentials(index.row()); return (!credentials.userName.isEmpty() && !credentials.secretData.isEmpty()); @@ -95,6 +87,13 @@ QVariant ServersModel::data(const QModelIndex &index, int role) const case DefaultContainerRole: { return ContainerProps::containerFromString(server.value(config_key::defaultContainer).toString()); } + case IsServerFromApiRole: { + return server.value(config_key::configVersion).toInt(); + } + case HasAmneziaDns: { + QString primaryDns = server.value(config_key::dns1).toString(); + return primaryDns == protocols::dns::amneziaDnsIp; + } } return QVariant(); @@ -111,8 +110,9 @@ void ServersModel::resetModel() beginResetModel(); m_servers = m_settings->serversArray(); m_defaultServerIndex = m_settings->defaultServerIndex(); - m_currentlyProcessedServerIndex = m_defaultServerIndex; + m_processedServerIndex = m_defaultServerIndex; endResetModel(); + emit defaultServerIndexChanged(m_defaultServerIndex); } void ServersModel::setDefaultServerIndex(const int index) @@ -132,12 +132,7 @@ const QString ServersModel::getDefaultServerName() return qvariant_cast(data(m_defaultServerIndex, NameRole)); } -const QString ServersModel::getDefaultServerHostName() -{ - return qvariant_cast(data(m_defaultServerIndex, HostNameRole)); -} - -QString ServersModel::getDefaultServerDescription(const QJsonObject &server) +QString ServersModel::getServerDescription(const QJsonObject &server, const int index) const { const auto configVersion = server.value(config_key::configVersion).toInt(); @@ -145,13 +140,12 @@ QString ServersModel::getDefaultServerDescription(const QJsonObject &server) if (configVersion) { return server.value(config_key::description).toString(); - } else if (isDefaultServerHasWriteAccess()) { - if (m_isAmneziaDnsEnabled - && isAmneziaDnsContainerInstalled(m_defaultServerIndex)) { + } else if (data(index, HasWriteAccessRole).toBool()) { + if (m_isAmneziaDnsEnabled && isAmneziaDnsContainerInstalled(index)) { description += "Amnezia DNS | "; } } else { - if (isDefaultServerConfigContainsAmneziaDns()) { + if (data(index, HasAmneziaDns).toBool()) { description += "Amnezia DNS | "; } } @@ -162,7 +156,7 @@ const QString ServersModel::getDefaultServerDescriptionCollapsed() { const QJsonObject server = m_servers.at(m_defaultServerIndex).toObject(); const auto configVersion = server.value(config_key::configVersion).toInt(); - auto description = getDefaultServerDescription(server); + auto description = getServerDescription(server, m_defaultServerIndex); if (configVersion) { return description; } @@ -176,7 +170,7 @@ const QString ServersModel::getDefaultServerDescriptionExpanded() { const QJsonObject server = m_servers.at(m_defaultServerIndex).toObject(); const auto configVersion = server.value(config_key::configVersion).toInt(); - auto description = getDefaultServerDescription(server); + auto description = getServerDescription(server, m_defaultServerIndex); if (configVersion) { return description; } @@ -199,26 +193,21 @@ bool ServersModel::hasServerWithWriteAccess() return false; } -void ServersModel::setCurrentlyProcessedServerIndex(const int index) +void ServersModel::setProcessedServerIndex(const int index) { - m_currentlyProcessedServerIndex = index; + m_processedServerIndex = index; updateContainersModel(); - emit currentlyProcessedServerIndexChanged(m_currentlyProcessedServerIndex); + emit processedServerIndexChanged(m_processedServerIndex); } -int ServersModel::getCurrentlyProcessedServerIndex() +int ServersModel::getProcessedServerIndex() { - return m_currentlyProcessedServerIndex; + return m_processedServerIndex; } -QString ServersModel::getCurrentlyProcessedServerHostName() +const ServerCredentials ServersModel::getProcessedServerCredentials() { - return qvariant_cast(data(m_currentlyProcessedServerIndex, HostNameRole)); -} - -const ServerCredentials ServersModel::getCurrentlyProcessedServerCredentials() -{ - return serverCredentials(m_currentlyProcessedServerIndex); + return serverCredentials(m_processedServerIndex); } const ServerCredentials ServersModel::getServerCredentials(const int index) @@ -228,12 +217,12 @@ const ServerCredentials ServersModel::getServerCredentials(const int index) bool ServersModel::isDefaultServerCurrentlyProcessed() { - return m_defaultServerIndex == m_currentlyProcessedServerIndex; + return m_defaultServerIndex == m_processedServerIndex; } -bool ServersModel::isCurrentlyProcessedServerHasWriteAccess() +bool ServersModel::isProcessedServerHasWriteAccess() { - return qvariant_cast(data(m_currentlyProcessedServerIndex, HasWriteAccessRole)); + return qvariant_cast(data(m_processedServerIndex, HasWriteAccessRole)); } bool ServersModel::isDefaultServerHasWriteAccess() @@ -249,40 +238,42 @@ void ServersModel::addServer(const QJsonObject &server) endResetModel(); } -void ServersModel::editServer(const QJsonObject &server) +void ServersModel::editServer(const QJsonObject &server, const int serverIndex) { - m_settings->editServer(m_currentlyProcessedServerIndex, server); - m_servers.replace(m_currentlyProcessedServerIndex, m_settings->serversArray().at(m_currentlyProcessedServerIndex)); - emit dataChanged(index(m_currentlyProcessedServerIndex, 0), index(m_currentlyProcessedServerIndex, 0)); + m_settings->editServer(serverIndex, server); + m_servers.replace(serverIndex, m_settings->serversArray().at(serverIndex)); + emit dataChanged(index(serverIndex, 0), index(serverIndex, 0)); + + if (serverIndex == m_defaultServerIndex) { + updateDefaultServerContainersModel(); + } updateContainersModel(); + + if (isDefaultServerCurrentlyProcessed()) { + auto defaultContainer = qvariant_cast(getDefaultServerData("defaultContainer")); + emit defaultServerDefaultContainerChanged(defaultContainer); + } } void ServersModel::removeServer() { beginResetModel(); - m_settings->removeServer(m_currentlyProcessedServerIndex); + m_settings->removeServer(m_processedServerIndex); m_servers = m_settings->serversArray(); - if (m_settings->defaultServerIndex() == m_currentlyProcessedServerIndex) { + if (m_settings->defaultServerIndex() == m_processedServerIndex) { setDefaultServerIndex(0); - } else if (m_settings->defaultServerIndex() > m_currentlyProcessedServerIndex) { + } else if (m_settings->defaultServerIndex() > m_processedServerIndex) { setDefaultServerIndex(m_settings->defaultServerIndex() - 1); } if (m_settings->serversCount() == 0) { setDefaultServerIndex(-1); } - setCurrentlyProcessedServerIndex(m_defaultServerIndex); + setProcessedServerIndex(m_defaultServerIndex); endResetModel(); } -bool ServersModel::isDefaultServerConfigContainsAmneziaDns() -{ - const QJsonObject server = m_servers.at(m_defaultServerIndex).toObject(); - QString primaryDns = server.value(config_key::dns1).toString(); - return primaryDns == protocols::dns::amneziaDnsIp; -} - QHash ServersModel::roleNames() const { QHash roles; @@ -290,6 +281,8 @@ QHash ServersModel::roleNames() const roles[NameRole] = "serverName"; roles[NameRole] = "name"; roles[ServerDescriptionRole] = "serverDescription"; + roles[CollapsedServerDescriptionRole] = "collapsedServerDescription"; + roles[ExpandedServerDescriptionRole] = "expandedServerDescription"; roles[HostNameRole] = "hostName"; @@ -304,6 +297,8 @@ QHash ServersModel::roleNames() const roles[ContainsAmneziaDnsRole] = "containsAmneziaDns"; roles[DefaultContainerRole] = "defaultContainer"; + + roles[IsServerFromApiRole] = "isServerFromApi"; return roles; } @@ -322,28 +317,29 @@ ServerCredentials ServersModel::serverCredentials(int index) const void ServersModel::updateContainersModel() { - auto containers = m_servers.at(m_currentlyProcessedServerIndex).toObject().value(config_key::containers).toArray(); + auto containers = m_servers.at(m_processedServerIndex).toObject().value(config_key::containers).toArray(); emit containersUpdated(containers); } +void ServersModel::updateDefaultServerContainersModel() +{ + auto containers = m_servers.at(m_defaultServerIndex).toObject().value(config_key::containers).toArray(); + emit defaultServerContainersUpdated(containers); +} + QJsonObject ServersModel::getDefaultServerConfig() { return m_servers.at(m_defaultServerIndex).toObject(); } -QJsonObject ServersModel::getCurrentlyProcessedServerConfig() +void ServersModel::reloadDefaultServerContainerConfig() { - return m_servers.at(m_currentlyProcessedServerIndex).toObject(); -} - -void ServersModel::reloadContainerConfig() -{ - QJsonObject server = m_servers.at(m_currentlyProcessedServerIndex).toObject(); + QJsonObject server = m_servers.at(m_defaultServerIndex).toObject(); auto container = ContainerProps::containerFromString(server.value(config_key::defaultContainer).toString()); auto containers = server.value(config_key::containers).toArray(); - auto config = m_settings->containerConfig(m_currentlyProcessedServerIndex, container); + auto config = m_settings->containerConfig(m_defaultServerIndex, container); for (auto i = 0; i < containers.size(); i++) { auto c = ContainerProps::containerFromString(containers.at(i).toObject().value(config_key::container).toString()); if (c == container) { @@ -353,13 +349,13 @@ void ServersModel::reloadContainerConfig() } server.insert(config_key::containers, containers); - editServer(server); + editServer(server, m_defaultServerIndex); } void ServersModel::updateContainerConfig(const int containerIndex, const QJsonObject config) { auto container = static_cast(containerIndex); - QJsonObject server = m_servers.at(m_currentlyProcessedServerIndex).toObject(); + QJsonObject server = m_servers.at(m_processedServerIndex).toObject(); auto containers = server.value(config_key::containers).toArray(); for (auto i = 0; i < containers.size(); i++) { @@ -377,30 +373,25 @@ void ServersModel::updateContainerConfig(const int containerIndex, const QJsonOb server.insert(config_key::defaultContainer, ContainerProps::containerToString(container)); } - editServer(server); + editServer(server, m_processedServerIndex); } void ServersModel::addContainerConfig(const int containerIndex, const QJsonObject config) { auto container = static_cast(containerIndex); - QJsonObject server = m_servers.at(m_currentlyProcessedServerIndex).toObject(); + QJsonObject server = m_servers.at(m_processedServerIndex).toObject(); auto containers = server.value(config_key::containers).toArray(); containers.push_back(config); server.insert(config_key::containers, containers); - bool isDefaultContainerChanged = false; auto defaultContainer = server.value(config_key::defaultContainer).toString(); if ((ContainerProps::containerFromString(defaultContainer) == DockerContainer::None || ContainerProps::containerService(container) != ServiceType::Other)) { server.insert(config_key::defaultContainer, ContainerProps::containerToString(container)); - isDefaultContainerChanged = true; } - editServer(server); - if (isDefaultContainerChanged) { - emit defaultContainerChanged(container); - } + editServer(server, m_processedServerIndex); } void ServersModel::setDefaultContainer(const int serverIndex, const int containerIndex) @@ -408,18 +399,12 @@ void ServersModel::setDefaultContainer(const int serverIndex, const int containe auto container = static_cast(containerIndex); QJsonObject s = m_servers.at(serverIndex).toObject(); s.insert(config_key::defaultContainer, ContainerProps::containerToString(container)); - editServer(s); //check - emit defaultContainerChanged(container); + editServer(s, serverIndex); //check } -DockerContainer ServersModel::getDefaultContainer(const int serverIndex) +const QString ServersModel::getDefaultServerDefaultContainerName() { - return qvariant_cast(data(serverIndex, DefaultContainerRole)); -} - -const QString ServersModel::getDefaultContainerName() -{ - auto defaultContainer = getDefaultContainer(m_defaultServerIndex); + auto defaultContainer = qvariant_cast(getDefaultServerData("defaultContainer")); return ContainerProps::containerHumanNames().value(defaultContainer); } @@ -427,15 +412,14 @@ ErrorCode ServersModel::removeAllContainers() { ServerController serverController(m_settings); ErrorCode errorCode = - serverController.removeAllContainers(m_settings->serverCredentials(m_currentlyProcessedServerIndex)); + serverController.removeAllContainers(m_settings->serverCredentials(m_processedServerIndex)); if (errorCode == ErrorCode::NoError) { - QJsonObject s = m_servers.at(m_currentlyProcessedServerIndex).toObject(); + QJsonObject s = m_servers.at(m_processedServerIndex).toObject(); s.insert(config_key::containers, {}); s.insert(config_key::defaultContainer, ContainerProps::containerToString(DockerContainer::None)); - editServer(s); - emit defaultContainerChanged(DockerContainer::None); + editServer(s, m_processedServerIndex); } return errorCode; } @@ -443,7 +427,7 @@ ErrorCode ServersModel::removeAllContainers() ErrorCode ServersModel::rebootServer() { ServerController serverController(m_settings); - auto credentials = m_settings->serverCredentials(m_currentlyProcessedServerIndex); + auto credentials = m_settings->serverCredentials(m_processedServerIndex); ErrorCode errorCode = serverController.rebootServer(credentials); return errorCode; @@ -452,13 +436,13 @@ ErrorCode ServersModel::rebootServer() ErrorCode ServersModel::removeContainer(const int containerIndex) { ServerController serverController(m_settings); - auto credentials = m_settings->serverCredentials(m_currentlyProcessedServerIndex); + auto credentials = m_settings->serverCredentials(m_processedServerIndex); auto dockerContainer = static_cast(containerIndex); ErrorCode errorCode = serverController.removeContainer(credentials, dockerContainer); if (errorCode == ErrorCode::NoError) { - QJsonObject server = m_servers.at(m_currentlyProcessedServerIndex).toObject(); + QJsonObject server = m_servers.at(m_processedServerIndex).toObject(); auto containers = server.value(config_key::containers).toArray(); for (auto it = containers.begin(); it != containers.end(); it++) { @@ -480,32 +464,37 @@ ErrorCode ServersModel::removeContainer(const int containerIndex) server.insert(config_key::defaultContainer, ContainerProps::containerToString(defaultContainer)); } - editServer(server); - emit defaultContainerChanged(defaultContainer); + editServer(server, m_processedServerIndex); } return errorCode; } void ServersModel::clearCachedProfiles() { - const auto &containers = m_settings->containers(m_currentlyProcessedServerIndex); + const auto &containers = m_settings->containers(m_processedServerIndex); for (DockerContainer container : containers.keys()) { - m_settings->clearLastConnectionConfig(m_currentlyProcessedServerIndex, container); + m_settings->clearLastConnectionConfig(m_processedServerIndex, container); } - m_servers.replace(m_currentlyProcessedServerIndex, m_settings->server(m_currentlyProcessedServerIndex)); + m_servers.replace(m_processedServerIndex, m_settings->server(m_processedServerIndex)); + if (m_processedServerIndex == m_defaultServerIndex) { + updateDefaultServerContainersModel(); + } updateContainersModel(); } void ServersModel::clearCachedProfile(const DockerContainer container) { - m_settings->clearLastConnectionConfig(m_currentlyProcessedServerIndex, container); + m_settings->clearLastConnectionConfig(m_processedServerIndex, container); - m_servers.replace(m_currentlyProcessedServerIndex, m_settings->server(m_currentlyProcessedServerIndex)); + m_servers.replace(m_processedServerIndex, m_settings->server(m_processedServerIndex)); + if (m_processedServerIndex == m_defaultServerIndex) { + updateDefaultServerContainersModel(); + } updateContainersModel(); } -bool ServersModel::isAmneziaDnsContainerInstalled(const int serverIndex) +bool ServersModel::isAmneziaDnsContainerInstalled(const int serverIndex) const { QJsonObject server = m_servers.at(serverIndex).toObject(); auto containers = server.value(config_key::containers).toArray(); @@ -544,16 +533,6 @@ void ServersModel::toggleAmneziaDns(bool enabled) emit defaultServerDescriptionChanged(); } -bool ServersModel::isDefaultServerFromApi() -{ - return m_settings->server(m_defaultServerIndex).value(config_key::configVersion).toInt(); -} - -bool ServersModel::isCurrentlyProcessedServerFromApi() -{ - return m_settings->server(m_currentlyProcessedServerIndex).value(config_key::configVersion).toInt(); -} - bool ServersModel::isServerFromApiAlreadyExists(const quint16 crc) { for (const auto &server : qAsConst(m_servers)) { @@ -564,3 +543,37 @@ bool ServersModel::isServerFromApiAlreadyExists(const quint16 crc) return false; } +QVariant ServersModel::getDefaultServerData(const QString roleString) +{ + auto roles = roleNames(); + for (auto it = roles.begin(); it != roles.end(); it++) { + if (QString(it.value()) == roleString) { + return data(m_defaultServerIndex, it.key()); + } + } + + return {}; +} + +void ServersModel::setDefaultServerData(const QString roleString, const QVariant &value) +{ + +} + +QVariant ServersModel::getProcessedServerData(const QString roleString) +{ + auto roles = roleNames(); + for (auto it = roles.begin(); it != roles.end(); it++) { + if (QString(it.value()) == roleString) { + return data(m_processedServerIndex, it.key()); + } + } + + return {}; +} + +void ServersModel::setProcessedServerData(const QString roleString, const QVariant &value) +{ + +} + diff --git a/client/ui/models/servers_model.h b/client/ui/models/servers_model.h index e9e1926c..1adaebae 100644 --- a/client/ui/models/servers_model.h +++ b/client/ui/models/servers_model.h @@ -12,7 +12,8 @@ public: enum Roles { NameRole = Qt::UserRole + 1, ServerDescriptionRole, - + CollapsedServerDescriptionRole, + ExpandedServerDescriptionRole, HostNameRole, CredentialsRole, @@ -25,7 +26,11 @@ public: ContainsAmneziaDnsRole, - DefaultContainerRole + DefaultContainerRole, + + IsServerFromApiRole, + + HasAmneziaDns }; ServersModel(std::shared_ptr settings, QObject *parent = nullptr); @@ -40,47 +45,40 @@ public: Q_PROPERTY(int defaultIndex READ getDefaultServerIndex WRITE setDefaultServerIndex NOTIFY defaultServerIndexChanged) Q_PROPERTY(QString defaultServerName READ getDefaultServerName NOTIFY defaultServerNameChanged) - Q_PROPERTY(QString defaultServerHostName READ getDefaultServerHostName NOTIFY defaultServerIndexChanged) - Q_PROPERTY(QString defaultContainerName READ getDefaultContainerName NOTIFY defaultContainerChanged) - Q_PROPERTY(QString defaultServerDescriptionCollapsed READ getDefaultServerDescriptionCollapsed NOTIFY defaultServerDescriptionChanged) - Q_PROPERTY(QString defaultServerDescriptionExpanded READ getDefaultServerDescriptionExpanded NOTIFY defaultServerDescriptionChanged) + Q_PROPERTY(QString defaultServerDefaultContainerName READ getDefaultServerDefaultContainerName NOTIFY defaultServerDefaultContainerChanged) + Q_PROPERTY(QString defaultServerDescriptionCollapsed READ getDefaultServerDescriptionCollapsed NOTIFY defaultServerDefaultContainerChanged) + Q_PROPERTY(QString defaultServerDescriptionExpanded READ getDefaultServerDescriptionExpanded NOTIFY defaultServerDefaultContainerChanged) - Q_PROPERTY(int currentlyProcessedIndex READ getCurrentlyProcessedServerIndex WRITE setCurrentlyProcessedServerIndex - NOTIFY currentlyProcessedServerIndexChanged) + Q_PROPERTY(int processedIndex READ getProcessedServerIndex WRITE setProcessedServerIndex NOTIFY processedServerIndexChanged) public slots: void setDefaultServerIndex(const int index); const int getDefaultServerIndex(); const QString getDefaultServerName(); - const QString getDefaultServerHostName(); const QString getDefaultServerDescriptionCollapsed(); const QString getDefaultServerDescriptionExpanded(); + const QString getDefaultServerDefaultContainerName(); bool isDefaultServerCurrentlyProcessed(); - bool isCurrentlyProcessedServerHasWriteAccess(); + bool isProcessedServerHasWriteAccess(); bool isDefaultServerHasWriteAccess(); bool hasServerWithWriteAccess(); const int getServersCount(); - void setCurrentlyProcessedServerIndex(const int index); - int getCurrentlyProcessedServerIndex(); + void setProcessedServerIndex(const int index); + int getProcessedServerIndex(); - QString getCurrentlyProcessedServerHostName(); - const ServerCredentials getCurrentlyProcessedServerCredentials(); + const ServerCredentials getProcessedServerCredentials(); const ServerCredentials getServerCredentials(const int index); void addServer(const QJsonObject &server); - void editServer(const QJsonObject &server); + void editServer(const QJsonObject &server, const int serverIndex); void removeServer(); - bool isDefaultServerConfigContainsAmneziaDns(); - bool isAmneziaDnsContainerInstalled(const int serverIndex); - QJsonObject getDefaultServerConfig(); - QJsonObject getCurrentlyProcessedServerConfig(); - void reloadContainerConfig(); + void reloadDefaultServerContainerConfig(); void updateContainerConfig(const int containerIndex, const QJsonObject config); void addContainerConfig(const int containerIndex, const QJsonObject config); @@ -92,42 +90,47 @@ public slots: ErrorCode rebootServer(); void setDefaultContainer(const int serverIndex, const int containerIndex); - DockerContainer getDefaultContainer(const int serverIndex); - const QString getDefaultContainerName(); QStringList getAllInstalledServicesName(const int serverIndex); void toggleAmneziaDns(bool enabled); - bool isDefaultServerFromApi(); - bool isCurrentlyProcessedServerFromApi(); - bool isServerFromApiAlreadyExists(const quint16 crc); + QVariant getDefaultServerData(const QString roleString); + void setDefaultServerData(const QString roleString, const QVariant &value); + + QVariant getProcessedServerData(const QString roleString); + void setProcessedServerData(const QString roleString, const QVariant &value); + protected: QHash roleNames() const override; signals: - void currentlyProcessedServerIndexChanged(const int index); + void processedServerIndexChanged(const int index); void defaultServerIndexChanged(const int index); void defaultServerNameChanged(); void defaultServerDescriptionChanged(); void containersUpdated(const QJsonArray &containers); - void defaultContainerChanged(const int containerIndex); + void defaultServerContainersUpdated(const QJsonArray &containers); + void defaultServerDefaultContainerChanged(const int containerIndex); private: ServerCredentials serverCredentials(int index) const; void updateContainersModel(); + void updateDefaultServerContainersModel(); - QString getDefaultServerDescription(const QJsonObject &server); + QString getServerDescription(const QJsonObject &server, const int index) const; + + bool isAmneziaDnsContainerInstalled(const int serverIndex) const; QJsonArray m_servers; std::shared_ptr m_settings; int m_defaultServerIndex; - int m_currentlyProcessedServerIndex; + int m_processedServerIndex; bool m_isAmneziaDnsEnabled = m_settings->useAmneziaDns(); }; diff --git a/client/ui/qml/Components/ConnectButton.qml b/client/ui/qml/Components/ConnectButton.qml index 7d6b1455..a915eb21 100644 --- a/client/ui/qml/Components/ConnectButton.qml +++ b/client/ui/qml/Components/ConnectButton.qml @@ -138,7 +138,7 @@ Button { } onClicked: { - ServersModel.setCurrentlyProcessedServerIndex(ServersModel.defaultIndex) + ServersModel.setProcessedServerIndex(ServersModel.defaultIndex) ApiController.updateServerConfigFromApi() } } diff --git a/client/ui/qml/Components/HomeContainersListView.qml b/client/ui/qml/Components/HomeContainersListView.qml index 0a431ff5..c785af8b 100644 --- a/client/ui/qml/Components/HomeContainersListView.qml +++ b/client/ui/qml/Components/HomeContainersListView.qml @@ -15,6 +15,7 @@ ListView { id: menuContent property var rootWidth + property var selectedText width: rootWidth height: menuContent.contentItem.height @@ -51,7 +52,7 @@ ListView { showImage: !isInstalled checkable: isInstalled && !ConnectionController.isConnected && isSupported - checked: proxyContainersModel.mapToSource(index) === ServersModel.getDefaultContainer(ServersModel.defaultIndex) + checked: proxyDefaultServerContainersModel.mapToSource(index) === ServersModel.getDefaultServerData("defaultContainer") onClicked: { if (ConnectionController.isConnected && isInstalled) { @@ -61,14 +62,14 @@ ListView { if (checked) { containersDropDown.close() - ServersModel.setDefaultContainer(ServersModel.defaultIndex, proxyContainersModel.mapToSource(index)) + ServersModel.setDefaultContainer(ServersModel.defaultIndex, proxyDefaultServerContainersModel.mapToSource(index)) } else { if (!isSupported && isInstalled) { PageController.showErrorMessage(qsTr("The selected protocol is not supported on the current platform")) return } - ContainersModel.setCurrentlyProcessedContainerIndex(proxyContainersModel.mapToSource(index)) + ContainersModel.setCurrentlyProcessedContainerIndex(proxyDefaultServerContainersModel.mapToSource(index)) InstallController.setShouldCreateServer(false) PageController.goToPage(PageEnum.PageSetupWizardProtocolSettings) containersDropDown.close() diff --git a/client/ui/qml/Pages2/PageHome.qml b/client/ui/qml/Pages2/PageHome.qml index 10243369..4b5ba53d 100644 --- a/client/ui/qml/Pages2/PageHome.qml +++ b/client/ui/qml/Pages2/PageHome.qml @@ -179,13 +179,12 @@ PageType { rootButtonTextTopMargin: 8 rootButtonTextBottomMargin: 8 - text: ServersModel.defaultContainerName + text: ServersModel.defaultServerDefaultContainerName textColor: "#0E0E11" headerText: qsTr("VPN protocol") headerBackButtonImage: "qrc:/images/controls/arrow-left.svg" rootButtonClickedFunction: function() { - ServersModel.currentlyProcessedIndex = serversMenuContent.currentIndex containersDropDown.open() } @@ -197,22 +196,23 @@ PageType { Connections { target: ServersModel - function onCurrentlyProcessedServerIndexChanged() { + function onDefaultServerIndexChanged() { updateContainersModelFilters() } } function updateContainersModelFilters() { - if (ServersModel.isCurrentlyProcessedServerHasWriteAccess()) { - proxyContainersModel.filters = ContainersModelFilters.getWriteAccessProtocolsListFilters() + if (ServersModel.isDefaultServerHasWriteAccess()) { + proxyDefaultServerContainersModel.filters = ContainersModelFilters.getWriteAccessProtocolsListFilters() } else { - proxyContainersModel.filters = ContainersModelFilters.getReadAccessProtocolsListFilters() + proxyDefaultServerContainersModel.filters = ContainersModelFilters.getReadAccessProtocolsListFilters() } } model: SortFilterProxyModel { - id: proxyContainersModel - sourceModel: ContainersModel + id: proxyDefaultServerContainersModel + sourceModel: DefaultServerContainersModel + sorters: [ RoleSorter { roleName: "isInstalled"; sortOrder: Qt.DescendingOrder } ] @@ -308,21 +308,7 @@ PageType { Layout.fillWidth: true text: name - descriptionText: { - var fullDescription = "" - if (hasWriteAccess) { - if (SettingsController.isAmneziaDnsEnabled() - && ServersModel.isAmneziaDnsContainerInstalled(index)) { - fullDescription += "Amnezia DNS | " - } - } else { - if (containsAmneziaDns) { - fullDescription += "Amnezia DNS | " - } - } - - return fullDescription += serverDescription - } + descriptionText: serverDescription checked: index === serversMenuContent.currentIndex checkable: !ConnectionController.isConnected @@ -337,7 +323,6 @@ PageType { serversMenuContent.currentIndex = index - ServersModel.currentlyProcessedIndex = index ServersModel.defaultIndex = index } @@ -358,7 +343,7 @@ PageType { z: 1 onClicked: function() { - ServersModel.currentlyProcessedIndex = index + ServersModel.processedIndex = index PageController.goToPage(PageEnum.PageSettingsServerInfo) drawer.close() } diff --git a/client/ui/qml/Pages2/PageProtocolAwgSettings.qml b/client/ui/qml/Pages2/PageProtocolAwgSettings.qml index 8b7dcdff..df9f0b9f 100644 --- a/client/ui/qml/Pages2/PageProtocolAwgSettings.qml +++ b/client/ui/qml/Pages2/PageProtocolAwgSettings.qml @@ -44,7 +44,7 @@ PageType { anchors.left: parent.left anchors.right: parent.right - enabled: ServersModel.isCurrentlyProcessedServerHasWriteAccess() + enabled: ServersModel.isProcessedServerHasWriteAccess() ListView { diff --git a/client/ui/qml/Pages2/PageProtocolCloakSettings.qml b/client/ui/qml/Pages2/PageProtocolCloakSettings.qml index 1ae59fb3..b86397ba 100644 --- a/client/ui/qml/Pages2/PageProtocolCloakSettings.qml +++ b/client/ui/qml/Pages2/PageProtocolCloakSettings.qml @@ -43,7 +43,7 @@ PageType { anchors.left: parent.left anchors.right: parent.right - enabled: ServersModel.isCurrentlyProcessedServerHasWriteAccess() + enabled: ServersModel.isProcessedServerHasWriteAccess() ListView { id: listview diff --git a/client/ui/qml/Pages2/PageProtocolOpenVpnSettings.qml b/client/ui/qml/Pages2/PageProtocolOpenVpnSettings.qml index 7e8af1e1..7fb4634c 100644 --- a/client/ui/qml/Pages2/PageProtocolOpenVpnSettings.qml +++ b/client/ui/qml/Pages2/PageProtocolOpenVpnSettings.qml @@ -44,7 +44,7 @@ PageType { anchors.left: parent.left anchors.right: parent.right - enabled: ServersModel.isCurrentlyProcessedServerHasWriteAccess() + enabled: ServersModel.isProcessedServerHasWriteAccess() ListView { id: listview diff --git a/client/ui/qml/Pages2/PageProtocolRaw.qml b/client/ui/qml/Pages2/PageProtocolRaw.qml index d8550fd1..12d1722b 100644 --- a/client/ui/qml/Pages2/PageProtocolRaw.qml +++ b/client/ui/qml/Pages2/PageProtocolRaw.qml @@ -175,7 +175,7 @@ PageType { width: parent.width - visible: ServersModel.isCurrentlyProcessedServerHasWriteAccess() + visible: ServersModel.isProcessedServerHasWriteAccess() text: qsTr("Remove ") + ContainersModel.getCurrentlyProcessedContainerName() textColor: "#EB5757" diff --git a/client/ui/qml/Pages2/PageProtocolShadowSocksSettings.qml b/client/ui/qml/Pages2/PageProtocolShadowSocksSettings.qml index 7bb4455b..5284f807 100644 --- a/client/ui/qml/Pages2/PageProtocolShadowSocksSettings.qml +++ b/client/ui/qml/Pages2/PageProtocolShadowSocksSettings.qml @@ -43,7 +43,7 @@ PageType { anchors.left: parent.left anchors.right: parent.right - enabled: ServersModel.isCurrentlyProcessedServerHasWriteAccess() + enabled: ServersModel.isProcessedServerHasWriteAccess() ListView { id: listview diff --git a/client/ui/qml/Pages2/PageServiceSftpSettings.qml b/client/ui/qml/Pages2/PageServiceSftpSettings.qml index 3a58553e..9a0e5ff1 100644 --- a/client/ui/qml/Pages2/PageServiceSftpSettings.qml +++ b/client/ui/qml/Pages2/PageServiceSftpSettings.qml @@ -49,7 +49,7 @@ PageType { anchors.left: parent.left anchors.right: parent.right - enabled: ServersModel.isCurrentlyProcessedServerHasWriteAccess() + enabled: ServersModel.isProcessedServerHasWriteAccess() ListView { id: listview @@ -88,7 +88,7 @@ PageType { Layout.topMargin: 32 text: qsTr("Host") - descriptionText: ServersModel.getCurrentlyProcessedServerHostName() + descriptionText: ServersModel.getProcessedServerData("HostName") descriptionOnTop: true diff --git a/client/ui/qml/Pages2/PageSettingsDns.qml b/client/ui/qml/Pages2/PageSettingsDns.qml index f5aec54e..be2bd290 100644 --- a/client/ui/qml/Pages2/PageSettingsDns.qml +++ b/client/ui/qml/Pages2/PageSettingsDns.qml @@ -30,10 +30,12 @@ PageType { anchors.bottom: parent.bottom contentHeight: content.height - enabled: !ServersModel.isDefaultServerFromApi() + property var isServerFromApi: ServersModel.getDefaultServerData("isServerFromApi") + + enabled: !isServerFromApi Component.onCompleted: { - if (ServersModel.isDefaultServerFromApi()) { + if (isServerFromApi) { PageController.showNotificationMessage(qsTr("Default server does not support custom dns")) } } diff --git a/client/ui/qml/Pages2/PageSettingsServerData.qml b/client/ui/qml/Pages2/PageSettingsServerData.qml index c233714d..96945213 100644 --- a/client/ui/qml/Pages2/PageSettingsServerData.qml +++ b/client/ui/qml/Pages2/PageSettingsServerData.qml @@ -28,7 +28,7 @@ PageType { PageController.showErrorMessage(message) } - function onRemoveCurrentlyProcessedServerFinished(finishedMessage) { + function onRemoveProcessedServerFinished(finishedMessage) { if (!ServersModel.getServersCount()) { PageController.replaceStartPage() } else { @@ -38,7 +38,7 @@ PageType { PageController.showNotificationMessage(finishedMessage) } - function onRebootCurrentlyProcessedServerFinished(finishedMessage) { + function onRebootProcessedServerFinished(finishedMessage) { PageController.showNotificationMessage(finishedMessage) } @@ -64,8 +64,8 @@ PageType { Connections { target: ServersModel - function onCurrentlyProcessedServerIndexChanged() { - content.isServerWithWriteAccess = ServersModel.isCurrentlyProcessedServerHasWriteAccess() + function onProcessedServerIndexChanged() { + content.isServerWithWriteAccess = ServersModel.isProcessedServerHasWriteAccess() } } @@ -82,7 +82,7 @@ PageType { anchors.left: parent.left anchors.right: parent.right - property bool isServerWithWriteAccess: ServersModel.isCurrentlyProcessedServerHasWriteAccess() + property bool isServerWithWriteAccess: ServersModel.isProcessedServerHasWriteAccess() LabelWithButtonType { visible: content.isServerWithWriteAccess @@ -149,7 +149,7 @@ PageType { if (ServersModel.isDefaultServerCurrentlyProcessed() && ConnectionController.isConnected) { ConnectionController.closeConnection() } - InstallController.rebootCurrentlyProcessedServer() + InstallController.rebootProcessedServer() PageController.showBusyIndicator(false) } var noButtonFunction = function() { @@ -180,7 +180,7 @@ PageType { if (ServersModel.isDefaultServerCurrentlyProcessed() && ConnectionController.isConnected) { ConnectionController.closeConnection() } - InstallController.removeCurrentlyProcessedServer() + InstallController.removeProcessedServer() PageController.showBusyIndicator(false) } var noButtonFunction = function() { @@ -224,7 +224,7 @@ PageType { } LabelWithButtonType { - visible: ServersModel.isCurrentlyProcessedServerFromApi() + visible: ServersModel.getProcessedServerData("isServerFromApi") Layout.fillWidth: true text: qsTr("Reset API config") @@ -249,7 +249,7 @@ PageType { } DividerType { - visible: ServersModel.isCurrentlyProcessedServerFromApi() + visible: ServersModel.getProcessedServerData("isServerFromApi") } } } diff --git a/client/ui/qml/Pages2/PageSettingsServerInfo.qml b/client/ui/qml/Pages2/PageSettingsServerInfo.qml index 5e2f8b12..01db5695 100644 --- a/client/ui/qml/Pages2/PageSettingsServerInfo.qml +++ b/client/ui/qml/Pages2/PageSettingsServerInfo.qml @@ -63,7 +63,7 @@ PageType { headerText: name descriptionText: { - if (ServersModel.isCurrentlyProcessedServerHasWriteAccess()) { + if (ServersModel.isProcessedServerHasWriteAccess()) { return credentialsLogin + " · " + hostName } else { return hostName diff --git a/client/ui/qml/Pages2/PageSettingsServerProtocol.qml b/client/ui/qml/Pages2/PageSettingsServerProtocol.qml index 0d901d61..b75e7342 100644 --- a/client/ui/qml/Pages2/PageSettingsServerProtocol.qml +++ b/client/ui/qml/Pages2/PageSettingsServerProtocol.qml @@ -107,7 +107,7 @@ PageType { width: parent.width - visible: ServersModel.isCurrentlyProcessedServerHasWriteAccess() + visible: ServersModel.isProcessedServerHasWriteAccess() text: qsTr("Remove ") + ContainersModel.getCurrentlyProcessedContainerName() textColor: "#EB5757" diff --git a/client/ui/qml/Pages2/PageSettingsServerProtocols.qml b/client/ui/qml/Pages2/PageSettingsServerProtocols.qml index 9fc2abde..1dfd2886 100644 --- a/client/ui/qml/Pages2/PageSettingsServerProtocols.qml +++ b/client/ui/qml/Pages2/PageSettingsServerProtocols.qml @@ -38,13 +38,13 @@ PageType { Connections { target: ServersModel - function onCurrentlyProcessedServerIndexChanged() { + function onProcessedServerIndexChanged() { settingsContainersListView.updateContainersModelFilters() } } function updateContainersModelFilters() { - if (ServersModel.isCurrentlyProcessedServerHasWriteAccess()) { + if (ServersModel.isProcessedServerHasWriteAccess()) { proxyContainersModel.filters = ContainersModelFilters.getWriteAccessProtocolsListFilters() } else { proxyContainersModel.filters = ContainersModelFilters.getReadAccessProtocolsListFilters() diff --git a/client/ui/qml/Pages2/PageSettingsServerServices.qml b/client/ui/qml/Pages2/PageSettingsServerServices.qml index 94fd4f94..8795bd23 100644 --- a/client/ui/qml/Pages2/PageSettingsServerServices.qml +++ b/client/ui/qml/Pages2/PageSettingsServerServices.qml @@ -38,13 +38,13 @@ PageType { Connections { target: ServersModel - function onCurrentlyProcessedServerIndexChanged() { + function onProcessedServerIndexChanged() { settingsContainersListView.updateContainersModelFilters() } } function updateContainersModelFilters() { - if (ServersModel.isCurrentlyProcessedServerHasWriteAccess()) { + if (ServersModel.isProcessedServerHasWriteAccess()) { proxyContainersModel.filters = ContainersModelFilters.getWriteAccessServicesListFilters() } else { proxyContainersModel.filters = ContainersModelFilters.getReadAccessServicesListFilters() diff --git a/client/ui/qml/Pages2/PageSettingsServersList.qml b/client/ui/qml/Pages2/PageSettingsServersList.qml index dca904ae..eb07eaf4 100644 --- a/client/ui/qml/Pages2/PageSettingsServersList.qml +++ b/client/ui/qml/Pages2/PageSettingsServersList.qml @@ -87,7 +87,7 @@ PageType { rightImageSource: "qrc:/images/controls/chevron-right.svg" clickedFunction: function() { - ServersModel.currentlyProcessedIndex = index + ServersModel.processedIndex = index PageController.goToPage(PageEnum.PageSettingsServerInfo) } } diff --git a/client/ui/qml/Pages2/PageSettingsSplitTunneling.qml b/client/ui/qml/Pages2/PageSettingsSplitTunneling.qml index 9916609b..729a6e9d 100644 --- a/client/ui/qml/Pages2/PageSettingsSplitTunneling.qml +++ b/client/ui/qml/Pages2/PageSettingsSplitTunneling.qml @@ -20,14 +20,16 @@ import "../Components" PageType { id: root + property var isServerFromApi: ServersModel.getDefaultServerData("isServerFromApi") + defaultActiveFocusItem: website_ip_field.textField property bool pageEnabled: { - return !ConnectionController.isConnected && !ServersModel.isDefaultServerFromApi() + return !ConnectionController.isConnected && !isServerFromApi } Component.onCompleted: { - if (ServersModel.isDefaultServerFromApi()) { + if (isServerFromApi) { PageController.showNotificationMessage(qsTr("Default server does not support split tunneling function")) } } diff --git a/client/ui/qml/Pages2/PageSetupWizardInstalling.qml b/client/ui/qml/Pages2/PageSetupWizardInstalling.qml index 7c8a7718..2a5cafd8 100644 --- a/client/ui/qml/Pages2/PageSetupWizardInstalling.qml +++ b/client/ui/qml/Pages2/PageSetupWizardInstalling.qml @@ -26,7 +26,7 @@ PageType { function onInstallContainerFinished(finishedMessage, isServiceInstall) { if (!ConnectionController.isConnected && !isServiceInstall) { - ServersModel.setDefaultContainer(ServersModel.currentlyProcessedIndex, ContainersModel.getCurrentlyProcessedContainerIndex()) + ServersModel.setDefaultContainer(ServersModel.processedIndex, ContainersModel.getCurrentlyProcessedContainerIndex()) } PageController.closePage() // close installing page @@ -42,7 +42,7 @@ PageType { function onInstallServerFinished(finishedMessage) { if (!ConnectionController.isConnected) { ServersModel.setDefaultServerIndex(ServersModel.getServersCount() - 1); - ServersModel.currentlyProcessedIndex = ServersModel.defaultIndex + ServersModel.processedIndex = ServersModel.defaultIndex } PageController.goToStartPage() @@ -55,7 +55,7 @@ PageType { function onServerAlreadyExists(serverIndex) { PageController.goToStartPage() - ServersModel.currentlyProcessedIndex = serverIndex + ServersModel.processedIndex = serverIndex PageController.goToPage(PageEnum.PageSettingsServerInfo, false) PageController.showErrorMessage(qsTr("The server has already been added to the application")) diff --git a/client/ui/qml/Pages2/PageSetupWizardViewConfig.qml b/client/ui/qml/Pages2/PageSetupWizardViewConfig.qml index 8a8a3e77..c755d88d 100644 --- a/client/ui/qml/Pages2/PageSetupWizardViewConfig.qml +++ b/client/ui/qml/Pages2/PageSetupWizardViewConfig.qml @@ -30,7 +30,7 @@ PageType { function onImportFinished() { if (!ConnectionController.isConnected) { ServersModel.setDefaultServerIndex(ServersModel.getServersCount() - 1); - ServersModel.currentlyProcessedIndex = ServersModel.defaultIndex + ServersModel.processedIndex = ServersModel.defaultIndex } PageController.goToStartPage() diff --git a/client/ui/qml/Pages2/PageShare.qml b/client/ui/qml/Pages2/PageShare.qml index 477cefe1..cd012e27 100644 --- a/client/ui/qml/Pages2/PageShare.qml +++ b/client/ui/qml/Pages2/PageShare.qml @@ -31,7 +31,7 @@ PageType { PageController.showBusyIndicator(true) ExportController.revokeConfig(index, ContainersModel.getCurrentlyProcessedContainerIndex(), - ServersModel.getCurrentlyProcessedServerCredentials()) + ServersModel.getProcessedServerCredentials()) PageController.showBusyIndicator(false) PageController.showNotificationMessage(qsTr("Config revoked")) } @@ -230,7 +230,7 @@ PageType { accessTypeSelector.currentIndex = 1 PageController.showBusyIndicator(true) ExportController.updateClientManagementModel(ContainersModel.getCurrentlyProcessedContainerIndex(), - ServersModel.getCurrentlyProcessedServerCredentials()) + ServersModel.getProcessedServerCredentials()) PageController.showBusyIndicator(false) } } @@ -315,7 +315,7 @@ PageType { function handler() { serverSelector.text = selectedText - ServersModel.currentlyProcessedIndex = proxyServersModel.mapToSource(currentIndex) + ServersModel.processedIndex = proxyServersModel.mapToSource(currentIndex) } } } @@ -365,7 +365,7 @@ PageType { target: serverSelector function onSeverSelectorIndexChanged() { - var defaultContainer = proxyContainersModel.mapFromSource(ServersModel.getDefaultContainer(ServersModel.currentlyProcessedIndex)) + var defaultContainer = proxyContainersModel.mapFromSource(ServersModel.getProcessedServerData("defaultContainer")) protocolSelectorListView.currentIndex = defaultContainer protocolSelectorListView.triggerCurrentItem() } @@ -388,7 +388,7 @@ PageType { if (accessTypeSelector.currentIndex === 1) { PageController.showBusyIndicator(true) ExportController.updateClientManagementModel(ContainersModel.getCurrentlyProcessedContainerIndex(), - ServersModel.getCurrentlyProcessedServerCredentials()) + ServersModel.getProcessedServerCredentials()) PageController.showBusyIndicator(false) } } @@ -654,7 +654,7 @@ PageType { ExportController.renameClient(index, clientNameEditor.textFieldText, ContainersModel.getCurrentlyProcessedContainerIndex(), - ServersModel.getCurrentlyProcessedServerCredentials()) + ServersModel.getProcessedServerCredentials()) PageController.showBusyIndicator(false) clientNameEditDrawer.close() } diff --git a/client/ui/qml/Pages2/PageShareFullAccess.qml b/client/ui/qml/Pages2/PageShareFullAccess.qml index 03097819..8acb42c2 100644 --- a/client/ui/qml/Pages2/PageShareFullAccess.qml +++ b/client/ui/qml/Pages2/PageShareFullAccess.qml @@ -111,7 +111,7 @@ PageType { function handler() { serverSelector.text = selectedText - ServersModel.currentlyProcessedIndex = proxyServersModel.mapToSource(currentIndex) + ServersModel.processedIndex = proxyServersModel.mapToSource(currentIndex) } } } diff --git a/client/ui/qml/Pages2/PageStart.qml b/client/ui/qml/Pages2/PageStart.qml index 93bfd79e..38a8e0b8 100644 --- a/client/ui/qml/Pages2/PageStart.qml +++ b/client/ui/qml/Pages2/PageStart.qml @@ -108,7 +108,7 @@ PageType { function onNoInstalledContainers() { PageController.setTriggeredBtConnectButton(true) - ServersModel.currentlyProcessedIndex = ServersModel.getDefaultServerIndex() + ServersModel.processedIndex = ServersModel.getDefaultServerIndex() InstallController.setShouldCreateServer(false) PageController.goToPage(PageEnum.PageSetupWizardEasy) } @@ -136,7 +136,7 @@ PageType { Component.onCompleted: { var pagePath = PageController.getPagePath(PageEnum.PageHome) - ServersModel.currentlyProcessedIndex = ServersModel.defaultIndex + ServersModel.processedIndex = ServersModel.defaultIndex tabBarStackView.push(pagePath, { "objectName" : pagePath }) } } @@ -180,7 +180,7 @@ PageType { image: "qrc:/images/controls/home.svg" onClicked: { tabBarStackView.goToTabBarPage(PageEnum.PageHome) - ServersModel.currentlyProcessedIndex = ServersModel.defaultIndex + ServersModel.processedIndex = ServersModel.defaultIndex tabBar.previousIndex = 0 } } From ee11a8410c85ca5a8bd181cbe42cecffc826ac2f Mon Sep 17 00:00:00 2001 From: Andrey Zaharow Date: Mon, 19 Feb 2024 18:28:29 +0100 Subject: [PATCH 22/36] Fix cursor change when hover over elements --- client/ui/qml/Controls2/DrawerType2.qml | 1 + 1 file changed, 1 insertion(+) diff --git a/client/ui/qml/Controls2/DrawerType2.qml b/client/ui/qml/Controls2/DrawerType2.qml index 160ca09a..5e6f785c 100644 --- a/client/ui/qml/Controls2/DrawerType2.qml +++ b/client/ui/qml/Controls2/DrawerType2.qml @@ -84,6 +84,7 @@ Item { id: emptyArea anchors.fill: parent enabled: root.isExpanded + visible: enabled onClicked: { root.close() } From ac894254cc52c469258d1606a6cfd549b4cfb033 Mon Sep 17 00:00:00 2001 From: Andrey Zaharow Date: Tue, 20 Feb 2024 00:23:20 +0100 Subject: [PATCH 23/36] Fix translation for #618 --- client/translations/amneziavpn_ar.ts | 10 +++++----- client/translations/amneziavpn_fa_IR.ts | 10 +++++----- client/translations/amneziavpn_ru.ts | 10 +++++----- client/translations/amneziavpn_zh_CN.ts | 10 +++++----- 4 files changed, 20 insertions(+), 20 deletions(-) diff --git a/client/translations/amneziavpn_ar.ts b/client/translations/amneziavpn_ar.ts index 2632e07d..8d981b6d 100644 --- a/client/translations/amneziavpn_ar.ts +++ b/client/translations/amneziavpn_ar.ts @@ -997,6 +997,11 @@ And if you don't like the app, all the more support it - the donation will https://amnezia.org + + + Software version: %1 + %1 :إصدار البرنامج + Check for updates @@ -2998,11 +3003,6 @@ While it offers a blend of security, stability, and speed, it's essential t SettingsController - - - Software version - إصدار البرنامج - Backup file is corrupted diff --git a/client/translations/amneziavpn_fa_IR.ts b/client/translations/amneziavpn_fa_IR.ts index 488d6564..f58ff352 100644 --- a/client/translations/amneziavpn_fa_IR.ts +++ b/client/translations/amneziavpn_fa_IR.ts @@ -1022,6 +1022,11 @@ Already installed containers were found on the server. All installed containers https://amnezia.org https://amnezia.org + + + Software version: %1 + %1 :نسخه نرم‎افزار + Check for updates @@ -3091,11 +3096,6 @@ This means that AmneziaWG keeps the fast performance of the original while addin SettingsController - - - Software version - نسخه نرم‎افزار - All settings have been reset to default values diff --git a/client/translations/amneziavpn_ru.ts b/client/translations/amneziavpn_ru.ts index e0ae9b79..1425197e 100644 --- a/client/translations/amneziavpn_ru.ts +++ b/client/translations/amneziavpn_ru.ts @@ -1020,6 +1020,11 @@ Already installed containers were found on the server. All installed containers https://amnezia.org https://amnezia.org + + + Software version: %1 + Версия ПО: %1 + Check for updates @@ -3058,11 +3063,6 @@ This means that AmneziaWG keeps the fast performance of the original while addin SettingsController - - - Software version - Версия ПО - All settings have been reset to default values diff --git a/client/translations/amneziavpn_zh_CN.ts b/client/translations/amneziavpn_zh_CN.ts index 1f400b99..4d1590cd 100644 --- a/client/translations/amneziavpn_zh_CN.ts +++ b/client/translations/amneziavpn_zh_CN.ts @@ -1067,6 +1067,11 @@ And if you don't like the app, all the more support it - the donation will https://amnezia.org + + + Software version: %1 + 软件版本: %1 + Check for updates @@ -3198,11 +3203,6 @@ While it offers a blend of security, stability, and speed, it's essential t SettingsController - - - Software version - 软件版本 - Backup file is corrupted From 560eb3d620addced5b03e2bdcab857c597bff0e7 Mon Sep 17 00:00:00 2001 From: Shehab Ahmed Date: Tue, 20 Feb 2024 20:37:19 +0200 Subject: [PATCH 24/36] updated the Arabic translation for fixing some sentences --- client/translations/amneziavpn_ar.ts | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/client/translations/amneziavpn_ar.ts b/client/translations/amneziavpn_ar.ts index 2632e07d..14b6ed03 100644 --- a/client/translations/amneziavpn_ar.ts +++ b/client/translations/amneziavpn_ar.ts @@ -1139,7 +1139,7 @@ And if you don't like the app, all the more support it - the donation will Restore from backup - استرجاع من ملف احتياطي + استرجاع من ملف يحتوي علي نسخة احتياطية @@ -1339,7 +1339,7 @@ And if you don't like the app, all the more support it - the donation will Save logs to file - احفظ السجلات لملف + احفظ السجلات في ملف @@ -1942,7 +1942,8 @@ It's okay as long as it's from someone you trust. A line that starts with vpn://... - سطر يبدأ ب vpn://... + يجب ان تٌكتب بهذه الطريقة حتي بوجود الخطأ كي تظهر بشكل صحيح داخل التطبيق + سطر يبدأ ب ...//:vpn From 15d866ce046f54913639653cf4c50f1fd0de94bd Mon Sep 17 00:00:00 2001 From: pokamest Date: Tue, 20 Feb 2024 11:05:36 -0800 Subject: [PATCH 25/36] WG/AWG ipv6 fix (#621) WG/AWG ipv6 fix --- client/mozilla/localsocketcontroller.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/client/mozilla/localsocketcontroller.cpp b/client/mozilla/localsocketcontroller.cpp index d7500685..8583de4e 100644 --- a/client/mozilla/localsocketcontroller.cpp +++ b/client/mozilla/localsocketcontroller.cpp @@ -124,7 +124,10 @@ void LocalSocketController::activate(const QJsonObject &rawConfig) { // json.insert("hopindex", QJsonValue((double)hop.m_hopindex)); json.insert("privateKey", wgConfig.value(amnezia::config_key::client_priv_key)); json.insert("deviceIpv4Address", wgConfig.value(amnezia::config_key::client_ip)); + // todo review wg ipv6 +#ifndef Q_OS_WINDOWS json.insert("deviceIpv6Address", "dead::1"); +#endif json.insert("serverPublicKey", wgConfig.value(amnezia::config_key::server_pub_key)); json.insert("serverPskKey", wgConfig.value(amnezia::config_key::psk_key)); json.insert("serverIpv4AddrIn", wgConfig.value(amnezia::config_key::hostName)); From 3828891b9be707bb8f2eec395da13acfc5280cfb Mon Sep 17 00:00:00 2001 From: KsZnak Date: Tue, 20 Feb 2024 22:46:23 +0200 Subject: [PATCH 26/36] Update amneziavpn_fa_IR.ts (#622) Update amneziavpn_fa_IR.ts --- client/translations/amneziavpn_fa_IR.ts | 100 ++++++++++++++---------- 1 file changed, 58 insertions(+), 42 deletions(-) diff --git a/client/translations/amneziavpn_fa_IR.ts b/client/translations/amneziavpn_fa_IR.ts index 488d6564..7a2172a8 100644 --- a/client/translations/amneziavpn_fa_IR.ts +++ b/client/translations/amneziavpn_fa_IR.ts @@ -144,7 +144,7 @@ Reconnect via VPN Procotol: - Переподключение через VPN протокол: + پروتکل VPN را متصل مجدد کنید" @@ -371,7 +371,7 @@ Already installed containers were found on the server. All installed containers All users who you shared a connection with will no longer be able to connect to it. - Все пользователи, с которыми вы поделились этим VPN-протоколом, больше не смогут к нему подключаться. + همه کاربرانی که با آن‌ها این پروتکل VPN را به اشتراک گذاشته‌اید دیگر نمی‌توانند به آن متصل شوند. @@ -604,7 +604,7 @@ Already installed containers were found on the server. All installed containers All users who you shared a connection with will no longer be able to connect to it. - Все пользователи, с которыми вы поделились этим VPN-протоколом, больше не смогут к нему подключаться. + همه کاربرانی که با آن این پروتکل VPN را به اشتراک گذاشته‌اید دیگر نمی‌توانند به آن متصل شوند. @@ -656,7 +656,7 @@ Already installed containers were found on the server. All installed containers All users who you shared a connection with will no longer be able to connect to it. - Все пользователи, с которыми вы поделились этим VPN-протоколом, больше не смогут к нему подключаться. + همه کاربرانی که با آن این پروتکل VPN را به اشتراک گذاشته‌اید دیگر نمی‌توانند به آن متصل شوند. @@ -697,7 +697,7 @@ Already installed containers were found on the server. All installed containers PageServerContainers Continue - Продолжить + ادامه دهید @@ -847,13 +847,13 @@ Already installed containers were found on the server. All installed containers - Use <a href="https://www.torproject.org/download/" style="color: #FBB26A;">Tor Browser</a> to open this URL. - + Use <a href="https://www.torproject.org/download/" style="color: #FBB26A;">Tor Browser</a> to open this URL. + استفاده <a href="https://www.torproject.org/download/" style="color: #FBB26A;">Tor Browser</a> برای باز کردن این نشانی. After creating your onion site, it takes a few minutes for the Tor network to make it available for use. - + پس از ایجاد سایت پیاز خود، چند دقیقه طول می‌کشد تا شبکه تور آن را برای استفاده فراهم کند. Use <a href="https://www.torproject.org/download/" style="color: #FBB26A;">Tor Browser</a> to open this url. @@ -870,7 +870,7 @@ Already installed containers were found on the server. All installed containers When configuring WordPress set the this address as domain. - При настройке WordPress укажите этот onion адрес в качестве домена. + هنگام تنظیم وردپرس، این آدرس پیاز را به عنوان دامنه مشخص کنید. @@ -940,7 +940,7 @@ Already installed containers were found on the server. All installed containers Support Amnezia - + پشتیبانی از Amnezia @@ -1215,7 +1215,7 @@ Already installed containers were found on the server. All installed containers When AmneziaDNS is not used or installed - + وقتی AmneziaDNS استفاده نشده یا نصب نشده است. @@ -1251,7 +1251,7 @@ Already installed containers were found on the server. All installed containers Default server does not support custom dns - + سرور پیش‌فرض از دی‌ان‌اس سفارشی پشتیبانی نمی‌کند. @@ -1433,27 +1433,27 @@ Already installed containers were found on the server. All installed containers Reboot server - + سرور را دوباره راه‌اندازی کنید. Do you want to reboot the server? - + آیا می‌خواهید سرور را دوباره راه‌اندازی کنید؟ The reboot process may take approximately 30 seconds. Are you sure you wish to proceed? - + فرآیند راه‌اندازی ممکن است حدود ۳۰ ثانیه طول بکشد. آیا مطمئن هستید که می‌خواهید ادامه دهید؟ Do you want to remove the server from application? - + آیا می‌خواهید سرور را از برنامه حذف کنید؟ Do you want to clear server from Amnezia software? - + آیا می‌خواهید سرور را از نرم‌افزار Amnezia پاک کنید؟ @@ -1536,7 +1536,7 @@ Already installed containers were found on the server. All installed containers All users who you shared a connection with will no longer be able to connect to it. - Все пользователи, которым вы поделились VPN, больше не смогут к нему подключаться. + تمام کاربرانی که با آن VPN را به اشتراک گذاشته‌اید، دیگر نمی‌توانند به آن متصل شوند. @@ -1562,7 +1562,7 @@ Already installed containers were found on the server. All installed containers Default server does not support split tunneling function - + سرور پیش‌فرض از عملکرد تونل‌سازی تقسیم شده پشتیبانی نمی‌کند. Addresses from the list should be accessed via VPN @@ -1609,17 +1609,17 @@ Already installed containers were found on the server. All installed containers Only the sites listed here will be accessed through the VPN - + تنها سایت‌های موجود در اینجا از طریق VPN دسترسی داده خواهند شد. website or IP - + وب‌سایت یا آدرس IP Import / Export Sites - + وارد کردن / صادر کردن وب‌سایت‌ها @@ -1716,7 +1716,7 @@ It's okay as long as it's from someone you trust. PageSetupWizardCredentials Server connection - Подключение к серверу + اتصال به سرور @@ -1823,12 +1823,12 @@ and will not be shared or disclosed to the Amnezia or any third parties سرور در حال حاضر به نرم‎افزار اضافه شده است - Amnesia has detected that your server is currently - Amnesia обнаружила, что ваш сервер в настоящее время + Amnezia has detected that your server is currently + Amnezia has detected that your server is currently - busy installing other software. Amnesia installation - занят установкой других протоколов или сервисов. Установка Amnesia + busy installing other software. Amnezia installation + busy installing other software. Amnezia installation @@ -2019,7 +2019,7 @@ and will not be shared or disclosed to the Amnezia or any third parties VPN Access - VPN-Доступ + دسترسی VPN @@ -2028,11 +2028,11 @@ and will not be shared or disclosed to the Amnezia or any third parties VPN access without the ability to manage the server - Доступ к VPN, без возможности управления сервером + دسترسی به VPN بدون امکان مدیریت سرور Access to server management. The user with whom you share full access to the connection will be able to add and remove your protocols and services to the server, as well as change settings. - Доступ к управлению сервером. Пользователь, с которым вы делитесь полным доступом к соединению, сможет добавлять и удалять ваши протоколы и службы на сервере, а также изменять настройки. + دسترسی به مدیریت سرور. کاربری که با او دسترسی کامل به اتصال را به اشتراک می‌گذارید، می‌تواند پروتکل‌ها و سرویس‌های شما را در سرور اضافه و حذف کند، همچنین تنظیمات را تغییر دهد. @@ -2132,7 +2132,7 @@ and will not be shared or disclosed to the Amnezia or any third parties Creation date: - + تاریخ ایجاد: @@ -2157,7 +2157,7 @@ and will not be shared or disclosed to the Amnezia or any third parties Revoke the config for a user - %1? - + لغو پیکربندی برای یک کاربر %1؟ Revoke the config for a user - @@ -2732,17 +2732,17 @@ and will not be shared or disclosed to the Amnezia or any third parties ShadowSocks - masks VPN traffic, making it similar to normal web traffic, but it may be recognized by analysis systems in some highly censored regions. - + شدوساکس - ترافیک VPN را پنهان می کند، به طوری که مشابه ترافیک وب عادی می شود، اما ممکن است توسط سیستم های تجزیه و تحلیل در برخی از مناطق با سانسور شدید شناسایی شود. 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. - + OpenVPN روی Cloak - OpenVPN با VPN که به عنوان ترافیک وب پنهان می‌شود و مقاومت در برابر تشخیص فعال از طریق پیشرفته. ایده‌آل برای دور زدن مسدود کردن در مناطق با بالاترین سطوح سانسور Create a file vault on your server to securely store and transfer files. - + ساختن یک گنجانده فایل بر روی سرور شما برای ذخیره و انتقال ایمن فایل‌ها @@ -2764,7 +2764,23 @@ If there is a extreme level of Internet censorship in your region, we advise you * Not recognised by DPI analysis systems * Works over TCP network protocol, 443 port. - + این ترکیبی از پروتکل OpenVPN و پلاگین Cloak به طور خاص برای محافظت در برابر مسدود کردن طراحی شده است. + +OpenVPN ارتباط امن VPN را با رمزگذاری تمام ترافیک اینترنتی بین مشتری و سرور فراهم می‌کند. + +Cloak OpenVPN را از شناسایی و مسدود کردن محافظت می‌کند. + +Cloak می‌تواند اطلاعات فراداده بسته را تغییر دهد تا ترافیک VPN را به طور کامل به عنوان ترافیک وب عادی پنهان کند و همچنین VPN را از شناسایی توسط Active Probing محافظت کند. این باعث می‌شود این سیستم بسیار مقاوم در برابر شناسایی شود. + +فوراً پس از دریافت اولین بسته داده، Cloak اتصال ورودی را تأیید می‌کند. اگر تأیید اعتبار ناموفق باشد، پلاگین سرور را به عنوان یک وب‌سایت جعلی پنهان می‌کند و VPN شما برای سیستم‌های تجزیه و تحلیل غیر قابل دسترسی می‌شود. + +اگر در منطقه شما سطح بسیار بالایی از سانسور اینترنت وجود دارد، به شما توصیه می‌شود که از اولین اتصال فقط از OpenVPN over Cloak استفاده کنید. + + در دسترس در AmneziaVPN بر روی تمام پلتفرم‌ها + مصرف بالای برق در دستگاه‌های تلفن همراه + تنظیمات انعطاف پذیر + توسط سیستم‌های تجزیه و تحلیل DPI شناخته نمی‌شود + بر روی پروتکل شبکه TCP، پورت 443 کار می‌کند. @@ -3233,7 +3249,7 @@ This means that AmneziaWG keeps the fast performance of the original while addin The field can't be empty - Поле не может быть пустым + این فیلد نمی‌تواند خالی باشد. @@ -3321,23 +3337,23 @@ This means that AmneziaWG keeps the fast performance of the original while addin High - Высокий + بالایی Medium - Средний + متوسط Many foreign websites and VPN providers are blocked - Многие иностранные сайты и VPN-провайдеры заблокированы + بسیاری از وب‌سایت‌ها و ارائه‌دهندگان VPN خارجی مسدود شده‌اند. Some foreign sites are blocked, but VPN providers are not blocked - Некоторые иностранные сайты заблокированы, но VPN-провайдеры не блокируются + بعضی از وب‌سایت‌های خارجی مسدود شده‌اند، اما ارائه‌دهندگان VPN مسدود نمی‌شوند. I just want to increase the level of privacy - Хочу просто повысить уровень приватности + من فقط می‌خواهم سطح حریم خصوصی خود را افزایش دهم. From da85922f23409bad72497524bfdb956e3a54106e Mon Sep 17 00:00:00 2001 From: KsZnak Date: Tue, 20 Feb 2024 22:49:26 +0200 Subject: [PATCH 27/36] Update amneziavpn_zh_CN.ts (#617) Update amneziavpn_zh_CN.ts --- client/translations/amneziavpn_zh_CN.ts | 78 ++++++++++++++----------- 1 file changed, 43 insertions(+), 35 deletions(-) diff --git a/client/translations/amneziavpn_zh_CN.ts b/client/translations/amneziavpn_zh_CN.ts index 1f400b99..8eacc183 100644 --- a/client/translations/amneziavpn_zh_CN.ts +++ b/client/translations/amneziavpn_zh_CN.ts @@ -200,7 +200,7 @@ Already installed containers were found on the server. All installed containers Server '%1' was rebooted - + 服务器 '%1' 已重新启动 @@ -891,10 +891,10 @@ Already installed containers were found on the server. All installed containers After creating your onion site, it takes a few minutes for the Tor network to make it available for use. - + 创建您的洋葱网站后,需要几分钟时间,才能使其在Tor网络上可用 - Use <a href="https://www.torproject.org/download/" style="color: #FBB26A;">Tor Browser</a> to open this url. + Use <a href="https://www.torproject.org/download/" style="color: #FBB26A;">Tor Browser</a> to open this URL. 用 <a href="https://www.torproject.org/download/" style="color: #FBB26A;">Tor 浏览器</a> 打开上面网址 @@ -984,7 +984,7 @@ And if you don't like the app, all the more support it - the donation will Support Amnezia - + 支持Amnezia @@ -1261,7 +1261,7 @@ And if you don't like the app, all the more support it - the donation will When AmneziaDNS is not used or installed - + 当未使用或未安装AmneziaDNS时 @@ -1479,12 +1479,12 @@ And if you don't like the app, all the more support it - the donation will Do you want to reboot the server? - + 您想重新启动服务器吗? Do you want to clear server from Amnezia software? - + 您要清除服务器上的Amnezia软件吗? @@ -1520,12 +1520,12 @@ And if you don't like the app, all the more support it - the donation will Reboot server - + 重新启动服务器 The reboot process may take approximately 30 seconds. Are you sure you wish to proceed? - + 重新启动过程可能需要大约30秒。您确定要继续吗? @@ -1535,7 +1535,7 @@ And if you don't like the app, all the more support it - the donation will Do you want to remove the server from application? - + 您想要从应用程序中移除服务器吗? Remove server? @@ -1706,17 +1706,17 @@ And if you don't like the app, all the more support it - the donation will Only the sites listed here will be accessed through the VPN - + 只有这里列出的网站将通过VPN访问 website or IP - + 网站或IP Import / Export Sites - + 导入/导出网站 @@ -2138,12 +2138,12 @@ and will not be shared or disclosed to the Amnezia or any third parties ShadowSocks native format - + ShadowSocks原生格式 Cloak native format - + Cloak原生格式 @@ -2153,18 +2153,18 @@ and will not be shared or disclosed to the Amnezia or any third parties Share full access to the server and VPN - + 共享服务器和VPN的完全访问权限 Use for your own devices, or share with those you trust to manage the server. - + 用于您自己的设备,或与您信任的人共享以管理服务器 Users - + 用户 @@ -2199,17 +2199,17 @@ and will not be shared or disclosed to the Amnezia or any third parties Revoke - + 撤销 Revoke the config for a user - %1? - + 撤销用户的配置- %1? The user will no longer be able to connect to your server. - + 该用户将无法再连接到您的服务器 @@ -2295,12 +2295,12 @@ and will not be shared or disclosed to the Amnezia or any third parties Config revoked - + 配置已撤销 User name - + 用户名 @@ -2320,7 +2320,7 @@ and will not be shared or disclosed to the Amnezia or any third parties Full access to the server and VPN - + 对服务器和VPN的完全访问权限 @@ -2331,7 +2331,7 @@ and will not be shared or disclosed to the Amnezia or any third parties If you share full access with other people, they can remove and add protocols and services to the server, which will cause the VPN to work incorrectly for all users. - + 如果您与其他人共享完全访问权限,他们可以从服务器中删除和添加协议和服务,这将导致VPN对所有用户的工作出现问题。 @@ -2822,7 +2822,7 @@ and will not be shared or disclosed to the Amnezia or any third parties The config does not contain any containers and credentials for connecting to the server - + 配置不包含任何用于连接服务器的容器和凭据 The config does not contain any containers and credentiaks for connecting to the server @@ -2831,7 +2831,7 @@ and will not be shared or disclosed to the Amnezia or any third parties Internal error - 内部错误 + @@ -2862,17 +2862,17 @@ and will not be shared or disclosed to the Amnezia or any third parties ShadowSocks - masks VPN traffic, making it similar to normal web traffic, but it may be recognized by analysis systems in some highly censored regions. - + ShadowSocks - 掩盖VPN流量,使其类似于正常的网络流量,但在一些高度审查的地区可能会被分析系统识别 - 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. - + OpenVPN over Cloak - OpenVPN with masquerading as web traffic and protection against active-probing detection. Ideal for bypassing blocking in regions with the highest levels of censorship. + OpenVPN over Cloak - OpenVPN与VPN结合,伪装成Web流量,并保护免受主动探测的侦测。非常适合在具有最高审查水平的地区绕过封锁 Create a file vault on your server to securely store and transfer files. - + 在您的服务器上创建一个文件保险库,用于安全存储和传输文件。 @@ -2907,15 +2907,23 @@ WireGuard is very susceptible to blocking due to its distinct packet signatures. * Minimum number of settings * Easily recognised by DPI analysis systems, susceptible to blocking * Works over UDP network protocol. - + 一个相对较新的流行VPN协议,具有简化的架构。 +WireGuard提供稳定的VPN连接,并在所有设备上具有高性能。它使用硬编码的加密设置。与OpenVPN相比,WireGuard具有较低的延迟和更好的数据传输吞吐量。 +WireGuard非常容易被阻挡,因为其独特的数据包签名。与一些其他VPN协议不同,这些协议使用混淆技术,WireGuard数据包的一致签名模式更容易被高级深度数据包检测(DPI)系统和其他网络监控工具识别和阻挡。 + + 在AmneziaVPN上适用于所有平台 + 低功耗 + 最少的设置 + 易于被DPI分析系统识别,容易被阻挡 + 通过UDP网络协议运行。 ShadowSocks - masks VPN traffic, making it similar to normal web traffic, but is recognised by analysis systems in some highly censored regions. ShadowSocks - 混淆 VPN 流量,使其与正常的 Web 流量相似,但在一些审查力度高的地区可以被分析系统识别。 - OpenVPN over Cloak - OpenVPN with VPN masquerading as web traffic and protection against active-probbing detection. Ideal for bypassing blocking in regions with the highest levels of censorship. - OpenVPN over Cloak - OpenVPN 与 VPN 具有伪装成网络流量和防止主动探测检测的保护。非常适合绕过审查力度特别强的地区的封锁。 + 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. + OpenVPN over Cloak - OpenVPN与VPN结合,伪装成Web流量,并保护免受主动探测的侦测。非常适合在具有最高审查水平的地区绕过封锁 @@ -3246,7 +3254,7 @@ While it offers a blend of security, stability, and speed, it's essential t Copy config string - + 复制配置字符串 From 7a245d80ee6b46364fbc1643edade12f55d6243a Mon Sep 17 00:00:00 2001 From: "vladimir.kuznetsov" Date: Wed, 21 Feb 2024 13:06:39 +0500 Subject: [PATCH 28/36] fixed the use of defaultServerDefaultContainerChanged --- client/ui/models/servers_model.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/ui/models/servers_model.cpp b/client/ui/models/servers_model.cpp index a4420255..2449de77 100644 --- a/client/ui/models/servers_model.cpp +++ b/client/ui/models/servers_model.cpp @@ -249,7 +249,7 @@ void ServersModel::editServer(const QJsonObject &server, const int serverIndex) } updateContainersModel(); - if (isDefaultServerCurrentlyProcessed()) { + if (serverIndex == m_defaultServerIndex) { auto defaultContainer = qvariant_cast(getDefaultServerData("defaultContainer")); emit defaultServerDefaultContainerChanged(defaultContainer); } From 61abf74b2d123e3a691ff2b0a6f7695db3b83da9 Mon Sep 17 00:00:00 2001 From: Nethius Date: Wed, 21 Feb 2024 18:27:27 +0700 Subject: [PATCH 29/36] feature/page-home-split-tunneling (#540) Added split tunneling button on home page --- client/images/controls/split-tunneling.svg | 6 ++ client/resources.qrc | 2 + client/ui/models/servers_model.cpp | 15 +++ client/ui/models/servers_model.h | 4 + client/ui/models/sites_model.cpp | 1 + client/ui/models/sites_model.h | 2 + .../Components/HomeSplitTunnelingDrawer.qml | 92 +++++++++++++++++++ client/ui/qml/Controls2/BasicButtonType.qml | 19 +++- client/ui/qml/Pages2/PageHome.qml | 37 ++++++++ .../qml/Pages2/PageSettingsSplitTunneling.qml | 10 +- client/ui/qml/Pages2/PageStart.qml | 3 +- 11 files changed, 187 insertions(+), 4 deletions(-) create mode 100644 client/images/controls/split-tunneling.svg create mode 100644 client/ui/qml/Components/HomeSplitTunnelingDrawer.qml diff --git a/client/images/controls/split-tunneling.svg b/client/images/controls/split-tunneling.svg new file mode 100644 index 00000000..3062054d --- /dev/null +++ b/client/images/controls/split-tunneling.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/client/resources.qrc b/client/resources.qrc index 59a540cc..b9a69023 100644 --- a/client/resources.qrc +++ b/client/resources.qrc @@ -224,6 +224,8 @@ ui/qml/Pages2/PageShareFullAccess.qml images/controls/close.svg images/controls/search.svg + ui/qml/Components/HomeSplitTunnelingDrawer.qml + images/controls/split-tunneling.svg ui/qml/Controls2/DrawerType2.qml diff --git a/client/ui/models/servers_model.cpp b/client/ui/models/servers_model.cpp index 2449de77..8294cc01 100644 --- a/client/ui/models/servers_model.cpp +++ b/client/ui/models/servers_model.cpp @@ -577,3 +577,18 @@ void ServersModel::setProcessedServerData(const QString roleString, const QVaria } +bool ServersModel::isDefaultServerDefaultContainerHasSplitTunneling() +{ + auto server = m_servers.at(m_defaultServerIndex).toObject(); + auto defaultContainer = ContainerProps::containerFromString(server.value(config_key::defaultContainer).toString()); + auto containerConfig = server.value(config_key::containers).toArray().at(defaultContainer).toObject(); + auto protocolConfig = containerConfig.value(ContainerProps::containerTypeToString(defaultContainer)).toObject(); + + if (defaultContainer == DockerContainer::Awg || defaultContainer == DockerContainer::WireGuard) { + return !(protocolConfig.value(config_key::last_config).toString().contains("AllowedIPs = 0.0.0.0/0, ::/0")); + } else if (defaultContainer == DockerContainer::Cloak || defaultContainer == DockerContainer::OpenVpn || defaultContainer == DockerContainer::ShadowSocks) { + return !(protocolConfig.value(config_key::last_config).toString().contains("redirect-gateway")); + } + + return false; +} diff --git a/client/ui/models/servers_model.h b/client/ui/models/servers_model.h index 1adaebae..b694b6f6 100644 --- a/client/ui/models/servers_model.h +++ b/client/ui/models/servers_model.h @@ -48,6 +48,8 @@ public: Q_PROPERTY(QString defaultServerDefaultContainerName READ getDefaultServerDefaultContainerName NOTIFY defaultServerDefaultContainerChanged) Q_PROPERTY(QString defaultServerDescriptionCollapsed READ getDefaultServerDescriptionCollapsed NOTIFY defaultServerDefaultContainerChanged) Q_PROPERTY(QString defaultServerDescriptionExpanded READ getDefaultServerDescriptionExpanded NOTIFY defaultServerDefaultContainerChanged) + Q_PROPERTY(bool isDefaultServerDefaultContainerHasSplitTunneling READ isDefaultServerDefaultContainerHasSplitTunneling NOTIFY defaultServerDefaultContainerChanged) + Q_PROPERTY(int processedIndex READ getProcessedServerIndex WRITE setProcessedServerIndex NOTIFY processedServerIndexChanged) @@ -103,6 +105,8 @@ public slots: QVariant getProcessedServerData(const QString roleString); void setProcessedServerData(const QString roleString, const QVariant &value); + bool isDefaultServerDefaultContainerHasSplitTunneling(); + protected: QHash roleNames() const override; diff --git a/client/ui/models/sites_model.cpp b/client/ui/models/sites_model.cpp index f6cb9b13..96b6ca60 100644 --- a/client/ui/models/sites_model.cpp +++ b/client/ui/models/sites_model.cpp @@ -113,6 +113,7 @@ void SitesModel::toggleSplitTunneling(bool enabled) m_settings->setRouteMode(Settings::RouteMode::VpnAllSites); } m_isSplitTunnelingEnabled = enabled; + emit splitTunnelingToggled(); } QVector > SitesModel::getCurrentSites() diff --git a/client/ui/models/sites_model.h b/client/ui/models/sites_model.h index ad16b7a3..803b7fd1 100644 --- a/client/ui/models/sites_model.h +++ b/client/ui/models/sites_model.h @@ -22,6 +22,7 @@ public: QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; Q_PROPERTY(int routeMode READ getRouteMode WRITE setRouteMode NOTIFY routeModeChanged) + Q_PROPERTY(bool isTunnelingEnabled READ isSplitTunnelingEnabled NOTIFY splitTunnelingToggled) public slots: bool addSite(const QString &hostname, const QString &ip); @@ -38,6 +39,7 @@ public slots: signals: void routeModeChanged(); + void splitTunnelingToggled(); protected: QHash roleNames() const override; diff --git a/client/ui/qml/Components/HomeSplitTunnelingDrawer.qml b/client/ui/qml/Components/HomeSplitTunnelingDrawer.qml new file mode 100644 index 00000000..bc1f1008 --- /dev/null +++ b/client/ui/qml/Components/HomeSplitTunnelingDrawer.qml @@ -0,0 +1,92 @@ +import QtQuick +import QtQuick.Controls +import QtQuick.Layouts + +import PageEnum 1.0 + +import "../Controls2" +import "../Controls2/TextTypes" +import "../Config" + +DrawerType2 { + id: root + + anchors.fill: parent + expandedHeight: parent.height * 0.7 + + expandedContent: ColumnLayout { + id: content + + anchors.top: parent.top + anchors.left: parent.left + anchors.right: parent.right + spacing: 0 + + Header2Type { + Layout.fillWidth: true + Layout.topMargin: 24 + Layout.rightMargin: 16 + Layout.leftMargin: 16 + Layout.bottomMargin: 16 + + headerText: qsTr("Split tunneling") + descriptionText: qsTr("Allows you to connect to some sites or applications through a VPN connection and bypass others") + } + + LabelWithButtonType { + Layout.fillWidth: true + Layout.topMargin: 16 + + visible: ServersModel.isDefaultServerDefaultContainerHasSplitTunneling && ServersModel.getDefaultServerData("isServerFromApi") + + text: qsTr("Split tunneling on the server") + descriptionText: qsTr("Enabled \nCan't be disabled for current server") + rightImageSource: "qrc:/images/controls/chevron-right.svg" + + clickedFunction: function() { +// PageController.goToPage(PageEnum.PageSettingsSplitTunneling) +// root.close() + } + } + + DividerType { + visible: ServersModel.isDefaultServerDefaultContainerHasSplitTunneling && ServersModel.getDefaultServerData("isServerFromApi") + } + + LabelWithButtonType { + Layout.fillWidth: true + Layout.topMargin: 16 + + enabled: ! ServersModel.isDefaultServerDefaultContainerHasSplitTunneling || !ServersModel.getDefaultServerData("isServerFromApi") + + text: qsTr("Site-based split tunneling") + descriptionText: enabled && SitesModel.isTunnelingEnabled ? qsTr("Enabled") : qsTr("Disabled") + rightImageSource: "qrc:/images/controls/chevron-right.svg" + + clickedFunction: function() { + PageController.goToPage(PageEnum.PageSettingsSplitTunneling) + root.close() + } + } + + DividerType { + } + + LabelWithButtonType { + Layout.fillWidth: true + visible: false + + text: qsTr("App-based split tunneling") + rightImageSource: "qrc:/images/controls/chevron-right.svg" + + clickedFunction: function() { +// PageController.goToPage(PageEnum.PageSetupWizardConfigSource) + root.close() + } + } + + DividerType { + visible: false + } + } +} diff --git a/client/ui/qml/Controls2/BasicButtonType.qml b/client/ui/qml/Controls2/BasicButtonType.qml index 77d4b5fb..257486d6 100644 --- a/client/ui/qml/Controls2/BasicButtonType.qml +++ b/client/ui/qml/Controls2/BasicButtonType.qml @@ -21,6 +21,8 @@ Button { property int borderFocusedWidth: 1 property string imageSource + property string rightImageSource + property string leftImageColor: textColor property bool squareLeftSide: false @@ -118,7 +120,7 @@ Button { layer { enabled: true effect: ColorOverlay { - color: textColor + color: leftImageColor } } } @@ -131,6 +133,21 @@ Button { horizontalAlignment: Text.AlignLeft verticalAlignment: Text.AlignVCenter } + + Image { + Layout.preferredHeight: 20 + Layout.preferredWidth: 20 + + source: root.rightImageSource + visible: root.rightImageSource === "" ? false : true + + layer { + enabled: true + effect: ColorOverlay { + color: textColor + } + } + } } } diff --git a/client/ui/qml/Pages2/PageHome.qml b/client/ui/qml/Pages2/PageHome.qml index 4b5ba53d..04f59627 100644 --- a/client/ui/qml/Pages2/PageHome.qml +++ b/client/ui/qml/Pages2/PageHome.qml @@ -34,8 +34,45 @@ PageType { anchors.bottomMargin: drawer.collapsedHeight ConnectButton { + id: connectButton anchors.centerIn: parent } + + BasicButtonType { + anchors.horizontalCenter: parent.horizontalCenter + anchors.bottom: parent.bottom + anchors.bottomMargin: 34 + leftPadding: 16 + rightPadding: 16 + + implicitHeight: 36 + + 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 || + (ServersModel.isDefaultServerDefaultContainerHasSplitTunneling && ServersModel.getDefaultServerData("isServerFromApi")) + + text: isSplitTunnelingEnabled ? qsTr("Split tunneling enabled") : qsTr("Split tunneling disabled") + + imageSource: isSplitTunnelingEnabled ? "qrc:/images/controls/split-tunneling.svg" : "" + rightImageSource: "qrc:/images/controls/chevron-down.svg" + + onClicked: { + homeSplitTunnelingDrawer.open() + } + + HomeSplitTunnelingDrawer { + id: homeSplitTunnelingDrawer + + parent: root + } + } } diff --git a/client/ui/qml/Pages2/PageSettingsSplitTunneling.qml b/client/ui/qml/Pages2/PageSettingsSplitTunneling.qml index 729a6e9d..1ce3cd64 100644 --- a/client/ui/qml/Pages2/PageSettingsSplitTunneling.qml +++ b/client/ui/qml/Pages2/PageSettingsSplitTunneling.qml @@ -29,8 +29,14 @@ PageType { } Component.onCompleted: { - if (isServerFromApi) { + if (ConnectionController.isConnected) { + PageController.showNotificationMessage(qsTr("Cannot change split tunneling settings during active connection")) + root.pageEnabled = false + } else if (ServersModel.isDefaultServerDefaultContainerHasSplitTunneling && isServerFromApi) { PageController.showNotificationMessage(qsTr("Default server does not support split tunneling function")) + root.pageEnabled = false + } else { + root.pageEnabled = true } } @@ -108,7 +114,7 @@ PageType { Layout.fillWidth: true Layout.rightMargin: 16 - checked: SitesModel.isSplitTunnelingEnabled() + checked: SitesModel.isTunnelingEnabled onToggled: { SitesModel.toggleSplitTunneling(checked) selector.text = root.routeModesModel[getRouteModesModelIndex()].name diff --git a/client/ui/qml/Pages2/PageStart.qml b/client/ui/qml/Pages2/PageStart.qml index 38a8e0b8..dac9db93 100644 --- a/client/ui/qml/Pages2/PageStart.qml +++ b/client/ui/qml/Pages2/PageStart.qml @@ -44,6 +44,7 @@ PageType { function onClosePage() { tabBar.isServerInfoShow = tabBarStackView.currentItem.objectName !== PageController.getPagePath(PageEnum.PageSettingsServerInfo) + && tabBarStackView.currentItem.objectName !== PageController.getPagePath(PageEnum.PageSettingsSplitTunneling) if (tabBarStackView.depth <= 1) { return @@ -60,7 +61,7 @@ PageType { tabBarStackView.push(pagePath, { "objectName" : pagePath }, StackView.Immediate) } - tabBar.isServerInfoShow = page === PageEnum.PageSettingsServerInfo || tabBar.isServerInfoShow + tabBar.isServerInfoShow = page === PageEnum.PageSettingsServerInfo || PageEnum.PageSettingsSplitTunneling || tabBar.isServerInfoShow } function onGoToStartPage() { From 6c0b71bd1be0ac2c9f09cb63d4e6859afb8d7819 Mon Sep 17 00:00:00 2001 From: Andrey Zaharow <59512038+andr13@users.noreply.github.com> Date: Wed, 21 Feb 2024 16:01:53 +0200 Subject: [PATCH 30/36] Fix translation on About Page (#618) Fix About Page --- client/CMakeLists.txt | 9 +++++++++ client/ui/controllers/settingsController.cpp | 2 +- client/ui/qml/Pages2/PageSettingsAbout.qml | 2 +- 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/client/CMakeLists.txt b/client/CMakeLists.txt index 9fb07d61..439e10c5 100644 --- a/client/CMakeLists.txt +++ b/client/CMakeLists.txt @@ -15,6 +15,15 @@ set(PACKAGES Core5Compat Concurrent LinguistTools ) +execute_process( + WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" + COMMAND git rev-parse --short HEAD + OUTPUT_VARIABLE GIT_COMMIT_HASH + OUTPUT_STRIP_TRAILING_WHITESPACE +) + +add_definitions(-DGIT_COMMIT_HASH="${GIT_COMMIT_HASH}") + if(IOS) set(PACKAGES ${PACKAGES} Multimedia) endif() diff --git a/client/ui/controllers/settingsController.cpp b/client/ui/controllers/settingsController.cpp index 99645cde..6ec55321 100644 --- a/client/ui/controllers/settingsController.cpp +++ b/client/ui/controllers/settingsController.cpp @@ -28,7 +28,7 @@ SettingsController::SettingsController(const QSharedPointer &serve m_sitesModel(sitesModel), m_settings(settings) { - m_appVersion = QString("%1: %2 (%3)").arg(tr("Software version"), QString(APP_VERSION), __DATE__); + m_appVersion = QString("%1 (%2, %3)").arg(QString(APP_VERSION), __DATE__, GIT_COMMIT_HASH); #ifdef Q_OS_ANDROID if (!m_settings->isScreenshotsEnabled()) { diff --git a/client/ui/qml/Pages2/PageSettingsAbout.qml b/client/ui/qml/Pages2/PageSettingsAbout.qml index b20c7440..b912e2cd 100644 --- a/client/ui/qml/Pages2/PageSettingsAbout.qml +++ b/client/ui/qml/Pages2/PageSettingsAbout.qml @@ -175,7 +175,7 @@ PageType { horizontalAlignment: Text.AlignHCenter - text: SettingsController.getAppVersion() + text: qsTr("Software version: %1").arg(SettingsController.getAppVersion()) color: "#878B91" } From b3ed57aee73bfb3538de76a14464c5dcedfc914c Mon Sep 17 00:00:00 2001 From: "vladimir.kuznetsov" Date: Wed, 21 Feb 2024 22:57:15 +0500 Subject: [PATCH 31/36] for api servers, removed the ability to select a container --- client/ui/models/servers_model.cpp | 5 +++++ client/ui/models/servers_model.h | 3 ++- client/ui/qml/Pages2/PageHome.qml | 5 ++++- 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/client/ui/models/servers_model.cpp b/client/ui/models/servers_model.cpp index 8294cc01..3c72ee49 100644 --- a/client/ui/models/servers_model.cpp +++ b/client/ui/models/servers_model.cpp @@ -220,6 +220,11 @@ bool ServersModel::isDefaultServerCurrentlyProcessed() return m_defaultServerIndex == m_processedServerIndex; } +bool ServersModel::isDefaultServerFromApi() +{ + return qvariant_cast(data(m_defaultServerIndex, IsServerFromApiRole)); +} + bool ServersModel::isProcessedServerHasWriteAccess() { return qvariant_cast(data(m_processedServerIndex, HasWriteAccessRole)); diff --git a/client/ui/models/servers_model.h b/client/ui/models/servers_model.h index b694b6f6..3e24e46c 100644 --- a/client/ui/models/servers_model.h +++ b/client/ui/models/servers_model.h @@ -49,7 +49,7 @@ public: Q_PROPERTY(QString defaultServerDescriptionCollapsed READ getDefaultServerDescriptionCollapsed NOTIFY defaultServerDefaultContainerChanged) Q_PROPERTY(QString defaultServerDescriptionExpanded READ getDefaultServerDescriptionExpanded NOTIFY defaultServerDefaultContainerChanged) Q_PROPERTY(bool isDefaultServerDefaultContainerHasSplitTunneling READ isDefaultServerDefaultContainerHasSplitTunneling NOTIFY defaultServerDefaultContainerChanged) - + Q_PROPERTY(bool isDefaultServerFromApi READ isDefaultServerFromApi NOTIFY defaultServerIndexChanged) Q_PROPERTY(int processedIndex READ getProcessedServerIndex WRITE setProcessedServerIndex NOTIFY processedServerIndexChanged) @@ -61,6 +61,7 @@ public slots: const QString getDefaultServerDescriptionExpanded(); const QString getDefaultServerDefaultContainerName(); bool isDefaultServerCurrentlyProcessed(); + bool isDefaultServerFromApi(); bool isProcessedServerHasWriteAccess(); bool isDefaultServerHasWriteAccess(); diff --git a/client/ui/qml/Pages2/PageHome.qml b/client/ui/qml/Pages2/PageHome.qml index 04f59627..536fc951 100644 --- a/client/ui/qml/Pages2/PageHome.qml +++ b/client/ui/qml/Pages2/PageHome.qml @@ -193,7 +193,7 @@ PageType { LabelTextType { id: expandedServersMenuDescription - Layout.bottomMargin: 24 + Layout.bottomMargin: ServersModel.isDefaultServerFromApi ? 69 : 24 Layout.fillWidth: true horizontalAlignment: Qt.AlignHCenter verticalAlignment: Qt.AlignVCenter @@ -204,6 +204,9 @@ PageType { Layout.alignment: Qt.AlignHCenter | Qt.AlignVCenter spacing: 8 + visible: !ServersModel.isDefaultServerFromApi + onVisibleChanged: expandedServersMenuDescription.Layout + DropDownType { id: containersDropDown From 9f1210d18f4e57f1a1f971b11441cb4f9249f5df Mon Sep 17 00:00:00 2001 From: Shehab Ahmed Date: Thu, 22 Feb 2024 02:31:51 +0200 Subject: [PATCH 32/36] changed the location of Auto connect item from settings connections page to settings application page --- .../ui/qml/Pages2/PageSettingsApplication.qml | 21 +++++++++++++++++++ .../ui/qml/Pages2/PageSettingsConnection.qml | 21 ------------------- 2 files changed, 21 insertions(+), 21 deletions(-) diff --git a/client/ui/qml/Pages2/PageSettingsApplication.qml b/client/ui/qml/Pages2/PageSettingsApplication.qml index 372cd69e..af029b7b 100644 --- a/client/ui/qml/Pages2/PageSettingsApplication.qml +++ b/client/ui/qml/Pages2/PageSettingsApplication.qml @@ -84,6 +84,27 @@ PageType { visible: !GC.isMobile() } + SwitcherType { + visible: !GC.isMobile() + + Layout.fillWidth: true + Layout.margins: 16 + + text: qsTr("Auto connect") + descriptionText: qsTr("Connect to VPN on app start") + + checked: SettingsController.isAutoConnectEnabled() + onCheckedChanged: { + if (checked !== SettingsController.isAutoConnectEnabled()) { + SettingsController.toggleAutoConnect(checked) + } + } + } + + DividerType { + visible: !GC.isMobile() + } + SwitcherType { visible: !GC.isMobile() diff --git a/client/ui/qml/Pages2/PageSettingsConnection.qml b/client/ui/qml/Pages2/PageSettingsConnection.qml index 3a0c5c3c..4d88b397 100644 --- a/client/ui/qml/Pages2/PageSettingsConnection.qml +++ b/client/ui/qml/Pages2/PageSettingsConnection.qml @@ -41,27 +41,6 @@ PageType { headerText: qsTr("Connection") } - SwitcherType { - visible: !GC.isMobile() - - Layout.fillWidth: true - Layout.margins: 16 - - text: qsTr("Auto connect") - descriptionText: qsTr("Connect to VPN on app start") - - checked: SettingsController.isAutoConnectEnabled() - onCheckedChanged: { - if (checked !== SettingsController.isAutoConnectEnabled()) { - SettingsController.toggleAutoConnect(checked) - } - } - } - - DividerType { - visible: !GC.isMobile() - } - SwitcherType { Layout.fillWidth: true Layout.margins: 16 From 28d2a4ec2c40c37188764414942c026ec617150b Mon Sep 17 00:00:00 2001 From: Sergei Rodionov <2098022+rodionos@users.noreply.github.com> Date: Thu, 22 Feb 2024 13:57:58 +0300 Subject: [PATCH 33/36] MacOS build: increase image size to 256Mb In my case, using Qt 6.6.2, the size of the AmneziaVPN.dmg file is 226Mb so a higher image size is needed for the hdiutil command. --- deploy/build_macos.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/deploy/build_macos.sh b/deploy/build_macos.sh index 0d64a9ec..ffdbd20b 100755 --- a/deploy/build_macos.sh +++ b/deploy/build_macos.sh @@ -146,7 +146,8 @@ if [ "${MAC_CERT_PW+x}" ]; then fi echo "Building DMG installer..." -hdiutil create -size 120mb -volname AmneziaVPN -srcfolder $BUILD_DIR/installer/$APP_NAME.app -ov -format UDZO $DMG_FILENAME +# Allow Terminal to make changes in Privacy & Security > App Management +hdiutil create -size 256mb -volname AmneziaVPN -srcfolder $BUILD_DIR/installer/$APP_NAME.app -ov -format UDZO $DMG_FILENAME if [ "${MAC_CERT_PW+x}" ]; then echo "Signing DMG installer..." From 794ec921b85c5207c14c6f13195ba46f02814a5c Mon Sep 17 00:00:00 2001 From: pokamest Date: Thu, 22 Feb 2024 13:28:37 +0000 Subject: [PATCH 34/36] Update Qt in deploy.yml --- .github/workflows/deploy.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 83be4c91..952df01c 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -14,8 +14,8 @@ jobs: runs-on: ubuntu-20.04 env: - QT_VERSION: 6.5.1 - QIF_VERSION: 4.6 + QT_VERSION: 6.6.2 + QIF_VERSION: 4.7 steps: - name: 'Install Qt' @@ -72,8 +72,8 @@ jobs: runs-on: windows-latest env: - QT_VERSION: 6.5.1 - QIF_VERSION: 4.6 + QT_VERSION: 6.6.2 + QIF_VERSION: 4.7 BUILD_ARCH: 64 steps: @@ -134,7 +134,7 @@ jobs: runs-on: macos-13 env: - QT_VERSION: 6.5.2 + QT_VERSION: 6.6.2 CC: cc CXX: c++ @@ -227,7 +227,7 @@ jobs: env: # Keep compat with MacOS 10.15 aka Catalina by Qt 6.4 QT_VERSION: 6.4.3 - QIF_VERSION: 4.6 + QIF_VERSION: 4.7 steps: - name: 'Setup xcode' @@ -286,7 +286,7 @@ jobs: env: ANDROID_BUILD_PLATFORM: android-34 - QT_VERSION: 6.6.1 + QT_VERSION: 6.6.2 QT_MODULES: 'qtremoteobjects qt5compat qtimageformats qtshadertools' steps: From b1e5bba33fb9acfb5d5b6ae36c984f3d1ce4701a Mon Sep 17 00:00:00 2001 From: "vladimir.kuznetsov" Date: Fri, 23 Feb 2024 22:51:46 +0500 Subject: [PATCH 35/36] fixed connection drawer close button --- client/ui/qml/Components/ShareConnectionDrawer.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/ui/qml/Components/ShareConnectionDrawer.qml b/client/ui/qml/Components/ShareConnectionDrawer.qml index c209c1ce..32d6ed9d 100644 --- a/client/ui/qml/Components/ShareConnectionDrawer.qml +++ b/client/ui/qml/Components/ShareConnectionDrawer.qml @@ -201,7 +201,7 @@ DrawerType2 { anchors.topMargin: 16 backButtonFunction: function() { - configContentDrawer.open() + configContentDrawer.close() } } From c7c7c8eb0162010512388ba3a03f259a7a5e083b Mon Sep 17 00:00:00 2001 From: agalehaga <157917463+agalehaga@users.noreply.github.com> Date: Fri, 23 Feb 2024 19:55:59 +0200 Subject: [PATCH 36/36] added export awg native format (#635) add export awg native format --- client/ui/controllers/exportController.cpp | 40 +++++++++++++++++++ client/ui/controllers/exportController.h | 1 + .../qml/Components/ShareConnectionDrawer.qml | 14 ------- client/ui/qml/Pages2/PageShare.qml | 20 +++++++++- 4 files changed, 60 insertions(+), 15 deletions(-) diff --git a/client/ui/controllers/exportController.cpp b/client/ui/controllers/exportController.cpp index 0c328326..57d864e9 100644 --- a/client/ui/controllers/exportController.cpp +++ b/client/ui/controllers/exportController.cpp @@ -8,6 +8,7 @@ #include #include +#include "configurators/awg_configurator.h" #include "configurators/cloak_configurator.h" #include "configurators/openvpn_configurator.h" #include "configurators/shadowsocks_configurator.h" @@ -228,6 +229,45 @@ void ExportController::generateWireGuardConfig(const QString &clientName) emit exportConfigChanged(); } +void ExportController::generateAwgConfig(const QString &clientName) +{ + clearPreviousConfig(); + + int serverIndex = m_serversModel->getProcessedServerIndex(); + ServerCredentials credentials = m_serversModel->getServerCredentials(serverIndex); + + DockerContainer container = static_cast(m_containersModel->getCurrentlyProcessedContainerIndex()); + QJsonObject containerConfig = m_containersModel->getContainerConfig(container); + containerConfig.insert(config_key::container, ContainerProps::containerToString(container)); + + QString clientId; + ErrorCode errorCode = ErrorCode::NoError; + QString config = m_configurator->awgConfigurator->genAwgConfig(credentials, container, containerConfig, + clientId, &errorCode); + if (errorCode) { + emit exportErrorOccurred(errorString(errorCode)); + return; + } + config = m_configurator->processConfigWithExportSettings(serverIndex, container, Proto::Awg, config); + + auto configJson = QJsonDocument::fromJson(config.toUtf8()).object(); + QStringList lines = configJson.value(config_key::config).toString().replace("\r", "").split("\n"); + for (const QString &line : lines) { + m_config.append(line + "\n"); + } + + qrcodegen::QrCode qr = qrcodegen::QrCode::encodeText(m_config.toUtf8(), qrcodegen::QrCode::Ecc::LOW); + m_qrCodes << svgToBase64(QString::fromStdString(toSvgString(qr, 1))); + + errorCode = m_clientManagementModel->appendClient(clientId, clientName, container, credentials); + if (errorCode) { + emit exportErrorOccurred(errorString(errorCode)); + return; + } + + emit exportConfigChanged(); +} + void ExportController::generateShadowSocksConfig() { clearPreviousConfig(); diff --git a/client/ui/controllers/exportController.h b/client/ui/controllers/exportController.h index a6dc468b..e5bd1657 100644 --- a/client/ui/controllers/exportController.h +++ b/client/ui/controllers/exportController.h @@ -34,6 +34,7 @@ public slots: void generateConnectionConfig(const QString &clientName); void generateOpenVpnConfig(const QString &clientName); void generateWireGuardConfig(const QString &clientName); + void generateAwgConfig(const QString &clientName); void generateShadowSocksConfig(); void generateCloakConfig(); diff --git a/client/ui/qml/Components/ShareConnectionDrawer.qml b/client/ui/qml/Components/ShareConnectionDrawer.qml index c209c1ce..aec0b810 100644 --- a/client/ui/qml/Components/ShareConnectionDrawer.qml +++ b/client/ui/qml/Components/ShareConnectionDrawer.qml @@ -107,13 +107,6 @@ DrawerType2 { text: qsTr("Copy") imageSource: "qrc:/images/controls/copy.svg" - - clickedFunc: function() { - configText.selectAll() - configText.copy() - configText.select(0, 0) - PageController.showNotificationMessage(qsTr("Copied")) - } } BasicButtonType { @@ -132,13 +125,6 @@ DrawerType2 { text: qsTr("Copy config string") imageSource: "qrc:/images/controls/copy.svg" - - clickedFunc: function() { - nativeConfigString.selectAll() - nativeConfigString.copy() - nativeConfigString.select(0, 0) - PageController.showNotificationMessage(qsTr("Copied")) - } } BasicButtonType { diff --git a/client/ui/qml/Pages2/PageShare.qml b/client/ui/qml/Pages2/PageShare.qml index cd012e27..cd7e7958 100644 --- a/client/ui/qml/Pages2/PageShare.qml +++ b/client/ui/qml/Pages2/PageShare.qml @@ -22,6 +22,7 @@ PageType { AmneziaConnection, OpenVpn, WireGuard, + Awg, ShadowSocks, Cloak } @@ -48,7 +49,10 @@ PageType { PageController.showBusyIndicator(true) switch (type) { - case PageShare.ConfigType.AmneziaConnection: ExportController.generateConnectionConfig(clientNameTextField.textFieldText); break; + case PageShare.ConfigType.AmneziaConnection: { + ExportController.generateConnectionConfig(clientNameTextField.textFieldText); + break; + } case PageShare.ConfigType.OpenVpn: { ExportController.generateOpenVpnConfig(clientNameTextField.textFieldText) shareConnectionDrawer.configCaption = qsTr("Save OpenVPN config") @@ -63,6 +67,13 @@ PageType { shareConnectionDrawer.configFileName = "amnezia_for_wireguard" break } + case PageShare.ConfigType.Awg: { + ExportController.generateAwgConfig(clientNameTextField.textFieldText) + shareConnectionDrawer.configCaption = qsTr("Save AmneziaWG config") + shareConnectionDrawer.configExtension = ".conf" + shareConnectionDrawer.configFileName = "amnezia_for_awg" + break + } case PageShare.ConfigType.ShadowSocks: { ExportController.generateShadowSocksConfig() shareConnectionDrawer.configCaption = qsTr("Save ShadowSocks config") @@ -110,6 +121,11 @@ PageType { property string name: qsTr("WireGuard native format") property var type: PageShare.ConfigType.WireGuard } + QtObject { + id: awgConnectionFormat + property string name: qsTr("AmneziaWG native format") + property var type: PageShare.ConfigType.Awg + } QtObject { id: shadowSocksConnectionFormat property string name: qsTr("ShadowSocks native format") @@ -402,6 +418,8 @@ PageType { root.connectionTypesModel.push(openVpnConnectionFormat) } else if (index === ContainerProps.containerFromString("amnezia-wireguard")) { root.connectionTypesModel.push(wireGuardConnectionFormat) + } else if (index === ContainerProps.containerFromString("amnezia-awg")) { + root.connectionTypesModel.push(awgConnectionFormat) } else if (index === ContainerProps.containerFromString("amnezia-shadowsocks")) { root.connectionTypesModel.push(openVpnConnectionFormat) root.connectionTypesModel.push(shadowSocksConnectionFormat)