feature: add country selection page (#5)

* Add country selection page for premium

* Add countryCode property

* Fix country visibility logic

* Add premium settings

* Fix binding loop

* Add settings page

* Add logging settings page

* Add confirmation dialog for server removing

* Fix flag size

* Fix flags sizes

* chore: added translation files

---------

Co-authored-by: vladimir.kuznetsov <nethiuswork@gmail.com>
This commit is contained in:
aiamnezia 2025-04-08 09:54:56 +04:00 committed by GitHub
parent e12e9a6587
commit ffb398e231
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
21 changed files with 7692 additions and 2946 deletions

View file

@ -236,6 +236,8 @@
<file>ui/qml/DefaultVpn/Controls/DropDownType.qml</file> <file>ui/qml/DefaultVpn/Controls/DropDownType.qml</file>
<file>ui/qml/DefaultVpn/main.qml</file> <file>ui/qml/DefaultVpn/main.qml</file>
<file>ui/qml/DefaultVpn/Pages/PageHome.qml</file> <file>ui/qml/DefaultVpn/Pages/PageHome.qml</file>
<file>ui/qml/DefaultVpn/Pages/PageSettings.qml</file>
<file>ui/qml/DefaultVpn/Pages/PageSettingsLogging.qml</file>
<file>ui/qml/DefaultVpn/Pages/PageAbout.qml</file> <file>ui/qml/DefaultVpn/Pages/PageAbout.qml</file>
<file>ui/qml/DefaultVpn/Controls/TextTypes/MediumTextType.qml</file> <file>ui/qml/DefaultVpn/Controls/TextTypes/MediumTextType.qml</file>
<file>ui/qml/DefaultVpn/Config/DeviceInfo.qml</file> <file>ui/qml/DefaultVpn/Config/DeviceInfo.qml</file>
@ -243,6 +245,8 @@
<file>ui/qml/DefaultVpn/Controls/TextTypes/XSmallTextType.qml</file> <file>ui/qml/DefaultVpn/Controls/TextTypes/XSmallTextType.qml</file>
<file>ui/qml/DefaultVpn/Controls/ButtonType.qml</file> <file>ui/qml/DefaultVpn/Controls/ButtonType.qml</file>
<file>ui/qml/DefaultVpn/Pages/PageSettingsServersList.qml</file> <file>ui/qml/DefaultVpn/Pages/PageSettingsServersList.qml</file>
<file>ui/qml/DefaultVpn/Pages/PageCountrySelector.qml</file>
<file>ui/qml/DefaultVpn/Pages/PageSettingsApiServerInfo.qml</file>
<file>ui/qml/DefaultVpn/Controls/TextTypes/Header1TextType.qml</file> <file>ui/qml/DefaultVpn/Controls/TextTypes/Header1TextType.qml</file>
<file>ui/qml/DefaultVpn/Controls/TextTypes/Header3TextType.qml</file> <file>ui/qml/DefaultVpn/Controls/TextTypes/Header3TextType.qml</file>
<file>ui/qml/DefaultVpn/Config/Style.qml</file> <file>ui/qml/DefaultVpn/Config/Style.qml</file>
@ -250,8 +254,10 @@
<file>ui/qml/DefaultVpn/Components/WhiteButtonNoBorder.qml</file> <file>ui/qml/DefaultVpn/Components/WhiteButtonNoBorder.qml</file>
<file>ui/qml/DefaultVpn/Pages/PageSetupWizardConfigSource.qml</file> <file>ui/qml/DefaultVpn/Pages/PageSetupWizardConfigSource.qml</file>
<file>ui/qml/DefaultVpn/Components/BlueButtonNoBorder.qml</file> <file>ui/qml/DefaultVpn/Components/BlueButtonNoBorder.qml</file>
<file>ui/qml/DefaultVpn/Components/ConfirmationDialog.qml</file>
<file>ui/qml/DefaultVpn/Controls/InputType.qml</file> <file>ui/qml/DefaultVpn/Controls/InputType.qml</file>
<file>ui/qml/DefaultVpn/Controls/PopupType.qml</file> <file>ui/qml/DefaultVpn/Controls/PopupType.qml</file>
<file>ui/qml/DefaultVpn/Controls/SwitcherType.qml</file>
<file>ui/qml/DefaultVpn/Pages/PageSettingsServerInfo.qml</file> <file>ui/qml/DefaultVpn/Pages/PageSettingsServerInfo.qml</file>
<file>ui/qml/DefaultVpn/Controls/BusyIndicatorType.qml</file> <file>ui/qml/DefaultVpn/Controls/BusyIndicatorType.qml</file>
<file>images/controls/connect-button.svg</file> <file>images/controls/connect-button.svg</file>

View file

@ -4,9 +4,13 @@
<context> <context>
<name>AdLabel</name> <name>AdLabel</name>
<message> <message>
<location filename="../ui/qml/Components/AdLabel.qml" line="57"/>
<source>Amnezia Premium - for access to any website</source> <source>Amnezia Premium - for access to any website</source>
<translation>Amnezia Premium - для доступа к любым сайтам</translation> <translation type="vanished">Amnezia Premium - для доступа к любым сайтам</translation>
</message>
<message>
<location filename="../ui/qml/Components/AdLabel.qml" line="57"/>
<source>Amnezia Premium - for access to all websites and online resources</source>
<translation type="unfinished"></translation>
</message> </message>
</context> </context>
<context> <context>
@ -56,12 +60,12 @@
<translation>%1 успешно установлен.</translation> <translation>%1 успешно установлен.</translation>
</message> </message>
<message> <message>
<location filename="../ui/controllers/api/apiConfigsController.cpp" line="258"/> <location filename="../ui/controllers/api/apiConfigsController.cpp" line="257"/>
<source>API config reloaded</source> <source>API config reloaded</source>
<translation>Конфигурация API перезагружена</translation> <translation>Конфигурация API перезагружена</translation>
</message> </message>
<message> <message>
<location filename="../ui/controllers/api/apiConfigsController.cpp" line="262"/> <location filename="../ui/controllers/api/apiConfigsController.cpp" line="261"/>
<source>Successfully changed the country of connection to %1</source> <source>Successfully changed the country of connection to %1</source>
<translation>Страна подключения изменена на %1</translation> <translation>Страна подключения изменена на %1</translation>
</message> </message>
@ -90,9 +94,8 @@
<translation type="vanished">Amnezia Free - это бесплатный VPN для обхода блокировок в странах с высоким уровнем интернет-цензуры</translation> <translation type="vanished">Amnezia Free - это бесплатный VPN для обхода блокировок в странах с высоким уровнем интернет-цензуры</translation>
</message> </message>
<message> <message>
<location filename="../ui/models/api/apiServicesModel.cpp" line="68"/>
<source>Amnezia Premium is VPN for comfortable work, downloading large files and watching videos in 8K resolution. Works for any sites with no restrictions. Speed up to %1 MBit/s. Unlimited traffic.</source> <source>Amnezia Premium is VPN for comfortable work, downloading large files and watching videos in 8K resolution. Works for any sites with no restrictions. Speed up to %1 MBit/s. Unlimited traffic.</source>
<translation>Amnezia Premium VPN для комфортной работы, скачивания больших файлов и просмотра видео в высоком разрешении. Скорость до %1 Мбит/с. Безлимитный трафик.</translation> <translation type="vanished">Amnezia Premium VPN для комфортной работы, скачивания больших файлов и просмотра видео в высоком разрешении. Скорость до %1 Мбит/с. Безлимитный трафик.</translation>
</message> </message>
<message> <message>
<location filename="../ui/models/api/apiServicesModel.cpp" line="72"/> <location filename="../ui/models/api/apiServicesModel.cpp" line="72"/>
@ -101,9 +104,18 @@
<translation>AmneziaFree предоставляет бесплатный неограниченный доступ к базовому набору сайтов и приложений, таким как Facebook, Instagram, Twitter (X), Discord, Telegram и другим. YouTube не включен в бесплатный тариф.</translation> <translation>AmneziaFree предоставляет бесплатный неограниченный доступ к базовому набору сайтов и приложений, таким как Facebook, Instagram, Twitter (X), Discord, Telegram и другим. YouTube не включен в бесплатный тариф.</translation>
</message> </message>
<message> <message>
<location filename="../ui/models/api/apiServicesModel.cpp" line="82"/>
<source>Amnezia Premium is VPN for comfortable work, downloading large files and watching videos in 8K resolution. Works for any sites with no restrictions.</source> <source>Amnezia Premium is VPN for comfortable work, downloading large files and watching videos in 8K resolution. Works for any sites with no restrictions.</source>
<translation>Amnezia Premium VPN для комфортной работы, скачивания больших файлов и просмотра видео в высоком разрешении. Работает для любых сайтов без ограничений.</translation> <translation type="vanished">Amnezia Premium VPN для комфортной работы, скачивания больших файлов и просмотра видео в высоком разрешении. Работает для любых сайтов без ограничений.</translation>
</message>
<message>
<location filename="../ui/models/api/apiServicesModel.cpp" line="68"/>
<source>Amnezia Premium is classic VPN for seamless work, downloading large files, and watching videos. Access all websites and online resources. Speeds up to %1 Mbps.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ui/models/api/apiServicesModel.cpp" line="82"/>
<source>Amnezia Premium is classic VPN for for seamless work, downloading large files, and watching videos. Access all websites and online resources.</source>
<translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../ui/models/api/apiServicesModel.cpp" line="97"/> <location filename="../ui/models/api/apiServicesModel.cpp" line="97"/>
@ -340,14 +352,23 @@ Can&apos;t be disabled for current server</source>
<translation type="vanished">Неверный файл конфигурации</translation> <translation type="vanished">Неверный файл конфигурации</translation>
</message> </message>
<message> <message>
<location filename="../ui/controllers/importController.cpp" line="651"/> <location filename="../ui/controllers/importController.cpp" line="650"/>
<source>Scanned %1 of %2.</source> <source>Scanned %1 of %2.</source>
<translation>Отсканировано %1 из %2.</translation> <translation>Отсканировано %1 из %2.</translation>
</message> </message>
<message> <message>
<location filename="../ui/controllers/importController.cpp" line="686"/> <location filename="../ui/controllers/importController.cpp" line="685"/>
<source>This configuration contains an OpenVPN setup. OpenVPN configurations can include malicious scripts, so only add it if you fully trust the provider of this config. </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ui/controllers/importController.cpp" line="689"/>
<source>&lt;br&gt;In the imported configuration, potentially dangerous lines were found:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>In the imported configuration, potentially dangerous lines were found:</source> <source>In the imported configuration, potentially dangerous lines were found:</source>
<translation>В импортированной конфигурации были обнаружены потенциально опасные строки:</translation> <translation type="vanished">В импортированной конфигурации были обнаружены потенциально опасные строки:</translation>
</message> </message>
</context> </context>
<context> <context>
@ -475,8 +496,8 @@ Already installed containers were found on the server. All installed containers
<message> <message>
<location filename="../ui/notificationhandler.cpp" line="63"/> <location filename="../ui/notificationhandler.cpp" line="63"/>
<location filename="../ui/notificationhandler.cpp" line="70"/> <location filename="../ui/notificationhandler.cpp" line="70"/>
<source>DefaultVPN</source> <source>AmneziaVPN</source>
<translation>DefaultVPN</translation> <translation>AmneziaVPN</translation>
</message> </message>
<message> <message>
<location filename="../ui/notificationhandler.cpp" line="64"/> <location filename="../ui/notificationhandler.cpp" line="64"/>
@ -490,8 +511,8 @@ Already installed containers were found on the server. All installed containers
</message> </message>
<message> <message>
<location filename="../ui/notificationhandler.cpp" line="94"/> <location filename="../ui/notificationhandler.cpp" line="94"/>
<source>DefaultVPN notification</source> <source>AmneziaVPN notification</source>
<translation>Уведомление DefaultVPN</translation> <translation>Уведомление AmneziaVPN</translation>
</message> </message>
<message> <message>
<location filename="../ui/notificationhandler.cpp" line="95"/> <location filename="../ui/notificationhandler.cpp" line="95"/>
@ -1455,8 +1476,8 @@ Already installed containers were found on the server. All installed containers
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageSettings.qml" line="107"/> <location filename="../ui/qml/Pages2/PageSettings.qml" line="107"/>
<source>About DefaultVPN</source> <source>About AmneziaVPN</source>
<translation>Об DefaultVPN</translation> <translation>Об AmneziaVPN</translation>
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageSettings.qml" line="123"/> <location filename="../ui/qml/Pages2/PageSettings.qml" line="123"/>
@ -1589,9 +1610,13 @@ Already installed containers were found on the server. All installed containers
<context> <context>
<name>PageSettingsApiDevices</name> <name>PageSettingsApiDevices</name>
<message> <message>
<location filename="../ui/qml/Pages2/PageSettingsApiDevices.qml" line="45"/>
<source>Active devices</source> <source>Active devices</source>
<translation>Активные устройства</translation> <translation type="vanished">Активные устройства</translation>
</message>
<message>
<location filename="../ui/qml/Pages2/PageSettingsApiDevices.qml" line="45"/>
<source>Active Devices</source>
<translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageSettingsApiDevices.qml" line="46"/> <location filename="../ui/qml/Pages2/PageSettingsApiDevices.qml" line="46"/>
@ -1738,13 +1763,17 @@ Already installed containers were found on the server. All installed containers
<name>PageSettingsApiNativeConfigs</name> <name>PageSettingsApiNativeConfigs</name>
<message> <message>
<location filename="../ui/qml/Pages2/PageSettingsApiNativeConfigs.qml" line="23"/> <location filename="../ui/qml/Pages2/PageSettingsApiNativeConfigs.qml" line="23"/>
<source>Save DefaultVPN config</source> <source>Save AmneziaVPN config</source>
<translation>Сохранить конфигурацию DefaultVPN</translation> <translation>Сохранить конфигурацию AmneziaVPN</translation>
</message>
<message>
<source>Configuration files</source>
<translation type="vanished">Файл конфигурации</translation>
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageSettingsApiNativeConfigs.qml" line="48"/> <location filename="../ui/qml/Pages2/PageSettingsApiNativeConfigs.qml" line="48"/>
<source>Configuration files</source> <source>Configuration Files</source>
<translation>Файл конфигурации</translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageSettingsApiNativeConfigs.qml" line="49"/> <location filename="../ui/qml/Pages2/PageSettingsApiNativeConfigs.qml" line="49"/>
@ -1832,9 +1861,8 @@ Already installed containers were found on the server. All installed containers
<translation type="vanished">Период работы</translation> <translation type="vanished">Период работы</translation>
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageSettingsApiServerInfo.qml" line="37"/>
<source>Valid until</source> <source>Valid until</source>
<translation>Действует до</translation> <translation type="vanished">Действует до</translation>
</message> </message>
<message> <message>
<source>Speed</source> <source>Speed</source>
@ -1845,14 +1873,12 @@ Already installed containers were found on the server. All installed containers
<translation type="vanished">Скопировано</translation> <translation type="vanished">Скопировано</translation>
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageSettingsApiServerInfo.qml" line="29"/>
<source>Subscription status</source> <source>Subscription status</source>
<translation>Статус подписки</translation> <translation type="vanished">Статус подписки</translation>
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageSettingsApiServerInfo.qml" line="45"/>
<source>Active connections</source> <source>Active connections</source>
<translation>Активные соединения</translation> <translation type="vanished">Активные соединения</translation>
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageSettingsApiServerInfo.qml" line="171"/> <location filename="../ui/qml/Pages2/PageSettingsApiServerInfo.qml" line="171"/>
@ -1860,9 +1886,8 @@ Already installed containers were found on the server. All installed containers
<translation>Сетевые адреса одного или нескольких серверов были обновлены. Пожалуйста, удалите старые конфигурацию и загрузите новые файлы</translation> <translation>Сетевые адреса одного или нескольких серверов были обновлены. Пожалуйста, удалите старые конфигурацию и загрузите новые файлы</translation>
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageSettingsApiServerInfo.qml" line="186"/>
<source>Subscription key</source> <source>Subscription key</source>
<translation>Ключ для подключения</translation> <translation type="vanished">Ключ для подключения</translation>
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageSettingsApiServerInfo.qml" line="190"/> <location filename="../ui/qml/Pages2/PageSettingsApiServerInfo.qml" line="190"/>
@ -1870,9 +1895,8 @@ Already installed containers were found on the server. All installed containers
<translation>Ключ подписки Amnezia Premium</translation> <translation>Ключ подписки Amnezia Premium</translation>
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageSettingsApiServerInfo.qml" line="194"/>
<source>Save VPN key to file</source> <source>Save VPN key to file</source>
<translation>Сохранить VPN-ключ в файле</translation> <translation type="vanished">Сохранить VPN-ключ в файле</translation>
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageSettingsApiServerInfo.qml" line="195"/> <location filename="../ui/qml/Pages2/PageSettingsApiServerInfo.qml" line="195"/>
@ -1880,9 +1904,8 @@ Already installed containers were found on the server. All installed containers
<translation>Скопировать VPN ключ</translation> <translation>Скопировать VPN ключ</translation>
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageSettingsApiServerInfo.qml" line="216"/>
<source>Configuration files</source> <source>Configuration files</source>
<translation>Файл конфигурации</translation> <translation type="vanished">Файл конфигурации</translation>
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageSettingsApiServerInfo.qml" line="218"/> <location filename="../ui/qml/Pages2/PageSettingsApiServerInfo.qml" line="218"/>
@ -1890,9 +1913,43 @@ Already installed containers were found on the server. All installed containers
<translation>Управление файлами конфигурации</translation> <translation>Управление файлами конфигурации</translation>
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageSettingsApiServerInfo.qml" line="236"/>
<source>Active devices</source> <source>Active devices</source>
<translation>Активные устройства</translation> <translation type="vanished">Активные устройства</translation>
</message>
<message>
<location filename="../ui/qml/Pages2/PageSettingsApiServerInfo.qml" line="29"/>
<source>Subscription Status</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ui/qml/Pages2/PageSettingsApiServerInfo.qml" line="37"/>
<source>Valid Until</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ui/qml/Pages2/PageSettingsApiServerInfo.qml" line="45"/>
<source>Active Connections</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ui/qml/Pages2/PageSettingsApiServerInfo.qml" line="186"/>
<source>Subscription Key</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ui/qml/Pages2/PageSettingsApiServerInfo.qml" line="194"/>
<source>Save VPN key as a file</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ui/qml/Pages2/PageSettingsApiServerInfo.qml" line="216"/>
<source>Configuration Files</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ui/qml/Pages2/PageSettingsApiServerInfo.qml" line="236"/>
<source>Active Devices</source>
<translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageSettingsApiServerInfo.qml" line="238"/> <location filename="../ui/qml/Pages2/PageSettingsApiServerInfo.qml" line="238"/>
@ -1982,9 +2039,13 @@ Already installed containers were found on the server. All installed containers
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageSettingsApiSupport.qml" line="30"/>
<source>Email Support</source> <source>Email Support</source>
<translation>Email</translation> <translation type="vanished">Email</translation>
</message>
<message>
<location filename="../ui/qml/Pages2/PageSettingsApiSupport.qml" line="30"/>
<source>Email</source>
<translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageSettingsApiSupport.qml" line="31"/> <location filename="../ui/qml/Pages2/PageSettingsApiSupport.qml" line="31"/>
@ -2174,8 +2235,8 @@ Already installed containers were found on the server. All installed containers
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageSettingsApplication.qml" line="212"/> <location filename="../ui/qml/Pages2/PageSettingsApplication.qml" line="212"/>
<source>All settings will be reset to default. All installed DefaultVPN services will still remain on the server.</source> <source>All settings will be reset to default. All installed AmneziaVPN services will still remain on the server.</source>
<translation>Все настройки будут сброшены до значений по умолчанию. Все установленные сервисы DefaultVPN останутся на сервере.</translation> <translation>Все настройки будут сброшены до значений по умолчанию. Все установленные сервисы AmneziaVPN останутся на сервере.</translation>
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageSettingsApplication.qml" line="213"/> <location filename="../ui/qml/Pages2/PageSettingsApplication.qml" line="213"/>
@ -2220,8 +2281,8 @@ Already installed containers were found on the server. All installed containers
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageSettingsBackup.qml" line="74"/> <location filename="../ui/qml/Pages2/PageSettingsBackup.qml" line="74"/>
<source>The backup will contain your passwords and private keys for all servers added to DefaultVPN. Keep this information in a secure place.</source> <source>The backup will contain your passwords and private keys for all servers added to AmneziaVPN. Keep this information in a secure place.</source>
<translation>Резервная копия будет содержать ваши пароли и закрытые ключи для всех серверов, добавленных в DefaultVPN. Храните эту информацию в надежном месте.</translation> <translation>Резервная копия будет содержать ваши пароли и закрытые ключи для всех серверов, добавленных в AmneziaVPN. Храните эту информацию в надежном месте.</translation>
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageSettingsBackup.qml" line="85"/> <location filename="../ui/qml/Pages2/PageSettingsBackup.qml" line="85"/>
@ -2332,8 +2393,12 @@ Already installed containers were found on the server. All installed containers
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageSettingsConnection.qml" line="143"/> <location filename="../ui/qml/Pages2/PageSettingsConnection.qml" line="143"/>
<source>Cannot change KillSwitch settings during active connection</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Cannot change killSwitch settings during active connection</source> <source>Cannot change killSwitch settings during active connection</source>
<translation>Невозможно изменить настройки аварийного выключателя во время активного соединения</translation> <translation type="vanished">Невозможно изменить настройки аварийного выключателя во время активного соединения</translation>
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageSettingsConnection.qml" line="86"/> <location filename="../ui/qml/Pages2/PageSettingsConnection.qml" line="86"/>
@ -2500,7 +2565,7 @@ Already installed containers were found on the server. All installed containers
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageSettingsLogging.qml" line="176"/> <location filename="../ui/qml/Pages2/PageSettingsLogging.qml" line="176"/>
<source>DefaultVPN logs</source> <source>AmneziaVPN logs</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
@ -2520,7 +2585,7 @@ Already installed containers were found on the server. All installed containers
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageSettingsLogging.qml" line="205"/> <location filename="../ui/qml/Pages2/PageSettingsLogging.qml" line="205"/>
<source>DefaultVPN-service logs</source> <source>AmneziaVPN-service logs</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
@ -2655,7 +2720,7 @@ Already installed containers were found on the server. All installed containers
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageSettingsServerData.qml" line="153"/> <location filename="../ui/qml/Pages2/PageSettingsServerData.qml" line="153"/>
<source>All installed DefaultVPN services will still remain on the server.</source> <source>All installed AmneziaVPN services will still remain on the server.</source>
<translation>Все установленные сервисы и протоколы Amnezia останутся на сервере.</translation> <translation>Все установленные сервисы и протоколы Amnezia останутся на сервере.</translation>
</message> </message>
<message> <message>
@ -3517,8 +3582,8 @@ and will not be shared or disclosed to the Amnezia or any third parties</source>
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageShare.qml" line="119"/> <location filename="../ui/qml/Pages2/PageShare.qml" line="119"/>
<source>For the DefaultVPN app</source> <source>For the AmneziaVPN app</source>
<translation>Для приложения DefaultVPN</translation> <translation>Для приложения AmneziaVPN</translation>
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageShare.qml" line="134"/> <location filename="../ui/qml/Pages2/PageShare.qml" line="134"/>
@ -4038,46 +4103,66 @@ and will not be shared or disclosed to the Amnezia or any third parties</source>
</message> </message>
<message> <message>
<location filename="../core/errorstrings.cpp" line="23"/> <location filename="../core/errorstrings.cpp" line="23"/>
<source>The user does not have permission to use sudo</source> <source>The user is not a member of the sudo group</source>
<translation>У пользователя нет прав на использование sudo</translation> <translation>Пользователь не входит в группу sudo</translation>
</message> </message>
<message> <message>
<location filename="../core/errorstrings.cpp" line="24"/> <location filename="../core/errorstrings.cpp" line="24"/>
<source>Server error: Packet manager error</source> <source>Server error: Package manager error</source>
<translation>Ошибка сервера: ошибка менеджера пакетов</translation> <translation>Ошибка сервера: Ошибка менеджера пакетов</translation>
</message>
<message>
<location filename="../core/errorstrings.cpp" line="25"/>
<source>The sudo package is not pre-installed on the server</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../core/errorstrings.cpp" line="26"/>
<source>The server user&apos;s home directory is not accessible</source>
<translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../core/errorstrings.cpp" line="27"/> <location filename="../core/errorstrings.cpp" line="27"/>
<source>Action not allowed in sudoers</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../core/errorstrings.cpp" line="28"/>
<source>The user&apos;s password is required</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../core/errorstrings.cpp" line="31"/>
<source>SSH request was denied</source> <source>SSH request was denied</source>
<translation>SSH-запрос был отклонён</translation> <translation>SSH-запрос был отклонён</translation>
</message> </message>
<message> <message>
<location filename="../core/errorstrings.cpp" line="28"/> <location filename="../core/errorstrings.cpp" line="32"/>
<source>SSH request was interrupted</source> <source>SSH request was interrupted</source>
<translation>SSH-запрос был прерван</translation> <translation>SSH-запрос был прерван</translation>
</message> </message>
<message> <message>
<location filename="../core/errorstrings.cpp" line="29"/> <location filename="../core/errorstrings.cpp" line="33"/>
<source>SSH internal error</source> <source>SSH internal error</source>
<translation>Внутренняя ошибка SSH</translation> <translation>Внутренняя ошибка SSH</translation>
</message> </message>
<message> <message>
<location filename="../core/errorstrings.cpp" line="30"/> <location filename="../core/errorstrings.cpp" line="34"/>
<source>Invalid private key or invalid passphrase entered</source> <source>Invalid private key or invalid passphrase entered</source>
<translation>Введен неверный закрытый ключ или неверная парольная фраза</translation> <translation>Введен неверный закрытый ключ или неверная парольная фраза</translation>
</message> </message>
<message> <message>
<location filename="../core/errorstrings.cpp" line="31"/> <location filename="../core/errorstrings.cpp" line="35"/>
<source>The selected private key format is not supported, use openssh ED25519 key types or PEM key types</source> <source>The selected private key format is not supported, use openssh ED25519 key types or PEM key types</source>
<translation>Выбранный формат закрытого ключа не поддерживается, используйте типы ключей openssh ED25519 или PEM</translation> <translation>Выбранный формат закрытого ключа не поддерживается, используйте типы ключей openssh ED25519 или PEM</translation>
</message> </message>
<message> <message>
<location filename="../core/errorstrings.cpp" line="32"/> <location filename="../core/errorstrings.cpp" line="36"/>
<source>Timeout connecting to server</source> <source>Timeout connecting to server</source>
<translation>Тайм-аут подключения к серверу</translation> <translation>Тайм-аут подключения к серверу</translation>
</message> </message>
<message> <message>
<location filename="../core/errorstrings.cpp" line="35"/> <location filename="../core/errorstrings.cpp" line="39"/>
<source>SCP error: Generic failure</source> <source>SCP error: Generic failure</source>
<translation>Ошибка SCP: общий сбой</translation> <translation>Ошибка SCP: общий сбой</translation>
</message> </message>
@ -4134,23 +4219,23 @@ and will not be shared or disclosed to the Amnezia or any third parties</source>
<translation type="vanished">Sftp error: No media was in remote drive</translation> <translation type="vanished">Sftp error: No media was in remote drive</translation>
</message> </message>
<message> <message>
<location filename="../core/errorstrings.cpp" line="53"/> <location filename="../core/errorstrings.cpp" line="57"/>
<source>The config does not contain any containers and credentials for connecting to the server</source> <source>The config does not contain any containers and credentials for connecting to the server</source>
<translation>Конфигурация не содержит каких-либо контейнеров и учетных данных для подключения к серверу</translation> <translation>Конфигурация не содержит каких-либо контейнеров и учетных данных для подключения к серверу</translation>
</message> </message>
<message> <message>
<location filename="../core/errorstrings.cpp" line="61"/> <location filename="../core/errorstrings.cpp" line="65"/>
<location filename="../core/errorstrings.cpp" line="70"/> <location filename="../core/errorstrings.cpp" line="74"/>
<source>Error when retrieving configuration from API</source> <source>Error when retrieving configuration from API</source>
<translation>Ошибка при получении конфигурации из API</translation> <translation>Ошибка при получении конфигурации из API</translation>
</message> </message>
<message> <message>
<location filename="../core/errorstrings.cpp" line="62"/> <location filename="../core/errorstrings.cpp" line="66"/>
<source>This config has already been added to the application</source> <source>This config has already been added to the application</source>
<translation>Данная конфигурация уже была добавлена в приложение</translation> <translation>Данная конфигурация уже была добавлена в приложение</translation>
</message> </message>
<message> <message>
<location filename="../core/errorstrings.cpp" line="85"/> <location filename="../core/errorstrings.cpp" line="89"/>
<source>ErrorCode: %1. </source> <source>ErrorCode: %1. </source>
<translation>Код ошибки: %1. </translation> <translation>Код ошибки: %1. </translation>
</message> </message>
@ -4159,139 +4244,139 @@ and will not be shared or disclosed to the Amnezia or any third parties</source>
<translation type="vanished">Failed to save config to disk</translation> <translation type="vanished">Failed to save config to disk</translation>
</message> </message>
<message> <message>
<location filename="../core/errorstrings.cpp" line="38"/> <location filename="../core/errorstrings.cpp" line="42"/>
<source>OpenVPN config missing</source> <source>OpenVPN config missing</source>
<translation>Отсутствует конфигурация OpenVPN</translation> <translation>Отсутствует конфигурация OpenVPN</translation>
</message> </message>
<message> <message>
<location filename="../core/errorstrings.cpp" line="39"/> <location filename="../core/errorstrings.cpp" line="43"/>
<source>OpenVPN management server error</source> <source>OpenVPN management server error</source>
<translation>Серверная ошибка управлением OpenVPN</translation> <translation>Серверная ошибка управлением OpenVPN</translation>
</message> </message>
<message> <message>
<location filename="../core/errorstrings.cpp" line="42"/> <location filename="../core/errorstrings.cpp" line="46"/>
<source>OpenVPN executable missing</source> <source>OpenVPN executable missing</source>
<translation>Отсутствует исполняемый файл OpenVPN</translation> <translation>Отсутствует исполняемый файл OpenVPN</translation>
</message> </message>
<message> <message>
<location filename="../core/errorstrings.cpp" line="43"/> <location filename="../core/errorstrings.cpp" line="47"/>
<source>Shadowsocks (ss-local) executable missing</source> <source>Shadowsocks (ss-local) executable missing</source>
<translation>Отсутствует исполняемый файл Shadowsocks (ss-local)</translation> <translation>Отсутствует исполняемый файл Shadowsocks (ss-local)</translation>
</message> </message>
<message> <message>
<location filename="../core/errorstrings.cpp" line="44"/> <location filename="../core/errorstrings.cpp" line="48"/>
<source>Cloak (ck-client) executable missing</source> <source>Cloak (ck-client) executable missing</source>
<translation>Отсутствует исполняемый файл Cloak (ck-client)</translation> <translation>Отсутствует исполняемый файл Cloak (ck-client)</translation>
</message> </message>
<message> <message>
<location filename="../core/errorstrings.cpp" line="45"/> <location filename="../core/errorstrings.cpp" line="49"/>
<source>Amnezia helper service error</source> <source>Amnezia helper service error</source>
<translation>Ошибка вспомогательной службы Amnezia</translation> <translation>Ошибка вспомогательной службы Amnezia</translation>
</message> </message>
<message> <message>
<location filename="../core/errorstrings.cpp" line="46"/> <location filename="../core/errorstrings.cpp" line="50"/>
<source>OpenSSL failed</source> <source>OpenSSL failed</source>
<translation>Ошибка OpenSSL</translation> <translation>Ошибка OpenSSL</translation>
</message> </message>
<message> <message>
<location filename="../core/errorstrings.cpp" line="49"/> <location filename="../core/errorstrings.cpp" line="53"/>
<source>Can&apos;t connect: another VPN connection is active</source> <source>Can&apos;t connect: another VPN connection is active</source>
<translation>Невозможно подключиться: активно другое VPN-соединение</translation> <translation>Невозможно подключиться: активно другое VPN-соединение</translation>
</message> </message>
<message> <message>
<location filename="../core/errorstrings.cpp" line="50"/> <location filename="../core/errorstrings.cpp" line="54"/>
<source>Can&apos;t setup OpenVPN TAP network adapter</source> <source>Can&apos;t setup OpenVPN TAP network adapter</source>
<translation>Невозможно настроить сетевой адаптер OpenVPN TAP</translation> <translation>Невозможно настроить сетевой адаптер OpenVPN TAP</translation>
</message> </message>
<message> <message>
<location filename="../core/errorstrings.cpp" line="51"/> <location filename="../core/errorstrings.cpp" line="55"/>
<source>VPN pool error: no available addresses</source> <source>VPN pool error: no available addresses</source>
<translation>Ошибка пула VPN: нет доступных адресов</translation> <translation>Ошибка пула VPN: нет доступных адресов</translation>
</message> </message>
<message> <message>
<location filename="../core/errorstrings.cpp" line="54"/> <location filename="../core/errorstrings.cpp" line="58"/>
<source>Unable to open config file</source> <source>Unable to open config file</source>
<translation>Не удалось открыть файл конфигурации</translation> <translation>Не удалось открыть файл конфигурации</translation>
</message> </message>
<message> <message>
<location filename="../core/errorstrings.cpp" line="55"/> <location filename="../core/errorstrings.cpp" line="59"/>
<source>VPN Protocols is not installed. <source>VPN Protocols is not installed.
Please install VPN container at first</source> Please install VPN container at first</source>
<translation>VPN-протоколы не установлены. <translation>VPN-протоколы не установлены.
Пожалуйста, установите протокол</translation> Пожалуйста, установите протокол</translation>
</message> </message>
<message> <message>
<location filename="../core/errorstrings.cpp" line="58"/> <location filename="../core/errorstrings.cpp" line="62"/>
<source>VPN connection error</source> <source>VPN connection error</source>
<translation>Ошибка VPN-соединения</translation> <translation>Ошибка VPN-соединения</translation>
</message> </message>
<message> <message>
<location filename="../core/errorstrings.cpp" line="63"/> <location filename="../core/errorstrings.cpp" line="67"/>
<source>In the response from the server, an empty config was received</source> <source>In the response from the server, an empty config was received</source>
<translation>В ответе от сервера была получена пустая конфигурация</translation> <translation>В ответе от сервера была получена пустая конфигурация</translation>
</message> </message>
<message> <message>
<location filename="../core/errorstrings.cpp" line="64"/> <location filename="../core/errorstrings.cpp" line="68"/>
<source>SSL error occurred</source> <source>SSL error occurred</source>
<translation>Произошла ошибка SSL</translation> <translation>Произошла ошибка SSL</translation>
</message> </message>
<message> <message>
<location filename="../core/errorstrings.cpp" line="65"/> <location filename="../core/errorstrings.cpp" line="69"/>
<source>Server response timeout on api request</source> <source>Server response timeout on api request</source>
<translation>Тайм-аут ответа сервера на запрос API</translation> <translation>Тайм-аут ответа сервера на запрос API</translation>
</message> </message>
<message> <message>
<location filename="../core/errorstrings.cpp" line="66"/> <location filename="../core/errorstrings.cpp" line="70"/>
<source>Missing AGW public key</source> <source>Missing AGW public key</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../core/errorstrings.cpp" line="67"/> <location filename="../core/errorstrings.cpp" line="71"/>
<source>Failed to decrypt response payload</source> <source>Failed to decrypt response payload</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../core/errorstrings.cpp" line="68"/> <location filename="../core/errorstrings.cpp" line="72"/>
<source>Missing list of available services</source> <source>Missing list of available services</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../core/errorstrings.cpp" line="69"/> <location filename="../core/errorstrings.cpp" line="73"/>
<source>The limit of allowed configurations per subscription has been exceeded</source> <source>The limit of allowed configurations per subscription has been exceeded</source>
<translation>Превышен лимит разрешенных конфигураций для одной подписки</translation> <translation>Превышен лимит разрешенных конфигураций для одной подписки</translation>
</message> </message>
<message> <message>
<location filename="../core/errorstrings.cpp" line="73"/> <location filename="../core/errorstrings.cpp" line="77"/>
<source>QFile error: The file could not be opened</source> <source>QFile error: The file could not be opened</source>
<translation>Ошибка QFile: не удалось открыть файл</translation> <translation>Ошибка QFile: не удалось открыть файл</translation>
</message> </message>
<message> <message>
<location filename="../core/errorstrings.cpp" line="74"/> <location filename="../core/errorstrings.cpp" line="78"/>
<source>QFile error: An error occurred when reading from the file</source> <source>QFile error: An error occurred when reading from the file</source>
<translation>Ошибка QFile: произошла ошибка при чтении из файла</translation> <translation>Ошибка QFile: произошла ошибка при чтении из файла</translation>
</message> </message>
<message> <message>
<location filename="../core/errorstrings.cpp" line="75"/> <location filename="../core/errorstrings.cpp" line="79"/>
<source>QFile error: The file could not be accessed</source> <source>QFile error: The file could not be accessed</source>
<translation>Ошибка QFile: не удалось получить доступ к файлу</translation> <translation>Ошибка QFile: не удалось получить доступ к файлу</translation>
</message> </message>
<message> <message>
<location filename="../core/errorstrings.cpp" line="76"/> <location filename="../core/errorstrings.cpp" line="80"/>
<source>QFile error: An unspecified error occurred</source> <source>QFile error: An unspecified error occurred</source>
<translation>Ошибка QFile: произошла неизвестная ошибка</translation> <translation>Ошибка QFile: произошла неизвестная ошибка</translation>
</message> </message>
<message> <message>
<location filename="../core/errorstrings.cpp" line="77"/> <location filename="../core/errorstrings.cpp" line="81"/>
<source>QFile error: A fatal error occurred</source> <source>QFile error: A fatal error occurred</source>
<translation>Ошибка QFile: произошла фатальная ошибка</translation> <translation>Ошибка QFile: произошла фатальная ошибка</translation>
</message> </message>
<message> <message>
<location filename="../core/errorstrings.cpp" line="78"/> <location filename="../core/errorstrings.cpp" line="82"/>
<source>QFile error: The operation was aborted</source> <source>QFile error: The operation was aborted</source>
<translation>Ошибка QFile: операция была прервана</translation> <translation>Ошибка QFile: операция была прервана</translation>
</message> </message>
<message> <message>
<location filename="../core/errorstrings.cpp" line="82"/> <location filename="../core/errorstrings.cpp" line="86"/>
<source>Internal error</source> <source>Internal error</source>
<translation>Внутренняя ошибка</translation> <translation>Внутренняя ошибка</translation>
</message> </message>
@ -4331,7 +4416,7 @@ Immediately after receiving the first data packet, Cloak authenticates the incom
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 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 DefaultVPN across all platforms * Available in the AmneziaVPN across all platforms
* High power consumption on mobile devices * High power consumption on mobile devices
* Flexible settings * Flexible settings
* Not recognised by DPI analysis systems * Not recognised by DPI analysis systems
@ -4349,7 +4434,7 @@ Cloak изменяет метаданные пакетов таким образ
Если в вашем регионе наблюдается жесткая интернет-цензура, мы советуем вам уже при первом подключении использовать только OpenVPN over Cloak. Если в вашем регионе наблюдается жесткая интернет-цензура, мы советуем вам уже при первом подключении использовать только OpenVPN over Cloak.
* Доступен в DefaultVPN на всех платформах * Доступен в AmneziaVPN на всех платформах
* Высокое энергопотребление на мобильных устройствах * Высокое энергопотребление на мобильных устройствах
* Гибкие настройки * Гибкие настройки
* Не распознается системами DPI-анализа * Не распознается системами DPI-анализа
@ -4360,7 +4445,7 @@ Cloak изменяет метаданные пакетов таким образ
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 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. 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 DefaultVPN across all platforms * Available in the AmneziaVPN across all platforms
* Low power consumption * Low power consumption
* Minimum number of settings * Minimum number of settings
* Easily recognised by DPI analysis systems, susceptible to blocking * Easily recognised by DPI analysis systems, susceptible to blocking
@ -4369,7 +4454,7 @@ WireGuard is very susceptible to blocking due to its distinct packet signatures.
WireGuard обеспечивает стабильное VPN-соединение и высокую производительность на всех устройствах. Он использует строго заданные настройки шифрования. WireGuard по сравнению с OpenVPN имеет меньшую задержку и лучшую пропускную способность при передаче данных. WireGuard обеспечивает стабильное VPN-соединение и высокую производительность на всех устройствах. Он использует строго заданные настройки шифрования. WireGuard по сравнению с OpenVPN имеет меньшую задержку и лучшую пропускную способность при передаче данных.
WireGuard очень уязвим для блокировки из-за характерных сигнатур пакетов. В отличие от некоторых других VPN-протоколов, использующих методы обфускации, последовательные сигнатуры пакетов WireGuard легче идентифицируются и, следовательно, могут блокироваться современными Deep Packet Inspection (DPI) системами и другими инструментами для сетевого мониторинга. WireGuard очень уязвим для блокировки из-за характерных сигнатур пакетов. В отличие от некоторых других VPN-протоколов, использующих методы обфускации, последовательные сигнатуры пакетов WireGuard легче идентифицируются и, следовательно, могут блокироваться современными Deep Packet Inspection (DPI) системами и другими инструментами для сетевого мониторинга.
* Доступен в DefaultVPN на всех платформах * Доступен в AmneziaVPN на всех платформах
* Низкое энергопотребление на мобильных устройствах * Низкое энергопотребление на мобильных устройствах
* Минимальная конфигурация * Минимальная конфигурация
* Легко распознается системами DPI-анализа, поддается блокировке * Легко распознается системами DPI-анализа, поддается блокировке
@ -4391,7 +4476,7 @@ REALITY отличается от аналогичных технологий б
One of its distinguishing features is its ability to swiftly switch between networks and devices, making it particularly adaptive in dynamic network environments. 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&apos;s essential to note that IKEv2 can be easily detected and is susceptible to blocking. While it offers a blend of security, stability, and speed, it&apos;s essential to note that IKEv2 can be easily detected and is susceptible to blocking.
* Available in the DefaultVPN only on Windows * Available in the AmneziaVPN only on Windows
* Low power consumption, on mobile devices * Low power consumption, on mobile devices
* Minimal configuration * Minimal configuration
* Recognised by DPI analysis systems * Recognised by DPI analysis systems
@ -4400,7 +4485,7 @@ While it offers a blend of security, stability, and speed, it&apos;s essential t
Он может быстро переключаться между сетями и устройствами, что делает его особенно адаптивным в динамичных сетевых средах. Он может быстро переключаться между сетями и устройствами, что делает его особенно адаптивным в динамичных сетевых средах.
Несмотря на сочетание безопасности, стабильности и скорости, необходимо отметить, что IKEv2 легко обнаруживается и подвержен блокировке. Несмотря на сочетание безопасности, стабильности и скорости, необходимо отметить, что IKEv2 легко обнаруживается и подвержен блокировке.
* Доступен в DefaultVPN только для Windows * Доступен в AmneziaVPN только для Windows
* Низкое энергопотребление на мобильных устройствах * Низкое энергопотребление на мобильных устройствах
* Минимальная конфигурация * Минимальная конфигурация
* Распознается системами DPI-анализа * Распознается системами DPI-анализа
@ -4462,13 +4547,13 @@ While it offers a blend of security, stability, and speed, it&apos;s essential t
<source>OpenVPN stands as one of the most popular and time-tested VPN protocols available. <source>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&apos;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. It employs its unique security protocol, leveraging the strength of SSL/TLS for encryption and key exchange. Furthermore, OpenVPN&apos;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 DefaultVPN across all platforms * Available in the AmneziaVPN across all platforms
* Normal power consumption on mobile devices * Normal power consumption on mobile devices
* Flexible customisation to suit user needs to work with different operating systems and devices * Flexible customisation to suit user needs to work with different operating systems and devices
* Recognised by DPI systems and therefore susceptible to blocking * Recognised by DPI systems and therefore susceptible to blocking
* Can operate over both TCP and UDP network protocols.</source> * Can operate over both TCP and UDP network protocols.</source>
<translation>OpenVPN является одним из самых популярных и проверенных временем VPN-протоколов. Он использует собственный протокол безопасности, и криптографические протоколы SSL/TLS для шифрования и обмена ключами. Более того, поддержка множества методов аутентификации делает OpenVPN универсальным, адаптируемым и подходящим для широкого спектра устройств и операционных систем. Благодаря своему открытому коду, OpenVPN подвергается тщательной проверке со стороны мирового сообщества, что постоянно укрепляет его безопасность. Имея отличный баланс между производительностью, безопасностью и совместимостью OpenVPN остается лучшим выбором для людей и компаний, заботящихся о конфиденциальности, однако OpenVPN легко распознается современными системами анализа трафика. <translation>OpenVPN является одним из самых популярных и проверенных временем VPN-протоколов. Он использует собственный протокол безопасности, и криптографические протоколы SSL/TLS для шифрования и обмена ключами. Более того, поддержка множества методов аутентификации делает OpenVPN универсальным, адаптируемым и подходящим для широкого спектра устройств и операционных систем. Благодаря своему открытому коду, OpenVPN подвергается тщательной проверке со стороны мирового сообщества, что постоянно укрепляет его безопасность. Имея отличный баланс между производительностью, безопасностью и совместимостью OpenVPN остается лучшим выбором для людей и компаний, заботящихся о конфиденциальности, однако OpenVPN легко распознается современными системами анализа трафика.
Доступен в DefaultVPN на всех платформах Доступен в AmneziaVPN на всех платформах
Нормальное энергопотребление на мобильных устройствах Нормальное энергопотребление на мобильных устройствах
Гибкая настройка полезная при работе с различными операционными системами и устройствами Гибкая настройка полезная при работе с различными операционными системами и устройствами
Распознается системами DPI и, следовательно, уязвим к блокировкам Распознается системами DPI и, следовательно, уязвим к блокировкам
@ -4486,7 +4571,7 @@ Cloak can modify packet metadata so that it completely masks VPN traffic as norm
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. 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.
* Available in the DefaultVPN across all platforms * Available in the AmneziaVPN across all platforms
* High power consumption on mobile devices * High power consumption on mobile devices
* Flexible settings * Flexible settings
* Not recognised by detection systems * Not recognised by detection systems
@ -4502,7 +4587,7 @@ Cloak может изменять метаданные пакета, чтобы
Сразу после получения первого пакета данных Cloak аутентифицирует входящее соединение, если аутентификация не удалась, плагин маскирует сервер под настоящий веб-сайт, и ваш VPN становится невидимым для систем анализа. Имеет низкую скорость работы в сравнении с другими похожими протоколами. Сразу после получения первого пакета данных Cloak аутентифицирует входящее соединение, если аутентификация не удалась, плагин маскирует сервер под настоящий веб-сайт, и ваш VPN становится невидимым для систем анализа. Имеет низкую скорость работы в сравнении с другими похожими протоколами.
* Доступно в DefaultVPN на всех платформах. * Доступно в AmneziaVPN на всех платформах.
* Высокое энергопотребление на мобильных устройствах * Высокое энергопотребление на мобильных устройствах
* Гибкие настройки * Гибкие настройки
* Не распознается системами обнаружения. * Не распознается системами обнаружения.
@ -4515,7 +4600,7 @@ Cloak может изменять метаданные пакета, чтобы
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 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 detection and 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. WireGuard is very susceptible to detection and 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 DefaultVPN across all platforms * Available in the AmneziaVPN across all platforms
* Low power consumption * Low power consumption
* Minimum number of settings * Minimum number of settings
* Easily recognised by DPI analysis systems, susceptible to blocking * Easily recognised by DPI analysis systems, susceptible to blocking
@ -4524,7 +4609,7 @@ WireGuard is very susceptible to detection and blocking due to its distinct pack
WireGuard обеспечивает стабильное VPN-соединение и высокую производительность на всех устройствах. Он использует закодированные настройки шифрования. WireGuard по сравнению с OpenVPN имеет меньшую задержку и лучшую пропускную способность передачи данных. WireGuard обеспечивает стабильное VPN-соединение и высокую производительность на всех устройствах. Он использует закодированные настройки шифрования. WireGuard по сравнению с OpenVPN имеет меньшую задержку и лучшую пропускную способность передачи данных.
WireGuard очень чувствителен к обнаружению и блокировке из-за различных сигнатур пакетов. В отличие от некоторых других VPN протоколов, использующих методы запутывания, последовательные шаблоны сигнатур пакетов WireGuard легко идентифицируются системами анализа трафика. WireGuard очень чувствителен к обнаружению и блокировке из-за различных сигнатур пакетов. В отличие от некоторых других VPN протоколов, использующих методы запутывания, последовательные шаблоны сигнатур пакетов WireGuard легко идентифицируются системами анализа трафика.
* Доступно в DefaultVPN на всех платформах. * Доступно в AmneziaVPN на всех платформах.
* Низкое энергопотребление * Низкое энергопотребление
* Минимальное количество настроек * Минимальное количество настроек
* Легко распознается системами анализа DPI, подвержен блокировке. * Легко распознается системами анализа DPI, подвержен блокировке.
@ -4536,7 +4621,7 @@ WireGuard очень чувствителен к обнаружению и бл
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. 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. 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 DefaultVPN across all platforms * Available in the AmneziaVPN across all platforms
* Low power consumption * Low power consumption
* Minimum number of settings * Minimum number of settings
* Not recognised by traffic analysis systems * Not recognised by traffic analysis systems
@ -4545,7 +4630,7 @@ This means that AmneziaWG keeps the fast performance of the original while addin
Хотя WireGuard известен своей эффективностью, обнаружить его довольно легко из-за различных сигнатур пакетов. AmneziaWG решает эту проблему, используя более совершенные методы работы, смешивая свой трафик с обычным интернет-трафиком. Хотя WireGuard известен своей эффективностью, обнаружить его довольно легко из-за различных сигнатур пакетов. AmneziaWG решает эту проблему, используя более совершенные методы работы, смешивая свой трафик с обычным интернет-трафиком.
Это означает, что AmneziaWG сохраняет высокую производительность оригинала, добавляя при этом дополнительный уровень скрытности, что делает его отличным выбором для тех, кому нужно быстрое и незаметное VPN-соединение. Это означает, что AmneziaWG сохраняет высокую производительность оригинала, добавляя при этом дополнительный уровень скрытности, что делает его отличным выбором для тех, кому нужно быстрое и незаметное VPN-соединение.
* Доступно в DefaultVPN на всех платформах. * Доступно в AmneziaVPN на всех платформах.
* Низкое энергопотребление * Низкое энергопотребление
* Минимальное количество настроек * Минимальное количество настроек
* Не распознается системами анализа трафика. * Не распознается системами анализа трафика.
@ -4592,7 +4677,7 @@ Unlike older protocols such as VMess, VLESS, and the XTLS-Vision transport, REAL
<source>OpenVPN stands as one of the most popular and time-tested VPN protocols available. <source>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&apos;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. It employs its unique security protocol, leveraging the strength of SSL/TLS for encryption and key exchange. Furthermore, OpenVPN&apos;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 DefaultVPN across all platforms * Available in the AmneziaVPN across all platforms
* Normal power consumption on mobile devices * Normal power consumption on mobile devices
* Flexible customisation to suit user needs to work with different operating systems and 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 * Recognised by DPI analysis systems and therefore susceptible to blocking
@ -4600,7 +4685,7 @@ It employs its unique security protocol, leveraging the strength of SSL/TLS for
<translation type="vanished">OpenVPN один из самых популярных и проверенных временем VPN-протоколов. <translation type="vanished">OpenVPN один из самых популярных и проверенных временем VPN-протоколов.
В нем используется уникальный протокол безопасности, опирающийся на SSL/TLS для шифрования и обмена ключами. Кроме того, OpenVPN поддерживает множество методов аутентификации, что делает его универсальным и адаптируемым к широкому спектру устройств и операционных систем. Благодаря открытому исходному коду OpenVPN подвергается тщательному анализу со стороны мирового сообщества, что постоянно повышает его безопасность. Оптимальное соотношение производительности, безопасности и совместимости делает OpenVPN лучшим выбором как для частных лиц, так и для компаний, заботящихся о конфиденциальности. В нем используется уникальный протокол безопасности, опирающийся на SSL/TLS для шифрования и обмена ключами. Кроме того, OpenVPN поддерживает множество методов аутентификации, что делает его универсальным и адаптируемым к широкому спектру устройств и операционных систем. Благодаря открытому исходному коду OpenVPN подвергается тщательному анализу со стороны мирового сообщества, что постоянно повышает его безопасность. Оптимальное соотношение производительности, безопасности и совместимости делает OpenVPN лучшим выбором как для частных лиц, так и для компаний, заботящихся о конфиденциальности.
* Доступен в DefaultVPN на всех платформах * Доступен в AmneziaVPN на всех платформах
* Нормальное энергопотребление на мобильных устройствах * Нормальное энергопотребление на мобильных устройствах
* Гибкая настройка под нужды пользователя для работы с различными операционными системами и устройствами * Гибкая настройка под нужды пользователя для работы с различными операционными системами и устройствами
* Распознается системами DPI-анализа и поэтому подвержен блокировке * Распознается системами DPI-анализа и поэтому подвержен блокировке
@ -4610,13 +4695,13 @@ It employs its unique security protocol, leveraging the strength of SSL/TLS for
<location filename="../containers/containers_defs.cpp" line="159"/> <location filename="../containers/containers_defs.cpp" line="159"/>
<source>Shadowsocks, inspired by the SOCKS5 protocol, safeguards the connection using the AEAD cipher. Although Shadowsocks is designed to be discreet and challenging to identify, it isn&apos;t identical to a standard HTTPS connection.However, certain traffic analysis systems might still detect a Shadowsocks connection. Due to limited support in Amnezia, it&apos;s recommended to use AmneziaWG protocol. <source>Shadowsocks, inspired by the SOCKS5 protocol, safeguards the connection using the AEAD cipher. Although Shadowsocks is designed to be discreet and challenging to identify, it isn&apos;t identical to a standard HTTPS connection.However, certain traffic analysis systems might still detect a Shadowsocks connection. Due to limited support in Amnezia, it&apos;s recommended to use AmneziaWG protocol.
* Available in the DefaultVPN only on desktop platforms * Available in the AmneziaVPN only on desktop platforms
* Configurable encryption protocol * Configurable encryption protocol
* Detectable by some DPI systems * Detectable by some DPI systems
* Works over TCP network protocol.</source> * Works over TCP network protocol.</source>
<translation>Shadowsocks создан на основе протокола SOCKS5, защищает соединение с помощью шифра AEAD. Несмотря на то, что протокол Shadowsocks разработан таким образом, чтобы быть незаметным и сложным для идентификации, он не идентичен стандартному HTTPS-соединению, поэтому некоторые системы анализа трафика всё же могут обнаружить соединение Shadowsocks. В связи с ограниченной поддержкой в Amnezia рекомендуется использовать протокол AmneziaWG. <translation>Shadowsocks создан на основе протокола SOCKS5, защищает соединение с помощью шифра AEAD. Несмотря на то, что протокол Shadowsocks разработан таким образом, чтобы быть незаметным и сложным для идентификации, он не идентичен стандартному HTTPS-соединению, поэтому некоторые системы анализа трафика всё же могут обнаружить соединение Shadowsocks. В связи с ограниченной поддержкой в Amnezia рекомендуется использовать протокол AmneziaWG.
* Доступен в DefaultVPN только для ПК и ноутбуков * Доступен в AmneziaVPN только для ПК и ноутбуков
* Настраиваемый протокол шифрования * Настраиваемый протокол шифрования
* Распознается некоторыми системами DPI-анализа * Распознается некоторыми системами DPI-анализа
* Работает по сетевому протоколу TCP.</translation> * Работает по сетевому протоколу TCP.</translation>
@ -4663,7 +4748,7 @@ Immediately after receiving the first data packet, Cloak authenticates the incom
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 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 DefaultVPN across all platforms * Available in the AmneziaVPN across all platforms
* High power consumption on mobile devices * High power consumption on mobile devices
* Flexible settings * Flexible settings
* Not recognised by DPI analysis systems * Not recognised by DPI analysis systems
@ -4681,7 +4766,7 @@ Cloak может изменять метаданные пакетов. Он по
Если в вашем регионе экстремальный уровень цензуры в Интернете, мы советуем вам с первого подключения использовать только OpenVPN over Cloak Если в вашем регионе экстремальный уровень цензуры в Интернете, мы советуем вам с первого подключения использовать только OpenVPN over Cloak
* Доступен в DefaultVPN для всех платформ * Доступен в AmneziaVPN для всех платформ
* Высокое энергопотребление на мобильных устройствах * Высокое энергопотребление на мобильных устройствах
* Гибкие настройки * Гибкие настройки
* Не распознается системами DPI-анализа * Не распознается системами DPI-анализа
@ -4693,7 +4778,7 @@ Cloak может изменять метаданные пакетов. Он по
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. 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. 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 DefaultVPN across all platforms * Available in the AmneziaVPN across all platforms
* Low power consumption * Low power consumption
* Minimum number of settings * Minimum number of settings
* Easily recognised by DPI analysis systems, susceptible to blocking * Easily recognised by DPI analysis systems, susceptible to blocking
@ -4702,7 +4787,7 @@ WireGuard is very susceptible to blocking due to its distinct packet signatures.
Обеспечивает стабильное VPN-соединение, высокую производительность на всех устройствах. Использует жестко заданные настройки шифрования. WireGuard по сравнению с OpenVPN имеет меньшую задержку и лучшую пропускную способность при передаче данных. Обеспечивает стабильное VPN-соединение, высокую производительность на всех устройствах. Использует жестко заданные настройки шифрования. WireGuard по сравнению с OpenVPN имеет меньшую задержку и лучшую пропускную способность при передаче данных.
WireGuard очень восприимчив к блокированию из-за особенностей сигнатур пакетов. В отличие от некоторых других VPN-протоколов, использующих методы обфускации, последовательные сигнатуры пакетов WireGuard легче выявляются и, соответственно, блокируются современными системами глубокой проверки пакетов (DPI) и другими средствами сетевого мониторинга. WireGuard очень восприимчив к блокированию из-за особенностей сигнатур пакетов. В отличие от некоторых других VPN-протоколов, использующих методы обфускации, последовательные сигнатуры пакетов WireGuard легче выявляются и, соответственно, блокируются современными системами глубокой проверки пакетов (DPI) и другими средствами сетевого мониторинга.
* Доступен в DefaultVPN для всех платформ * Доступен в AmneziaVPN для всех платформ
* Низкое энергопотребление * Низкое энергопотребление
* Минимальное количество настроек * Минимальное количество настроек
* Легко распознается системами DPI-анализа, подвержен блокировке * Легко распознается системами DPI-анализа, подвержен блокировке
@ -4713,7 +4798,7 @@ WireGuard очень восприимчив к блокированию из-з
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. 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. 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 DefaultVPN across all platforms * Available in the AmneziaVPN across all platforms
* Low power consumption * Low power consumption
* Minimum number of settings * Minimum number of settings
* Not recognised by DPI analysis systems, resistant to blocking * Not recognised by DPI analysis systems, resistant to blocking
@ -4722,7 +4807,7 @@ This means that AmneziaWG keeps the fast performance of the original while addin
Хотя WireGuard известен своей эффективностью, у него были проблемы с обнаружением из-за характерных сигнатур пакетов. AmneziaWG решает эту проблему за счет использования более совершенных методов обфускации, благодаря чему его трафик сливается с обычным интернет-трафиком. Хотя WireGuard известен своей эффективностью, у него были проблемы с обнаружением из-за характерных сигнатур пакетов. AmneziaWG решает эту проблему за счет использования более совершенных методов обфускации, благодаря чему его трафик сливается с обычным интернет-трафиком.
Таким образом, AmneziaWG сохраняет высокую производительность оригинального протокола, добавляя при этом дополнительный уровень скрытности, что делает его отличным выбором для тех, кому нужно быстрое и незаметное VPN-соединение. Таким образом, AmneziaWG сохраняет высокую производительность оригинального протокола, добавляя при этом дополнительный уровень скрытности, что делает его отличным выбором для тех, кому нужно быстрое и незаметное VPN-соединение.
* Доступен в DefaultVPN на всех платформах * Доступен в AmneziaVPN на всех платформах
* Низкое энергопотребление на мобильных устройствах * Низкое энергопотребление на мобильных устройствах
* Минимальное количество настроек * Минимальное количество настроек
* Не распознается системами DPI-анализа, устойчив к блокировке * Не распознается системами DPI-анализа, устойчив к блокировке
@ -5010,8 +5095,8 @@ This means that AmneziaWG keeps the fast performance of the original while addin
<message> <message>
<location filename="../ui/qml/Components/ShareConnectionDrawer.qml" line="30"/> <location filename="../ui/qml/Components/ShareConnectionDrawer.qml" line="30"/>
<location filename="../ui/qml/Components/ShareConnectionDrawer.qml" line="37"/> <location filename="../ui/qml/Components/ShareConnectionDrawer.qml" line="37"/>
<source>Save DefaultVPN config</source> <source>Save AmneziaVPN config</source>
<translation>Сохранить конфигурацию DefaultVPN</translation> <translation>Сохранить конфигурацию AmneziaVPN</translation>
</message> </message>
<message> <message>
<location filename="../ui/qml/Components/ShareConnectionDrawer.qml" line="25"/> <location filename="../ui/qml/Components/ShareConnectionDrawer.qml" line="25"/>
@ -5053,37 +5138,37 @@ This means that AmneziaWG keeps the fast performance of the original while addin
<translation>Имя хоста не похоже на IP-адрес или доменное имя</translation> <translation>Имя хоста не похоже на IP-адрес или доменное имя</translation>
</message> </message>
<message> <message>
<location filename="../ui/controllers/sitesController.cpp" line="67"/> <location filename="../ui/controllers/sitesController.cpp" line="66"/>
<source>New site added: %1</source> <source>New site added: %1</source>
<translation>Добавлен новый сайт: %1</translation> <translation>Добавлен новый сайт: %1</translation>
</message> </message>
<message> <message>
<location filename="../ui/controllers/sitesController.cpp" line="80"/> <location filename="../ui/controllers/sitesController.cpp" line="78"/>
<source>Site removed: %1</source> <source>Site removed: %1</source>
<translation>Сайт удален: %1</translation> <translation>Сайт удален: %1</translation>
</message> </message>
<message> <message>
<location filename="../ui/controllers/sitesController.cpp" line="87"/> <location filename="../ui/controllers/sitesController.cpp" line="85"/>
<source>Can&apos;t open file: %1</source> <source>Can&apos;t open file: %1</source>
<translation>Невозможно открыть файл: %1</translation> <translation>Невозможно открыть файл: %1</translation>
</message> </message>
<message> <message>
<location filename="../ui/controllers/sitesController.cpp" line="93"/> <location filename="../ui/controllers/sitesController.cpp" line="91"/>
<source>Failed to parse JSON data from file: %1</source> <source>Failed to parse JSON data from file: %1</source>
<translation>Не удалось разобрать JSON-данные из файла: %1</translation> <translation>Не удалось разобрать JSON-данные из файла: %1</translation>
</message> </message>
<message> <message>
<location filename="../ui/controllers/sitesController.cpp" line="98"/> <location filename="../ui/controllers/sitesController.cpp" line="96"/>
<source>The JSON data is not an array in file: %1</source> <source>The JSON data is not an array in file: %1</source>
<translation>JSON-данные не являются массивом в файле: %1</translation> <translation>JSON-данные не являются массивом в файле: %1</translation>
</message> </message>
<message> <message>
<location filename="../ui/controllers/sitesController.cpp" line="129"/> <location filename="../ui/controllers/sitesController.cpp" line="126"/>
<source>Import completed</source> <source>Import completed</source>
<translation>Импорт завершен</translation> <translation>Импорт завершен</translation>
</message> </message>
<message> <message>
<location filename="../ui/controllers/sitesController.cpp" line="148"/> <location filename="../ui/controllers/sitesController.cpp" line="145"/>
<source>Export completed</source> <source>Export completed</source>
<translation>Экспорт завершен</translation> <translation>Экспорт завершен</translation>
</message> </message>

View file

@ -18,6 +18,7 @@ namespace PageLoader
PageAbout, PageAbout,
PageSettingsServersList, PageSettingsServersList,
PageCountrySelector,
PageSettings, PageSettings,
PageSettingsServerData, PageSettingsServerData,
PageSettingsServerInfo, PageSettingsServerInfo,

View file

@ -0,0 +1,109 @@
pragma ComponentBehavior: Bound
import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
import Qt5Compat.GraphicalEffects
import Config 1.0
import "../Controls"
import "../Controls/TextTypes"
Popup {
id: root
property string title: ""
property string description: ""
property string confirmButtonText: qsTr("Confirm")
property string cancelButtonText: qsTr("Cancel")
property var onConfirm
property var onCancel
modal: true
closePolicy: Popup.CloseOnEscape | Popup.CloseOnPressOutside
anchors.centerIn: parent
width: parent.width - 30
height: 310
padding: 24
background: Rectangle {
color: Style.color.white
radius: 20
border.width: 1
border.color: Style.color.gray2
}
contentItem: ColumnLayout {
spacing: 40
width: parent.width
ColumnLayout {
Layout.fillWidth: true
spacing: 12
Header3TextType {
Layout.fillWidth: true
text: root.title
horizontalAlignment: Text.AlignLeft
}
MediumTextType {
Layout.fillWidth: true
text: root.description
visible: description !== ""
horizontalAlignment: Text.AlignLeft
wrapMode: Text.WordWrap
}
}
ColumnLayout {
Layout.fillWidth: true
spacing: 8
BlueButtonNoBorder {
Layout.fillWidth: true
text: root.cancelButtonText
onClicked: {
if (root.onCancel) {
root.onCancel()
}
root.close()
}
}
WhiteButtonWithBorder {
Layout.fillWidth: true
text: root.confirmButtonText
onClicked: {
if (root.onConfirm) {
root.onConfirm()
}
root.close()
}
}
}
}
Overlay.modal: Item {
anchors.fill: parent
ShaderEffectSource {
id: blurSource
anchors.fill: parent
sourceItem: root.parent
}
GaussianBlur {
anchors.fill: parent
source: blurSource
radius: 4
}
Rectangle {
anchors.fill: parent
color: Style.color.transparentWhite
}
}
}

View file

@ -24,6 +24,8 @@ QtObject {
readonly property color white: '#FFFFFF' readonly property color white: '#FFFFFF'
readonly property color transparentBlack: Qt.rgba(14/255, 14/255, 17/255, 0.8) readonly property color transparentBlack: Qt.rgba(14/255, 14/255, 17/255, 0.8)
readonly property color fivePercentBlack: Qt.rgba(0, 0, 0, 0.05)
readonly property color transparentWhite: Qt.rgba(1, 1, 1, 0.75)
} }
readonly property string font: "Vela Sans GX" readonly property string font: "Vela Sans GX"

View file

@ -28,7 +28,7 @@ Popup {
Overlay.modal: Rectangle { Overlay.modal: Rectangle {
visible: root.closeButtonVisible visible: root.closeButtonVisible
color: Qt.rgba(14/255, 14/255, 17/255, 0.8) color: Style.color.transparentBlack
} }
background: Rectangle { background: Rectangle {

View file

@ -0,0 +1,122 @@
import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
import Config 1.0
import "TextTypes"
Switch {
id: root
property string checkedIndicatorColor: Style.color.white
property string defaultIndicatorColor: Style.color.transparent
property string checkedDisabledIndicatorColor: Style.color.white
property string borderFocusedColor: Style.color.gray3
property int borderFocusedWidth: 1
property string checkedIndicatorBorderColor: Style.color.gray3
property string defaultIndicatorBorderColor: Style.color.gray3
property string checkedDisabledIndicatorBorderColor: Style.color.gray3
property string checkedInnerCircleColor: Style.color.accent1
property string defaultInnerCircleColor: Style.color.black
property string checkedDisabledInnerCircleColor: Style.color.accent1
property string defaultDisabledInnerCircleColor: Style.color.black
property string hoveredIndicatorBackgroundColor: Style.color.fivePercentBlack
property string defaultIndicatorBackgroundColor: Style.color.transparent
indicator: Rectangle {
id: switcher
anchors.right: parent.right
anchors.verticalCenter: parent.verticalCenter
implicitWidth: 52
implicitHeight: 32
radius: 16
color: root.checked ? (root.enabled ? root.checkedIndicatorColor : root.checkedDisabledIndicatorColor)
: root.defaultIndicatorColor
border.color: root.activeFocus ? root.borderFocusedColor : (root.checked ? (root.enabled ? root.checkedIndicatorBorderColor : root.checkedDisabledIndicatorBorderColor)
: root.defaultIndicatorBorderColor)
Behavior on color {
PropertyAnimation { duration: 200 }
}
Behavior on border.color {
PropertyAnimation { duration: 200 }
}
Rectangle {
id: innerCircle
anchors.verticalCenter: parent.verticalCenter
x: root.checked ? parent.width - width - 4 : 8
width: root.checked ? 24 : 16
height: root.checked ? 24 : 16
radius: 23
color: root.checked ? (root.enabled ? root.checkedInnerCircleColor : root.checkedDisabledInnerCircleColor)
: (root.enabled ? root.defaultInnerCircleColor : root.defaultDisabledInnerCircleColor)
Behavior on x {
PropertyAnimation { duration: 200 }
}
}
Rectangle {
anchors.centerIn: innerCircle
width: 40
height: 40
radius: 23
color: root.hovered ? root.hoveredIndicatorBackgroundColor : root.defaultIndicatorBackgroundColor
Behavior on color {
PropertyAnimation { duration: 200 }
}
}
}
// contentItem: ColumnLayout {
// id: content
// anchors.verticalCenter: parent.verticalCenter
// anchors.left: parent.left
// ListItemTitleType {
// Layout.fillWidth: true
// rightPadding: indicator.width
// text: root.text
// color: root.enabled ? root.textColor : root.textDisabledColor
// }
// CaptionTextType {
// id: description
// Layout.fillWidth: true
// rightPadding: indicator.width
// color: root.enabled ? root.descriptionTextColor : root.descriptionTextDisabledColor
// visible: text !== ""
// }
// }
MouseArea {
anchors.fill: parent
cursorShape: Qt.PointingHandCursor
enabled: false
}
function handleSwitch(event) {
if (!event.isAutoRepeat) {
root.checked = !root.checked
root.checkedChanged()
}
event.accepted = true
}
}

View file

@ -0,0 +1,145 @@
import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
import PageEnum 1.0
import Config 1.0
import "../Components"
import "../Controls"
import "../Controls/TextTypes"
Page {
id: root
ColumnLayout {
anchors.fill: parent
RowLayout {
Layout.leftMargin: 8
Layout.rightMargin: 8
Layout.topMargin: 8
WhiteButtonNoBorder {
id: backButton
imageSource: "qrc:/images/controls/arrow-left.svg"
onClicked: PageController.closePage()
}
}
Header1TextType {
Layout.topMargin: 8
Layout.leftMargin: 16
Layout.rightMargin: 16
Layout.fillWidth: true
text: qsTr("Amnezia Premium servers")
horizontalAlignment: Qt.AlignLeft
verticalAlignment: Qt.AlignVCenter
}
ButtonGroup {
id: countriesRadioButtonGroup
}
ListView {
id: countriesListView
Layout.topMargin: 16
Layout.fillHeight: true
Layout.fillWidth: true
model: ApiCountryModel
currentIndex: ApiCountryModel.currentIndex
ScrollBar.vertical: ScrollBar {}
delegate: Item {
id: menuContentDelegate
required property string countryName
required property string countryCode
required property string countryImageCode
required property int index
implicitWidth: countriesListView.width
implicitHeight: countryItem.implicitHeight
RadioButton {
id: countryItem
anchors.fill: parent
anchors.rightMargin: 16
anchors.leftMargin: 16
ButtonGroup.group: countriesRadioButtonGroup
checked: index === countriesListView.currentIndex
indicator: Item { }
contentItem: Item {
id: contentContainer
anchors.left: parent.left
anchors.right: parent.right
implicitHeight: content.implicitHeight
Rectangle {
anchors.fill: parent
radius: 8
color: countryItem.checked ? Style.color.gray1 : Style.color.transparent
}
RowLayout {
id: content
anchors.fill: parent
Header3TextType {
Layout.fillWidth: true
Layout.leftMargin: 8
Layout.topMargin: 19
Layout.bottomMargin: 19
text: countryName
color: countryItem.hovered ? Style.color.gray9 : Style.color.black
}
Image {
Layout.rightMargin: 8
width: 32
height: 24
source: "qrc:/countriesFlags/images/flagKit/" + countryImageCode + ".svg"
}
}
}
onClicked: function() {
if (ConnectionController.isConnected) {
PageController.showNotificationMessage(qsTr("Unable change server location while there is an active connection"))
return
}
PageController.showBusyIndicator(true)
var prevIndex = ApiCountryModel.currentIndex
ApiCountryModel.currentIndex = index
if (!ApiConfigsController.updateServiceFromGateway(ServersModel.defaultIndex, countryCode, countryName)) {
ApiCountryModel.currentIndex = prevIndex
}
PageController.showBusyIndicator(false)
PageController.closePage()
}
MouseArea {
anchors.fill: countryItem
cursorShape: Qt.PointingHandCursor
enabled: false
}
}
}
}
}
}

View file

@ -40,8 +40,10 @@ Page {
} }
WhiteButtonNoBorder { WhiteButtonNoBorder {
imageSource: "qrc:/images/controls/warning-info.svg" Layout.rightMargin: -8
onClicked: PageController.goToPage(PageEnum.PageAbout) Layout.topMargin: -16
imageSource: "qrc:/images/controls/settings.svg"
onClicked: PageController.goToPage(PageEnum.PageSettings)
} }
} }
@ -58,6 +60,7 @@ Page {
RowLayout { RowLayout {
DropDownType { DropDownType {
id: defaultServerDropDown
Layout.fillWidth: true Layout.fillWidth: true
text: ServersModel.defaultServerName text: ServersModel.defaultServerName
@ -76,6 +79,27 @@ Page {
} }
} }
DropDownType {
id: countryDropDown
Layout.fillWidth: false
Layout.topMargin: 10
Layout.preferredWidth: defaultServerDropDown.width
visible: ServersModel.isDefaultServerFromApi &&
ServersModel.defaultServerDescriptionCollapsed !== "" &&
ServersModel.defaultServerDescriptionCollapsed !== ServersModel.defaultServerName
text: ServersModel.defaultServerDescriptionCollapsed
onClicked: function() {
if (ConnectionController.isConnected) {
PageController.showNotificationMessage(qsTr("Unable change server location while there is an active connection"))
return
}
PageController.goToPage(PageEnum.PageCountrySelector)
}
}
Button { Button {
id: connectButton id: connectButton

View file

@ -0,0 +1,156 @@
import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
import Qt5Compat.GraphicalEffects
import PageEnum 1.0
import Config 1.0
import "../Components"
import "../Controls"
import "../Controls/TextTypes"
Page {
id: root
ColumnLayout {
anchors.fill: parent
spacing: 0
anchors.leftMargin: 8
anchors.rightMargin: 8
RowLayout {
Layout.topMargin: 8
WhiteButtonNoBorder {
id: backButton
imageSource: "qrc:/images/controls/arrow-left.svg"
onClicked: PageController.closePage()
}
}
Header1TextType {
Layout.topMargin: 8
Layout.leftMargin: 8
Layout.rightMargin: 8
Layout.fillWidth: true
text: qsTr("Settings")
horizontalAlignment: Qt.AlignLeft
verticalAlignment: Qt.AlignVCenter
}
ColumnLayout {
Layout.fillWidth: true
Layout.topMargin: 24
Layout.leftMargin: 8
Layout.rightMargin: 8
spacing: 2
RadioButton {
id: loggingRadioButton
Layout.fillWidth: true
background: Rectangle {
anchors.fill: parent
radius: 8
color: loggingRadioButton.hovered ? Style.color.gray1 : Style.color.transparent
}
indicator: Item { }
contentItem: RowLayout {
id: content
anchors.left: parent.left
anchors.right: parent.right
implicitHeight: content.implicitHeight
Header3TextType {
Layout.fillWidth: true
Layout.leftMargin: 8
Layout.topMargin: 19
Layout.bottomMargin: 19
text: qsTr("Logging")
color: loggingRadioButton.hovered ? Style.color.gray9 : Style.color.black
}
Image {
Layout.rightMargin: 8
source: "qrc:/images/controls/chevron-right.svg"
layer {
enabled: true
effect: ColorOverlay {
color: Style.color.black
}
}
}
}
onClicked: PageController.goToPage(PageEnum.PageSettingsLogging)
MouseArea {
anchors.fill: loggingRadioButton
cursorShape: Qt.PointingHandCursor
enabled: false
}
}
RadioButton {
id: aboutRadioButton
Layout.fillWidth: true
background: Rectangle {
anchors.fill: parent
radius: 8
color: aboutRadioButton.hovered ? Style.color.gray1 : Style.color.transparent
}
indicator: Item { }
contentItem: RowLayout {
id: content2
anchors.left: parent.left
anchors.right: parent.right
implicitHeight: content.implicitHeight
Header3TextType {
Layout.fillWidth: true
Layout.leftMargin: 8
Layout.topMargin: 19
Layout.bottomMargin: 19
text: qsTr("About")
color: aboutRadioButton.hovered ? Style.color.gray9 : Style.color.black
}
Image {
Layout.rightMargin: 8
source: "qrc:/images/controls/chevron-right.svg"
layer {
enabled: true
effect: ColorOverlay {
color: Style.color.black
}
}
}
}
onClicked: PageController.goToPage(PageEnum.PageAbout)
MouseArea {
anchors.fill: aboutRadioButton
cursorShape: Qt.PointingHandCursor
enabled: false
}
}
}
Item {
Layout.fillHeight: true
}
}
}

View file

@ -0,0 +1,179 @@
pragma ComponentBehavior: Bound
import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
import PageEnum 1.0
import Config 1.0
import "../Components"
import "../Controls"
import "../Controls/TextTypes"
Page {
id: root
Component.onCompleted: checkSubscriptionStatus()
// This timer is used to delay the opening of the expired subscription dialog
// to avoid conflicts of blur effect with transition to the page animation
Timer {
id: subscriptionDialogTimer
interval: 280
repeat: false
onTriggered: expiredSubscriptionDialog.open()
}
Connections {
target: ApiAccountInfoModel
function onModelReset() {
checkSubscriptionStatus()
}
}
function checkSubscriptionStatus() {
const status = ApiAccountInfoModel.data("subscriptionStatus")
if (status === "expired") {
subscriptionDialogTimer.start()
}
}
ColumnLayout {
anchors.fill: parent
spacing: 0
anchors.leftMargin: 8
anchors.rightMargin: 8
RowLayout {
Layout.topMargin: 8
WhiteButtonNoBorder {
id: backButton
imageSource: "qrc:/images/controls/arrow-left.svg"
onClicked: PageController.closePage()
}
Item {
Layout.fillWidth: true
}
}
ColumnLayout {
Layout.fillWidth: true
Layout.leftMargin: 8
Layout.rightMargin: 8
Layout.topMargin: 8
spacing: 0
Header1TextType {
id: header
Layout.fillWidth: true
text: qsTr("Amnezia Premium settings")
horizontalAlignment: Qt.AlignLeft
verticalAlignment: Qt.AlignVCenter
}
XSmallTextType {
Layout.topMargin: 24
Layout.fillWidth: true
text: qsTr("Subscription expires on")
color: Style.color.black
}
MediumTextType {
Layout.topMargin: 6
Layout.fillWidth: true
text: ApiAccountInfoModel.data("endDate")
color: Style.color.black
}
WhiteButtonWithBorder {
Layout.topMargin: 24
Layout.fillWidth: true
text: qsTr("Reset API configuration")
onClicked: {
if (ServersModel.isDefaultServerCurrentlyProcessed() && ConnectionController.isConnected) {
PageController.showNotificationMessage(qsTr("Cannot reload API config during active connection"))
} else {
resetConfirmationDialog.open()
}
}
}
WhiteButtonWithBorder {
Layout.topMargin: 56
Layout.fillWidth: true
text: qsTr("Delete")
defaultTextColor: Style.color.error
hoveredTextColor: Style.color.error
pressedTextColor: Style.color.error
onClicked: {
if (ServersModel.isDefaultServerCurrentlyProcessed() && ConnectionController.isConnected) {
PageController.showNotificationMessage(qsTr("Cannot remove server during active connection"))
} else {
deleteConfirmationDialog.open()
}
}
}
}
Item {
Layout.fillHeight: true
Layout.fillWidth: true
}
}
ConfirmationDialog {
id: resetConfirmationDialog
title: qsTr("Reset API configuration?")
description: qsTr("This will reload the API configuration from the server")
confirmButtonText: qsTr("Reset")
cancelButtonText: qsTr("Cancel")
onConfirm: function() {
PageController.showBusyIndicator(true)
ApiConfigsController.updateServiceFromGateway(ServersModel.processedIndex, "", "", true)
PageController.showBusyIndicator(false)
}
}
ConfirmationDialog {
id: deleteConfirmationDialog
title: qsTr("Are you sure you want to remove the server from the app?")
description: qsTr("You won't be able to connect to it")
confirmButtonText: qsTr("Yes, delete anyway")
cancelButtonText: qsTr("No, keep it")
onConfirm: function() {
PageController.showBusyIndicator(true)
if (ApiConfigsController.deactivateDevice()) {
InstallController.removeProcessedServer()
PageController.closePage()
}
PageController.showBusyIndicator(false)
}
}
ConfirmationDialog {
id: expiredSubscriptionDialog
title: qsTr("Amnezia Premium subscription has expired")
description: qsTr("Order a new subscription")
confirmButtonText: qsTr("Go to order")
cancelButtonText: qsTr("Close")
onConfirm: function() {
Qt.openUrlExternally("https://storage.googleapis.com/kldscp/vpnpay.io/ru/amnezia-premium")
}
}
}

View file

@ -0,0 +1,120 @@
import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
import QtCore
import PageEnum 1.0
import Config 1.0
import "../Components"
import "../Controls"
import "../Controls/TextTypes"
Page {
id: root
ColumnLayout {
anchors.fill: parent
anchors.leftMargin: 8
anchors.rightMargin: 8
anchors.topMargin: 8
RowLayout {
Layout.fillWidth: true
WhiteButtonNoBorder {
id: backButton
imageSource: "qrc:/images/controls/arrow-left.svg"
onClicked: PageController.closePage()
}
}
ColumnLayout {
Layout.fillWidth: true
Layout.leftMargin: 8
Layout.rightMargin: 8
Layout.topMargin: 8
RowLayout {
Layout.fillWidth: true
Header1TextType {
Layout.fillWidth: true
text: qsTr("Logging")
horizontalAlignment: Qt.AlignLeft
verticalAlignment: Qt.AlignVCenter
}
SwitcherType {
id: switcher
Layout.fillWidth: true
Layout.topMargin: 4
Layout.bottomMargin: 4
Layout.rightMargin: 4
checked: SettingsController.isLoggingEnabled
onCheckedChanged: {
if (checked !== SettingsController.isLoggingEnabled) {
SettingsController.isLoggingEnabled = checked
}
}
}
}
MediumTextType {
Layout.fillWidth: true
Layout.topMargin: 16
text: qsTr("In case of application failures, enable logging to find the problem")
horizontalAlignment: Qt.AlignLeft
verticalAlignment: Qt.AlignVCenter
}
WhiteButtonWithBorder {
Layout.fillWidth: true
Layout.topMargin: 40
text: qsTr("Save logs to file")
onClicked: function() {
var fileName = ""
if (DeviceInfo.isMobile()) {
fileName = "DefaultVPN.log"
} else {
fileName = SystemController.getFileName(qsTr("Save"),
qsTr("Logs files (*.log)"),
StandardPaths.standardLocations(StandardPaths.DocumentsLocation) + "/DefaultVPN",
true,
".log")
}
if (fileName !== "") {
PageController.showBusyIndicator(true)
SettingsController.exportLogsFile(fileName)
PageController.showBusyIndicator(false)
PageController.showNotificationMessage(qsTr("Logs file saved"))
}
}
}
WhiteButtonWithBorder {
Layout.fillWidth: true
Layout.topMargin: 16
text: qsTr("Open logs")
onClicked: function() {
SettingsController.openLogsFolder()
}
}
Item {
Layout.fillHeight: true
}
}
}
}

View file

@ -87,17 +87,30 @@ Page {
Layout.topMargin: 24 Layout.topMargin: 24
Layout.fillWidth: true Layout.fillWidth: true
text: qsTr("Remove server") text: qsTr("Delete server")
defaultTextColor: Style.color.error
hoveredTextColor: Style.color.error
pressedTextColor: Style.color.error
onClicked: function() { onClicked: deleteConfirmationDialog.open()
PageController.showBusyIndicator(true)
InstallController.removeProcessedServer()
PageController.showBusyIndicator(false)
}
} }
Item { Item {
Layout.fillHeight: true Layout.fillHeight: true
} }
} }
ConfirmationDialog {
id: deleteConfirmationDialog
title: qsTr("Are you sure you want to remove the server from the app?")
description: qsTr("You won't be able to connect to it")
confirmButtonText: qsTr("Yes, delete anyway")
cancelButtonText: qsTr("No, keep it")
onConfirm: function() {
PageController.showBusyIndicator(true)
InstallController.removeProcessedServer()
PageController.showBusyIndicator(false)
}
}
} }

View file

@ -143,11 +143,23 @@ Page {
onClicked: function() { onClicked: function() {
ServersModel.processedIndex = index ServersModel.processedIndex = index
if (ServersModel.getProcessedServerData("isServerFromGatewayApi")) {
PageController.showBusyIndicator(true)
let result = ApiSettingsController.getAccountInfo(false)
PageController.showBusyIndicator(false)
if (!result) {
return
}
PageController.goToPage(PageEnum.PageSettingsApiServerInfo)
} else {
PageController.goToPage(PageEnum.PageSettingsServerInfo) PageController.goToPage(PageEnum.PageSettingsServerInfo)
} }
} }
} }
} }
}
onClicked: function() { onClicked: function() {
ServersModel.defaultIndex = index ServersModel.defaultIndex = index