diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index feee80fc..5222c4b2 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -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" diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index 400eac2d..c2e840d6 100755 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -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" diff --git a/src-tauri/src/config/verge.rs b/src-tauri/src/config/verge.rs index 596f8c2a..73f045a8 100644 --- a/src-tauri/src/config/verge.rs +++ b/src-tauri/src/config/verge.rs @@ -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::(&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()), diff --git a/src-tauri/src/core/tray.rs b/src-tauri/src/core/tray.rs index ab120e7b..aa2ed9dd 100644 --- a/src-tauri/src/core/tray.rs +++ b/src-tauri/src/core/tray.rs @@ -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> { 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(); diff --git a/src-tauri/src/utils/i18n.rs b/src-tauri/src/utils/i18n.rs new file mode 100644 index 00000000..b0c8ddcc --- /dev/null +++ b/src-tauri/src/utils/i18n.rs @@ -0,0 +1,59 @@ +use std::{fs, path::Path}; +use crate::config::Config; +use sys_locale; + +pub fn get_supported_languages() -> Vec { + 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") + } +} diff --git a/src-tauri/src/utils/mod.rs b/src-tauri/src/utils/mod.rs index b5ee04e7..4b5ce6fb 100644 --- a/src-tauri/src/utils/mod.rs +++ b/src-tauri/src/utils/mod.rs @@ -5,3 +5,4 @@ pub mod init; pub mod resolve; pub mod server; pub mod tmpl; +pub mod i18n; diff --git a/src/components/setting/setting-verge.tsx b/src/components/setting/setting-verge.tsx index 3af4e0be..538ed158 100644 --- a/src/components/setting/setting-verge.tsx +++ b/src/components/setting/setting-verge.tsx @@ -100,6 +100,7 @@ const SettingVerge = ({ onError }: Props) => { English Русский فارسی + Татар diff --git a/src/locales/tt.json b/src/locales/tt.json new file mode 100644 index 00000000..b5720bd9 --- /dev/null +++ b/src/locales/tt.json @@ -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": "Панель" +} diff --git a/src/services/i18n.ts b/src/services/i18n.ts index a051d738..687578c4 100644 --- a/src/services/i18n.ts +++ b/src/services/i18n.ts @@ -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({