diff --git a/src/i18n/languages.ts b/src/i18n/languages.ts index f44d5e1..5100fcd 100644 --- a/src/i18n/languages.ts +++ b/src/i18n/languages.ts @@ -19,4 +19,5 @@ export const LANGUAGE_METADATA: Record< vi: { name: "Vietnamese", nativeName: "Tiếng Việt", priority: 7 }, pl: { name: "Polish", nativeName: "Polski", priority: 8 }, it: { name: "Italian", nativeName: "Italiano", priority: 9 }, + ru: { name: "Russian", nativeName: "Русский", priority: 10 }, }; diff --git a/src/i18n/locales/es/translation.json b/src/i18n/locales/es/translation.json index 9743302..156f631 100644 --- a/src/i18n/locales/es/translation.json +++ b/src/i18n/locales/es/translation.json @@ -295,7 +295,8 @@ }, "historyLimit": { "title": "Límite de Historial", - "description": "Número máximo de entradas de historial a conservar" + "description": "Número máximo de entradas de historial a conservar", + "entries": "entradas" }, "recordingRetention": { "title": "Eliminación automática de grabaciones", diff --git a/src/i18n/locales/fr/translation.json b/src/i18n/locales/fr/translation.json index bb2f722..099424b 100644 --- a/src/i18n/locales/fr/translation.json +++ b/src/i18n/locales/fr/translation.json @@ -296,7 +296,8 @@ }, "historyLimit": { "title": "Limite d'historique", - "description": "Nombre maximum d'entrées d'historique à conserver" + "description": "Nombre maximum d'entrées d'historique à conserver", + "entries": "entrées" }, "recordingRetention": { "title": "Suppression automatique des enregistrements", diff --git a/src/i18n/locales/ru/translation.json b/src/i18n/locales/ru/translation.json new file mode 100644 index 0000000..6ea72c0 --- /dev/null +++ b/src/i18n/locales/ru/translation.json @@ -0,0 +1,419 @@ +{ + "tray": { + "settings": "Настройки...", + "checkUpdates": "Проверить обновления...", + "quit": "Выход", + "cancel": "Отмена" + }, + "sidebar": { + "general": "Общие", + "advanced": "Продвинутые", + "postProcessing": "Постобработка", + "history": "История", + "debug": "Отладка", + "about": "О программе" + }, + "onboarding": { + "subtitle": "Для начала выберите модель транскрипции", + "recommended": "Рекомендуется", + "download": "Скачать", + "downloading": "Загрузка...", + "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": "Быстро и точно" + } + }, + "errors": { + "loadModels": "Не удалось загрузить доступные модели.", + "downloadModel": "Не удалось загрузить модель: {{error}}." + } + }, + "modelSelector": { + "welcome": "Добро пожаловать в Handy!", + "downloadPrompt": "Загрузите модель ниже, чтобы начать транскрипцию.", + "availableModels": "Доступные модели", + "downloadModels": "Скачать модели", + "chooseModel": "Выберите модель", + "active": "Активный", + "download": "Скачать", + "downloadSize": "Размер загрузки", + "noModelsAvailable": "Нет доступных моделей", + "extracting": "Извлечение {{modelName}}...", + "extractingMultiple": "Извлечение моделей {{count}}...", + "extractingGeneric": "Извлечение...", + "downloading": "Загрузка {{percentage}} %", + "downloadingMultiple": "Загрузка моделей {{count}}...", + "modelReady": "Модель готова", + "loading": "Загрузка {{modelName}}...", + "loadingGeneric": "Загрузка...", + "modelError": "Ошибка модели", + "modelUnloaded": "Модель выгружена", + "noModelDownloadRequired": "Нет модели – требуется загрузка", + "deleteModel": "Удалить {{modelName}}" + }, + "settings": { + "general": { + "title": "Общие", + "shortcut": { + "title": "Ярлыки Handy", + "description": "Настройте сочетания клавиш для запуска записи речи в текст", + "loading": "Загрузка ярлыков...", + "none": "Ярлыки не настроены", + "notFound": "Ярлык не найден", + "pressKeys": "Нажимайте клавиши...", + "bindings": { + "transcribe": { + "name": "Расшифровать", + "description": "Преобразует вашу речь в текст." + }, + "cancel": { + "name": "Отмена", + "description": "Отменяет текущую запись." + } + }, + "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": "Продвинутые", + "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": "Постобработка", + "disabledNotice": "Постобработка в настоящее время отключена. Включите его в настройках отладки для настройки.", + "api": { + "title": "API (совместимый с OpenAI)", + "provider": { + "title": "Поставщик", + "description": "Выберите поставщика, совместимого с OpenAI." + }, + "appleIntelligence": { + "title": "Apple Интеллект", + "description": "Полностью работает на устройстве. Никакой ключ API или доступ к сети не требуется.", + "requirements": "Требуется 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": "Совет. Используйте ${output}, чтобы вставить расшифрованный текст в приглашение.", + "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": "Добавить пробел после вставленной транскрипции" + }, + "paths": { + "appData": "Данные приложения:", + "models": "Модели:", + "settings": "Настройки:" + } + }, + "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": "Расшифровка..." + } +} diff --git a/src/i18n/locales/vi/translation.json b/src/i18n/locales/vi/translation.json index 22a5829..2769b7c 100644 --- a/src/i18n/locales/vi/translation.json +++ b/src/i18n/locales/vi/translation.json @@ -296,7 +296,8 @@ }, "historyLimit": { "title": "Giới hạn lịch sử", - "description": "Số lượng mục lịch sử tối đa cần giữ" + "description": "Số lượng mục lịch sử tối đa cần giữ", + "entries": "mục" }, "recordingRetention": { "title": "Tự động xóa ghi âm",