Vue+Element-ui 国际化 多语言切换(包括element-ui 组件文字国际化)

372 阅读1分钟

使用步骤[#]

注意:下面操作是基于vue2的版本

实现功能:

  • 在vue单文件组件中如何使用

    • 模版中使用{{ $t('xxx') }}
  • 点击"切换语言"

    • 修改挂载在vue实例的$i18nlocale
  1. 安装依赖 版本号 7.3.2,
npm install vue-i18n --save
  1. src文件夹下创建lang文件夹

index.js

import Vue from 'vue'
import VueI18n from 'vue-i18n'
import Cookies from 'js-cookie'
import elementEnLocale from 'element-ui/lib/locale/lang/en' // element-ui lang
import elementZhLocale from 'element-ui/lib/locale/lang/zh-CN'// element-ui lang
import elementJaLocale from 'element-ui/lib/locale/lang/ja'// element-ui lang
import enLocale from './en'
import zhLocale from './zh'
import jaLocale from './ja'

Vue.use(VueI18n)

const messages = {
  en: {
    ...enLocale,
    ...elementEnLocale
  },
  zh: {
    ...zhLocale,
    ...elementZhLocale
  },
  ja: {
    ...jaLocale,
    ...elementJaLocale
  }
}
export function getLanguage() {
  const chooseLanguage = Cookies.get('language')
  if (chooseLanguage) return chooseLanguage

  // if has not choose language
  const language = (navigator.language || navigator.browserLanguage).toLowerCase()
  const locales = Object.keys(messages)
  for (const locale of locales) {
    if (language.indexOf(locale) > -1) {
      return locale
    }
  }
  return 'en'
}
const i18n = new VueI18n({
  // set locale
  // options: en | zh | es
  locale: getLanguage(),
  // set locale messages
  messages
})

export default i18n

zh.js

注意:在对zh.js文件新增字段后需要同步在en.js中同样新增字段

/** 修改zh.js文件后,应将修改或新增的自动同步到en.js
* zh.js 和 en.js 字段数量应一致,如不熟悉字段使用范围,应尽量新增字段,避免修改现有字段
*/ 
export default {
   navbar: {
    dashboard: '首页',
    github: '项目地址',
    logOut: '退出登录',
    profile: '个人中心',
    theme: '换肤',
    size: '布局大小'
  }
 }

en.js

export default {
 navbar: {
    dashboard: 'Dashboard',
    github: 'Github',
    logOut: 'Log Out',
    profile: 'Profile',
    theme: 'Theme',
    size: 'Global Size'
  }
}

3.需要在main.js中引入并挂载

import i18n from './lang' // internationalization
Vue.use(Element, {
  size: Cookies.get('size') || 'medium', // set element-ui default size
  i18n: (key, value) => i18n.t(key, value)
})
new Vue({
  el: '#app',
  router,
  store,
  i18n,
  render: h => h(App)
})

4.使用APP.vue

<button @click="toggleLanguage('zh')">切换成 中文</button>
<button @click="toggleLanguage('en')">切换成 English</button>
<hr />
<h1>title:{{ $t('navbar.logOut') }}</h1>

export default {
  data: function () {
    return {}
  },
  methods: {
    toggleLanguage(lang) {
      this.$i18n.locale = lang
      console.log(this.$i18n)
    },
  },
}

小结[#]

  • 模版中的使用

    • {{ $t('xxx') }}
  • vue文件以外的地方,比如js使用

    • import i18n from '@/lang'
    • const loginTitle = i18n.t('login.title')