* feat: add models settings page with filtering and management - add dedicated models settings page in sidebar - reuse ModelCard component from onboarding for consistent UI - add filter buttons for all/multi-language/translation models - add model deletion with native confirmation dialog (tauri-plugin-dialog) - consolidate model event listeners into useModels hook (Zustand store) - remove duplicate event listeners from ModelSelector, LanguageSelector, TranslateToEnglish - gate AccessibilityPermissions to macOS only - add is_recommended field to model registry for featured models - remove unused get_recommended_first_model command - add translations for all 9 supported languages * feat: add language filter to models settings page adds a searchable language dropdown filter to the models page that lets users filter models by language support. when a non-english language is selected, models that don't support multiple languages (like parakeet) are hidden. - add searchable language dropdown (right-aligned in filter row) - filter models using supports_language_selection capability - add allLanguages translation key to all 10 locales * feat: add translation consistency checker script - add scripts/check-translations.cjs to validate all language files - script dynamically discovers languages from directory structure - checks that all languages have same keys as english reference - detects missing and extra keys in each language - add check:translations npm script - integrate into github actions lint workflow - validates translations on every pull request * fix: update imports and add missing translations after rebase - replace useModels hook with useModelStore in components - add permission error keys to all languages - add model settings keys to cs and tr (new languages from main) * fix: translate english placeholders in cs and tr locale files * refactor: simplify model dropdown and migrate store to immer - model dropdown now only shows downloaded models (no download/delete) - convert store to immer with record types for immutability - remove unused translation keys (welcome, downloadPrompt, etc.) - add missing moonshine-base model fields - sync translations after rebase * fix: add download cancellation support and ui improvements - add full download cancellation with Arc<AtomicBool> flags in rust backend - add progress event throttling (100ms) to prevent ui freeze - add cancel button to model card in settings page - add model-deleted event listener to refresh dropdown after deletion - remove pink background from recommended models in settings (keep badge only) - add cancel/cancelDownload translation keys to all 14 languages * fix: remove duplicate language/translate settings from general and advanced settings are now only in ModelSettingsCard, not duplicated in their old locations * fix: prevent model dropdown from being clipped by window edge * add languages explicitly, clean up some ui * fix: clear bottom progress bar when download is cancelled The ModelSelector component maintains its own local state for download progress. When a download was cancelled, the Rust backend would update its state but never emitted an event to notify the frontend. This caused the bottom progress bar to remain stuck showing "Downloading X%". Added model-download-cancelled event emission in Rust and corresponding listener in ModelSelector to clear progress state on cancellation. * fix: align model card content to top to prevent floating elements Changed ModelCard flex alignment from items-center to items-start so the accuracy/speed bars stay at the top when the card expands (e.g., during download with progress bar visible). * fix: prevent model deletion from interrupting active extractions Added extracting_models HashSet to track models currently being extracted. The update_download_status() function now skips cleanup of .extracting directories for models that are actively extracting, preventing a race condition where deleting one model would interrupt another model's extraction process. * refactor: migrate ModelCard buttons to Button component Added two new Button variants for common patterns: - primary-soft: soft/tinted primary buttons (used for download) - danger-ghost: subtle destructive actions (used for delete/cancel) Migrated all hardcoded buttons in ModelCard to use the shared Button component for consistency and maintainability. * feat: separate downloaded and available models into sections Split the models list into "Your Models" and "Available to Download" sections for clearer visual distinction between downloaded and downloadable models. Also adds missing translation keys to all locales: - modelSelector.capabilities.singleLanguage - modelSelector.capabilities.languageOnly - settings.models.yourModels - settings.models.availableModels * fix: add missing translations after rebase onto main add post-processing hotkey translations to all 15 locales and backfill 29 missing keys for korean locale added in main. * fix: add label to model delete button for clearer destructive state * check translations as typescript * format * better text for dropdown * wip ui tweaks * rounded + ui tweaks * fix download not 0% immediately, ui tweaks * tweak name * block for model downloading in onboarding * small fixes --------- Co-authored-by: CJ Pais <cj@cjpais.com>
500 lines
27 KiB
JSON
500 lines
27 KiB
JSON
{
|
||
"tray": {
|
||
"settings": "Настройки...",
|
||
"checkUpdates": "Проверить обновления...",
|
||
"copyLastTranscript": "Скопировать последнюю транскрипцию",
|
||
"quit": "Выход",
|
||
"cancel": "Отмена"
|
||
},
|
||
"sidebar": {
|
||
"general": "Общие",
|
||
"models": "Модели",
|
||
"advanced": "Продвинутые",
|
||
"postProcessing": "Постобработка",
|
||
"history": "История",
|
||
"debug": "Отладка",
|
||
"about": "О программе"
|
||
},
|
||
"onboarding": {
|
||
"subtitle": "Для начала выберите модель транскрипции",
|
||
"recommended": "Рекомендуется",
|
||
"download": "Скачать",
|
||
"downloading": "Загрузка...",
|
||
"downloadFailed": "Загрузка не удалась. Пожалуйста, попробуйте снова.",
|
||
"modelCard": {
|
||
"accuracy": "точность",
|
||
"speed": "скорость"
|
||
},
|
||
"models": {
|
||
"small": {
|
||
"name": "Whisper Small",
|
||
"description": "Быстро и достаточно точно."
|
||
},
|
||
"medium": {
|
||
"name": "Whisper Medium",
|
||
"description": "Хорошая точность, средняя скорость."
|
||
},
|
||
"turbo": {
|
||
"name": "Whisper Turbo",
|
||
"description": "Сбалансированная точность и скорость."
|
||
},
|
||
"large": {
|
||
"name": "Whisper Large",
|
||
"description": "Хорошая точность, но медленная."
|
||
},
|
||
"parakeet-tdt-0.6b-v2": {
|
||
"name": "Parakeet V2",
|
||
"description": "Только английский. Лучшая модель для англоговорящих."
|
||
},
|
||
"parakeet-tdt-0.6b-v3": {
|
||
"name": "Parakeet V3",
|
||
"description": "Быстро и точно"
|
||
},
|
||
"moonshine-base": {
|
||
"name": "Moonshine Base",
|
||
"description": "Very fast, English only. Handles accents well."
|
||
}
|
||
},
|
||
"errors": {
|
||
"loadModels": "Не удалось загрузить доступные модели.",
|
||
"downloadModel": "Не удалось загрузить модель: {{error}}."
|
||
},
|
||
"permissions": {
|
||
"title": "Требуются разрешения",
|
||
"description": "Handy требуются некоторые разрешения для корректной работы.",
|
||
"microphone": {
|
||
"title": "Доступ к микрофону",
|
||
"description": "Необходим для прослушивания вашего голоса для транскрипции."
|
||
},
|
||
"accessibility": {
|
||
"title": "Доступ к универсальному доступу",
|
||
"description": "Необходим для ввода расшифрованного текста в ваши приложения."
|
||
},
|
||
"grant": "Предоставить разрешение",
|
||
"granted": "Предоставлено",
|
||
"waiting": "Ожидание...",
|
||
"allGranted": "Всё готово!",
|
||
"errors": {
|
||
"checkFailed": "Не удалось проверить разрешения. Пожалуйста, попробуйте снова.",
|
||
"requestFailed": "Не удалось запросить разрешение. Пожалуйста, попробуйте снова."
|
||
}
|
||
}
|
||
},
|
||
"modelSelector": {
|
||
"active": "Активный",
|
||
"switching": "Переключение...",
|
||
"noModelsAvailable": "Нет доступных моделей",
|
||
"extracting": "Извлечение {{modelName}}...",
|
||
"extractingMultiple": "Извлечение моделей {{count}}...",
|
||
"extractingGeneric": "Извлечение...",
|
||
"downloading": "Загрузка {{percentage}} %",
|
||
"downloadingMultiple": "Загрузка моделей {{count}}...",
|
||
"modelReady": "Модель готова",
|
||
"loading": "Загрузка {{modelName}}...",
|
||
"loadingGeneric": "Загрузка...",
|
||
"modelError": "Ошибка модели",
|
||
"modelUnloaded": "Модель выгружена",
|
||
"noModelDownloadRequired": "Нет модели – требуется загрузка",
|
||
"deleteModel": "Удалить {{modelName}}",
|
||
"downloadSpeed": "{{speed}} МБ/с",
|
||
"capabilities": {
|
||
"languageSelection": "Поддерживает несколько языков ввода",
|
||
"multiLanguage": "Многоязычный",
|
||
"translation": "Может переводить на английский",
|
||
"translate": "Перевести на английский",
|
||
"singleLanguage": "Поддерживает только этот язык",
|
||
"languageOnly": "Только {{language}}"
|
||
},
|
||
"cancel": "Отмена",
|
||
"cancelDownload": "Отменить загрузку"
|
||
},
|
||
"settings": {
|
||
"modelSettings": {
|
||
"title": "Настройки {{model}}",
|
||
"noSettingsNeeded": "Эта модель работает автоматически без необходимости настройки."
|
||
},
|
||
"models": {
|
||
"title": "Модели транскрипции",
|
||
"description": "Выберите модель транскрипции или загрузите дополнительные модели. Разные модели предлагают разные уровни точности и скорости.",
|
||
"downloaded": "Загружено",
|
||
"available": "Доступно для загрузки",
|
||
"deleteConfirm": "Вы уверены, что хотите удалить {{modelName}}? Вам нужно будет загрузить её снова, чтобы использовать.",
|
||
"deleteActiveConfirm": "{{modelName}} — ваша активная модель. Удаление остановит транскрипцию, пока вы не выберете новую модель. Вы уверены?",
|
||
"deleteTitle": "Удалить модель",
|
||
"filters": {
|
||
"all": "Все",
|
||
"multiLanguage": "Многоязычные",
|
||
"translation": "Перевод",
|
||
"allLanguages": "Все языки"
|
||
},
|
||
"noModelsMatch": "Нет моделей, соответствующих этому фильтру.",
|
||
"yourModels": "Загруженные модели",
|
||
"availableModels": "Доступны для загрузки"
|
||
},
|
||
"general": {
|
||
"title": "Общие",
|
||
"shortcut": {
|
||
"title": "Ярлыки Handy",
|
||
"description": "Настройте сочетания клавиш для запуска записи речи в текст",
|
||
"loading": "Загрузка ярлыков...",
|
||
"none": "Ярлыки не настроены",
|
||
"notFound": "Ярлык не найден",
|
||
"pressKeys": "Нажимайте клавиши...",
|
||
"bindings": {
|
||
"transcribe": {
|
||
"name": "Горячая клавиша транскрипции",
|
||
"description": "Сочетание клавиш для записи и транскрибирования вашего голоса."
|
||
},
|
||
"cancel": {
|
||
"name": "Горячая клавиша отмены",
|
||
"description": "Сочетание клавиш для отмены текущей записи."
|
||
},
|
||
"transcribe_with_post_process": {
|
||
"name": "Горячая клавиша постобработки",
|
||
"description": "Необязательно: Специальная горячая клавиша, которая всегда применяет AI-постобработку к вашей транскрипции."
|
||
}
|
||
},
|
||
"errors": {
|
||
"restore": "Не удалось восстановить исходный ярлык",
|
||
"set": "Не удалось установить ярлык: {{error}}",
|
||
"reset": "Не удалось сбросить ярлык до исходного значения"
|
||
}
|
||
},
|
||
"language": {
|
||
"title": "Язык",
|
||
"description": "Выберите язык для распознавания речи. «Авто» автоматически определит язык, а выбор конкретного языка может повысить точность определения этого языка.",
|
||
"descriptionUnsupported": "Модель Parakeet автоматически определяет язык. Ручной выбор не требуется.",
|
||
"searchPlaceholder": "Поиск языков...",
|
||
"noResults": "Языки не найдены",
|
||
"auto": "Авто"
|
||
},
|
||
"pushToTalk": {
|
||
"label": "Нажми и говори",
|
||
"description": "Удерживайте, чтобы записать, отпустите, чтобы остановить"
|
||
}
|
||
},
|
||
"sound": {
|
||
"title": "Звук",
|
||
"microphone": {
|
||
"title": "Микрофон",
|
||
"description": "Выберите предпочитаемое микрофонное устройство",
|
||
"placeholder": "Выбрать микрофон...",
|
||
"loading": "Загрузка..."
|
||
},
|
||
"audioFeedback": {
|
||
"label": "Аудио обратная связь",
|
||
"description": "Воспроизведение звука при запуске и остановке записи"
|
||
},
|
||
"outputDevice": {
|
||
"title": "Устройство вывода",
|
||
"description": "Выберите предпочитаемое устройство вывода звука для звуков обратной связи",
|
||
"placeholder": "Выберите устройство вывода...",
|
||
"loading": "Загрузка..."
|
||
},
|
||
"volume": {
|
||
"title": "Объем",
|
||
"description": "Отрегулируйте громкость звуков звуковой обратной связи"
|
||
}
|
||
},
|
||
"advanced": {
|
||
"title": "Продвинутые",
|
||
"groups": {
|
||
"app": "Приложение",
|
||
"output": "Вывод",
|
||
"transcription": "Транскрипция",
|
||
"history": "История",
|
||
"experimental": "Экспериментальное"
|
||
},
|
||
"experimentalToggle": {
|
||
"label": "Экспериментальные функции",
|
||
"description": "Включить экспериментальные функции, которые находятся в разработке."
|
||
},
|
||
"startHidden": {
|
||
"label": "Запускать скрыто",
|
||
"description": "Запускать в системный трей, не открывая окно."
|
||
},
|
||
"autostart": {
|
||
"label": "Запуск при запуске",
|
||
"description": "Автоматически запускать Handy при входе в систему."
|
||
},
|
||
"overlay": {
|
||
"title": "Позиция наложения",
|
||
"description": "Отображение наложения визуальной обратной связи во время записи и транскрипции. В Linux рекомендуется выбрать «Нет».",
|
||
"options": {
|
||
"none": "Нет",
|
||
"bottom": "Снизу",
|
||
"top": "Сверху"
|
||
}
|
||
},
|
||
"pasteMethod": {
|
||
"title": "Метод вставки",
|
||
"description": "Выбрать способ вставки текста. Прямой: имитирует набор текста через системный ввод. Нет: пропуск вставки, обновление только истории/буфера обмена.",
|
||
"options": {
|
||
"clipboard": "Буфер обмена ({{modifier}}+V)",
|
||
"clipboardCtrlShiftV": "Буфер обмена (Ctrl+Shift+V)",
|
||
"clipboardShiftInsert": "Буфер обмена (Shift+Insert)",
|
||
"direct": "Прямой",
|
||
"none": "Нет"
|
||
}
|
||
},
|
||
"clipboardHandling": {
|
||
"title": "Обработка буфера обмена",
|
||
"description": "Функция «Не изменять буфер обмена» сохраняет текущее содержимое буфера обмена после транскрипции. Копировать в буфер обмена оставляет результат транскрипции в буфере обмена после вставки.",
|
||
"options": {
|
||
"dontModify": "Не изменять буфер обмена",
|
||
"copyToClipboard": "Копировать в буфер обмена"
|
||
}
|
||
},
|
||
"translateToEnglish": {
|
||
"label": "Перевести на английский",
|
||
"description": "Автоматически переводить речь с других языков на английский во время транскрипции.",
|
||
"descriptionUnsupported": "Перевод не поддерживается моделью {{model}}."
|
||
},
|
||
"modelUnload": {
|
||
"title": "Выгрузить модель",
|
||
"description": "Автоматически освобождать память графического процессора/процессора, если модель не использовалась в течение указанного времени.",
|
||
"options": {
|
||
"never": "Никогда",
|
||
"immediately": "Немедленно",
|
||
"min2": "Через 2 минуты",
|
||
"min5": "Через 5 минут",
|
||
"min10": "Через 10 минут",
|
||
"min15": "Через 15 минут",
|
||
"hour1": "Через 1 час",
|
||
"sec5": "Через 5 секунд (отладка)"
|
||
}
|
||
},
|
||
"customWords": {
|
||
"title": "Пользовательские слова",
|
||
"description": "Добавить слова, которые часто неправильно слышатся или пишутся с ошибками во время транскрипции. Система автоматически исправит похожие по звучанию слова, чтобы они соответствовали вашему списку.",
|
||
"placeholder": "Добавить слово",
|
||
"add": "Добавлять",
|
||
"remove": "Удалить {{word}}"
|
||
}
|
||
},
|
||
"postProcessing": {
|
||
"title": "Постобработка",
|
||
"hotkey": {
|
||
"title": "Горячая клавиша"
|
||
},
|
||
"api": {
|
||
"title": "API (совместимый с OpenAI)",
|
||
"provider": {
|
||
"title": "Поставщик",
|
||
"description": "Выберите поставщика, совместимого с OpenAI."
|
||
},
|
||
"appleIntelligence": {
|
||
"title": "Apple Интеллект",
|
||
"description": "Полностью работает на устройстве. Никакой ключ API или доступ к сети не требуется.",
|
||
"requirements": "Требуется Apple Silicon Mac под управлением macOS Tahoe (26.0) или более поздней версии. Apple Intelligence должен быть включен в настройках системы.",
|
||
"unavailable": "Apple Intelligence недоступен на этом устройстве. Требуется Apple Silicon Mac под управлением macOS Tahoe (26.0) или более поздней версии с включенным Apple Intelligence в настройках системы."
|
||
},
|
||
"baseUrl": {
|
||
"title": "Базовый URL",
|
||
"description": "Базовый URL-адрес API для выбранного провайдера. Редактировать можно только настраиваемого поставщика.",
|
||
"placeholder": "https://api.openai.com/v1"
|
||
},
|
||
"apiKey": {
|
||
"title": "API-ключ",
|
||
"description": "API-ключ для выбранного провайдера.",
|
||
"placeholder": "sk-..."
|
||
},
|
||
"model": {
|
||
"title": "Модель",
|
||
"descriptionApple": "Укажите дополнительный числовой лимит токенов или сохраните настройки по умолчанию, установленные на устройстве.",
|
||
"descriptionCustom": "Укажите идентификатор модели, ожидаемый вашей пользовательской конечной точкой.",
|
||
"descriptionDefault": "Выберите модель, предоставляемую выбранным поставщиком.",
|
||
"placeholderApple": "Apple Интеллект",
|
||
"placeholderWithOptions": "Найдите или выберите модель",
|
||
"placeholderNoOptions": "Введите название модели",
|
||
"refreshModels": "Обновить модели"
|
||
}
|
||
},
|
||
"prompts": {
|
||
"title": "Быстрый",
|
||
"selectedPrompt": {
|
||
"title": "Выбранная подсказка",
|
||
"description": "Выберите шаблон для уточнения транскрипции или создайте новый. Используйте ${output} внутри текста приглашения для ссылки на записанную стенограмму."
|
||
},
|
||
"noPrompts": "Нет доступных подсказок",
|
||
"selectPrompt": "Выберите подсказку",
|
||
"createNew": "Создать новую подсказку",
|
||
"promptLabel": "Подскажите этикетку",
|
||
"promptLabelPlaceholder": "Введите имя подсказки",
|
||
"promptInstructions": "Оперативная инструкция",
|
||
"promptInstructionsPlaceholder": "Напишите инструкции для запуска после транскрипции. Пример. Улучшите грамматику и ясность следующего текста: ${output}",
|
||
"promptTip": "Совет. Используйте <code>${output}</code>, чтобы вставить расшифрованный текст в приглашение.",
|
||
"updatePrompt": "Обновить запрос",
|
||
"deletePrompt": "Удалить подсказку",
|
||
"createPrompt": "Создать подсказку",
|
||
"cancel": "Отмена",
|
||
"selectToEdit": "Выберите приглашение выше, чтобы просмотреть и изменить его сведения.",
|
||
"createFirst": "Нажмите «Создать новое приглашение» выше, чтобы создать первое приглашение для постобработки."
|
||
}
|
||
},
|
||
"history": {
|
||
"title": "История",
|
||
"openFolder": "Открыть папку с записями",
|
||
"loading": "Загрузка истории...",
|
||
"empty": "Транскрипций пока нет. Начните запись, чтобы создать свою историю!",
|
||
"copyToClipboard": "Скопировать транскрипцию в буфер обмена",
|
||
"save": "Сохранить транскрипцию",
|
||
"unsave": "Удалить из сохраненных",
|
||
"delete": "Удалить запись",
|
||
"deleteError": "Не удалось удалить запись. Пожалуйста, попробуйте еще раз."
|
||
},
|
||
"debug": {
|
||
"title": "Отлаживать",
|
||
"logDirectory": {
|
||
"title": "Каталог журналов",
|
||
"description": "Место хранения файлов журналов"
|
||
},
|
||
"logLevel": {
|
||
"title": "Уровень журнала",
|
||
"description": "Установите уровень детализации журнала"
|
||
},
|
||
"updateChecks": {
|
||
"label": "Проверьте наличие обновлений",
|
||
"description": "Автоматически проверять наличие новых версий Handy"
|
||
},
|
||
"soundTheme": {
|
||
"label": "Звуковая тема",
|
||
"description": "Выберите звуковую тему для начала и остановки записи обратной связи."
|
||
},
|
||
"wordCorrectionThreshold": {
|
||
"title": "Порог исправления слов",
|
||
"description": "Чувствительность к пользовательским исправлениям слов"
|
||
},
|
||
"historyLimit": {
|
||
"title": "Предел истории",
|
||
"description": "Максимальное количество записей истории, которые можно сохранить",
|
||
"entries": "записи"
|
||
},
|
||
"recordingRetention": {
|
||
"title": "Автоматическое удаление записей",
|
||
"description": "Автоматически удаляйте старые записи для экономии места",
|
||
"never": "Никогда",
|
||
"preserveLimit": "Сохраняйте последнюю версию {{count}}",
|
||
"days3": "Через 3 дня",
|
||
"weeks2": "Через 2 недели",
|
||
"months3": "Через 3 месяца",
|
||
"placeholder": "Выберите срок хранения..."
|
||
},
|
||
"alwaysOnMicrophone": {
|
||
"label": "Всегда включенный микрофон",
|
||
"description": "Держите микрофон активным для более быстрого ответа"
|
||
},
|
||
"clamshellMicrophone": {
|
||
"title": "Раскладной микрофон",
|
||
"description": "Микрофон для использования при закрытой крышке ноутбука"
|
||
},
|
||
"postProcessingToggle": {
|
||
"label": "Постобработка",
|
||
"description": "Включить уточнение текста с помощью искусственного интеллекта после транскрипции"
|
||
},
|
||
"muteWhileRecording": {
|
||
"label": "Отключить звук во время записи",
|
||
"description": "Отключение звука системы во время записи"
|
||
},
|
||
"appendTrailingSpace": {
|
||
"label": "Добавить конечный пробел",
|
||
"description": "Добавить пробел после вставленной транскрипции"
|
||
},
|
||
"keyboardImplementation": {
|
||
"title": "Keyboard Implementation",
|
||
"description": "Choose the keyboard shortcut backend.",
|
||
"bindingsReset": "Keyboard shortcuts were incompatible and reset to defaults"
|
||
},
|
||
"paths": {
|
||
"appData": "Данные приложения:",
|
||
"models": "Модели:",
|
||
"settings": "Настройки:"
|
||
},
|
||
"pasteDelay": {
|
||
"title": "Задержка вставки",
|
||
"description": "Задержка перед отправкой нажатия клавиши вставки (в миллисекундах). Увеличьте, если вставляется неправильный текст."
|
||
}
|
||
},
|
||
"about": {
|
||
"title": "О программе",
|
||
"version": {
|
||
"title": "Версия",
|
||
"description": "Текущая версия Handy"
|
||
},
|
||
"appDataDirectory": {
|
||
"title": "Каталог данных приложения",
|
||
"description": "Место, где Handy хранит свои данные"
|
||
},
|
||
"sourceCode": {
|
||
"title": "Исходный код",
|
||
"description": "Просмотреть исходный код и внести свой вклад",
|
||
"button": "Посмотреть на GitHub"
|
||
},
|
||
"supportDevelopment": {
|
||
"title": "Поддержка развития",
|
||
"description": "Помогите нам продолжить создание Handy",
|
||
"button": "Пожертвовать"
|
||
},
|
||
"acknowledgments": {
|
||
"title": "Благодарности",
|
||
"whisper": {
|
||
"title": "Whisper.cpp",
|
||
"description": "Высокопроизводительный вывод модели автоматического распознавания речи OpenAI Whisper",
|
||
"details": "Handy использует Whisper.cpp для быстрой локальной обработки речи в текст. Спасибо великолепной работе Георгия Герганова и его участников."
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"footer": {
|
||
"downloadingModel": "Загрузка {{model}}...",
|
||
"checkingUpdates": "Проверяем наличие обновлений...",
|
||
"updateAvailable": "Доступно обновление: {{version}}",
|
||
"updateAvailableShort": "Доступно обновление",
|
||
"upToDate": "Не требует обновлений",
|
||
"downloadUpdate": "Скачать обновление",
|
||
"restart": "Перезапуск",
|
||
"updateCheckingDisabled": "Проверка обновлений отключена",
|
||
"downloading": "Загрузка... {{progress}} %",
|
||
"installing": "Установка...",
|
||
"preparing": "Подготовка...",
|
||
"checkForUpdates": "Проверьте наличие обновлений"
|
||
},
|
||
"common": {
|
||
"loading": "Загрузка...",
|
||
"save": "Сохранять",
|
||
"cancel": "Отмена",
|
||
"reset": "Перезагрузить",
|
||
"add": "Добавлять",
|
||
"remove": "Удалять",
|
||
"delete": "Удалить",
|
||
"edit": "Редактировать",
|
||
"create": "Создавать",
|
||
"update": "Обновлять",
|
||
"close": "Закрывать",
|
||
"open": "Открыть",
|
||
"default": "По умолчанию",
|
||
"enabled": "Включено",
|
||
"disabled": "Неполноценный",
|
||
"on": "На",
|
||
"off": "Выключенный",
|
||
"yes": "Да",
|
||
"no": "Нет",
|
||
"noOptionsFound": "Вариантов не найдено"
|
||
},
|
||
"accessibility": {
|
||
"permissionsRequired": "Требуются разрешения на доступ",
|
||
"permissionsDescription": "Handy необходимы разрешения на доступ для ввода расшифрованного текста.",
|
||
"openSettings": "Открыть настройки системы",
|
||
"dismiss": "Увольнять"
|
||
},
|
||
"errors": {
|
||
"loadDirectory": "Ошибка загрузки каталога: {{error}}."
|
||
},
|
||
"appLanguage": {
|
||
"title": "Язык приложения",
|
||
"description": "Изменить языка интерфейса Handy"
|
||
},
|
||
"overlay": {
|
||
"transcribing": "Расшифровка..."
|
||
}
|
||
}
|