Appearance
国际化
结构
text
src/locales/
├─ index.ts # createI18n + setLocale + elementLocales 映射
└─ lang/
├─ zh-CN.ts
└─ en-US.ts使用 Composition API 模式(legacy: false),因此必须用 useI18n(),不能再用全局 $t(模板里除外)。
vue
<script setup lang="ts">
import { useI18n } from 'vue-i18n'
const { t } = useI18n()
</script>
<template>
<span>{{ t('common.add') }}</span>
</template>在非组件代码(如 store、utils)里用导出的 t:
ts
import { t } from '@/locales'
ElMessage.success(t('login.success'))与 Element Plus 联动
切换语言时同时替换 Element Plus 的语言包,否则表格、分页、日期选择器仍是英文:
ts
elementLocales = { 'zh-CN': zhCn, 'en-US': en }
// setLocale() 内部:i18n.global.locale.value = locale; 并更新 ElConfigProvider 的 locale运行时切换
ts
import { setLocale, getNextLocale } from '@/locales'
setLocale(getNextLocale()) // 中 → 英 → 中当前语言写入 localStorage,刷新保持;同时通过 Accept-Language 请求头告知后端。
菜单标题的多语言
菜单的 title 字段存的是 i18n key(如 menu.user),不是中文原文。utils/page.ts 的 resolveTitle 会先查 i18n,查不到再回退到最后一段路径。
ts
resolveTitle('menu.user') // → '用户管理'
resolveTitle('随便一个字符串') // → '随便一个字符串'加一门新语言
- 复制
src/locales/lang/zh-CN.ts为fr-FR.ts并翻译。 - 在
src/locales/index.ts里注册:语言包 + Element Plus 语言包。 - 完事,语言切换按钮会自动多出一项。
约定
- key 用点分命名 + 模块前缀:
user.namerole.dataScopemonitor.online。 - 英文文案的占位符统一用
{n}:t('login.resendIn', { n: countdown })。 - 不要在业务代码里写死中文,也不要把翻译散落在各个
.vue里。