zoukankan      html  css  js  c++  java
  • vue-i18n国际化在data中切换不起作用

    vue-i18n是一个针对于vue的国际化插件,使用非常简单,具体使用方式看我细细道来。

    实现方式

    1. 下载包
    npm install vue-i18n
    
    2. 配置

    在main.js文件中加入如下配置

    // 引入插件和语言包
    import VueI18n from 'vue-i18n'
    import zh from '@/i18n/langs/zh'
    import en from '@/i18n/langs/en'
    Vue.use(VueI18n)
    
    //实例化vue-i18n
    const i18n = new VueI18n({
    
      // 从本地存储中取,如果没有默认为中文,
      // 这样可以解决切换语言后,没记住选择的语言,刷新页面后还是默认的语言
      locale: localStorage.getItem('lang') || 'zh',
      
      messages: {
        'zh': zh, // 中文语言包
        'en': en // 英文语言包
      }
    })
    
    // 将i18n实例挂载到vue上
    new Vue({
      el: '#app',
      i18n,
      router,
      store,
      template: '<App/>',
      components: { App }
    })
    3. 创建中、英文包文件
    创建两个文件,一个为zh.js代表中文,en.js代表英文,具体内容格式如下
    //zh.js
    export default {
      nav: {
        home: '首页',
        monitor: '监控',
        analyze: '分析',
        alarm: '报警',
        maintenance: '运维',
        config: '配置',
        device: '设备',
        scada: '画面'
      },
      confirm: {
        ok: '确认',
        cancel: '取消',
        content: '你确认要退出系统吗?',
        logout: '退 出'
      },
    }
    //en.js
    export default {
      nav: {
        home: 'Home', //首页
        monitor: 'Monitor', //监控
        analyze: 'Analyze', //分析
        alarm: 'Alarm', // 报警
        maintenance: 'Maintenance', //运维
        config: 'Config', //配置
        device: 'Device', //设备
        scada: 'Scada' //画面
      },
      confirm: {
        ok: 'Logout', //退出
        cancel: 'Cancel', //取消
        content: 'Are you sure you want to quit the system?', //你确认要退出系统吗
        logout: 'Logout' //
      }
    }
    4. 在组件中使用

    我们先看vue-i18n的模板语法

    //第一种
    <span v-text="$t('nav.home')"></span>
    
    //第二种
    <span>{{$t('nav.home')}}</span>
    5. 如何切换中英文

    关于这点,vue-i18n给我们提供了一个全局变量locale,通过他我们可以查看当前使用的语言,也可以通过他改变当前使用的语言;

    具体用法:

    // 查看当前使用的语言
    console.log(this.$i18n.locale)
    
    // 改变当前使用的语言
    this.$i18n.locale = 'en'  // 将当前使用的语言切换到英文

    一般在项目中,我们会使用如下方式切换语言

    // 切换语言按钮
    <v-list-tile  @click="onChangeLang">
      <v-list-tile-title>中文 / EN</v-list-tile-title>
    </v-list-tile>
    <v-list-tile  @click="onLogOutClick">
      <v-list-tile-title >{{$t('confirm.logout')}}</v-list-tile-title>
    </v-list-tile>
    
    
    // 切换方法onChangeLang的处理, 这里的弹出框是element-ui的组件
    onChangeLang() {
      this.$confirm(this.$t('changeLang.content'), this.$t('changeLang.tip'), {
        confirmButtonText: this.$t('changeLang.ok'),
        cancelButtonText: this.$t('confirm.cancel'),
        type: 'warning'
      })
        .then(() => {
          let lang = this.$i18n.locale
          if (lang === 'zh') {
            this.$i18n.locale = 'en'
            // 对应main.js配置文件中的localStorage的get方法
            localStorage.setItem('lang', this.lang)
          } else {
            this.$i18n.locale = 'zh'
            localStorage.setItem('lang', this.lang)
          }
        })
        .catch(() => {})
    }

    可能会遇到的问题

    1. 记不住切换后的语言

    就是我们切换语言后,刷新又是默认语言,这点我们在上面已经用本地存储localStorage解决了;

    2. 将this.$t() 写到了data属性里,切换语言不起作用
    data是一次性生产的,你这么写只能是在 data 初始化的时候拿到这些被国际化的值,并不能响应变化。

    官方的解决办法是,建议我们将表达式写到computed属性里,不要写到data

    3. 后台获取过来的动态数据,在切换国际语言后不起作用

    在witch中监听 i18n语言变化,重新调取接口。

    4. 注意拷贝后数组中的数据,在切换国际化时不管用,因为浅复制只拷贝了之前没变的数据。






    部分内容摘自:
    作者:LeonWuV 来源:CSDN https://blog.csdn.net/wxl1555/article/details/85112530
  • 相关阅读:
    Spark笔记
    java.lang.ClassNotFoundException: org.apache.storm.topology.IRichSpout
    异常分类
    手动调用run方法和普通方法调用没有区别
    URI is not registered ( Setting | Project Settings | Schemas and DTDs )
    谷歌浏览器远程计算机或设备将不接受连接解决方法
    模块2复习
    day09作业01用户登录与验证
    022测试对文档进行读取与写入
    0221判断登录是否成功小程序
  • 原文地址:https://www.cnblogs.com/listen9436/p/10525532.html
Copyright © 2011-2022 走看看