chore: CI workflows + drop Ukrainian (UA → just RU/EN)
CI (.github/workflows/ci.yml): - Three parallel jobs on push & PR: cargo test (jarvis-core), cargo clippy (lint, warnings-as-errors), cargo check (workspace). Windows runner, stable toolchain, rust-cache for fast incremental builds. - Deliberately skips release build of jarvis-gui — that needs Node+npm +Tauri bundler and would balloon CI to ~10min per push. Drop Ukrainian: - Delete ua.ftl, remove UA from SUPPORTED_LANGUAGES. - config.rs: prune UA arms from get_wake_phrases / get_wake_grammar / get_phrases_to_remove / get_llm_trigger_phrases / get_llm_system_prompt. - stt/vosk.rs: drop UA → uk language mapping. - tray menu: drop "Українська" entry. - frontend: drop UA from Header.svelte language list, settings page language map, i18n.ts fallback. - 82 command.toml files stripped of every `ua = [...]` block (205 blocks total). Handled via subagent — TOML still parses, all 6 command tests pass. .gitignore: stop tracking dev.env / dll_probe*.py / imports_full.txt which were sitting in working tree. Tests: 128 pass (no regression). Workspace still compiles end-to-end.
This commit is contained in:
parent
4e21024509
commit
3f8300dc6f
92 changed files with 82 additions and 581 deletions
|
|
@ -220,7 +220,6 @@ pub const LLM_FALLBACK_ERROR_RU: &str = "Не могу связаться с с
|
|||
pub fn get_llm_trigger_phrases(lang: &str) -> &'static [&'static str] {
|
||||
match lang {
|
||||
"ru" => &["скажи", "ответь", "произнеси"],
|
||||
"ua" => &["скажи", "відповідай"],
|
||||
"en" => &["say", "tell", "answer"],
|
||||
_ => &[],
|
||||
}
|
||||
|
|
@ -228,7 +227,7 @@ pub fn get_llm_trigger_phrases(lang: &str) -> &'static [&'static str] {
|
|||
|
||||
pub fn get_llm_system_prompt(lang: &str) -> &'static str {
|
||||
match lang {
|
||||
"ru" | "ua" => LLM_SYSTEM_PROMPT_RU,
|
||||
"ru" => LLM_SYSTEM_PROMPT_RU,
|
||||
_ => LLM_SYSTEM_PROMPT_RU,
|
||||
}
|
||||
}
|
||||
|
|
@ -259,7 +258,6 @@ pub fn get_llm_system_prompt(lang: &str) -> &'static str {
|
|||
pub fn get_wake_phrases(lang: &str) -> &'static [&'static str] {
|
||||
match lang {
|
||||
"ru" => &["джарвис", "джервис", "гарвис", "джарви", "гарви"],
|
||||
"ua" => &["джарвіс", "джервіс"],
|
||||
"en" => &["jarvis", "jervis"],
|
||||
_ => &["jarvis"],
|
||||
}
|
||||
|
|
@ -273,11 +271,6 @@ pub fn get_phrases_to_remove(lang: &str) -> &'static [&'static str] {
|
|||
"произнеси", "ответь", "покажи", "скажи", "давай",
|
||||
"да сэр", "к вашим услугам сэр", "загружаю сэр",
|
||||
],
|
||||
"ua" => &[
|
||||
"джарвіс", "джервіс", "сер", "слухаю сер", "завжди до послуг",
|
||||
"скажи", "покажи", "відповідай", "давай",
|
||||
"так сер", "до ваших послуг сер",
|
||||
],
|
||||
"en" => &[
|
||||
"jarvis", "jervis", "sir", "yes sir", "at your service",
|
||||
"please", "say", "show", "tell", "hey",
|
||||
|
|
@ -292,10 +285,6 @@ pub fn get_wake_grammar(lang: &str) -> &'static [&'static str] {
|
|||
"джарвис", "[unk]", "джон", "джони", "джей",
|
||||
"джонстон", "привет", "давай",
|
||||
],
|
||||
"ua" => &[
|
||||
"джарвіс", "[unk]", "джон", "джоні", "джей",
|
||||
"привіт", "давай",
|
||||
],
|
||||
"en" => &[
|
||||
"jarvis", "[unk]", "john", "johnny", "jay",
|
||||
"hello", "hey", "hi",
|
||||
|
|
|
|||
|
|
@ -8,28 +8,21 @@ use unic_langid::LanguageIdentifier;
|
|||
// locale files embedded at compile time
|
||||
const LOCALE_RU: &str = include_str!("i18n/locales/ru.ftl");
|
||||
const LOCALE_EN: &str = include_str!("i18n/locales/en.ftl");
|
||||
const LOCALE_UA: &str = include_str!("i18n/locales/ua.ftl");
|
||||
|
||||
pub const SUPPORTED_LANGUAGES: &[&str] = &["ru", "en", "ua"];
|
||||
pub const SUPPORTED_LANGUAGES: &[&str] = &["ru", "en"];
|
||||
pub const DEFAULT_LANGUAGE: &str = "en";
|
||||
|
||||
// detect the OS language and map it to a supported language.
|
||||
// falls back to DEFAULT_LANGUAGE if not supported.
|
||||
pub fn detect_system_language() -> &'static str {
|
||||
if let Some(locale) = sys_locale::get_locale() {
|
||||
// locale can be "en-US", "ru-RU", "uk-UA", etc.
|
||||
// locale can be "en-US", "ru-RU", etc.
|
||||
let lang_code = locale.split(&['-', '_'][..]).next().unwrap_or("");
|
||||
|
||||
// map OS locale codes to our supported languages
|
||||
let mapped = match lang_code {
|
||||
"uk" => "ua", // ISO 639-1 "uk" (ukrainian) -> our "ua"
|
||||
other => other,
|
||||
};
|
||||
|
||||
if SUPPORTED_LANGUAGES.contains(&mapped) {
|
||||
info!("Detected system language: {} (from locale '{}')", mapped, locale);
|
||||
if SUPPORTED_LANGUAGES.contains(&lang_code) {
|
||||
info!("Detected system language: {} (from locale '{}')", lang_code, locale);
|
||||
return SUPPORTED_LANGUAGES.iter()
|
||||
.find(|&&l| l == mapped)
|
||||
.find(|&&l| l == lang_code)
|
||||
.unwrap();
|
||||
}
|
||||
|
||||
|
|
@ -61,8 +54,7 @@ fn create_bundles() -> HashMap<String, Bundle> {
|
|||
|
||||
bundles.insert("ru".to_string(), create_bundle("ru", LOCALE_RU));
|
||||
bundles.insert("en".to_string(), create_bundle("en", LOCALE_EN));
|
||||
bundles.insert("ua".to_string(), create_bundle("ua", LOCALE_UA));
|
||||
|
||||
|
||||
bundles
|
||||
}
|
||||
|
||||
|
|
@ -173,7 +165,6 @@ pub fn get_translations_for(lang: &str) -> HashMap<String, String> {
|
|||
let source = match lang {
|
||||
"ru" => LOCALE_RU,
|
||||
"en" => LOCALE_EN,
|
||||
"ua" => LOCALE_UA,
|
||||
_ => LOCALE_RU,
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -1,166 +0,0 @@
|
|||
# ### APP INFO
|
||||
app-name = JARVIS
|
||||
app-description = Голосовий асистент
|
||||
|
||||
# ### TRAY MENU
|
||||
tray-restart = Перезапустити
|
||||
tray-settings = Налаштування
|
||||
tray-exit = Вихід
|
||||
tray-tooltip = JARVIS - Голосовий асистент
|
||||
tray-language = Мова
|
||||
tray-voice = Голос
|
||||
tray-wake-word = Рушій детекції
|
||||
tray-noise-suppression = Шумозаглушення
|
||||
tray-vad = Детекцiя голосу (VAD)
|
||||
tray-gain-normalizer = Нормалізація гучності
|
||||
|
||||
# ### HEADER
|
||||
header-commands = КОМАНДИ
|
||||
header-settings = НАЛАШТУВАННЯ
|
||||
|
||||
# ### SEARCH
|
||||
search-placeholder = Введіть команду вручну або скажіть «Джарвіс» ...
|
||||
|
||||
# ### MAIN PAGE
|
||||
assistant-not-running = АСИСТЕНТ НЕ ЗАПУЩЕНО
|
||||
assistant-offline-hint = Налаштувати його можна не запускаючи.
|
||||
btn-start = ЗАПУСТИТИ
|
||||
btn-starting = ЗАПУСК...
|
||||
|
||||
# ### STATUS
|
||||
status-disconnected = Відключено
|
||||
status-standby = Очікування
|
||||
status-listening = Слухаю...
|
||||
status-processing = Обробка...
|
||||
|
||||
# ### STATS
|
||||
stats-microphone = МІКРОФОН
|
||||
stats-neural-networks = НЕЙРОМЕРЕЖІ
|
||||
stats-resources = РЕСУРСИ
|
||||
stats-system-default = Системний
|
||||
stats-not-selected = Не вибрано
|
||||
stats-loading = Завантаження...
|
||||
|
||||
# ### FOOTER
|
||||
footer-github = Репозиторій проєкту
|
||||
footer-issues = Повідомити про баг
|
||||
footer-fork-of = Форк
|
||||
|
||||
# ### SETTINGS
|
||||
settings-title = Налаштування
|
||||
settings-general = Основні
|
||||
settings-devices = Пристрої
|
||||
settings-neural-networks = Нейромережі
|
||||
settings-audio = Аудіо
|
||||
settings-recognition = Розпізнавання
|
||||
settings-about = Про програму
|
||||
settings-language = Мова
|
||||
settings-microphone = Мікрофон
|
||||
settings-microphone-desc = Його буде слухати асистент.
|
||||
settings-mic-default = За замовчуванням (Система)
|
||||
settings-voice = Голос асистента
|
||||
settings-voice-desc =
|
||||
Не всі команди працюють з усіма звуковими пакетами.
|
||||
Натисніть, щоб прослухати як звучить голос.
|
||||
settings-wake-word-engine = Рушій активації
|
||||
settings-wake-word-desc = Виберіть нейромережу для розпізнавання активаційної фрази.
|
||||
settings-stt-engine = Розпізнавання мовлення
|
||||
settings-intent-engine = Визначення наміру
|
||||
settings-intent-engine-desc = Виберіть нейромережу для розпізнавання команд.
|
||||
settings-noise-suppression = Шумозаглушення
|
||||
settings-noise-suppression-desc = Зменшує фоновий шум. Може негативно впливати на розпізнавання.
|
||||
settings-vad = Визначення голосу (VAD)
|
||||
settings-vad-desc = Пропускає тишу, економить ресурси CPU.
|
||||
settings-gain-normalizer = Нормалізація гучності
|
||||
settings-gain-normalizer-desc = Автоматично регулює рівень гучності.
|
||||
settings-api-keys = API Ключі
|
||||
settings-save = Зберегти
|
||||
settings-cancel = Скасувати
|
||||
settings-back = Назад
|
||||
settings-enabled = Увімкнено
|
||||
settings-disabled = Вимкнено
|
||||
|
||||
# settings - beta notice
|
||||
settings-beta-title = БЕТА версія!
|
||||
settings-beta-desc = Частина функцій може працювати некоректно.
|
||||
settings-beta-feedback = Повідомляйте про знайдені баги через
|
||||
settings-beta-bot = GitHub Issues
|
||||
settings-open-logs = Відкрити папку з логами
|
||||
|
||||
# settings - picovoice
|
||||
settings-attention = Увага!
|
||||
settings-picovoice-warning = Ця нейромережа працює не у всіх!
|
||||
settings-picovoice-waiting = Ми чекаємо офіційного патча від розробників.
|
||||
settings-picovoice-key-desc = Введіть сюди свій ключ Picovoice. Він видається безкоштовно при реєстрації в
|
||||
settings-picovoice-key = Ключ Picovoice
|
||||
|
||||
# settings - vosk
|
||||
settings-auto-detect = Авто-визначення
|
||||
settings-vosk-model = Модель розпізнавання мовлення (Vosk)
|
||||
settings-vosk-model-desc =
|
||||
Виберіть модель Vosk для розпізнавання мовлення.
|
||||
Ви можете завантажити моделі тут: https://alphacephei.com/vosk/models
|
||||
settings-models-not-found = Моделі не знайдено
|
||||
settings-models-hint = Помістіть моделі Vosk в папку resources/vosk
|
||||
|
||||
# settings - openai
|
||||
settings-openai-key = Ключ OpenAI
|
||||
settings-openai-not-supported = Наразі ChatGPT не підтримується. Він буде доданий у наступних оновленнях.
|
||||
|
||||
# ### COMMANDS PAGE
|
||||
commands-title = Команди
|
||||
commands-search = Пошук команд...
|
||||
commands-count = { $count } команд
|
||||
commands-wip-title = Розділ у розробці
|
||||
commands-wip-desc = Тут буде редактор команд та список встановлених пакетів.
|
||||
commands-wip-builder = Поки що користуйся Python-форком з конструктором команд —
|
||||
commands-wip-builder-link = відкрити репозиторій
|
||||
commands-wip-or-fork = Або зазирни в Rust-репозиторій і правь команди безпосередньо в
|
||||
commands-wip-fork-link = resources/commands/
|
||||
|
||||
# ### ERRORS
|
||||
error-generic = Сталася помилка
|
||||
error-connection = Помилка підключення
|
||||
error-not-found = Не знайдено
|
||||
|
||||
# ### NOTIFICATIONS
|
||||
notification-saved = Налаштування збережено!
|
||||
notification-error = Помилка
|
||||
notification-assistant-started = Асистент запущено
|
||||
notification-assistant-stopped = Асистент зупинено
|
||||
|
||||
# SLOTS EXTRACTION
|
||||
settings-slot-engine = Витяг параметрів
|
||||
settings-slot-engine-desc = Витягує параметри з голосових команд (напр. назва міста, число).
|
||||
settings-gliner-model = Модель GLiNER ONNX
|
||||
settings-gliner-model-desc =
|
||||
Оберіть варіант моделі.
|
||||
Квантизовані моделі (int8, uint8) швидші, але менш точні.
|
||||
settings-gliner-models-hint = Моделі GLiNER не знайдено.
|
||||
|
||||
# ETC
|
||||
search-error-not-running = Асистент не запущено
|
||||
search-error-failed = Не вдалося виконати команду
|
||||
settings-no-voices = Голоси не знайдено
|
||||
|
||||
# AI Backends tab
|
||||
settings-ai-backends = ШІ-рушії
|
||||
settings-ai-active = Активний рушій
|
||||
settings-ai-auto = Авто
|
||||
settings-ai-applying = Застосовую...
|
||||
settings-ai-error = Помилка перемикання
|
||||
settings-ai-tips = Підказки
|
||||
settings-llm-backend = LLM рушій
|
||||
settings-llm-backend-desc = Де виконувати LLM-запити. Hot-swap, без перезапуску.
|
||||
settings-tts-backend = TTS рушій
|
||||
settings-tts-backend-desc = Застосується при наступному запуску jarvis-app.
|
||||
settings-llm-context = Контекст розмови
|
||||
settings-llm-context-desc = LLM пам'ятає попередні репліки. Скиньте, якщо відповіді дивні.
|
||||
settings-llm-reset = Скинути контекст
|
||||
settings-profile = Профіль
|
||||
|
||||
# Header buttons
|
||||
header-macros = Макроси
|
||||
header-scheduler = Розклад
|
||||
header-memory = Пам'ять
|
||||
header-plugins = Плагіни
|
||||
|
|
@ -132,7 +132,6 @@ fn get_configured_model_path() -> Result<std::path::PathBuf, String> {
|
|||
let lang_code = match language.as_str() {
|
||||
"ru" => "ru",
|
||||
"en" => "us",
|
||||
"ua" => "uk",
|
||||
other => other,
|
||||
};
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue