Code前端首页关于Code前端联系我们

安装核心库

terry 4小时前 阅读数 52 #Vue

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>
``` 要是用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前端网发表,如需转载,请注明页面地址。

热门