Vue Vuei18n

前端国际化

记录一下前端如何实现国际化

Hannah
2021-09-27
3 min

# 组件库国际化方案

Ant Design Vue

ElementPlus

# 自定义国际化方案

Vue i18n

vue3国际化多语言

# 一、安装

npm i vue-i18n@next --save

# 二、配置

# 1. 新建index.js

import { createI18n } from 'vue-i18n'
// 引入同级目录下文件
const modules = import.meta.globEager('./*')

//假设你还有其他目录下的语言文件 它的路径是 src/views/home/locales/en-US.ts
//那么你就可以 使用 :lower:(小写) :upper:(大写) 来引入文件
// const viewModules = import.meta.globEager('../views/**/locales/[[:lower:]][[:lower:]]-[[:upper:]][[:upper:]].ts')
function getLangAll()  {
  let message = {}
  getLangFiles(modules, message)
  //   getLangFiles(viewModules,message)
  return message
}

/**
 * 获取所有语言文件
 * @param {Object} mList
 */
function getLangFiles(mList, msg) {
  for (let path in mList) {
    if (mList[path].default) {
      //  获取文件名
      let pathName = path.substr(path.lastIndexOf('/') + 1, 5)

      if (msg[pathName]) {
        msg[pathName] = {
          ...mList[pathName],
          ...mList[path].default
        }
      } else {
        msg[pathName] = mList[path].default
      }
    }
  }
}

//注册i8n实例并引入语言文件
const i18n = createI18n({
  legacy: false, // 使用Composition API,这里必须设置为false
  globalInjection: true,
  global: true,
  locale: localStorage.getItem('language') || 'zh-CN',
  fallbackLocale: 'zh-CN', // 默认语言
  messages: getLangAll()
})

export default i18n

# 2.新建zh-CN.js,存放中文

const Menus = {
    userManage: "用户管理",
    infoManage: "信息管理",
    settings: "设置",
    changeLanguage: "英文",
};
const userTable = {
    nickname: "昵称",
    phoneNumber: "手机号",
    sex: "性别",
    address: "地址",
    online: "是否在线",
    action: "操作"
}
// 按功能模块导出
export default {
    Menus,
    userTable
};

# 3.新建en-US.js,存放英文

const Menus = {
    userManage: "User management",
    infoManage: "Information management",
    settings: "Settings",
    changeLanguage: "Chinese",
};
const userTable = {
    nickname: "nickname",
    phoneNumber: "Mobile Phone",
    sex: "sex",
    address: "Address",
    online: "Online",
    action: "Action"
}
// 按功能模块导出
export default {
    Menus,
    userTable
};

# 三、使用

# 1.在main.js里引入并挂载到实例上

// 国际化多语言
import i18n from './locales/index'

createApp(App).use(i18n).mount('#app')

# 2.在组件内部template内使用

<a-menu
  v-model:selectedKeys="current"
  mode="horizontal"
  style="font-size: 18px"
  >
  <a-menu-item key="usermanage">**{{$t("Menus.userManage")}}** </a-menu-item>
  <a-menu-item key="infomanage">**{{$t("Menus.infoManage")}}** </a-menu-item>
  <a-menu-item key="settings">**{{$t("Menus.settings")}}** </a-menu-item>
</a-menu>

# 3.在js文件中使用

import i18n from '../locales/index'
console.log(i18n.global.t("userTable.nickname"))

# 四、按钮点击切换

存入localstorage后刷新该页面会自动重新加载

<template>
  <button @click="changeLanguage">change language</button>
</template>

<script setup>
import { useI18n } from "vue-i18n";
const { locale } = useI18n({ useScope: "global" });
function changeLanguage() {
  localStorage.setItem('language', locale.value === "en-US"? "zh-CN":"en-US")
  router.go(0)
}
</script>

Last Updated: 2/25/2022, 10:24:15 AM