• 国际化全部整理


    新增il8n文件夹

    包括:

    • lang文件夹
    • i18n.js

    lang文件夹

    • en.js ---- 英文
    • ja.js ---- 日文
    • zh.js ---- 中文
    • index.js //导出文件
    import elementJaLocale from 'element-ui/lib/locale/lang/ja' // elementui 的中文语言包
    const zh= {
      common:{
       'search': '搜索',  // 'search' 就是标识符
      } 
    }
    export zh
    
    import elementEnLocale from 'element-ui/lib/locale/lang/en'  // elementui 的英文语言包
    const en = {
      common:{
       'search': 'Search',
      }
    }
    export en
    
    import elementZhLocale from 'element-ui/lib/locale/lang/zh-CN' // elementui 的中文语言包
    const ja= {
      common:{
       'search': '検索',
      }
    }
    export ja
    
    
    index.js文件夹
    import en from './en'
    import zh from './zh'
    import ja from './ja'
    export default {
      zh,
      en,
      ja
    }
    
    
    i18n.js  
    
    import Vue from 'vue'
    import locale from 'element-ui/lib/locale'
    import VueI18n from 'vue-i18n'
    import messages from './langs'
    import { getLocalLang } from "@/utils/auth"   //获取存储在本地的语言
    import { getBrowserLang } from '@/utils/index' //获取浏览器转换后的语言
    Vue.use(VueI18n)
    const i18n = new VueI18n({
      locale: getLocalLang() || getBrowserLang((navigator.language || navigator.browserLanguage).toLowerCase()),
      messages,
      silentTranslationWarn: true
    })
    locale.i18n((key, value) => i18n.t(key, value)) //重点:为了实现element插件的多语言切换  en-us  ja-jp
    export default i18n
    
    
    getLocalLang :
    //国际化 
    const lang = "HLT_INTERNATION_LANGUAGE"
    export function getLocalLang() {
      return localStorage.getItem(lang)
    }
    export function setLocalLang(cache) {
      return localStorage.setItem(lang, cache)
    }
    export function removeLocalLang(cache) {
      return localStorage.removeItem(lang)
    }
    
    
    
    getBrowserLang :  //此处如果不转,后期读取会有问题
    /**
         * @method 转换浏览器语言
         * @param  {String} val  浏览器的语言 【zh-cn、en-us、en-US、ja-jp】
         * @return {String} 转换后的语言
    */
    export function getBrowserLang(val) {
      switch (val) {
        case 'zh-cn':
          val = 'zh'
          break;
        case 'en-us' || 'en-US':
          val = 'en'
          break;
        case 'ja-jp':
          val = 'ja'
          break;
      }
      return val;
    }
    
    /**
         * @method 导航、菜单国际化
         * @param  {String}   title 标题数据
         * @return {String}  返回 国际化后的数据
    */
    
    

    具体使用:

    导航、菜单国际化

    • 新增generateTitle.js文件
    • 在需要地方使用该函数
      • 导入该函数
      • 新建空函数 generateTitle
      • 在需要的地方使用即可 {{ generateTitle(item.meta.title) }}
    generateTitle.js
    
    export function generateTitle(title) {
      // console.log('title===>', title);
      // $te这个方法用以判断需要翻译的key在你提供的语言包(messages)中是否存在
      const hasKey = this.$te('route.' + title)
    
      if (hasKey) {
        // $t :this method from vue-i18n, inject in @/lang/index.js
        const translatedTitle = this.$t('route.' + title)
    
        return translatedTitle
      }
      return title
    }
    
    

    下拉框,表格中的特殊类型国际化

    • 对下拉或者表格特殊类型转换函数,使用国际化进行转换
      • 在main.js中导出Vue函数
      • 对不同类型进行转换
    导出Vue函数
    const vue = new Vue({
      el: '#app',
      router,
      store,
      i18n,
      render: h => h(App)
    })
    
    export default vue
    
    
    formatTable.js中导入Vue函数
    import myThis from "@/main"
    const IsinCludeList = [null, undefined, '']
    
    /**
    * @method 性别格式化
    * @param  {Object} row 表格的一行数据
    * @param  {Object} myThis Vue的实例
    * @return {String} 名称
    */
    function sexFormat(row) {
      sexList.forEach(item => {  //sexList 是本地数组,可参考前面的博客
        switch (item.dictValue) {
          case '0':
            item.dictName = myThis.$t('baseData.male');
            break;
          case '1':
            item.dictName = myThis.$t('baseData.female')
            break;
        }
        return sexList
      })
      if (IsinCludeList.includes(row.sex)) return
      const obj = sexList.find(
        e => e.dictValue === row.sex.toString()
      )
      return obj == null ? '' : obj.dictName
    }
    

    计算因为国际化导致的错位问题

    因为这个属于全局性的,所以再vuex设置

    import { setLocalLang, getLocalLang } from "@/utils/auth"
    import context from "@/main" // 获取Vue实例
    import { getBrowserLang } from '@/utils/index'
    const state = {
      lang: getLocalLang() || getBrowserLang((navigator.language || navigator.browserLanguage).toLowerCase()),
      labelWidth: ''
    }
    const mutations = {
      SET_NEW_LANGUAGE: (state, command) => {
        switch (command.toLowerCase()) {
          case 'zh':
            context.$i18n.locale = 'zh'
            state.lang = 'zh'
            setLocalLang(state.lang)
            break;
          case 'en':
            context.$i18n.locale = 'en'
            state.lang = 'en'
            setLocalLang(state.lang)
            break;
          case 'ja':
            context.$i18n.locale = 'ja'
            state.lang = 'ja'
            setLocalLang(state.lang)
            break;
        }
      },
      /**
         * @method 计算form表单labelWidth国际化后宽度
         * @param  {cnLang}  中文的内容宽度
         * @param  {otherLang}  日语与英语的内容宽度
         * @return {String}  labelWidth 宽度
    */
      GET_LABEL_WIDTH: (state, val) => {
        if (val === undefined) {
          val = {}
        }
        if (state.lang === 'ja' || state.lang === 'en') {
          console.log('11111111111');
          state.labelWidth = val.otherLang || '190px'
        } else if (state.lang === 'zh') {
          state.labelWidth = val.cnLang || '120px'
        }
        console.log('state.labelWidth==>', state.labelWidth);
      }
    }
    const actions = {
      modifyLang({ commit }, view) {
        commit('SET_NEW_LANGUAGE', view)
        commit('GET_LABEL_WIDTH', view)
      }
    }
    export default {
      namespaced: true,
      state,
      mutations,
      actions
    }
    
    
    //具体页面使用:
    this.$store.commit('transfer/GET_LABEL_WIDTH',)
    this.$store.commit('transfer/GET_LABEL_WIDTH', { cnLang: '140px', otherLang: '210px' }) //修改默认宽度
    
    form表单的labelWidth 则通过 vuex的mapGetters去获取计算
    

    每次登陆页面自动根据存储的语言去修改语言

        // 页面挂在的时候读取语言
        readLocalLanguage() {
          let lang = getLocalLang() || (navigator.language || navigator.browserLanguage).toLowerCase()
          switch (lang) {
            case 'zh-cn':
              lang = 'zh'
              break;
            case 'en-us' || 'en-US':
              lang = 'en'
              break;
            case 'ja-jp':
              lang = 'ja'
              break;
          }
          this.$store.dispatch('transfer/modifyLang', lang)
        }
    

    手动修改语言

        chooseLanguage(val) {
          switch (val) {
            case 'zh-cn':
              val = 'zh'
              break;
            case 'en-us':
              val = 'en'
              break;
            case 'ja-jp':
              val = 'ja'
              break;
          }
          this.$store.dispatch('transfer/modifyLang', val)
        },
    

    本文来自博客园,作者:云霄紫潭,转载请注明原文链接:https://www.cnblogs.com/0520euv/p/15250343.html

  • 相关阅读:
    剑指offer--26.顺时针打印矩阵
    剑指offer--25.二叉树的镜像
    剑指offer--24.树的子结构
    剑指offer--23.合并两个排序的链表
    剑指offer--22.反转链表
    剑指offer--21.链表中倒数第k个结点
    剑指offer--20.矩形覆盖
    剑指offer--19.重建二叉树
    剑指offer--18.从尾到头打印链表
    剑指offer--17.第一个只出现一次的字符
  • 原文地址:https://www.cnblogs.com/0520euv/p/15250343.html
Copyright © 2020-2023  润新知