安装核心库
Vue3 i18n配置太麻烦?新手也能快速上手多语言切换+动态加载的全流程方案
刚接触Vue3多语言开发的朋友,是不是翻遍文档还是觉得步骤零散?一会儿要装插件,一会儿要处理Vue2和Vue3的语法差异,万一遇到动态切换后页面卡顿、打包体积太大这些进阶问题更头疼?别急,这篇全是踩坑后整理的干货,从环境搭建到打包优化,一步步讲得明明白白,看完就能落地一个可用的多语言Vue3项目。
先搞清楚核心依赖:@intlify/vue-i18n-next是啥
做Vue3多语言,别再瞎试其他杂七杂八的库了,官方推荐的@intlify/vue-i18n-next才是最稳的选择——它由Vue官方核心团队成员主导维护,完全适配Vue3的Composition API和setup语法,性能也比Vue2时代的vue-i18n好很多。
安装也简单,用npm、yarn、pnpm都可以,随便选个顺手的包管理器就行,不过这里要提醒一句:如果你的项目用的是Vite,需要同时安装@intlify/unplugin-vue-i18n这个构建工具插件;如果是Webpack,就用@intlify/vue-i18n-loader,这俩是帮你处理.json、.yaml、.yml这类语言文件自动导入的关键,没有它们就得自己手动import一堆文件,既麻烦又容易出错。
从零开始搭建基础多语言项目
先拿Vite + Vue3 + TypeScript的项目举例吧,这是现在最主流的组合,要是你的项目不用TS,稍微调整下类型定义部分就好。
初始化项目并安装依赖
先初始化一个干净的Vite Vue3项目,然后打开终端,依次输入安装命令:
# 安装Vite构建插件 npm install @intlify/unplugin-vue-i18n -D
配置Vite插件
找到项目根目录的vite.config.ts,修改配置文件,把刚装的unplugin加进去,注意要设置include路径,告诉插件你的语言文件放在哪儿,一般我们会新建一个src/locales文件夹专门存这个,开发阶段建议开启runtimeOnly: false,方便调试;生产阶段可以开成true,能稍微减小一点打包体积,但前提是你没用.vue文件里的<i18n>块(新手先别碰这个,进阶再学)。
创建基础语言文件
在src/locales下建两个JSON文件试试手:zh-CN.json(简体中文)和en-US.json(美式英语),内容别写太复杂,先放个页面标题、登录按钮、欢迎语这些基础内容就行,
// zh-CN.json
{
"common": {
"login": "登录",
"logout": "退出登录"
},
"home": {: "Vue3 i18n 新手教程",
"welcome": "欢迎来到{{ name }}的博客",
"language": "语言切换"
}
}
// en-US.json
{
"common": {
"login": "Login",
"logout": "Logout"
},
"home": {: "Vue3 i18n Beginner Tutorial",
"welcome": "Welcome to {{ name }}'s Blog",
"language": "Language Switch"
}
}
全局注册i18n并挂载到Vue实例
新建一个src/plugins/i18n.ts文件,专门用来配置i18n的核心逻辑,这里要注意几个点:
- 先设置默认语言:可以从用户的浏览器设置里自动获取,也可以从localStorage/sessionStorage里读取用户之前的选择,优先级肯定是用户自己选的>浏览器默认>项目硬编码的,这个逻辑新手一定要加,不然每次刷新页面又回到默认语言,体验太差。
- 启用legacy模式:虽然Vue3推荐Composition API,但legacy模式兼容Vue2的写法,如果你之后可能要维护一些旧代码,或者想用
$t、$d这些全局方法,legacy设为true更方便。 - 挂载前记得把配置的i18n实例传给
createApp.use()。在组件里使用i18n
基础配置做好了,终于能在组件里用了!这里分两种常用场景:
纯文本替换(带插值)
纯文本替换直接用Composition API的
useI18n()hook,解构出t函数就行,插值的话,在JSON文件里用双大括号包裹变量名,然后传个对象给t函数,<script setup lang="ts"> import { useI18n } from 'vue-i18n' const { t } = useI18n() const userName = 'Vue开发者' </script>
{{ t('home.title') }}
{{ t('home.welcome', { name: userName }) }}
``` 要是用legacy模式,或者在非setup的选项式API里,直接用`this.$t()`就行,逻辑一模一样。 ##### 场景二:多语言切换 多语言切换也很简单,还是用`useI18n()` hook,解构出`locale`变量(注意这个是响应式的),然后写个下拉框或者按钮组,切换的时候直接给`locale.value`赋值就行,赋值后记得把用户的选择存到localStorage里,刷新页面就不会丢了。进阶优化:解决动态加载和打包体积问题
刚搭好的基础项目,语言文件是直接打包进主bundle的,要是你的项目有几十种语言,或者每种语言文件都很大(比如有几万行翻译),主bundle的体积肯定会超标,加载速度也会变慢,这时候就需要用动态懒加载语言文件了。
怎么实现动态懒加载?
核心思路是:默认只加载当前用户选择的语言,或者只加载默认语言,当用户切换到其他语言时,再通过异步请求(或者Vite的动态import)去加载对应的语言文件,加载完成后再切换locale。
这里用Vite的动态import举个例子,它比异步请求更稳定,因为不需要额外的服务器支持,还能利用Vite的代码分割功能,自动把每个语言文件打包成单独的chunk。
动态加载时的加载状态处理
动态加载语言文件需要一点时间,要是用户切换语言后没任何反馈,肯定会以为系统坏了,所以最好加个loading状态:切换按钮变成“加载中…”,下拉框禁用,加载完成后再恢复。
防止重复加载
要是用户反复切换同一个语言,总不能每次都重新加载吧?所以要加个缓存机制,比如用一个Set或者Map来存已经加载过的语言,切换的时候先检查一下,加载过了就直接切换locale,没加载过再去请求。
还有几个新手容易踩的坑
坑一:中文JSON文件乱码
这个主要是文件编码的问题,不管是.json还是.yaml,一定要用UTF-8无BOM编码保存,不然浏览器解析出来的全是乱码,VSCode里可以直接在右下角看文件编码,要是不对的话点一下就能改。
坑二:插值变量不生效
检查一下JSON文件里的变量名和传进去的对象属性名是不是完全一致,包括大小写!Vue3 i18n的插值是严格区分大小写的,比如JSON里是{{ Name }},传进去的是{ name: 'xxx' },变量肯定不会生效。
坑三:切换语言后只有部分内容更新
这个问题一般出现在非响应式的地方,比如直接在data()或者computed里用了静态的$t()值,而不是用响应式的locale结合computed来重新计算。useI18n()解构出来的t函数是依赖locale响应式变量的,所以只要locale变了,用了t函数的地方都会自动更新,但如果你把t()的结果提前存到了一个普通的变量里,就不会更新了。
最后总结一下
Vue3 i18n其实没有想象中那么难,核心就是四步:装依赖、配插件、写语言文件、全局注册挂载,进阶优化也只是在这个基础上加了动态加载、缓存、loading这些细节,只要跟着这篇文章一步步做,再避开那几个常见的坑,很快就能写出一个体验不错的多语言Vue3项目。
要是你还有其他问题,比如日期时间格式化、数字格式化、复数形式处理这些,可以去官方文档里看看,里面讲得很详细,还有很多实用的示例,不过记住,官方文档有时候会有点太官方,新手可以先把基础功能搞通,再慢慢学进阶功能。
版权声明
本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。
code前端网


