From 55d334aa30f49460251a21d0ca6506146d76f93f Mon Sep 17 00:00:00 2001 From: unitwk Date: Tue, 28 Nov 2023 11:22:51 +0800 Subject: [PATCH] Feat: i18n code --- frontend/src/components/NewCardList/index.vue | 10 ++--- frontend/src/config/index.ts | 40 +++++++++---------- frontend/src/widgets/instance/Shortcut.vue | 6 +-- languages/zh_CN.json | 29 +++++++++++++- .../app/routers/private/settings_router.ts | 10 ++--- panel/src/app/service/passport_service.ts | 5 ++- 6 files changed, 65 insertions(+), 35 deletions(-) diff --git a/frontend/src/components/NewCardList/index.vue b/frontend/src/components/NewCardList/index.vue index 5d9a405d..5ef78069 100644 --- a/frontend/src/components/NewCardList/index.vue +++ b/frontend/src/components/NewCardList/index.vue @@ -104,19 +104,19 @@ const handleTabClick = (value: string) => {
- {{ t("权限:") }} + {{ t("TXT_CODE_8575f7c") }} - {{ t("管理员") }} + {{ t("TXT_CODE_cd978243") }} - {{ t("所有用户") }} + {{ t("TXT_CODE_b67197fc") }} - {{ t("所有人") }} + {{ t("TXT_CODE_b488372f") }}
- {{ t("描述:") }} + {{ t("TXT_CODE_d486a561") }} {{ card.description }}
diff --git a/frontend/src/config/index.ts b/frontend/src/config/index.ts index 4b605e68..d28506f1 100644 --- a/frontend/src/config/index.ts +++ b/frontend/src/config/index.ts @@ -101,9 +101,9 @@ export function getLayoutCardPool() { permission: ROLE.GUEST, meta: {}, type: "TitleCard", - title: t("未命名标题栏"), + title: t("TXT_CODE_8981d724"), width: 12, - description: t("此卡片可用于栏目分段,类似于编写文章中的标题一样,可以用于排版。"), + description: t("TXT_CODE_9466852b"), height: LayoutCardHeight.AUTO, category: NEW_CARD_TYPE.COMMON }, @@ -269,9 +269,9 @@ export function getLayoutCardPool() { permission: ROLE.USER, meta: {}, type: "InstanceShortcut", - title: t("实例快捷方式"), + title: t("TXT_CODE_ea0840c9"), width: 3, - description: t("显示实例状态,前提是这个用户有权限能进入这个实例"), + description: t("TXT_CODE_3fce7ccb"), height: LayoutCardHeight.SMALL, category: NEW_CARD_TYPE.INSTANCE, params: [ @@ -297,9 +297,9 @@ export function getLayoutCardPool() { permission: ROLE.USER, meta: {}, type: "InstanceFileManager", - title: t("实例文件管理"), + title: t("TXT_CODE_72cce10b"), width: 12, - description: t("用于管理指定应用实例的文件"), + description: t("TXT_CODE_f49b2787"), height: LayoutCardHeight.MEDIUM, category: NEW_CARD_TYPE.INSTANCE, params: [ @@ -325,9 +325,9 @@ export function getLayoutCardPool() { permission: ROLE.USER, meta: {}, type: "InstanceBaseInfo", - title: t("基本信息"), + title: t("TXT_CODE_eadb4f60"), width: 4, - description: t("用于展示指定实例的详细信息"), + description: t("TXT_CODE_97e5eccb"), height: LayoutCardHeight.SMALL, category: NEW_CARD_TYPE.INSTANCE, params: [ @@ -355,7 +355,7 @@ export function getLayoutCardPool() { title: t("TXT_CODE_a4037a98"), meta: {}, width: 6, - description: t("用于分析面板近段时间的趋势图"), + description: t("TXT_CODE_6f659da2"), height: LayoutCardHeight.SMALL, category: NEW_CARD_TYPE.DATA }, @@ -366,7 +366,7 @@ export function getLayoutCardPool() { title: t("TXT_CODE_d6d9c42c"), meta: {}, width: 6, - description: t("用于分析面板近段时间的趋势图"), + description: t("TXT_CODE_6f659da2"), height: LayoutCardHeight.SMALL, category: NEW_CARD_TYPE.DATA }, @@ -374,10 +374,10 @@ export function getLayoutCardPool() { id: getRandomId(), permission: ROLE.ADMIN, type: "NodeOverview", - title: t("所有节点"), + title: t("TXT_CODE_4bedec2a"), meta: {}, width: 12, - description: t("用于查看与面板连接的所有远程节点的状态"), + description: t("TXT_CODE_2a8dc13f"), height: LayoutCardHeight.BIG, category: NEW_CARD_TYPE.DATA }, @@ -385,7 +385,7 @@ export function getLayoutCardPool() { id: getRandomId(), permission: ROLE.ADMIN, type: "DataOverview", - title: t("数据总览"), + title: t("TXT_CODE_721157a3"), meta: {}, width: 8, description: t("TXT_CODE_55ade942"), @@ -396,10 +396,10 @@ export function getLayoutCardPool() { id: getRandomId(), permission: ROLE.ADMIN, type: "QuickStart", - title: t("快速建立应用实例"), + title: t("TXT_CODE_e01539f1"), meta: {}, width: 4, - description: t("用于快速新建实例"), + description: t("TXT_CODE_d628e631"), height: LayoutCardHeight.MEDIUM, category: NEW_CARD_TYPE.INSTANCE }, @@ -408,9 +408,9 @@ export function getLayoutCardPool() { permission: ROLE.ADMIN, meta: {}, type: "NodeItem", - title: t("远程节点"), + title: t("TXT_CODE_def287e0"), width: 6, - description: t("用于展示远程节点的详细信息和状态"), + description: t("TXT_CODE_abe0862e"), height: LayoutCardHeight.MEDIUM, category: NEW_CARD_TYPE.INSTANCE, params: [ @@ -421,7 +421,7 @@ export function getLayoutCardPool() { }, { field: "instance", - label: t("请选择一个实例让我们获取节点信息"), + label: t("TXT_CODE_e7cad65f"), type: "instance" } ] @@ -431,9 +431,9 @@ export function getLayoutCardPool() { permission: ROLE.ADMIN, meta: {}, type: "InstanceManagerBtns", - title: t("实例功能组"), + title: t("TXT_CODE_d2bbb2f1"), width: 8, - description: t("应用实例的配置编辑,终端设置和其他功能的入口功能卡片"), + description: t("TXT_CODE_1934114b"), height: LayoutCardHeight.MEDIUM, category: NEW_CARD_TYPE.INSTANCE, params: [ diff --git a/frontend/src/widgets/instance/Shortcut.vue b/frontend/src/widgets/instance/Shortcut.vue index f174a6fc..9765bfaf 100644 --- a/frontend/src/widgets/instance/Shortcut.vue +++ b/frontend/src/widgets/instance/Shortcut.vue @@ -86,7 +86,7 @@ const instanceOperations = computed(() => icon: RedoOutlined, click: async () => { await executeRestart(operationConfig); - message.success(t("实例正在重启")); + message.success(t("TXT_CODE_b11166e7")); }, loading: restartLoading.value, disabled: containerState.isDesignMode, @@ -117,14 +117,14 @@ const instanceOperations = computed(() => time: new Date().getTime() } }); - message.success(t("实例正在更新")); + message.success(t("TXT_CODE_b1600db0")); }, loading: updateLoading.value, disabled: containerState.isDesignMode, condition: () => isStopped.value }, { - title: t("终端"), + title: t("TXT_CODE_524e3036"), icon: CodeOutlined, click: () => { toPage({ diff --git a/languages/zh_CN.json b/languages/zh_CN.json index ddef4834..f66e4710 100644 --- a/languages/zh_CN.json +++ b/languages/zh_CN.json @@ -1487,5 +1487,32 @@ "TXT_CODE_20cec54": "回车换行符", "TXT_CODE_b19bf004": "必填,请输入内容", "TXT_CODE_5a09ed37": "中文", - "TXT_CODE_e246e5b": "英语" + "TXT_CODE_e246e5b": "英语", + "TXT_CODE_8575f7c": "权限:", + "TXT_CODE_b67197fc": "所有用户", + "TXT_CODE_b488372f": "所有人", + "TXT_CODE_d486a561": "描述:", + "TXT_CODE_8981d724": "未命名标题栏", + "TXT_CODE_9466852b": "此卡片可用于栏目分段,类似于编写文章中的标题一样,可以用于排版。", + "TXT_CODE_ea0840c9": "实例快捷方式", + "TXT_CODE_3fce7ccb": "显示实例状态,前提是这个用户有权限能进入这个实例", + "TXT_CODE_72cce10b": "实例文件管理", + "TXT_CODE_f49b2787": "用于管理指定应用实例的文件", + "TXT_CODE_97e5eccb": "用于展示指定实例的详细信息", + "TXT_CODE_6f659da2": "用于分析面板近段时间的趋势图", + "TXT_CODE_4bedec2a": "所有节点", + "TXT_CODE_2a8dc13f": "用于查看与面板连接的所有远程节点的状态", + "TXT_CODE_e01539f1": "快速建立应用实例", + "TXT_CODE_d628e631": "用于快速新建实例", + "TXT_CODE_def287e0": "远程节点", + "TXT_CODE_abe0862e": "用于展示远程节点的详细信息和状态", + "TXT_CODE_e7cad65f": "请选择一个实例让我们获取节点信息", + "TXT_CODE_d2bbb2f1": "实例功能组", + "TXT_CODE_1934114b": "应用实例的配置编辑,终端设置和其他功能的入口功能卡片", + "TXT_CODE_b11166e7": "实例正在重启", + "TXT_CODE_b1600db0": "实例正在更新", + "TXT_CODE_1a499109": "文件不存在", + "TXT_CODE_e4d6cc20": "请求体错误", + "TXT_CODE_d37f0418": "面板已经安装!", + "TXT_CODE_42036f92": "------ 用户登录事件 ------" } diff --git a/panel/src/app/routers/private/settings_router.ts b/panel/src/app/routers/private/settings_router.ts index 39e3d8f8..5b401770 100755 --- a/panel/src/app/routers/private/settings_router.ts +++ b/panel/src/app/routers/private/settings_router.ts @@ -4,7 +4,7 @@ import permission from "../../middleware/permission"; import validator from "../../middleware/validator"; import { saveSystemConfig, systemConfig } from "../../setting"; import { logger } from "../../service/log"; -import { i18next } from "../../i18n"; +import { i18next, $t } from "../../i18n"; import userSystem from "../../service/system_user"; import { v4 } from "uuid"; import path from "path"; @@ -53,7 +53,7 @@ router.put("/setting", validator({ body: {} }), permission({ level: ROLE.ADMIN } ctx.body = "OK"; return; } - ctx.body = new Error("The body is incorrect"); + ctx.body = new Error($t("TXT_CODE_e4d6cc20")); }); // [Public Permission] @@ -71,7 +71,7 @@ router.put("/install", async (ctx) => { ctx.body = "OK"; return; } - ctx.body = new Error("The MCSManager has been installed"); + ctx.body = new Error($t("TXT_CODE_d37f0418")); }); // [Public router] @@ -98,8 +98,8 @@ router.delete("/layout", permission({ level: ROLE.ADMIN }), async (ctx) => { // Upload file to asserts directory, only administrator can upload router.post("/upload_assets", permission({ level: ROLE.ADMIN }), async (ctx) => { const tmpFiles = ctx.request.files.file; - if (!tmpFiles || tmpFiles instanceof Array) throw new Error("The body is incorrect"); - if (!tmpFiles.path || !fs.existsSync(tmpFiles.path)) throw new Error("The file does not exist"); + if (!tmpFiles || tmpFiles instanceof Array) throw new Error($t("TXT_CODE_e4d6cc20")); + if (!tmpFiles.path || !fs.existsSync(tmpFiles.path)) throw new Error($t("TXT_CODE_1a499109")); const tmpFile = tmpFiles; const newFileName = v4() + path.extname(tmpFile.name); const saveDirPath = path.join(process.cwd(), "public/upload_files/"); diff --git a/panel/src/app/service/passport_service.ts b/panel/src/app/service/passport_service.ts index 1cfa4db0..674aac84 100755 --- a/panel/src/app/service/passport_service.ts +++ b/panel/src/app/service/passport_service.ts @@ -5,6 +5,7 @@ import { GlobalVariable } from "common"; import { systemConfig } from "../setting"; import { logger } from "./log"; import { User } from "../entity/user"; +import { $t } from "../i18n"; export const BAN_IP_COUNT = "banip"; export const LOGIN_FAILED_KEY = "loginFailed"; @@ -29,8 +30,10 @@ export function login(ctx: Koa.ParameterizedContext, userName: string, passWord: ctx.session["uuid"] = user.uuid; ctx.session["token"] = timeUuid(); ctx.session.save(); + logger.info($t("TXT_CODE_42036f92")); logger.info(`[LOGIN] IP: ${ip} Login ${userName} successful!`); logger.info(`[LOGIN] Token: ${ctx.session["token"]}`); + logger.info($t("TXT_CODE_42036f92")); return ctx.session["token"]; } else { // record the number of login failures @@ -38,7 +41,7 @@ export function login(ctx: Koa.ParameterizedContext, userName: string, passWord: ctx.session["login"] = null; ctx.session["token"] = null; ctx.session.save(); - logger.info(`[LOGIN] IP: ${ip} login ${userName} failed!`); + logger.info(`[LOGIN] IP: ${ip}, Try login ${userName} failed!`); return null; } }