外观
页面、菜单与接口的国际化
目标:新增文案同时覆盖页面和导航,并让语言选择在刷新后继续生效。
两层翻译入口
演示使用 vue-i18n 渲染页面,core 运行时翻译布局、菜单和标签页。接线位于 apps/demo/src/i18n/index.ts:嵌套 JSON 交给 vue-i18n,同时拍平成键值对注册到 core。
| 文件 / API | 职责 |
|---|---|
apps/demo/src/locales/zh-CN.json | 中文业务文案 |
apps/demo/src/locales/en-US.json | 英文业务文案 |
useI18n() | Vue 页面翻译 |
core t() / registerLocaleMessages() | 布局运行时词条 |
setLocale() | 切换并保存语言 |
增加词条
分别在两份 JSON 中合入相同语义键,例如中文:
json
{ "reports": { "title": "报表", "refresh": "刷新" } }英文使用同结构,值分别为 Reports 和 Refresh。页面读取:
vue
<script setup lang="ts">
import { useI18n } from 'vue-i18n'
const { t } = useI18n()
</script>
<template>
<el-button>{{ t('reports.refresh') }}</el-button>
</template>业务记录名称可以来自 API;按钮、空状态、校验提示和无障碍标签应来自词条,不在模板中拼接两种语言共有的句子结构。
路由与菜单
演示路由常使用 meta.title: 'reports.title',布局运行时可将它解析为文案;协议菜单还支持明确的 titleKey,优先于已翻译的 title。只有页面显示正常而菜单显示键名时,检查词条是否同时注册到 core。
模块可通过 defineModule({ locales: ... }) 提供自己的词条,内核调用 registerPluginLocaleMessages 注册。插件词条与业务 vue-i18n 实例的消息接线应一起检查,不能假设任意自建实例自动收到模块消息。
切换语言
ts
import { i18n, setLocale, getCurrentLocale } from '@/i18n'
await setLocale('en-US')
i18n.global.locale.value = getCurrentLocale().valuecore 保存 uadmin_locale 并维护当前语言,HTTP 从同一来源生成 X-Locale。应用现有 LocaleSwitch 负责与页面实例接线;独立接入时可用 createUAdmin 的 i18n 选项统一安装,它会监听 core 当前语言并同步 vue-i18n。
不要同时安装两份 vue-i18n。选择复用演示实例或使用内核 i18n 配置,并保持一种初始化路径。
验证和排障
切到英文后检查菜单、页签、表单校验和空列表,再刷新页面。如果只有页面语言不变,检查 vue-i18n locale 是否与 core 同步;如果刷新恢复中文,检查存储键与读取初始化;如果后端返回不同语言,检查请求中的 X-Locale 及服务端解释规则。接口的 messageKey 与错误展示见HTTP。