Pre Merge pull request !869 from 李家辉/dev-i18n-menu

pull/869/MERGE
李家辉 2026-05-03 01:19:16 +00:00 committed by Gitee
commit d3902dc3dd
No known key found for this signature in database
GPG Key ID: 173E9B9CA92EEF8F
7 changed files with 51 additions and 6 deletions

View File

@ -3,6 +3,7 @@ import request from '@/config/axios'
export interface MenuVO {
id: number
name: string
nameEn?: string
permission: string
type: number
sort: number

View File

@ -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'
}
}
}

View File

@ -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<Record<string, any>>
const routerLocaleMessage =
i18n.global.getLocaleMessage<LocaleMessageMap>('zh-CN')?.router ?? reactive({})
const routerLocaleMessageEn =
i18n.global.getLocaleMessage<LocaleMessageMap>('en')?.router ?? reactive({})
eachTree(userInfo.menus, (menuItem) => {
const key = menuItem.id // 不能用nameOAuth 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)

View File

@ -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,

View File

@ -20,6 +20,9 @@
<el-form-item label="菜单名称" prop="name">
<el-input v-model="formData.name" clearable placeholder="请输入菜单名称" />
</el-form-item>
<el-form-item label="英文名称" prop="nameEn">
<el-input v-model="formData.nameEn" clearable placeholder="请输入英文名称" />
</el-form-item>
<el-form-item label="菜单类型" prop="type">
<el-radio-group v-model="formData.type">
<el-radio-button
@ -132,6 +135,7 @@ const formType = ref('') // 表单的类型create - 新增update - 修改
const formData = ref({
id: undefined,
name: '',
nameEn: '',
permission: '',
type: SystemMenuTypeEnum.DIR,
sort: Number(undefined),
@ -224,7 +228,7 @@ const menuTree = ref<Tree[]>([]) // 树形结构
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),

View File

@ -20,6 +20,15 @@
@keyup.enter="handleQuery"
/>
</el-form-item>
<el-form-item label="英文名称" prop="nameEn">
<el-input
v-model="queryParams.nameEn"
class="!w-240px"
clearable
placeholder="请输入英文名称"
@keyup.enter="handleQuery"
/>
</el-form-item>
<el-form-item label="状态" prop="status">
<el-select
v-model="queryParams.status"
@ -110,6 +119,12 @@ const columns = [
width: 250,
fixed: TableV2FixedDir.LEFT
},
{
key: 'nameEn',
title: '英文名称',
dataKey: 'nameEn',
width: 250
},
{
key: 'icon',
title: '图标',
@ -222,6 +237,7 @@ const loading = ref(true) // 列表的加载中
const list = ref<any[]>([]) //
const queryParams = reactive({
name: undefined,
nameEn: undefined,
status: undefined
})
const queryFormRef = ref() //

1
types/router.d.ts vendored
View File

@ -68,6 +68,7 @@ declare global {
}
interface AppCustomRouteRecordRaw extends Omit<RouteRecordRaw, 'meta'> {
id: number
icon: any
name: string
meta: RouteMeta