diff --git a/src/localization/mod.rs b/src/localization/mod.rs index 146b419..3b7f577 100644 --- a/src/localization/mod.rs +++ b/src/localization/mod.rs @@ -6,6 +6,7 @@ mod japanese; mod korean; mod spanish; mod traditional_chinese; +mod russian; use windows::core::PWSTR; use windows::Win32::Globalization::{ @@ -23,10 +24,11 @@ pub enum LanguageId { Japanese, Korean, TraditionalChinese, + Russian, } impl LanguageId { - pub const ALL: [LanguageId; 8] = [ + pub const ALL: [LanguageId; 9] = [ LanguageId::English, LanguageId::Dutch, LanguageId::Spanish, @@ -35,6 +37,7 @@ impl LanguageId { LanguageId::Japanese, LanguageId::Korean, LanguageId::TraditionalChinese, + LanguageId::Russian, ]; pub fn code(self) -> &'static str { @@ -47,6 +50,7 @@ impl LanguageId { Self::Japanese => "ja", Self::Korean => "ko", Self::TraditionalChinese => "zh-TW", + Self::Russian => "ru", } } @@ -60,6 +64,7 @@ impl LanguageId { Self::Japanese => "日本語", Self::Korean => "한국어", Self::TraditionalChinese => "繁體中文", + Self::Russian => "Русский", } } @@ -73,6 +78,7 @@ impl LanguageId { Self::Japanese => japanese::STRINGS, Self::Korean => korean::STRINGS, Self::TraditionalChinese => traditional_chinese::STRINGS, + Self::Russian => russian::STRINGS, } } @@ -86,6 +92,7 @@ impl LanguageId { Self::Japanese => japanese::UPDATE_VIA_WINGET_LABEL, Self::Korean => korean::UPDATE_VIA_WINGET_LABEL, Self::TraditionalChinese => traditional_chinese::UPDATE_VIA_WINGET_LABEL, + Self::Russian => russian::UPDATE_VIA_WINGET_LABEL, } } @@ -113,7 +120,8 @@ impl LanguageId { } else { None } - } + }, + "ru" => Some(Self::Russian), _ => None, } } diff --git a/src/localization/russian.rs b/src/localization/russian.rs new file mode 100644 index 0000000..6a445b8 --- /dev/null +++ b/src/localization/russian.rs @@ -0,0 +1,46 @@ +use super::Strings; + +pub(super) const UPDATE_VIA_WINGET_LABEL: &str = "Обновить через WinGet"; + +pub(super) const STRINGS: Strings = Strings { + window_title: "Монитор использования Claude Code", + refresh: "Обновить", + update_frequency: "Частота обновления", + one_minute: "1 минута", + five_minutes: "5 минут", + fifteen_minutes: "15 минут", + one_hour: "1 час", + models: "Модели", + claude_code_model: "Claude Code", + codex_model: "Codex", + settings: "Настройки", + start_with_windows: "Запускать вместе с Windows", + reset_position: "Сбросить позицию", + language: "Язык", + system_default: "Системный по умолчанию", + check_for_updates: "Проверить обновления", + checking_for_updates: "Проверка обновлений...", + updates: "Обновления", + update_in_progress: "Проверка обновлений уже выполняется.", + up_to_date: "У вас уже установлена последняя версия.", + up_to_date_short: "Актуальная версия", + update_failed: "Не удалось обновить автоматически", + applying_update: "Применение обновления...", + update_to: "Обновить до", + update_available: "Доступно обновление", + update_prompt_now: "Доступна версия {version}. Обновить сейчас?", + exit: "Выход", + show_widget: "Показать виджет", + session_window: "5ч", + weekly_window: "7д", + now: "сейчас", + day_suffix: "д", + hour_suffix: "ч", + minute_suffix: "м", + token_expired_title: "Ошибка авторизации Claude Code", + token_expired_body: "Запустите 'claude' в терминале, затем используйте '/login' и следуйте инструкциям. После этого обновите или перезапустите приложение.", + codex_token_expired_title: "Ошибка авторизации Codex", + codex_token_expired_body: "Запустите 'codex' в терминале и следуйте инструкциям для входа. После этого обновите или перезапустите приложение.", + codex_window_title: "Монитор использования Codex", + second_suffix: "с", +}; \ No newline at end of file diff --git a/src/window.rs b/src/window.rs index 31955f5..abf9292 100644 --- a/src/window.rs +++ b/src/window.rs @@ -119,6 +119,7 @@ const IDM_LANG_GERMAN: u16 = 45; const IDM_LANG_JAPANESE: u16 = 46; const IDM_LANG_KOREAN: u16 = 47; const IDM_LANG_TRADITIONAL_CHINESE: u16 = 48; +const IDM_LANG_RUSSIAN: u16 = 49; const IDM_MODEL_CLAUDE_CODE: u16 = 60; const IDM_MODEL_CODEX: u16 = 61; @@ -2480,6 +2481,7 @@ fn show_context_menu(hwnd: HWND) { LanguageId::Japanese => IDM_LANG_JAPANESE, LanguageId::Korean => IDM_LANG_KOREAN, LanguageId::TraditionalChinese => IDM_LANG_TRADITIONAL_CHINESE, + LanguageId::Russian => IDM_LANG_RUSSIAN }; let label_str = native_interop::wide_str(language.native_name()); let flags = if language_override == Some(language) {