Vue随笔-生活工作点滴技术栈

4. vue i18n国际化 切换中英文

2019-07-11  本文已影响33人  web30

最近在做的一个网站需要加上一个英文版(看过之前文章的会知道),点击按钮切换中文/英文,在这里记录下实现过程。

需求:网站实现中英文切换
项目环境:vue + vue-cli + element-ui

1、首先 npm 安装 i18n 国际化插件:npm install vue-i18n --save;

2、在 src 下新建一个目录 i18n(目录名随意),新建i18n.js文件,再建一个子文件目录 langs,里面包含 cn/en/index.js文件,目录结构如下:


image.png

3、把安装好的 i18n 引入 main.js 文件中,并且在 app 根组件中注入;

import i18n from './i18n/i18n'
window.app = new Vue({
  el: '#app',
  router,
  store,
  i18n,  //注入根目录下,千万不能忘记
  components: { App },
  template: '<App/>'
})

4、这里需要用的存储store,在src下新建store, index.js文件

import Vue from 'vue'
import Vuex from 'vuex'  //引入vuex之前,先npm安装  npm install vuex  --save

Vue.use(Vuex)

export default new Vuex.Store({
  state: {
    lang: localStorage.lang || 'cn'
  },
  mutations: {
    switchLang (state, lang) {
      state.lang = lang
      window.app.$i18n.locale = lang
      localStorage.setItem('lang', lang)
    }
  },
  actions: {}
})

5、开始在 i18n.js 中编写代码;

import Vue from 'vue'
import locale from 'element-ui/lib/locale'   // element-ui 国际化
import VueI18n from 'vue-i18n'
import messages from './langs'  // 这里是调用 langs/index.js

Vue.use(VueI18n)

const i18n = new VueI18n({
  locale: localStorage.lang || 'cn',   // 语言标识
  messages
})
locale.i18n((key, value) => i18n.t(key, value))  // 重点:为了实现element插件的多语言切换

export default i18n

6、langs目录下的 index.js文件;

import en from './en'
import cn from './cn'
export default {
  cn,
  en
}

7、langs目录下的 en.js 文件;

import enLocale from 'element-ui/lib/locale/lang/en'  // element-ui 国际化 英文

// 这里把翻译好的英文以对象的格式包裹起来,建议以模块来划分,这样在调用起来方便效率,举例说明:导航菜单栏
const en = {
  navbar: {  // 取导航的英文来包裹其内的子对象
    'home': 'Home',  //前面的第一个英文home为页面将调用的
    'Product description': 'Product description',
    'Login': 'Login',
    'Register': 'Register',
    'Simplified Chinese': 'Simplified Chinese'
  },
    ...enLocale
}
 export default en    // vuex方法,映射到英文上
image.png
image.png

8、langs目录下的 cn.js 文件;

import zhLocale from 'element-ui/lib/locale/lang/zh-CN'   // element-ui 国际化 中文

 // 同理en.js文件,只是这里改成中文了
const cn = {
  navbar: {
    'home': '首页',
    'Product description': '产品介绍',
    'Login': '登录',
    'Register': '注册',
    'Simplified Chinese': '简体中文'
  },
    ...zhLocale  // vuex方法,映射到中文上
}
export default cn

9、逻辑部分;

export default {
  name: '',
  data () {
    return {
      lang: 'cn',   // 因为网站默认是中文的,默认初始化为中文
      is_en: true  // (因样式问题自己单独写的)
    }
  },
methods{
  handleCommand (command) {
      // 点击切换为英文
      if (command === 'en') { // command 是element-ui 下拉框的用法,具体可参考官方文档
        this.lang = 'en'
        this.is_en = true  // 当点击切换成英文后,此样式生效(因样式问题自己单独写的)
      } else {
        this.lang = 'cn'
        this.is_en = false
      }
      this.$store.commit('switchLang', this.lang)  // 这里的switchLang是调用store/index.js中mutations里的switchLang
    }
  },
 created () {
    // 点击切换英文后调用此样式(这里是点击英文后页面部分的样式有点变化,我自己单独写的动态class方法)
    if (this.$store.state.lang === 'en') {
      this.is_en = true
    } else {
      this.is_en = false
    }
}
// 这里主要是对应动态class部分,如果同时需要绑字两个动态class,那么可以以数组的的方式给包裹起来
<span class="product_content" :class="[{product_content_1920:is_1920},{product_content_en:is_en}]">{{this.$t('product.productContent')}}</span>

10、最后把首页部分全部替换成英文,然后点击切换中英后页面就得到英文了。


image.png image.png
上一篇下一篇

猜你喜欢

热点阅读