From b01a7d9c629de55d355b81779a10d21f5e06e5bd Mon Sep 17 00:00:00 2001 From: lijiahui <2869545321@qq.com> Date: Mon, 30 Mar 2026 15:28:28 +0800 Subject: [PATCH] =?UTF-8?q?feat(i18n):=20=E5=AE=9E=E7=8E=B0=E8=8F=9C?= =?UTF-8?q?=E5=8D=95=E7=9A=84=E5=8A=A8=E6=80=81=E5=9B=BD=E9=99=85=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/system/menu/index.ts | 1 + src/locales/en.ts | 9 +++++---- src/store/modules/user.ts | 21 +++++++++++++++++++++ src/utils/routerHelper.ts | 2 +- src/views/system/menu/MenuForm.vue | 7 ++++++- src/views/system/menu/index.vue | 16 ++++++++++++++++ types/router.d.ts | 1 + 7 files changed, 51 insertions(+), 6 deletions(-) diff --git a/src/api/system/menu/index.ts b/src/api/system/menu/index.ts index 5a806682d..9d45302b4 100644 --- a/src/api/system/menu/index.ts +++ b/src/api/system/menu/index.ts @@ -3,6 +3,7 @@ import request from '@/config/axios' export interface MenuVO { id: number name: string + nameEn?: string permission: string type: number sort: number diff --git a/src/locales/en.ts b/src/locales/en.ts index bd4c0b42c..62ed3aa4d 100644 --- a/src/locales/en.ts +++ b/src/locales/en.ts @@ -141,9 +141,9 @@ export default { qrcode: 'Scan the QR code to log in', btnRegister: 'Sign up', SmsSendMsg: 'code has been sent', - resetPassword: "Reset Password", - resetPasswordSuccess: "Reset Password Success", - invalidTenantName:"Invalid Tenant Name" + resetPassword: 'Reset Password', + resetPasswordSuccess: 'Reset Password Success', + invalidTenantName: 'Invalid Tenant Name' }, captcha: { verify: 'Verify', @@ -156,6 +156,7 @@ export default { }, router: { login: 'Login', + socialLogin: 'Social Login', home: 'Home', analysis: 'Analysis', workplace: 'Workplace' @@ -459,4 +460,4 @@ export default { btn_zoom_out: 'Zoom out', preview: 'Preivew' } -} \ No newline at end of file +} diff --git a/src/store/modules/user.ts b/src/store/modules/user.ts index aea2eda36..f27baadd8 100644 --- a/src/store/modules/user.ts +++ b/src/store/modules/user.ts @@ -3,6 +3,10 @@ import { defineStore } from 'pinia' import { getAccessToken, removeToken } from '@/utils/auth' import { CACHE_KEY, useCache, deleteUserCache } from '@/hooks/web/useCache' import { getInfo, loginOut } from '@/api/login' +import { eachTree } from '@/utils/tree' +import { i18n } from '@/plugins/vueI18n' +import { isNull } from '@/utils/is' +import { LocaleMessages } from 'vue-i18n' const { wsCache } = useCache() @@ -68,6 +72,23 @@ export const useUserStore = defineStore('admin-user', { this.isSetUser = true wsCache.set(CACHE_KEY.USER, userInfo) wsCache.set(CACHE_KEY.ROLE_ROUTERS, userInfo.menus) + + // 设置动态翻译 + // 兼容切换语言不刷新页面的情况,所有语言都需要设置 + type LocaleMessageMap = LocaleMessages> + const routerLocaleMessage = + i18n.global.getLocaleMessage('zh-CN')?.router ?? reactive({}) + const routerLocaleMessageEn = + i18n.global.getLocaleMessage('en')?.router ?? reactive({}) + eachTree(userInfo.menus, (menuItem) => { + const key = menuItem.id // 不能用name,OAuth 2.0这种带特殊字符的name会难以识别 + const zh = menuItem.name + const en = isNull(menuItem.nameEn) ? zh : menuItem.nameEn + routerLocaleMessage[key] = zh + routerLocaleMessageEn[key] = en + }) + i18n.global.setLocaleMessage('zh-CN', { router: routerLocaleMessage }) + i18n.global.setLocaleMessage('en', { router: routerLocaleMessageEn }) }, async setUserAvatarAction(avatar: string) { const userInfo = wsCache.get(CACHE_KEY.USER) diff --git a/src/utils/routerHelper.ts b/src/utils/routerHelper.ts index cf1b36222..91da47016 100644 --- a/src/utils/routerHelper.ts +++ b/src/utils/routerHelper.ts @@ -67,7 +67,7 @@ export const generateRoute = (routes: AppCustomRouteRecordRaw[]): AppRouteRecord for (const route of routes) { // 1. 生成 meta 菜单元数据 const meta = { - title: route.name, + title: 'router.' + route.id, icon: route.icon, hidden: !route.visible, noCache: !route.keepAlive, diff --git a/src/views/system/menu/MenuForm.vue b/src/views/system/menu/MenuForm.vue index ddc3d3e13..8eed75812 100644 --- a/src/views/system/menu/MenuForm.vue +++ b/src/views/system/menu/MenuForm.vue @@ -20,6 +20,9 @@ + + + ([]) // 树形结构 const getTree = async () => { menuTree.value = [] const res = await MenuApi.getSimpleMenusList() - let menu: Tree = { id: 0, name: '主类目', children: [] } + let menu: Tree = { id: 0, name: '主类目', nameEn: 'Root', children: [] } menu.children = handleTree(res) menuTree.value.push(menu) } @@ -234,6 +238,7 @@ const resetForm = () => { formData.value = { id: undefined, name: '', + nameEn: '', permission: '', type: SystemMenuTypeEnum.DIR, sort: Number(undefined), diff --git a/src/views/system/menu/index.vue b/src/views/system/menu/index.vue index af3e0ad6a..00473f941 100644 --- a/src/views/system/menu/index.vue +++ b/src/views/system/menu/index.vue @@ -20,6 +20,15 @@ @keyup.enter="handleQuery" /> + + + ([]) // 列表的数据 const queryParams = reactive({ name: undefined, + nameEn: undefined, status: undefined }) const queryFormRef = ref() // 搜索的表单 diff --git a/types/router.d.ts b/types/router.d.ts index 03e91f144..57c3179c9 100644 --- a/types/router.d.ts +++ b/types/router.d.ts @@ -68,6 +68,7 @@ declare global { } interface AppCustomRouteRecordRaw extends Omit { + id: number icon: any name: string meta: RouteMeta