Add complete Russian language support to Open Notebook following the
established i18n patterns from ja-JP and pt-BR implementations.
Changes:
- Create ru-RU locale file with all translation keys
- Register ru-RU in locales/index.ts resources and languages array
- Add ru-RU key integrity test
- Add Russian date-fns locale mapping
- Add Russian option to LanguageToggle dropdown
- Add `russian: "Русский"` key to all existing locales
- Update README.md supported languages list
- Update locales CLAUDE.md documentation
Fixes#523
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
Co-authored-by: Luis Novo <lfnovo@gmail.com>
batchTitlesAuto:"Названия будут автоматически сгенерированы для каждого источника.",
batchCommonSettings:"Одинаковые блокноты и трансформации будут применены ко всем элементам.",
urlsCount:"URL: {count}",
filesCount:"Файлов: {count}",
addSource:"Добавить источник",
notEmbeddedAlert:"Содержимое без эмбеддинга",
notEmbeddedDesc:"Для этого содержимого не создан эмбеддинг для векторного поиска. Эмбеддинг обеспечивает расширенные возможности поиска и лучшее обнаружение контента.",
openOnYoutube:"Открыть на YouTube",
urlCopied:"URL скопирован в буфер обмена",
viewSource:"Просмотреть источник",
noInsightSelected:"Инсайт не выбран",
sourceInsight:"Инсайт источника",
manageNotebooks:"Управление блокнотами",
manageNotebooksDesc:"Управление блокнотами, содержащими этот источник",
noNotebooksAvailable:"Нет доступных блокнотов",
loadFailed:"Не удалось загрузить детали источника",
workflowHint:"Профили эпизодов ссылаются на профили говорящих по имени, поэтому начинайте с говорящих, чтобы избежать пропущенных назначений голосов.",
failedToLoadTemplates:"Не удалось загрузить данные шаблонов",
failedToLoadTemplatesDesc:"Убедитесь, что API работает, и попробуйте снова. Некоторые разделы могут быть неполными.",
loadingTemplates:"Загрузка шаблонов…",
speakerProfilesTitle:"Профили говорящих",
speakerProfilesDesc:"Настройте голоса и личности для генерируемых эпизодов.",
createSpeaker:"Создать говорящего",
noSpeakerProfiles:"Пока нет профилей говорящих. Создайте один, чтобы шаблоны эпизодов стали доступны.",
noDescription:"Описание не указано.",
usedByCount_one:"Используется в 1 эпизоде",
usedByCount_other:"Используется в {count} эпизодах",
transcriptModelRequired:"Требуется модель транскрипта",
defaultBriefingRequired:"Требуется брифинг по умолчанию",
segmentsInteger:"Должно быть целым числом",
segmentsMin:"Минимум 3 сегмента",
segmentsMax:"Максимум 20 сегментов",
voiceIdRequired:"Требуется ID голоса",
backstoryRequired:"Требуется биография",
personalityRequired:"Требуется описание личности",
speakerCountMin:"Требуется минимум один говорящий",
speakerCountMax:"Можно настроить до 4 говорящих",
delete:"Удалить",
unknown:"Неизвестно",
deleteSuccess:"Подкаст успешно удалён",
failedToDelete:"Не удалось удалить подкаст",
},
settings:{
contentProcessing:"Обработка контента",
contentProcessingDesc:"Настройте обработку документов и URL",
docEngine:"Движок обработки документов",
docEnginePlaceholder:"Выберите движок обработки документов",
urlEngine:"Движок обработки URL",
urlEnginePlaceholder:"Выберите движок обработки URL",
autoRecommended:"Авто (рекомендуется)",
simple:"Простой",
docling:"Docling",
helpMeChoose:"Помогите выбрать",
docHelp:"· Docling немного медленнее, но точнее, особенно для документов с таблицами и изображениями. · Simple извлекает содержимое без форматирования. · Авто (рекомендуется) попробует Docling и переключится на Simple при необходимости.",
firecrawl:"Firecrawl",
jina:"Jina",
urlHelp:"· Firecrawl — платный сервис (есть бесплатный уровень), очень мощный. · Jina тоже хороший вариант с бесплатным уровнем. · Simple использует базовое HTTP-извлечение и пропустит контент на JavaScript-сайтах. · Авто (рекомендуется) попробует Firecrawl, затем Jina, затем Simple.",
embeddingAndSearch:"Эмбеддинг и поиск",
embeddingAndSearchDesc:"Настройте параметры поиска и эмбеддинга",
defaultEmbeddingOption:"Опция эмбеддинга по умолчанию",
embeddingHelp:"Эмбеддинг контента упрощает поиск для вас и ИИ-агентов. Если вы используете локальную модель эмбеддинга (например, Ollama), можно не беспокоиться о стоимости и создавать эмбеддинг для всего.",
fileManagement:"Управление файлами",
fileManagementDesc:"Настройте обработку и хранение файлов",
filesHelp:"После загрузки и обработки файлы больше не нужны. Большинству пользователей следует разрешить Open Notebook автоматически удалять загруженные файлы из папки загрузок.",
loadFailed:"Не удалось загрузить настройки",
},
advanced:{
title:"Дополнительные инструменты",
desc:"Расширенные инструменты и утилиты для опытных пользователей",
systemInfo:"Информация о системе",
systemInfoDesc:"Просмотр состояния системных компонентов",
rebuildEmbeddings:"Пересоздать эмбеддинги",
rebuildEmbeddingsDesc:"Пересоздать индекс векторного поиска для всех источников",
rebuildWarning:"Это действие может занять много времени в зависимости от количества источников. Существующие векторные индексы будут очищены и эмбеддинги будут созданы заново.",
startRebuild:"Начать пересоздание",
rebuilding:"Пересоздание...",
rebuildSuccess:"Пересоздание эмбеддингов успешно запущено",
currentVersion:"Текущая версия",
latestVersion:"Последняя версия",
status:"Статус",
updateAvailable:"Доступна версия {version}",
updateAvailableDesc:"Доступна новая версия Open Notebook.",
upToDate:"Актуальная версия",
unknown:"Неизвестно",
viewOnGithub:"Посмотреть на GitHub",
updateCheckFailed:"Не удалось проверить обновления. GitHub может быть недоступен.",
rebuild:{
mode:"Режим пересоздания",
existing:"Существующие",
all:"Все",
existingDesc:"Пересоздать эмбеддинги только для элементов с существующими эмбеддингами (быстрее, для смены модели)",
allDesc:"Пересоздать существующие + создать эмбеддинги для элементов без них (медленнее, полный охват)",
include:"Включить в пересоздание",
selectOneError:"Выберите хотя бы один тип элементов для пересоздания",
starting:"Запуск пересоздания...",
startBtn:"🚀 Начать пересоздание",
queued:"В очереди",
running:"Отправка задач...",
completed:"Задачи отправлены!",
failed:"Ошибка",
leavePageHint:"Вы можете покинуть эту страницу — процесс выполняется в фоне",
titlePlaceholder:"Отображаемое название, по умолчанию совпадает с именем",
promptPlaceholder:"Напишите промпт для этой трансформации...",
descriptionPlaceholder:"Опишите, что делает эта трансформация.",
suggestDefault:"Предлагать по умолчанию для новых источников",
promptHint:"Промпты должны учитывать содержимое источника. Вы можете попросить модель резюмировать, извлечь инсайты или создать структурированный вывод, например таблицы.",
createSuccess:"Трансформация успешно создана",
updateSuccess:"Трансформация успешно обновлена",
deleteSuccess:"Трансформация успешно удалена",
noTransformations:"Пока нет трансформаций",
createOne:"Создайте трансформацию для начала",
deleteDesc:"Удаление трансформации нельзя отменить.",
selectModel:"Выберите модель",
deleteConfirm:"Вы уверены, что хотите удалить эту трансформацию?",
model:"Модель",
systemPrompt:"Системный промпт",
type:"Тип",
extraction:"Извлечение",
summary:"Резюме",
custom:"Пользовательский",
saveChanges:"Сохранить изменения",
overrideModelDesc:"Переопределить модель по умолчанию для этой сессии чата. Оставьте пустым для использования системной модели.",
sessionUseReplacement:"Эта сессия будет использовать {name} вместо модели по умолчанию.",
systemDefault:"Системная по умолчанию",
},
models:{
title:"Управление моделями",
desc:"Настройте ИИ-модели для различных задач в Open Notebook",
failedToLoad:"Не удалось загрузить данные моделей",
language:"Языковые модели",
embedding:"Модели эмбеддинга",
tts:"Озвучивание (TTS)",
stt:"Распознавание речи (STT)",
providers:"Провайдеры",
defaultModels:"Модели по умолчанию",
status:"Статус",
notConfigured:"Не настроено",
active:"Активно",
inactive:"Неактивно",
configure:"Настроить",
saveChanges:"Сохранить изменения",
addModel:"Добавить модель",
modelName:"Название модели",
provider:"Провайдер",
apiKey:"API-ключ",
baseUrl:"Базовый URL",
capabilities:"Возможности",
enabled:"Включено",
disabled:"Отключено",
deleteConfirm:"Вы уверены, что хотите удалить эту модель?",
deleteSuccess:"Модель успешно удалена",
saveSuccess:"Модель успешно сохранена",
providerStatus:"Статус провайдера",
connectionOk:"Подключение OK",
connectionFailed:"Ошибка подключения",
changeEmbeddingWarning:"Изменение модели эмбеддинга по умолчанию повлияет на новые источники. Существующие источники могут потребовать переиндексации.",
changeEmbeddingTitle:"Изменить модель эмбеддинга по умолчанию?",
aiProviders:"ИИ-провайдеры",
providerConfigDesc:"Настройте провайдеров через переменные окружения для включения их моделей.",
configuredCount:"Настроено {count} из {total}",
noModels:"Нет моделей",
learnMore:"Узнать, как настроить провайдеров →",
seeLess:"Свернуть",
seeAll:"Показать все {count} провайдеров",
language_models:"Языковые модели",
embedding_models:"Модели эмбеддинга",
text_to_speech:"Озвучивание (TTS)",
speech_to_text:"Распознавание речи (STT)",
languageDesc:"Чат, трансформации и генерация текста",
embeddingDesc:"Семантический поиск и векторные эмбеддинги",
ttsDesc:"Генерация аудио из текста",
sttDesc:"Транскрибация аудио в текст",
all:"Все",
noModelsConfigured:"Модели не настроены",
noProviderModelsConfigured:"Модели {provider} не настроены",
showMore:"Показать ещё {count}",
deleteModel:"Удалить модель",
deleteModelDesc:"Вы уверены, что хотите удалить «{name}»? Это действие нельзя отменить.",
defaultAssignments:"Назначение моделей по умолчанию",
defaultAssignmentsDesc:"Настройте, какие модели использовать для различных задач в Open Notebook",
missingRequiredModels:"Отсутствуют необходимые модели: {models}. Open Notebook может работать некорректно без них.",
selectModelPlaceholder:"Выберите модель",
requiredModelPlaceholder:"⚠️ Обязательно — выберите модель",
whichModelToChoose:"Какую модель выбрать? →",
chatModelLabel:"Модель чата",
chatModelDesc:"Используется для чат-разговоров",
transformationModelLabel:"Модель трансформаций",
transformationModelDesc:"Используется для резюме, инсайтов и трансформаций",
toolsModelLabel:"Модель инструментов",
toolsModelDesc:"Используется для вызова функций — рекомендуется OpenAI или Anthropic",
largeContextModelLabel:"Модель для большого контекста",
largeContextModelDesc:"Используется для обработки больших документов — рекомендуется Gemini",
embeddingModelLabel:"Модель эмбеддинга",
embeddingModelDesc:"Используется для семантического поиска и векторных эмбеддингов",
ttsModelLabel:"Модель озвучивания",
ttsModelDesc:"Используется для генерации подкастов",
sttModelLabel:"Модель распознавания речи",
sttModelDesc:"Используется для транскрибации аудио",
addSpecificModel:"Добавить модель {type}",
addSpecificModelDesc:"Настройте новую модель {type} от доступных провайдеров.",
noProvidersForType:"Нет доступных провайдеров для моделей {type}",
selectProviderPlaceholder:"Выберите провайдера",
providerRequired:"Требуется провайдер",
modelNameRequired:"Требуется название модели",
modelRequired:"Требуется модель",
adding:"Добавление...",
azureHint:"Для Azure используйте название деплоймента как название модели",
enterModelName:"Введите название модели",
embeddingChangeTitle:"Изменение модели эмбеддинга",
embeddingChangeConfirm:"Вы собираетесь изменить модель эмбеддинга с {from} на {to}.",
rebuildRequired:"Важно: Требуется пересоздание",
rebuildReason:"Изменение модели эмбеддинга требует пересоздания всех существующих эмбеддингов для сохранения согласованности. Без пересоздания поиск может возвращать некорректные или неполные результаты.",
whatHappensNext:"Что произойдёт далее:",
step1:"Модель эмбеддинга по умолчанию будет обновлена",
step2:"Существующие эмбеддинги останутся неизменными до пересоздания",
step3:"Новый контент будет использовать новую модель эмбеддинга",
step4:"Вам следует пересоздать эмбеддинги как можно скорее",
proceedToRebuildPrompt:"Хотите перейти на страницу «Дополнительно», чтобы начать пересоздание сейчас?",
changeModelOnly:"Только изменить модель",
changeAndRebuild:"Изменить и перейти к пересозданию",