diff --git a/README-ru.md b/README-ru.md new file mode 100644 index 0000000000..62d020baa0 --- /dev/null +++ b/README-ru.md @@ -0,0 +1,321 @@ + +
+ +
+
+ + + + + +
+ +[English ](./README-en.md) | [简体中文](./README.md) | Русский + +[gitee](https://gitee.com/pixelmax/gin-vue-admin): https://gitee.com/pixelmax/gin-vue-admin + +[github](https://github.com/flipped-aurora/gin-vue-admin): https://github.com/flipped-aurora/gin-vue-admin + +# Руководство по проекту + +[Онлайн-документация](https://www.gin-vue-admin.com/) : https://www.gin-vue-admin.com/ + +[Видеоуроки от настройки окружения до развертывания](https://www.bilibili.com/video/BV1fV411y7dT) + +[Этапы разработки](https://www.gin-vue-admin.com/guide/start-quickly/env.html) (Авторы: LLemonGreen и Fann) + +## 1. Основная информация + +### 1.1 О проекте + +> Gin-vue-admin — это система управления бэкендом, основанная на [Vue](https://vuejs.org) и [Gin](https://gin-gonic.com), с разделением фронтенда и бэкенда. Она интегрирует JWT-аутентификацию, динамическую маршрутизацию, динамическое меню, аутентификацию Casbin, генератор форм, генератор кода и другие функции. Проект предоставляет множество примеров файлов, позволяя вам сосредоточиться на разработке бизнес-логики. + +[Онлайн-демо](http://demo.gin-vue-admin.com): http://demo.gin-vue-admin.com + +Имя пользователя: admin + +Пароль: 123456 + +### 1.2 Руководство по участию + +Привет! Спасибо, что выбрали gin-vue-admin. + +Gin-vue-admin — это фреймворк с разделением фронтенда и бэкенда для разработчиков, дизайнеров и менеджеров продуктов. + +Мы рады, что вы заинтересованы в участии в проекте gin-vue-admin. Прежде чем отправить свой вклад, пожалуйста, ознакомьтесь со следующими рекомендациями. + +#### 1.2.1 Рекомендации по созданию Issues + +- Issues предназначены исключительно для сообщений об ошибках, запросов новых функций и обсуждения дизайна. Другие вопросы могут быть закрыты напрямую. Если у вас возникли вопросы по использованию Element, обратитесь за помощью в [Gitter](https://gitter.im/element-en/Lobby). + +- Перед созданием issue проверьте, не были ли уже зарегистрированы похожие проблемы. + +#### 1.2.2 Рекомендации по Pull Request + +- Сделайте форк этого репозитория на свой аккаунт. Не создавайте ветки в этом репозитории. + +- Формат сообщения коммита должен быть: `[Имя файла]: Описание коммита.` (например, `README.md: Исправлена ошибка xxx`) + +- Убедитесь, что Pull Request создается в ветку `develop`, а не в `master`. + +- Если ваш PR исправляет ошибку, предоставьте описание связанной ошибки. + +- Для принятия PR требуется участие двух мейнтейнеров: один проверяет и одобряет изменения, второй проверяет и объединяет их. + +### 1.3 Список версий + +- master: Код версии 2.0 для продакшена +- develop: Код версии 2.0 для тестирования +- [gin-vue-admin_v2_dev](https://github.com/flipped-aurora/gin-vue-admin/tree/gin-vue-admin_v2_dev) (версия 2.0 с [GormV1](https://v1.gorm.io), стабильная ветка) +- [gva_gormv2_dev](https://github.com/flipped-aurora/gin-vue-admin/tree/gva_gormv2_dev) (версия 2.0 с [GormV2](https://v2.gorm.io), ветка разработки) + +## 2. Начало работы + +``` +- Версия Node > v8.6.0 +- Версия Golang >= v1.14 +- Рекомендуемая IDE: Goland +- Инициализация проекта: разные версии базы данных не инициализированы. См. подробности в документации по инициализации https://www.gin-vue-admin.com/docs/first +- Замените публичный ключ, приватный ключ, имя хранилища и URL по умолчанию для Qiniuyun в проекте, чтобы избежать путаницы с тестовыми файлами. +``` + +### 2.1 Серверная часть проекта + +Используйте `Goland` или другие редакторы кода, откройте каталог `server`. Не открывайте корневой каталог `gin-vue-admin`. + +```bash +# Клонировать проект +git clone https://github.com/flipped-aurora/gin-vue-admin.git + +# Перейти в каталог server +cd server + +# Использовать go mod и установить зависимости Go +go generate + +# Скомпилировать +go build -o server main.go (для Windows команда компиляции: go build -o server.exe main.go) + +# Запустить бинарный файл +./server (для Windows команда запуска: server.exe) +``` + +### 2.2 Фронтенд + +```bash +# Перейти в каталог проекта +cd web + +# Установить зависимости +npm install + +# Запустить в режиме разработки +npm run serve +``` + +### 2.3 Сервер + +```bash +# Использование go.mod + +# Установить модули Go +go list (go mod tidy) + +# Скомпилировать сервер +go build +``` + +### 2.4 Автогенерация документации API с помощью Swagger + +#### 2.4.1 Установка Swagger + +##### (1) Использование VPN или за пределами материкового Китая +```bash +go get -u github.com/swaggo/swag/cmd/swag +``` + +##### (2) В материковом Китае + +В материковом Китае доступ к go.org/x ограничен, рекомендуем использовать [goproxy.io](https://goproxy.io/zh/) или [goproxy.cn](https://goproxy.cn). + +```bash +# Если вы используете Go версии 1.13–1.15, необходимо вручную включить GO111MODULE=on. Для версий Go 1.16 и новее этот шаг можно пропустить +# Шаг 1: Включить Go Modules +go env -w GO111MODULE=on +# Шаг 2: Настроить переменную окружения GOPROXY +go env -w GOPROXY=https://goproxy.cn,https://goproxy.io,direct + +# Если вы хотите избежать лишних действий, используйте go generate для автоматического выполнения кода перед компиляцией. Однако это не работает в терминале командной строки `Goland` или `VSCode` +cd server +go generate -run "go env -w .*?" + +# Установить swag с помощью следующей команды +go get -u github.com/swaggo/swag/cmd/swag +``` + +#### 2.4.2 Генерация документации API + +```bash +cd server +swag init +``` + +> После выполнения приведенной выше команды в каталоге `server` появится папка `docs` с файлами `docs.go`, `swagger.json`, `swagger.yaml`. После запуска сервиса Go введите в браузере [http://localhost:8888/swagger/index.html](http://localhost:8888/swagger/index.html), чтобы просмотреть документацию Swagger. + +## 3. Технологический стек + +- Фронтенд: Используется [Element](https://github.com/ElemeFE/element) на основе [Vue](https://vuejs.org) для создания страниц. +- Бэкенд: Используется [Gin](https://gin-gonic.com/) для быстрого создания RESTful API. [Gin](https://gin-gonic.com/) — это веб-фреймворк, написанный на Go (Golang). +- База данных: `MySQL` (5.6.44), используется [GORM](http://gorm.io) для работы с данными, добавлена поддержка баз данных SQLite. +- Кэш: Используется `Redis` для хранения JWT-токенов активных пользователей и реализации ограничения множественного входа. +- API: Используется Swagger для автоматической генерации документации API. +- Конфигурация: Используются [fsnotify](https://github.com/fsnotify/fsnotify) и [viper](https://github.com/spf13/viper) для работы с файлами конфигурации в формате `yaml`. +- Логи: Используется [zap](https://github.com/uber-go/zap) для записи логов. + +## 4. Архитектура проекта + +### 4.1 Схема архитектуры + +![Схема архитектуры](http://qmplusimg.henrongyi.top/gva/gin-vue-admin.png) + +### 4.2 Подробная схема дизайна фронтенда (Автор: baobeisuper) + +![Подробная схема дизайна фронтенда](http://qmplusimg.henrongyi.top/naotu.png) + +### 4.3 Структура проекта + +``` + ├── server + ├── api (вход для API) + │ └── v1 (интерфейсы версии v1) + ├── config (пакет конфигурации) + ├── core (основные файлы) + ├── docs (каталог документации Swagger) + ├── global (глобальные объекты) + ├── initialize (инициализация) + │ └── internal (внутренние функции инициализации) + ├── middleware (слой промежуточного ПО) + ├── model (слой моделей) + │ ├── request (структуры входных параметров) + │ └── response (структуры выходных параметров) + ├── packfile (упаковка статических файлов) + ├── resource (папка статических ресурсов) + │ ├── excel (путь по умолчанию для импорта/экспорта Excel) + │ ├── page (генератор форм) + │ └── template (шаблоны) + ├── router (слой маршрутизации) + ├── service (слой сервисов) + ├── source (слой источников) + └── utils (набор утилит) + ├── timer (инкапсуляция интерфейса таймера) + └── upload (инкапсуляция интерфейса OSS) + + └─web (фронтенд) + ├─public (шаблоны развертывания) + └─src (исходный код) + ├─api (API фронтенда) + ├─assets (статические файлы) + ├─components (компоненты) + ├─router (маршруты фронтенда) + ├─store (управление состоянием Vuex) + ├─style (общие стили) + ├─utils (общие утилиты фронтенда) + └─view (страницы) +``` + +## 5. Возможности + +- Управление правами: Управление правами на основе `JWT` и `Casbin`. +- Загрузка и скачивание файлов: Реализация операций загрузки файлов на основе `Qiniuyun`, `Aliyun` и `Tencent Cloud` (для каждого сервиса необходимо самостоятельно получить `token` или `key`). +- Инкапсуляция пагинации: Фронтенд использует `mixins` для инкапсуляции пагинации, методы пагинации вызываются через `mixins`. +- Управление пользователями: Системный администратор назначает роли пользователей и их разрешения. +- Управление ролями: Создание основного объекта управления правами, назначение различных разрешений API и меню для роли. +- Управление меню: Реализация динамической конфигурации меню для пользователей, назначение различных меню разным ролям. +- Управление API: Разные пользователи могут вызывать разные разрешения API. +- Управление конфигурацией: Конфигурационный файл можно изменять через интерфейс (функция недоступна на сайте онлайн-демо). +- Условный поиск: Добавлен пример условного поиска. +- Пример RESTful: Примеры API можно увидеть в модуле управления пользователями. + - Ссылка на файл фронтенда: [web/src/view/superAdmin/api/api.vue](https://github.com/flipped-aurora/gin-vue-admin/blob/master/web/src/view/superAdmin/api/api.vue). + - Ссылка на бэкенд: [server/router/sys_api.go](https://github.com/flipped-aurora/gin-vue-admin/blob/master/server/router/sys_api.go). +- Ограничение множественного входа: Измените `user-multipoint` на `true` в разделе `system` файла `config.yaml` (необходимо самостоятельно настроить Redis и его параметры. Во время тестирования сообщайте о багах). +- Загрузка файлов по частям: Предоставлены примеры загрузки файлов и загрузки больших файлов по частям. +- Конструктор форм: Используется [@form-generator](https://github.com/JakHuang/form-generator). +- Генератор кода: Предоставляет бэкенду базовую логику и простой генератор кода для операций CRUD. + +## 6. База знаний + +### 6.1 Блог команды + +> https://www.yuque.com/flipped-aurora +> +> В нашем блоге есть видеоуроки о фреймворке фронтенда. Если проект оказался полезным для вас, вы можете добавить меня в WeChat: shouzi_1994, ваши комментарии приветствуются. + +### 6.2 Видеоуроки + +(1) Курс по настройке среды разработки + +> Bilibili: https://www.bilibili.com/video/BV1Fg4y187Bw/ + +(2) Курс по шаблонам + +> Bilibili: https://www.bilibili.com/video/BV16K4y1r7BD/ + +(3) Введение в версию 2.0 и опыт разработки + +> Bilibili: https://www.bilibili.com/video/BV1aV411d7Gm#reply2831798461 + +(4) Базовый курс по Golang + +> https://space.bilibili.com/322210472/channel/detail?cid=108884 + +(5) Базовый курс по фреймворку Gin + +> Bilibili: https://space.bilibili.com/322210472/channel/detail?cid=126418&ctype=0 + +(6) Видео с введением в обновления версии gin-vue-admin + +> Bilibili: https://space.bilibili.com/322210472/channel/detail?cid=126418&ctype=0 + +## 7. Контакты + +### 7.1 Группы + +#### Группа QQ: 622360840 + +| Группа QQ | +| :---: | +| | + +#### Группа WeChat: напишите в комментариях "加入gin-vue-admin交流群" + +| WeChat | +| :---: | +| + +#### [О нас](https://www.gin-vue-admin.com/about/join.html) + +## 8. Участники + +Спасибо за ваш интерес к участию в gin-vue-admin! + + + Contribution Leaderboard + + + + + + +## 9. Поддержка + +Если вы находите этот проект полезным, вы можете угостить автора стаканом сока :tropical_drink: [здесь](https://www.gin-vue-admin.com/coffee/index.html) + +## 10. Коммерческое использование + +Если вы используете этот проект в коммерческих целях, пожалуйста, соблюдайте лицензию Apache 2.0 и сохраняйте заявление о технической поддержке автора. + +## 11. Перевод + +Поддержка и консультация на рускком языке не производится. + +Переведено: [Vlaidslav Iaskin](https://t.me/xenon007) \ No newline at end of file diff --git a/server/middleware/language.go b/server/middleware/language.go index fc9ec9013e..e210342e10 100644 --- a/server/middleware/language.go +++ b/server/middleware/language.go @@ -14,7 +14,7 @@ func LanguageHandler() gin.HandlerFunc { // fmt.Printf("Accept-Language value is: %s\r\n", lang) var oldLang = global.GVA_CONFIG.Language.Language - if lang != "" && (lang == "en" || lang == "zh" || lang == "ar") { // currently we support en, zh, ar languages only + if lang != "" && (lang == "en" || lang == "zh" || lang == "ar" || lang == "ru") { // currently we support en, zh, ar, ru languages only global.GVA_CONFIG.Language.Language = lang } else { global.GVA_CONFIG.Language.Language = "en" diff --git a/server/resource/lang/ru.json b/server/resource/lang/ru.json new file mode 100644 index 0000000000..186fb145b6 --- /dev/null +++ b/server/resource/lang/ru.json @@ -0,0 +1,534 @@ +{ + "core": { + "server": { + "currentVersion": "Текущая версия", + "welcomeTo": "Добро пожаловать в", + "joinGroup": "Как присоединиться к группе: WeChat ID: shouzi_1994 QQ group: 470239250. Перевел: Xenon007 (Iaskin Vladislav)", + "website": "Веб-сайт проекта", + "pluginMarket": "Рынок плагинов", + "community": "Сообщество обсуждения GVA", + "swagger": "Адрес документации по умолчанию для автоматизации", + "frontend": "Адрес запуска фронтенд-файлов по умолчанию", + "copyright1": "--------------------------------------Заявление об авторских правах--------------------------------------", + "copyright2": "** Авторские права: команда открытого исходного кода flipped-aurora **", + "copyright3": "** Правообладатель: Beijing Flip Aurora Technology Co., Ltd. **", + "copyright4": "** Для удаления логотипа авторизации необходимо приобрести коммерческую лицензию: https://gin-vue-admin.com/empower/index.html **" + }, + "viper": { + "modeGinEnvName": "Вы используете режим gin с именем окружения %s, путь к конфигурации: %s\n", + "envVariable": "Вы используете переменную окружения %s, путь к конфигурации: %s\n", + "commandLineParam": "Вы используете значение, переданное через аргумент командной строки -c, путь к конфигурации: %s\n", + "viperFunc": "Вы используете значение, переданное через функцию Viper(), путь к конфигурации: %s\n" + } + }, + "initialize": { + "projectNotInitialized": "Проект не инициализирован, плагины не могут быть установлены. Перезапустите проект после инициализации для завершения установки плагинов.", + "registrationStarted": "Регистрация начата", + "scheduledDatabaseCleanup": "Запланирована очистка базы данных для содержимого [logs, blacklist]", + "getTableObjectFailed": "Не удалось получить объект таблицы для [%s]!", + "duplicateIndex": "Индекс [%s] дублируется!", + "createIndexFailed": "Не удалось создать индекс [%s]!", + "getIndexObjectFailed": "Не удалось получить объект индекса для [%s]!", + "getIndexListFailed": "Не удалось получить список индексов для [%s]!", + "mongoConnectionFailed": "Не удалось подключиться к базе данных MongoDB!" + }, + "general": { + "createSuccess": "Создано успешно", + "creationFail": "Создание не удалось!", + "creationFailErr": "Создание не удалось", + "deleteFailErr": "Удаление не удалось", + "deleteFail": "Удаление не удалось!", + "deleteSuccess": "Удалено успешно", + "getDataFail": "Получение данных не удалось!", + "getDataFailErr": "Получение данных не удалось", + "getDataSuccess": "Данные получены успешно", + "modifyFail": "Изменение не удалось!", + "modifySuccess": "Изменено успешно", + "queryFail": "Запрос не удался!", + "queryFailErr": "Запрос не удался", + "querySuccess": "Запрос выполнен успешно", + "setupFail": "Настройка не удалась", + "setupFailErr": "Настройка не удалась!", + "setupSuccess": "Настройка выполнена успешно", + "tabelDataInitFail": "Инициализация данных таблицы не удалась!", + "updateFail": "Обновление не удалось!", + "updateFailErr": "Обновление не удалось", + "updateSuccess": "Обновлено успешно", + "invalidPackageName": "Недопустимое имя пакета", + "insufficientPermissions": "Недостаточно прав", + "sendFailed": "Отправка не удалась", + "sendSuccess": "Отправлено успешно" + }, + "init": { + "dbAlreadyExist": "Конфигурация базы данных уже существует!!", + "dbAlreadyInit": "База данных уже инициализирована!", + "initDB": "Перейти к инициализации базы данных" + }, + "model": { + "common": { + "response": { + "operationFail": "Операция не удалась.", + "operationSuccess":"Операция выполнена успешно.", + "success": "Успех" + } + } + }, + "sys_authority": { + "copyFail": "Копирование не удалось!", + "copyFailErr": "Копирование не удалось", + "copySuccess": "Скопировано успешно", + "assignmentFail": "Назначение не удалось", + "assignmentSuccess": "Назначение выполнено успешно" + }, + "sys_auto_code": { + "autoCreateFail": "Автоматическое создание не удалось! Пожалуйста, очистите ненужные данные самостоятельно!", + "largeModelCreationFail": "Создание крупной модели не удалось!", + "largeModelCreationFailErr": "Создание крупной модели не удалось", + "previewFail": "Предпросмотр не удался!", + "previewFailErr": "Предпросмотр не удался", + "previewSuccess": "Предпросмотр выполнен успешно", + "queryTablesFail": "Не удалось запросить таблицы", + "webPluginInstallSuccess": "Установка веб-плагина выполнена успешно", + "serverPluginInstallSuccess": "Установка серверного плагина выполнена успешно", + "webPluginInstallFail": "Не удалось установить веб-плагин, пожалуйста, распакуйте и установите согласно документации. Если это плагин только для бэкенда, игнорируйте это сообщение.", + "serverPluginInstallFail": "Не удалось установить серверный плагин, пожалуйста, распакуйте и установите согласно документации. Если это плагин только для фронтенда, игнорируйте это сообщение.", + "packagingFail": "Упаковка не удалась", + "createInitMenuFail": "Не удалось создать начальное меню", + "fileChangeSuccess": "Изменение файла выполнено успешно", + "createInitApiFail": "Не удалось создать начальный API", + "packagingSuccess": "Упаковка выполнена успешно, путь к файлу: %s", + "injectFail": "Инъекция не удалась", + "injectSuccess": "Инъекция выполнена успешно", + "templateFileReadFailed": "[filepath:%s] Не удалось прочитать файл шаблона!", + "directoryCreationFailed": "[filepath:%s] Не удалось создать директорию!", + "generationFailed": "[filepath:%s] Генерация не удалась!", + "generationSuccess": "[template:%s][filepath:%s] Генерация выполнена успешно!", + "injection_success": "[type:%s] Инъекция выполнена успешно!\n", + "templateFolderReadFailed": "Не удалось прочитать папку шаблонов!", + "illegalTemplateFile": "[filepath:%s] Недопустимый файл шаблона!", + "illegalTemplateDirectory": "[filepath:%s] Недопустимая директория шаблона!", + "illegalTemplateSuffix": "[filepath:%s] Недопустимый суффикс шаблона!", + "templateFolderReadFailedWithDir": "Не удалось прочитать папку шаблонов [%s]!", + "testPackage": "Тестовый пакет", + "testPlugin": "Тестовый плагин", + "description": "Описание", + "displayName": "Отображаемое имя", + "keywordNotice": "%s является ключевым словом Go!", + + "nonStandardPlugin": "Нестандартный плагин, пожалуйста, выполните автоматическую миграцию согласно документации", + "autoPathExists": "В autoPath уже существует плагин с таким же именем, пожалуйста, установите его вручную", + "duplicatePlugin": "Плагин с таким же именем уже существует, пожалуйста, установите его вручную", + "pluginNameRequired": "Имя плагина не может быть пустым", + "webPathNotExist": "Веб-путь не существует", + "serverPathNotExist": "Серверный путь не существует", + + "duplicateRoleId": "Существует дублирующийся ID роли", + "queryRoleDataFailed": "Не удалось запросить данные роли", + "roleNotExist": "Эта роль не существует", + "roleInUse": "Эта роль используется пользователями и не может быть удалена", + "roleHasSubRoles": "Эта роль имеет подроли и не может быть удалена", + "invalidRoleId": "Переданный ID роли недействителен", + + "buttonInUse": "Эта кнопка используется и не может быть удалена", + "menuHasSubMenu": "Это меню имеет подменю и не может быть удалено", + "recordNotFound": "Запись не существует", + "menuUsedAsHome": "Это меню используется ролями в качестве домашней страницы и не может быть удалено", + "duplicateNameUpdateFailed": "Обновление не удалось из-за дублирования имени", + "adaptDatabaseFailed": "Адаптация базы данных не удалась, проверьте, использует ли таблица casbin движок InnoDB!", + "stringLoadModelFailed": "Не удалось загрузить строковую модель", + "noAvailableInit": "Нет доступного процесса инициализации, проверьте, завершена ли инициализация." + }, + "sys_auto_code_history": { + "rollbackSuccess": "Откат выполнен успешно" + }, + "sys_captcha": { + "vCodeFail": "Получение кода верификации не удалось!", + "vCodeFailErr": "Получение кода верификации не удалось", + "vCodeSuccess": "Код верификации получен успешно" + }, + "sys_initdb": { + "autoCreateDBFail": "Автоматическое создание базы данных не удалось!", + "autoCreateDBFailErr": "Автоматическое создание базы данных не удалось, проверьте фоновый лог и выполните инициализацию после проверки", + "autoCreateDBSuccess": "База данных создана автоматически успешно", + "paramVerifyFail": "Проверка параметров не удалась!", + "paramVerifyFailErr": "Проверка параметров не удалась" + }, + "sys_jwt_blacklist": { + "jwtInvalidatedSuccess": "JWT успешно аннулирован", + "jwtInvalidationFailedErr": "Аннулирование JWT не удалось" + }, + "sys_menu": { + "addFail": "Добавление не удалось!", + "addFailErr": "Добавление не удалось", + "addSuccess": "Добавлено успешно" + }, + "sys_operation_record": { + "batchDeleteFail": "Пакетное удаление не удалось!", + "batchDeleteFailErr": "Пакетное удаление не удалось", + "batchDeleteSuccess": "Пакетное удаление выполнено успешно" + }, + "sys_system": { + "rebootFail": "Перезапуск системы не удался!", + "rebootFailErr": "Перезапуск системы не удался", + "rebootSuccess": "Система перезапущена успешно" + }, + "sys_user": { + "changePWErr": "Изменение не удалось, исходный пароль не соответствует текущему аккаунту", + "deleteUserFail": "Удаление пользователя не удалось", + "getTokenErr": "Не удалось получить токен", + "getTokenFail": "Не удалось получить токен!", + "jwtInvalidationFailed": "Аннулирование JWT не удалось!", + "loginFail": "Вход не удался! Имя пользователя не существует или пароль неверный!", + "loginStatusFail": "Не удалось установить статус входа!", + "loginStatusFailErr": "Не удалось установить статус входа", + "loginSuccess": "Вход выполнен успешно", + "registrationFail": "Регистрация не удалась!", + "registrationFailErr": "Регистрация не удалась", + "registrationSuccess": "Регистрация выполнена успешно", + "resetPWFail": "Сброс пароля не удался!", + "resetPWFailErr": "Сброс пароля не удался", + "resetPWSuccess": "Пароль успешно сброшен", + "userNameOrPasswordError": "Имя пользователя не существует или пароль неверный", + "vCodeErr": "Ошибка кода верификации", + "loginFailUserBanned": "Вход не удался! Пользователь заблокирован для входа!", + "userBanned": "Пользователь заблокирован для входа", + "usernameRegistered": "Имя пользователя уже зарегистрировано", + "passwordError": "Неверный пароль", + "originalPasswordError": "Исходный пароль неверный", + "userHasNoRole": "У пользователя нет этой роли", + "defaultRouteNotFound": "Маршрут по умолчанию не найден, невозможно переключиться на эту роль", + "queryUserDataFailed": "Не удалось запросить данные пользователя", + "userNotExist": "Пользователь не существует" + }, + "system": { + "api": { + "desc": { + "addMenu": "Добавить меню", + "addMenuRole": "Добавить ассоциацию меню и роли", + "addTemplateMethod": "Добавить метод шаблона", + "autoCode": "Автоматизация кода", + "batchDeleteAnnouncement": "Пакетное удаление объявлений", + "batchDeleteExportTemplate": "Пакетное удаление шаблонов экспорта", + "batchDeleteOperationHistory": "Пакетное удаление истории операций", + "breakpointContinue": "Продолжение с точки останова", + "breakpointContinueFinish": "Продолжение с точки останова завершено", + "changePassword": "Изменить пароль (рекомендуется)", + "changeRoleAPIPermission": "Изменить права доступа к API для роли", + "configurationTemplates": "Шаблон конфигурации", + "confirmSyncApi": "Подтвердить синхронизацию API", + "copyRole": "Копировать роль", + "createAPI": "Создать API", + "createCustomer": "Создать клиента", + "createDictionary": "Создать словарь", + "createDictionaryContent": "Создать содержимое словаря", + "createExportTemplate": "Создать шаблон экспорта", + "createOperationRecord": "Создать запись операции", + "createPluginPackage": "Создать пакет плагина", + "createRole": "Создать роль", + "deleteAPI": "Удалить API", + "deleteAPIByID": "Пакетное удаление API", + "deleteAnnouncement": "Удалить объявление", + "deleteButton": "Удалить кнопку", + "deleteCustomer": "Удалить клиента", + "deleteDictionary": "Удалить словарь", + "deleteDictionaryContent": "Удалить содержимое словаря", + "deleteExportTemplate": "Удалить шаблон экспорта", + "deleteFile": "Удалить файл", + "deleteMenu": "Удалить меню", + "deleteOperationRecord": "Удалить запись операции", + "deleteRole": "Удалить роль", + "deleteRollbackRecord": "Удалить запись отката", + "deleteTemplate": "Удалить шаблон", + "deleteUsers": "Удалить пользователей", + "downloadTemplate": "Скачать шаблон", + "editFileNameOrRemark": "Редактировать имя файла или примечание", + "exportExcel": "Экспортировать в Excel", + "fileIntegrityCheck": "Проверка целостности файла", + "fileUploadExample": "Пример загрузки файла", + "findTargetFile": "Найти целевой файл (второй проход)", + "getAPIByID": "Получить детали API", + "getAPIList": "Получить список API", + "getAllAPI": "Получить все API", + "getAllDatabases": "Получить все базы данных", + "getAllTemplates": "Получить все шаблоны", + "getAnnouncementByID": "Получить объявления по ID", + "getAnnouncementList": "Получить список объявлений", + "getConfigFileContent": "Получить содержимое файла конфигурации", + "getCustomerList": "Получить список клиентов", + "getDatabaseTables": "Получить таблицы базы данных", + "getDictionaryById": "Получить словарь по ID", + "getDictionaryContentById": "Получить содержимое словаря по ID", + "getDictionaryContentList": "Получить список содержимого словаря", + "getDictionaryList": "Получить список словарей", + "getDynamicRoute": "Получить динамический маршрут пользователя", + "getExistingButtonPermission": "Получить существующие разрешения кнопки", + "getExportTemplateById": "Получить шаблон экспорта по ID", + "getExportTemplateList": "Получить список шаблонов экспорта", + "getMenuByID": "Получить меню по ID", + "getMenuList": "Получить список меню", + "getMenuRole": "Получить меню указанной роли", + "getMenuTree": "Получить дерево меню (обязательно)", + "getMetaInfo": "Получить мета-информацию", + "getOperationRecordById": "Получить запись операции по ID", + "getOperationRecordList": "Получить список записей операций", + "getPermissionList": "Получить список разрешений", + "getRoleList": "Получить список ролей", + "getRouteGroup": "Получить группу маршрутов", + "getSelectedTableFields": "Получить все поля выбранной таблицы", + "getSelfInfo": "Получить информацию о себе (обязательно)", + "getServerInfo": "Получить информацию о сервере", + "getSingleCustomer": "Получить одного клиента", + "getSyncApi": "Получить синхронизированный API", + "getTemplateFile": "Получить файл шаблона", + "getUploadFileList": "Получить список загруженных файлов", + "getUsersList": "Получить список пользователей", + "ignoreApi": "Игнорировать API", + "importExcel": "Импортировать Excel", + "installPlugin": "Установить плагин", + "jwtAddedToBlackList": "JWT добавлен в черный список (требуется выход)", + "mergeFileAfterUpload": "Объединить файл после загрузки", + "modifyUserRole": "Изменить роль пользователя (обязательно)", + "newAnnouncement": "Новое объявление", + "packagePlugin": "Упаковать плагин", + "pluginVersionResumableUpload": "Возобновляемая загрузка версии плагина", + "previewAutoCode": "Предпросмотр автоматического кода", + "queryRollbackRecord": "Запросить запись отката", + "removeFileAfterUpload": "Удалить файл после загрузки", + "resetUserPassword": "Сбросить пароль пользователя", + "resetUserWeb": "Конфигурация пользовательского интерфейса", + "rollbackAutoGeneratedCode": "Откатить автоматически сгенерированный код", + "sendEmail": "Отправить электронное письмо", + "sendTestEmail": "Отправить тестовое электронное письмо", + "setButtonPermission": "Установить разрешение кнопки", + "setConfigFileContent": "Установить содержимое файла конфигурации", + "setPermissionGroup": "Установить группу разрешений", + "setRolePermissions": "Установить разрешения ресурсов для роли", + "setSelfInfo": "Установить информацию о себе (обязательно)", + "setUserInfo": "Установить информацию о пользователе", + "updateAPI": "Обновить API", + "updateAnnouncement": "Обновить объявление", + "updateCustomer": "Обновить клиента", + "updateDictionary": "Обновить словарь", + "updateDictionaryContent": "Обновить содержимое словаря", + "updateExportTemplate": "Обновить шаблон экспорта", + "updateMenu": "Обновить меню", + "updateRole": "Обновить роль", + "userLoginRequired": "Вход пользователя (обязательно)", + "userRegistration": "Регистрация пользователя", + "tableDataInitFail": "Инициализация данных таблицы не удалась", + "newParameter": "Новый параметр", + "deleteParameter": "Удалить параметр", + "batchDeleteParameters": "Пакетное удаление параметров", + "updateParameters": "Обновить параметры", + "getParametersById": "Получить параметры по ID", + "getParametersList": "Получить список параметров", + "categoryList": "Список категорий", + "addEditCategory": "Добавить/редактировать категорию", + "deleteCategory": "Удалить категорию" + }, + "group": { + "announcement": "Объявления", + "api": "API", + "buttonAuthority": "Авторизация кнопки", + "casbin": "Casbin", + "codeGen": "Генератор кода", + "codeGenHistory": "Журнал генератора кода", + "customer": "Клиент", + "dictDetails": "Детали системного словаря", + "dictionary": "Системный словарь", + "email": "Электронная почта", + "fileUploadDownload": "Загрузка и скачивание файлов", + "menu": "Меню", + "optRecord": "Запись операций", + "partialUpload": "Частичная загрузка", + "resumeUpload": "Возобновляемая загрузка (версия плагина)", + "role": "Роль", + "systemService": "Системная служба", + "systemUser": "Системный пользователь", + "tableTemplate": "Шаблоны таблиц", + "templateConfiguration": "Конфигурация шаблонов", + "parameterManagement": "Управление параметрами", + "mediaLibraryCategories": "Категории медиа-библиотеки" + } + }, + "authority": { + "normalUserSubRole": "Подроль обычного пользователя", + "normalUsers": "Обычные пользователи", + "permissionRefreshFailed": "Создано успешно, обновление разрешений не удалось.", + "testRole": "Тестовая роль" + }, + "dictionary": { + "boolType": "Булев тип", + "floatType": "Тип с плавающей точкой", + "gender": "Тип пола", + "genderDict": "Словарь пола", + "intType": "Целочисленный тип", + "intTypeDict": "Тип базы данных, соответствующий целочисленному типу", + "stringType": "Строковый тип", + "timeDateType": "Тип даты и времени", + "timeDateTypeDict": "Тип даты и времени базы данных" + }, + "dictionary_detail": { + "female": "Женский", + "male": "Мужской" + }, + "menu": { + "about": "О нас", + "adminTools": "Инструменты администрирования", + "announcementManage": "Управление объявлениями [Пример]", + "apiManage": "Управление API", + "autoCode": "Генератор кода", + "autoCodeEdit": "Автоматизация кода (повторное использование)", + "autoCodeManage": "Управление автоматизированным кодом", + "breakPoint": "Загрузка больших файлов", + "customerList": "Список клиентов (пример ресурса)", + "dashboard": "Панель управления", + "dataTableInitFail": "Не удалось инициализировать данные таблицы", + "dictDetail": "Детали словаря", + "dictManage": "Управление словарем", + "emailPlugin": "Плагин электронной почты", + "examples": "Примеры", + "excelImportExport": "Импорт и экспорт Excel", + "formCreator": "Конструктор форм", + "mediaLibUpDown": "Медиа-библиотека (загрузка и скачивание)", + "menuManage": "Управление меню", + "operationLog": "Журнал аудита", + "packagePlugin": "Упаковка плагина", + "personalInfo": "Личная информация", + "pluginInstall": "Установка плагина", + "pluginMarket": "Рынок плагинов", + "pluginSystem": "Система плагинов", + "resumableUpload": "Возобновляемая загрузка (версия плагина)", + "resume": "Возобновление с точки останова (версия плагина)", + "roleManage": "Управление ролями", + "serverStatus": "Статус сервера", + "system": "Конфигурация системы", + "systemTools": "Системные инструменты", + "tableTemplate": "Шаблон таблицы", + "templateConfig": "Конфигурация шаблонов", + "userManage": "Управление пользователями", + "website": "Официальный веб-сайт", + "buttonKey": "Ключ кнопки", + "buttonComment": "Комментарий к кнопке", + "menuID": "ID меню", + "parameterManagement": "Управление параметрами" + } + }, + "announcement": { + "publicAnnouncementAPI": "Информация об API объявлений, не требующая аутентификации", + "initConfigFailed": "Не удалось инициализировать файл конфигурации", + "announcementManagement": "Управление объявлениями", + "registryFailed": "Регистрация не удалась" + }, + "sys_api": { + "syncFail": "Синхронизация не удалась", + "ignoreFail": "Игнорирование не удалось", + "refreshFail": "Обновление не удалось", + "refreshSuccess": "Обновление выполнено успешно" + }, + "api": { + "example": { + "exa_breakpoint_continue": { + "fileFail": "Загрузка файла не удалась", + "fileReadFail": "Чтение файла не удалось", + "checkMD5Fail": "Проверка MD5 не удалась", + "findOrCreateRecordFail": "Не удалось найти или создать запись", + "resumeFromBreakpointFail": "Возобновление с точки останова не удалось", + "createFileRecordFail": "Не удалось создать запись файла", + "sliceCreationSuccess": "Создание среза выполнено успешно", + "searchFail": "Поиск не удался", + "searchSuccess": "Поиск выполнен успешно", + "fileCreationFail": "Создание файла не удалось", + "fileCreationSuccess": "Создание файла выполнено успешно", + "cacheSliceDeleteFail": "Не удалось удалить кэш-срез", + "cacheSliceDeleteSuccess": "Удаление кэш-среза выполнено успешно" + } + } + }, + "service": { + "duplicateApi": "Существует дублирующийся API", + "invalidSortField": "Недопустимое поле сортировки", + "duplicateApiPath": "Существует дублирующийся путь API", + "invalidSortFieldV": "Недопустимое поле сортировки: %v", + "fileDeleteFailed": "Удаление файла не удалось", + "menuDeleteFailed": "Удаление меню не удалось", + "tableDeleteFailed": "Удаление таблицы не удалось", + "rollbackInjectionSuccess": "Откат инъекционного кода выполнен успешно!", + "fileMoveFailed": "Перемещение файла не удалось!", + "templateCannotBeEmpty": "Шаблон не может быть пустым", + "pageIsFormGenerator": "Страница является генератором форм", + "packageNameCannotBeEmpty": "Имя пакета не может быть пустым", + "cannotUseReservedPackageName": "Нельзя использовать зарезервированное имя пакета", + "duplicatePackageNameExists": "Существует дублирующееся имя пакета", + "failedToGetAllPackages": "Не удалось получить все пакеты" + }, + "utils": { + "checkFailZeroValue": "Проверка не удалась, невозможно захватить нулевое значение", + "checkFailNameEmpty": "Проверка не удалась, невозможно корректно проверить, пустое ли имя", + "checkFailPass": "Проверка не удалась, невозможно пройти проверку", + "getHuaweiObjectFailed": "Не удалось получить объект хранилища Huawei!", + "fileUploadFailed": "Загрузка файла не удалась!", + "getHuaweiObjectFailedDuplicate": "Не удалось получить объект хранилища Huawei!", + "deleteObjectFailed": "Не удалось удалить объект (%s)! Вывод: %v", + + "fileOpenParseFailed": "[filepath:%s] Не удалось открыть/разобрать файл!", + "fileOpenFailed": "[filepath:%s] Не удалось открыть файл!", + "injectionFailed": "[filepath:%s] Инъекция не удалась!", + + "test_gva_user_injection": "Тестирование инъекции структуры GvaUser", + "test_gva_user_rollback": "Тестирование отката GvaUser", + "test_user_injection": "Тестирование инъекции &model.User{}", + "test_exa_customer_injection": "Тестирование инъекции new(model.ExaCustomer)", + "test_sys_users_injection": "Тестирование инъекции new(model.SysUsers)", + "test_user_rollback": "Тестирование отката &model.User{}", + "test_exa_customer_rollback": "Тестирование отката new(model.ExaCustomer)", + "cookieRewriteFailed": "Не удалось переписать токен cookie, невозможно успешно разобрать токен. Проверьте, содержит ли заголовок запроса x-token и соответствуют ли claims требуемой структуре.", + "jwtParseFailed": "Не удалось получить информацию о разборе JWT из контекста Gin. Проверьте, содержит ли заголовок запроса x-token и соответствуют ли claims требуемой структуре.", + "gvaPluginRegister": "Тестирование инъекции регистрации плагина Gva", + "gvaPluginRollback": "Тестирование отката плагина Gva", + "initCustomerRouterRollback": "Тестирование отката InitCustomerRouter", + "initFileUploadAndDownloadRouterRollback": "Тестирование отката InitFileUploadAndDownloadRouter", + "exaFileUploadAndDownloadInjection": "Тестирование инъекции &example.ExaFileUploadAndDownload{}", + "exaCustomerInjection": "Тестирование инъекции &example.ExaCustomer{}", + "newExaFileUploadAndDownloadInjection": "Тестирование инъекции new(example.ExaFileUploadAndDownload)", + "newExaCustomerInjection": "Тестирование инъекции new(example.ExaCustomer)", + "exaFileUploadAndDownloadRollback": "Тестирование отката &example.ExaFileUploadAndDownload{}", + "exaCustomerRollback": "Тестирование отката &example.ExaCustomer{}", + "newExaFileUploadAndDownloadRollback": "Тестирование отката new(example.ExaFileUploadAndDownload)", + "newExaCustomerRollback": "Тестирование отката new(example.ExaCustomer)", + + "fileUploadAndDownloadRouterRollback": "Тестирование отката FileUploadAndDownloadRouter", + "fileUploadAndDownloadApiRollback": "Тестирование отката FileUploadAndDownloadApi", + "fileUploadAndDownloadServiceRollback": "Тестирование отката FileUploadAndDownloadService", + "fileUploadAndDownloadRouterInjection": "Тестирование инъекции FileUploadAndDownloadRouter", + "fileUploadAndDownloadApiInjection": "Тестирование инъекции FileUploadAndDownloadApi", + "fileUploadAndDownloadServiceInjection": "Тестирование инъекции FileUploadAndDownloadService", + + "exampleApiGroupRollback": "Тестирование отката ExampleApiGroup", + "exampleRouterGroupRollback": "Тестирование отката ExampleRouterGroup", + "exampleServiceGroupRollback": "Тестирование отката ExampleServiceGroup", + "exampleApiGroupInjection": "Тестирование инъекции ExampleApiGroup", + "exampleRouterGroupInjection": "Тестирование инъекции ExampleRouterGroup", + "exampleServiceGroupInjection": "Тестирование инъекции ExampleServiceGroup", + + "gvaPluginUserApiInjection": "Тестирование инъекции Gva Plugin UserApi", + "gvaPluginUserRouterInjection": "Тестирование инъекции Gva Plugin UserRouter", + "gvaPluginUserServiceInjection": "Тестирование инъекции Gva Plugin UserService", + "gvaUserInjection": "Тестирование инъекции gva User", + "gvaPluginUserRouterRollback": "Тестирование отката Gva Plugin UserRouter", + "gvaPluginUserApiRollback": "Тестирование отката Gva Plugin UserApi", + "gvaPluginUserServiceRollback": "Тестирование отката Gva Plugin UserService", + + "gvaPluginUserInjection": "Тестирование инъекции Gva Plugin User", + "chineseInjection": "Тестирование инъекции на китайском", + "gvaPluginUserRollback": "Тестирование отката Gva Plugin User", + + "registrationError": "уже зарегистрирован и не может быть зарегистрирован повторно", + "valueCannotBeEmpty": "не может быть пустым", + "formatValidationFailed": "проверка формата не удалась", + "lengthOrValueOutOfRange": "длина или значение вне допустимого диапазона", + "sysNoSupport": "Система не поддерживает", + "fileNameInvalid": "Имя файла недействительно" + }, + "router": {} +} \ No newline at end of file diff --git a/server/utils/translate/translator.go b/server/utils/translate/translator.go index a228c8f001..6c00e31761 100644 --- a/server/utils/translate/translator.go +++ b/server/utils/translate/translator.go @@ -22,6 +22,7 @@ type Translator struct { // t.bundle.MustLoadMessageFile("./lang/en.json") // t.bundle.MustLoadMessageFile("./lang/zh.json") // t.bundle.MustLoadMessageFile("./lang/ar.json") +// t.bundle.MustLoadMessageFile("./lang/ru.json") // t.localizer = i18n.NewLocalizer(t.bundle, initLang) // should add additionl check here // t.IsInit = true // // end of adding diff --git a/web/src/App.vue b/web/src/App.vue index 745fe9e5f0..3e39d66fce 100644 --- a/web/src/App.vue +++ b/web/src/App.vue @@ -13,6 +13,7 @@ import zh from 'element-plus/dist/locale/zh-cn.mjs' import en from 'element-plus/dist/locale/en.mjs' import ar from 'element-plus/dist/locale/ar.mjs' + import ru from 'element-plus/dist/locale/ru.mjs' import zh_tw from 'element-plus/dist/locale/zh-tw.mjs' import { useAppStore } from '@/pinia' import { useI18n } from 'vue-i18n' @@ -26,7 +27,8 @@ 'zh-cn': zh, 'zh-TW': zh_tw, en: en, - ar: ar + ar: ar, + ru: ru } const { locale } = useI18n() diff --git a/web/src/assets/flags/ru.svg b/web/src/assets/flags/ru.svg new file mode 100644 index 0000000000..855b805a55 --- /dev/null +++ b/web/src/assets/flags/ru.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/web/src/components/i18n/selectLanguage.vue b/web/src/components/i18n/selectLanguage.vue index 6c31630592..a590196396 100644 --- a/web/src/components/i18n/selectLanguage.vue +++ b/web/src/components/i18n/selectLanguage.vue @@ -21,11 +21,18 @@ />繁體中文 العربيةالعربية + />العربية + + Русскийالعربية diff --git a/web/src/i18n.js b/web/src/i18n.js index e6d4d34edd..e40d236b03 100644 --- a/web/src/i18n.js +++ b/web/src/i18n.js @@ -3,6 +3,7 @@ import enLocale from './locales/en.json' import zhLocale from './locales/zh.json' import zhtwLocale from './locales/zh-TW.json' import arLocale from './locales/ar.json' +import ruLocale from './locales/ru.json' import Cookies from 'js-cookie' const messages = { @@ -17,6 +18,9 @@ const messages = { }, ar: { ...arLocale + }, + ru: { + ...ruLocale } } diff --git a/web/src/locales/ru.json b/web/src/locales/ru.json new file mode 100644 index 0000000000..8f0122fea3 --- /dev/null +++ b/web/src/locales/ru.json @@ -0,0 +1,1125 @@ +{ + "components": { + "arrayCtrl": { + "new": "+ Добавить" + }, + "bottomInfo": { + "poweredBy": "Работает на", + "copyright": "Авторские права", + "faTeam": "Команда flipped-aurora" + }, + "commandMenu": { + "commandMenuNote": "Введите функцию, к которой нужно быстро перейти", + "close": "Закрыть", + "jump": "Перейти", + "operate": "Действия", + "lightTheme": "Светлая тема", + "darkTheme": "Темная тема", + "logout": "Выйти" + }, + "exportExcel": { + "exportExcel": { + "export": "Экспортировать", + "templateIdErr": "Компонент не имеет установленного идентификатора шаблона." + }, + "exportTemplate": { + "exportTemplate": "Шаблон экспорта", + "templateIdErr": "Компонент не имеет установленного идентификатора шаблона." + }, + "importExcel": { + "import": "Импортировать", + "importSuccess": "Импорт выполнен успешно" + } + }, + "selectFile": { + "uploadFiles": "Загрузить файлы", + "uploadFailed": "Ошибка загрузки" + }, + "selectImage": { + "selectImage": { + "mediaLibrary": "Медиа-библиотека", + "mediaLibraryNote": "Медиа-библиотека | Нажмите на «Имя файла», чтобы отредактировать. Выбранная категория — это категория загрузки.", + "addCategory": "Добавить категорию", + "editCategory": "Редактировать категорию", + "deleteCategory": "Удалить категорию", + "editCategoryNote": "Нажмите на «Имя файла», чтобы отредактировать; выбранная категория — это категория загрузки.", + "select": "Выбрать", + "category": "Категория", + "parentCategory": "Родительская категория", + "categoryName": "Название категории", + "allCategories": "Все категории", + "enterCategoryName": "Введите название категории", + "categoryNameNote": "Максимум 20 символов" + } + }, + "upload": { + "common": { + "normalUpload": "Обычная загрузка", + "fileFormatNote": "Загружаемые изображения могут быть только в формате jpg, png, svg, webp, а видео — только в формате mp4, webm!", + "videoSizeError": "Размер загружаемого видео не может превышать 5 МБ", + "imageSizeError": "Размер несжатых загружаемых изображений не может превышать 500 КБ, используйте сжатую загрузку" + }, + "image": { + "compressedUpload": "Сжатая загрузка", + "avatarImageFormatError": "Загружаемые изображения для аватара могут быть только в формате jpg или png!" + } + } + }, + "api": { + "group": "Группа", + "setupSuccess": "API успешно настроен!" + }, + "authority": { + "addRole": "Добавить роль", + "authorityNote": "Примечание: Потяните вниз аватар в правом верхнем углу, чтобы переключить роли", + "copyRole": "Копировать роль", + "editRole": "Редактировать роль", + "parentRole": "Родительская роль", + "positiveIntNote": "Введите положительное целое число", + "resourcePermissions": "Разрешения на ресурсы", + "roleAPI": "API роли", + "roleConfig": "Конфигурация роли", + "roleDeleteConfirm": "Это действие навсегда удалит роль, хотите продолжить?", + "roleID": "ID роли", + "roleId0Error": "ID роли не может быть 0", + "roleIdNote": "Введите ID роли", + "roleMenu": "Меню роли", + "roleName": "Название роли", + "roleNameNote": "Введите название роли", + "roleSelectMethod": "Выберите метод запроса", + "rootRole": "Корневая роль", + "setPermissions": "Установить разрешения", + "roleIdError": "Должно быть положительным целым числом", + "": "" + }, + "error": { + "message1": "Страница была поглощена таинственными силами, свяжитесь с нами, чтобы исправить это.", + "message2": "Частая проблема: для этой роли нет текущего маршрута. Если вы уверены, что хотите использовать этот маршрут, перейдите в управление ролями, чтобы назначить его.", + "projectAddress": "Адрес проекта:", + "backToHome": "Вернуться на главную" + }, + "general": { + "add": "Добавить", + "addTo": "Добавить", + "addSuccess": "Добавлено успешно!", + "back": "Назад", + "cancel": "Отмена", + "change": "Изменить", + "close": "Закрыть", + "collapse": "Свернуть", + "confirm": "Подтвердить", + "copy": "Копировать", + "continue": "Продолжить", + "copySuccess": "Скопировано успешно!", + "createDate": "Дата создания", + "createUpdateSuccess": "Создано/обновлено успешно", + "createdAt": "Дата", + "delete": "Удалить", + "deleteConfirm": "Вы уверены, что хотите удалить?", + "deleteSuccess": "Удалено успешно!", + "desc": "Подробности", + "description": "Описание", + "disable": "Отключить", + "edit": "Редактировать", + "modify": "Изменить", + "editSuccess": "Отредактировано успешно!", + "enable": "Включить", + "endDate": "Дата окончания", + "expand": "Развернуть", + "filter": "Фильтр", + "hint": "Подсказка", + "langSwitch": "Язык успешно переключен!", + "max": "Максимум", + "min": "Минимум", + "no": "Нет", + "noOnlySpace": "Нельзя вводить только пробелы", + "operations": "Операции", + "order": "Порядок", + "placeInputEndData": "Введите дату окончания", + "placeInputStartData": "Введите дату начала", + "pleaseEnter": "Введите", + "pleaseSelect": "Выберите", + "popUpOperation": "Всплывающее действие", + "request": "Запрос", + "reset": "Сбросить", + "save": "Сохранить", + "search": "Поиск", + "searchCriteria": "Критерии поиска", + "searchDesc": "Диапазон поиска: от даты начала (включительно) до даты окончания (исключительно)", + "selectAll": "Выбрать все", + "selectData": "Выбрать дату", + "selectDataToDelete": "Выберите данные для удаления", + "selectDate": "Выбрать дату", + "setupSuccess": "Настройка выполнена успешно", + "startData": "Дата начала", + "startDataMustBeforeEndData": "Дата начала должна быть раньше даты окончания", + "undeleted": "Удаление отменено", + "updateSuccess": "Обновлено успешно!", + "warning": "Предупреждение", + "yes": "Да", + "cannotBeEmpty": "Не может быть пустым", + "cancelModification": "Отменить изменение", + "import": "Импортировать", + "enterDescription": "Введите описание" + }, + "historyComponent": { + "closeAll": "Закрыть все", + "closeLeft": "Закрыть слева", + "closeOther": "Закрыть другие", + "closeRight": "Закрыть справа" + }, + "init": { + "beta": "Бета", + "confirm": "Я подтверждаю", + "dbHost": "Хост", + "dbName": "Имя базы данных", + "dbPassword": "Пароль", + "dbPort": "Порт", + "dbType": "Тип базы данных", + "dbUser": "", + "dbUsername": "Имя пользователя", + "enterDBAddress": "Введите адрес базы данных", + "enterDBHost": "Введите хост базы данных", + "enterDBName": "Введите имя базы данных", + "enterSQLitePath": "Введите путь к файлу базы данных SQLite", + "enterDBPassword": "Пароль базы данных (оставьте пустым, если отсутствует)", + "enterDBPort": "Введите порт базы данных", + "enterDBUser": "", + "enterDBUsername": "Введите имя пользователя базы данных", + "initNow": "Инициализировать сейчас", + "language": "Язык", + "note": "Уведомление об инициализации", + "note1": "1. Вы должны быть знакомы с Vue и GoLang.", + "note2-1": "2. Пожалуйста, подтвердите, что вы прочитали ", + "note2-2": "официальную документацию.", + "note2-3": "Видео по инициализации", + "note3": "3. Пожалуйста, подтвердите, что вы понимаете последующий процесс настройки.", + "note4": "4. Если вы используете базу данных MySQL, убедитесь, что движок базы данных — ", + "note5": "Примечание: Команда разработчиков не предоставляет бесплатные услуги по содержимому, описанному в документации.", + "pleaseWait": "Инициализация базы данных, пожалуйста, подождите", + "readDocs": "Прочитать документацию", + "adminPassword": "Пароль администратора", + "adminPasswordNote": "Пароль по умолчанию для учетной записи администратора" + }, + "layout": { + "header": { + "currentRole": "Текущая роль: ", + "loading": "Загрузка", + "logout": "Выйти", + "personalInfo": "Личная информация", + "switchTo": "Переключить на: " + }, + "tools": { + "switchTheme": "Переключить тему", + "search": "Поиск", + "systemSettings": "Настройки системы", + "refresh": "Обновить", + "changeLanguage": "Сменить язык", + "videoTutorial": "Видеоурок" + }, + "setting": { + "defaultTheme": "Тема по умолчанию", + "themeColor": "Цвет темы", + "interfaceDisplay": "Отображение интерфейса", + "showWaterMark": "Показывать водяной знак", + "grayMode": "Серый режим", + "colorFadeMode": "Режим затухания цвета", + "menuMode": "Режим меню", + "showTabs": "Показывать вкладки", + "pageSwitchAnimation": "Анимация переключения страниц", + "fadeInOut": "Появление/затухание", + "slide": "Скольжение", + "zoom": "Масштабирование", + "noAnimation": "Без анимации", + "layoutSizeConfig": "Настройка размеров интерфейса", + "sidebarExpandedWidth": "Ширина боковой панели в развернутом состоянии", + "sidebarShrinkWidth": "Ширина боковой панели в свернутом состоянии", + "sidebarItemHeight": "Высота элемента боковой панели", + "configSaveNote1": "Обратите внимание, что все настройки должны быть сохранены в локальный файл ", + "configSaveNote2": ", иначе конфигурация будет потеряна после обновления страницы.", + "copyConfig": "Сохранить", + "normalMode": "Обычный", + "topMenuBarMode": "Верхняя панель меню", + "combinationMode": "Комбинированный", + "copyConfigSuccess": "Сохранено успешно" + } + }, + "login": { + "entPassword": "Введите пароль", + "entUserName": "Введите имя пользователя", + "entVerificationCode": "Введите код подтверждения", + "errInit": "Информация о базе данных уже настроена и не может быть инициализирована", + "errLogin": "Заполните данные для входа правильно", + "errPassword": "Введите правильный пароль", + "errUserName": "Введите правильное имя пользователя", + "errVerificationCode": "Неверный код подтверждения", + "verificationCode": "Код подтверждения", + "init": "Перейти к инициализации", + "language": "Языки", + "login": "Войти" + }, + "setting": { + "": "", + "businessBlack": "Темный режим", + "simpleWhite": "Светлый режим" + }, + "system": { + "envValues": "Значения окружения", + "multiLogin": "Перехват множественного входа", + "ossType": "Тип OSS", + "portValue": "Значение порта", + "systemConfig": "Конфигурация системы" + }, + "pinia": { + "modules": { + "router": { + "bottomLayerLayout": "Нижний слой интерфейса" + }, + "user": { + "loggingIn": "Вход в систему, пожалуйста, подождите...", + "loginFailed": "Ошибка входа", + "connectAdmin": "Свяжитесь с администратором для авторизации" + } + } + }, + "plugins": { + "checkMessage": "Проверьте, включены ли initialize.Api(ctx) и initialize.Menu(ctx) в `server/plugin/{plugName}/plugin.go`?", + "overwriteMessage": "Нажатие перезапишет `server/plugin/{plugName}/initialize/menu`. Хотите продолжить?", + "overwriteWarning": "Нажатие перезапишет `server/plugin/{plugName}/initialize/api`. Хотите продолжить?", + "generateInitialAPI": "Создать начальный API", + "checkMsg": "Проверьте, включены ли initialize.Api(ctx) и initialize.Menu(ctx) в `server/plugin/{plugName}/plugin.go`?", + "announcement": { + "info": { + "title": "Заголовок", + "content": "Содержимое", + "richTextContent": "[Содержимое в формате rich text]", + "author": "Автор", + "attachments": "Вложения", + "enterTitleNote": "Введите заголовок", + "selectAuthorNote": "Выберите автора" + } + }, + "email": { + "emailConfigNote": "Необходимо заранее настроить файл конфигурации электронной почты. Чтобы избежать ненужного спама, эта функция не доступна для онлайн-опыта.", + "targetEmail": "Целевой email", + "email": "Email", + "emailContent": "Содержимое письма", + "sendTestEmail": "Отправить тестовое письмо", + "sendEmail": "Отправить письмо", + "sendSuccess": "Отправлено успешно", + "sentSuccessPleaseCheck": "Отправлено успешно, проверьте" + } + }, + "utils": { + "request": { + "requestErrorDetected": "

Обнаружена ошибка запроса

", + "requestError": "Ошибка запроса", + "tryAgainLater": "Попробуйте позже", + "interfaceError": "Ошибка интерфейса", + "interfaceErrorDetected": "

Обнаружена ошибка интерфейса

", + "errorCode": "Код ошибки", + "interfaceErrorNote": "Этот тип ошибки часто связан с паникой на бэкенде. Сначала проверьте логи бэкенда. Если это влияет на нормальное использование, вы можете принудительно выйти, чтобы очистить кэш.", + "clearCache": "Очистить кэш", + "interfaceNotRegisteredNote": "Этот тип ошибки обычно вызван тем, что интерфейс не зарегистрирован (или не перезапущен) или путь запроса (метод) не соответствует пути API (методу). Если это автоматизированный код, проверьте, нет ли пробелов.", + "iGotIt": "Понял", + "invalidToken": "

Недействительный токен

", + "errorMessage": "Сообщение об ошибке", + "identityInfo": "Информация об идентификации", + "loginAgain": "Войти снова" + } + }, + "view": { + "about": { + "flippedAuroraTeam": "Команда Flipped-Aurora", + "submitRecords": "История выпусков" + }, + "dashboard": { + "about": "О нас", + "announcement": "Объявление", + "codeGen": "Генератор кода", + "components": { + "card": { + "seeMore": "Подробнее" + }, + "table": { + "attention": "Внимание", + "content1": "Более простой интерфейс, более быстрая работа", + "content2": "Лучший сервис, более удобный пользовательский опыт", + "content3": "Быстрее реализация идей, эффективнее работа", + "content4": "Больше творческих ресурсов, больше вдохновения", + "content5": "Более разумная структура кода, ясная логика кода", + "contentTitle": "Заголовок содержимого", + "ranking": "Рейтинг", + "heat": "Популярность", + "PluginTitle": "Название плагина" + } + }, + "grids": { + "menuManage": "Управление меню", + "apiManage": "Управление API", + "roleManage": "Управление ролями", + "userManage": "Управление пользователями", + "automationPackage": "Автоматизированный пакет", + "autoCode": "Автоматизация кода", + "licensePurchase": "Покупка лицензии", + "pluginMarket": "Рынок плагинов", + "ginDoc": "Документация GIN", + "gvaDoc": "Документация GVA", + "githubRepo": "Репозиторий GitHub" + }, + "contentData": "Данные содержимого", + "dashboardCharts": { + "accesssTrends": "Тенденции доступа", + "month": "Месяц" + }, + "dashboardTable": { + "changeLog": "Журнал изменений" + }, + "documentation": "Документация", + "formCreator": "Конструктор форм", + "instructionalUse": "Инструкция по использованию:", + "lastUpdate": "Последнее обновление", + "latestPlugins": "Последние плагины", + "menuManage": "Управление меню", + "newCustomers": "Новые клиенты", + "noOfSolutions": "Количество решений", + "noOfVisitors": "Количество посетителей", + "note": "Сегодня солнечно, 0℃ - 10℃, холодная погода, пожалуйста, оденьтесь теплее.", + "pluginRepo": "Репозиторий плагинов:", + "positiveRatings": "Положительные оценки", + "quickEntry": "Быстрый доступ", + "quickFunctions": "Быстрые функции", + "roleManage": "Управление ролями", + "statistics": "Статистика", + "title": "Доброе утро, администратор, начните свой день", + "todaysTraffic": "Сегодняшний трафик", + "totalNumberOfUsers": "Общее количество пользователей", + "userManage": "Управление пользователями", + "notification": "Уведомление", + "violation": "Нарушение", + "information": "Информация", + "error": "Ошибка", + "noticeList": { + "notice1": "Первая ценовая градация лицензионного сбора закончится 1 июня и перейдет на вторую ценовую градацию.", + "notice2": "После авторизации вы войдете в эксклюзивную группу Feishu для получения официальной помощи.", + "notice3": "Авторизация дает большие скидки на рынке плагинов.", + "notice4": "Неавторизованное коммерческое использование может быть обнаружено инструментами сбора ресурсов и повлечь ответственность.", + "notice5": "Спасибо за поддержку дела открытого исходного кода", + "notice6": "Сделайте творчество более ценным.", + "notice7": "Сделайте труд более значимым.", + "notice8": "Сделайте мышление глубже.", + "notice9": "Сделайте жизнь интереснее.", + "notice10": "Сделайте компанию более динамичной." + } + }, + "example": { + "breakpoint": { + "largeFileUpload": "Загрузка больших файлов", + "selectFile": "Выбрать файл", + "uploadFiles": "Загрузить файлы", + "uploadFilesNote": "Загружайте файлы размером не более 5 МБ", + "breakpointNote": "Это бета-версия для предварительного тестирования. Стилизация и оптимизация производительности в процессе. Файлы фрагментов загружаются в папку breakpointDir, а полные файлы — в папку fileDir на сервере QMPlus.", + "fileTransferredSec": "Файл передан за секунды", + "uploadFileSizeNote": "Загружайте файл размером менее 5 МБ", + "uploadFileFirst": "Сначала загрузите файл", + "uploadCompleted": "Загрузка завершена", + "uploadSuccessfully": "Загружено успешно" + }, + "customer": { + "customerNote": "Очистите разрешения на ресурсы этой роли в настройках разрешений или исключите роль создателя, чтобы заблокировать отображение ресурсов этого клиента.", + "accessDate": "Дата доступа", + "name": "Имя", + "phone": "Телефон", + "accessorId": "ID доступа", + "client": "Клиент", + "customerName": "Имя клиента", + "customerPhone": "Телефон клиента" + }, + "upload": { + "importURL": "Импортировать URL", + "image": "Изображение", + "upload": "Загрузить", + "mediaLibrary": "Медиа-библиотека", + "fileNameComments": "Имя файла/Комментарии", + "link": "Ссылка", + "label": "Метка", + "download": "Скачать", + "deleteAllFilesNote": "Это действие навсегда удалит файл, хотите продолжить?", + "formatNote": "Формат: имя_файла|ссылка или только ссылка.", + "editFileNote": "Нажмите на «Имя файла/Комментарии», чтобы изменить имя файла или комментарии.", + "enterFileName": "Введите имя файла или комментарий", + "browserNotSupportVideo": "Ваш браузер не поддерживает воспроизведение видео", + "enterFileNameOrComment": "Введите имя файла или комментарий", + "typeNotSupported": "Текущий тип не поддерживается.", + "deleteFileConfirmation": "Вы хотите удалить файл?", + "review": "Просмотр", + "inputPlaceholder": "Моя_картинка|https://my-oss.com/my.png\nhttps://my-oss.com/my_1.png", + "importSuccess": "Импорт выполнен успешно!", + "cancelImport": "Отменить импорт" + } + }, + "layout": { + "header": { + "tools": { + "video01": "1. Клонирование проекта и установка зависимостей", + "video02": "2. Инициализация проекта", + "video03": "3. Открытие инструмента отладки + создание начального пакета", + "video04": "4. Ручное использование функции автоматического создания", + "video05": "5. Использование существующих таблиц для создания бизнеса", + "video06": "6. Использование ИИ для создания бизнеса и выбора режима источника данных", + "video07": "7. Создание собственного метода бэкенда", + "video08": "8. Добавление фронтенд-страницы", + "video09": "9. Настройка вторичной фронтенд-страницы", + "video10": "10. Настройка параметра фронтенд-меню", + "video11": "11. Практика параметров меню + динамический заголовок меню + настройка подсветки меню", + "video12": "12. Добавление управляемой кнопки меню", + "video13": "13. Добавление ролей клиентов и соответствующие инструкции по настройке", + "video14": "14. Публикация проекта онлайн" + } + } + }, + "superAdmin": { + "authority": { + "components": { + "apis": { + "filterName": "Фильтр по имени", + "filterPath": "Фильтр по пути" + }, + "datas": { + "datasNote": "Эта функция используется только для создания таблицы отношений многие-ко-многим для ролей и ролей. Для конкретного использования необходимо также комбинировать с таблицей для реализации бизнеса. Подробности см. в примере кода (пример клиента). Эта функция не рекомендуется. Рекомендуется использовать [Функция управления организацией] на рынке плагинов для управления разрешениями на ресурсы.", + "resourceSetupSuccess": "Ресурсы настроены успешно!", + "thisRole": "Эта роль", + "thisRoleAndSubRoles": "Эта роль и подроли" + }, + "menus": { + "home": "Главная", + "menuSetupSuccess": "Меню настроено успешно!", + "setAsHome": "Установить как главную", + "assignButton": "Назначить кнопку" + } + } + }, + "menu": { + "components": { + "componentsCascader": { + "selectFilePathNote": "Выберите путь к файлу", + "filePathNote": "Страница: view/xxx/xx.vue Плагин: plugin/xx/xx.vue", + "manualInput": "Ручной ввод", + "quickSelection": "Быстрый выбор" + } + }, + "addMenu": "Добавить меню", + "addMenuParameters": "Добавить параметры меню", + "addParameter": "Добавить параметр", + "addRootMenu": "Добавить корневое меню", + "addSubMenu": "Добавить подменю", + "clickMe": "Нажмите, чтобы настроить", + "closeTabNote": "Автоматически закрывать вкладку", + "deleteAllRolesConfirm": "Это действие навсегда удалит все роли под этим меню, хотите продолжить?", + "displayName": "Отображаемое имя", + "titleNote": "Пример: system.view.superAdmin.menu.website", + "editMenu": "Редактировать меню", + "enterFilePathNote": "Введите путь к файлу", + "enterMenuDisplayNameNote": "Введите отображаемое имя меню", + "enterMenuNameNote": "Введите имя меню", + "filePath": "Путь к файлу", + "hide": "Скрыть", + "icon": "Иконка", + "keepAliveNote": "Кэшировать страницы через keepAlive", + "newMenuNote": "Новое меню, необходимо настроить разрешения в управлении ролями для использования", + "parameterType": "Тип параметра", + "parameterValue": "Значение параметра", + "paremeterKey": "Ключ параметра", + "parent": "Родитель", + "parentId": "ID родителя", + "rootDirctory": "Корневая директория", + "rootMenu": "Корневое меню", + "routeName": "Имя маршрута", + "routeNameNote": "Уникальная английская строка", + "routePath": "Путь маршрута", + "routePathNote": "Рекомендуется добавлять параметры только в конец", + "show": "Показать", + "sort": "Сортировка", + "subMenuNote": "Если меню содержит подменю, создайте страницу вторичной маршрутизации router-view или", + "visibility": "Видимость", + "visibilityNote": "Скрыть в списке", + "addButton": "Добавить управляемую кнопку", + "buttonName": "Имя кнопки", + "comments": "Комментарии", + "highlightMenu": "Подсветка меню", + "highlightMenuNote": "Примечание: При достижении этого маршрута указанное левое меню с именем будет активно (подсвечено). Может быть null, в этом случае используется имя текущего маршрута.", + "basicPage": "Базовая страница?", + "basicPageNote": "Если выбрано «Да», левое меню и верхняя информация не будут отображаться.", + "": "" + }, + "params": { + "paramNote": "Метод получения параметров и кэширования инкапсулирован в фронтенд utils/params. Вам не нужно писать его самостоятельно. См. комментарии в файле для использования.", + "paramName": "Имя параметра", + "paramKey": "Ключ параметра", + "paramValue": "Значение параметра", + "paramDesc": "Описание параметра", + "enterParamName": "Введите имя параметра", + "enterParamKey": "Введите ключ параметра", + "enterParamValue": "Введите значение параметра", + "enterParamDesc": "Введите описание параметра", + "instruction": "Инструкции", + "instructionNote1": "Фронтенд может ", + "instructionNote2": " и затем вызвать ", + "instructionNote3": " для получения соответствующих параметров.", + "instructionNote4": "Бэкенд должен ", + "instructionNote5": " затем вызвать ", + "instructionNote6": " для получения соответствующего значения." + }, + "user": { + "addUser": "Добавить пользователя", + "anotherUserEdit": "В настоящее время другой пользователь редактирует", + "avatar": "Аватар", + "deleteUserConfrim": "Вы уверены, что хотите удалить этого пользователя?", + "email": "Электронная почта", + "mediaLibrary": "Выбрать из медиа-библиотеки", + "nickName": "Псевдоним", + "nickNameNote": "Введите псевдоним", + "password": "Пароль", + "passwordLenNote": "Пароль должен содержать не менее 6 символов.", + "passwordNote": "Введите пароль", + "phone": "Телефон", + "resetPassword": "Сбросить пароль", + "resetPasswordConfrim": "Вы хотите сбросить текущий пароль на: 123456?", + "roleSetNote": "Роль успешно установлена!", + "userAddedNote": "Пользователь успешно добавлен!", + "userEditedNote": "Пользователь успешно отредактирован!", + "userName": "Имя пользователя", + "userNameLenNote": "Имя пользователя должно содержать не менее 5 символов.", + "userNameNote": "Введите имя пользователя", + "userRole": "Роль пользователя", + "userRoleNote": "Выберите роль пользователя", + "enable": "Включить", + "disable": "Отключить", + "enabledSuccessfully": "Включено успешно", + "disabledSuccessfully": "Отключено успешно", + "user": "Пользователь", + "enterPhoneNoNote": "Введите действительный номер мобильного телефона", + "enterEmailNote": "Введите действительный адрес электронной почты", + "": "" + } + }, + "api": { + "path": "Путь", + "apiGroup": "Группа API", + "apiPath": "Путь API", + "apiGrouping": "Группировка API", + "apiDescription": "Описание API", + "newApiNote": "Новый API, необходимо настроить разрешения в управлении ролями для использования", + "create": "Создать", + "view": "Просмотр", + "update": "Обновить", + "enterApiPath": "Введите путь API", + "enterGroupName": "Введите имя группы", + "selectRequestMethod": "Выберите метод запроса", + "enterApiDescription": "Введите описание API", + "newApi": "Новый API", + "editApi": "Редактировать API", + "unknownOperation": "Неизвестная операция", + "deleteApiConfirm": "Это действие навсегда удалит API из всех ролей, хотите продолжить?", + "refreshCache": "Обновить кэш", + "synchronousAPI": "Синхронизировать API", + "synchronousAPINote": "Синхронизация API, если группа маршрутов не указана, она не будет автоматически синхронизирована", + "synchronousRouting": "Синхронизировать маршруты", + "newAddedRouteNote1": "Новый добавленный маршрут ", + "newAddedRouteNote2": " не синхронизирован автоматически, если не указана группа маршрутов" + }, + "system": { + "components": { + "config": { + "GVAConfig": "Конфигурация GVA", + "appConfig": "Конфигурация приложения", + "autoCode": "Автоматизация кода", + "captchaConfig": "Конфигурация CAPTCHA", + "corsConfig": "Конфигурация CORS", + "dbConfig": "Конфигурация базы данных", + "emailConfig": "Конфигурация электронной почты", + "excelConfig": "Конфигурация Excel", + "jwtConfig": "Конфигурация JWT", + "logConfig": "Конфигурация логов", + "mongodbConfig": "Конфигурация MongoDB", + "ossConfig": "Конфигурация OSS", + "serverConfig": "Конфигурация сервера", + "timerConfig": "Конфигурация таймера", + "aiPath": "AI Path", + "aiPathNote": "Путь для использования функций ИИ", + "apiWhiteList": "Белый список API", + "apiWhiteListNote": "Примечание: Белый список API не требует авторизации", + "autoCodePath": "Путь автоматизации кода", + "backendPath": "Путь к бэкенду", + "captchaLength": "Длина CAPTCHA", + "captchaType": "Тип CAPTCHA", + "corsAllowCredentials": "Разрешить учетные данные CORS", + "corsAllowHeaders": "Разрешить заголовки CORS", + "corsAllowMethods": "Разрешить методы CORS", + "corsAllowOrigin": "Разрешить источники CORS", + "corsExposeHeaders": "Открытые заголовки CORS", + "corsMaxAge": "Максимальный возраст CORS", + "dbList": "Список баз данных", + "dbListNote": "Примечание: Список баз данных для настройки нескольких баз данных", + "emailHost": "Хост электронной почты", + "emailPort": "Порт электронной почты", + "emailSender": "Отправитель электронной почты", + "emailSecret": "Секретный ключ электронной почты", + "excelDir": "Папка Excel", + "jwtBufferPeriod": "Буферный период JWT", + "jwtExpiration": "Срок действия JWT", + "jwtIssuer": "Эмитент JWT", + "jwtSignature": "Подпись JWT", + "logDir": "Папка логов", + "logLevel": "Уровень логов", + "logPrefix": "Префикс логов", + "mongodbDatabase": "База данных MongoDB", + "mongodbOptions": "Опции MongoDB", + "mongodbPassword": "Пароль MongoDB", + "mongodbUsername": "Имя пользователя MongoDB", + "ossAccessKey": "Ключ доступа OSS", + "ossAccessKeySecret": "Секретный ключ доступа OSS", + "ossBucketName": "Имя корзины OSS", + "ossCdnAcceleratedDomain": "Домен ускорения CDN OSS", + "ossPath": "Путь OSS", + "ossRegion": "Регион OSS", + "ossSecretID": "Секретный ID OSS", + "ossSecretKey": "Секретный ключ OSS", + "ossSpaceName": "Имя пространства OSS", + "serverPort": "Порт сервера", + "timerEnable": "Включить таймер", + "timerTasks": "Задачи таймера", + "enableCaptcha": "Включить CAPTCHA", + "enableCors": "Включить CORS", + "enableMultiLogin": "Включить множественный вход", + "enableOss": "Включить OSS", + "enableTimer": "Включить таймер", + "projectRootPath": "Корневой путь проекта", + "redisAdminDBConfig": "Конфигурация базы данных Redis Admin", + "restartService": "Перезапустить службу (в разработке)", + "showLine": "Показать строку", + "socketTimeout": "Тайм-аут сокета", + "startEnableDisable": "Запуск (включить/отключить)", + "storehouse": "Склад", + "systemConfig": "Конфигурация системы", + "timedTask": "Таймер (запланированная задача)", + "updateNow": "Обновить сейчас", + "verCodeConfig": "Конфигурация кода подтверждения", + "zapLogConfig": "Конфигурация логов Zap", + "fatal": "Фатальный", + "debug": "Отладка", + "trace": "Трассировка", + "portValue": "Введите значение порта", + "local": "Локальный", + "qiniu": "Qiniu", + "tencentCOS": "Tencent Cloud COS", + "alibabaOSS": "Alibaba Cloud OSS", + "huaweiOBS": "Huawei Cloud OBS", + "globalRoutePrefix": "Введите глобальный префикс маршрута", + "jwtSignature": "Введите подпись JWT", + "expiration": "Введите срок действия", + "bufferPeriod": "Введите буферный период", + "issuer": "Введите эмитента", + "logPrefix": "Введите префикс логов", + "logFolder": "Введите папку логов", + "stackName": "Введите имя стека", + "address": "Введите адрес", + "password": "Введите пароль", + "recipientEmail": "Электронная почта получателя", + "multipleEmailsNote": "Несколько адресов, разделенных запятыми", + "port": "Порт", + "senderEmail": "Электронная почта отправителя", + "enterSenderEmail": "Введите электронную почту отправителя", + "enterHost": "Введите хост", + "isSSL": "Использовать SSL", + "useLoginAuth": "Использовать аутентификацию LoginAuth", + "enterSecret": "Введите секретный ключ", + "testEmail": "Тестовое письмо", + "mongodbOptions": "Введите опции MongoDB", + "databaseName": "Введите имя базы данных", + "userName": "Введите имя пользователя", + "typePassword": "Введите пароль", + "defaultEmpty": "По умолчанию пусто", + "defaultInnoDB": "По умолчанию InnoDB", + "enterPrefix": "Введите префикс", + "enterEngine": "Введите движок", + "writeLog": "Записать лог", + "enableMongo": "Включить MongoDB", + "strictRoleMode": "Строгий режим ролей", + "localFileAccessPath": "Локальный путь доступа к файлам", + "enterLocalFileAccessPath": "Введите локальный путь доступа к файлам", + "enterLocalFileStoragePath": "Введите локальный путь хранения файлов", + "qiniuUploadConfig": "Конфигурация загрузки Qiniu", + "enterStorageRegion": "Введите регион хранения", + "enterSpaceName": "Введите имя пространства", + "enterCdnAcceleratedDomain": "Введите домен ускорения CDN", + "enterAccessKey": "Введите ключ доступа", + "storageRegion": "Регион хранения", + "spaceName": "Имя пространства", + "cdnAcceleratedDomain": "Домен ускорения CDN", + "useHttps": "Использовать HTTPS", + "cdnUploadAccelerated": "Использовать ускорение загрузки CDN", + "tencentCosUploadConfig": "Конфигурация загрузки Tencent Cloud COS", + "bucketName": "Имя корзины", + "enterBucketName": "Введите имя корзины", + "region": "Регион", + "enterRegion": "Введите регион", + "pathPrefix": "Префикс пути", + "enterPathPrefix": "Введите префикс пути", + "accessDomain": "Домен доступа", + "enterAccessDomain": "Введите домен доступа", + "enterSecretID": "Введите секретный ID", + "enterSecretKey": "Введите секретный ключ", + "aliyunOssUploadConfig": "Конфигурация загрузки Alibaba Cloud OSS", + "enterAccessKeyId": "Введите ID ключа доступа", + "enterAccessKeySecret": "Введите секретный ключ доступа", + "huaweiObsUploadConfig": "Конфигурация загрузки Huawei Cloud OBS", + "enterPath": "Введите путь", + "cloudflareR2UploadConfig": "Конфигурация загрузки Cloudflare R2", + "enterBaseUrl": "Введите базовый URL", + "enterCompositeTargetAddress": "Введите составной целевой адрес", + "enterBackendCodeAddress": "Введите адрес кода бэкенда", + "enterBackendApiFolderAddress": "Введите адрес папки API бэкенда", + "enterBackendInitializeFolder": "Введите адрес папки инициализации бэкенда", + "enterBackendModelFileAddress": "Введите адрес файла модели бэкенда", + "enterBackendRequestFolderAddress": "Введите адрес папки запросов бэкенда", + "enterBackendRouterFolderAddress": "Введите адрес папки маршрутов бэкенда", + "enterBackendServiceFolderAddress": "Введите адрес папки сервисов бэкенда", + "enterFrontendFolderAddress": "Введите адрес папки фронтенда", + "enterBackendWApiFolderAddress": "Введите адрес папки WApi бэкенда", + "enterBackendWFormFolderAddress": "Введите адрес папки WForm бэкенда", + "enterBackendWTableFolderAddress": "Введите адрес папки WTable бэкенда", + "confirmRestartService": "Подтвердить перезапуск службы", + "operationSuccess": "Операция выполнена успешно", + "cancelRestart": "Отменить перезапуск" + } + }, + "autoPkg": { + "autoPkgNote": "Эта функция предназначена только для среды разработки и не рекомендуется для продакшена. Для конкретных эффектов использования смотрите видео https://www.bilibili.com/video/BV1kv4y1g7nT?p=3", + "packageName": "Имя пакета", + "template": "Шаблон", + "displayName": "Отображаемое имя", + "description": "Описание", + "templatePackageNote": "Пакет шаблона создаст код, интегрированный в основное тело проекта, а плагин шаблона создаст пакет плагина", + "creatingPackage": "Создание пакета", + "enterPackageNameNote": "Введите имя пакета", + "selectTemplateNote": "Выберите шаблон", + "cannotStartWithNumberNote": "Не может начинаться с цифры", + "addSuccess": "Добавлено успешно", + "deletePackageNote": "Эта операция удалит только запись pkg в базе данных. Удалите соответствующую структуру директорий бэкенда самостоятельно, чтобы сохранить соответствие с базой данных!", + "cannotBeChinese": "Ввод не может быть на китайском.", + "cannotStartWithNumber": "Ввод не может начинаться с цифр." + }, + "autoCode": { + "getAiPath": "Получить AI Path", + "aiCodeNote": "Сейчас это совершенно бесплатно\nОпишите вашу таблицу, и ИИ поможет вам завершить работу. \nДля этой функции нужно получить AI-Path в личном кабинете рынка плагинов, указать AI-Path в autocode-->ai-path в config.yaml и перезапустить проект. \nНажмите Ctrl+Enter или Cmd+Enter для генерации.", + "generate": "Сгенерировать", + "aiNote1": "【Совершенно бесплатно】Перейдите в ", + "aiNote2": "Личный кабинет рынка плагинов ", + "aiNote3": "Получите AIPath и укажите его в свойстве ai-path в config.yaml для использования.", + "imageRecognition": "Распознавание изображений", + "actionBar": "Панель действий:", + "autoAPIDBCreate": "Автоматически создать API", + "autoAPIDBTip": "Примечание: Зарегистрировать автоматически созданный API в базе данных", + "autoCodeNote": "Эта функция для среды разработки, не рекомендуется для продакшена. Нажмите, чтобы увидеть эффект использования.", + "autoMoveFiles": "Автоматически перемещать файлы", + "autoMoveFilesTip": "Примечание: Автоматически перемещать сгенерированные файлы в соответствующие места, указанные в ymal", + "codeGenDownload": "Автоматическое создание кода успешно, загрузка", + "codeGenMoveSuccess": "Автоматическое создание кода успешно, автоматическое перемещение успешно", + "codePreview": "Предпросмотр кода", + "columnName": "Поле базы данных", + "comment": "Описание поля", + "componentContent": "Содержимое компонента", + "confirmDelete": "Вы уверены, что хотите удалить?", + "copy": "Копировать", + "createUsingTable": "Создать с использованием этой таблицы", + "createdByAI": "Создано ИИ", + "dbName": "Имя базы данных", + "dictionary": "Словарь", + "entFileName": "Имя файла: sysXxxxXxxx", + "entStructAbbreviation": "Введите сокращение структуры", + "entStructDesc": "Введите описание структуры", + "entStructName": "Введите имя структуры", + "errNoFields": "Заполните хотя бы одно поле", + "errSameFieldName": "Есть поле с таким же именем, как у структуры", + "errJsonFieldNameAsTemplate": "Есть поле JSON с таким же именем, как у шаблона", + "errSameStructDescAbbr": "Имя структуры и сокращение структуры не могут совпадать", + "existDB": "Нажмите здесь, чтобы создать код из существующей базы данных", + "field": "Поле", + "fieldDataType": "Тип данных поля", + "fieldDesc": "Ключ мультиязычности поля", + "fieldIndex": "Индекс", + "fieldLen": "Длина поля базы данных", + "fileName": "Имя файла", + "fileNameNote": "Имя файла по умолчанию (рекомендуется использовать верблюжий регистр, начиная с маленькой буквы, например sysXxxXxxx)", + "generateCode": "Сгенерировать код", + "viewCode": "Просмотреть код", + "previewCode": "Предпросмотр кода", + "generate": "Сгенерировать", + "moveDown": "Переместить вниз", + "moveUp": "Переместить вверх", + "selectDB": "Выберите базу данных", + "selectTable": "Выберите таблицу", + "structAbbreviation": "Сокращение структуры", + "structAbbreviationNote": "Сокращение будет использоваться как имя объекта параметров и группа маршрутов", + "structChineseName": "Имя структуры", + "structChineseNameNote": "Описание, используемое как описание автоматического API", + "structNameNote": "Первая буква автоматически преобразуется в заглавную", + "table": "Таблица", + "tableName": "Имя таблицы", + "tableNameNote": "Укажите имя таблицы (необязательно)", + "createdFromDB": "Создано из базы данных", + "businessLibrary": "Бизнес-библиотека", + "businessLibraryNotice": "Примечание: Необходимо заранее настроить несколько баз данных в db-list. Если не настроено, настройте и перезапустите службу перед использованием. (Здесь можно выбрать соответствующую таблицу библиотеки, то есть выбрать таблицу из какой библиотеки)", + "selectBusinessLibrary": "Выберите бизнес-библиотеку", + "selectTableBtn": "Выбрать эту таблицу", + "automationStructure": "Автоматизированная структура", + "structureName": "Имя структуры", + "structureSimpleName": "Сокращение структуры", + "StructureOverview": "Обзор структуры", + "structNameInput": "Введите сокращение структуры", + "structNameIs": "Имя структуры: ", + "fineNameInput": "Введите имя файла", + "capitalizeFirstLetterAutomatically": "Первая буква автоматически становится заглавной", + "objectNameAndRouteGroup": "Сокращение используется как имя объекта параметров и группа маршрутов", + "templateChoose": "Выбрать шаблон", + "libraryNote": "Примечание: Необходимо заранее настроить несколько баз данных в db-list. Если этот пункт пуст, автоматизированный код будет создан с использованием главной библиотеки gva (global.GVA_DB). Если заполнено, код будет создан для указанной библиотеки (global.MustGetGlobalDBByDBName(dbname))", + "useGvaNote": "Примечание: Структура global.Model автоматически включает первичный ключ и операции мягкого удаления", + "aiClearDataNote": "Генерация ИИ очистит текущие данные, хотите продолжить?", + "fillJsonDataNote": "Заполните свойства json для отображения древовидной структуры на фронтенде", + "expertMode": "Экспертный режим", + "basicSettings": "Базовые настройки", + "generateFrontend": "Сгенерировать фронтенд", + "generateBackend": "Сгенерировать бэкенд", + "automationSettings": "Настройки автоматизации", + "advancedSettings": "Расширенные настройки", + "treeStructureSettings": "Настройки древовидной структуры", + "groupInfos": { + "useGvaStructure": "Структура GVA", + "note1": "Примечание: Зарегистрировать автоматически созданный API в базе данных", + "autoCreateApi": "Создать API", + "note2": "Примечание: Зарегистрировать автоматически созданное меню в базе данных", + "autoCreateMenu": "Создать меню", + "note3": "Примечание: Автоматически синхронизировать структуру таблицы базы данных, если не требуется, можно отключить.", + "syncTableStructure": "Синхронизировать таблицу", + "note4": "Примечание: Автоматически генерировать конфигурацию разрешений кнопок на странице. Если кнопка не назначена в управлении ролями, она не будет видна", + "createButtonPermissions": "Разрешения кнопок", + "note5": "Примечание: Автоматически добавить created_by, updated_by, deleted_by в структуру, упрощая управление разрешениями ресурсов", + "createResourceIdentifier": "Идентификатор ресурса", + "note6": "Примечание: Использование базового шаблона не создаст структуры и CURD, только настроит enter и другие атрибуты для упрощения разработки не-CURD логики", + "basicTemplate": "Базовый шаблон", + "parentIdNote": "Примечание: ParentID будет автоматически создан для связи родитель-потомок. Поддерживается только тип int для первичного ключа", + "treeStructure": "Древовидная структура", + "frontendJsonAttr": "Атрибуты json для отображения на фронтенде" + }, + "addField": "Добавить поле", + "primaryKey": "Первичный ключ", + "fieldName": "Имя поля", + "chineseName": "Название на китайском", + "defaultValue": "Значение по умолчанию", + "required": "Обязательное", + "createEdit": "Создание/Редактирование", + "importExport": "Импорт/Экспорт", + "fieldJson": "JSON поля", + "fieldType": "Тип поля", + "selectFieldType": "Выберите тип поля", + "indexType": "Тип индекса", + "selectIndexType": "Выберите тип индекса поля", + "selectSearchCondition": "Выберите условие поиска поля", + "advancedEdit": "Расширенное редактирование", + "exportJson": "Экспортировать JSON", + "importJson": "Импортировать JSON", + "clearTemp": "Очистить временные данные", + "temporary": "Временные", + "selectPackage": "Выберите пакет", + "gvaStructureNote": "Если включена структура GVA по умолчанию, поля ID, CreatedAt, UpdatedAt, DeletedAt будут автоматически добавлены. Это действие очистит дублирующиеся поля, созданные ниже. Хотите продолжить?", + "note": "Примечание", + "primaryKeyRequirement": "Необходимо создать хотя бы один первичный ключ для обеспечения работоспособности автоматизированного кода", + "fillFieldTypes": "Заполните все типы полей перед отправкой", + "packageNameConflict": "Имя пакета и сокращение структуры не могут совпадать", + "jsonImportSuccess": "JSON файл успешно импортирован", + "invalidJsonFile": "Недействительный JSON файл", + "basicTemplateNote": "Использование базового шаблона не создаст структуры и CURD, только настроит enter и другие атрибуты для упрощения разработки не-CURD логики", + "fieldDialog": { + "associativeDictionary": "Ассоциативный словарь", + "autoFill": "Автозаполнение", + "dataTypeNote": "Длина типа данных базы", + "entColumnName": "Введите поле базы данных", + "entFieldDataType": "Выберите тип данных поля", + "entFieldDesc": "Введите краткое описание поля", + "entFieldJson": "Введите форматированный JSON поля", + "entFieldName": "Введите имя поля на английском", + "note": "id, created_at, updated_at, deleted_at будут автоматически сгенерированы, не создавайте их повторно. При поиске, если условие LIKE, поддерживаются только строки", + "selectDataType": "Выберите тип данных поля", + "selectDictionary": "Выберите словарь", + "selectSearchType": "Выберите условие поиска поля", + "enumValue": "Значение перечисления", + "typeLength": "Длина типа", + "enumExample": "Пример: 'Пекин', 'Тяньцзинь'", + "dataTypeLength": "Длина типа данных базы", + "enterDefaultValueNote": "Введите значение по умолчанию", + "frontendCreateEdit": "Создание/Редактирование на фронтенде", + "frontendTableColmuns": "Столбцы таблицы на фронтенде", + "frontendDetails": "Детали на фронтенде", + "sort": "Сортировка", + "required": "Обязательное", + "canBeCleared": "Можно очистить", + "hideSearch": "Скрыть условие поиска", + "verificationError": "Сообщение об ошибке проверки", + "dataSourceConfigNote": "Конфигурация источника данных (если ваша программистская база слаба, это может привести к неработоспособности автоматизированного кода)", + "dataSourceNameNote": "База данных [база GVA, если пусто] ", + "associationMode": "Режим ассоциации", + "oneToOne": "Один-к-одному", + "oneToMany": "Один-ко-многим", + "selectDataSourceTable": "Выберите таблицу источника данных", + "selectDataToStore": "Сначала выберите данные для хранения", + "storage": "Хранилище: ", + "type": "Тип: ", + "fileDesc": ", Описание поля: ", + "selectDataToDisplay": "Сначала выберите данные для отображения", + "display": "Отображение: ", + "enumValueValidationError": "Ошибка проверки значения перечисления", + "oneToManyNote": "В режиме ассоциации один-ко-многим тип данных изменится на массив, на бэкенде будет представлен как JSON, в частности, как массив. Хотите продолжить?", + "string": "Строка", + "richText": "Форматированный текст", + "integer": "Целое число", + "boolean": "Логическое", + "float": "Число с плавающей точкой", + "time": "Время", + "enum": "Перечисление", + "singleImage": "Одно изображение", + "multipleImages": "Несколько изображений", + "video": "Видео", + "file": "Файл", + "array": "Массив" + } + }, + "autoCodeAdmin": { + "structName": "Имя структуры", + "structDesc": "Описание структуры", + "deleteHistoryConfirm": "Эта операция удалит эту историю, хотите продолжить?", + "notRolledBack": "Не откачено", + "reuse": "Повторное использование", + "rollBack": "Откат", + "rollBackDeleteTable": "Откат (удалить таблицу)", + "rollBackWithoutDeleteTable": "Откат (без удаления таблицы)", + "rollBackMark": "Метка отката", + "rollbackConfirm": "Эта операция удалит автоматически созданные файлы и API, хотите продолжить?", + "includeDBTables": " (включая таблицы базы данных!), ", + "rollBackContinue": " хотите продолжить?", + "rollbackSuccess": "Откат выполнен успешно!", + "rolledBack": "Откачено", + "addField": "Добавить поле", + "xiaoMiaoIsThinking": "Сяо Мяо думает, пожалуйста, подождите...", + "aiWritingNote": "В настоящее время написание ИИ нестабильно. Пожалуйста, обратите внимание на ручную корректировку содержимого после генерации кода." + }, + "exportTemplate": { + "syncTableExportFeature": "Эта функция предоставляет синхронную и асинхронную функцию экспорта таблиц для больших объемов данных. Вы можете настроить ее по своему усмотрению.", + "templateIdentifier": "Идентификатор шаблона", + "add": "Добавить", + "edit": "Редактировать", + "gvaDatabase": "Библиотека GVA", + "dbListNote": "Примечание: Необходимо заранее настроить несколько баз данных в db-list. Если не настроено, настройте и перезапустите службу перед использованием. Если выбор невозможен, установите disabled:false в config.yaml и выберите целевую библиотеку для импорта и экспорта.", + "enterTemplateName": "Введите имя шаблона", + "templateIdentifierInfo": "Идентификатор шаблона — это атрибут идентификатора, который должен быть привязан к фронтенд-компоненту", + "associationCondition": "Условия ассоциации", + "selectAssociationMethod": "Выберите метод соединения", + "enterAssociationTable": "Введите таблицу ассоциации", + "associationConditionExample": "Условие соединения table1.a = table2.b", + "addCondition": "Добавить условие", + "defaultExportCount": "Количество экспортируемых записей по умолчанию", + "defaultSortCondition": "Критерии сортировки по умолчанию", + "jsonKeyFromQuery": "Ключ JSON, который нужно взять из условия запроса", + "tableColumn": "Соответствующий столбец таблицы", + "selectQueryCondition": "Выберите условия запроса", + "creationDate": "Дата создания", + "searchDateHint": "Диапазон поиска: от даты начала (включительно) до даты окончания (исключительно)", + "startDate": "Дата начала", + "endDate": "Дата окончания", + "templateName": "Имя шаблона", + "searchCriteria": "Критерии поиска", + "tableName": "Имя таблицы", + "templateId": "ID шаблона", + "database": "База данных", + "gvaLibrary": "Библиотека GVA", + "templateInfo": "Информация о шаблоне", + "code": "Код", + "addTo": "Добавить в", + "templateName2": "Имя шаблона:", + "templateNameNote": "Введите имя шаблона", + "tableName2": "Имя таблицы:", + "autoGenerateTemplate": "Автоматически генерировать шаблоны", + "templateId2": "ID шаблона:", + "templateIdNote": "Идентификатор шаблона — это атрибут идентификатора, который должен быть привязан к фронтенд-компоненту", + "associationConditions": "Условия ассоциации:", + "associationConditionsNote": "Выберите метод соединения", + "associationTableNote": "Введите таблицу ассоциации", + "joinConditionNote": "Условие соединения table1.a = table2.b", + "addingCondtion": "Добавление условий", + "noOfExportedRecords": "Количество экспортируемых записей:", + "sortingCriteria": "Критерии сортировки:", + "sortingCriteriaNote": "Пример: id desc", + "exportCondition": "Условия экспорта:", + "jsonKeyNote": "Ключ JSON, который нужно извлечь из условия запроса", + "columnNote": "Соответствующий столбец таблицы", + "queryConditionNote": "Выберите условия запроса", + "templatePlaceholder1": "Формат информации о шаблоне: ключ определяет имя столбца базы данных (в режиме соединения нужно писать как table.column), значение определяет имя столбца экспортируемого Excel. Если ключ является ключевым словом или функцией базы данных, обработайте его в соответствии с режимом обработки ключевых слов. В качестве примера используется MySQL, как показано ниже:", + "templatePlaceholder2": "Первый столбец", + "templatePlaceholder3": "Третий столбец", + "templatePlaceholder4": "Четвертый столбец", + "templatePlaceholder5": "Я ключевое слово или функция базы данных", + "templatePlaceholder6": "Если добавлены JOINS, экспортируемый ключ должен быть указан как {table_name1.table_column1:\"первый столбец\",table_name2.table_column2:\"второй столбец\"}\r\nЕсли есть дублирующиеся имена столбцов, формат экспорта должен быть {table_name1.table_column1 as key:\"первый столбец\",table_name2.table_column2 as key2:\"второй столбец\"}\r\nИмпорт не поддерживается в режиме JOINS", + "noSpaceOnlyNote": "Нельзя вводить только пробелы", + "enterEndDate": "Введите дату окончания", + "enterStartDate": "Введите дату начала", + "startDateBeforeEndDate": "Дата начала должна быть раньше даты окончания", + "selectDBAndTable": "Выберите бизнес-библиотеку и таблицу перед выполнением операции", + "templateInfoFormatError": "Неверный формат информации о шаблоне, проверьте", + "exportConditionError": "Заполните полные условия экспорта", + "completeAssociationError": "Заполните полные ассоциации", + "xiaoMiaoIsThinking": "Сяо Мяо думает...", + "tableToBeUsed": "Таблица для использования", + "selectWhenUSingAi": "Выберите при использовании ИИ", + "aiHelpWriting": "Помощь ИИ в написании", + "aiNote": "Опишите функцию экспорта, которую вы хотите реализовать, и позвольте ИИ помочь вам. Перед этим выберите бизнес-библиотеку, в которой находится таблица для экспорта. Если выбор не сделан, по умолчанию будет использована библиотека gva.", + "helpWrite": "Помощь в написании", + "autoComplete": "Автозаполнение", + "autoGenerateTemplates": "Автоматически генерировать шаблоны", + "selectTableToExport": "Выберите таблицу для экспорта.", + "aiAutoCompleteFail": "Автозаполнение ИИ не удалось, переключено на логическое завершение" + }, + "installPlugin": { + "dragOrClickUpload": "Перетащите или нажмите для загрузки", + "uploadPackage": "Перетащите zip-пакет установки сюда для загрузки" + }, + "pubPlug": { + "pluginSupport": "В настоящее время поддерживаются только стандартные плагины (сгенерированные через шаблон плагина для создания стандартной структуры директорий). Упакуйте нестандартные плагины самостоятельно.", + "pluginNameInput": "Введите имя плагина в шаблоне плагина", + "menuSelectionNote": "Выбирайте только подменю в шаттл-боксе", + "menuGroupNameInput": "Введите имя группы меню, например, Управление объявлениями", + "menuNamePathInput": "Введите имя меню/путь", + "optionalMenu": "Опциональное меню", + "useMenu": "Использовать меню", + "remove": "Удалить", + "selected": "Выбрано", + "defineMenuInstall": "Определить установку меню", + "apiDescriptionPathInput": "Введите описание API/путь", + "optionalAPI": "Опциональный API", + "useAPI": "Использовать API", + "defineAPIInstall": "Определить установку API", + "packagePlugin": "Упаковать плагин", + "package": "Упаковать", + "closePackage": "Закрыть упаковку", + "enterMenuGroupName": "Введите имя группы меню", + "selectAtLeastOneMenu": "Выберите хотя бы одно меню", + "enterPluginName": "Введите имя плагина", + "generateInitialMenu": "Сгенерировать начальное меню", + "generate": "Сгенерировать", + "closeGenerateMenu": "Закрыть генерацию меню", + "selectAtLeastOneAPI": "Выберите хотя бы один API", + "enterPluginNameAgain": "Введите имя плагина еще раз", + "closeGenerateAPI": "Закрыть генерацию API" + } + } + } +} \ No newline at end of file diff --git a/web/src/view/systemTools/formCreate/index.vue b/web/src/view/systemTools/formCreate/index.vue index 0fe0a97ce9..74b846119c 100644 --- a/web/src/view/systemTools/formCreate/index.vue +++ b/web/src/view/systemTools/formCreate/index.vue @@ -16,6 +16,7 @@ import zh from './locale/zh_cn.js' // 导入中文语言包 import zh_tw from './locale/zh_tw.js' // 导入中文语言包 import ar from './locale/ar.js' + import ru from './locale/ru.js' import { useI18n } from 'vue-i18n' // 导入中文语言包 const { locale } = useI18n() @@ -30,7 +31,8 @@ 'zh-cn': zh, 'zh-TW': zh_tw, en: en, - ar: ar + ar: ar, + ru: ru } const designer = ref(null) diff --git a/web/src/view/systemTools/formCreate/locale/ru.js b/web/src/view/systemTools/formCreate/locale/ru.js new file mode 100644 index 0000000000..6dd0404927 --- /dev/null +++ b/web/src/view/systemTools/formCreate/locale/ru.js @@ -0,0 +1,780 @@ +export default { + name: 'ru', + form: { + field: 'Поле', + title: 'Заголовок', + info: 'Информация', + control: 'Управление', + labelPosition: 'Положение метки', + labelStyle: 'Стиль метки', + labelSuffix: 'Суффикс метки', + size: 'Размер формы', + event: 'Событие формы', + labelWidth: 'Ширина метки', + hideRequiredAsterisk: 'Скрыть красную звездочку рядом с меткой обязательного поля', + showMessage: 'Показать сообщение об ошибке проверки', + inlineMessage: 'Показать информацию о проверке в строке', + submitBtn: 'Показывать кнопку отправки формы', + resetBtn: 'Показывать кнопку сброса формы', + appendChild: 'Вставить дочерний элемент', + formMode: 'Режим формы', + formName: 'Название формы', + componentMode: 'Компонент', + document: 'Документация' + }, + computed: { + fieldUsed: '[{label}] Используется в формуле вычисления, сначала измените соответствующую формулу', + fieldExist: '[{label}] Поле уже существует', + fieldEmpty: 'Поле обязательно для заполнения', + fieldChar: 'Поле должно начинаться с буквы' + }, + validate: { + type: 'Тип', + typePlaceholder: 'Выберите', + trigger: 'Триггер', + mode: 'Метод проверки', + modes: { + required: 'обязательное', + pattern: 'шаблон', + validator: 'валидатор', + min: 'минимум', + max: 'максимум', + len: 'длина' + }, + types: { + string: 'Строка', + array: 'Множественный выбор', + number: 'Число', + integer: 'Целое число', + float: 'Число с плавающей точкой', + object: 'Коллекция', + date: 'Дата', + url: 'URL', + email: 'Электронная почта' + }, + message: 'Ошибка', + auto: 'Автоматически', + autoRequired: 'Введите {title}', + autoMode: 'Введите корректный {title}', + requiredPlaceholder: 'Введите', + required: 'Обязательное', + rule: 'Проверка' + }, + tableOptions: { + handle: 'Операция', + add: 'Добавить', + empty1: 'Нажмите в правом нижнем углу', + empty2: 'Кнопку для добавления столбца', + rmCol: 'Удалить текущий столбец', + rmRow: 'Удалить текущую строку', + splitRow: 'Разделить на строки', + splitCol: 'Разделить на столбцы', + mergeBottom: 'Объединить вниз', + mergeRight: 'Объединить вправо', + addTop: 'Добавить столбец сверху', + addBottom: 'Добавить снизу', + addLeft: 'Добавить столбец слева', + addRight: 'Добавить столбец справа', + keyValue: 'ключ-значение' + }, + struct: { + title: 'Редактировать', + only: '[{label}] Разрешено добавить только один', + errorMsg: 'Введенное содержимое синтаксически неверно', + configured: 'Настроено' + }, + event: { + title: 'Редактировать', + create: 'Создать', + list: 'Список', + placeholder: 'Введите название события', + saveMsg: 'Сохраните редактируемое событие', + type: 'Тип', + info: 'Информация', + label: 'Поле', + inject: { + api: 'API текущей формы', + rule: 'Создать правила для текущей формы', + self: 'Правило генерации компонента', + option: 'Конфигурация формы', + args: 'Исходные параметры события' + } + }, + fetch: { + title: 'Настроить данные', + create: 'Создать данные', + config: 'Запрос', + action: 'Действие', + actionRequired: 'Введите корректную ссылку', + placeholder: 'Введите название источника данных', + method: 'Метод', + data: 'Прикрепленные данные', + headers: 'Заголовки', + parse: 'Обработка', + response: 'Данные, возвращенные интерфейсом', + onError: 'При ошибке', + remote: 'Удаленный', + static: 'Статический', + optionsType: { + fetch: 'Запрос', + struct: 'Статический' + } + }, + style: { + width: 'Ширина', + height: 'Высота', + color: 'Цвет', + backgroundColor: 'Цвет фона', + margin: 'Внешний отступ', + padding: 'Внутренний отступ', + borderRadius: 'Радиус границы', + border: 'Граница', + solid: 'Сплошная', + dashed: 'Пунктирная', + dotted: 'Точечная', + double: 'Двойная', + opacity: 'Прозрачность', + scale: 'Масштаб', + shadow: { + name: 'Тень', + x: 'Смещение по оси X', + y: 'Смещение по оси Y', + vague: 'Радиус размытия', + extend: 'Радиус расширения', + inset: 'Внутренняя', + external: 'Внешняя', + mode: 'Режим', + classic: 'Классический', + flat: 'Плоский', + solid: 'Объемный' + }, + font: { + name: 'Шрифт', + size: 'Размер', + align: 'Выравнивание', + height: 'Высота строки', + spacing: 'Межбуквенный интервал', + preview: 'Предпросмотр' + }, + decoration: { + name: 'Оформление', + underline: 'Подчеркивание', + 'line-through': 'Зачеркивание', + overline: 'Надчеркивание' + }, + weight: { + name: 'Толщина шрифта', + 300: 'Тонкий', + 400: 'По умолчанию', + 500: 'Средний', + 700: 'Жирный' + } + }, + designer: { + component: 'Компонент', + id: 'Уникальный ID', + name: 'Серийный номер', + type: 'Тип', + form: 'Форма', + style: 'Стиль', + rule: 'Основа', + advanced: 'Расширенные', + props: 'Свойства', + validate: 'Проверка', + event: 'Событие', + clearWarn: 'После очистки восстановление невозможно. Вы уверены, что хотите очистить?', + childEmpty: 'Нажмите кнопку \\e789 в правом нижнем углу, чтобы добавить столбец', + dragEmpty: 'Перетащите компоненты из списка слева сюда', + unload: 'Вы уверены, что хотите покинуть текущую страницу?' + }, + menu: { + main: 'Основные', + aide: 'Вспомогательные', + layout: 'Макет', + component: 'Компонент', + subform: 'Подформа', + tree: 'Структура' + }, + props: { + disabled: 'Отключено', + time: 'Время', + email: 'Электронная почта', + number: 'Число', + globalData: 'Глобальные данные', + mobile: 'Мобильный', + pc: 'ПК', + reactive: 'Реактивный', + title: 'Заголовок', + content: 'Содержимое', + collection: 'Коллекция', + group: 'Группа', + custom: 'Пользовательский', + change: 'Изменить', + blur: 'Потеря фокуса', + preview: 'Предпросмотр', + clear: 'Очистить', + cancel: 'Отмена', + close: 'Закрыть', + ok: 'ОК', + save: 'Сохранить', + refresh: 'Обновить', + submit: 'Отправить', + reset: 'Сбросить', + copy: 'Копировать', + delete: 'Удалить', + hide: 'Скрыть', + show: 'Показать', + position: 'Положение', + render: 'Рендеринг', + large: 'Большой', + default: 'По умолчанию', + small: 'Маленький', + always: 'Всегда', + never: 'Никогда', + hover: 'Наведение', + click: 'Клик', + button: 'Кнопка', + year: 'Год', + month: 'Месяц', + date: 'Дата', + dates: 'Даты', + week: 'Неделя', + datetime: 'Дата и время', + 'datetime-local': 'Дата и время', + datetimerange: 'Диапазон даты и времени', + daterange: 'Диапазон дат', + monthrange: 'Диапазон месяцев', + left: 'Слева', + right: 'Справа', + top: 'Сверху', + text: 'Текст', + picture: 'Изображение', + 'picture-card': 'Изображение-карточка', + center: 'Центр', + vertical: 'Вертикальный', + horizontal: 'Горизонтальный', + manage: 'Управление', + key: 'Ключ', + name: 'Имя', + value: 'Значение', + inputData: 'Значение по умолчанию', + append: 'Добавить', + options: 'Опции', + option: 'Опция', + callback: 'Обратный вызов', + _self: 'Текущее окно', + _blank: 'Новое окно', + _parent: 'Родительское окно', + _top: 'Верхнее окно' + }, + com: { + cascader: { + name: 'Cascader', + event: { + expandChange: 'Срабатывает при изменении развернутого узла', + removeTag: 'В режиме множественного выбора срабатывает при удалении тега' + }, + props: { + props: 'Опции', + placeholder: 'Заполнитель', + disabled: 'Отключено', + clearable: 'Поддерживается очистка опций', + showAllLevels: 'Отображать полный путь выбранного значения в поле ввода', + collapseTags: 'Сворачивать теги в режиме множественного выбора', + collapseTagsTooltip: 'Отображать все выбранные теги при наведении на текст свернутого тега', + separator: 'Разделитель', + filterable: 'Можно ли искать опцию', + tagType: 'Тип тега' + }, + propsOpt: { + multiple: 'Множественный выбор', + expandTrigger: 'Способ развертывания подменю', + checkStrictly: 'Строго ли не связаны родительские и дочерние узлы', + emitPath: 'При изменении выбранного узла возвращать массив значений меню каждого уровня', + value: 'Значение указанной опции как атрибут объекта опции', + label: 'Метка указанной опции как атрибут объекта опции', + children: 'Дочерняя опция указанной опции как атрибут объекта опции', + disabled: 'Отключение указанной опции как атрибут объекта опции', + leaf: 'Флаг листового узла указанной опции как атрибут объекта опции' + } + }, + checkbox: { + name: 'Чек-бокс', + props: { + input: 'Заполнять ли', + type: 'Тип', + disabled: 'Отключено', + min: 'Минимальное количество выбираемых элементов', + max: 'Максимальное количество выбираемых элементов', + textColor: 'Цвет шрифта при активной кнопке', + fill: 'Цвет границы и фона при активной кнопке' + } + }, + col: { + name: 'Столбец', + props: { + span: 'Количество столбцов, занимаемых сеткой', + offset: 'Количество пробелов слева от сетки', + push: 'Смещение сетки вправо на количество ячеек', + pull: 'Смещение сетки влево на количество ячеек' + } + }, + colorPicker: { + name: 'Выбор цвета', + event: { + activeChange: 'Срабатывает при изменении цвета, отображаемого в панели' + }, + props: { + disabled: 'Отключено', + showAlpha: 'Поддерживается ли выбор прозрачности', + colorFormat: 'Формат цвета', + predefine: 'Предопределенный цвет' + } + }, + datePicker: { + name: 'Дата', + props: { + pickerOptions: 'Опции, специфичные для текущего выбора времени и даты', + readonly: 'Только для чтения', + disabled: 'Отключено', + type: 'Тип', + editable: 'Можно ли вводить в текстовое поле', + clearable: 'Показывать кнопку очистки', + placeholder: 'Заполнитель для выбора без диапазона', + startPlaceholder: 'Заполнитель для начальной даты при выборе диапазона', + endPlaceholder: 'Заполнитель для конечной даты при выборе диапазона', + format: 'Формат, отображаемый в поле ввода', + align: 'Выравнивание', + rangeSeparator: 'Разделитель при выборе диапазона', + unlinkPanels: 'Разъединить две панели дат в селекторе диапазона' + } + }, + dateRange: { + name: 'Диапазон дат' + }, + timeRange: { + name: 'Диапазон времени' + }, + elAlert: { + name: 'Оповещение', + description: 'Описание', + props: { + title: 'Заголовок', + type: 'Тип', + description: 'Вспомогательный текст', + closable: 'Можно ли закрыть', + center: 'Центрирован ли текст', + closeText: 'Пользовательский текст кнопки закрытия', + showIcon: 'Показывать иконку', + effect: 'Выбрать предоставленную тему' + } + }, + elButton: { + name: 'Кнопка', + props: { + formCreateChild: 'Содержимое', + size: 'Размер', + type: 'Тип', + plain: 'Простая кнопка', + round: 'Скругленные углы', + circle: 'Круглая кнопка', + loading: 'Состояние загрузки', + disabled: 'Отключено' + } + }, + elCard: { + name: 'Карточка', + props: { + header: 'Заголовок', + shadow: 'Время отображения тени' + } + }, + elCollapse: { + name: 'Сворачиваемая панель', + event: { + change: 'Переключение активной панели, тип — строка в режиме аккордеона, массив в других режимах' + }, + props: { + accordion: 'Режим аккордеона' + } + }, + elCollapseItem: { + name: 'Элемент сворачиваемой панели', + props: { + title: 'Заголовок панели', + name: 'Идентификатор', + disabled: 'Отключено' + } + }, + elDivider: { + name: 'Разделитель', + props: { + formCreateChild: 'Установить содержимое', + contentPosition: 'Положение содержимого' + } + }, + elTabPane: { + name: 'Вкладка', + props: { + label: 'Заголовок', + disabled: 'Отключено', + name: 'Идентификатор вкладки', + lazy: 'Отложенный рендеринг метки' + } + }, + elTabs: { + name: 'Вкладки', + event: { + tabClick: 'Срабатывает при выборе вкладки', + tabChange: 'Срабатывает при изменении activeName', + tabRemove: 'Срабатывает при нажатии кнопки удаления вкладки', + tabAdd: 'Срабатывает при нажатии кнопки добавления новой вкладки', + edit: 'Срабатывает после нажатия кнопки добавления или удаления вкладки' + }, + props: { + type: 'Тип', + closable: 'Можно ли закрыть метку', + tabPosition: 'Положение вкладки', + stretch: 'Растягивается ли ширина метки автоматически' + } + }, + elTag: { + name: 'Tag', + props: { + formCreateNative: 'Показывать заголовок', + formCreateTitle: 'Заголовок', + formCreateChild: 'Содержимое', + type: 'Тип', + size: 'Размер тега', + effect: 'Тема тега', + closable: 'Можно ли закрыть', + disableTransitions: 'Отключить анимацию перехода', + hit: 'Есть ли обводка границы', + round: 'Круглый тег', + color: 'Цвет фона' + } + }, + elTransfer: { + name: 'Transfer', + event: { + leftCheckChange: 'Срабатывает, когда пользователь выбирает/снимает выбор с элемента левого списка', + rightCheckChange: 'Срабатывает, когда пользователь выбирает/снимает выбор с элемента правого списка' + }, + props: { + filterable: 'Можно ли искать', + filterPlaceholder: 'Заполнитель поля поиска', + targetOrder: 'Стратегия сортировки элементов списка справа', + targetOrderInfo: 'Если original, сохраняется тот же порядок, что и в данных; если push, новые элементы помещаются в конец; если unshift, новые элементы помещаются в начало', + titles: 'Заголовок', + buttonTexts: 'Содержимое кнопок', + props: 'Псевдоним поля источника данных' + } + }, + elTreeSelect: { + name: 'TreeSelect', + event: { + removeTag: 'Срабатывает при удалении тега в режиме множественного выбора' + }, + props: { + multiple: 'Множественный выбор', + disabled: 'Отключено', + clearable: 'Можно ли очистить опцию', + collapseTags: 'Отображать выбранное значение как текст при множественном выборе', + multipleLimit: 'Максимальное количество элементов, выбираемых пользователем при множественном выборе, 0 — без ограничений', + placeholder: 'Заполнитель', + props: 'Опции', + renderAfterExpand: 'Рендерить дочерние узлы после первого развертывания узла дерева', + defaultExpandAll: 'Развернуть все узлы по умолчанию', + expandOnClickNode: 'Развернуть или свернуть узел при клике на него', + checkOnClickNode: 'Выбирать узел при клике на него', + nodeKey: 'Атрибут для уникальной идентификации каждого узла дерева, должен быть уникальным для всего дерева' + } + }, + fcEditor: { + name: 'Редактор', + props: { + disabled: 'Отключено' + } + }, + fcRow: { + name: 'Строка', + props: { + gutter: 'Интервал сетки', + type: 'Режим гибкого макета', + justify: 'Горизонтальное выравнивание в гибком макете', + align: 'Вертикальное выравнивание в гибком макете' + } + }, + fcTable: { + name: 'Таблица', + props: { + border: 'Показывать границу', + borderColor: 'Цвет границы', + borderWidth: 'Ширина границы' + } + }, + fcTableGrid: { + name: 'Сетка' + }, + group: { + name: 'Подформа', + props: { + disabled: 'Отключено', + syncDisabled: 'Принудительно синхронизировать состояние отключения с подформой', + expand: 'Установить элементы, развернутые по умолчанию', + button: 'Показывать кнопку операций', + sortBtn: 'Показывать кнопку сортировки', + min: 'Минимальное количество добавляемых элементов', + max: 'Максимальное количество добавляемых элементов' + } + }, + html: { + name: 'HTML', + props: { + formCreateNative: 'Показывать заголовок', + formCreateTitle: 'Заголовок', + formCreateChild: 'Содержимое' + } + }, + input: { + name: 'Поле ввода', + event: { + change: 'Срабатывает при изменении значения, когда компонент теряет фокус или пользователь нажимает Enter' + }, + props: { + type: 'Тип', + maxlength: 'Максимальная длина ввода', + minlength: 'Минимальная длина ввода', + placeholder: 'Заполнитель', + clearable: 'Показывать кнопку очистки', + disabled: 'Отключено', + readonly: 'Только для чтения' + } + }, + inputNumber: { + name: 'Числовое поле', + props: { + precision: 'Точность входного значения', + min: 'Минимальное допустимое значение счетчика', + max: 'Максимальное допустимое значение счетчика', + step: 'Шаг', + stepStrictly: 'Можно ли вводить только кратные шагу значения', + disabled: 'Отключено', + controls: 'Использовать кнопки управления', + controlsPosition: 'Положение кнопок управления', + placeholder: 'Заполнитель' + } + }, + password: { + name: 'Пароль', + event: { + change: 'Срабатывает при изменении значения, когда компонент теряет фокус или пользователь нажимает Enter' + }, + props: { + disabled: 'Отключено', + readonly: 'Только для чтения', + maxlength: 'Максимальная длина ввода', + minlength: 'Минимальная длина ввода', + placeholder: 'Заполнитель', + clearable: 'Показывать кнопку очистки' + } + }, + radio: { + name: 'Радио кнопка', + props: { + input: 'Заполнять ли', + disabled: 'Отключено', + type: 'Тип', + textColor: 'Цвет текста при активации формы кнопки', + fill: 'Цвет заливки и границы при активации формы кнопки' + } + }, + rate: { + name: 'Оценка', + props: { + max: 'Максимальный балл', + disabled: 'Отключено', + allowHalf: 'Разрешить половинный выбор', + voidColor: 'Цвет иконки, когда не выбрано', + disabledVoidColor: 'Цвет иконки, когда не выбрано в режиме только чтение', + voidIconClass: 'Имя класса иконки, когда не выбрано', + disabledVoidIconClass: 'Имя класса иконки, когда не выбрано в режиме только чтение', + showScore: 'Показывать текущий балл', + textColor: 'Цвет вспомогательного текста', + scoreTemplate: 'Шаблон отображения балла' + } + }, + select: { + name: 'Выбор', + event: { + removeTag: 'Срабатывает при удалении тега в режиме множественного выбора' + }, + props: { + multiple: 'Множественный выбор', + disabled: 'Отключено', + clearable: 'Можно ли очистить опцию', + collapseTags: 'Отображать выбранное значение как текст при множественном выборе', + multipleLimit: 'Максимальное количество элементов, выбираемых пользователем при множественном выборе, 0 — без ограничений', + placeholder: 'Заполнитель', + filterable: 'Можно ли искать', + allowCreate: 'Разрешено ли пользователю создавать новые записи', + noMatchText: 'Текст, отображаемый, когда нет совпадений с условиями поиска', + noDataText: 'Текст, отображаемый, когда опция пуста', + reserveKeyword: 'При множественном выборе и поиске сохранять текущие ключевые слова поиска после выбора опции', + defaultFirstOption: 'Нажмите Enter в поле ввода, чтобы выбрать первый подходящий элемент', + remote: 'Загружаются ли опции удаленно с сервера', + remoteMethod: 'Пользовательские методы удаленного поиска' + } + }, + slider: { + name: 'Слайдер', + props: { + min: 'Минимальное значение', + max: 'Максимальное значение', + disabled: 'Отключено', + step: 'Шаг', + showInput: 'Показывать поле ввода, действует только при выборе без диапазона', + showInputControls: 'Показывать кнопки управления полем ввода, если поле ввода отображается', + showStops: 'Показывать точки останова', + range: 'Выбор диапазона', + vertical: 'Вертикальный режим', + height: 'Высота слайдера, обязательна в вертикальном режиме' + } + }, + space: { + name: 'Space', + props: { + height: 'Высота' + } + }, + subForm: { + name: 'Группа', + props: { + disabled: 'Отключено', + syncDisabled: 'Принудительно синхронизировать состояние отключения с подформой' + } + }, + switch: { + name: 'Переключатель', + props: { + disabled: 'Отключено', + width: 'Ширина (пиксели)', + activeText: 'Описание текста при включении', + inactiveText: 'Описание текста при выключении', + activeValue: 'Значение при включении', + inactiveValue: 'Значение при выключении', + activeColor: 'Цвет фона при включении', + inactiveColor: 'Цвет фона при выключении' + } + }, + tableForm: { + name: 'TableForm', + props: { + disabled: 'Отключено', + max: 'Максимальное количество добавляемых строк, 0 — без ограничений' + } + }, + tableFormColumn: { + name: 'TableFormColumn', + label: 'TableFormColumn', + props: { + label: 'Заголовок', + width: 'Ширина', + color: 'Цвет' + } + }, + text: { + name: 'Текст', + props: { + formCreateNative: 'Показывать заголовок', + formCreateTitle: 'Заголовок', + formCreateChild: 'Содержимое' + } + }, + textarea: { + name: 'Текстовое поле', + event: { + change: 'Срабатывает при изменении значения, когда компонент теряет фокус или пользователь нажимает Enter' + }, + props: { + disabled: 'Отключено', + readonly: 'Только для чтения', + maxlength: 'Максимальная длина ввода', + minlength: 'Минимальная длина ввода', + showWordLimit: 'Показывать статистику количества слов', + placeholder: 'Заполнитель', + rows: 'Количество строк поля ввода', + autosize: 'Адаптивная высота' + } + }, + timePicker: { + name: 'Время', + props: { + pickerOptions: 'Опции, специфичные для текущего выбора времени и даты', + readonly: 'Только для чтения', + disabled: 'Отключено', + editable: 'Можно ли вводить в текстовое поле', + clearable: 'Показывать кнопку очистки', + placeholder: 'Заполнитель для выбора без диапазона', + startPlaceholder: 'Заполнитель для начального времени при выборе диапазона', + endPlaceholder: 'Заполнитель для конечного времени при выборе диапазона', + isRange: 'Выбор диапазона времени', + arrowControl: 'Использовать стрелки для выбора времени', + align: 'Выравнивание' + } + }, + tree: { + name: 'Tree', + event: { + nodeClick: 'Срабатывает при клике на узел', + nodeContextmenu: 'Срабатывает при правом клике на узел', + checkChange: 'Срабатывает при клике на флажок', + check: 'Срабатывает после клика на флажок узла', + currentChange: 'Срабатывает при изменении текущего выбранного узла', + nodeExpand: 'Срабатывает при развертывании узла', + nodeCollapse: 'Срабатывает при сворачивании узла', + nodeDragStart: 'Срабатывает при начале перетаскивания узла', + nodeDragEnter: 'Срабатывает при перетаскивании в другие узлы', + nodeDragLeave: 'Срабатывает при покидании узла при перетаскивании', + nodeDragOver: 'Срабатывает при перетаскивании узла', + nodeDragEnd: 'Срабатывает при завершении перетаскивания', + nodeDrop: 'Срабатывает при успешном завершении перетаскивания и сброса' + }, + props: { + emptyText: 'Текст, отображаемый при пустом содержимом', + props: 'Опции', + renderAfterExpand: 'Рендерить дочерние узлы после первого развертывания узла дерева', + defaultExpandAll: 'Развернуть все узлы по умолчанию', + expandOnClickNode: 'Развернуть или свернуть узел при клике на него, если false, узел развернется или свернется только при клике на иконку стрелки', + checkOnClickNode: 'Выбирать узел при клике на него', + autoExpandParent: 'Автоматически развернуть родительский узел при развертывании дочернего', + checkStrictly: 'При отображении флажка строго ли не связаны родительские и дочерние узлы', + accordion: 'Развертывать только один узел дерева на одном уровне за раз', + indent: 'Горизонтальный отступ (пиксели) между узлами соседних уровней', + nodeKey: 'Атрибут для уникальной идентификации каждого узла дерева, должен быть уникальным для всего дерева' + } + }, + upload: { + name: 'Upload', + info: 'Присвойте URL, возвращенный интерфейсом, полю file.url в методе onSuccess', + event: { + remove: 'Срабатывает при удалении файла из списка файлов' + }, + props: { + listType: 'Тип загрузки', + multiple: 'Поддерживается ли множественный выбор файлов', + action: 'Адрес загрузки (обязательно)', + beforeUpload: 'Хук перед загрузкой файла', + onSuccess: 'Обратный вызов успешной загрузки', + headers: 'Установить заголовки запроса загрузки', + data: 'Дополнительные параметры, прикрепляемые при загрузке', + name: 'Имя поля загружаемого файла', + withCredentials: 'Поддержка отправки информации об учетных данных cookie', + accept: 'Принимаемые типы загружаемых файлов', + autoUpload: 'Загружать файл сразу после выбора', + disabled: 'Отключено', + limit: 'Максимальное количество разрешенных загрузок' + } + } + } +} \ No newline at end of file