【vue+vue-i18n插件】实现vue项目中英文切换

了解一款插件,看文档很重要
文档地址请戳这里,跳转Vue I18n官方文档

当vue项目中需要中英文切换,借助插件去实现,没有很难的技术

一、安装

npm install vue-i18n

二、全局引入,在main.js中引入

import Vue from 'vue'   //一般main.js中都有这一行
import VueI18n from 'vue-i18n'
import enLocale from 'element-ui/lib/locale/lang/en'   //导入element-ui的英文文件
import cnLocale from 'element-ui/lib/locale/lang/zh-CN'  //导入element-ui的中文文件
Vue.use(VueI18n)
const i18n=new VueI18n({
    locale:localStorage.getItem('languageSet')||'zh',  
     //从localStorage里获取用户中英文选择,
    没有则默认中文,一定要有默认语言,
    不然新设备访问的时候,localStorage中没有值就会出现bug
    messages:{
        'zh': {
          ...require('./components/lang/zh'),
          ...cnLocale
        },
        'en': {
          ...require('./components/lang/en'),
          ...enLocale
        }
    }
})
//element官方方法 //为了实现element插件的多语言切换
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),
})

三、src目录下新建lang文件夹,在zh.js 、en.js文件中编写需要变化的数据,zh.js和en.js内容,key一定要对应,在页面上可以直接使用js中定义的数据
en.js

export default {
  role: {
    roleCode: 'RoleCode',
    roleName: 'RoleName',
    createDate: 'CreateDate',
    roleType: 'RoleType',
    roleDesc: 'RoleDesc'
  }
}

zh.js

export default {
  role: {
    roleCode: '角色编码',
    roleName: '角色名称',
    createDate: '创建时间',
    roleType: '角色类型',
    roleDesc: '角色描述',
   
  },
 
}

**

ps : index.js用不到,可不考虑,仅供自己复习用

**
在这里插入图片描述

index.js

import Vue from 'vue'
import VueI18n from 'vue-i18n'
import Cookies from 'js-cookie'
//引入element 自带的语言包
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 elementEsLocale from 'element-ui/lib/locale/lang/es'// element-ui lang
//引入自己创建的语言包
import enLocale from './en'
import zhLocale from './zh'
import esLocale from './es'

Vue.use(VueI18n)

const messages = {
  en: {
    ...enLocale,
    ...elementEnLocale
  },
  zh: {
    ...zhLocale,
    ...elementZhLocale
  },
  es: {
    ...esLocale,
    ...elementEsLocale
  }
}
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

四、在页面中开始使用

      <div class="switchLag">
        <svg-icon class="switchIcon" v-show="language == 'en_US'" class-name="英文" icon-class="英文" @click="changeLage('en')"></svg-icon>
        <svg-icon class="switchIcon" v-show="language == 'zh_CN'" class-name="中文" icon-class="中文" @click="changeLage('zh')"></svg-icon>
      </div>  

.switchLag {
  .switchIcon {
    margin-top: 10px;
    width: 30px;
    height: 30px;
    cursor: pointer;
  }
}


  language: this.$store.state.user.language,

i18n 是在main.js中VueI18n变量的实例对象
locale 是 i18n 设置的默认语言
zh en 是设置的语言变量

  // 中英文切换
    changeLage(v) {
      if (v == 'en') {
        this.$i18n.locale = 'zh'
        //因为切换语言的关系,可以将语言标识保存在localStorage中,
        记得一点就是一定要有默认语言,不然新设备访问的时候,localStorage中没有值就会出现bug
        localStorage.setItem('languageSet', this.$i18n.locale)
        this.language = 'C'
      } else {
        this.language = 'E'
        this.$i18n.locale = 'en'
        localStorage.setItem('languageSet', this.$i18n.locale)
      }
      const data = {
        userId: xxx.userId,
        language: this.language,
        userName: xxx.name,
        nickName: xxx.nickName,
        // 中英文(中文C  英文N)
      }
      setLanguage(data).then(res => {    
      this.language = res.data.language
      })
   
    },

五、使用en.js中定义的数据

            <el-input
              v-model="modelName"
              :placeholder="$t('flowModel.name')"
              clearable
              size="small"
              prefix-icon="el-icon-search"
              style="margin-bottom: 10px"
              class="filter-item"
           
            >
            </el-input>
          <el-table-column :label="$t('role.id')" prop="id" 
          align="center">
            <template slot-scope="scope">
              <span>{{ scope.row.id }}</span>
            </template>
          </el-table-column>
          <el-table-column :label="$t('role.roleCode')" prop="roleCode" 
          align="center">
            <template slot-scope="scope">
              <span>{{ scope.row.roleCode}}</span>
            </template>
          </el-table-column>
          <el-table-column :label="$t('role.RoleName')" prop="RoleName" 
          align="center" width="160">
            <template slot-scope="scope">
              <span>{{ scope.row.RoleName}}</span>
            </template>
          </el-table-column>
          <el-table-column :label="$t('role.createDate')" prop="createDate" 
          align="center">
            <template slot-scope="scope">
              <span>{{ getNickName(scope.row.createDate) }}</span>
            </template>
          </el-table-column>
          <el-table-column :label="$t('role.roleDesc')" prop="roleDesc" 
          align="center">
            <template slot-scope="scope">
              <span>{{ scope.row.roleDesc }}</span>
            </template>
          </el-table-column>

六、 关于language: this.$store.state.user.language,language的值要存到vuex中,每次登录获取到用户信息后,要从里面拿这个language的值

state:{
    language:''

},
mutations:{
    SET_LANGUAGE: (state, name) => {
      state.language = name
    },
},
actions:{
   // 获取用户信息
    GetInfo({ commit, state }) {
      return new Promise((resolve, reject) => {
        getInfo(state.token)
          .then(res => { 
   const user = res.user
       commit('SET_LANGUAGE', user.language)
 })
          .catch(error => {
            reject(error)
          })
      })
    },

}
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue2中实现全局中英文切换可以通过以下步骤进行: 1. 创建语言文件:首先,创建两个语言文件,一个用于存储中文文本,另一个用于存储英文文本。可以使用JSON格式来存储键值对,其中键表示页面上的文本标识符,值表示对应的中英文文本。 例如,中文语言文件(zh.json)可以如下所示: ```json { "welcome": "欢迎", "hello": "你好" } ``` 英文语言文件(en.json)可以如下所示: ```json { "welcome": "Welcome", "hello": "Hello" } ``` 2. 创建语言切换组件:在Vue中,可以创建一个语言切换组件,用于显示当前的语言,并提供切换语言的功能。 ```vue <template> <div> <span>当前语言: {{ currentLanguage }}</span> <button @click="toggleLanguage">切换语言</button> </div> </template> <script> export default { data() { return { currentLanguage: '中文', }; }, methods: { toggleLanguage() { // 切换语言逻辑 }, }, }; </script> ``` 3. 实现语言切换逻辑:在语言切换组件的`toggleLanguage`方法中,可以通过改变当前语言的值来实现中英文切换。可以使用Vue的全局事件总线来实现组件之间的通信。 在`main.js`中,可以创建一个全局事件总线对象,并将其挂载到Vue的原型上: ```javascript // main.js import Vue from 'vue'; Vue.prototype.$bus = new Vue(); ``` 然后,在语言切换组件中,通过`this.$bus.$emit`方法触发一个自定义事件,表示切换语言的动作: ```vue <script> export default { methods: { toggleLanguage() { this.$bus.$emit('toggle-language'); }, }, }; </script> ``` 在需要切换语言的组件中,通过`this.$bus.$on`方法监听这个自定义事件,并在回调函数中进行语言切换的逻辑: ```vue <script> export default { created() { this.$bus.$on('toggle-language', this.changeLanguage); }, beforeDestroy() { this.$bus.$off('toggle-language', this.changeLanguage); }, methods: { changeLanguage() { // 切换语言逻辑 }, }, }; </script> ``` 4. 在语言切换逻辑中,可以使用Vue的全局混入(mixin)功能来实现对所有组件的文本进行替换。 在语言切换逻辑中,可以根据当前语言加载对应的语言文件,并将其存储在Vue的原型上: ```javascript // main.js import Vue from 'vue'; import zh from './zh.json'; import en from './en.json'; Vue.prototype.$languages = { zh, en, }; ``` 然后,在语言切换逻辑中,可以通过`Vue.mixin`方法全局混入一个`languageMixin`,用于替换组件中的文本: ```javascript // main.js import Vue from 'vue'; Vue.mixin({ computed: { language() { return this.$languages[this.currentLanguage]; }, }, methods: { t(key) { return this.language[key] || key; }, }, }); ``` 最后,在需要显示文本的组件中,可以使用`this.t`方法来获取对应的文本,例如: ```vue <template> <div> <span>{{ t('welcome') }}</span> <span>{{ t('hello') }}</span> </div> </template> <script> export default { // ... }; </script> ``` 现在,当点击语言切换按钮时,触发切换语言的动作,然后所有使用了`this.t`方法的组件中的文本会根据当前语言进行替换,从而实现全局中英文切换
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值