Skip to content

本文讲述了如何使用i18n对vue3进行国际化处理,以及引入i18n浏览器出现警告问题的解决方案。

vue3 下需要使用v9.x的i18n,安装命令如下

shell
npm install vue-i18n@next

1.创建语言文件

创建存储英文变量的文件:src/i18n/lang/en.js

javascript
export default {
  title:"Star Cabin",
  login: {
    title: 'User Login',
    loginBtn: 'Login',
    usernameRule: 'Username is required',
    passwordRule: 'Password cannot be less than 6 digits'
  }
}

创建存储中文变量的文件:src/i18n/lang/zh.js

javascript
export default {
  text: "星空小屋管理系统",
  login: {
    text: "用户登录",
    loginBtn: "登录",
    usernameRule: "用户名为必填项",
    passwordRule: "密码不能少于6位"
  }
}

2.创建配置文件

我们需要将语言文件导入到配置文件中去,配置后项目中才能和使用,创建文件:src/i18n/index.js

javascript
import { createI18n } from "vue-i18n"
import mZhLocale from "./lang/zh"
import mEnLocale from "./lang/en"

const messages = {
  en: {
    msg: {
      ...mEnLocale
    }
  },
  zh: {
    msg: {
      ...mZhLocale
    }
  }
}

/**
 * 返回当前 lang
 */
function getLanguage() {
  return localStorage.getItem('language') ? localStorage.getItem('language'): 'zh'
}

const i18n = createI18n({
  // 使用 Composition API 模式,则需要将其设置为false
  legacy: false,
  // 全局注入 $t 函数
  globalInjection: true,
  locale: getLanguage(),
  messages
})

export default i18n

main.js导入

javascript
import i18n from '@/i18n'
const app = createApp(App)
// ……
app.use(i18n)
app.mount("#app")

如何使用?

我们在配置文件中已经进行了全局注册,在项目中可直接使用,注意上文全局配置中,msg是前缀使用时不要确实,如果不需要可在配置文件中删除

vue
<template>
    {{ $t('msg.title') }}
</template>

国际化之切换语言

vue
<script setup>
import { useI18n } from 'vue-i18n'
import { defineProps, ref } from "vue"
import { ElMessage } from 'element-plus'

// 如果用户切换过语言,我们从本地获取切换的语言
const language = ref(localStorage.getItem('language') ? localStorage.getItem('language') : 'zh')

// 切换语言的方法
const i18n = useI18n()
// 绑定单机事件,lang代表语言简写,传递zh或en
const handleSetLanguage = lang => {
  i18n.locale.value = lang
  localStorage.setItem('language',lang)
  language.value = lang
  ElMessage.success('更新成功')
}
</script>

报错解决

打开浏览器控制台会出现如下错误:You are running the esm-bundler build of vue-i18n. It is recommended to configure your bundler to explicitly replace feature flag globals with boolean literals to get proper tree-shaking in the final bundle.

image-20220820231721805

安装 intlify/vite-plugin-vue-i18n

shell
npm install @intlify/vite-plugin-vue-i18n

在 vite.js 中进行设置

javascript
import path from "path"
import vueI18n from '@intlify/vite-plugin-vue-i18n'

export default defineConfig({
  plugins: [
    vue(),
    vueI18n({
      include: path.resolve(__dirname,'./path/to/src/locales/**')
    })
  ]
})