Skip to content

国际化(i18n)开发指南

国际化(Internationalization,简称 i18n)是让应用支持多语言的关键技术。本文档介绍 Vue 项目的国际化方案及相关工具配置。

相关资源

资源说明链接
vue-i18nVue 官方多语言解决方案文档
i18n AllyVS Code 多语言插件,提升开发效率插件市场
可视化操作教程详细的插件使用教程参考文档

i18n Ally 插件优势

  1. 可以直观的看到真实文案,在组件内即可直接看到,无需取对应语言文件内查看原文!
  2. 可以智能检测并定位语言文件内未找到的 key,避免漏翻译
  3. 可以直接在 VS Code 工具中翻译对应的语言,而无需单独去翻译网站搜索,并且会自动生成 key 名,无需自己起名,并且不仅可以单独翻译词语,还可以翻译整个文件批量翻译、文件夹批量翻译

关于 i18n Ally 可视化操作可以查看参考文档

vue-i18n 快速入门

环境要求

  • Vue 3
  • TypeScript(推荐)
  • 包管理器:pnpm / npm / yarn

安装

bash
# pnpm
pnpm add vue-i18n

# npm
npm install vue-i18n

# yarn
yarn add vue-i18n

项目结构

推荐的多语言文件组织方式:

src/
└── locales/
    ├── index.ts      # 入口配置
    ├── en.ts         # 英文(或 en.json)
    └── zh.ts         # 中文(或 zh.json)

文件格式选择

  • JSON:简单直观,适合小型项目
  • TypeScript:支持类型检查,适合大型项目(需要额外配置)

配置入口(index.ts)

ts
import { createI18n } from "vue-i18n";
import en from "./en";
import zh from "./zh";

export default createI18n({
  locale: "zh",           // 默认语言
  fallbackLocale: "zh",   // 回退语言(当找不到翻译时使用)
  messages: {
    en,
    zh,
  },
});
配置项说明
locale当前使用的语言
fallbackLocale回退语言,当当前语言缺少翻译时使用
messages语言包对象

main.ts 写法

ts
import { createApp } from "vue";
import "./style.css";
import App from "./App.vue";
// 重要
import I18n from "@/locales";
const app = createApp(App);
app.use(I18n);
app.mount("#app");

en.ts / zh.ts 写法

如果是 json 写法的话,去掉 export default 即可

ts
export default {
  common: {
    confirm: "确认",
  },
};

页面使用

template 区域

vue
<template>
  <div>
    {{ $t("common.confirm") }}
  </div>
</template>

script 区域

ts
//

i18n Ally VSCode 配置

基础配置

操作 vscode 工作区 .vscode/settings.json

json
{
  "i18n-ally.localesPaths": [
    "src/locales" // I18n所有语言 所在目录
  ],
  "i18n-ally.enabledParsers": ["ts", "json"] // 解析的文件后缀
}

默认语言版本配置

文件$t('xxx.xxx')语法自动转换显示,默认显示en文件,修改默认显示中文zh文件

  • 操作工作区配置.vscode/settings.json
  • 新增如下配置
    json
    // 设置当前显示的主体语言: zh-CN/en/zh-TW/...
    "i18n-ally.displayLanguage": "zh-CN",

属性名生成规则配置

操作工作区设置.vscode->settings.json

json
// 翻译文案的属性名称策略:slug-拼音、random-随机、empty-需要手动命名
"i18n-ally.extract.keygenStrategy": "slug",
// 属性名称的具体生成规则 驼峰
"i18n-ally.extract.keygenStyle": "camelCase",

可选配置值如下

default/kebab-case: 拼音+短横杠,如 js-pao。 snake_case: 拼音+下划线,如 js_pao。 camelCase: 拼音+驼峰,如 jsPao PascalCase: 拼音+驼峰+首字符大写,如 JsPao。 ALL_CAPS: 拼音+下划线+全大写,如 JS_PAO。

命名空间 (按模块划分)

操作工作区配置文件 .vscode->settings.json

方法一: 嵌套格式或扁平键格式

json
"i18n-ally.keystyle": "nested" // 嵌套格式,flat 为 扁平化翻译键 (扁平键格式/点分表示法)

嵌套格式 nested

json
{
  "common": {
    "confirm": "确认"
  }
}

扁平化翻译键 (扁平键格式/点分表示法) flat

json
{
  "common.confirm": "确认"
}

方法二:模块化语言包

json
// 使用空间命名
"i18n-ally.namespace": true,
"i18n-ally.pathMatcher": "{locale}/{namespace}.json",
  1. 语言结构如下
- src
    - locales
        - en
            - common.json
            - index.ts
        - zh
            - common.json
            - index.ts
        - index.ts
  1. en / zh index.ts 写法

json 依然保持 嵌套格式 或者 扁平化翻译键

ts
import common from "./common.json";
import user from "./user.json";
export default {
  common,
  user,
};

完整的工作区配置

json
{
  // 设置当前显示的主体语言: zh-CN/en/zh-TW/...
  "i18n-ally.displayLanguage": "zh-CN",
  // 插件将以何种语言作为基准来进行翻译相关的操作,如果你正在开发一个多语言应用,并且原始文案是用英语编写的,你可以将`sourceLanguage`设置为`en`(代表英语)。这样,插件就知道在提取文案进行翻译或者在代码中关联不同语言的文案时,以英语文案为原始参考。
  "i18n-ally.sourceLanguage": "zh-CN",
  "i18n-ally.localesPaths": [
    // 翻译文件夹路径 (相对于项目根目录),你也可以使用Glob匹配模式。
    "src/locales"
  ],
  "i18n-ally.translate.engines": ["baidu"], // 指定翻译器
  "i18n-ally.translate.baidu.appid": "你的appid", // 翻译器api-appid
  "i18n-ally.translate.baidu.apiSecret": "你的appSecret", // 翻译器api-Secret
  "i18n-ally.enabledParsers": [
    // 指定启用文件格式
    "json",
    "yaml"
  ],
  "i18n-ally.keystyle": "nested", // 翻译路径格式 (翻译后变量格式 nested:嵌套式  flat:扁平式)
  // ...
  // 翻译文案的属性名称策略:slug-拼音、random-随机、empty-需要手动命名
  "i18n-ally.extract.keygenStrategy": "slug",
  // 属性名称的具体生成规则 驼峰
  "i18n-ally.extract.keygenStyle": "camelCase",
  "i18n-ally.enabledFrameworks": ["vue"],
  // 使用空间命名
  "i18n-ally.namespace": true,
  "i18n-ally.pathMatcher": "{locale}/{namespace}.json"
}

常用语言代码参考

主要语言代码

语言代码地区代码示例
简体中文zh / zh-CN中国:zh-CN
繁体中文zh-TW / zh-HK台湾:zh-TW,香港:zh-HK
英语en美国:en-US,英国:en-GB
日语ja / ja-JP日本:ja-JP
韩语ko / ko-KR韩国:ko-KR
法语fr法国:fr-FR,加拿大:fr-CA
德语de德国:de-DE,奥地利:de-AT
西班牙语es西班牙:es-ES,墨西哥:es-MX
俄语ru / ru-RU俄罗斯:ru-RU
葡萄牙语pt葡萄牙:pt-PT,巴西:pt-BR
意大利语it / it-IT意大利:it-IT
阿拉伯语ar阿联酋:ar-AE,沙特:ar-SA
泰语th / th-TH泰国:th-TH
越南语vi / vi-VN越南:vi-VN

更多语言代码

点击查看完整列表
语言/地区代码
阿尔巴尼亚sq-AL
白俄罗斯be-BY
保加利亚bg-BG
克罗地亚hr-HR
捷克cs-CZ
丹麦da-DK
爱沙尼亚et-EE
芬兰fi-FI
希腊el-GR
匈牙利hu-HU
冰岛is-IS
爱尔兰ga-IE
拉脱维亚lv-LV
立陶宛lt-LT
马其顿mk-MK
荷兰nl-NL
挪威no-NO
波兰pl-PL
罗马尼亚ro-RO
塞尔维亚sr-RS
斯洛伐克sk-SK
斯洛文尼亚sl-SI
瑞典sv-SE
土耳其tr-TR
乌克兰uk-UA

代码格式

语言代码通常遵循 语言-地区 格式,如 zh-CN(中文-中国)、en-US(英语-美国)。

山与海都很美,努力走出去