Интернационализация (i18n)
Dictaro поддържа 25 езика за потребителския интерфейс чрез rust-i18n crate. Преводите са във YAML файл, а езикът се определя от конфигурацията на потребителя или автоматично от OS locale.
Поддържани езици
| Код | Език (ендоним) |
|---|---|
| bg | Български |
| hr | Hrvatski |
| cs | Cestina |
| da | Dansk |
| nl | Nederlands |
| en | English |
| et | Eesti |
| fi | Suomi |
| fr | Francais |
| de | Deutsch |
| el | Ellinika |
| hu | Magyar |
| it | Italiano |
| lv | Latviesu |
| lt | Lietuviu |
| mt | Malti |
| pl | Polski |
| pt | Portugues |
| ro | Romana |
| ru | Russkij |
| sk | Slovencina |
| sl | Slovenscina |
| es | Espanol |
| sv | Svenska |
| uk | Ukrainska |
Технически детайли
rust-i18n конфигурация
В main.rs:
#[macro_use]
extern crate rust_i18n;
i18n!("locales", fallback = "en");
Това зарежда преводите от client/locales/ директорията. Fallback език е English.
YAML файл
Преводите са в един файл client/locales/app.yml (формат v2 на rust-i18n):
_version: 2
settings.title:
en: Settings
bg: Настройки
hr: Postavke
cs: Nastaveni
# ... всички 25 езика
settings.save:
en: Save
bg: Запази
# ...
overlay.no_speech:
en: No speech detected
bg: Не е разпознат говор
# ...
Всеки ключ е в dot-notation формат (напр. settings.auth.waiting_login) и съдържа превод за всеки от 25-те езика.
Използване в кода
use rust_i18n::t;
// Текущ locale
let label = t!("settings.title");
// Конкретен locale (за тестове)
let label = t!("settings.title", locale = "bg");
// С интерполация
let msg = t!("quota.remaining", seconds = remaining);
Инициализация на locale
OS Locale Detection
sys_locale::get_locale() връща OS locale стринг (напр. en-US, bg-BG).
map_locale_to_supported() извлича двубуквения код и проверява дали е в списъка с поддържани езици:
pub fn map_locale_to_supported(locale: &str) -> Option<&'static str> {
let code = locale.split(|c| c == '-' || c == '_').next()?;
SUPPORTED_UI_LANGUAGES.iter()
.find(|(c, _)| *c == code)
.map(|(c, _)| *c)
}
Ред на приоритет
config.ui_language(ако е зададен от потребителя в Settings)- OS locale (автоматично детектиран)
"en"(fallback)
Секции на преводите
Ключовете са организирани в следните секции:
| Секция | Описание |
|---|---|
settings.* | Settings панел (заглавия, бутони, етикети) |
settings.auth.* | Автентикация (login, logout, waiting messages) |
settings.hotkeys.* | Hotkey настройки |
settings.audio.* | Аудио настройки (език, устройство) |
settings.preferences.* | Общи предпочитания |
settings.llm.* | LLM настройки |
overlay.* | Recording overlay (no speech, errors, LLM status) |
tray.* | System tray контекстно меню |
Разлика между UI език и език за разпознаване
Dictaro разграничава два вида езикови настройки:
| Настройка | Описание | Стойност по подразбиране |
|---|---|---|
config.ui_language | Език на интерфейса (преводи, менюта) | Автоматично от OS |
config.language | Език за ASR разпознаване (изпраща се към сървъра) | "bg" |
Потребителят може да настрои UI на английски, но да диктува на български (или обратно).
Тестове
Модулът включва тестове за:
- Коректност на превода за конкретни ключове (
test_settings_title_en,test_settings_title_bg) - Превключване на locale (
test_locale_switch_fr) - Пълнота на преводите -- проверява представителна извадка от ключове за всичките 25 езика (
test_i18n_completeness) - Roundtrip на
ui_languageв конфигурацията - Mapping на OS locale-и (
en-US->en,bg-BG->bg)