出处:掘金

原作者:金泽宸


国际化做得好,不止是“语言切换”,而是文本系统平台化管理 + 跨端一致性架构能力的体现

写在前面

当你的前端系统面向多地区、多国家时,“多语言”能力就是系统级刚需。 一个成熟的国际化系统应当具备:

  • 动态语言切换
  • 组件/页面文本的自动翻译提取
  • 后端联动语言返回内容
  • 支持中英/中日韩/语言变体
  • 配合业务平台可视化配置词条

本篇我们将系统性设计一个企业级国际化架构方案,覆盖 i18n 接入、词条提取、运行时动态切换、平台化能力支持等内容

国际化系统核心组成

模块说明
语言包各语言对应的 JSON 资源文件
词条函数映射词条 key 到具体文案
运行时语言切换动态设置语言,实时刷新组件
语言持久化使用 localStorage、cookie 等
插件接入vue-i18n / react-intl 等国际化插件

语言资源结构设计

locales/
├── zh-CN.json
├── en-US.json
└── ja-JP.json

每个文件内容:

{
  "common": {
    "confirm": "确认",
    "cancel": "取消"
  },
  "user": {
    "title": "用户列表",
    "name": "用户名",
    "email": "邮箱"
  }
}

Vue3 + vue-i18n 接入流程

npm install vue-i18n

创建 i18n 实例:

// i18n.ts
import { createI18n } from 'vue-i18n'
import zh from './locales/zh-CN.json'
import en from './locales/en-US.json'
 
export const i18n = createI18n({
  legacy: false,
  locale: localStorage.getItem('lang') || 'zh-CN',
  fallbackLocale: 'zh-CN',
  messages: { 'zh-CN': zh, 'en-US': en },
})

入口使用:

import { createApp } from 'vue'
import { i18n } from './i18n'
 
createApp(App).use(i18n).mount('#app')

组件中使用多语言

<template>
  <h3>{{ t('user.title') }}</h3>
  <pf-button>{{ t('common.confirm') }}</pf-button>
</template>
 
<script setup>
import { useI18n } from 'vue-i18n'
const { t } = useI18n()
</script>

运行时语言切换 + 持久化

function switchLang(lang: string) {
  i18n.global.locale.value = lang
  localStorage.setItem('lang', lang)
}

页面中:

<Select v-model="lang" @change="switchLang">
  <Option value="zh-CN">简体中文</Option>
  <Option value="en-US">English</Option>
</Select>

切换后,全页面立即响应刷新文本内容

动态加载语言包

适用于多语种、首屏性能优化:

const messages = {
  'zh-CN': () => import('./locales/zh-CN.json'),
  'en-US': () => import('./locales/en-US.json'),
}
 
async function switchLang(lang) {
  const msg = await messages[lang]()
  i18n.global.setLocaleMessage(lang, msg)
  i18n.global.locale.value = lang
}

词条抽取与平台配置化建议

方法 1:手动规范 key 命名

模块 + 业务

t('user.email') → 用户模块的 email 字段
 
t('product.detail.tab.review') → 产品详情页下的评论 Tab

方法 2:自动词条提取工具(推荐)

可使用插件:

自动扫描项目中 t('xxx') 使用的词条 → 输出未翻译列表

支持后端返回文案

后端返回内容为:

{
  "title": {
    "zh-CN": "用户管理",
    "en-US": "User Management"
  }
}

前端处理:

function renderLangLabel(item: Record<string, string>) {
  return item[i18n.global.locale.value] || item['zh-CN']
}

可用于动态菜单、平台词条配置、运营活动内容等场景

组件封装建议

  • 所有组件文字通过 props 注入文案 key 或字符串
  • 支持 fallback 默认值
  • 插槽方式提供最大自由度
<CustomDialog :title="$t('user.title')">
  <template #footer>
    <pf-button>{{ $t('common.confirm') }}</pf-button>
  </template>
</CustomDialog>

平台化建议(国际化配置平台)

能力推荐做法
词条集中管理JSON / Excel 托管 → 后台系统配置
翻译管理支持中英原文对照、AI 翻译集成
词条冲突检测自动检测重复 key,自动补全未翻译语言
多项目共享语言包多项目共用一套 i18n 仓库或服务端拉取词条
插件支持VSCode i18n Ally、Webstorm 翻译辅助插件