diff --git a/Furious/Externals/GenTranslation.py b/Furious/Externals/GenTranslation.py index 3f32365..c7405e7 100644 --- a/Furious/Externals/GenTranslation.py +++ b/Furious/Externals/GenTranslation.py @@ -7,161 +7,216 @@ TRANSLATION = { "Furious.Widget.ServerTableView", "Furious.Widget.SubscriptionTableView", "Furious.Window.SubscriptionPage", - "Furious.Window.SubscriptionWindow", + "Furious.Window.SubscriptionWindow" ], "RU": "Удалить", "ZH": "删除", - "isReviewed": "True", + "isReviewed": "True" }, "Delete these items?": { - "source": ["Furious.Qt.QtWidgets"], + "source": [ + "Furious.Qt.QtWidgets" + ], "RU": "Удалить эти элементы?", "ZH": "删除这些项目?", - "isReviewed": "True", + "isReviewed": "True" }, "Delete this item?": { - "source": ["Furious.Qt.QtWidgets"], + "source": [ + "Furious.Qt.QtWidgets" + ], "RU": "Удалить этот элемент?", "ZH": "删除此项目?", - "isReviewed": "True", + "isReviewed": "True" }, "New changes will take effect next time": { - "source": ["Furious.Qt.QtWidgets"], + "source": [ + "Furious.Qt.QtWidgets" + ], "RU": "Новые изменения вступят в силу при следующем подключении", "ZH": "新的更改将于下次生效", - "isReviewed": "True", + "isReviewed": "True" }, "Reconnect now?": { - "source": ["Furious.Qt.QtWidgets"], + "source": [ + "Furious.Qt.QtWidgets" + ], "RU": "Переподключиться сейчас?", "ZH": "现在重新连接?", - "isReviewed": "True", + "isReviewed": "True" }, "Unrecognized Configuration. Please modify it in the editor": { - "source": ["Furious.Qt.QtWidgets"], + "source": [ + "Furious.Qt.QtWidgets" + ], "RU": "Нераспознанная конфигурация. Пожалуйста, измените его в редакторе", "ZH": "无法识别的配置。请在编辑器中修改", - "isReviewed": "True", + "isReviewed": "True" }, "New version available": { - "source": ["Furious.Service.UpdateManager"], + "source": [ + "Furious.Service.UpdateManager" + ], "RU": "Доступна новая версия", "ZH": "新版本可用", - "isReviewed": "True", + "isReviewed": "True" }, "Check for updates failed": { - "source": ["Furious.Service.UpdateManager"], + "source": [ + "Furious.Service.UpdateManager" + ], "RU": "Не удалось проверить наличие обновлений", "ZH": "检查更新失败", - "isReviewed": "True", + "isReviewed": "True" }, "Go to download page?": { - "source": ["Furious.Service.UpdateManager"], + "source": [ + "Furious.Service.UpdateManager" + ], "RU": "Перейти на страницу загрузки?", "ZH": "前往下载页面?", - "isReviewed": "True", + "isReviewed": "True" }, "Furious is already the latest version": { - "source": ["Furious.Service.UpdateManager"], + "source": [ + "Furious.Service.UpdateManager" + ], "RU": "Используется последняя версия Furious", "ZH": "Furious已是最新版本", - "isReviewed": "True", + "isReviewed": "True" }, "Invalid data": { - "source": ["Furious.Actions.Import", "Furious.Window.SubscriptionPage"], + "source": [ + "Furious.Actions.Import", + "Furious.Window.SubscriptionPage" + ], "RU": "Неверные данные", "ZH": "无效的数据", - "isReviewed": "True", + "isReviewed": "True" }, "Invalid data. The content of the clipboard is:": { - "source": ["Furious.Actions.Import"], + "source": [ + "Furious.Actions.Import" + ], "RU": "Неверные данные. Содержимое буфера обмена:", "ZH": "无效的数据。剪贴板内容为", - "isReviewed": "True", + "isReviewed": "True" }, "Import": { - "source": ["Furious.Actions.Import", "Furious.Backends.Xray.AssetListWidget"], + "source": [ + "Furious.Actions.Import", + "Furious.Backends.Xray.AssetListWidget" + ], "RU": "Импорт", "ZH": "导入", - "isReviewed": "True", + "isReviewed": "True" }, "Import share link success": { - "source": ["Furious.Actions.Import"], + "source": [ + "Furious.Actions.Import" + ], "RU": "Успешный импорт общей ссылки", "ZH": "导入分享链接成功", - "isReviewed": "True", + "isReviewed": "True" }, "Imported to row": { - "source": ["Furious.Actions.Import"], + "source": [ + "Furious.Actions.Import" + ], "RU": "Импорт в строку", "ZH": "导入至行", - "isReviewed": "True", + "isReviewed": "True" }, "Import success": { - "source": ["Furious.Actions.Import"], + "source": [ + "Furious.Actions.Import" + ], "RU": "Успешный импорт", "ZH": "导入成功", - "isReviewed": "True", + "isReviewed": "True" }, "Import From File...": { - "source": ["Furious.Actions.Import", "Furious.Backends.Xray.AssetWindow"], + "source": [ + "Furious.Actions.Import", + "Furious.Backends.Xray.AssetWindow" + ], "RU": "Импорт из файла...", "ZH": "从文件导入...", - "isReviewed": "True", + "isReviewed": "True" }, "Import File": { - "source": ["Furious.Actions.Import", "Furious.Backends.Xray.AssetWindow"], + "source": [ + "Furious.Actions.Import", + "Furious.Backends.Xray.AssetWindow" + ], "RU": "Импорт файла", "ZH": "导入文件", - "isReviewed": "True", + "isReviewed": "True" }, "Text files (*.json);;All files (*)": { - "source": ["Furious.Actions.Import", "Furious.Window.TextEditorWindow"], + "source": [ + "Furious.Actions.Import", + "Furious.Window.TextEditorWindow" + ], "RU": "Текст файлов (*.json);;Остальные файлы (*)", "ZH": "文本文件 (*.json);;所有文件 (*)", - "isReviewed": "True", + "isReviewed": "True" }, "Error opening file": { - "source": ["Furious.Actions.Import"], + "source": [ + "Furious.Actions.Import" + ], "RU": "Ошибка открытия файла", "ZH": "打开文件出错", - "isReviewed": "True", + "isReviewed": "True" }, "Invalid configuration file": { - "source": ["Furious.Actions.Import"], + "source": [ + "Furious.Actions.Import" + ], "RU": "Недопустимый конфигурационный файл", "ZH": "无效的配置文件", - "isReviewed": "True", + "isReviewed": "True" }, "Import Share Link From Clipboard": { - "source": ["Furious.Actions.Import"], + "source": [ + "Furious.Actions.Import" + ], "RU": "Импортировать ссылку из буфера обмена", "ZH": "从剪贴板导入分享链接", - "isReviewed": "True", + "isReviewed": "True" }, "Import JSON Configuration From Clipboard": { - "source": ["Furious.Actions.Import"], + "source": [ + "Furious.Actions.Import" + ], "RU": "Импортировать JSON конфигурацию из буфера обмена", "ZH": "从剪贴板导入JSON配置", - "isReviewed": "True", + "isReviewed": "True" }, "Scan QR Code On The Screen": { - "source": ["Furious.Actions.Import"], + "source": [ + "Furious.Actions.Import" + ], "RU": "Отсканируйте QR-код на экране", "ZH": "扫描屏幕上的二维码", - "isReviewed": "True", + "isReviewed": "True" }, "Set Indent": { - "source": ["Furious.Window.IndentDialog"], + "source": [ + "Furious.Window.IndentDialog" + ], "RU": "Установить отступ", "ZH": "设置缩进", - "isReviewed": "True", + "isReviewed": "True" }, "Indent:": { - "source": ["Furious.Window.IndentDialog"], + "source": [ + "Furious.Window.IndentDialog" + ], "RU": "Отступ", "ZH": "缩进:", - "isReviewed": "True", + "isReviewed": "True" }, "Cancel": { "source": [ @@ -174,171 +229,217 @@ TRANSLATION = { "Furious.Window.ProxyBypassDialog", "Furious.Window.SubscriptionPage", "Furious.Window.SubscriptionWindow", - "Furious.Window.TextEditorWindow", + "Furious.Window.TextEditorWindow" ], "RU": "Отмена", "ZH": "取消", - "isReviewed": "True", + "isReviewed": "True" }, "Save Changes": { - "source": ["Furious.Window.TextEditorWindow"], + "source": [ + "Furious.Window.TextEditorWindow" + ], "RU": "Сохранить изменения", "ZH": "保存更改", - "isReviewed": "True", + "isReviewed": "True" }, "The content has been modified. Save changes?": { - "source": ["Furious.Window.TextEditorWindow"], + "source": [ + "Furious.Window.TextEditorWindow" + ], "RU": "Содержимое было изменено. Сохранить изменения?", "ZH": "内容已修改。保存更改?", - "isReviewed": "True", + "isReviewed": "True" }, "Save": { - "source": ["Furious.Window.TextEditorWindow"], + "source": [ + "Furious.Window.TextEditorWindow" + ], "RU": "Сохранить", "ZH": "保存", - "isReviewed": "True", + "isReviewed": "True" }, "Discard": { - "source": ["Furious.Window.TextEditorWindow"], + "source": [ + "Furious.Window.TextEditorWindow" + ], "RU": "Отказаться", "ZH": "丢弃", - "isReviewed": "True", + "isReviewed": "True" }, "Please check if the configuration is in valid JSON format": { - "source": ["Furious.Window.TextEditorWindow"], + "source": [ + "Furious.Window.TextEditorWindow" + ], "RU": "Проверьте, имеет ли конфигурация допустимый формат JSON", "ZH": "请检查配置是否为有效的JSON格式", - "isReviewed": "True", + "isReviewed": "True" }, "Save As...": { - "source": ["Furious.Window.LogPage", "Furious.Window.TextEditorWindow"], + "source": [ + "Furious.Window.LogPage", + "Furious.Window.TextEditorWindow" + ], "RU": "Сохранить как...", "ZH": "另存为...", - "isReviewed": "True", + "isReviewed": "True" }, "Close Window": { - "source": ["Furious.Window.TextEditorWindow"], + "source": [ + "Furious.Window.TextEditorWindow" + ], "RU": "Закрыть окно", "ZH": "关闭窗口", - "isReviewed": "True", + "isReviewed": "True" }, "File": { "source": [ "Furious.Backends.Xray.AssetWindow", "Furious.Window.LogPage", - "Furious.Window.TextEditorWindow", + "Furious.Window.TextEditorWindow" ], "RU": "Файл", "ZH": "文件", - "isReviewed": "True", + "isReviewed": "True" }, "Undo": { - "source": ["Furious.Window.TextEditorWindow"], + "source": [ + "Furious.Window.TextEditorWindow" + ], "RU": "Отменить", "ZH": "撤销", - "isReviewed": "True", + "isReviewed": "True" }, "Redo": { - "source": ["Furious.Window.TextEditorWindow"], + "source": [ + "Furious.Window.TextEditorWindow" + ], "RU": "Повторить", "ZH": "重做", - "isReviewed": "True", + "isReviewed": "True" }, "Cut": { - "source": ["Furious.Window.TextEditorWindow"], + "source": [ + "Furious.Window.TextEditorWindow" + ], "RU": "Вырезать", "ZH": "剪切", - "isReviewed": "True", + "isReviewed": "True" }, "Copy": { - "source": ["Furious.Window.LogPage", "Furious.Window.TextEditorWindow"], + "source": [ + "Furious.Window.LogPage", + "Furious.Window.TextEditorWindow" + ], "RU": "Копировать", "ZH": "复制", - "isReviewed": "True", + "isReviewed": "True" }, "Paste": { - "source": ["Furious.Window.TextEditorWindow"], + "source": [ + "Furious.Window.TextEditorWindow" + ], "RU": "Вставить", "ZH": "粘贴", - "isReviewed": "True", + "isReviewed": "True" }, "Select All": { "source": [ "Furious.Widget.ServerTableView", "Furious.Window.LogPage", - "Furious.Window.TextEditorWindow", + "Furious.Window.TextEditorWindow" ], "RU": "Выбрать все", "ZH": "全选", - "isReviewed": "True", + "isReviewed": "True" }, "Indent...": { - "source": ["Furious.Window.TextEditorWindow"], + "source": [ + "Furious.Window.TextEditorWindow" + ], "RU": "Настройка отступа...", "ZH": "缩进...", - "isReviewed": "True", + "isReviewed": "True" }, "Edit": { "source": [ "Furious.Window.LogPage", "Furious.Window.SubscriptionPage", - "Furious.Window.TextEditorWindow", + "Furious.Window.TextEditorWindow" ], "RU": "Редактировать", "ZH": "编辑", - "isReviewed": "True", + "isReviewed": "True" }, "Zoom In": { - "source": ["Furious.Window.LogPage", "Furious.Window.TextEditorWindow"], + "source": [ + "Furious.Window.LogPage", + "Furious.Window.TextEditorWindow" + ], "RU": "Увеличить маcштаб", "ZH": "变大", - "isReviewed": "True", + "isReviewed": "True" }, "Zoom Out": { - "source": ["Furious.Window.LogPage", "Furious.Window.TextEditorWindow"], + "source": [ + "Furious.Window.LogPage", + "Furious.Window.TextEditorWindow" + ], "RU": "Уменьшить маcштаб", "ZH": "变小", - "isReviewed": "True", + "isReviewed": "True" }, "View": { "source": [ "Furious.Window.LogPage", "Furious.Window.SettingsPage", - "Furious.Window.TextEditorWindow", + "Furious.Window.TextEditorWindow" ], "RU": "Вид", "ZH": "显示", - "isReviewed": "True", + "isReviewed": "True" }, "Error saving configuration": { - "source": ["Furious.Window.TextEditorWindow"], + "source": [ + "Furious.Window.TextEditorWindow" + ], "RU": "Ошибка сохранения конфигурации", "ZH": "保存配置出错", - "isReviewed": "True", + "isReviewed": "True" }, "Save File": { - "source": ["Furious.Window.LogPage", "Furious.Window.TextEditorWindow"], + "source": [ + "Furious.Window.LogPage", + "Furious.Window.TextEditorWindow" + ], "RU": "Сохранить файл", "ZH": "保存文件", - "isReviewed": "True", + "isReviewed": "True" }, "Error Saving File": { - "source": ["Furious.Window.TextEditorWindow"], + "source": [ + "Furious.Window.TextEditorWindow" + ], "RU": "Ошибка сохранения файла", "ZH": "保存文件出错", - "isReviewed": "True", + "isReviewed": "True" }, "Invalid server configuration": { - "source": ["Furious.Actions.Connection", "Furious.Window.TextEditorWindow"], + "source": [ + "Furious.Actions.Connection", + "Furious.Window.TextEditorWindow" + ], "RU": "Неверная конфигурация сервера", "ZH": "无效的服务器配置", - "isReviewed": "True", + "isReviewed": "True" }, "Error setting indent": { - "source": ["Furious.Window.TextEditorWindow"], + "source": [ + "Furious.Window.TextEditorWindow" + ], "RU": "Ошибка при установке отступов", "ZH": "设置缩进出错", - "isReviewed": "True", + "isReviewed": "True" }, "Remark": { "source": [ @@ -352,20 +453,20 @@ TRANSLATION = { "Furious.Backends.Xray.VmessEditor", "Furious.Widget.ServerTableView", "Furious.Widget.SubscriptionTableView", - "Furious.Window.SubscriptionPage", + "Furious.Window.SubscriptionPage" ], "RU": "Примечание", "ZH": "别名", - "isReviewed": "True", + "isReviewed": "True" }, "Protocol": { "source": [ "Furious.Backends.Hysteria1.Editor", - "Furious.Widget.ServerTableView", + "Furious.Widget.ServerTableView" ], "RU": "Протокол", "ZH": "协议", - "isReviewed": "True", + "isReviewed": "True" }, "Address": { "source": [ @@ -374,11 +475,11 @@ TRANSLATION = { "Furious.Backends.Xray.TrojanEditor", "Furious.Backends.Xray.VlessEditor", "Furious.Backends.Xray.VmessEditor", - "Furious.Widget.ServerTableView", + "Furious.Widget.ServerTableView" ], "RU": "Адрес", "ZH": "地址", - "isReviewed": "True", + "isReviewed": "True" }, "Port": { "source": [ @@ -387,527 +488,684 @@ TRANSLATION = { "Furious.Backends.Xray.TrojanEditor", "Furious.Backends.Xray.VlessEditor", "Furious.Backends.Xray.VmessEditor", - "Furious.Widget.ServerTableView", + "Furious.Widget.ServerTableView" ], "RU": "Порт", "ZH": "端口", - "isReviewed": "True", + "isReviewed": "True" }, "Transport": { "source": [ "Furious.Backends.Xray.TransportEditor", - "Furious.Widget.ServerTableView", + "Furious.Widget.ServerTableView" ], "RU": "Способ передачи", "ZH": "传输方式", - "isReviewed": "True", + "isReviewed": "True" }, "TLS": { - "source": ["Furious.Widget.ServerTableView"], + "source": [ + "Furious.Widget.ServerTableView" + ], "RU": "TLS", "ZH": "TLS", - "isReviewed": "True", + "isReviewed": "True" }, "Subscription": { "source": [ "Furious.Widget.ServerTableView", "Furious.Window.MainWindow", - "Furious.Window.SubscriptionPage", + "Furious.Window.SubscriptionPage" ], "RU": "Подписка", "ZH": "订阅", - "isReviewed": "True", + "isReviewed": "True" }, "Latency": { - "source": ["Furious.Widget.ServerTableView"], + "source": [ + "Furious.Widget.ServerTableView" + ], "RU": "Задержка", "ZH": "延迟", - "isReviewed": "True", + "isReviewed": "True" }, "Speed": { "source": [ "Furious.Backends.Hysteria1.Editor", - "Furious.Widget.ServerTableView", + "Furious.Widget.ServerTableView" ], "RU": "Скорость", "ZH": "速度", - "isReviewed": "True", + "isReviewed": "True" }, "Move Up": { - "source": ["Furious.Widget.ServerTableView"], + "source": [ + "Furious.Widget.ServerTableView" + ], "RU": "Переместить вверх", "ZH": "上移", - "isReviewed": "True", + "isReviewed": "True" }, "Move Down": { - "source": ["Furious.Widget.ServerTableView"], + "source": [ + "Furious.Widget.ServerTableView" + ], "RU": "Переместить вниз", "ZH": "下移", - "isReviewed": "True", + "isReviewed": "True" }, "Duplicate": { - "source": ["Furious.Widget.ServerTableView"], + "source": [ + "Furious.Widget.ServerTableView" + ], "RU": "Дубликат", "ZH": "克隆", - "isReviewed": "True", + "isReviewed": "True" }, "Scroll To Activated Server": { - "source": ["Furious.Widget.ServerTableView"], + "source": [ + "Furious.Widget.ServerTableView" + ], "RU": "Перейдите к активированному серверу", "ZH": "滚动到激活的服务器", - "isReviewed": "True", + "isReviewed": "True" }, "Test Ping Latency": { - "source": ["Furious.Widget.ServerTableView"], + "source": [ + "Furious.Widget.ServerTableView" + ], "RU": "Измерить задержку (ping)", "ZH": "测试Ping延迟", - "isReviewed": "True", + "isReviewed": "True" }, "Test Download Speed": { - "source": ["Furious.Widget.ServerTableView"], + "source": [ + "Furious.Widget.ServerTableView" + ], "RU": "Измерить скорость загрузки", "ZH": "测试下行速度", - "isReviewed": "True", + "isReviewed": "True" }, "Test Download Speed (Multithreaded)": { - "source": ["Furious.Widget.ServerTableView"], + "source": [ + "Furious.Widget.ServerTableView" + ], "RU": "Измерить скорость загрузки (многопоточная)", "ZH": "测试下行速度(多线程)", - "isReviewed": "True", + "isReviewed": "True" }, "Clear Test Results": { - "source": ["Furious.Widget.ServerTableView"], + "source": [ + "Furious.Widget.ServerTableView" + ], "RU": "Очистить результаты тестирования", "ZH": "清除测试结果", - "isReviewed": "True", + "isReviewed": "True" }, "New Empty Configuration": { - "source": ["Furious.Widget.ServerTableView", "Furious.Window.HomePage"], + "source": [ + "Furious.Widget.ServerTableView", + "Furious.Window.HomePage" + ], "RU": "Создать новую пустую конфигурацию", "ZH": "新建空白配置", - "isReviewed": "True", + "isReviewed": "True" }, "Export Share Link To Clipboard": { - "source": ["Furious.Widget.ServerTableView"], + "source": [ + "Furious.Widget.ServerTableView" + ], "RU": "Копировать ссылку в буфер обмена", "ZH": "导出分享链接至剪贴板", - "isReviewed": "True", + "isReviewed": "True" }, "Export As QR Code": { - "source": ["Furious.Widget.ServerTableView"], + "source": [ + "Furious.Widget.ServerTableView" + ], "RU": "Экспорт в виде QR-кода", "ZH": "导出为二维码", - "isReviewed": "True", + "isReviewed": "True" }, "Export JSON Configuration To Clipboard": { - "source": ["Furious.Widget.ServerTableView"], + "source": [ + "Furious.Widget.ServerTableView" + ], "RU": "Копировать JSON конфигурацию в буфер обмена", "ZH": "导出JSON配置至剪贴板", - "isReviewed": "True", + "isReviewed": "True" }, "Connecting": { - "source": ["Furious.Actions.Connection", "Furious.Widget.ServerTableView"], + "source": [ + "Furious.Actions.Connection", + "Furious.Widget.ServerTableView" + ], "RU": "Подключение", "ZH": "正在连接", - "isReviewed": "True", + "isReviewed": "True" }, "Connecting. Please wait...": { - "source": ["Furious.Widget.ServerTableView"], + "source": [ + "Furious.Widget.ServerTableView" + ], "RU": "Подключение. Пожалуйста, подождите...", "ZH": "正在连接。请稍候", - "isReviewed": "True", + "isReviewed": "True" }, "Untitled": { - "source": ["Furious.Widget.ServerTableView"], + "source": [ + "Furious.Widget.ServerTableView" + ], "RU": "Без названия", "ZH": "未命名", - "isReviewed": "True", + "isReviewed": "True" }, "Add Subscription": { "source": [ "Furious.Window.SubscriptionPage", - "Furious.Window.SubscriptionWindow", + "Furious.Window.SubscriptionWindow" ], "RU": "Добавить подписку", "ZH": "添加订阅", - "isReviewed": "True", + "isReviewed": "True" }, "Enter subscription remark:": { - "source": ["Furious.Window.SubscriptionWindow"], + "source": [ + "Furious.Window.SubscriptionWindow" + ], "RU": "Введите примечание о подписке:", "ZH": "输入订阅名称:", - "isReviewed": "True", + "isReviewed": "True" }, "Enter subscription URL:": { - "source": ["Furious.Window.SubscriptionWindow"], + "source": [ + "Furious.Window.SubscriptionWindow" + ], "RU": "Введите URL-адрес подписки:", "ZH": "输入订阅URL:", - "isReviewed": "True", + "isReviewed": "True" }, "Edit Subscription": { "source": [ "Furious.Window.SubscriptionPage", - "Furious.Window.SubscriptionWindow", + "Furious.Window.SubscriptionWindow" ], "RU": "Редактировать подписку", "ZH": "编辑订阅", - "isReviewed": "True", + "isReviewed": "True" }, "Subscription List": { - "source": ["Furious.Window.SubscriptionWindow"], + "source": [ + "Furious.Window.SubscriptionWindow" + ], "RU": "Список подписок", "ZH": "订阅列表", - "isReviewed": "True", + "isReviewed": "True" }, "Add": { "source": [ "Furious.Backends.Xray.RoutingWindow", "Furious.Window.SubscriptionPage", - "Furious.Window.SubscriptionWindow", + "Furious.Window.SubscriptionWindow" ], "RU": "Добавить", "ZH": "添加", - "isReviewed": "True", + "isReviewed": "True" }, "Exit": { - "source": ["Furious.Actions.Exit", "Furious.Backends.Xray.AssetWindow"], + "source": [ + "Furious.Actions.Exit", + "Furious.Backends.Xray.AssetWindow" + ], "RU": "Выход", "ZH": "退出", - "isReviewed": "True", + "isReviewed": "True" }, "Unable to save log": { - "source": ["Furious.Window.LogPage"], + "source": [ + "Furious.Window.LogPage" + ], "RU": "Не удалось сохранить журнал", "ZH": "无法保存日志", - "isReviewed": "True", + "isReviewed": "True" }, "Text files (*.txt);;All files (*)": { - "source": ["Furious.Window.LogPage"], + "source": [ + "Furious.Window.LogPage" + ], "RU": "Текстовые файлы (*.txt);;Все файлы (*)", "ZH": "文本文件 (*.txt);;所有文件 (*)", - "isReviewed": "True", + "isReviewed": "True" }, "Error saving log": { - "source": ["Furious.Window.LogPage"], + "source": [ + "Furious.Window.LogPage" + ], "RU": "Ошибка сохранения журнала", "ZH": "保存日志出错", - "isReviewed": "True", + "isReviewed": "True" }, "Asset file already exists. Overwrite?": { - "source": ["Furious.Backends.Xray.AssetListWidget"], + "source": [ + "Furious.Backends.Xray.AssetListWidget" + ], "RU": "Файл ресурсов уже существует. Перезаписать?", "ZH": "资源文件已存在。是否覆盖?", - "isReviewed": "True", + "isReviewed": "True" }, "Error import asset file": { - "source": ["Furious.Backends.Xray.AssetListWidget"], + "source": [ + "Furious.Backends.Xray.AssetListWidget" + ], "RU": "Ошибка при импорте файла ресурсов", "ZH": "导入资源文件出错", - "isReviewed": "True", + "isReviewed": "True" }, "Import asset file success": { - "source": ["Furious.Backends.Xray.AssetListWidget"], + "source": [ + "Furious.Backends.Xray.AssetListWidget" + ], "RU": "Успешно импортирован файл ресурсов", "ZH": "导入资源文件成功", - "isReviewed": "True", + "isReviewed": "True" }, "Xray-core Asset File": { - "source": ["Furious.Backends.Xray.AssetWindow"], + "source": [ + "Furious.Backends.Xray.AssetWindow" + ], "RU": "Xray-core Asset File", "ZH": "Xray-core资源文件", - "isReviewed": "True", + "isReviewed": "True" }, "Refresh": { - "source": ["Furious.Backends.Xray.AssetWindow"], + "source": [ + "Furious.Backends.Xray.AssetWindow" + ], "RU": "Обновить", "ZH": "刷新", - "isReviewed": "True", + "isReviewed": "True" }, "Open Asset Directory": { - "source": ["Furious.Backends.Xray.AssetWindow"], + "source": [ + "Furious.Backends.Xray.AssetWindow" + ], "RU": "Открыть каталог ресурсов", "ZH": "打开资源目录", - "isReviewed": "True", + "isReviewed": "True" }, "All files (*)": { - "source": ["Furious.Backends.Xray.AssetWindow"], + "source": [ + "Furious.Backends.Xray.AssetWindow" + ], "RU": "Все файлы (*)", "ZH": "所有文件 (*)", - "isReviewed": "True", + "isReviewed": "True" }, "Server": { "source": [ "Furious.Backends.Hysteria1.Editor", "Furious.Backends.Hysteria2.Editor", - "Furious.Window.HomePage", + "Furious.Window.HomePage" ], "RU": "Сервер", "ZH": "服务器", - "isReviewed": "True", + "isReviewed": "True" }, "Log": { - "source": ["Furious.Window.LogPage", "Furious.Window.MainWindow"], + "source": [ + "Furious.Window.LogPage", + "Furious.Window.MainWindow" + ], "RU": "Журнал событий", "ZH": "日志", - "isReviewed": "True", + "isReviewed": "True" }, "Home": { - "source": ["Furious.Window.MainWindow"], + "source": [ + "Furious.Window.MainWindow" + ], "RU": "Главная", "ZH": "主页", - "isReviewed": "True", + "isReviewed": "True" }, "Expand Navigation": { - "source": ["Furious.Widget.NavigationView"], + "source": [ + "Furious.Widget.NavigationView" + ], "RU": "Развернуть навигацию", "ZH": "展开导航", - "isReviewed": "True", + "isReviewed": "True" }, "Collapse Navigation": { - "source": ["Furious.Widget.NavigationView"], + "source": [ + "Furious.Widget.NavigationView" + ], "RU": "Свернуть навигацию", "ZH": "折叠导航", - "isReviewed": "True", + "isReviewed": "True" }, "Open Application Folder": { - "source": ["Furious.Window.SettingsPage"], + "source": [ + "Furious.Window.SettingsPage" + ], "RU": "Открыть папку приложения", "ZH": "打开应用程序文件夹", - "isReviewed": "True", + "isReviewed": "True" }, "Check For Updates": { - "source": ["Furious.Window.SettingsPage"], + "source": [ + "Furious.Window.SettingsPage" + ], "RU": "Проверка обновлений", "ZH": "检查更新", - "isReviewed": "True", + "isReviewed": "True" }, "About": { - "source": ["Furious.Window.SettingsPage"], + "source": [ + "Furious.Window.SettingsPage" + ], "RU": "О нас", "ZH": "关于", - "isReviewed": "True", + "isReviewed": "True" }, "Already started": { - "source": ["Furious.Application.DesktopApplication"], + "source": [ + "Furious.Application.DesktopApplication" + ], "RU": "Активированный", "ZH": "已启动", - "isReviewed": "True", + "isReviewed": "True" }, "Connect": { - "source": ["Furious.Actions.Connection"], + "source": [ + "Furious.Actions.Connection" + ], "RU": "Подключиться", "ZH": "连接", - "isReviewed": "True", + "isReviewed": "True" }, "Disconnect": { - "source": ["Furious.Actions.Connection"], + "source": [ + "Furious.Actions.Connection" + ], "RU": "Отключиться", "ZH": "断开连接", - "isReviewed": "True", + "isReviewed": "True" }, "Unable to connect": { - "source": ["Furious.Actions.Connection", "Furious.Qt.QtWidgets"], + "source": [ + "Furious.Actions.Connection", + "Furious.Qt.QtWidgets" + ], "RU": "Не удается подключиться", "ZH": "无法连接", - "isReviewed": "True", + "isReviewed": "True" }, "Server configuration empty. Please configure your server first": { - "source": ["Furious.Actions.Connection"], + "source": [ + "Furious.Actions.Connection" + ], "RU": "Конфигурация сервера пуста. Пожалуйста, сначала настройте свой сервер", "ZH": "服务器配置为空。请先配置服务器", - "isReviewed": "True", + "isReviewed": "True" }, "Connected": { - "source": ["Furious.Actions.Connection"], + "source": [ + "Furious.Actions.Connection" + ], "RU": "Подключен", "ZH": "已连接", - "isReviewed": "True", + "isReviewed": "True" }, "Unknown error": { - "source": ["Furious.Actions.Connection"], + "source": [ + "Furious.Actions.Connection" + ], "RU": "Неизвестная ошибка", "ZH": "未知错误", - "isReviewed": "True", + "isReviewed": "True" }, "Failed to start core": { - "source": ["Furious.Actions.Connection"], + "source": [ + "Furious.Actions.Connection" + ], "RU": "Сбой при запуске ядра", "ZH": "内核启动失败", - "isReviewed": "True", + "isReviewed": "True" }, "Core terminated unexpectedly": { - "source": ["Furious.Actions.Connection"], + "source": [ + "Furious.Actions.Connection" + ], "RU": "Неожиданное завершение работы ядра", "ZH": "内核意外终止", - "isReviewed": "True", + "isReviewed": "True" }, "Disconnected": { - "source": ["Furious.Actions.Connection"], + "source": [ + "Furious.Actions.Connection" + ], "RU": "Отключен", "ZH": "已断开", - "isReviewed": "True", + "isReviewed": "True" }, "Language": { - "source": ["Furious.Actions.Language", "Furious.Window.SettingsPage"], + "source": [ + "Furious.Actions.Language", + "Furious.Window.SettingsPage" + ], "RU": "Язык", "ZH": "语言", - "isReviewed": "True", + "isReviewed": "True" }, "Routing": { - "source": ["Furious.Actions.Routing"], + "source": [ + "Furious.Actions.Routing" + ], "RU": "Маршрутизация", "ZH": "路由", - "isReviewed": "True", + "isReviewed": "True" }, "TUN Mode": { - "source": ["Furious.Window.SettingsPage"], + "source": [ + "Furious.Window.SettingsPage" + ], "RU": "TUN режим", "ZH": "TUN模式", - "isReviewed": "True", + "isReviewed": "True" }, "TUN Mode Disabled (Administrator)": { - "source": ["Furious.Window.SettingsPage"], + "source": [ + "Furious.Window.SettingsPage" + ], "RU": "TUN режим отключен (Administrator)", "ZH": "TUN模式已禁用(管理员)", - "isReviewed": "True", + "isReviewed": "True" }, "TUN Mode Disabled (Superuser)": { - "source": ["Furious.Window.SettingsPage"], + "source": [ + "Furious.Window.SettingsPage" + ], "RU": "TUN режим отключен (Superuser)", "ZH": "TUN模式已禁用(Superuser)", - "isReviewed": "True", + "isReviewed": "True" }, "Settings": { - "source": ["Furious.Window.MainWindow", "Furious.Window.SettingsPage"], + "source": [ + "Furious.Window.MainWindow", + "Furious.Window.SettingsPage" + ], "RU": "Настройки", "ZH": "设置", - "isReviewed": "True", + "isReviewed": "True" }, "Dark Mode": { - "source": ["Furious.Window.SettingsPage"], + "source": [ + "Furious.Window.SettingsPage" + ], "RU": "Темный режим", "ZH": "深色模式", - "isReviewed": "True", + "isReviewed": "True" }, "Startup On Boot": { - "source": ["Furious.Window.SettingsPage"], + "source": [ + "Furious.Window.SettingsPage" + ], "RU": "Автозапуск при загрузке системы", "ZH": "开机启动", - "isReviewed": "True", + "isReviewed": "True" }, "Force To 127.0.0.1 When Setting Local Proxy": { - "source": ["Furious.Window.SettingsPage"], + "source": [ + "Furious.Window.SettingsPage" + ], "RU": "Принудительно 127.0.0.1 для локального прокси", "ZH": "设置本地代理时强制使用127.0.0.1", - "isReviewed": "True", + "isReviewed": "True" }, "Automatically Update Asset Files": { - "source": ["Furious.Window.SettingsPage"], + "source": [ + "Furious.Window.SettingsPage" + ], "RU": "Автоматически обновлять файлы активов", "ZH": "自动更新资源文件", - "isReviewed": "True", + "isReviewed": "True" }, "Show Progress Bar When Connecting": { - "source": ["Furious.Window.SettingsPage"], + "source": [ + "Furious.Window.SettingsPage" + ], "RU": "Отображение индикатора выполнения при подключении", "ZH": "连接时显示进度条", - "isReviewed": "True", + "isReviewed": "True" }, "Show Tab And Spaces In Editor": { - "source": ["Furious.Window.SettingsPage"], + "source": [ + "Furious.Window.SettingsPage" + ], "RU": "Показывать табуляцию и пробелы в редакторе", "ZH": "在编辑器中显示制表符和空格", - "isReviewed": "True", + "isReviewed": "True" }, "System Proxy": { - "source": ["Furious.Window.SettingsPage"], + "source": [ + "Furious.Window.SettingsPage" + ], "RU": "Системный прокси", "ZH": "系统代理", - "isReviewed": "True", + "isReviewed": "True" }, "Automatically Configure System Proxy": { - "source": ["Furious.Window.SettingsPage"], + "source": [ + "Furious.Window.SettingsPage" + ], "RU": "Автоматическая настройка системного прокси-сервера", "ZH": "自动配置系统代理", - "isReviewed": "True", + "isReviewed": "True" }, "Do Not Change System Proxy": { - "source": ["Furious.Window.SettingsPage"], + "source": [ + "Furious.Window.SettingsPage" + ], "RU": "Не изменять системный прокси-сервер", "ZH": "不修改系统代理", - "isReviewed": "True", + "isReviewed": "True" }, "Furious is not able to run on this operating system": { - "source": ["Furious.__main__"], + "source": [ + "Furious.__main__" + ], "RU": "Furious не может работать в этой операционной системе", "ZH": "Furious无法在此操作系统上运行", - "isReviewed": "True", + "isReviewed": "True" }, "Operating system information": { - "source": ["Furious.__main__"], + "source": [ + "Furious.__main__" + ], "RU": "Информация об операционной системе", "ZH": "操作系统信息", - "isReviewed": "True", + "isReviewed": "True" }, "Furious encountered an internal error and needs to be stopped": { - "source": ["Furious.__main__"], + "source": [ + "Furious.__main__" + ], "RU": "В Furious произошла внутренняя ошибка, и ее необходимо завершить", "ZH": "Furious遇到内部错误,需要终止", - "isReviewed": "True", + "isReviewed": "True" }, "Furious stopped unexpectedly due to an unknown exception": { - "source": ["Furious.__main__"], + "source": [ + "Furious.__main__" + ], "RU": "Программа Furious неожиданно завершилась из-за неизвестного исключения", "ZH": "由于一个未知异常,Furious意外终止", - "isReviewed": "True", + "isReviewed": "True" }, "Crash log has been saved to": { - "source": ["Furious.__main__"], + "source": [ + "Furious.__main__" + ], "RU": "Журнал сбоев был сохранен в", "ZH": "崩溃日志已保存到", - "isReviewed": "True", + "isReviewed": "True" }, "Open crash log": { - "source": ["Furious.__main__"], + "source": [ + "Furious.__main__" + ], "RU": "Открыть журнал ошибок", "ZH": "打开崩溃日志", - "isReviewed": "True", + "isReviewed": "True" }, "Bypass Mainland China": { - "source": ["Furious.Actions.Routing"], + "source": [ + "Furious.Actions.Routing" + ], "RU": "В обход Китая", "ZH": "绕过中国大陆", - "isReviewed": "True", + "isReviewed": "True" }, "Global": { - "source": ["Furious.Actions.Routing"], + "source": [ + "Furious.Actions.Routing" + ], "RU": "глобальный режим", "ZH": "全球", - "isReviewed": "True", + "isReviewed": "True" }, "Custom": { - "source": ["Furious.Actions.Routing"], + "source": [ + "Furious.Actions.Routing" + ], "RU": "Свои настройки", "ZH": "自定义", - "isReviewed": "True", + "isReviewed": "True" }, "Furious cannot find any valid http proxy endpoint in the configuration": { - "source": ["Furious.Actions.Connection"], + "source": [ + "Furious.Actions.Connection" + ], "RU": "Я не могу найти ни одной допустимой конечной точки http-прокси в конфигурации", "ZH": "Furious在配置中无法找到任何有效的http代理端点", - "isReviewed": "True", + "isReviewed": "True" }, "Please complete your server configuration": { - "source": ["Furious.Actions.Connection"], + "source": [ + "Furious.Actions.Connection" + ], "RU": "Пожалуйста, завершите настройку вашего сервера", "ZH": "请完善服务器配置", - "isReviewed": "True", + "isReviewed": "True" }, "Test Tcping Latency": { - "source": ["Furious.Widget.ServerTableView"], + "source": [ + "Furious.Widget.ServerTableView" + ], "RU": "Измерить задержку (Tсping)", "ZH": "测试Tcping延迟", - "isReviewed": "True", + "isReviewed": "True" }, "Basic Configuration": { "source": [ @@ -918,11 +1176,11 @@ TRANSLATION = { "Furious.Backends.Xray.TrojanEditor", "Furious.Backends.Xray.VlessEditor", "Furious.Backends.Xray.VmessEditor", - "Furious.Window.TunSettingsDialog", + "Furious.Window.TunSettingsDialog" ], "RU": "Базовая конфигурация", "ZH": "基本配置", - "isReviewed": "True", + "isReviewed": "True" }, "Proxy": { "source": [ @@ -932,96 +1190,112 @@ TRANSLATION = { "Furious.Backends.Xray.SocksEditor", "Furious.Backends.Xray.TrojanEditor", "Furious.Backends.Xray.VlessEditor", - "Furious.Backends.Xray.VmessEditor", + "Furious.Backends.Xray.VmessEditor" ], "RU": "Прокси", "ZH": "代理", - "isReviewed": "True", + "isReviewed": "True" }, "Project Website": { "source": [ "Furious.Backends.Hysteria1.Editor", - "Furious.Backends.Hysteria2.Editor", + "Furious.Backends.Hysteria2.Editor" ], "RU": "Веб-сайт проекта", "ZH": "项目网站", - "isReviewed": "True", + "isReviewed": "True" }, "Other": { "source": [ "Furious.Backends.Hysteria1.Editor", - "Furious.Backends.Hysteria2.Editor", + "Furious.Backends.Hysteria2.Editor" ], "RU": "Прочее", "ZH": "其它", - "isReviewed": "True", + "isReviewed": "True" }, "Encryption": { "source": [ "Furious.Backends.Xray.ShadowsocksEditor", - "Furious.Backends.Xray.VlessEditor", + "Furious.Backends.Xray.VlessEditor" ], "RU": "Шифрование", "ZH": "加密", - "isReviewed": "True", + "isReviewed": "True" }, "Password": { "source": [ "Furious.Backends.Xray.ShadowsocksEditor", "Furious.Backends.Xray.SocksEditor", - "Furious.Backends.Xray.TrojanEditor", + "Furious.Backends.Xray.TrojanEditor" ], "RU": "Пароль", "ZH": "密码", - "isReviewed": "True", + "isReviewed": "True" }, "Flow": { - "source": ["Furious.Backends.Xray.VlessEditor"], + "source": [ + "Furious.Backends.Xray.VlessEditor" + ], "RU": "Поток", "ZH": "流控", - "isReviewed": "True", + "isReviewed": "True" }, "Use Monochrome Tray Icon": { - "source": ["Furious.Window.SettingsPage"], + "source": [ + "Furious.Window.SettingsPage" + ], "RU": "Использовать монохромный значок в трее", "ZH": "使用单色托盘图标", - "isReviewed": "True", + "isReviewed": "True" }, "Hide Dock Icon": { - "source": ["Furious.Window.SettingsPage"], + "source": [ + "Furious.Window.SettingsPage" + ], "RU": "Скрыть значок Dock", "ZH": "隐藏程序坞图标", - "isReviewed": "True", + "isReviewed": "True" }, "Customize JSON Configuration...": { - "source": ["Furious.Widget.ServerTableView"], + "source": [ + "Furious.Widget.ServerTableView" + ], "RU": "Редактировать JSON конфигурацию...", "ZH": "自定义JSON配置...", - "isReviewed": "True", + "isReviewed": "True" }, "Routing option with direct rules is not allowed in TUN mode": { - "source": ["Furious.Qt.QtWidgets"], + "source": [ + "Furious.Qt.QtWidgets" + ], "RU": "Опция маршрутизации с прямыми правилами не разрешена в режиме TUN", "ZH": "TUN模式下不允许使用直接规则的路由选项", - "isReviewed": "True", + "isReviewed": "True" }, "Switch to global and reconnect?": { - "source": ["Furious.Qt.QtWidgets"], + "source": [ + "Furious.Qt.QtWidgets" + ], "RU": "Переключиться в глобальный режим и переподключиться?", "ZH": "切换到全局模式并重新连接?", - "isReviewed": "True", + "isReviewed": "True" }, "Select and press Enter to activate configuration and connect": { - "source": ["Furious.Actions.Connection"], + "source": [ + "Furious.Actions.Connection" + ], "RU": "Выберите конфигурацию и нажмите Enter, чтобы активировать ее и подключиться", "ZH": "选择并按下Enter键以激活配置并连接", - "isReviewed": "True", + "isReviewed": "True" }, "Power Save Mode": { - "source": ["Furious.Window.SettingsPage"], + "source": [ + "Furious.Window.SettingsPage" + ], "RU": "Режим энергосбережения", "ZH": "省电模式", - "isReviewed": "True", + "isReviewed": "True" }, "OK": { "source": [ @@ -1032,1175 +1306,1539 @@ TRANSLATION = { "Furious.Window.NetworkTestDialog", "Furious.Window.ProxyBypassDialog", "Furious.Window.SubscriptionPage", - "Furious.Window.SubscriptionWindow", + "Furious.Window.SubscriptionWindow" ], "RU": "OK", "ZH": "OK", - "isReviewed": "True", + "isReviewed": "True" }, "Advanced...": { - "source": ["Furious.Widget.ServerTableView"], + "source": [ + "Furious.Widget.ServerTableView" + ], "RU": "Расширенные...", "ZH": "高级...", - "isReviewed": "True", + "isReviewed": "True" }, "is available to download": { - "source": ["Furious.Actions.Connection"], + "source": [ + "Furious.Actions.Connection" + ], "RU": "доступен для скачивания", "ZH": "可供下载", - "isReviewed": "True", + "isReviewed": "True" }, "Update subscription completed": { - "source": ["Furious.Widget.ServerTableView"], + "source": [ + "Furious.Widget.ServerTableView" + ], "RU": "Подписка на обновление завершена", "ZH": "更新订阅完成", - "isReviewed": "True", + "isReviewed": "True" }, "Update subscription failed": { - "source": ["Furious.Widget.ServerTableView"], + "source": [ + "Furious.Widget.ServerTableView" + ], "RU": "Обновить подписку не удалось", "ZH": "更新订阅失败", - "isReviewed": "True", + "isReviewed": "True" }, "Configuration has been updated": { - "source": ["Furious.Widget.ServerTableView"], + "source": [ + "Furious.Widget.ServerTableView" + ], "RU": "Конфигурация обновлена", "ZH": "配置已更新", - "isReviewed": "True", + "isReviewed": "True" }, "Configuration update failed": { - "source": ["Furious.Widget.ServerTableView"], + "source": [ + "Furious.Widget.ServerTableView" + ], "RU": "Обновление конфигурации не удалось", "ZH": "配置更新失败", - "isReviewed": "True", + "isReviewed": "True" }, "Auto Update": { "source": [ "Furious.Widget.SubscriptionTableView", - "Furious.Window.SubscriptionPage", + "Furious.Window.SubscriptionPage" ], "RU": "Автообновление", "ZH": "自动更新", - "isReviewed": "True", + "isReviewed": "True" }, "Auto Update Use Proxy": { "source": [ "Furious.Widget.SubscriptionTableView", - "Furious.Window.SubscriptionPage", + "Furious.Window.SubscriptionPage" ], "RU": "Автообновление (используя прокси)", "ZH": "自动更新使用代理", - "isReviewed": "True", + "isReviewed": "True" }, "Never": { - "source": ["Furious.Widget.SubscriptionTableView"], + "source": [ + "Furious.Widget.SubscriptionTableView" + ], "RU": "Никогда", "ZH": "从不", - "isReviewed": "True", + "isReviewed": "True" }, "Every 5 mins": { - "source": ["Furious.Widget.SubscriptionTableView"], + "source": [ + "Furious.Widget.SubscriptionTableView" + ], "RU": "Каждые 5 минут", "ZH": "每5分钟", - "isReviewed": "True", + "isReviewed": "True" }, "Every 10 mins": { - "source": ["Furious.Widget.SubscriptionTableView"], + "source": [ + "Furious.Widget.SubscriptionTableView" + ], "RU": "Каждые 10 минут", "ZH": "每10分钟", - "isReviewed": "True", + "isReviewed": "True" }, "Every 15 mins": { - "source": ["Furious.Widget.SubscriptionTableView"], + "source": [ + "Furious.Widget.SubscriptionTableView" + ], "RU": "Каждые 15 минут", "ZH": "每15分钟", - "isReviewed": "True", + "isReviewed": "True" }, "Every 30 mins": { - "source": ["Furious.Widget.SubscriptionTableView"], + "source": [ + "Furious.Widget.SubscriptionTableView" + ], "RU": "Каждые 30 минут", "ZH": "每30分钟", - "isReviewed": "True", + "isReviewed": "True" }, "Every 45 mins": { - "source": ["Furious.Widget.SubscriptionTableView"], + "source": [ + "Furious.Widget.SubscriptionTableView" + ], "RU": "Каждые 45 минут", "ZH": "每45分钟", - "isReviewed": "True", + "isReviewed": "True" }, "Every 1 hour": { - "source": ["Furious.Widget.SubscriptionTableView"], + "source": [ + "Furious.Widget.SubscriptionTableView" + ], "RU": "Каждый 1 час", "ZH": "每1小时", - "isReviewed": "True", + "isReviewed": "True" }, "Every 2 hours": { - "source": ["Furious.Widget.SubscriptionTableView"], + "source": [ + "Furious.Widget.SubscriptionTableView" + ], "RU": "Каждые 2 часа", "ZH": "每2小时", - "isReviewed": "True", + "isReviewed": "True" }, "Every 3 hours": { - "source": ["Furious.Widget.SubscriptionTableView"], + "source": [ + "Furious.Widget.SubscriptionTableView" + ], "RU": "Каждые 3 часа", "ZH": "每3小时", - "isReviewed": "True", + "isReviewed": "True" }, "Every 6 hours": { - "source": ["Furious.Widget.SubscriptionTableView"], + "source": [ + "Furious.Widget.SubscriptionTableView" + ], "RU": "Каждые 6 часов", "ZH": "每6小时", - "isReviewed": "True", + "isReviewed": "True" }, "Every 8 hours": { - "source": ["Furious.Widget.SubscriptionTableView"], + "source": [ + "Furious.Widget.SubscriptionTableView" + ], "RU": "Каждые 8 часов", "ZH": "每8小时", - "isReviewed": "True", + "isReviewed": "True" }, "Every 10 hours": { - "source": ["Furious.Widget.SubscriptionTableView"], + "source": [ + "Furious.Widget.SubscriptionTableView" + ], "RU": "Каждые 10 часов", "ZH": "每10小时", - "isReviewed": "True", + "isReviewed": "True" }, "Every 12 hours": { - "source": ["Furious.Widget.SubscriptionTableView"], + "source": [ + "Furious.Widget.SubscriptionTableView" + ], "RU": "Каждые 12 часов", "ZH": "每12小时", - "isReviewed": "True", + "isReviewed": "True" }, "Every 24 hours": { - "source": ["Furious.Widget.SubscriptionTableView"], + "source": [ + "Furious.Widget.SubscriptionTableView" + ], "RU": "Каждые 24 часа", "ZH": "每24小时", - "isReviewed": "True", + "isReviewed": "True" }, "Use current proxy": { - "source": ["Furious.Widget.SubscriptionTableView"], + "source": [ + "Furious.Widget.SubscriptionTableView" + ], "RU": "Использовать текущий прокси-сервер", "ZH": "使用当前代理", - "isReviewed": "True", + "isReviewed": "True" }, "Force proxy": { - "source": ["Furious.Widget.SubscriptionTableView"], + "source": [ + "Furious.Widget.SubscriptionTableView" + ], "RU": "Обязательно через прокси-сервер", "ZH": "强制代理", - "isReviewed": "True", + "isReviewed": "True" }, "No proxy": { - "source": ["Furious.Widget.SubscriptionTableView"], + "source": [ + "Furious.Widget.SubscriptionTableView" + ], "RU": "Не использовать прокси", "ZH": "无代理", - "isReviewed": "True", + "isReviewed": "True" }, "Customize Tun2socks Settings": { - "source": ["Furious.Window.TunSettingsDialog"], + "source": [ + "Furious.Window.TunSettingsDialog" + ], "RU": "Настроить параметры Tun2socks", "ZH": "自定义Tun2socks设置", - "isReviewed": "True", + "isReviewed": "True" }, "Customize Tun2socks Settings...": { - "source": ["Furious.Window.SettingsPage"], + "source": [ + "Furious.Window.SettingsPage" + ], "RU": "Настроить параметры Tun2socks...", "ZH": "自定义Tun2socks设置...", - "isReviewed": "True", + "isReviewed": "True" }, "Go to help page": { - "source": ["Furious.Window.TunSettingsDialog"], + "source": [ + "Furious.Window.TunSettingsDialog" + ], "RU": "Перейти на страницу помощи", "ZH": "转到帮助页面", - "isReviewed": "True", + "isReviewed": "True" }, "Primary Adapter Interface Name": { - "source": ["Furious.Window.TunSettingsDialog"], + "source": [ + "Furious.Window.TunSettingsDialog" + ], "RU": "Имя основного сетевого адаптера", "ZH": "主适配器接口名称", - "isReviewed": "True", + "isReviewed": "True" }, "Primary Adapter Interface IP": { - "source": ["Furious.Window.TunSettingsDialog"], + "source": [ + "Furious.Window.TunSettingsDialog" + ], "RU": "IP-адрес основного сетевого адаптера", "ZH": "主适配器接口IP", - "isReviewed": "True", + "isReviewed": "True" }, "Default Primary Gateway IP": { - "source": ["Furious.Window.TunSettingsDialog"], + "source": [ + "Furious.Window.TunSettingsDialog" + ], "RU": "IP-адрес основного шлюза по умолчанию", "ZH": "默认主网关IP", - "isReviewed": "True", + "isReviewed": "True" }, "Tun2socks Adapter Interface DNS": { - "source": ["Furious.Window.TunSettingsDialog"], + "source": [ + "Furious.Window.TunSettingsDialog" + ], "RU": "DNS-адрес интерфейса адаптера Tun2socks", "ZH": "Tun2socks适配器接口DNS", - "isReviewed": "True", + "isReviewed": "True" }, "Bypass Tun2socks Adapter Interface IP (separated by commas)": { - "source": ["Furious.Window.TunSettingsDialog"], + "source": [ + "Furious.Window.TunSettingsDialog" + ], "RU": "Обход IP-адреса интерфейса адаптера Tun2socks (через запятую)", "ZH": "绕过Tun2socks适配器接口IP(以逗号分隔)", - "isReviewed": "True", + "isReviewed": "True" }, "Disable Primary Adapter Interface DNS (Mitigating DNS leaks on Windows)": { - "source": ["Furious.Window.TunSettingsDialog"], + "source": [ + "Furious.Window.TunSettingsDialog" + ], "RU": "Отключить DNS основного сетевого адаптера (для предотвращения утечек DNS в Windows)", "ZH": "禁用主适配器接口DNS(在Windows上缓解DNS泄露)", - "isReviewed": "True", + "isReviewed": "True" }, "Memory Optimization": { - "source": ["Furious.Window.TunSettingsDialog"], + "source": [ + "Furious.Window.TunSettingsDialog" + ], "RU": "Оптимизация памяти", "ZH": "内存优化", - "isReviewed": "True", + "isReviewed": "True" }, "TCP Send Buffer Size (MiB)": { - "source": ["Furious.Window.TunSettingsDialog"], + "source": [ + "Furious.Window.TunSettingsDialog" + ], "RU": "Размер буфера отправки TCP (MiB)", "ZH": "TCP发送缓冲区大小(MiB)", - "isReviewed": "True", + "isReviewed": "True" }, "TCP Receive Buffer Size (MiB)": { - "source": ["Furious.Window.TunSettingsDialog"], + "source": [ + "Furious.Window.TunSettingsDialog" + ], "RU": "Размер буфера приема TCP (MiB)", "ZH": "TCP接收缓冲区大小(MiB)", - "isReviewed": "True", + "isReviewed": "True" }, "TCP Receive Buffer Auto-tuning": { - "source": ["Furious.Window.TunSettingsDialog"], + "source": [ + "Furious.Window.TunSettingsDialog" + ], "RU": "Автоматическая настройка буфера приема TCP", "ZH": "TCP接收缓冲区自动调优", - "isReviewed": "True", + "isReviewed": "True" }, "Restart The Application As Administrator": { - "source": ["Furious.Window.SettingsPage"], + "source": [ + "Furious.Window.SettingsPage" + ], "RU": "Перезапустите приложение от имени администратора", "ZH": "以管理员身份重新启动应用程序", - "isReviewed": "True", + "isReviewed": "True" }, "Restart The Application As Superuser": { - "source": ["Furious.Window.SettingsPage"], + "source": [ + "Furious.Window.SettingsPage" + ], "RU": "Перезапустите приложение от имени суперпользователя", "ZH": "以Superuser身份重新启动应用程序", - "isReviewed": "True", + "isReviewed": "True" }, "Administrator": { - "source": ["Furious.Application.TrayIcon"], + "source": [ + "Furious.Application.TrayIcon" + ], "RU": "Administrator", "ZH": "管理员", - "isReviewed": "True", + "isReviewed": "True" }, "I am the supreme authority 👑": { - "source": ["Furious.Window.HomePage"], + "source": [ + "Furious.Window.HomePage" + ], "RU": "Я — единственная высшая инстанция 👑", "ZH": "我就是至高无上的存在 👑", - "isReviewed": "True", + "isReviewed": "True" }, "Customize System Proxy Bypass Address": { - "source": ["Furious.Window.ProxyBypassDialog"], + "source": [ + "Furious.Window.ProxyBypassDialog" + ], "RU": "Настроить адреса исключений системного прокси", "ZH": "自定义系统代理绕过地址", - "isReviewed": "True", + "isReviewed": "True" }, "Customize System Proxy Bypass Address...": { - "source": ["Furious.Window.SettingsPage"], + "source": [ + "Furious.Window.SettingsPage" + ], "RU": "Настроить адреса исключений системного прокси...", "ZH": "自定义系统代理绕过地址...", - "isReviewed": "True", + "isReviewed": "True" }, "Reset": { "source": [ "Furious.Window.NetworkTestDialog", - "Furious.Window.ProxyBypassDialog", + "Furious.Window.ProxyBypassDialog" ], "RU": "Сбросить", "ZH": "重置", - "isReviewed": "True", + "isReviewed": "True" }, "Enter system proxy bypass address (separated by semicolons):": { - "source": ["Furious.Window.ProxyBypassDialog"], + "source": [ + "Furious.Window.ProxyBypassDialog" + ], "RU": "Введите адреса исключений системного прокси (через точку с запятой):", "ZH": "输入系统代理绕过地址(以分号分隔):", - "isReviewed": "True", + "isReviewed": "True" }, "Customize Network Test URL": { - "source": ["Furious.Window.NetworkTestDialog"], + "source": [ + "Furious.Window.NetworkTestDialog" + ], "RU": "Настроить URL теста сети", "ZH": "自定义网络测试URL", - "isReviewed": "True", + "isReviewed": "True" }, "Customize Network Test URL...": { - "source": ["Furious.Window.SettingsPage"], + "source": [ + "Furious.Window.SettingsPage" + ], "RU": "Настроить URL теста сети...", "ZH": "自定义网络测试URL...", - "isReviewed": "True", + "isReviewed": "True" }, "Enter network speed test URL:": { - "source": ["Furious.Window.NetworkTestDialog"], + "source": [ + "Furious.Window.NetworkTestDialog" + ], "RU": "Введите URL теста скорости сети:", "ZH": "输入网络速度测试URL:", - "isReviewed": "True", + "isReviewed": "True" }, "Enter network connectivity test URL:": { - "source": ["Furious.Window.NetworkTestDialog"], + "source": [ + "Furious.Window.NetworkTestDialog" + ], "RU": "Введите URL теста подключения к сети:", "ZH": "输入网络连通性测试URL:", - "isReviewed": "True", + "isReviewed": "True" }, "Activate Selected Server": { - "source": ["Furious.Widget.ServerTableView"], + "source": [ + "Furious.Widget.ServerTableView" + ], "RU": "Активировать выбранный сервер", "ZH": "激活选定的服务器", - "isReviewed": "True", + "isReviewed": "True" }, "Search servers with text or regex, e.g. trojan, hk|jp, ^vmess, (us|sg).*tls": { - "source": ["Furious.Window.HomePage"], + "source": [ + "Furious.Window.HomePage" + ], "RU": "Поиск серверов по тексту или регулярному выражению, например: trojan, hk|jp, ^vmess, (us|sg).*tls", "ZH": "使用文本或正则表达式搜索服务器,例如:trojan、hk|jp、^vmess、(us|sg).*tls", - "isReviewed": "True", + "isReviewed": "True" }, "Search": { - "source": ["Furious.Window.HomePage"], + "source": [ + "Furious.Window.HomePage" + ], "RU": "Поиск", "ZH": "查找", - "isReviewed": "True", + "isReviewed": "True" }, "Network OK": { - "source": ["Furious.Window.HomePage"], + "source": [ + "Furious.Window.HomePage" + ], "RU": "Сеть работает", "ZH": "网络正常", - "isReviewed": "True", + "isReviewed": "True" }, "Network error": { - "source": ["Furious.Window.HomePage"], + "source": [ + "Furious.Window.HomePage" + ], "RU": "Ошибка сети", "ZH": "网络异常", - "isReviewed": "True", + "isReviewed": "True" }, "Canceling import": { - "source": ["Furious.Actions.Import"], + "source": [ + "Furious.Actions.Import" + ], "RU": "Отмена импорта", "ZH": "正在取消导入", - "isReviewed": "True", + "isReviewed": "True" }, "Importing": { - "source": ["Furious.Actions.Import"], + "source": [ + "Furious.Actions.Import" + ], "RU": "Импортирование", "ZH": "正在导入", - "isReviewed": "True", + "isReviewed": "True" }, "Current": { - "source": ["Furious.Actions.Import", "Furious.Widget.ServerTableView"], + "source": [ + "Furious.Actions.Import", + "Furious.Widget.ServerTableView" + ], "RU": "Текущий", "ZH": "当前", - "isReviewed": "True", + "isReviewed": "True" }, "Canceling delete": { - "source": ["Furious.Widget.ServerTableView"], + "source": [ + "Furious.Widget.ServerTableView" + ], "RU": "Отмена удаления", "ZH": "正在取消删除", - "isReviewed": "True", + "isReviewed": "True" }, "Deleting": { - "source": ["Furious.Widget.ServerTableView"], + "source": [ + "Furious.Widget.ServerTableView" + ], "RU": "Удаление", "ZH": "正在删除", - "isReviewed": "True", + "isReviewed": "True" }, "Edit Routing Rule": { - "source": ["Furious.Backends.Xray.RoutingWindow"], + "source": [ + "Furious.Backends.Xray.RoutingWindow" + ], "RU": "Редактировать правило маршрутизации", "ZH": "编辑路由规则", - "isReviewed": "True", + "isReviewed": "True" }, "Domain (one per line or comma-separated)": { - "source": ["Furious.Backends.Xray.RoutingWindow"], + "source": [ + "Furious.Backends.Xray.RoutingWindow" + ], "RU": "Domain (по одному в строке или через запятую)", "ZH": "Domain(每行一个或以逗号分隔)", - "isReviewed": "True", + "isReviewed": "True" }, "IP (one per line or comma-separated)": { - "source": ["Furious.Backends.Xray.RoutingWindow"], + "source": [ + "Furious.Backends.Xray.RoutingWindow" + ], "RU": "IP (по одному в строке или через запятую)", "ZH": "IP(每行一个或以逗号分隔)", - "isReviewed": "True", + "isReviewed": "True" }, "Port (comma/range, e.g. 53,443,1000-2000)": { - "source": ["Furious.Backends.Xray.RoutingWindow"], + "source": [ + "Furious.Backends.Xray.RoutingWindow" + ], "RU": "Port (через запятую/диапазон, например: 53,443,1000-2000)", "ZH": "Port(逗号/范围,例如:53,443,1000-2000)", - "isReviewed": "True", + "isReviewed": "True" }, "VLESS Route (comma/range, e.g. 53,443,1000-2000)": { - "source": ["Furious.Backends.Xray.RoutingWindow"], + "source": [ + "Furious.Backends.Xray.RoutingWindow" + ], "RU": "VLESS Route (через запятую/диапазон, например: 53,443,1000-2000)", "ZH": "VLESS Route(逗号/范围,例如:53,443,1000-2000)", - "isReviewed": "True", + "isReviewed": "True" }, "Source IP (one per line or comma-separated)": { - "source": ["Furious.Backends.Xray.RoutingWindow"], + "source": [ + "Furious.Backends.Xray.RoutingWindow" + ], "RU": "Source IP (по одному в строке или через запятую)", "ZH": "Source IP(每行一个或以逗号分隔)", - "isReviewed": "True", + "isReviewed": "True" }, "Source Port (comma/range, e.g. 53,443,1000-2000)": { - "source": ["Furious.Backends.Xray.RoutingWindow"], + "source": [ + "Furious.Backends.Xray.RoutingWindow" + ], "RU": "Source Port (через запятую/диапазон, например: 53,443,1000-2000)", "ZH": "Source Port(逗号/范围,例如:53,443,1000-2000)", - "isReviewed": "True", + "isReviewed": "True" }, "Local IP (one per line or comma-separated)": { - "source": ["Furious.Backends.Xray.RoutingWindow"], + "source": [ + "Furious.Backends.Xray.RoutingWindow" + ], "RU": "Local IP (по одному в строке или через запятую)", "ZH": "Local IP(每行一个或以逗号分隔)", - "isReviewed": "True", + "isReviewed": "True" }, "Local Port (comma/range, e.g. 53,443,1000-2000)": { - "source": ["Furious.Backends.Xray.RoutingWindow"], + "source": [ + "Furious.Backends.Xray.RoutingWindow" + ], "RU": "Local Port (через запятую/диапазон, например: 53,443,1000-2000)", "ZH": "Local Port(逗号/范围,例如:53,443,1000-2000)", - "isReviewed": "True", + "isReviewed": "True" }, "User (one per line or comma-separated)": { - "source": ["Furious.Backends.Xray.RoutingWindow"], + "source": [ + "Furious.Backends.Xray.RoutingWindow" + ], "RU": "User (по одному в строке или через запятую)", "ZH": "User(每行一个或以逗号分隔)", - "isReviewed": "True", + "isReviewed": "True" }, "Inbound Tag (one per line or comma-separated)": { - "source": ["Furious.Backends.Xray.RoutingWindow"], + "source": [ + "Furious.Backends.Xray.RoutingWindow" + ], "RU": "Inbound Tag (по одному в строке или через запятую)", "ZH": "Inbound Tag(每行一个或以逗号分隔)", - "isReviewed": "True", + "isReviewed": "True" }, "Process (one per line or comma-separated)": { - "source": ["Furious.Backends.Xray.RoutingWindow"], + "source": [ + "Furious.Backends.Xray.RoutingWindow" + ], "RU": "Process (по одному в строке или через запятую)", "ZH": "Process(每行一个或以逗号分隔)", - "isReviewed": "True", + "isReviewed": "True" }, "Protocol (one per line or comma-separated)": { - "source": ["Furious.Backends.Xray.RoutingWindow"], + "source": [ + "Furious.Backends.Xray.RoutingWindow" + ], "RU": "Protocol (по одному в строке или через запятую)", "ZH": "Protocol(每行一个或以逗号分隔)", - "isReviewed": "True", + "isReviewed": "True" }, "Edit Routing Remark": { - "source": ["Furious.Backends.Xray.RoutingWindow"], + "source": [ + "Furious.Backends.Xray.RoutingWindow" + ], "RU": "Редактировать примечание к маршруту", "ZH": "编辑路由备注", - "isReviewed": "True", + "isReviewed": "True" }, "Add Routing": { - "source": ["Furious.Backends.Xray.RoutingWindow"], + "source": [ + "Furious.Backends.Xray.RoutingWindow" + ], "RU": "Добавить маршрут", "ZH": "添加路由", - "isReviewed": "True", + "isReviewed": "True" }, "Routing Rules": { - "source": ["Furious.Backends.Xray.RoutingWindow"], + "source": [ + "Furious.Backends.Xray.RoutingWindow" + ], "RU": "Правила маршрутизации", "ZH": "路由规则", - "isReviewed": "True", + "isReviewed": "True" }, "Edit Routing": { - "source": ["Furious.Backends.Xray.RoutingWindow"], + "source": [ + "Furious.Backends.Xray.RoutingWindow" + ], "RU": "Редактировать маршрут", "ZH": "编辑路由", - "isReviewed": "True", + "isReviewed": "True" }, "Edit Text": { - "source": ["Furious.Backends.Xray.RoutingWindow"], + "source": [ + "Furious.Backends.Xray.RoutingWindow" + ], "RU": "Редактировать текст", "ZH": "编辑文本", - "isReviewed": "True", + "isReviewed": "True" }, "Rename": { - "source": ["Furious.Backends.Xray.RoutingWindow"], + "source": [ + "Furious.Backends.Xray.RoutingWindow" + ], "RU": "Переименовать", "ZH": "重命名", - "isReviewed": "True", + "isReviewed": "True" }, "Double-click to enlarge": { - "source": ["Furious.Backends.Xray.RoutingWindow"], + "source": [ + "Furious.Backends.Xray.RoutingWindow" + ], "RU": "Дважды щёлкните, чтобы увеличить", "ZH": "双击放大", - "isReviewed": "True", + "isReviewed": "True" }, "State": { - "source": ["Furious.Backends.Xray.RoutingWindow"], + "source": [ + "Furious.Backends.Xray.RoutingWindow" + ], "RU": "Состояние", "ZH": "状态", - "isReviewed": "True", + "isReviewed": "True" }, "Enabled": { "source": [ "Furious.Backends.Xray.RoutingWindow", "Furious.Widget.SubscriptionTableView", - "Furious.Window.SubscriptionPage", + "Furious.Window.SubscriptionPage" ], "RU": "Включено", "ZH": "已启用", - "isReviewed": "True", + "isReviewed": "True" }, "Disabled": { "source": [ "Furious.Backends.Xray.RoutingWindow", - "Furious.Widget.SubscriptionTableView", + "Furious.Widget.SubscriptionTableView" ], "RU": "Отключено", "ZH": "已禁用", - "isReviewed": "True", + "isReviewed": "True" }, "New Routing": { - "source": ["Furious.Backends.Xray.RoutingWindow"], + "source": [ + "Furious.Backends.Xray.RoutingWindow" + ], "RU": "Новый маршрут", "ZH": "新路由", - "isReviewed": "True", + "isReviewed": "True" }, "Routing Documentation": { - "source": ["Furious.Backends.Xray.RoutingWindow"], + "source": [ + "Furious.Backends.Xray.RoutingWindow" + ], "RU": "Документация по маршрутизации", "ZH": "路由文档", - "isReviewed": "True", + "isReviewed": "True" }, "Preview Routing": { - "source": ["Furious.Backends.Xray.RoutingWindow"], + "source": [ + "Furious.Backends.Xray.RoutingWindow" + ], "RU": "Предпросмотр маршрутизации", "ZH": "预览路由", - "isReviewed": "True", + "isReviewed": "True" }, "OutBound (e.g. proxy/direct/block)": { - "source": ["Furious.Backends.Xray.RoutingWindow"], + "source": [ + "Furious.Backends.Xray.RoutingWindow" + ], "RU": "OutBound (например: proxy/direct/block)", "ZH": "OutBound(例如:proxy/direct/block)", - "isReviewed": "True", + "isReviewed": "True" }, "Preview": { - "source": ["Furious.Backends.Xray.RoutingWindow"], + "source": [ + "Furious.Backends.Xray.RoutingWindow" + ], "RU": "Предпросмотр", "ZH": "预览", - "isReviewed": "True", + "isReviewed": "True" }, "Close": { "source": [ "Furious.Backends.Xray.RoutingWindow", - "Furious.Window.TextEditorWindow", + "Furious.Window.TextEditorWindow" ], "RU": "Закрыть", "ZH": "关闭", - "isReviewed": "True", + "isReviewed": "True" }, "Generate": { "source": [ "Furious.Backends.Xray.VlessEditor", - "Furious.Backends.Xray.VmessEditor", + "Furious.Backends.Xray.VmessEditor" ], "RU": "Сгенерировать", "ZH": "生成", - "isReviewed": "True", + "isReviewed": "True" }, "Username": { - "source": ["Furious.Backends.Xray.SocksEditor"], + "source": [ + "Furious.Backends.Xray.SocksEditor" + ], "RU": "Имя пользователя", "ZH": "用户名", - "isReviewed": "True", + "isReviewed": "True" }, "Manage Xray-core Asset File...": { - "source": ["Furious.Backends.Xray.Plugin"], + "source": [ + "Furious.Backends.Xray.Plugin" + ], "RU": "Управление файлами ресурсов Xray-core...", "ZH": "管理Xray-core资源文件...", - "isReviewed": "True", + "isReviewed": "True" }, "Edit Routing...": { - "source": ["Furious.Backends.Xray.Plugin"], + "source": [ + "Furious.Backends.Xray.Plugin" + ], "RU": "Редактировать маршрут...", "ZH": "编辑路由...", - "isReviewed": "True", + "isReviewed": "True" }, "Add VMess Server...": { - "source": ["Furious.Backends.Xray.Protocols"], + "source": [ + "Furious.Backends.Xray.Protocols" + ], "RU": "Добавить сервер VMess...", "ZH": "添加VMess服务器...", - "isReviewed": "True", + "isReviewed": "True" }, "Add VLESS Server...": { - "source": ["Furious.Backends.Xray.Protocols"], + "source": [ + "Furious.Backends.Xray.Protocols" + ], "RU": "Добавить сервер VLESS...", "ZH": "添加VLESS服务器...", - "isReviewed": "True", + "isReviewed": "True" }, "Add Shadowsocks Server...": { - "source": ["Furious.Backends.Xray.Protocols"], + "source": [ + "Furious.Backends.Xray.Protocols" + ], "RU": "Добавить сервер Shadowsocks...", "ZH": "添加Shadowsocks服务器...", - "isReviewed": "True", + "isReviewed": "True" }, "Add Trojan Server...": { - "source": ["Furious.Backends.Xray.Protocols"], + "source": [ + "Furious.Backends.Xray.Protocols" + ], "RU": "Добавить сервер Trojan...", "ZH": "添加Trojan服务器...", - "isReviewed": "True", + "isReviewed": "True" }, "Add Hysteria1 Server...": { - "source": ["Furious.Backends.Hysteria1.Protocols"], + "source": [ + "Furious.Backends.Hysteria1.Protocols" + ], "RU": "Добавить сервер Hysteria 1...", "ZH": "添加Hysteria1服务器...", - "isReviewed": "True", + "isReviewed": "True" }, "Add Hysteria2 Server...": { - "source": ["Furious.Backends.Hysteria2.Protocols"], + "source": [ + "Furious.Backends.Hysteria2.Protocols" + ], "RU": "Добавить сервер Hysteria 2...", "ZH": "添加Hysteria2服务器...", - "isReviewed": "True", + "isReviewed": "True" }, "Add SOCKS Server...": { - "source": ["Furious.Backends.Xray.Protocols"], + "source": [ + "Furious.Backends.Xray.Protocols" + ], "RU": "Добавить сервер SOCKS...", "ZH": "添加SOCKS服务器...", - "isReviewed": "True", + "isReviewed": "True" }, "Interface": { "source": [ "Furious.Backends.Hysteria2.TunSettingsDialog", - "Furious.Backends.Xray.TunSettingsDialog", + "Furious.Backends.Xray.TunSettingsDialog" ], "RU": "Интерфейс", "ZH": "接口", - "isReviewed": "True", + "isReviewed": "True" }, "Network": { "source": [ "Furious.Backends.Hysteria2.TunSettingsDialog", - "Furious.Backends.Xray.TunSettingsDialog", + "Furious.Backends.Xray.TunSettingsDialog" ], "RU": "Сеть", "ZH": "网络", - "isReviewed": "True", + "isReviewed": "True" }, "Use Xray-core TUN": { - "source": ["Furious.Backends.Xray.Plugin"], + "source": [ + "Furious.Backends.Xray.Plugin" + ], "RU": "Использовать TUN Xray-core", "ZH": "使用Xray-core TUN", - "isReviewed": "True", + "isReviewed": "True" }, "Customize Xray-core TUN Settings": { - "source": ["Furious.Backends.Xray.TunSettingsDialog"], + "source": [ + "Furious.Backends.Xray.TunSettingsDialog" + ], "RU": "Настроить параметры TUN Xray-core", "ZH": "自定义Xray-core TUN设置", - "isReviewed": "True", + "isReviewed": "True" }, "Customize Xray-core TUN Settings...": { - "source": ["Furious.Backends.Xray.Plugin"], + "source": [ + "Furious.Backends.Xray.Plugin" + ], "RU": "Настроить параметры TUN Xray-core...", "ZH": "自定义Xray-core TUN设置...", - "isReviewed": "True", + "isReviewed": "True" }, "Gateway (separated by commas)": { - "source": ["Furious.Backends.Xray.TunSettingsDialog"], + "source": [ + "Furious.Backends.Xray.TunSettingsDialog" + ], "RU": "Gateway (через запятую)", "ZH": "Gateway(以逗号分隔)", - "isReviewed": "True", + "isReviewed": "True" }, "DNS (separated by commas)": { - "source": ["Furious.Backends.Xray.TunSettingsDialog"], + "source": [ + "Furious.Backends.Xray.TunSettingsDialog" + ], "RU": "DNS (через запятую)", "ZH": "DNS(以逗号分隔)", - "isReviewed": "True", + "isReviewed": "True" }, "AutoSystemRoutingTable (separated by commas)": { - "source": ["Furious.Backends.Xray.TunSettingsDialog"], + "source": [ + "Furious.Backends.Xray.TunSettingsDialog" + ], "RU": "AutoSystemRoutingTable (через запятую)", "ZH": "AutoSystemRoutingTable(以逗号分隔)", - "isReviewed": "True", + "isReviewed": "True" }, "TUN Documentation": { "source": [ "Furious.Backends.Hysteria2.TunSettingsDialog", - "Furious.Backends.Xray.TunSettingsDialog", + "Furious.Backends.Xray.TunSettingsDialog" ], "RU": "Документация TUN", "ZH": "TUN文档", - "isReviewed": "True", + "isReviewed": "True" }, "Use Hysteria2 TUN": { - "source": ["Furious.Backends.Hysteria2.Plugin"], + "source": [ + "Furious.Backends.Hysteria2.Plugin" + ], "RU": "Использовать TUN Hysteria2", "ZH": "使用Hysteria2 TUN", - "isReviewed": "True", + "isReviewed": "True" }, "Customize Hysteria2 TUN Settings": { - "source": ["Furious.Backends.Hysteria2.TunSettingsDialog"], + "source": [ + "Furious.Backends.Hysteria2.TunSettingsDialog" + ], "RU": "Настроить параметры TUN Hysteria2", "ZH": "自定义Hysteria2 TUN设置", - "isReviewed": "True", + "isReviewed": "True" }, "Customize Hysteria2 TUN Settings...": { - "source": ["Furious.Backends.Hysteria2.Plugin"], + "source": [ + "Furious.Backends.Hysteria2.Plugin" + ], "RU": "Настроить параметры TUN Hysteria2...", "ZH": "自定义Hysteria2 TUN设置...", - "isReviewed": "True", + "isReviewed": "True" }, "Log Type": { - "source": ["Furious.Window.LogPage"], + "source": [ + "Furious.Window.LogPage" + ], "RU": "Тип журнала", "ZH": "日志类型", - "isReviewed": "True", + "isReviewed": "True" }, "Application": { - "source": ["Furious.Window.LogPage", "Furious.Window.SettingsPage"], + "source": [ + "Furious.Window.LogPage", + "Furious.Window.SettingsPage" + ], "RU": "Приложение", "ZH": "应用程序", - "isReviewed": "True", + "isReviewed": "True" }, "All Logs": { - "source": ["Furious.Window.LogPage"], + "source": [ + "Furious.Window.LogPage" + ], "RU": "Все журналы", "ZH": "全部日志", - "isReviewed": "True", + "isReviewed": "True" }, "Upload Speed": { - "source": ["Furious.Window.HomePage", "Furious.Window.MetricsPage"], + "source": [ + "Furious.Window.HomePage", + "Furious.Window.MetricsPage" + ], "RU": "Скорость отдачи", "ZH": "上传速度", - "isReviewed": "True", + "isReviewed": "True" }, "Download Speed": { - "source": ["Furious.Window.HomePage", "Furious.Window.MetricsPage"], + "source": [ + "Furious.Window.HomePage", + "Furious.Window.MetricsPage" + ], "RU": "Скорость загрузки", "ZH": "下载速度", - "isReviewed": "True", + "isReviewed": "True" }, "Upload Traffic Usage": { - "source": ["Furious.Window.HomePage", "Furious.Window.MetricsPage"], + "source": [ + "Furious.Window.HomePage", + "Furious.Window.MetricsPage" + ], "RU": "Объём исходящего трафика", "ZH": "上传流量", - "isReviewed": "True", + "isReviewed": "True" }, "Download Traffic Usage": { - "source": ["Furious.Window.HomePage", "Furious.Window.MetricsPage"], + "source": [ + "Furious.Window.HomePage", + "Furious.Window.MetricsPage" + ], "RU": "Объём входящего трафика", "ZH": "下载流量", - "isReviewed": "True", + "isReviewed": "True" }, "Metrics": { - "source": ["Furious.Window.MainWindow"], + "source": [ + "Furious.Window.MainWindow" + ], "RU": "Метрики", "ZH": "指标", - "isReviewed": "True", + "isReviewed": "True" }, "Network Metrics": { - "source": ["Furious.Window.MetricsPage"], + "source": [ + "Furious.Window.MetricsPage" + ], "RU": "Сетевые метрики", "ZH": "网络指标", - "isReviewed": "True", + "isReviewed": "True" }, "Time Range": { - "source": ["Furious.Window.MetricsPage"], + "source": [ + "Furious.Window.MetricsPage" + ], "RU": "Временной диапазон", "ZH": "时间范围", - "isReviewed": "True", + "isReviewed": "True" }, "Granularity": { - "source": ["Furious.Window.MetricsPage"], + "source": [ + "Furious.Window.MetricsPage" + ], "RU": "Детализация", "ZH": "粒度", - "isReviewed": "True", + "isReviewed": "True" }, "Download": { - "source": ["Furious.Window.MetricsPage"], + "source": [ + "Furious.Window.MetricsPage" + ], "RU": "Загрузка", "ZH": "下载", - "isReviewed": "True", + "isReviewed": "True" }, "Upload": { - "source": ["Furious.Window.MetricsPage"], + "source": [ + "Furious.Window.MetricsPage" + ], "RU": "Отдача", "ZH": "上传", - "isReviewed": "True", + "isReviewed": "True" }, "Last 5 minutes": { - "source": ["Furious.Window.MetricsPage"], + "source": [ + "Furious.Window.MetricsPage" + ], "RU": "Последние 5 минут", "ZH": "最近 5 分钟", - "isReviewed": "True", + "isReviewed": "True" }, "Last 15 minutes": { - "source": ["Furious.Window.MetricsPage"], + "source": [ + "Furious.Window.MetricsPage" + ], "RU": "Последние 15 минут", "ZH": "最近 15 分钟", - "isReviewed": "True", + "isReviewed": "True" }, "Last hour": { - "source": ["Furious.Window.MetricsPage"], + "source": [ + "Furious.Window.MetricsPage" + ], "RU": "Последний час", "ZH": "最近 1 小时", - "isReviewed": "True", + "isReviewed": "True" }, "Last 6 hours": { - "source": ["Furious.Window.MetricsPage"], + "source": [ + "Furious.Window.MetricsPage" + ], "RU": "Последние 6 часов", "ZH": "最近 6 小时", - "isReviewed": "True", + "isReviewed": "True" }, "Last 24 hours": { - "source": ["Furious.Window.MetricsPage"], + "source": [ + "Furious.Window.MetricsPage" + ], "RU": "Последние 24 часа", "ZH": "最近 24 小时", - "isReviewed": "True", + "isReviewed": "True" }, "Auto": { - "source": ["Furious.Window.MetricsPage"], + "source": [ + "Furious.Window.MetricsPage" + ], "RU": "Авто", "ZH": "自动", - "isReviewed": "True", + "isReviewed": "True" }, "2 seconds": { - "source": ["Furious.Window.MetricsPage"], + "source": [ + "Furious.Window.MetricsPage" + ], "RU": "2 секунды", "ZH": "2 秒", - "isReviewed": "True", + "isReviewed": "True" }, "10 seconds": { - "source": ["Furious.Window.MetricsPage"], + "source": [ + "Furious.Window.MetricsPage" + ], "RU": "10 секунд", "ZH": "10 秒", - "isReviewed": "True", + "isReviewed": "True" }, "1 minute": { - "source": ["Furious.Window.MetricsPage"], + "source": [ + "Furious.Window.MetricsPage" + ], "RU": "1 минута", "ZH": "1 分钟", - "isReviewed": "True", + "isReviewed": "True" }, "5 minutes": { - "source": ["Furious.Window.MetricsPage"], + "source": [ + "Furious.Window.MetricsPage" + ], "RU": "5 минут", "ZH": "5 分钟", - "isReviewed": "True", + "isReviewed": "True" }, "Now": { - "source": ["Furious.Widget.MetricsGraph"], + "source": [ + "Furious.Widget.MetricsGraph" + ], "RU": "Сейчас", "ZH": "现在", - "isReviewed": "True", + "isReviewed": "True" }, "Waiting for network statistics": { - "source": ["Furious.Widget.MetricsGraph"], + "source": [ + "Furious.Widget.MetricsGraph" + ], "RU": "Ожидание сетевой статистики", "ZH": "正在等待网络统计数据", - "isReviewed": "True", + "isReviewed": "True" }, "General": { - "source": ["Furious.Window.SettingsPage"], + "source": [ + "Furious.Window.SettingsPage" + ], "RU": "Общие", "ZH": "常规", - "isReviewed": "True", + "isReviewed": "True" }, "Connection and Interface": { - "source": ["Furious.Window.SettingsPage"], + "source": [ + "Furious.Window.SettingsPage" + ], "RU": "Подключение и интерфейс", "ZH": "连接和接口", - "isReviewed": "True", + "isReviewed": "True" }, "Hysteria2 Traffic Statistics": { - "source": ["Furious.Backends.Hysteria2.Plugin"], + "source": [ + "Furious.Backends.Hysteria2.Plugin" + ], "RU": "Статистика трафика Hysteria2", "ZH": "Hysteria2流量统计", - "isReviewed": "True", + "isReviewed": "True" }, "Route system traffic through the active proxy connection.": { - "source": ["Furious.Window.SettingsPage"], + "source": [ + "Furious.Window.SettingsPage" + ], "RU": "Направлять системный трафик через активное прокси-подключение.", "ZH": "通过当前代理连接路由系统流量。", - "isReviewed": "True", + "isReviewed": "True" }, "Use the application dark theme instead of automatic appearance.": { - "source": ["Furious.Window.SettingsPage"], + "source": [ + "Furious.Window.SettingsPage" + ], "RU": "Использовать тёмную тему приложения вместо автоматического оформления.", "ZH": "使用应用程序深色主题,而不跟随自动外观。", - "isReviewed": "True", + "isReviewed": "True" }, "Choose the language used by the application interface.": { - "source": ["Furious.Window.SettingsPage"], + "source": [ + "Furious.Window.SettingsPage" + ], "RU": "Выберите язык интерфейса приложения.", "ZH": "选择应用程序界面使用的语言。", - "isReviewed": "True", + "isReviewed": "True" }, "Use a theme-aware single-color system tray icon.": { - "source": ["Furious.Window.SettingsPage"], + "source": [ + "Furious.Window.SettingsPage" + ], "RU": "Использовать одноцветный значок в системном трее с учётом темы.", "ZH": "使用适配主题的单色系统托盘图标。", - "isReviewed": "True", + "isReviewed": "True" }, "Start the application automatically after signing in.": { - "source": ["Furious.Window.SettingsPage"], + "source": [ + "Furious.Window.SettingsPage" + ], "RU": "Автоматически запускать приложение после входа в систему.", "ZH": "登录系统后自动启动应用程序。", - "isReviewed": "True", + "isReviewed": "True" }, "Reduce background activity when the application is idle.": { - "source": ["Furious.Window.SettingsPage"], + "source": [ + "Furious.Window.SettingsPage" + ], "RU": "Снижать фоновую активность, когда приложение не используется.", "ZH": "应用程序空闲时减少后台活动。", - "isReviewed": "True", + "isReviewed": "True" }, "Keep the application available from the menu bar only.": { - "source": ["Furious.Window.SettingsPage"], + "source": [ + "Furious.Window.SettingsPage" + ], "RU": "Оставлять приложение доступным только из строки меню.", "ZH": "仅通过菜单栏保留应用程序入口。", - "isReviewed": "True", + "isReviewed": "True" }, "Open": { - "source": ["Furious.Window.SettingsPage"], + "source": [ + "Furious.Window.SettingsPage" + ], "RU": "Открыть", "ZH": "打开", - "isReviewed": "True", + "isReviewed": "True" }, "Configure the external Tun2socks network interface and routing.": { - "source": ["Furious.Window.SettingsPage"], + "source": [ + "Furious.Window.SettingsPage" + ], "RU": "Настройте внешний сетевой интерфейс Tun2socks и маршрутизацию.", "ZH": "配置外部Tun2socks网络接口和路由。", - "isReviewed": "True", + "isReviewed": "True" }, "Choose destinations that bypass the operating system proxy.": { - "source": ["Furious.Window.SettingsPage"], + "source": [ + "Furious.Window.SettingsPage" + ], "RU": "Выберите адреса, которые обходят системный прокси.", "ZH": "选择绕过操作系统代理的目标地址。", - "isReviewed": "True", + "isReviewed": "True" }, "Choose the URL used for download speed tests.": { - "source": ["Furious.Window.SettingsPage"], + "source": [ + "Furious.Window.SettingsPage" + ], "RU": "Выберите URL для тестов скорости загрузки.", "ZH": "选择下载速度测试使用的URL。", - "isReviewed": "True", + "isReviewed": "True" }, "Use the IPv4 loopback address when configuring the system proxy.": { - "source": ["Furious.Window.SettingsPage"], + "source": [ + "Furious.Window.SettingsPage" + ], "RU": "Использовать IPv4-адрес обратной петли при настройке системного прокси.", "ZH": "配置系统代理时使用IPv4回环地址。", - "isReviewed": "True", + "isReviewed": "True" }, "Show connection progress while proxy services are starting.": { - "source": ["Furious.Window.SettingsPage"], + "source": [ + "Furious.Window.SettingsPage" + ], "RU": "Показывать ход подключения во время запуска прокси-служб.", "ZH": "代理服务启动时显示连接进度。", - "isReviewed": "True", + "isReviewed": "True" }, "Display whitespace markers in configuration editors.": { - "source": ["Furious.Window.SettingsPage"], + "source": [ + "Furious.Window.SettingsPage" + ], "RU": "Показывать маркеры пробелов в редакторах конфигурации.", "ZH": "在配置编辑器中显示空白字符标记。", - "isReviewed": "True", + "isReviewed": "True" }, "Keep supported proxy-core data files up to date.": { - "source": ["Furious.Window.SettingsPage"], + "source": [ + "Furious.Window.SettingsPage" + ], "RU": "Поддерживать файлы данных прокси-ядер в актуальном состоянии.", "ZH": "保持受支持的代理核心数据文件为最新版本。", - "isReviewed": "True", + "isReviewed": "True" }, "Traffic Stats API URL": { - "source": ["Furious.Backends.Hysteria2.Plugin"], + "source": [ + "Furious.Backends.Hysteria2.Plugin" + ], "RU": "URL API статистики трафика", "ZH": "流量统计API URL", - "isReviewed": "True", + "isReviewed": "True" }, "Hysteria2 server API address; /traffic is appended automatically.": { - "source": ["Furious.Backends.Hysteria2.Plugin"], + "source": [ + "Furious.Backends.Hysteria2.Plugin" + ], "RU": "Адрес API сервера Hysteria2; /traffic добавляется автоматически.", "ZH": "Hysteria2服务器API地址;将自动附加 /traffic。", - "isReviewed": "True", + "isReviewed": "True" }, "Traffic Stats Client ID": { - "source": ["Furious.Backends.Hysteria2.Plugin"], + "source": [ + "Furious.Backends.Hysteria2.Plugin" + ], "RU": "Идентификатор клиента статистики", "ZH": "流量统计客户端ID", - "isReviewed": "True", + "isReviewed": "True" }, "Traffic Stats API Secret": { - "source": ["Furious.Backends.Hysteria2.Plugin"], + "source": [ + "Furious.Backends.Hysteria2.Plugin" + ], "RU": "Секрет API статистики трафика", "ZH": "流量统计API密钥", - "isReviewed": "True", + "isReviewed": "True" }, "Authorization value configured by the Hysteria2 server.": { - "source": ["Furious.Backends.Hysteria2.Plugin"], + "source": [ + "Furious.Backends.Hysteria2.Plugin" + ], "RU": "Значение авторизации, настроенное на сервере Hysteria2.", "ZH": "Hysteria2服务器配置的Authorization值。", - "isReviewed": "True", + "isReviewed": "True" }, "Check": { - "source": ["Furious.Window.SettingsPage"], + "source": [ + "Furious.Window.SettingsPage" + ], "RU": "Проверить", "ZH": "检查", - "isReviewed": "True", + "isReviewed": "True" }, "Check for a newer application and proxy-core release.": { - "source": ["Furious.Window.SettingsPage"], + "source": [ + "Furious.Window.SettingsPage" + ], "RU": "Проверить наличие новой версии приложения и прокси-ядра.", "ZH": "检查应用程序和代理核心是否有新版本。", - "isReviewed": "True", + "isReviewed": "True" }, "Restart": { - "source": ["Furious.Window.SettingsPage"], + "source": [ + "Furious.Window.SettingsPage" + ], "RU": "Перезапустить", "ZH": "重新启动", - "isReviewed": "True", + "isReviewed": "True" }, "Restart with privileges required by system-level networking.": { - "source": ["Furious.Window.SettingsPage"], + "source": [ + "Furious.Window.SettingsPage" + ], "RU": "Перезапустить с правами, необходимыми для системной настройки сети.", "ZH": "使用系统级网络所需的权限重新启动。", - "isReviewed": "True", + "isReviewed": "True" }, "Open the folder containing the current application.": { - "source": ["Furious.Window.SettingsPage"], + "source": [ + "Furious.Window.SettingsPage" + ], "RU": "Открыть папку с текущим приложением.", "ZH": "打开包含当前应用程序的文件夹。", - "isReviewed": "True", + "isReviewed": "True" }, "Authentication ID reported by the Hysteria2 server.": { - "source": ["Furious.Backends.Hysteria2.Plugin"], + "source": [ + "Furious.Backends.Hysteria2.Plugin" + ], "RU": "Идентификатор аутентификации, указанный сервером Hysteria2.", "ZH": "Hysteria2服务器报告的身份验证 ID。", - "isReviewed": "True", + "isReviewed": "True" }, "Clear Traffic Usage Statistics On Reconnect": { - "source": ["Furious.Window.SettingsPage"], + "source": [ + "Furious.Window.SettingsPage" + ], "RU": "Очищать статистику трафика при переподключении", "ZH": "重新连接时清除流量使用统计", - "isReviewed": "True", + "isReviewed": "True" }, "Start accumulated upload and download usage from zero after reconnecting.": { - "source": ["Furious.Window.SettingsPage"], + "source": [ + "Furious.Window.SettingsPage" + ], "RU": "После переподключения начинать подсчёт накопленного исходящего и входящего трафика с нуля.", "ZH": "重新连接后,将累计上传和下载流量从零开始计算。", - "isReviewed": "True", + "isReviewed": "True" }, "Show Home Page...": { - "source": ["Furious.Actions.Home"], + "source": [ + "Furious.Actions.Home" + ], "RU": "Показать главную страницу...", "ZH": "显示主页...", - "isReviewed": "True", + "isReviewed": "True" }, "Show the server management Home page": { - "source": ["Furious.Actions.Home"], + "source": [ + "Furious.Actions.Home" + ], "RU": "Показать главную страницу управления серверами", "ZH": "显示服务器管理主页", - "isReviewed": "True", + "isReviewed": "True" }, "Last Updated": { - "source": ["Furious.Widget.SubscriptionTableView"], + "source": [ + "Furious.Widget.SubscriptionTableView" + ], "RU": "Последнее обновление", "ZH": "上次更新", - "isReviewed": "True", + "isReviewed": "True" }, "Profiles": { - "source": ["Furious.Widget.SubscriptionTableView"], + "source": [ + "Furious.Widget.SubscriptionTableView" + ], "RU": "Профили", "ZH": "配置文件", - "isReviewed": "True", + "isReviewed": "True" }, "Plugin Settings": { - "source": ["Furious.Window.SettingsPage"], + "source": [ + "Furious.Window.SettingsPage" + ], "RU": "Настройки плагинов", "ZH": "插件设置", - "isReviewed": "True", + "isReviewed": "True" }, "Enable Metrics Collection": { - "source": ["Furious.Window.SettingsPage"], + "source": [ + "Furious.Window.SettingsPage" + ], "RU": "Включить сбор метрик", "ZH": "启用指标收集", - "isReviewed": "True", + "isReviewed": "True" }, "Collect network speed and traffic history while connected.": { - "source": ["Furious.Window.SettingsPage"], + "source": [ + "Furious.Window.SettingsPage" + ], "RU": "Собирать историю скорости сети и трафика при подключении.", "ZH": "连接时收集网络速度和流量历史记录。", - "isReviewed": "True", + "isReviewed": "True" }, "URL": { - "source": ["Furious.Window.SubscriptionPage"], + "source": [ + "Furious.Window.SubscriptionPage" + ], "RU": "URL", "ZH": "URL", - "isReviewed": "True", + "isReviewed": "True" }, "User Agent": { - "source": ["Furious.Window.SubscriptionPage"], + "source": [ + "Furious.Window.SubscriptionPage" + ], "RU": "User-Agent", "ZH": "用户代理", - "isReviewed": "True", + "isReviewed": "True" }, "Profile Filter (Regex)": { - "source": ["Furious.Window.SubscriptionPage"], + "source": [ + "Furious.Window.SubscriptionPage" + ], "RU": "Фильтр профилей (регулярное выражение)", "ZH": "配置文件筛选器(正则表达式)", - "isReviewed": "True", + "isReviewed": "True" }, "Please enter a subscription remark.": { - "source": ["Furious.Window.SubscriptionPage"], + "source": [ + "Furious.Window.SubscriptionPage" + ], "RU": "Введите название подписки.", "ZH": "请输入订阅备注。", - "isReviewed": "True", + "isReviewed": "True" }, "Please enter a valid subscription URL.": { - "source": ["Furious.Window.SubscriptionPage"], + "source": [ + "Furious.Window.SubscriptionPage" + ], "RU": "Введите корректный URL подписки.", "ZH": "请输入有效的订阅 URL。", - "isReviewed": "True", + "isReviewed": "True" }, "Subscriptions": { - "source": ["Furious.Window.SubscriptionPage"], + "source": [ + "Furious.Window.SubscriptionPage" + ], "RU": "Подписки", "ZH": "订阅管理", - "isReviewed": "True", + "isReviewed": "True" }, "Update Using": { - "source": ["Furious.Window.SubscriptionPage"], + "source": [ + "Furious.Window.SubscriptionPage" + ], "RU": "Способ обновления", "ZH": "更新方式", - "isReviewed": "True", + "isReviewed": "True" }, "Copy URL": { - "source": ["Furious.Window.SubscriptionPage"], + "source": [ + "Furious.Window.SubscriptionPage" + ], "RU": "Копировать URL", "ZH": "复制URL", - "isReviewed": "True", + "isReviewed": "True" }, "Update Selected": { - "source": ["Furious.Window.SubscriptionPage"], + "source": [ + "Furious.Window.SubscriptionPage" + ], "RU": "Обновить выбранные", "ZH": "更新所选项", - "isReviewed": "True", + "isReviewed": "True" }, "Update All": { - "source": ["Furious.Window.SubscriptionPage"], + "source": [ + "Furious.Window.SubscriptionPage" + ], "RU": "Обновить все", "ZH": "全部更新", - "isReviewed": "True", + "isReviewed": "True" }, "Official Hysteria 2 protocol, editor, and runtime support.": { - "source": ["Furious.Backends.Hysteria2.Plugin"], + "source": [ + "Furious.Backends.Hysteria2.Plugin" + ], "RU": "Официальная поддержка протокола, редактора и среды выполнения Hysteria 2.", "ZH": "Hysteria 2官方协议、编辑器和运行时支持。", - "isReviewed": "True", + "isReviewed": "True" }, "Official Xray protocol, editor, and runtime support.": { - "source": ["Furious.Backends.Xray.Plugin"], + "source": [ + "Furious.Backends.Xray.Plugin" + ], "RU": "Официальная поддержка протокола, редактора и среды выполнения Xray.", "ZH": "Xray官方协议、编辑器和运行时支持。", - "isReviewed": "True", + "isReviewed": "True" }, "Choose whether Furious automatically configures the operating system proxy.": { - "source": ["Furious.Window.SettingsPage"], + "source": [ + "Furious.Window.SettingsPage" + ], "RU": "Выберите, должен ли Furious автоматически настраивать системный прокси.", "ZH": "选择Furious是否自动配置操作系统代理。", - "isReviewed": "True", + "isReviewed": "True" }, "Use the subscription URL from the clipboard?": { - "source": ["Furious.Window.SubscriptionPage"], + "source": [ + "Furious.Window.SubscriptionPage" + ], "RU": "Использовать URL подписки из буфера обмена?", "ZH": "是否使用剪贴板中的订阅 URL?", - "isReviewed": "True", - }, + "isReviewed": "True" + } } diff --git a/Furious/Widget/SubscriptionTableView.py b/Furious/Widget/SubscriptionTableView.py index 89b2280..518fc1c 100644 --- a/Furious/Widget/SubscriptionTableView.py +++ b/Furious/Widget/SubscriptionTableView.py @@ -20,6 +20,7 @@ from __future__ import annotations from Furious.Frozenlib import * +from Furious.Models import UJSONEncoder from Furious.Repository import * from Furious.Qt import * from Furious.Qt import gettext as _ @@ -37,26 +38,33 @@ logger = logging.getLogger(__name__) __all__ = ['SubscriptionTableView'] -# Use a versioned state key so incompatible layouts from the former table do -# not get restored onto the expanded subscription model. -SUBSCRIPTION_HEADER_STATE_SETTING = 'UserSubsHeaderViewStateV2' +# Keep the original setting names. The primary value now stores semantic widths +# instead of QHeaderView's schema-dependent opaque state. +LEGACY_SUBSCRIPTION_SECTION_SIZE_SETTING = 'SubscriptionWidgetSectionSizeTable' +SUBSCRIPTION_HEADER_STATE_SETTING = 'UserSubsHeaderViewState' + +registerAppSettings(LEGACY_SUBSCRIPTION_SECTION_SIZE_SETTING) registerAppSettings(SUBSCRIPTION_HEADER_STATE_SETTING) class SubscriptionTableHorizontalHeader(AppQHeaderView): """Provide the user subs Qt table view horizontal table header.""" - DefaultSectionSizes = (260, 420, 120, 180, 220, 180, 120) + ColumnKeys = ('remark', 'webURL', 'enabled', 'lastUpdated', 'profiles') + DefaultSectionSizes = (260, 520, 120, 220, 140) + LegacyColumnKeys = ('remark', 'webURL', 'autoupdate', 'proxy') + + # Format discriminator for the semantic JSON stored under + # UserSubsHeaderViewState. The namespace and version let us reject + # unrelated strings or a future incompatible semantic format. + StateFormat = 'Furious.SubscriptionHeaderWidths/1' def __init__(self, *args, **kwargs): """Initialize the SubscriptionTableHorizontalHeader.""" super().__init__(QtCore.Qt.Orientation.Horizontal, *args, **kwargs) - def configureSections(self, restoreSavedState: bool): - """Apply a stable interactive layout for the current column schema.""" - if restoreSavedState: - self.restoreSectionSize() - + def _configureInteractiveSections(self): + """Normalize interaction without changing the logical column order.""" self.setSectionsMovable(False) self.setCascadingSectionResizes(False) self.setMinimumSectionSize(80) @@ -66,10 +74,161 @@ class SubscriptionTableHorizontalHeader(AppQHeaderView): self.setStretchLastSection(True) - if not restoreSavedState: - for section, size in enumerate(self.DefaultSectionSizes): - if section < self.count(): - self.resizeSection(section, size) + def _applyDefaultSectionSizes(self): + """Apply balanced widths for the concise subscription table.""" + self.setStretchLastSection(False) + + for section, size in enumerate(self.DefaultSectionSizes): + if section < self.count(): + self.resizeSection(section, size) + + @classmethod + def _semanticWidths(cls, state) -> dict[str, int]: + """Decode the schema-independent header format, if present.""" + if not isinstance(state, str): + return {} + + try: + decoded = UJSONEncoder.decode(state) + except Exception: + # Any non-exit exceptions + + return {} + + if not isinstance(decoded, dict) or decoded.get('format') != cls.StateFormat: + return {} + + widths = decoded.get('widths') + + if not isinstance(widths, dict): + return {} + + return { + key: width + for key, width in widths.items() + if key in cls.ColumnKeys + and isinstance(width, (int, float)) + and not isinstance(width, bool) + and width > 0 + } + + @classmethod + def _legacyHeaderWidths(cls, state) -> dict[str, int]: + """Extract widths from a legacy Qt state without touching this header.""" + if state is None or isinstance(state, str): + return {} + + probe = QTableView() + probeModel = QStandardItemModel(0, 1, probe) + probe.setModel(probeModel) + probeHeader = probe.horizontalHeader() + + # restoreState() is intentionally used only on this disposable probe + # as a read-only, one-time compatibility path for the original + # four-column UserSubsHeaderViewState. Applying the opaque Qt state to + # the live five-column header could recreate phantom sections, legacy + # ordering, hidden state, and incompatible resize behavior. + try: + if not probeHeader.restoreState(state): + return {} + except Exception: + # Any non-exit exceptions + + return {} + + if probeHeader.count() != len(cls.LegacyColumnKeys): + return {} + + for section in range(probeHeader.count()): + probeHeader.showSection(section) + + return { + key: probeHeader.sectionSize(section) + for section, key in enumerate(cls.LegacyColumnKeys) + if key in cls.ColumnKeys and section < probeHeader.count() + } + + @classmethod + def _oldestSectionWidths(cls) -> dict[str, int]: + """Read the original index-based width table as a final fallback.""" + try: + widths = UJSONEncoder.decode( + AppSettings.get(LEGACY_SUBSCRIPTION_SECTION_SIZE_SETTING) + ) + except Exception: + # Any non-exit exceptions + + return {} + + if not isinstance(widths, dict): + return {} + + result = {} + + for section, key in enumerate(cls.LegacyColumnKeys): + width = widths.get(str(section)) + + if ( + key in cls.ColumnKeys + and isinstance(width, (int, float)) + and not isinstance(width, bool) + and width > 0 + ): + result[key] = width + + return result + + def _applyWidths(self, widths: dict[str, int]): + """Apply semantic widths to the matching logical sections.""" + for section, key in enumerate(self.ColumnKeys): + width = widths.get(key) + + if width is not None: + self.resizeSection( + section, + max(self.minimumSectionSize(), round(width)), + ) + + def configureSections(self): + """Restore semantic widths or safely read either historical format.""" + self._configureInteractiveSections() + self._applyDefaultSectionSizes() + + state = AppSettings.get(SUBSCRIPTION_HEADER_STATE_SETTING) + widths = self._semanticWidths(state) or self._legacyHeaderWidths(state) + + if not widths: + widths = self._oldestSectionWidths() + + self._applyWidths(widths) + + # Saved Qt state may contain moved, hidden, or non-interactive sections. + # It is never restored onto the live header; the current schema owns + # order and interaction behavior. + for section in range(self.count()): + self.showSection(section) + + self._configureInteractiveSections() + + def cleanup(self): + """Persist semantic widths under the established setting name.""" + # Do not use QHeaderView.saveState() here. Its opaque binary data also + # records the section count, order, visibility, and resize modes, so it + # is unsafe to restore after the table schema changes. Persist only + # widths keyed by stable field names instead. + AppSettings.set( + SUBSCRIPTION_HEADER_STATE_SETTING, + UJSONEncoder.encode( + { + 'format': self.StateFormat, + 'widths': { + key: self.sectionSize(section) + for section, key in enumerate(self.ColumnKeys) + if section < self.count() + }, + } + ), + ) class SubscriptionTableVerticalHeader(AppQHeaderView): @@ -104,20 +263,6 @@ class SubscriptionTableColumn: return self.name -class UserSubsAppQComboBox(AppQComboBox): - """Represent user subs app q combo box.""" - - def __init__(self, *args, **kwargs): - """Initialize the UserSubsAppQComboBox.""" - super().__init__(*args, **kwargs) - - def retranslate(self): - # Do not emit 'currentTextChanged' when retranslate - """Refresh translated text for the user subs app q combo box.""" - with Mixins.QBlockSignalContext(self): - super().retranslate() - - class UserSubsTableModel(QtCore.QAbstractTableModel): """Expose user subs table data through a Qt item model.""" @@ -357,10 +502,6 @@ class SubscriptionTableView(Mixins.QTranslatable, AppQTableView): 'Enabled', lambda item: 'Enabled' if item.get('enabled', True) else 'Disabled', ), - SubscriptionTableColumn('Auto Update', lambda item: item.get('autoupdate', '')), - SubscriptionTableColumn( - 'Auto Update Use Proxy', lambda item: item.get('proxy', '') - ), SubscriptionTableColumn( 'Last Updated', lambda item: item.get('lastUpdated', ''), @@ -373,8 +514,6 @@ class SubscriptionTableView(Mixins.QTranslatable, AppQTableView): 'remark', 'webURL', 'enabled', - 'autoupdate', - 'proxy', 'lastUpdated', 'profiles', ] @@ -403,10 +542,7 @@ class SubscriptionTableView(Mixins.QTranslatable, AppQTableView): self.setDefaultRowHeight(self.RowHeight) header = self.horizontalHeader() - header.configureSections( - restoreSavedState=AppSettings.get(SUBSCRIPTION_HEADER_STATE_SETTING) - is not None - ) + header.configureSections() self.setSortingEnabled(False) @@ -532,27 +668,35 @@ class SubscriptionTableView(Mixins.QTranslatable, AppQTableView): # Show the MessageBox asynchronously mbox.open() - def handleAutoUpdateComboBoxCurrentTextChanged(self, text: str, row: int): - """Handle auto update combo box current text changed.""" - textEnglish = _(text, 'EN') - + def _configureAutoUpdate(self, row: int): + """Configure one subscription timer independently of table columns.""" unique = list(Storage.UserSubs().keys())[row] subsob = Storage.UserSubs()[unique] - remark, webURL = subsob['remark'], subsob['webURL'] + remark, webURL, autoUpdate, proxy = ( + subsob['remark'], + subsob['webURL'], + subsob.get('autoupdate', ''), + subsob.get('proxy', ''), + ) try: - timems = self.AutoUpdateOptions[textEnglish] + timems = self.AutoUpdateOptions[autoUpdate] except KeyError: # Invalid key. Reset - logger.error(f'\'{textEnglish}\' is not in auto update options. Reset') + logger.error(f'\'{autoUpdate}\' is not in auto update options. Reset') - textEnglish = '' + autoUpdate = '' # Write to subs object - subsob['autoupdate'] = textEnglish + subsob['autoupdate'] = autoUpdate - timems = self.AutoUpdateOptions[textEnglish] + timems = self.AutoUpdateOptions[autoUpdate] + + if proxy not in self.ProxyOptions: + logger.error(f'\'{proxy}\' is not in proxy options. Reset') + + subsob['proxy'] = '' qtimer = self.timers[row] @@ -603,101 +747,19 @@ class SubscriptionTableView(Mixins.QTranslatable, AppQTableView): qtimer.stop() # Write to subs object - subsob['autoupdate'] = textEnglish - self.sourceModel.emitRowChanged(row, self.Headers.index('Auto Update')) - - # Return potentially fixed value - return textEnglish - - def handleProxyComboBoxCurrentTextChanged(self, text: str, row: int): - """Handle proxy combo box current text changed.""" - textEnglish = _(text, 'EN') - - unique = list(Storage.UserSubs().keys())[row] - subsob = Storage.UserSubs()[unique] - - try: - proxyFn = self.ProxyOptions[textEnglish] - except KeyError: - # Invalid key. Reset - logger.error(f'\'{textEnglish}\' is not in proxy options. Reset') - - textEnglish = '' - - # Write to subs object - subsob['proxy'] = textEnglish - - proxyFn = self.ProxyOptions[textEnglish] - - assert callable(proxyFn) - - # Write to subs object - subsob['proxy'] = textEnglish - self.sourceModel.emitRowChanged( - row, self.Headers.index('Auto Update Use Proxy') - ) - - # Return potentially fixed value - return textEnglish + subsob['autoupdate'] = autoUpdate def flushItem(self, row, column, item): """Refresh item.""" if row < 0 or row >= self.sourceModel.rowCount(): return - index = self.sourceModel.index(row, column) - - if column == self.Headers.index('Auto Update'): - header = self.Headers[column] - - newItem = UserSubsAppQComboBox(parent=self.viewport()) - newItem.addItems(list(_(key) for key in self.AutoUpdateOptions.keys())) - newItem.setFont(QFont(AppFontName())) - - itemIndex = newItem.findText( - _(self.handleAutoUpdateComboBoxCurrentTextChanged(header(item), row)) - ) - - if itemIndex >= 0: - newItem.setCurrentIndex(itemIndex) - - newItem.currentTextChanged.connect( - functools.partial( - self.handleAutoUpdateComboBoxCurrentTextChanged, - row=row, - ) - ) - - self.setIndexWidget(index, newItem) - self.sourceModel.emitRowChanged(row, column) - elif column == self.Headers.index('Auto Update Use Proxy'): - header = self.Headers[column] - - newItem = UserSubsAppQComboBox(parent=self.viewport()) - newItem.addItems(list(_(key) for key in self.ProxyOptions.keys())) - newItem.setFont(QFont(AppFontName())) - - itemIndex = newItem.findText( - _(self.handleProxyComboBoxCurrentTextChanged(header(item), row)) - ) - - if itemIndex >= 0: - newItem.setCurrentIndex(itemIndex) - - newItem.currentTextChanged.connect( - functools.partial( - self.handleProxyComboBoxCurrentTextChanged, - row=row, - ) - ) - - self.setIndexWidget(index, newItem) - self.sourceModel.emitRowChanged(row, column) - else: - self.sourceModel.emitRowChanged(row, column) + self.sourceModel.emitRowChanged(row, column) def flushRow(self, row, item): """Refresh row.""" + self._configureAutoUpdate(row) + for column in list(range(self.sourceModel.columnCount())): self.flushItem(row, column, item)