Преминете към основното съдържание

Интернационализация (i18n)

Dictaro поддържа 25 езика за потребителския интерфейс чрез rust-i18n crate. Преводите са във YAML файл, а езикът се определя от конфигурацията на потребителя или автоматично от OS locale.

Поддържани езици

КодЕзик (ендоним)
bgБългарски
hrHrvatski
csCestina
daDansk
nlNederlands
enEnglish
etEesti
fiSuomi
frFrancais
deDeutsch
elEllinika
huMagyar
itItaliano
lvLatviesu
ltLietuviu
mtMalti
plPolski
ptPortugues
roRomana
ruRusskij
skSlovencina
slSlovenscina
esEspanol
svSvenska
ukUkrainska

Технически детайли

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)
}

Ред на приоритет

  1. config.ui_language (ако е зададен от потребителя в Settings)
  2. OS locale (автоматично детектиран)
  3. "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)