vux UI 项目国际化

第一步必须装 vux vux-loader vuex 和vuex-i18n

npm i vux-loader -D
npm i vuex vux vuex-i18n -S

安装完成须要配置webpack.base.conf.js
为了下降使用成本及不侵入原来配置,只须要调用merge方法对原来webpack配置进行操做:css

//引入vuxLoader
const vuxLoader = require('vux-loader')
const webpackConfig = {} // 原来的 webpack.base.js 配置
module.exports = vuxLoader.merge(webpackConfig, {
 plugins:[
    {name:'vux-ui'},
    {
      name: 'i18n',
      vuxStaticReplace: true,
      staticReplace: true,
      extractToFiles: 'src/locales/components.yml',
      localeList: ['en', 'zh-CN','tw']
    }

  ]
})

使用vux组件和其余UI库有点不太同样,为了防止所有引入致使体积过大,你只须要在须要的地方引入,而后注册vue

import {aaa} from 'vux'
export default  {
    components:{
      aaa,
    }
}

若是全要全局注册某一组件,只须要在入口文件全局注册就OK
例如webpack

import {***} from 'vux';
Vue.use(***)

这里提示一点
若是项目引入vux组件就报各类错误 具体错误我记不太清楚,就是各类loader 引发错误,查了很久,发现是vue-loader 版本太高,致使出现错误,最后把vue-loader 降到 vue-loader@12.2.2
或者把vux-loader 更新最新版本git

第二步国际化而后分别引入

import Vuex from 'vuex'  
import vuexI18n from 'vuex-i18n'

使用插件github

Vue.use(Vuex)
let store = new Vuex.Store({
  modules: {
    i18n: vuexI18n.store
  }
})
Vue.use(vuexI18n.plugin, store)

注意:若是在使用过程当中报以下错误web


在入口文件中相似这样全局注册插件vuex

let store = new Vuex.Store({
  modules: {
    i18n: vuexI18n.store
  }
})
Vue.use(vuexI18n.plugin, store)
import { ConfirmPlugin, LocalePlugin} from 'vux'
Vue.use(ConfirmPlugin)
Vue.use(localePlugin)

注意点:
第一 Vue.use(****)必定要放在store变量下
* 第二 组件中就不要再相似下面这种写法了,npm

import { ConfirmPlugin} from 'vux'
Vue.use(ConfirmPlugin)

第三部在入口文件配置多语言

这里是vux入口文件连接main.js
你们能够参考vux配置
首先安装 object-assign包app

npm install object-assign -Side

入口文件

import objectAssign from 'object-assign'
import vuxLocales from './locales/all.yml'
import componentsLocales from './locales/components.yml'
// 引入vux localePlugin插件 保存本地语言环境
import {localePlugin} from 'vux'
//本地语言环境
const finalLocales = {
  'en': objectAssign(vuxLocales['en'], componentsLocales['en']),
  'zh-CN': objectAssign(vuxLocales['zh-CN'], componentsLocales['zh-CN']),
 'tw': objectAssign(vuxLocales['tw'], componentsLocales['tw'])
}

for (let i in finalLocales) {
  Vue.i18n.add(i, finalLocales[i])
}
Vue.use(LocalePlugin)
const nowLocale = Vue.locale.get()
if (/zh/.test(nowLocale)) {
  Vue.i18n.set('zh-CN')
} else if (/en/.test(nowLocale)) {
  Vue.i18n.set('en')
} else {
  Vue.i18n.set('tw')
}

而后 在src文件夹下新建locales语言包 文件夹 在里面新建 all.yml, en.yml, zh-CN.yml, tw.yml, components.yml 以下图

因为语言文件是.yml格式,因此须要安装js-yaml-loader包来处理.yml文件

npm install js-yaml-loader -D

webpack.base.conf.js 配置处理这种文件的规则

{
        test: /\.(yaml|yml)$/,
        loader: 'js-yaml-loader'
      },

在页面弄一个切换语言按钮 来改变语言

<i18n>
  hello:
    en: hello vue
    zh-CN: 你好Vue
    tw: 你號Vue
</i18n>
<template>
  <div id="app">
    <img src="./assets/logo.png">
    <h2>{{$t('hello')}}</h2>
    <router-link :to="{path:'news'}">新闻列表</router-link>
    <button @click="changeLanguage"> 切换语言</button>
    <login></login>
    <XDialog v-model="dialogStatus" :hide-on-blur="true">
      <div class="e-dialog">
        <div class="e-dialog-content">
          <Radio
            title="请选择语言"
            v-model="value"
            :options="options" @change="check">
          </Radio>
        </div>
      </div>
    </XDialog>
    <router-view/>
  </div>
</template>

<script>
import {Radio} from 'mint-ui'
import login from './components/login'
import { XDialog } from 'vux'
export default {
  name: 'App',
  data () {
    return {
      dialogStatus: true,
      value: 'zh-CN',
      options: [
        {label: '中文', value: 'zh-CN'},
        {label: 'English', value: 'en'},
        {label: '繁体', value: 'tw'}
      ]
    }
  },
  methods: {
    changeLanguage () {
      this.dialogStatus = !this.dialogStatus
    },
    check () {
      this.$nextTick(() => {
         this.$i18n.set(this.value)
      })
      this.dialogStatus = false
    }
  },
  components: {
    login,
    XDialog,
    Radio
  }
}
</script>

<style>
  @import "common/css/mint.css";
#app {
  font-family: 'Avenir', Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-align: center;
  color: #2c3e50;
  margin-top: 60px;
}
</style>

最后给你们来张演示图

相关文章
相关标签/搜索