Add Chinese (Simplified and Traditional) localization files and implement i18n tests

- Created zh-CN.json and zh-TW.json for Simplified and Traditional Chinese translations respectively.
- Added comprehensive test suite in test_i18n.py to validate JSON structure, server-side i18n functionality, and translation completeness across multiple languages.
This commit is contained in:
Will Miao
2025-08-30 21:41:48 +08:00
parent f6709a55c3
commit 52acbd954a
36 changed files with 4662 additions and 3819 deletions

453
locales/ru.json Normal file
View File

@@ -0,0 +1,453 @@
{
"common": {
"file": "Файл",
"folder": "Папка",
"name": "Имя",
"size": "Размер",
"date": "Дата",
"type": "Тип",
"path": "Путь",
"fileSize": {
"zero": "0 Байт",
"bytes": "Байт",
"kb": "КБ",
"mb": "МБ",
"gb": "ГБ",
"tb": "ТБ"
},
"actions": {
"save": "Сохранить",
"cancel": "Отмена",
"delete": "Удалить",
"edit": "Редактировать",
"copy": "Копировать",
"move": "Переместить",
"refresh": "Обновить",
"download": "Скачать",
"upload": "Загрузить",
"search": "Поиск",
"filter": "Фильтр",
"sort": "Сортировка",
"select": "Выбрать",
"selectAll": "Выбрать всё",
"deselectAll": "Отменить выбор",
"confirm": "Подтвердить",
"close": "Закрыть",
"back": "Назад",
"next": "Далее",
"previous": "Предыдущий",
"view": "Просмотр",
"preview": "Предварительный просмотр",
"details": "Детали",
"backToTop": "Наверх",
"settings": "Настройки",
"help": "Помощь",
"about": "О программе"
},
"status": {
"loading": "Загрузка...",
"saving": "Сохранение...",
"saved": "Сохранено",
"error": "Ошибка",
"success": "Успешно",
"warning": "Предупреждение",
"info": "Информация",
"processing": "Обработка...",
"completed": "Завершено",
"failed": "Неудачно",
"cancelled": "Отменено",
"pending": "Ожидание",
"ready": "Готово"
},
"language": {
"current": "Язык",
"select": "Выбрать язык",
"select_help": "Выберите предпочитаемый язык интерфейса",
"english": "Английский",
"chinese_simplified": "Китайский (упрощённый)",
"chinese_traditional": "Китайский (традиционный)",
"russian": "Русский",
"german": "Немецкий",
"japanese": "Японский",
"korean": "Корейский",
"french": "Французский",
"spanish": "Испанский"
}
},
"header": {
"appTitle": "LoRA Менеджер",
"navigation": {
"loras": "LoRA",
"recipes": "Рецепты",
"checkpoints": "Чекпойнты",
"embeddings": "Эмбеддинги",
"statistics": "Статистика"
},
"search": {
"placeholder": "Поиск...",
"placeholders": {
"loras": "Поиск LoRA...",
"recipes": "Поиск рецептов...",
"checkpoints": "Поиск чекпойнтов...",
"embeddings": "Поиск эмбеддингов..."
},
"options": "Параметры поиска",
"searchIn": "Поиск в:",
"notAvailable": "Поиск недоступен на странице статистики",
"filters": {
"filename": "Имя файла",
"modelname": "Имя модели",
"tags": "Теги",
"creator": "Создатель",
"title": "Название рецепта",
"loraName": "Имя файла LoRA",
"loraModel": "Имя модели LoRA"
}
},
"filter": {
"title": "Фильтр моделей",
"baseModel": "Базовая модель",
"modelTags": "Теги (топ 20)",
"clearAll": "Очистить все фильтры"
},
"theme": {
"toggle": "Переключить тему",
"switchToLight": "Переключить на светлую тему",
"switchToDark": "Переключить на тёмную тему",
"switchToAuto": "Переключить на автоматическую тему"
}
},
"loras": {
"title": "LoRA Модели",
"controls": {
"sort": {
"title": "Сортировать модели по...",
"name": "Имя",
"nameAsc": "А - Я",
"nameDesc": "Я - А",
"date": "Дата добавления",
"dateDesc": "Новые",
"dateAsc": "Старые",
"size": "Размер файла",
"sizeDesc": "Самые большие",
"sizeAsc": "Самые маленькие"
},
"refresh": {
"title": "Обновить список моделей",
"quick": "Быстрое обновление (инкрементное)",
"full": "Полная перестройка (полная)"
},
"fetch": "Получить с Civitai",
"download": "Скачать по URL",
"bulk": "Массовые операции",
"duplicates": "Найти дубликаты",
"favorites": "Показать только избранные"
},
"bulkOperations": {
"title": "Массовые операции",
"selected": "Выбрано {count}",
"sendToWorkflow": "Отправить все выбранные LoRA в рабочий процесс",
"copyAll": "Копировать синтаксис всех выбранных LoRA",
"refreshAll": "Обновить метаданные CivitAI для выбранных моделей",
"moveAll": "Переместить выбранные модели в папку",
"deleteAll": "Удалить выбранные модели",
"clear": "Очистить выбор"
},
"contextMenu": {
"refreshMetadata": "Обновить данные Civitai",
"relinkCivitai": "Переподключить к Civitai",
"copySyntax": "Копировать синтаксис LoRA",
"copyFilename": "Копировать имя файла модели",
"copyRecipeSyntax": "Копировать синтаксис рецепта",
"sendToWorkflowAppend": "Отправить в рабочий процесс (добавить)",
"sendToWorkflowReplace": "Отправить в рабочий процесс (заменить)",
"openExamplesFolder": "Открыть папку с примерами",
"downloadExamples": "Скачать примеры изображений",
"replacePreview": "Заменить превью",
"setContentRating": "Установить возрастной рейтинг",
"moveToFolder": "Переместить в папку",
"excludeModel": "Исключить модель",
"deleteModel": "Удалить модель",
"shareRecipe": "Поделиться рецептом",
"viewAllLoras": "Просмотреть все LoRA",
"downloadMissingLoras": "Скачать недостающие LoRA",
"deleteRecipe": "Удалить рецепт"
},
"modal": {
"title": "Детали LoRA",
"tabs": {
"examples": "Примеры",
"description": "Описание модели",
"recipes": "Рецепты"
},
"info": {
"filename": "Имя файла",
"modelName": "Имя модели",
"baseModel": "Базовая модель",
"fileSize": "Размер файла",
"dateAdded": "Дата добавления",
"triggerWords": "Ключевые слова",
"description": "Описание",
"tags": "Теги",
"rating": "Рейтинг",
"downloads": "Загрузки",
"likes": "Лайки",
"version": "Версия"
},
"actions": {
"copyTriggerWords": "Копировать ключевые слова",
"copyLoraName": "Копировать имя LoRA",
"sendToWorkflow": "Отправить в рабочий процесс",
"viewOnCivitai": "Просмотреть на Civitai",
"downloadExamples": "Скачать примеры изображений"
}
}
},
"recipes": {
"title": "LoRA Рецепты",
"controls": {
"import": "Импортировать рецепт",
"refresh": {
"title": "Обновить список рецептов"
},
"duplicates": {
"title": "Найти дублирующиеся рецепты"
},
"filteredByLora": "Отфильтровано по LoRA",
"create": "Создать рецепт",
"export": "Экспортировать выбранные",
"downloadMissing": "Скачать недостающие LoRA"
},
"duplicates": {
"found": "Найдено {count} дублирующихся групп",
"keepLatest": "Сохранить последние версии",
"deleteSelected": "Удалить выбранные"
},
"card": {
"author": "Автор",
"loras": "{count} LoRA",
"tags": "Теги",
"actions": {
"sendToWorkflow": "Отправить в рабочий процесс",
"edit": "Редактировать рецепт",
"duplicate": "Дублировать рецепт",
"export": "Экспортировать рецепт",
"delete": "Удалить рецепт"
}
}
},
"checkpoints": {
"title": "Модели чекпойнтов",
"info": {
"filename": "Имя файла",
"modelName": "Имя модели",
"baseModel": "Базовая модель",
"fileSize": "Размер файла",
"dateAdded": "Дата добавления"
}
},
"embeddings": {
"title": "Модели эмбеддингов",
"info": {
"filename": "Имя файла",
"modelName": "Имя модели",
"triggerWords": "Ключевые слова",
"fileSize": "Размер файла",
"dateAdded": "Дата добавления"
}
},
"sidebar": {
"modelRoot": "Корень моделей",
"collapseAll": "Свернуть все папки",
"pinToggle": "Закрепить/Открепить боковую панель"
},
"statistics": {
"title": "Статистика",
"tabs": {
"overview": "Обзор",
"usage": "Анализ использования",
"collection": "Коллекция",
"storage": "Хранилище",
"insights": "Аналитика"
},
"overview": {
"title": "Обзор",
"totalLoras": "Всего LoRA",
"totalCheckpoints": "Всего чекпойнтов",
"totalEmbeddings": "Всего эмбеддингов",
"totalSize": "Общий размер",
"favoriteModels": "Избранные модели"
},
"charts": {
"modelsByType": "Модели по типу",
"modelsByBaseModel": "Модели по базовой модели",
"modelsBySize": "Модели по размеру файла",
"modelsAddedOverTime": "Модели, добавленные со временем"
}
},
"modals": {
"delete": {
"title": "Подтвердить удаление",
"message": "Вы уверены, что хотите удалить эту модель?",
"warningMessage": "Это действие нельзя отменить.",
"confirm": "Удалить",
"cancel": "Отмена"
},
"exclude": {
"title": "Исключить модель",
"message": "Вы уверены, что хотите исключить эту модель из библиотеки?",
"confirm": "Исключить",
"cancel": "Отмена"
},
"download": {
"title": "Скачать модель по URL",
"url": "Civitai URL",
"placeholder": "https://civitai.com/models/...",
"locationPreview": "Предварительный просмотр места загрузки",
"useDefaultPath": "Использовать путь по умолчанию",
"useDefaultPathTooltip": "При включении файлы автоматически организуются с использованием настроенных шаблонов путей",
"selectRootDirectory": "Выбрать корневую директорию",
"download": "Скачать",
"cancel": "Отмена"
},
"move": {
"title": "Переместить модели",
"selectFolder": "Выбрать папку назначения",
"createFolder": "Создать новую папку",
"folderName": "Имя папки",
"move": "Переместить",
"cancel": "Отмена"
},
"contentRating": {
"title": "Установить возрастной рейтинг",
"current": "Текущий",
"levels": {
"pg": "Для всех",
"pg13": "13+",
"r": "Ограничено",
"x": "Только для взрослых",
"xxx": "Откровенное содержание"
}
}
},
"errors": {
"general": "Произошла ошибка",
"networkError": "Ошибка сети. Проверьте подключение.",
"serverError": "Ошибка сервера. Попробуйте ещё раз позже.",
"fileNotFound": "Файл не найден",
"invalidFile": "Неверный формат файла",
"uploadFailed": "Загрузка не удалась",
"downloadFailed": "Скачивание не удалось",
"saveFailed": "Сохранение не удалось",
"loadFailed": "Загрузка не удалась",
"deleteFailed": "Удаление не удалось",
"moveFailed": "Перемещение не удалось",
"copyFailed": "Копирование не удалось",
"fetchFailed": "Не удалось получить данные с Civitai",
"invalidUrl": "Неверный формат URL",
"missingPermissions": "Недостаточно прав"
},
"success": {
"saved": "Успешно сохранено",
"deleted": "Успешно удалено",
"moved": "Успешно перемещено",
"copied": "Успешно скопировано",
"downloaded": "Успешно скачано",
"uploaded": "Успешно загружено",
"refreshed": "Успешно обновлено",
"exported": "Успешно экспортировано",
"imported": "Успешно импортировано"
},
"keyboard": {
"navigation": "Навигация с клавиатуры:",
"shortcuts": {
"pageUp": "Прокрутить вверх на одну страницу",
"pageDown": "Прокрутить вниз на одну страницу",
"home": "Перейти наверх",
"end": "Перейти вниз",
"bulkMode": "Переключить массовый режим",
"search": "Фокус на поиске",
"escape": "Закрыть модальное окно/панель"
}
},
"initialization": {
"title": "Инициализация",
"message": "Подготовка рабочего пространства...",
"status": "Инициализация...",
"estimatingTime": "Оценка времени...",
"loras": {
"title": "Инициализация LoRA Менеджера",
"message": "Сканирование и создание кэша LoRA. Это может занять несколько минут..."
},
"checkpoints": {
"title": "Инициализация менеджера чекпойнтов",
"message": "Сканирование и создание кэша чекпойнтов. Это может занять несколько минут..."
},
"embeddings": {
"title": "Инициализация менеджера эмбеддингов",
"message": "Сканирование и создание кэша эмбеддингов. Это может занять несколько минут..."
},
"recipes": {
"title": "Инициализация менеджера рецептов",
"message": "Загрузка и обработка рецептов. Это может занять несколько минут..."
},
"statistics": {
"title": "Инициализация статистики",
"message": "Обработка данных модели для статистики. Это может занять несколько минут..."
},
"tips": {
"title": "Советы и хитрости",
"civitai": {
"title": "Интеграция с Civitai",
"description": "Подключите аккаунт Civitai: Перейдите в Аватар профиля → Настройки → API ключи → Добавить API ключ, затем вставьте его в настройки Lora Manager.",
"alt": "Настройка Civitai API"
},
"download": {
"title": "Простое скачивание",
"description": "Используйте URL Civitai для быстрого скачивания и установки новых моделей.",
"alt": "Скачивание с Civitai"
},
"recipes": {
"title": "Сохранение рецептов",
"description": "Создавайте рецепты для сохранения любимых комбинаций моделей для будущего использования.",
"alt": "Рецепты"
},
"filter": {
"title": "Быстрая фильтрация",
"description": "Фильтруйте модели по тегам или типу базовой модели, используя кнопку фильтра в заголовке.",
"alt": "Фильтр моделей"
},
"search": {
"title": "Быстрый поиск",
"description": "Нажмите Ctrl+F (Cmd+F на Mac) для быстрого поиска в текущем представлении.",
"alt": "Быстрый поиск"
}
},
"steps": {
"scanning": "Сканирование файлов моделей...",
"processing": "Обработка метаданных...",
"building": "Создание кэша...",
"finalizing": "Завершение..."
}
},
"duplicates": {
"found": "Найдено {count} дублирующихся групп",
"showNotification": "Показать уведомление о дубликатах",
"deleteSelected": "Удалить выбранные",
"exitMode": "Выйти из режима",
"help": {
"identicalHashes": "Одинаковые хэши означают одинаковые файлы моделей, даже если у них разные имена или превью.",
"keepOne": "Оставьте только одну версию (предпочтительно с лучшими метаданными/превью) и безопасно удалите остальные."
}
},
"tooltips": {
"refresh": "Обновить список моделей",
"bulkOperations": "Выбрать несколько моделей для пакетных операций",
"favorites": "Показать только избранные модели",
"duplicates": "Найти и управлять дублирующимися моделями",
"search": "Поиск моделей по имени, тегам или другим критериям",
"filter": "Фильтровать модели по различным критериям",
"sort": "Сортировать модели по разным атрибутам",
"backToTop": "Прокрутить обратно наверх страницы"
}
}