优化翻译

This commit is contained in:
2026-03-19 14:43:08 +08:00
parent f63616e735
commit db0e420a8f
6 changed files with 113 additions and 33 deletions

View File

@@ -1,6 +1,6 @@
{ {
"search": { "search": {
"deptName": "Dept Name", "deptName": "channel(Department) Name",
"deptCode": "Dept Code", "deptCode": "Dept Code",
"status": "Status", "status": "Status",
"placeholderDeptName": "Please enter dept name", "placeholderDeptName": "Please enter dept name",
@@ -8,11 +8,32 @@
"searchSelectPlaceholder": "Please select" "searchSelectPlaceholder": "Please select"
}, },
"table": { "table": {
"deptName": "Dept Name", "deptName": "channel(Department) Name",
"deptCode": "Dept Code", "deptCode": "Dept Code",
"leader": "Leader", "leader": "Leader",
"sort": "Sort", "sort": "Sort",
"status": "Status", "status": "Status",
"createTime": "Create Time" "createTime": "Create Time"
},
"form": {
"titleAdd": "Add Department",
"titleEdit": "Edit Department",
"labelParentDept": "Parent Department",
"labelDeptName": "Dept Name",
"labelDeptCode": "Dept Code",
"labelLeader": "Leader",
"labelRemark": "Description",
"labelSort": "Sort",
"labelStatus": "Enabled",
"placeholderDeptName": "Please enter dept name",
"placeholderDeptCode": "Please enter dept code",
"placeholderRemark": "Please enter description",
"placeholderSort": "Please enter sort",
"noParentDept": "No parent department",
"ruleParentDeptRequired": "Please select parent department",
"ruleDeptNameRequired": "Please enter dept name",
"ruleDeptCodeRequired": "Please enter dept code",
"addSuccess": "Added successfully",
"editSuccess": "Updated successfully"
} }
} }

View File

@@ -323,7 +323,7 @@
"role": "角色管理", "role": "角色管理",
"userCenter": "个人中心", "userCenter": "个人中心",
"menu": "菜单管理", "menu": "菜单管理",
"dept": "部门管理", "dept": "渠道(部门)管理",
"post": "岗位管理", "post": "岗位管理",
"config": "系统配置" "config": "系统配置"
}, },

View File

@@ -1,6 +1,6 @@
{ {
"search": { "search": {
"deptName": "部门名称", "deptName": "渠道(部门)名称",
"deptCode": "部门编码", "deptCode": "部门编码",
"status": "状态", "status": "状态",
"placeholderDeptName": "请输入部门名称", "placeholderDeptName": "请输入部门名称",
@@ -8,11 +8,32 @@
"searchSelectPlaceholder": "请选择" "searchSelectPlaceholder": "请选择"
}, },
"table": { "table": {
"deptName": "部门名称", "deptName": "渠道(部门)名称",
"deptCode": "部门编码", "deptCode": "部门编码",
"leader": "部门领导", "leader": "部门领导",
"sort": "排序", "sort": "排序",
"status": "状态", "status": "状态",
"createTime": "创建时间" "createTime": "创建时间"
},
"form": {
"titleAdd": "新增部门",
"titleEdit": "编辑部门",
"labelParentDept": "上级部门",
"labelDeptName": "部门名称",
"labelDeptCode": "部门编码",
"labelLeader": "部门领导",
"labelRemark": "描述",
"labelSort": "排序",
"labelStatus": "启用",
"placeholderDeptName": "请输入部门名称",
"placeholderDeptCode": "请输入部门编码",
"placeholderRemark": "请输入部门描述",
"placeholderSort": "请输入排序",
"noParentDept": "无上级部门",
"ruleParentDeptRequired": "请选择上级部门",
"ruleDeptNameRequired": "请输入部门名称",
"ruleDeptCodeRequired": "请输入部门编码",
"addSuccess": "新增成功",
"editSuccess": "修改成功"
} }
} }

View File

@@ -43,14 +43,33 @@ export async function loadPageLocale(routePath: string): Promise<void> {
return return
} }
const locale = getCurrentLocale() const locale = getCurrentLocale()
const key = getModuleKey(locale, path)
const modules = locale === LanguageEnum.EN ? enModules : zhModules const modules = locale === LanguageEnum.EN ? enModules : zhModules
const loader = modules[key]
const tryPaths: string[] = [path]
// 兼容别名路由:例如 /user 实际页面为 /system/user
if (!path.includes('/')) {
tryPaths.push(`system/${path}`)
}
if (path === 'user') {
tryPaths.push('system/user')
}
let matchedPath: string | null = null
let loader: (() => Promise<PageLocaleModule>) | undefined
for (const p of tryPaths) {
const key = getModuleKey(locale, p)
const l = modules[key]
if (l) {
matchedPath = p
loader = l
break
}
}
if (!loader) { if (!loader) {
clearPageLocale() clearPageLocale()
return return
} }
if (lastLoadedPath === path && lastLoadedLocale === locale) { if (lastLoadedPath === matchedPath && lastLoadedLocale === locale) {
return return
} }
try { try {
@@ -58,7 +77,7 @@ export async function loadPageLocale(routePath: string): Promise<void> {
const message = mod?.default const message = mod?.default
if (message && typeof message === 'object') { if (message && typeof message === 'object') {
i18n.global.mergeLocaleMessage(locale, { page: message }) i18n.global.mergeLocaleMessage(locale, { page: message })
lastLoadedPath = path lastLoadedPath = matchedPath
lastLoadedLocale = locale lastLoadedLocale = locale
} }
} catch { } catch {

View File

@@ -209,8 +209,23 @@ function handleLoginStatus(
userStore: ReturnType<typeof useUserStore>, userStore: ReturnType<typeof useUserStore>,
next: NavigationGuardNext next: NavigationGuardNext
): boolean { ): boolean {
// 已登录或访问登录页或静态路由,直接放行 // 已登录或访问登录页,直接放行
if (userStore.isLogin || to.path === RoutesAlias.Login || isStaticRoute(to.path)) { if (userStore.isLogin || to.path === RoutesAlias.Login) {
return true
}
// 未登录时访问根路径(首页),重定向到登录页
if (to.path === '/') {
userStore.logOut()
next({
name: 'Login',
query: { redirect: to.fullPath }
})
return false
}
// 其他静态路由(注册、忘记密码、错误页等)放行
if (isStaticRoute(to.path)) {
return true return true
} }

View File

@@ -1,14 +1,14 @@
<template> <template>
<el-dialog <el-dialog
v-model="visible" v-model="visible"
:title="dialogType === 'add' ? '新增部门' : '编辑部门'" :title="dialogType === 'add' ? $t('page.form.titleAdd') : $t('page.form.titleEdit')"
width="600px" width="600px"
align-center align-center
:close-on-click-modal="false" :close-on-click-modal="false"
@close="handleClose" @close="handleClose"
> >
<el-form ref="formRef" :model="formData" :rules="rules" label-width="120px"> <el-form ref="formRef" :model="formData" :rules="rules" label-width="120px">
<el-form-item label="上级部门" prop="parent_id"> <el-form-item :label="$t('page.form.labelParentDept')" prop="parent_id">
<el-tree-select <el-tree-select
v-model="formData.parent_id" v-model="formData.parent_id"
:data="optionData.treeData" :data="optionData.treeData"
@@ -17,33 +17,33 @@
clearable clearable
/> />
</el-form-item> </el-form-item>
<el-form-item label="部门名称" prop="name"> <el-form-item :label="$t('page.form.labelDeptName')" prop="name">
<el-input v-model="formData.name" placeholder="请输入部门名称" /> <el-input v-model="formData.name" :placeholder="$t('page.form.placeholderDeptName')" />
</el-form-item> </el-form-item>
<el-form-item label="部门编码" prop="code"> <el-form-item :label="$t('page.form.labelDeptCode')" prop="code">
<el-input v-model="formData.code" placeholder="请输入部门编码" /> <el-input v-model="formData.code" :placeholder="$t('page.form.placeholderDeptCode')" />
</el-form-item> </el-form-item>
<el-form-item label="部门领导"> <el-form-item :label="$t('page.form.labelLeader')">
<sa-user v-model="formData.leader_id" /> <sa-user v-model="formData.leader_id" />
</el-form-item> </el-form-item>
<el-form-item label="描述" prop="remark"> <el-form-item :label="$t('page.form.labelRemark')" prop="remark">
<el-input <el-input
v-model="formData.remark" v-model="formData.remark"
type="textarea" type="textarea"
:rows="3" :rows="3"
placeholder="请输入部门描述" :placeholder="$t('page.form.placeholderRemark')"
/> />
</el-form-item> </el-form-item>
<el-form-item label="排序" prop="sort"> <el-form-item :label="$t('page.form.labelSort')" prop="sort">
<el-input-number v-model="formData.sort" placeholder="请输入排序" /> <el-input-number v-model="formData.sort" :placeholder="$t('page.form.placeholderSort')" />
</el-form-item> </el-form-item>
<el-form-item label="启用" prop="status"> <el-form-item :label="$t('page.form.labelStatus')" prop="status">
<sa-radio v-model="formData.status" dict="data_status" /> <sa-radio v-model="formData.status" dict="data_status" />
</el-form-item> </el-form-item>
</el-form> </el-form>
<template #footer> <template #footer>
<el-button @click="handleClose">取消</el-button> <el-button @click="handleClose">{{ $t('common.cancel') }}</el-button>
<el-button type="primary" @click="handleSubmit">提交</el-button> <el-button type="primary" @click="handleSubmit">{{ $t('table.form.submit') }}</el-button>
</template> </template>
</el-dialog> </el-dialog>
</template> </template>
@@ -52,6 +52,7 @@
import api from '@/api/system/dept' import api from '@/api/system/dept'
import { ElMessage } from 'element-plus' import { ElMessage } from 'element-plus'
import type { FormInstance, FormRules } from 'element-plus' import type { FormInstance, FormRules } from 'element-plus'
import { useI18n } from 'vue-i18n'
interface Props { interface Props {
modelValue: boolean modelValue: boolean
@@ -71,6 +72,7 @@
}) })
const emit = defineEmits<Emits>() const emit = defineEmits<Emits>()
const { t } = useI18n()
const formRef = ref<FormInstance>() const formRef = ref<FormInstance>()
const optionData = reactive({ const optionData = reactive({
@@ -88,11 +90,13 @@
/** /**
* 表单验证规则 * 表单验证规则
*/ */
const rules = reactive<FormRules>({ const rules = computed<FormRules>(() => ({
parent_id: [{ required: true, message: '请选择上级部门', trigger: 'change' }], parent_id: [
name: [{ required: true, message: '请输入部门名称', trigger: 'blur' }], { required: true, message: t('page.form.ruleParentDeptRequired'), trigger: 'change' }
code: [{ required: true, message: '请输入部门编码', trigger: 'blur' }] ],
}) name: [{ required: true, message: t('page.form.ruleDeptNameRequired'), trigger: 'blur' }],
code: [{ required: true, message: t('page.form.ruleDeptCodeRequired'), trigger: 'blur' }]
}))
/** /**
* 初始数据 * 初始数据
@@ -138,7 +142,7 @@
{ {
id: 0, id: 0,
value: 0, value: 0,
label: '无上级部门', label: t('page.form.noParentDept'),
children: data children: data
} }
] ]
@@ -180,10 +184,10 @@
await formRef.value.validate() await formRef.value.validate()
if (props.dialogType === 'add') { if (props.dialogType === 'add') {
await api.save(formData) await api.save(formData)
ElMessage.success('新增成功') ElMessage.success(t('page.form.addSuccess'))
} else { } else {
await api.update(formData) await api.update(formData)
ElMessage.success('修改成功') ElMessage.success(t('page.form.editSuccess'))
} }
emit('success') emit('success')
handleClose() handleClose()