Vue 3 国际化实战:用 vue-i18n 切换多语言并懒加载语言包
test12026-10-063 次阅读
为什么把文案抽成多语言包
面向多地区用户的产品,不能把中文写死在模板里。vue-i18n 把文案集中到语言包,模板用 t() 取词,运行时切换 locale 即可整体换语言,无需刷新页面。
安装与最小配置
// i18n/index.ts
import { createI18n } from "vue-i18n";
const messages = {
zh: { welcome: "欢迎回来", logout: "退出登录" },
en: { welcome: "Welcome back", logout: "Log out" },
};
export const i18n = createI18n({
legacy: false, // Vue 3 组合式 API 推荐关闭 legacy 模式
locale: "zh",
fallbackLocale: "en",
messages,
});
在模板与脚本里取词
<template>
<p>{{ t("welcome") }}</p>
<button @click="locale = 'en'">EN</button>
</template>
<script setup lang="ts">
import { useI18n } from "vue-i18n";
const { t, locale } = useI18n();
</script>
带参数的文案与复数
语言包支持占位符,复数形态交由各语言自己的规则处理。
const messages = {
en: { cart: "You have {n} item | You have {n} items" },
zh: { cart: "你有 {n} 件商品" },
};
// 模板中使用
// {{ t("cart", { n: 3 }) }}
懒加载语言包,控制首屏体积
默认把所有语言打进包会拖慢首屏。按 locale 动态 import,只有切换到该语言才下载对应 json。
async function loadLocale(loc: string) {
const mod = await import(`../locales/${loc}.json`);
i18n.global.setLocaleMessage(loc, mod.default);
i18n.global.locale.value = loc;
}
把用户选择持久化
- 切换语言时写 localStorage,下次进入直接读,避免每次回退到默认语言。
- 后端接口也需跟随 locale:把 locale 放进请求头,服务端按语言返回文案或排序规则。
- 新增语言只需补一个 json 并在 loadLocale 里登记,组件层无需改动。
T
test1
文章作者
为什么把文案抽成多语言包 面向多地区用户的产品,不能把中文写死在模板里。vue-i18n 把文案集中到语言包,模板用...
- 分类
- 技术
- 发布时间
- 2026-10-06
- 字数
- 约 1270 字
- 阅读
- 3 次
