diff --git a/.vercel/project.json b/.vercel/project.json new file mode 100644 index 000000000..812014f7c --- /dev/null +++ b/.vercel/project.json @@ -0,0 +1 @@ +{"neverMindDeployCard":true} \ No newline at end of file diff --git a/README-ru.md b/README-ru.md new file mode 100644 index 000000000..62d020baa --- /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/config.yaml b/server/config.yaml index 385e8d8b3..27d9af9e1 100644 --- a/server/config.yaml +++ b/server/config.yaml @@ -281,8 +281,7 @@ mcp: sse_path: /sse message_path: /message url_prefix: '' - language: language: en default-language: zh - dir: ./resource/lang/ \ No newline at end of file + dir: ./resource/lang/ diff --git a/server/middleware/language.go b/server/middleware/language.go index fc9ec9013..e210342e1 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/ar.json b/server/resource/lang/ar.json index 52d975000..319ecf799 100644 --- a/server/resource/lang/ar.json +++ b/server/resource/lang/ar.json @@ -388,6 +388,9 @@ "packagePlugin": "تعيين حزمة المكون", "personalInfo": "معلومات شخصية", "pluginInstall": "تثبيت المكون", + "aiPageDraw": "رسم صفحة الذكاء الاصطناعي", + "mcpToolsTemplate": "قالب أدوات MCP", + "mcpToolsTest": "اختبار أدوات MCP", "pluginMarket": "سوق المكونات", "pluginSystem": "نظام المكونات", "resumableUpload": "تحميل قابل لإعادة الإضافة (إصدار مكون إضافي)", @@ -529,6 +532,291 @@ }, "router": { + }, + "database": { + "parentMenuInitFailed": "فشل في تهيئة القائمة الأساسية!", + "childMenuInitFailed": "فشل في تهيئة القائمة الفرعية!", + "userAuthorityAssocFailed": "فشل في إنشاء ارتباط [المستخدم-الصلاحية]، لم يتم العثور على بيانات تهيئة جدول الصلاحيات", + "menuAuthorityAssocFailed": "فشل في إنشاء ارتباط [القائمة-الصلاحية]، لم يتم العثور على بيانات تهيئة جدول الصلاحيات", + "menuAuthorityAssocFailedNoMenu": "فشل في إنشاء ارتباط [القائمة-الصلاحية]، لم يتم العثور على بيانات تهيئة جدول القائمة", + "superAdminMenuAssignFailed": "فشل في تعيين القوائم للمدير العام", + "normalUserMenuAssignFailed": "فشل في تعيين القوائم للمستخدم العادي", + "testRoleMenuAssignFailed": "فشل في تعيين القوائم لدور الاختبار", + "casbinInitFailed": "فشل في تهيئة بيانات جدول Casbin (%s)!", + "tableInitFailed": "فشل في تهيئة بيانات جدول %s!", + "dictionaryTableNotFound": "لم يتم العثور على بيانات تهيئة جدول %s" + }, + "menu": { + "buildMenuIdMapping": "بناء خريطة معرف القائمة للبحث السريع", + "assignDifferentPermissions": "تعيين صلاحيات مختلفة لأدوار مختلفة", + "superAdminRole": "دور المدير العام (888) - لديه جميع صلاحيات القائمة", + "normalUserRole": "دور المستخدم العادي (8881) - لديه قوائم الوظائف الأساسية فقط", + "selectParentMenus": "اختيار بعض القوائم الأساسية وقوائمها الفرعية فقط", + "addDashboardMenus": "إضافة قوائم لوحة التحكم وحولنا والمعلومات الشخصية", + "testRole": "دور الاختبار (9528) - لديه صلاحيات قائمة جزئية", + "addAllParentMenus": "إضافة جميع القوائم الأساسية", + "addPartialChildMenus": "إضافة قوائم فرعية جزئية - قوائم فرعية لأدوات النظام وملفات الأمثلة ووحدات أخرى" + }, + "user": { + "userRegistration": "تسجيل المستخدم", + "userLogin": "تسجيل دخول المستخدم", + "changeUserPassword": "تغيير كلمة مرور المستخدم", + "getPaginatedData": "الحصول على البيانات المقسمة على صفحات", + "setUserPermission": "تعيين صلاحية المستخدم", + "setUserPermissions": "تعيين صلاحيات المستخدم", + "deleteUser": "حذف المستخدم", + "setUserInfo": "تعيين معلومات المستخدم", + "setUserConfig": "تعيين تكوين المستخدم", + "getUserInfo": "الحصول على معلومات المستخدم", + "getUserInfoById": "الحصول على معلومات المستخدم بالمعرف", + "getUserInfoByUuid": "الحصول على معلومات المستخدم بـ UUID", + "resetUserPassword": "إعادة تعيين كلمة مرور المستخدم", + "adminRegister": "تسجيل حساب المدير", + "changePassword": "تغيير كلمة المرور للمستخدم", + "setUserAuthority": "تعيين صلاحية المستخدم", + "setSelfInfo": "تعيين المعلومات الذاتية", + "setUserAuthorities": "تعيين صلاحيات المستخدم", + "resetPassword": "إعادة تعيين كلمة المرور", + "setSelfSetting": "تكوين واجهة المستخدم", + "getUserList": "الحصول على قائمة المستخدمين المقسمة على صفحات", + "getSelfInfo": "الحصول على المعلومات الذاتية" + }, + "upload": { + "fileNotExists": "الملف غير موجود", + "uploadFile": "رفع الملف", + "deleteFile": "حذف الملف", + "createFileDefer": "إنشاء ملف مع إغلاق مؤجل", + "fileNameFormat": "تنسيق اسم الملف، يمكنك تغييره بنفسك، يُنصح بضمان التفرد", + "qiniuConfig": "إرجاع تكوين Qiniu Cloud وفقاً لملف التكوين", + "qiniuZoneInit": "تهيئة غرفة الكمبيوتر المقابلة للمساحة وفقاً لملف التكوين", + "readLocalFile": "قراءة الملف المحلي", + "aliyunUploadPath": "تنسيق اسم ملف مسار رفع Aliyun، يمكنك تغييره بنفسك، يُنصح بضمان التفرد", + "uploadFileStream": "رفع تدفق الملف", + "deleteObjectName": "حذف ملف واحد. objectName يشير إلى أنه عند حذف ملفات OSS، تحتاج إلى تحديد المسار الكامل بما في ذلك امتداد الملف، مثل abc/efg/123.jpg", + "deleteFolderNote": "لحذف مجلد، يرجى تعيين objectName إلى اسم المجلد المقابل. إذا لم يكن المجلد فارغاً، تحتاج إلى حذف جميع الكائنات في المجلد قبل أن تتمكن من حذف المجلد", + "createOSSClient": "إنشاء مثيل OSSClient", + "getBucket": "الحصول على مساحة التخزين", + "readFileSuffix": "قراءة امتداد الملف", + "readFileNameEncrypt": "قراءة اسم الملف وتشفيره", + "combineNewFileName": "دمج اسم الملف الجديد", + "tryCreatePath": "محاولة إنشاء هذا المسار", + "combinePathFileName": "دمج المسار واسم الملف", + "readFile": "قراءة الملف", + "transferFile": "نقل (نسخ) الملف", + "keyCannotBeEmpty": "المفتاح لا يمكن أن يكون فارغاً", + "illegalKey": "مفتاح غير قانوني", + "fileNotExist": "الملف غير موجود", + "fileDeletionFailed": "فشل في حذف الملف", + "tryCreateBucket": "محاولة إنشاء bucket", + "readFileFailed": "فشل في قراءة الملف", + "encryptFileName": "تشفير اسم الملف للتخزين", + "setTimeout10Min": "تعيين المهلة الزمنية إلى 10 دقائق", + "uploadLargeFileNote": "رفع الملف باستخدام PutObject، الملفات الكبيرة تتحول تلقائياً إلى رفع متعدد الأجزاء", + "uploadToMinioFailed": "فشل في رفع الملف إلى minio", + "minioInitFailed": "فشل في تهيئة Minio", + "checkMinioConfig": "لقد قمت بتكوين استخدام minio، لكن التهيئة فشلت، يرجى التحقق من توفر minio أو تكوين الأمان", + "minioInitFailedSuggestion": "يُنصح بفعل هذا. إذا قام المستخدم بتكوين minio بنفسه وحدث خطأ، فمن الخطير أيضاً بدء الخدمة" + }, + "operation": { + "createRecord": "إنشاء سجل", + "batchDeleteRecords": "حذف السجلات بالدفعة", + "deleteOperationRecord": "حذف سجل العملية", + "getOperationRecordById": "الحصول على سجل عملية واحد بالمعرف", + "getPaginatedOperationRecords": "الحصول على قائمة سجلات العمليات المقسمة على صفحات", + "createDb": "إنشاء قاعدة بيانات", + "conditionalSearch": "إذا كان هناك بحث شرطي، سيتم إنشاء عبارات البحث تلقائياً أدناه" + }, + "params": { + "createSysParams": "إنشاء سجل معاملات النظام" + }, + "breakpoint": { + "invalidFileNameOrPath": "اسم الملف أو المسار غير صالح", + "frontendFileChunk": "جزء الملف المرسل من الواجهة الأمامية وأي جزء من أي ملف هو الجزء الحالي", + "backendCompareChunk": "بعد أن يحصل الخلفية عليه، قارن ما إذا كان هذا الجزء مرفوع أم أنه جزء غير مكتمل", + "frontendChunkSize": "حجم كل جزء مرسل من الواجهة الأمامية", + "frontendLastChunk": "الواجهة الأمامية تخبر ما إذا كان الجزء الأخير وما إذا كان مكتملاً", + "breakpointResume": "استئناف نقطة التوقف", + "checkMd5": "فحص Md5", + "canContinueUpload": "يمكن متابعة الرفع", + "chunkIncomplete": "الجزء غير مكتمل، تجاهل", + "createChunkContent": "إنشاء محتوى الجزء", + "fileNamePathIllegal": "اسم الملف أو المسار غير قانوني", + "createChunkFile": "إنشاء ملف الجزء", + "removeChunk": "إزالة الجزء" + }, + "validator": { + "registerCustomRules": "تسجيل مخطط القواعد المخصصة، يُنصح بالتسجيل في طبقة تهيئة المسار", + "notEmpty": "غير فارغ، لا يمكن أن يكون القيمة الصفرية لنوعه المقابل", + "regexValidation": "التحقق من التعبير النمطي، فحص ما إذا كان عنصر الإدخال يلبي التعبير النمطي", + "lessThan": "أقل من المعامل (<) إذا كان string array Slice، فهو مقارنة الطول، إذا كان int uint float، فهو مقارنة رقمية", + "lessThanEqual": "أقل من أو يساوي المعامل (<=) إذا كان string array Slice، فهو مقارنة الطول، إذا كان int uint float، فهو مقارنة رقمية", + "equal": "يساوي المعامل (==) إذا كان string array Slice، فهو مقارنة الطول، إذا كان int uint float، فهو مقارنة رقمية", + "notEqual": "لا يساوي المعامل (!=) إذا كان string array Slice، فهو مقارنة الطول، إذا كان int uint float، فهو مقارنة رقمية", + "greaterThanEqual": "أكبر من أو يساوي المعامل (>=) إذا كان string array Slice، فهو مقارنة الطول، إذا كان int uint float، فهو مقارنة رقمية", + "greaterThan": "أكبر من المعامل (>) إذا كان string array Slice، فهو مقارنة الطول، إذا كان int uint float، فهو مقارنة رقمية", + "validationMethod": "طريقة التحقق", + "lengthNumberValidation": "طريقة التحقق من الطول والرقم، التحقق التلقائي وفقاً للنوع", + "notEmptyValidation": "التحقق من عدم الفراغ", + "compareFunction": "دالة المقارنة" + }, + "jwt": { + "tokenNotValidYet": "الرمز المميز غير نشط بعد", + "tokenMalformed": "هذا ليس رمزاً مميزاً", + "tokenInvalid": "لا يمكن معالجة هذا الرمز المميز", + "unknownError": "خطأ غير معروف", + "tokenExpired": "انتهت صلاحية الرمز المميز", + "tokenNotActive": "الرمز المميز ليس نشطاً بعد", + "notAToken": "هذا ليس رمزاً مميزاً", + "invalidSignature": "توقيع غير صالح", + "cannotProcessToken": "لا يمكن معالجة هذا الرمز المميز", + "bufferTime": "وقت التخزين المؤقت يوم واحد. خلال وقت التخزين المؤقت، سيتم الحصول على رمز تحديث جديد. في هذا الوقت، سيكون لدى المستخدم رمزان صالحان، لكن الواجهة الأمامية تحتفظ بواحد فقط، والآخر سيضيع", + "audience": "الجمهور", + "notBefore": "وقت فعالية التوقيع", + "expiresAt": "وقت انتهاء الصلاحية 7 أيام ملف التكوين", + "issuer": "مُصدر التوقيع", + "createToken": "إنشاء رمز مميز", + "createTokenByOldToken": "رمز قديم لرمز جديد، استخدم الدمج للعودة إلى المصدر لتجنب مشاكل التزامن", + "parseToken": "تحليل الرمز المميز", + "jwtRedisExpire": "تخزين jwt في redis وتعيين وقت انتهاء الصلاحية", + "expireTimeNote": "وقت انتهاء الصلاحية هنا يساوي وقت انتهاء صلاحية jwt" + }, + "hash": { + "bcryptHash": "استخدام bcrypt لتشفير كلمات المرور", + "bcryptCheck": "مقارنة كلمة المرور النصية مع قيمة التجزئة في قاعدة البيانات", + "md5Encrypt": "تشفير MD5" + }, + "claims": { + "addCookieToken": "إضافة cookie x-token إلى الويب المصدر", + "getUserIdFromContext": "الحصول على معرف المستخدم المحلل من jwt من Context الخاص بـ Gin", + "getUserUuidFromContext": "الحصول على UUID المستخدم المحلل من jwt من Context الخاص بـ Gin", + "getUserAuthorityIdFromContext": "الحصول على معرف دور المستخدم المحلل من jwt من Context الخاص بـ Gin", + "getUserInfoFromContext": "الحصول على معرف دور المستخدم المحلل من jwt من Context الخاص بـ Gin", + "getUserNameFromContext": "الحصول على اسم المستخدم المحلل من jwt من Context الخاص بـ Gin" + }, + "directory": { + "fileExists": "يوجد ملف بنفس الاسم", + "fileDirectoryExists": "ما إذا كان دليل الملف موجوداً", + "sameNameFileExists": "ملف بنفس الاسم موجود", + "batchCreateFolders": "إنشاء مجلدات بالدفعة", + "fileMoveExternal": "نقل الملف للاستدعاء الخارجي", + "srcDstParam": "src: الموقع المصدر، مسار مطلق أو نسبي، dst: الموقع الهدف، مسار مطلق أو نسبي، يجب أن يكون مجلداً", + "removeStructSpaces": "إزالة مسافات البنية", + "targetParam": "target: البنية الهدف، الإدخال يجب أن يكون نوع مؤشر", + "fileExist": "تحديد ما إذا كان الملف موجوداً" + }, + "format": { + "reflectStructToMap": "استخدام الانعكاس لتحويل البنية إلى خريطة", + "formatArrayToString": "تنسيق المصفوفة إلى نص", + "makeHump": "تحويل النص إلى تسمية الجمل", + "humpToUnderscore": "تحويل تسمية الجمل إلى وضع فصل الشرطة السفلية", + "addUnderscoreBeforeUppercase": "إضافة شرطة سفلية قبل الأحرف الكبيرة", + "convertToLowercase": "تحويل إلى أحرف صغيرة", + "randomString": "نص عشوائي", + "buildTree": "يُستخدم لبناء بنية شجرية", + "createBasicMap": "إنشاء خريطة أساسية" + }, + "json": { + "useJsonDecoder": "استخدام json.Decoder لتسجيل ترتيب المفاتيح أثناء التحليل", + "ensureDataIsObject": "التأكد من أن البيانات كائن", + "parseValue": "تحليل القيمة" + }, + "casbin": { + "getCasbinInstance": "الحصول على مثيل casbin", + "checkCasbinTableEngine": "فشل في تكييف قاعدة البيانات، يرجى التحقق من أن جدول casbin هو محرك InnoDB!", + "stringLoadModelFailed": "فشل في تحميل نموذج النص!" + }, + "zip": { + "decompress": "إلغاء الضغط" + }, + "request": { + "createUrl": "إنشاء URL", + "addQueryParams": "إضافة معاملات الاستعلام", + "encodeDataToJson": "ترميز البيانات إلى JSON", + "createRequest": "إنشاء طلب", + "sendRequest": "إرسال طلب", + "returnResponse": "إرجاع الاستجابة، دع المستدعي يتعامل معها" + }, + "timer": { + "findAllCron": "العثور على جميع Cron", + "addTaskMethodSecond": "إضافة طريقة المهمة بالثواني", + "addTaskFuncSecond": "إضافة دالة المهمة بالثواني", + "addTaskInterfaceSecond": "إضافة واجهة المهمة بالثواني", + "addTaskByFunc": "إضافة مهمة بطريقة الدالة", + "addTaskByInterface": "إضافة مهمة بطريقة الواجهة، تحتاج إلى تنفيذ واجهة مع طريقة Run للتشغيل", + "getCorrespondingCron": "الحصول على cron المقابل بـ taskName، قد يكون فارغاً", + "specifiedCronStart": "بدء تنفيذ cron المحدد", + "specifiedCronStop": "إيقاف تنفيذ cron المحدد", + "findSpecifiedTask": "العثور على مهمة محددة تحت cron محدد", + "deleteTaskById": "حذف مهمة محددة تحت cron محدد بالمعرف", + "deleteTaskByName": "حذف مهمة محددة تحت cron محدد بـ taskName", + "clearSpecifiedCron": "مسح cronName المحدد", + "stopAllCron": "إيقاف جميع cron", + "timerTaskManagement": "إدارة مهام المؤقت", + "addTaskByFuncMethod": "إضافة مهمة بطريقة الدالة", + "addTaskByFuncWithSecond": "إضافة مهمة بطريقة الدالة باستخدام WithSeconds", + "addTaskByJobMethod": "إضافة مهمة بطريقة الواجهة", + "addTaskByJobWithSeconds": "إضافة مهمة بطريقة الواجهة", + "findCron": "الحصول على cron المقابل بـ cronName، قد يكون فارغاً", + "findTask": "الحصول على cron المقابل بـ cronName، قد يكون فارغاً", + "findCronList": "الحصول على قائمة جميع المهام", + "startCron": "بدء المهمة", + "stopCron": "إيقاف المهمة", + "removeTask": "إزالة مهمة محددة من cronName", + "removeTaskByName": "إزالة مهمة محددة من cronName باستخدام taskName", + "clear": "مسح المهام", + "close": "تحرير الموارد", + "testMockFunc": "اختبار mockfunc", + "testJobMockFunc": "اختبار job mockfunc" + }, + "autocode": { + "getTemplateFuncMap": "إرجاع خريطة دالة القالب للاستخدام في القوالب", + "renderModelFields": "عرض الحقول في Model", + "buildGormTags": "بناء علامات gorm", + "buildFieldDefinitionByType": "بناء تعريفات حقول مختلفة وفقاً لنوع الحقل", + "addFieldDescription": "إضافة وصف الحقل", + "formatSearchCondition": "تنسيق عبارة شرط البحث", + "complexTypeBusinessLogic": "نوع البيانات هو نوع معقد، يرجى تنفيذ منطق استعلام النوع المعقد وفقاً لمتطلبات العمل", + "formatFrontendSearchCondition": "تنسيق شرط البحث للواجهة الأمامية", + "startBuildFormItem": "بدء بناء عنصر النموذج", + "generateInputTypeByField": "إنتاج أنواع إدخال مختلفة وفقاً لخصائص الحقل", + "pleaseSelect": "يرجى الاختيار", + "yes": "نعم", + "no": "لا", + "pleaseSelectField": "يرجى اختيار %s", + "minValue": "القيمة الدنيا", + "maxValue": "القيمة العليا", + "searchCondition": "شرط البحث", + "searchRangeNote": "نطاق البحث من تاريخ البداية (شامل) إلى تاريخ النهاية (غير شامل)", + "to": "إلى", + "startTime": "وقت البداية", + "endTime": "وقت النهاية", + "closeFormItem": "إغلاق عنصر النموذج", + "richTextContent": "محتوى النص الغني", + "startBuildFormItemForEdit": "بدء بناء عنصر النموذج", + "handleDifferentFieldTypes": "التعامل مع أنواع حقول مختلفة", + "pleaseEnter": "يرجى إدخال %s", + "jsonStructureNote": "هذا الحقل هو بنية json، يمكن للواجهة الأمامية التحكم في وضع العرض وربط البيانات بنفسها. مفتاح json الذي يحتاج إلى ربط هو formData.%s. الخلفية ستخزن وتسترد وفقاً لنوع json", + "selectDate": "اختيار التاريخ", + "closeFormItemForEdit": "إغلاق عنصر النموذج", + "startBuildDescriptionItem": "بدء بناء عنصر الوصف", + "closeDescriptionItem": "إغلاق عنصر الوصف", + "determineDefaultValueByFieldType": "تحديد القيمة الافتراضية وفقاً لنوع الحقل", + "checkDataSourceExists": "فحص ما إذا كان مصدر البيانات موجوداً", + "returnFormattedDefaultValue": "إرجاع نص القيمة الافتراضية المنسق", + "generateSearchFieldByAttribute": "إنتاج تعريف حقل بنية البحث وفقاً لخصائص الحقل", + "noSearchTypeReturnEmpty": "إذا لم يكن هناك نوع بحث، إرجاع نص فارغ", + "generateRangeSearchField": "إنتاج حقل البحث النطاقي", + "timeCase": "حالة الوقت", + "generateNormalSearchField": "إنتاج حقل البحث العادي" + }, + "dictionary": { + "duplicateTypeNotAllowed": "يوجد نوع مكرر، الإنشاء غير مسموح", + "doNotCauseTrouble": "يرجى عدم إثارة المشاكل", + "queryDictDataFailed": "فشل في استعلام بيانات القاموس" + }, + "category": { + "nameAlreadyExists": "اسم الفئة موجود بالفعل", + "deleteChildrenFirst": "يرجى حذف العناصر الفرعية أولاً" } } diff --git a/server/resource/lang/en.json b/server/resource/lang/en.json index f5f422eb1..dfb4af1d4 100644 --- a/server/resource/lang/en.json +++ b/server/resource/lang/en.json @@ -376,6 +376,9 @@ "about": "About", "adminTools": "Administration Tools", "announcementManage": "Announcement Management [Example]", + "aiPageDraw": "AI PageDraw", + "mcpToolsTemplate": "Mcp Tools Template", + "mcpToolsTest": "Mcp Tools Test", "apiManage": "API Management", "autoCode": "Code Generator", "autoCodeEdit": "Automate code (reuse)", @@ -532,6 +535,33 @@ }, "router": { + }, + "directory": { + "fileExists": "File with the same name exists" + }, + "upload": { + "fileNotExists": "File does not exist", + "readFileFailed": "Failed to read file" + }, + "jwt": { + "unknownError": "Unknown error", + "tokenExpired": "Token has expired", + "tokenNotValidYet": "Token is not yet active", + "tokenMalformed": "This is not a token", + "invalidSignature": "Invalid signature", + "tokenInvalid": "Cannot process this token" + }, + "breakpoint": { + "invalidFileNameOrPath": "Invalid file name or path" + }, + "dictionary": { + "duplicateTypeNotAllowed": "Duplicate type exists, creation not allowed", + "doNotCauseTrouble": "Please do not cause trouble", + "queryDictDataFailed": "Failed to query dictionary data" + }, + "category": { + "nameAlreadyExists": "Category name already exists", + "deleteChildrenFirst": "Please delete children first" } } diff --git a/server/resource/lang/ru.json b/server/resource/lang/ru.json new file mode 100644 index 000000000..dbb8fc9e2 --- /dev/null +++ b/server/resource/lang/ru.json @@ -0,0 +1,564 @@ +{ + "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": "Управление объявлениями [Пример]", + "aiPageDraw": "AI Рисование страницы", + "mcpToolsTemplate": "Шаблон инструментов MCP", + "mcpToolsTest": "Тест инструментов MCP", + "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": {}, + "directory": { + "fileExists": "Файл с таким именем существует" + }, + "upload": { + "fileNotExists": "Файл не существует", + "readFileFailed": "Не удалось прочитать файл" + }, + "jwt": { + "unknownError": "Неизвестная ошибка", + "tokenExpired": "Срок действия токена истек", + "tokenNotValidYet": "Токен еще не активен", + "tokenMalformed": "Это не токен", + "invalidSignature": "Недействительная подпись", + "tokenInvalid": "Невозможно обработать этот токен" + }, + "breakpoint": { + "invalidFileNameOrPath": "Недействительное имя файла или путь" + }, + "dictionary": { + "duplicateTypeNotAllowed": "Существует дублирующийся тип, создание не разрешено", + "doNotCauseTrouble": "Пожалуйста, не создавайте проблем", + "queryDictDataFailed": "Не удалось запросить данные словаря" + }, + "category": { + "nameAlreadyExists": "Имя категории уже существует", + "deleteChildrenFirst": "Пожалуйста, сначала удалите дочерние элементы" + } +} diff --git a/server/resource/lang/zh-TW.json b/server/resource/lang/zh-TW.json index 805518652..4eccf19e7 100644 --- a/server/resource/lang/zh-TW.json +++ b/server/resource/lang/zh-TW.json @@ -378,6 +378,9 @@ "about": "關於我們", "adminTools": "超級管理員", "announcementManage": "公告管理[示例]", + "aiPageDraw": "AI頁面繪製", + "mcpToolsTemplate": "Mcp Tools模板", + "mcpToolsTest": "Mcp Tools測試", "apiManage": "api管理", "autoCode": "代碼生成器", "autoCodeEdit": "自動化代碼(復用)", @@ -536,5 +539,32 @@ "lengthOrValueOutOfRange": "長度或值不在合法範圍", "sysNoSupport": "系統不支持", "fileNameInvalid": "文件名不合法" + }, + "directory": { + "fileExists": "存在相同名稱的檔案" + }, + "upload": { + "fileNotExists": "檔案不存在", + "readFileFailed": "讀取檔案失敗" + }, + "jwt": { + "unknownError": "未知錯誤", + "tokenExpired": "令牌已過期", + "tokenNotValidYet": "令牌尚未生效", + "tokenMalformed": "這不是一個令牌", + "invalidSignature": "無效簽名", + "tokenInvalid": "無法處理此令牌" + }, + "breakpoint": { + "invalidFileNameOrPath": "無效的檔案名稱或路徑" + }, + "dictionary": { + "duplicateTypeNotAllowed": "存在相同的type,不允許創建", + "doNotCauseTrouble": "請不要搗亂", + "queryDictDataFailed": "查詢字典數據失敗" + }, + "category": { + "nameAlreadyExists": "分類名稱已存在", + "deleteChildrenFirst": "請先刪除子級" } -} \ No newline at end of file +} diff --git a/server/resource/lang/zh.json b/server/resource/lang/zh.json index b34efa87d..1473ff5c5 100644 --- a/server/resource/lang/zh.json +++ b/server/resource/lang/zh.json @@ -115,21 +115,25 @@ "description": "描述", "displayName": "展示名", "keywordNotice": "%s为go的关键字!", - + "pluginModeInterfaceV2": "插件模式接口化v2", + "startTime": "开始时间", + "autoRegisterGormMigration": "自动为 gorm.go 注册一个自动迁移", + "readLocalFile": "读取本地文件", + "readFileFailed": "读取文件失败", + "tokenExpired": "token已过期", + "defineAllMenus": "定义所有菜单", "nonStandardPlugin": "非标准插件,请按照文档自动迁移使用", "autoPathExists": "autoPath 已存在同名插件,请自行手动安装", "duplicatePlugin": "已存在同名插件,请自行手动安装", "pluginNameRequired": "插件名称不能为空", "webPathNotExist": "web路径不存在", "serverPathNotExist": "server路径不存在", - "duplicateRoleId": "存在相同角色ID", "queryRoleDataFailed": "查询角色数据失败", "roleNotExist": "该角色不存在", "roleInUse": "此角色有用户正在使用,禁止删除", "roleHasSubRoles": "此角色存在子角色,不允许删除", "invalidRoleId": "您提交的角色ID不合法", - "buttonInUse": "此按钮正在被使用无法删除", "menuHasSubMenu": "此菜单存在子菜单不可删除", "recordNotFound": "记录不存在", @@ -139,8 +143,25 @@ "stringLoadModelFailed": "字符串加载模型失败", "duplicateApi": "存在相同api,添加失败,请联系管理员", "apiNotInPermissionList": "存在api不在权限列表中", - "noAvailableInit": "无可用初始化过程,请检查初始化是否已执行完成" - }, + "noAvailableInit": "无可用初始化过程,请检查初始化是否已执行完成", + "createMenuAuthFail": "创建 [菜单-权限] 关联失败, 未找到权限表初始化数据", + "minioInitFail": "minio初始化失败", + "createMenuFail": "创建菜单失败!", + "userNickname": "系统用户", + "createUpdateFail": "创建/更新失败", + "createUpdateFailErr": "创建/更新失败:%s", + "queryDictDataFail": "查询字典数据失败", + "fileDeleteFailErr": "文件删除失败: %s", + "createUserAuthFail": "创建 [用户-权限] 关联失败, 未找到权限表初始化数据", + "createMCPClientFail": "创建MCP客户端失败:%s", + "queryPackageFail": "查询包失败!", + "createFolderFail": "[filepath:%s]创建文件夹失败!", + "writeFileFail": "写入文件失败", + "duplicateStructErr": "已经创建过此数据结构,请勿重复创建!", + "duplicateStructOrAbbrevErr": "已经创建过此数据结构或重复简称,请勿重复创建!", + "readTemplateFail": "读取模版文件失败!", + "generateFileFail": "生成文件失败!" + }, "sys_auto_code_history": { "rollbackSuccess": "回滚成功" }, @@ -328,7 +349,13 @@ "getParametersList": "获取参数列表", "categoryList": "分类列表", "addEditCategory": "添加/编辑分类", - "deleteCategory": "删除分类" + "deleteCategory": "删除分类", + "newSysDictionaryDetail": "新建SysDictionaryDetail", + "getSysDictionaryDetailList": "获取SysDictionaryDetail列表", + "updateSysDictionaryDetail": "更新SysDictionaryDetail", + "deleteSysDictionaryDetail": "删除SysDictionaryDetail", + "batchDeleteSysDictionaryDetail": "批量删除SysDictionaryDetail", + "getSysDictionaryDetailById": "根据ID获取SysDictionaryDetail" }, "group": { "announcement": "公告", @@ -380,6 +407,9 @@ "about": "关于我们", "adminTools": "超级管理员", "announcementManage": "公告管理[示例]", + "aiPageDraw": "AI页面绘制", + "mcpToolsTemplate": "Mcp Tools模板", + "mcpToolsTest": "Mcp Tools测试", "apiManage": "api管理", "autoCode": "代码生成器", "autoCodeEdit": "自动化代码(复用)", @@ -486,6 +516,8 @@ "getHuaweiObjectFailedDuplicate": "获取华为对象存储对象失败!", "deleteObjectFailed": "删除对象(%s)失败!, output: %v", + + "fileOpenParseFailed": "[filepath:%s]打开/解析文件失败!", "fileOpenFailed": "[filepath:%s]打开文件失败!", "injectionFailed": "[filepath:%s]注入失败!", @@ -542,10 +574,314 @@ "formatValidationFailed": "格式校验不通过", "lengthOrValueOutOfRange": "长度或值不在合法范围", "sysNoSupport": "系统不支持", - "fileNameInvalid": "文件名不合法" + "fileNameInvalid": "文件名不合法", + "jwt": { + "unknownError": "未知错误", + "tokenExpired": "token已过期", + "tokenNotActivated": "token尚未激活", + "notAToken": "这不是一个token", + "invalidSignature": "无效签名", + "cannotProcessToken": "无法处理此token" + }, + "upload": { + "readFileFailed": "读取文件失败", + "uploadToMinioFailed": "上传文件到minio失败" + } }, "router": { + }, + "database": { + "parentMenuInitFailed": "父级菜单初始化失败!", + "childMenuInitFailed": "子菜单初始化失败!", + "userAuthorityAssocFailed": "创建 [用户-权限] 关联失败, 未找到权限表初始化数据", + "menuAuthorityAssocFailed": "创建 [菜单-权限] 关联失败, 未找到权限表初始化数据", + "menuAuthorityAssocFailedNoMenu": "创建 [菜单-权限] 关联失败, 未找到菜单表初始化数据", + "superAdminMenuAssignFailed": "为超级管理员分配菜单失败", + "normalUserMenuAssignFailed": "为普通用户分配菜单失败", + "testRoleMenuAssignFailed": "为测试角色分配菜单失败", + "casbinInitFailed": "Casbin 表 (%s) 数据初始化失败!", + "tableInitFailed": "%s表数据初始化失败!", + "dictionaryTableNotFound": "未找到 %s 表初始化数据", + "initDataSuccess": "初始数据成功!", + "initDataExists": "的初始数据已存在!", + "initDataFailed": "初始数据失败!" + }, + "menu": { + "buildMenuIdMapping": "构建菜单ID映射,方便快速查找", + "assignDifferentPermissions": "为不同角色分配不同权限", + "superAdminRole": "超级管理员角色(888) - 拥有所有菜单权限", + "normalUserRole": "普通用户角色(8881) - 仅拥有基础功能菜单", + "selectParentMenus": "仅选择部分父级菜单及其子菜单", + "addDashboardMenus": "添加仪表盘、关于我们和个人信息菜单", + "testRole": "测试角色(9528) - 拥有部分菜单权限", + "addAllParentMenus": "添加所有父级菜单", + "addPartialChildMenus": "添加部分子菜单 - 系统工具、示例文件等模块的子菜单" + }, + "user": { + "userRegistration": "用户注册", + "userLogin": "用户登录", + "changeUserPassword": "修改用户密码", + "getPaginatedData": "分页获取数据", + "setUserPermission": "设置一个用户的权限", + "setUserPermissions": "设置一个用户的权限", + "deleteUser": "删除用户", + "setUserInfo": "设置用户信息", + "setUserConfig": "设置用户配置", + "getUserInfo": "获取用户信息", + "getUserInfoById": "通过id获取用户信息", + "getUserInfoByUuid": "通过uuid获取用户信息", + "resetUserPassword": "修改用户密码", + "adminRegister": "管理员注册账号", + "changePassword": "用户修改密码", + "setUserAuthority": "设置用户权限", + "setSelfInfo": "设置自身信息", + "setUserAuthorities": "设置用户权限组", + "resetPassword": "设置用户权限组", + "setSelfSetting": "用户界面配置", + "getUserList": "分页获取用户列表" + }, + "upload": { + "uploadFile": "上传文件", + "deleteFile": "删除文件", + "createFileDefer": "创建文件 defer 关闭", + "fileNameFormat": "文件名格式 自己可以改 建议保证唯一性", + "qiniuConfig": "根据配置文件进行返回七牛云的配置", + "qiniuZoneInit": "根据配置文件进行初始化空间对应的机房", + "readLocalFile": "读取本地文件", + "aliyunUploadPath": "上传阿里云路径 文件名格式 自己可以改 建议保证唯一性", + "uploadFileStream": "上传文件流", + "deleteObjectName": "删除单个文件。objectName表示删除OSS文件时需要指定包含文件后缀在内的完整路径,例如abc/efg/123.jpg", + "deleteFolderNote": "如需删除文件夹,请将objectName设置为对应的文件夹名称。如果文件夹非空,则需要将文件夹下的所有object删除后才能删除该文件夹", + "createOSSClient": "创建OSSClient实例", + "getBucket": "获取存储空间", + "readFileSuffix": "读取文件后缀", + "readFileNameEncrypt": "读取文件名并加密", + "combineNewFileName": "拼接新文件名", + "tryCreatePath": "尝试创建此路径", + "combinePathFileName": "拼接路径和文件名", + "readFile": "读取文件", + "transferFile": "传输(拷贝)文件", + "keyCannotBeEmpty": "key不能为空", + "illegalKey": "非法的key", + "fileNotExist": "文件不存在", + "fileDeletionFailed": "文件删除失败", + "tryCreateBucket": "尝试创建bucket", + "readFileFailed": "读取文件失败", + "encryptFileName": "对文件名进行加密存储", + "setTimeout10Min": "设置超时10分钟", + "uploadLargeFileNote": "Upload the file with PutObject 大文件自动切换为分片上传", + "uploadToMinioFailed": "上传文件到minio失败", + "minioInitFailed": "minio初始化失败", + "checkMinioConfig": "你配置了使用minio,但是初始化失败,请检查minio可用性或安全配置", + "minioInitFailedSuggestion": "建议这样做,用户自己配置了minio,如果报错了还要把服务开起来,使用起来也很危险", + "uploadFail": "上传失败", + "uploadSuccess": "上传成功", + "fileNotExists": "文件不存在" + }, + "operation": { + "createRecord": "创建记录", + "batchDeleteRecords": "批量删除记录", + "deleteOperationRecord": "删除操作记录", + "getOperationRecordById": "根据id获取单条操作记录", + "getPaginatedOperationRecords": "分页获取操作记录列表", + "createDb": "创建db", + "conditionalSearch": "如果有条件搜索 下方会自动创建搜索语句" + }, + "params": { + "createSysParams": "创建参数记录" + }, + "breakpoint": { + "frontendFileChunk": "前端传来文件片与当前片为什么文件的第几片", + "backendCompareChunk": "后端拿到以后比较次分片是否上传 或者是否为不完全片", + "frontendChunkSize": "前端发送每片多大", + "frontendLastChunk": "前端告知是否为最后一片且是否完成", + "breakpointResume": "断点续传", + "checkMd5": "检查Md5", + "canContinueUpload": "可以继续上传", + "chunkIncomplete": "切片不完整,废弃", + "createChunkContent": "创建切片内容", + "fileNamePathIllegal": "文件名或路径不合法", + "createChunkFile": "创建切片文件", + "removeChunk": "移除切片", +"breakpoint": { + "continueFail": "断点续传失败", + "continueSuccess": "断点续传成功", + "invalidFileNameOrPath": "文件名或路径不合法" + }, + "dictionary": { + "duplicateTypeNotAllowed": "存在相同的type,不允许创建", + "doNotCauseTrouble": "请不要搞事", + "queryDictDataFailed": "查询字典数据失败" + }, + "category": { + "nameAlreadyExists": "分类名称已存在", + "deleteChildrenFirst": "请先删除子级" + }, + "validator": { + "registerCustomRules": "注册自定义规则方案建议在路由初始化层即注册", + "notEmpty": "非空 不能为其对应类型的0值", + "regexValidation": "正则校验 校验输入项是否满足正则表达式", + "lessThan": "小于入参(<) 如果为string array Slice则为长度比较 如果是 int uint float 则为数值比较", + "lessThanEqual": "小于等于入参(<=) 如果为string array Slice则为长度比较 如果是 int uint float 则为数值比较", + "equal": "等于入参(==) 如果为string array Slice则为长度比较 如果是 int uint float 则为数值比较", + "notEqual": "不等于入参(!=) 如果为string array Slice则为长度比较 如果是 int uint float 则为数值比较", + "greaterThanEqual": "大于等于入参(>=) 如果为string array Slice则为长度比较 如果是 int uint float 则为数值比较", + "greaterThan": "大于入参(>) 如果为string array Slice则为长度比较 如果是 int uint float 则为数值比较", + "validationMethod": "校验方法", + "lengthNumberValidation": "长度和数字的校验方法 根据类型自动校验", + "notEmptyValidation": "非空校验", + "compareFunction": "比较函数" + }, + "jwt": { + "unknownError": "未知错误", + "tokenExpired": "token已过期", + "tokenNotActive": "token尚未激活", + "notAToken": "这不是一个token", + "invalidSignature": "无效签名", + "cannotProcessToken": "无法处理此token", + "bufferTime": "缓冲时间1天 缓冲时间内会获得新的token刷新令牌 此时一个用户会存在两个有效令牌 但是前端只留一个 另一个会丢失", + "audience": "受众", + "notBefore": "签名生效时间", + "expiresAt": "过期时间 7天 配置文件", + "issuer": "签名的发行者", + "createToken": "创建一个token", + "createTokenByOldToken": "旧token 换新token 使用归并回源避免并发问题", + "parseToken": "解析 token", + "jwtRedisExpire": "jwt存入redis并设置过期时间", + "expireTimeNote": "此处过期时间等于jwt过期时间" + }, + "hash": { + "bcryptHash": "使用 bcrypt 对密码进行加密", + "bcryptCheck": "对比明文密码和数据库的哈希值", + "md5Encrypt": "md5加密" + }, + "claims": { + "addCookieToken": "增加cookie x-token 向来源的web添加", + "getUserIdFromContext": "从Gin的Context中获取从jwt解析出来的用户ID", + "getUserUuidFromContext": "从Gin的Context中获取从jwt解析出来的用户UUID", + "getUserAuthorityIdFromContext": "从Gin的Context中获取从jwt解析出来的用户角色id", + "getUserInfoFromContext": "从Gin的Context中获取从jwt解析出来的用户角色id", + "getUserNameFromContext": "从Gin的Context中获取从jwt解析出来的用户名" + }, + "directory": { + "fileDirectoryExists": "文件目录是否存在", + "sameNameFileExists": "存在同名文件", + "batchCreateFolders": "批量创建文件夹", + "fileMoveExternal": "文件移动供外部调用", + "srcDstParam": "src: 源位置,绝对路径or相对路径, dst: 目标位置,绝对路径or相对路径,必须为文件夹", + "removeStructSpaces": "去除结构体空格", + "targetParam": "target: 目标结构体,传入必须是指针类型", + "fileExist": "判断文件是否存在", + "createFail": "创建目录失败", + "createSuccess": "创建目录成功", + "fileExists": "存在同名文件" + }, + "format": { + "reflectStructToMap": "利用反射将结构体转化为map", + "formatArrayToString": "将数组格式化为字符串", + "makeHump": "将字符串转换为驼峰命名", + "humpToUnderscore": "将驼峰命名转换为下划线分割模式", + "addUnderscoreBeforeUppercase": "在大写字母前添加下划线", + "convertToLowercase": "转小写", + "randomString": "随机字符串", + "buildTree": "用于构建一个树形结构", + "createBasicMap": "创建一个基本map" + }, + "json": { + "useJsonDecoder": "使用json.Decoder,以便在解析过程中记录键的顺序", + "ensureDataIsObject": "确保数据是一个对象", + "parseValue": "解析值" + }, + "casbin": { + "getCasbinInstance": "获取casbin实例", + "checkCasbinTableEngine": "适配数据库失败请检查casbin表是否为InnoDB引擎!", + "stringLoadModelFailed": "字符串加载模型失败!" + }, + "zip": { + "decompress": "解压" + }, + "request": { + "createUrl": "创建URL", + "addQueryParams": "添加查询参数", + "encodeDataToJson": "将数据编码为JSON", + "createRequest": "创建请求", + "sendRequest": "发送请求", + "returnResponse": "返回响应,让调用者处理" + }, + "timer": { + "findAllCron": "寻找所有Cron", + "addTaskMethodSecond": "添加Task 方法形式以秒的形式加入", + "addTaskFuncSecond": "添加Task Func以秒的形式加入", + "addTaskInterfaceSecond": "添加Task 接口形式以秒的形式加入", + "addTaskByFunc": "通过函数的方法添加任务", + "addTaskByInterface": "通过接口的方法添加任务 要实现一个带有 Run方法的接口触发", + "getCorrespondingCron": "获取对应taskName的cron 可能会为空", + "specifiedCronStart": "指定cron开始执行", + "specifiedCronStop": "指定cron停止执行", + "findSpecifiedTask": "查找指定cron下的指定task", + "deleteTaskById": "根据id删除指定cron下的指定task", + "deleteTaskByName": "根据taskName删除指定cron下的指定task", + "clearSpecifiedCron": "清理掉指定cronName", + "stopAllCron": "停止所有的cron", + "timerTaskManagement": "timer 定时任务管理", + "addTaskByFuncMethod": "通过函数的方法添加任务", + "addTaskByFuncWithSecond": "通过函数的方法使用WithSeconds添加任务", + "addTaskByJobMethod": "通过接口的方法添加任务", + "addTaskByJobWithSeconds": "通过接口的方法添加任务", + "findCron": "获取对应cronName的cron 可能会为空", + "findTask": "获取对应cronName的cron 可能会为空", + "findCronList": "获取所有的任务列表", + "startCron": "开始任务", + "stopCron": "停止任务", + "removeTask": "从cronName 删除指定任务", + "removeTaskByName": "从cronName 使用taskName 删除指定任务", + "clear": "清除任务", + "close": "释放资源", + "testMockFunc": "测试mockfunc", + "testJobMockFunc": "测试job mockfunc" + }, + "autocode": { + "getTemplateFuncMap": "返回模板函数映射,用于在模板中使用", + "renderModelFields": "渲染Model中的字段", + "buildGormTags": "构建gorm标签", + "buildFieldDefinitionByType": "根据字段类型构建不同的字段定义", + "addFieldDescription": "添加字段描述", + "formatSearchCondition": "格式化搜索条件语句", + "complexTypeBusinessLogic": "数据类型为复杂类型,请根据业务需求自行实现复杂类型的查询业务", + "formatFrontendSearchCondition": "格式化前端搜索条件", + "startBuildFormItem": "开始构建表单项", + "generateInputTypeByField": "根据字段属性生成不同的输入类型", + "pleaseSelect": "请选择", + "yes": "是", + "no": "否", + "pleaseSelectField": "请选择%s", + "minValue": "最小值", + "maxValue": "最大值", + "searchCondition": "搜索条件", + "searchRangeNote": "搜索范围是开始日期(包含)至结束日期(不包含)", + "to": "至", + "startTime": "开始时间", + "endTime": "结束时间", + "closeFormItem": "关闭表单项", + "richTextContent": "富文本内容", + "startBuildFormItemForEdit": "开始构建表单项", + "handleDifferentFieldTypes": "处理不同字段类型", + "pleaseEnter": "请输入%s", + "jsonStructureNote": "此字段为json结构,可以前端自行控制展示和数据绑定模式 需绑定json的key为 formData.%s 后端会按照json的类型进行存取", + "selectDate": "选择日期", + "closeFormItemForEdit": "关闭表单项", + "startBuildDescriptionItem": "开始构建描述项", + "closeDescriptionItem": "关闭描述项", + "determineDefaultValueByFieldType": "根据字段类型确定默认值", + "checkDataSourceExists": "检查数据源是否存在", + "returnFormattedDefaultValue": "返回格式化后的默认值字符串", + "generateSearchFieldByAttribute": "根据字段属性生成搜索结构体中的字段定义", + "noSearchTypeReturnEmpty": "如果没有搜索类型,返回空字符串", + "generateRangeSearchField": "生成范围搜索字段", + "timeCase": "time 的情况", + "generateNormalSearchField": "生成普通搜索字段" + } } } diff --git a/server/resource/package/web/view/table.vue.tpl b/server/resource/package/web/view/table.vue.tpl index e1ad9c133..233f68cfc 100644 --- a/server/resource/package/web/view/table.vue.tpl +++ b/server/resource/package/web/view/table.vue.tpl @@ -63,7 +63,7 @@ const {{ $element }}Options = ref([]) {{- if eq .FieldType "string" }} { whitespace: true, - message: '不能只输入空格', + message: t('general.noOnlySpace'), trigger: ['input', 'blur'], } {{- end }} @@ -140,8 +140,8 @@ getDataSourceFunc() {{- end }}
- 新增 - 删除 + {{"{{"}}t('general.add'){{"}}"}} + {{"{{"}}t('general.delete'){{"}}"}} {{ if .HasExcel -}} @@ -161,7 +161,7 @@ getDataSourceFunc() > {{ if .GvaModel }} - + {{ end }} @@ -170,14 +170,14 @@ getDataSourceFunc() {{ GenerateTableColumn . }} {{- end }} {{- end }} - + @@ -198,15 +198,15 @@ getDataSourceFunc()
{{"{{"}}type==='create'?'新增':'编辑'{{"}}"}}
- 确 定 - 取 消 + {{"{{"}}t('general.confirm'){{"}}"}} + {{"{{"}}t('general.cancel'){{"}}"}}
{{- if .IsTree }} - + {{- end }} @@ -227,10 +227,10 @@ getDataSourceFunc() - + {{- if .IsTree }} - + {{- end }} @@ -296,6 +296,8 @@ import ArrayCtrl from '@/components/arrayCtrl/arrayCtrl.vue' import { getDictFunc, formatDate, formatBoolean, filterDict ,filterDataSource, returnArrImg, onDownloadFile } from '@/utils/format' import { ElMessage, ElMessageBox } from 'element-plus' import { ref, reactive } from 'vue' +import { useI18n } from 'vue-i18n' +const { t } = useI18n() {{- if .AutoCreateBtnAuth }} // 引入按钮权限标识 import { useBtnAuth } from '@/utils/btnAuth' @@ -314,6 +316,7 @@ import { useI18n } from 'vue-i18n' const { t } = useI18n() + defineOptions({ name: '{{.StructName}}' }) @@ -471,7 +474,7 @@ const defaultProps = { const rootNode = { {{ .PrimaryField.FieldJson }}: 0, - {{ .TreeJson }}: '根节点', + {{ .TreeJson }}: t('general.rootNode'), children: [] } @@ -508,9 +511,9 @@ const handleSelectionChange = (val) => { // 删除行 const deleteRow = (row) => { - ElMessageBox.confirm('确定要删除吗?', '提示', { - confirmButtonText: '确定', - cancelButtonText: '取消', + ElMessageBox.confirm(t('general.deleteConfirm'), t('general.hint'), { + confirmButtonText: t('general.confirm'), + cancelButtonText: t('general.cancel'), type: 'warning' }).then(() => { delete{{.StructName}}Func(row) diff --git a/server/resource/plugin/web/view/view.vue.tpl b/server/resource/plugin/web/view/view.vue.tpl index 98b557a55..a1e23adb7 100644 --- a/server/resource/plugin/web/view/view.vue.tpl +++ b/server/resource/plugin/web/view/view.vue.tpl @@ -97,11 +97,11 @@ getDataSourceFunc() {{- end }}
- 新增 - 删除 + {{ t('general.add') }} + {{ t('general.delete') }} {{ if .HasExcel -}} @@ -158,7 +158,7 @@ getDataSourceFunc() > {{ if .GvaModel }} - + {{ end }} @@ -167,14 +167,14 @@ getDataSourceFunc() {{ GenerateTableColumn . }} {{- end }} {{- end }} - + @@ -193,17 +193,17 @@ getDataSourceFunc() {{- if .IsTree }} - + {{- end }} @@ -224,10 +224,10 @@ getDataSourceFunc() - + {{- if .IsTree }} - + {{- end }} @@ -253,6 +253,7 @@ getDataSourceFunc() diff --git a/web/src/components/richtext/rich-edit.vue b/web/src/components/richtext/rich-edit.vue index cf248fb9e..ddb9210e6 100644 --- a/web/src/components/richtext/rich-edit.vue +++ b/web/src/components/richtext/rich-edit.vue @@ -28,6 +28,9 @@ import { ElMessage } from 'element-plus' import { getUrl } from '@/utils/image' import { useUserStore } from '@/pinia/modules/user' + import { useI18n } from 'vue-i18n' + + const { t } = useI18n() const emits = defineEmits(['change', 'update:modelValue']) @@ -49,7 +52,7 @@ const toolbarConfig = {} const editorConfig = { - placeholder: '请输入内容...', + placeholder: t('components.richtext.placeholder'), MENU_CONF: {} } editorConfig.MENU_CONF['uploadImage'] = { diff --git a/web/src/components/upload/QR-code.vue b/web/src/components/upload/QR-code.vue index 2a166c287..7467026e6 100644 --- a/web/src/components/upload/QR-code.vue +++ b/web/src/components/upload/QR-code.vue @@ -1,9 +1,9 @@