fix: add system language sup

This commit is contained in:
blagodaren 2024-12-28 08:12:46 +03:00
parent 48f9dede7b
commit 9c027b10b2
9 changed files with 554 additions and 55 deletions

12
src-tauri/Cargo.lock generated
View File

@ -1,6 +1,6 @@
# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
version = 3
version = 4
[[package]]
name = "addr2line"
@ -1074,6 +1074,7 @@ dependencies = [
"serde",
"serde_json",
"serde_yaml",
"sys-locale",
"sysinfo",
"sysproxy",
"tauri",
@ -6373,6 +6374,15 @@ dependencies = [
"syn 2.0.87",
]
[[package]]
name = "sys-locale"
version = "0.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8eab9a99a024a169fe8a903cf9d4a3b3601109bcc13bd9e3c6fff259138626c4"
dependencies = [
"libc",
]
[[package]]
name = "sysinfo"
version = "0.32.0"

View File

@ -59,6 +59,7 @@ reqwest_dav = "0.1.14"
aes-gcm = { version = "0.10.3", features = ["std"] }
base64 = "0.22.1"
getrandom = "0.2"
sys-locale = "0.3.1"
[target.'cfg(windows)'.dependencies]
runas = "=1.2.0"

View File

@ -1,6 +1,7 @@
use crate::config::DEFAULT_PAC;
use crate::config::{deserialize_encrypted, serialize_encrypted};
use crate::utils::{dirs, help};
use crate::utils::i18n;
use anyhow::Result;
use log::LevelFilter;
use serde::{Deserialize, Serialize};
@ -202,6 +203,21 @@ pub struct IVergeTheme {
}
impl IVerge {
fn get_system_language() -> String {
let sys_lang = sys_locale::get_locale()
.unwrap_or_else(|| String::from("en"))
.to_lowercase();
let lang_code = sys_lang.split(['_', '-']).next().unwrap_or("en");
let supported_languages = i18n::get_supported_languages();
if supported_languages.contains(&lang_code.to_string()) {
lang_code.to_string()
} else {
String::from("en")
}
}
pub fn new() -> Self {
match dirs::verge_path().and_then(|path| help::read_yaml::<IVerge>(&path)) {
Ok(config) => config,
@ -215,7 +231,7 @@ impl IVerge {
pub fn template() -> Self {
Self {
clash_core: Some("verge-mihomo".into()),
language: Some("zh".into()),
language: Some(Self::get_system_language()),
theme_mode: Some("system".into()),
#[cfg(not(target_os = "windows"))]
env_type: Some("bash".into()),

View File

@ -1,12 +1,14 @@
use crate::{
cmds,
config::Config,
feat, t,
feat,
utils::{
dirs,
resolve::{self, VERSION},
i18n::t,
},
};
use anyhow::Result;
use tauri::AppHandle;
use tauri::{
@ -67,7 +69,6 @@ impl Tray {
pub fn update_part() -> Result<()> {
let app_handle = handle::Handle::global().app_handle().unwrap();
let use_zh = { Config::verge().latest().language == Some("zh".into()) };
let version = VERSION.get().unwrap();
let mode = {
Config::clash()
@ -190,11 +191,11 @@ impl Tray {
let _ = tray.set_tooltip(Some(&format!(
"Clash Verge {version}\n{}: {}\n{}: {}\n{}: {}",
t!("SysProxy", "系统代理", use_zh),
t("SysProxy"),
switch_map[system_proxy],
t!("TUN", "Tun模式", use_zh),
t("TUN"),
switch_map[tun_mode],
t!("Profile", "当前订阅", use_zh),
t("Profile"),
current_profile_name
)));
Ok(())
@ -208,129 +209,116 @@ fn create_tray_menu(
tun_mode_enabled: bool,
) -> Result<tauri::menu::Menu<Wry>> {
let mode = mode.unwrap_or("");
let use_zh = { Config::verge().latest().language == Some("zh".into()) };
let version = VERSION.get().unwrap();
let open_window = &MenuItem::with_id(
app_handle,
"open_window",
t!("Dashboard", "打开面板", use_zh),
t("Dashboard"),
true,
None::<&str>,
)
.unwrap();
).unwrap();
let rule_mode = &CheckMenuItem::with_id(
app_handle,
"rule_mode",
t!("Rule Mode", "规则模式", use_zh),
t("Rule Mode"),
true,
mode == "rule",
None::<&str>,
)
.unwrap();
).unwrap();
let global_mode = &CheckMenuItem::with_id(
app_handle,
"global_mode",
t!("Global Mode", "全局模式", use_zh),
t("Global Mode"),
true,
mode == "global",
None::<&str>,
)
.unwrap();
).unwrap();
let direct_mode = &CheckMenuItem::with_id(
app_handle,
"direct_mode",
t!("Direct Mode", "直连模式", use_zh),
t("Direct Mode"),
true,
mode == "direct",
None::<&str>,
)
.unwrap();
).unwrap();
let system_proxy = &CheckMenuItem::with_id(
app_handle,
"system_proxy",
t!("System Proxy", "系统代理", use_zh),
t("System Proxy"),
true,
system_proxy_enabled,
None::<&str>,
)
.unwrap();
).unwrap();
let tun_mode = &CheckMenuItem::with_id(
app_handle,
"tun_mode",
t!("TUN Mode", "Tun模式", use_zh),
t("TUN Mode"),
true,
tun_mode_enabled,
None::<&str>,
)
.unwrap();
).unwrap();
let copy_env = &MenuItem::with_id(
app_handle,
"copy_env",
t!("Copy Env", "复制环境变量", use_zh),
t("Copy Env"),
true,
None::<&str>,
)
.unwrap();
).unwrap();
let open_app_dir = &MenuItem::with_id(
app_handle,
"open_app_dir",
t!("Conf Dir", "配置目录", use_zh),
t("Conf Dir"),
true,
None::<&str>,
)
.unwrap();
).unwrap();
let open_core_dir = &MenuItem::with_id(
app_handle,
"open_core_dir",
t!("Core Dir", "内核目录", use_zh),
t("Core Dir"),
true,
None::<&str>,
)
.unwrap();
).unwrap();
let open_logs_dir = &MenuItem::with_id(
app_handle,
"open_logs_dir",
t!("Logs Dir", "日志目录", use_zh),
t("Logs Dir"),
true,
None::<&str>,
)
.unwrap();
).unwrap();
let open_dir = &Submenu::with_id_and_items(
app_handle,
"open_dir",
t!("Open Dir", "打开目录", use_zh),
t("Open Dir"),
true,
&[open_app_dir, open_core_dir, open_logs_dir],
)
.unwrap();
).unwrap();
let restart_clash = &MenuItem::with_id(
app_handle,
"restart_clash",
t!("Restart Clash Core", "重启Clash内核", use_zh),
t("Restart Clash Core"),
true,
None::<&str>,
)
.unwrap();
).unwrap();
let restart_app = &MenuItem::with_id(
app_handle,
"restart_app",
t!("Restart App", "重启App", use_zh),
t("Restart App"),
true,
None::<&str>,
)
.unwrap();
).unwrap();
let app_version = &MenuItem::with_id(
app_handle,
@ -338,26 +326,23 @@ fn create_tray_menu(
format!("Version {version}"),
true,
None::<&str>,
)
.unwrap();
).unwrap();
let more = &Submenu::with_id_and_items(
app_handle,
"more",
t!("More", "更多", use_zh),
t("More"),
true,
&[restart_clash, restart_app, app_version],
)
.unwrap();
).unwrap();
let quit = &MenuItem::with_id(
app_handle,
"quit",
t!("Quit", "退出", use_zh),
t("Quit"),
true,
Some("CmdOrControl+Q"),
)
.unwrap();
).unwrap();
let separator = &PredefinedMenuItem::separator(app_handle).unwrap();

View File

@ -0,0 +1,59 @@
use std::{fs, path::Path};
use crate::config::Config;
use sys_locale;
pub fn get_supported_languages() -> Vec<String> {
let project_dir = Path::new(env!("CARGO_MANIFEST_DIR")).parent().unwrap();
let i18n_path = project_dir.join("src/services/i18n.ts");
if let Ok(content) = fs::read_to_string(i18n_path) {
let mut languages = Vec::new();
for line in content.lines() {
if line.contains("resources = {") {
for line in content.lines() {
if let Some(lang) = line.trim().strip_suffix(": { translation:") {
let lang = lang.trim().trim_matches('"');
if !lang.is_empty() {
languages.push(lang.to_string());
}
}
if line.contains("};") {
break;
}
}
break;
}
}
if !languages.is_empty() {
return languages;
}
}
vec!["en".to_string(), "ru".to_string(), "zh".to_string(), "fa".to_string()]
}
pub fn t(text: &str) -> String {
let config = Config::verge();
let verge = config.latest();
let current_lang = verge.language.as_ref().map_or_else(
|| get_system_language(),
|lang| lang.to_string()
);
text.to_string()
}
fn get_system_language() -> String {
let sys_lang = sys_locale::get_locale()
.unwrap_or_else(|| String::from("en"))
.to_lowercase();
let lang_code = sys_lang.split(['_', '-']).next().unwrap_or("en");
let supported_languages = get_supported_languages();
if supported_languages.contains(&lang_code.to_string()) {
lang_code.to_string()
} else {
String::from("en")
}
}

View File

@ -5,3 +5,4 @@ pub mod init;
pub mod resolve;
pub mod server;
pub mod tmpl;
pub mod i18n;

View File

@ -100,6 +100,7 @@ const SettingVerge = ({ onError }: Props) => {
<MenuItem value="en">English</MenuItem>
<MenuItem value="ru">Русский</MenuItem>
<MenuItem value="fa">فارسی</MenuItem>
<MenuItem value="tt">Татар</MenuItem>
</Select>
</GuardState>
</SettingItem>

424
src/locales/tt.json Normal file
View File

@ -0,0 +1,424 @@
{
"millis": "Миллисекундлар",
"seconds": "Секундлар",
"mins": "Минутлар",
"Back": "Кире",
"Close": "Ябу",
"Cancel": "Баш тарту",
"Confirm": "Растау",
"Maximize": "Зурайту",
"Minimize": "Кечерәйтү",
"Format document": "Документны форматлау",
"Empty": "Буш",
"New": "Яңа",
"Edit": "Үзгәртү",
"Save": "Саклау",
"Delete": "Бетерү",
"Enable": "Кушу",
"Disable": "Сүндерү",
"Label-Proxies": "Прокси",
"Label-Profiles": "Профильләр",
"Label-Connections": "Тоташулар",
"Label-Rules": "Кагыйдәләр",
"Label-Logs": "Логлар",
"Label-Test": "Тест",
"Label-Settings": "Көйләүләр",
"Proxies": "Прокси",
"Proxy Groups": "Прокси төркемнәре",
"Proxy Provider": "Прокси провайдеры",
"Update All": "Барысын да яңарту",
"Update At": "Яңартылган вакыт",
"rule": "кагыйдә",
"global": "глобаль",
"direct": "туры",
"script": "скриптлы",
"Location": "Урын",
"Delay check": "Задержканы тикшерү",
"Sort by default": "Башлангыч итеп сортлау",
"Sort by delay": "Задержка буенча сортлау",
"Sort by name": "Исем буенча сортлау",
"Delay check URL": "Задержканы тикшерү URL-ы",
"Delay check to cancel fixed": "Беркетелгәнне гамәлдән чыгару өчен задержканы тикшерү",
"Proxy basic": "Прокси турында кыскача мәгълүмат",
"Proxy detail": "Прокси турында тулы мәгълүмат",
"Profiles": "Профильләр",
"Update All Profiles": "Барлык профильләрне яңарту",
"View Runtime Config": "Кулланылган конфигурацияне карау",
"Reactivate Profiles": "Профильләрне янәдән активлаштыру",
"Paste": "Кую",
"Profile URL": "Профиль URL-ы",
"Import": "Импорт",
"From": "Каян",
"Update Time": "Яңарту вакыты",
"Used / Total": "Кулланылган / Барлыгы",
"Expire Time": "Тамамлану вакыты",
"Create Profile": "Профиль булдыру",
"Edit Profile": "Профильне үзгәртү",
"Edit Proxies": "Проксины үзгәртү",
"Use newlines for multiple uri": "Берничә URI өчен яңа юл символын кулланыгыз (Base64 кодлавы ярдәм ителә)",
"Edit Rules": "Кагыйдәләрне үзгәртү",
"Rule Type": "Кагыйдә төре",
"Rule Content": "Кагыйдә эчтәлеге",
"Proxy Policy": "Прокси сәясәте",
"No Resolve": "Резолвсыз",
"Prepend Rule": "Кагыйдәне өскә өстәү",
"Append Rule": "Кагыйдәне аска өстәү",
"Prepend Group": "Төркемне өскә өстәү",
"Append Group": "Төркемне аска өстәү",
"Prepend Proxy": "Проксины өскә өстәү",
"Append Proxy": "Проксины аска өстәү",
"Rule Condition Required": "Кагыйдә шарты кирәк",
"Invalid Rule": "Яраксыз кагыйдә",
"Advanced": "Өстәмә",
"Visualization": "Визуализация",
"DOMAIN": "Домен исеменең тулы туры килүе",
"DOMAIN-SUFFIX": "Домен суффиксына туры килү",
"DOMAIN-KEYWORD": "Доменда төп сүзгә туры килү",
"DOMAIN-REGEX": "Доменны регекс аша туры китерү",
"GEOSITE": "Geosite исемлегендәге доменга туры килү",
"GEOIP": "IP-адресның ил коды буенча туры килү",
"SRC-GEOIP": "Чыганак IP-адресның ил коды буенча туры килү",
"IP-ASN": "IP-адрес ASN'ы буенча туры килү",
"SRC-IP-ASN": "Чыганак IP-адрес ASN'ы буенча туры килү",
"IP-CIDR": "IP-адреслар диапазонына туры килү",
"IP-CIDR6": "IPv6 адреслар диапазонына туры килү",
"SRC-IP-CIDR": "Чыганак IP-адреслар диапазонына туры килү",
"IP-SUFFIX": "IP-адрес суффиксына туры килү",
"SRC-IP-SUFFIX": "Чыганак IP-адрес суффиксына туры килү",
"SRC-PORT": "Чыганак портлар диапазонына туры килү",
"DST-PORT": "Максат портлар диапазонына туры килү",
"IN-PORT": "Керүче портка туры килү",
"DSCP": "DSCP тамгалавы (tproxy UDP өчен)",
"PROCESS-NAME": "Процесс исеменә туры килү (Android пакет исеме)",
"PROCESS-PATH": "Процесс юлына туры килү",
"PROCESS-NAME-REGEX": "Процесс исемен регекс белән туры китерү (Android пакет исеме)",
"PROCESS-PATH-REGEX": "Процесс юлын регекс белән туры китерү",
"NETWORK": "Транспорт протоколына (tcp/udp) туры килү",
"UID": "Linux USER ID'га туры килү",
"IN-TYPE": "Керүче тоташу төренә туры килү",
"IN-USER": "Керүче тоташу кулланучысына туры килү",
"IN-NAME": "Керүче тоташу исеменә туры килү",
"SUB-RULE": "Кушымча кагыйдә",
"RULE-SET": "Кагыйдәләр тупланмасына туры килү",
"AND": "Логик ҺӘМ",
"OR": "Логик ЯКИ",
"NOT": "Логик ТҮГЕЛ",
"MATCH": "Барлык сорауларга туры килә",
"DIRECT": "Туры чыгу",
"REJECT": "Сорауларны тоткарлау",
"REJECT-DROP": "Сорауларны кире кагу",
"PASS": "Туры килсә дә, бу кагыйдәне урап узу",
"Edit Groups": "Прокси төркемнәрен үзгәртү",
"Group Type": "Төркем төре",
"select": "Проксины кулдан сайлау",
"url-test": "URL-тест задержкасына карап прокси сайлау",
"fallback": "Хата булган очракта башка проксига күчү",
"load-balance": "Трафикны баланслау нигезендә прокси тарату",
"relay": "Билгеле прокси чылбыры аша тапшыру",
"Group Name": "Төркем исеме",
"Use Proxies": "Прокси куллану",
"Use Provider": "Провайдер куллану",
"Health Check Url": "Сәламәтлекне тикшерү URL-ы",
"Expected Status": "Көтелгән статус коды",
"Interval": "Интервал",
"Lazy": "Сак режим (lazy)",
"Timeout": "Таймаут",
"Max Failed Times": "Иң күп хаталы тикшерү саны",
"Interface Name": "Интерфейс исеме",
"Routing Mark": "Маршрут билгесе",
"Include All": "Барлык прокси һәм провайдерларны кертү",
"Include All Providers": "Барлык провайдерларны кертү",
"Include All Proxies": "Барлык проксины кертү",
"Exclude Filter": "Фильтр аша чыгару",
"Exclude Type": "Чыгару төре",
"Disable UDP": "UDP'ны сүндерү",
"Hidden": "Яшерен",
"Group Name Required": "Төркем исеме кирәк",
"Group Name Already Exists": "Әлеге төркем исеме бар инде",
"Extend Config": "Merge-ны үзгәртергә",
"Extend Script": "Script-ны үзгәртергә",
"Global Merge": "Гомумкеңәйтелгән көйләүләр",
"Global Script": "Гомумкеңәйтелгән скрипт",
"Type": "Төр",
"Name": "Исем",
"Descriptions": "Тасвирламалар",
"Subscription URL": "Подписка URL-ы",
"Update Interval": "Яңарту интервалы",
"Choose File": "Файл сайлау",
"Use System Proxy": "Системалы проксины кулланып яңарту",
"Use Clash Proxy": "Clash прокси кулланып яңарту",
"Accept Invalid Certs (Danger)": "Дөрес булмаган сертификатларны кабул итү (Куркыныч)",
"Refresh": "Яңарту",
"Home": "Баш бит",
"Select": "Сайлау",
"Edit Info": "Мәгълүматны үзгәртү",
"Edit File": "Файлны үзгәртү",
"Open File": "Файлны ачу",
"Update": "Яңарту",
"Update(Proxy)": "Яңарту (прокси аша)",
"Confirm deletion": "Бетерүне раслагыз",
"This operation is not reversible": "Бу гамәлне кире кайтарып булмый",
"Script Console": "Скрипт консоле",
"To Top": "Өскә",
"To End": "Аска",
"Connections": "Тоташулар",
"Table View": "Таблица күзаллау",
"List View": "Исемлек күзаллау",
"Close All": "Барысын да ябу",
"Default": "Башлангыч",
"Download Speed": "Йөкләү тизлеге",
"Upload Speed": "Йөкләү (чыгару) тизлеге",
"Host": "Хост",
"Downloaded": "Йөкләнгән",
"Uploaded": "Чыгарылган",
"DL Speed": "Йөкләү тизл.",
"UL Speed": "Чыгару тизл.",
"Chains": "Чылбырлар",
"Rule": "Кагыйдә",
"Process": "Процесс",
"Time": "Тоташу вакыты",
"Source": "Чыганак адресы",
"Destination IP": "Максат IP-адресы",
"Close Connection": "Тоташуны ябу",
"Rules": "Кагыйдәләр",
"Rule Provider": "Кагыйдә провайдеры",
"Logs": "Логлар",
"Pause": "Туктау",
"Clear": "Чистарту",
"Test": "Тест",
"Test All": "Барчасын тестлау",
"Create Test": "Тест булдыру",
"Edit Test": "Тестны үзгәртү",
"Icon": "Иконка",
"Test URL": "Тест URL-ы",
"Settings": "Көйләүләр",
"System Setting": "Система көйләүләре",
"Tun Mode": "Tun режимы (виртуаль челтәр адаптеры)",
"Reset to Default": "Башлангычка кайтару",
"Tun Mode Info": "Tun режимы бөтен системаның трафигын тотып ала. Аны кабызган очракта системалы проксины аерым кабызу таләп ителми.",
"Stack": "Стек",
"System and Mixed Can Only be Used in Service Mode": "Система яки кушылган режимнар бары тик сервис режимында гына активлаштырыла ала",
"Device": "Җайланма исеме",
"Auto Route": "Авто-маршрутлау",
"Strict Route": "Катгый маршрутлау",
"Auto Detect Interface": "Интерфейсны автоматик ачыклау",
"DNS Hijack": "DNS'ны үзгәртеп тоту (hijack)",
"MTU": "MTU (макс. тапшыру берәмлеге)",
"Service Mode": "Сервис режимы",
"Service Mode Info": "Tun режимын кабызганчы сервис режимын урнаштыру сорала. Сервис буларак эшләтелгән Clash ядросына виртуаль челтәр адаптеры (TUN) куллану рөхсәт ителә.",
"Current State": "Агымдагы торыш",
"pending": "Көтә",
"installed": "Урнаштырылган",
"uninstall": "Урнаштырылмаган",
"active": "Актив",
"unknown": "Билгесез",
"Information: Please make sure that the Clash Verge Service is installed and enabled": "Игътибар: Clash Verge сервисы урнаштырылган һәм активлаштырылган булырга тиеш",
"Install": "Урнаштыру",
"Uninstall": "Салдыру",
"Disable Service Mode": "Сервис режимын сүндерү",
"System Proxy": "Системалы прокси",
"System Proxy Info": "Системалы прокси көйләүләрен үзгәртү рөхсәтен бирегез. Әгәр рөхсәт алу мөмкин түгел икән, прокси көйләүләрен кулдан үзгәртегез",
"System Proxy Setting": "Системалы прокси көйләүләре",
"Current System Proxy": "Агымдагы системалы прокси",
"Enable status": "Активлаштыру статусы",
"Enabled": "Кушылган",
"Disabled": "Сүнгән",
"Server Addr": "Сервер адресы",
"Not available": "Мөмкин түгел",
"Proxy Guard": "Прокси саклаучы",
"Proxy Guard Info": "Системалы прокси көйләүләрен чит программа үзгәртмәсен өчен шушы функцияне кабызыгыз",
"Guard Duration": "Саклау вакыты",
"Always use Default Bypass": "Һәрвакыт төп Bypass-ны куллану",
"Proxy Bypass": "Проксины әйләнеп узу:",
"Bypass": "Әйләнеп узу:",
"Use PAC Mode": "PAC режимын куллану",
"PAC Script Content": "PAC скрипты эчтәлеге",
"PAC URL": "PAC адресы",
"Auto Launch": "Автостарт",
"Silent Start": "Фон режимында башлау",
"Silent Start Info": "Программаны фоновый режимда, тәрәзәсез эшләтеп җибәрү",
"TG Channel": "Telegram каналы",
"Manual": "Документация",
"Github Repo": "GitHub репозиториясе",
"Clash Setting": "Clash көйләүләре",
"Allow Lan": "Локаль челтәргә рөхсәт",
"Network Interface": "Челтәр интерфейсы",
"Ip Address": "IP адресы",
"Mac Address": "MAC адресы",
"IPv6": "IPv6",
"Unified Delay": "Бердәм задержка",
"Unified Delay Info": "Бердәм задержка актив булганда, төрле типтагы узеллар өчен икеләтә тест башкарыла, TCP установканы раслау аермаларын тигезләү максатында",
"Log Level": "Лог дәрәҗәсе",
"Log Level Info": "Бу фәкать сервис режимында эшләгән вакытта системалы журнал файлларына кагыла",
"Port Config": "Порт көйләүләре",
"Random Port": "Очраклы порт",
"Mixed Port": "Катнаш прокси порты",
"Socks Port": "Socks прокси порты",
"Http Port": "HTTP(s) прокси порты",
"Redir Port": "Redir — үтә күренмәле прокси порты",
"Tproxy Port": "Tproxy — үтә күренмәле прокси порты",
"External": "Тышкы",
"External Controller": "Тышкы контроллер адресы",
"Core Secret": "Серсүз",
"Recommended": "Тавсия ителә",
"Open URL": "URL ачарга",
"Replace host, port, secret with %host, %port, %secret": "Хост, порт, серсүзне %host, %port, %secret белән алмаштырыгыз",
"Support %host, %port, %secret": "%host, %port, %secret макросларын хуплау",
"Clash Core": "Clash ядросы",
"Upgrade": "Яңарту",
"Restart": "Перезапуск",
"Release Version": "Рәсми версия",
"Alpha Version": "Альфа-версия",
"Please Enable Service Mode": "Башта сервис режимын кабызырга кирәк",
"Please enter your root password": "root паролен языгыз",
"Grant": "Рөхсәт бирү",
"Open UWP tool": "UWP инструментын ачу",
"Open UWP tool Info": "Windows 8'дән башлап UWP кушымталары (Microsoft Store кебек) локаль хосттагы челтәр хезмәтләренә турыдан-туры тоташа алмый. Бу инструмент әлеге чикләүне әйләнеп узарга ярдәм итә",
"Update GeoData": "GeoData яңарту",
"Verge Setting": "Verge көйләүләре",
"Language": "Тел",
"Theme Mode": "Теманың режимы",
"theme.light": "Якты",
"theme.dark": "Караңгы",
"theme.system": "Система",
"Tray Click Event": "Трейдагы басу вакыйгасы",
"Show Main Window": "Төп тәрәзәне күрсәтү",
"Copy Env Type": "Env төрен күчереп алу",
"Copy Success": "Күчерелде",
"Start Page": "Баш бит",
"Startup Script": "Башлану скрипты",
"Browse": "Карау",
"Theme Setting": "Тема көйләүләре",
"Primary Color": "Төп төс",
"Secondary Color": "Икенче төс",
"Primary Text Color": "Төп текст төсе",
"Secondary Text Color": "Икенче текст төсе",
"Info Color": "Мәгълүмат төсе",
"Warning Color": "Кисәтү төсе",
"Error Color": "Хата төсе",
"Success Color": "Уңыш төсе",
"Font Family": "Шрифтлар гаиләсе",
"CSS Injection": "CSS кертү",
"Layout Setting": "Расположение көйләүләре",
"Traffic Graph": "Трафик графигы",
"Memory Usage": "Хәтер куллану",
"Memory Cleanup": "Хәтерне чистарту өчен басыгыз",
"Proxy Group Icon": "Прокси төркеме иконкасы",
"Nav Icon": "Навигация иконкасы",
"Monochrome": "Монохром",
"Colorful": "Төсле",
"Tray Icon": "Трей иконкасы",
"Common Tray Icon": "Гомуми трей иконкасы",
"System Proxy Tray Icon": "Системалы прокси иконкасы",
"Tun Tray Icon": "Tun (виртуаль адаптер) иконкасы",
"Miscellaneous": "Өстәмә көйләүләр",
"App Log Level": "Кушымта журналы дәрәҗәсе",
"Auto Close Connections": "Тоташуларны автоматик ябу",
"Auto Close Connections Info": "Прокси төркеме яисә режимын үзгәрткәндә актив тоташуларны өзү",
"Auto Check Update": "Яңартуларны автоматик тикшерү",
"Enable Builtin Enhanced": "Эчке камилләштерүне кабызу",
"Enable Builtin Enhanced Info": "Конфигурация файлы белән туры килә торган өстәмә оптимизация",
"Proxy Layout Columns": "Прокси күрсәтү баганалары саны",
"Auto Columns": "Авто баганалар",
"Auto Log Clean": "Логларны автоматик чистарту",
"Never Clean": "Беркайчан чистартмаска",
"Retain _n Days": "{{n}} көн саклау",
"Default Latency Test": "Тоткарлануны тикшерү сылтамасы (defaults)",
"Default Latency Test Info": "Бу фәкать клиентның HTTP сораулары тесты өчен кулланыла, конфигурация файлына йогынты ясамый",
"Default Latency Timeout": "Тоткарлануның стандарт таймауты",
"Hotkey Setting": "Клавиатура төймәләре (hotkey) көйләүләре",
"open_or_close_dashboard": "Панельне ачу/ябу",
"clash_mode_rule": "Кагыйдәләр режимы",
"clash_mode_global": "Глобаль режим",
"clash_mode_direct": "Туры режим",
"toggle_system_proxy": "Системалы проксины кабызу/сүндерү",
"toggle_tun_mode": "Tun режимын кабызу/сүндерү",
"Backup Setting": "Резерв копия көйләүләре",
"Backup Setting Info": "WebDAV аша конфигурация файлын саклауны хуплый",
"Runtime Config": "Агымдагы конфигурация",
"Open Conf Dir": "Кушымта папкасын ачу",
"Open Conf Dir Info": "Әгәр программада хаталар чыкса, бу папкадагы файлларны саклап калыгыз да, аннары барысын да бетереп, программаны яңадан башлагыз",
"Open Core Dir": "Ядро сакланган папканы ачу",
"Open Logs Dir": "Логлар папкасын ачу",
"Check for Updates": "Яңартуларны тикшерү",
"Go to Release Page": "Релизлар битенә күчү",
"Portable Updater Error": "Портатив версиядә кушымта эчендә яңарту хупланмый, кулдан төшереп алыгыз",
"Break Change Update Error": "Бу зур яңарту, ул кушымта эчендә яңартылмый. Борып алып ташлап, яңадан урнаштыру сорала.",
"Open Dev Tools": "Разработчик коралларын ачу",
"Exit": "Чыгу",
"Verge Version": "Verge версиясе",
"ReadOnly": "Уку режимы гына",
"ReadOnlyMessage": "Уку режимында үзгәртү мөмкин түгел",
"Filter": "Фильтр",
"Filter conditions": "Фильтр шартлары",
"Match Case": "Регистрны исәпкә алу",
"Match Whole Word": "Сүзнең тулы туры килүе",
"Use Regular Expression": "Регуляр выражениеләр куллану",
"Profile Imported Successfully": "Профиль уңышлы импортланды",
"Profile Switched": "Профиль алмаштырылды",
"Profile Reactivated": "Профиль яңадан активлаштырылды",
"Only YAML Files Supported": "Фәкать YAML-файллар гына хуплана",
"Settings Applied": "Көйләүләр кулланылды",
"Service Installed Successfully": "Сервис уңышлы урнаштырылды",
"Service Uninstalled Successfully": "Сервис уңышлы салдырылды",
"Proxy Daemon Duration Cannot be Less than 1 Second": "Прокси-демон эш вакыты 1 секундтан ким була алмый",
"Invalid Bypass Format": "Дөрес булмаган Bypass форматы",
"Clash Port Modified": "Clash порты үзгәртелде",
"Port Conflict": "Порт конфликтлары",
"Restart Application to Apply Modifications": "Үзгәрешләрне куллану өчен кушымтаны яңадан ачарга кирәк",
"External Controller Address Modified": "Тышкы контроллер адресы үзгәртелде",
"Permissions Granted Successfully for _clash Core": "{{core}} ядросы өчен рөхсәтләр бирелде",
"Core Version Updated": "Ядро версиясе яңартылды",
"Clash Core Restarted": "Clash ядросы яңадан башланды",
"Switched to _clash Core": "{{core}} ядросына күчү башкарылды",
"GeoData Updated": "GeoData яңартылды",
"Currently on the Latest Version": "Сездә иң соңгы версия урнаштырылган",
"Import subscription successful": "Подписка уңышлы импортланды",
"WebDAV Server URL": "WebDAV сервер URL-ы (http(s)://)",
"Username": "Кулланучы исеме",
"Password": "Пароль",
"Backup": "Резерв копия",
"Filename": "Файл исеме",
"Actions": "Гамәлләр",
"Restore": "Кайтару",
"No Backups": "Резерв копияләр юк",
"WebDAV URL Required": "WebDAV адресы буш булырга тиеш түгел",
"Invalid WebDAV URL": "WebDAV адресы дөрес түгел",
"Username Required": "Кулланучы исеме буш булмаска тиеш",
"Password Required": "Пароль буш булмаска тиеш",
"Failed to Fetch Backups": "Резерв копия файлларын алуда хата",
"WebDAV Config Saved": "WebDAV көйләүләре сакланды",
"WebDAV Config Save Failed": "WebDAV көйләүләрен саклап булмады: {{error}}",
"Backup Created": "Резерв копия уңышлы ясалды",
"Backup Failed": "Резерв копия хата белән төгәлләнде: {{error}}",
"Delete Backup": "Резерв копияне бетерү",
"Restore Backup": "Резерв копияне кайтару",
"Backup Time": "Резерв копия вакыты",
"Confirm to delete this backup file?": "Бу резерв копия файлын бетерергә телисезме?",
"Confirm to restore this backup file?": "Бу резерв копия файлын кире кайтарырга телисезме?",
"Restore Success, App will restart in 1s": "Уңышлы кайтарылды, кушымта 1 секундтан яңадан башланачак",
"Failed to fetch backup files": "Резерв копия файлларын алуда хата",
"Profile": "Профиль",
"Help": "Ярдәм",
"About": "Турында",
"Theme": "Тема",
"Main Window": "Төп тәрәзә",
"Traffic Graph": "Трафик графигы",
"Memory Usage": "Хәтер куллану",
"Group Icon": "Төркем иконкасы",
"Menu Icon": "Меню иконкасы",
"Tray Icon": "Трей иконкасы",
"PAC File": "PAC файлы",
"Web UI": "Веб-интерфейс",
"Hotkeys": "Кызу төймәләр",
"Verge Mixed Port": "Verge катнаш порты",
"Verge Socks Port": "Verge Socks порты",
"Verge Redir Port": "Verge кире юнәлтү порты",
"Verge Tproxy Port": "Verge Tproxy порты",
"Verge Port": "Verge порты",
"Verge HTTP Enabled": "Verge HTTP кушылган",
"WebDAV URL": "WebDAV URL",
"WebDAV Username": "WebDAV кулланучы исеме",
"WebDAV Password": "WebDAV серсүзе",
"Dashboard": "Панель"
}

View File

@ -4,12 +4,14 @@ import en from "@/locales/en.json";
import ru from "@/locales/ru.json";
import zh from "@/locales/zh.json";
import fa from "@/locales/fa.json";
import tt from "@/locales/tt.json";
const resources = {
en: { translation: en },
ru: { translation: ru },
zh: { translation: zh },
fa: { translation: fa },
tt: { translation: tt },
};
i18n.use(initReactI18next).init({