首页 > 其他分享 >vue2+element-ui国际化实战不刷新页面

vue2+element-ui国际化实战不刷新页面

时间:2023-06-28 23:55:21浏览次数:43  
标签:lang en zh element ui user vue2 i18n js

背景

有的时候我们做的项目需要支持中英文切换,那么我们就需要使用到vue-i18n插件

步骤

安装以及挂载

  1. 安装vue-i18n依赖
npm i vue-i18n@8
  1. src同级的目录下创建language文件下,在language文件夹下新增3个文件(index.js,en.js,zh.js)

index.js

import Vue from "vue";
import VueI18n from "vue-i18n";
Vue.use(VueI18n);

// 引入自己应用需要支持语言配置文件
import zh from "./zh.js";
import en from "./en";

// 引入element的语言包
import ElementLocale from "element-ui/lib/locale";
import enLocale from "element-ui/lib/locale/lang/en";
import cnLocale from "element-ui/lib/locale/lang/zh-CN";

const i18n = new VueI18n({
  // 设置默认语言
  locale: window.localStorage.getItem("lang") || "cn",
  messages: {
    zh: {
      ...cnLocale,
      ...zh,
    },
    en: {
      ...enLocale,
      ...en,
    },
  },
});

ElementLocale.i18n((key, value) => i18n.t(key, value));
export default i18n;

en.js

const en = {
  // 引入自己定义的模块
};
export default en;

zh.js

const zh = {
  // 引入自己定义的模块
};
export default zh;
  1. 挂载到vue实例上
// main.js
import i18n from "./language";

new Vue({
  render: (h) => h(App),
  i18n,
}).$mount("#app");

创建语言文件

根据不同的模块在language/module下新增对应的语言文件,例如:下面针对首页以及用户页面新增home.jsuser.js

中英文都定义在一个文件上容易维护

home.js

const home = {
  // 定义中文
  zh: {
    home: "首页",
  },
  // 定义英文
  en: {
    home: "Home",
  },
};

export default home;

user.js

const user = {
  zh: {
    user_mgr: "用户管理",
  },
  en: {
    user_mgr: "User Managerment",
  },
};

export default user;

在vue中的使用

  1. 在template中的使用
  <h1>{{ $t("user.user_mgr") }}</h1>
  1. 在script标签中的使用
export default {
  data() {
    return {
      msg: this.$t("home.home"),
    };
  },
  created() {
    console.log(this.msg);
  },
};

功能1:切换中英文

<template>
  <div class="app">
    <button @click="changeLanuage">
      切换成{{ lang == "zh" ? "EN" : "中文" }}
    </button>
    <h1>{{ $t("user.user_mgr") }}</h1>
  </div>
</template>
<script>
export default {
  data() {
    return {
      msg: this.$t("home.home"),
    };
  },
  created() {
    console.log(this.msg);
  },
  computed: {
    lang() {
      return this.$i18n.locale;
    },
  },
  methods: {
    changeLanuage() {
      let setLang = "";
      if (this.lang == "zh") {
        setLang = "en";
      } else {
        setLang = "zh";
      }
      // 本地去记录选择的语言
      window.localStorage.setItem("lang", setLang);
      // 更新i18n中的语言
      this.$i18n.locale = setLang;
    },
  },
};
</script>
<style scoped></style>

不刷新页面切换中英文

  1. 在data中定义的变量直接从i18n中读取,但是没有在模板上使用,在切换中英文的时候变量的值没变
    解决办法:将data中声明的变量,换成在computed中声明。缺点:如果要更新这个变量的话,就需要设置set的方法,麻烦!!
  2. 还是在data中定义变量,vue2的话使用全局事件总线,在组件的created监听语言切换事件,监听后重新对变量赋值。切换时发射变更语言的事件
    需要在组件中频繁写监听相关代码,麻烦。
  3. 在切换语言时将语言(lang)保存到vuex中,然后组件中通过watch监听vuex中的lang,然后调用一个方法来更新组件中无法切换成对应语言的变量
    App.vue
<template>
  <div class="app">
    <button @click="changeLanuage">
      切换成{{ lang == "zh" ? "EN" : "中文" }}
    </button>
    <button @click="getVal">获取value值</button>
    <h1>{{ $t("user.user_mgr") }}</h1>
  </div>
</template>
<script>
export default {
  data() {
    return {
      msg: this.$t("home.home"),
      value: this.$t("user.user_mgr"),
    };
  },
  created() {
    // 方式2
    // this.$bus.$on("changeLanguage", () => {
    //   this.updateData();
    // });
  },
  computed: {
    lang() {
      return this.$i18n.locale;
    },
    // 方式1
    // value() {
    //   return this.$t("user.user_mgr");
    // },
  },
  methods: {
    changeLanuage() {
      let setLang = "";
      if (this.lang == "zh") {
        setLang = "en";
      } else {
        setLang = "zh";
      }
      // 本地去记录选择的语言
      window.localStorage.setItem("lang", setLang);
      // 更新i18n中的语言
      this.$i18n.locale = setLang;
      // this.$bus.$emit("changeLanguage");

      this.$store.commit("changeLang", setLang);
    },
    getVal() {
      console.log(this.value);
    },
    updateData() {
      this.value = this.$t("user.user_mgr");
    },
  },
  watch: {
    // 方式3
    "$store.state.lang"() {
      this.updateData();
    },
  },
};
</script>
<style scoped></style>

store/index.js

import Vuex from "vuex";
import Vue from "vue";
Vue.use(Vuex);

const store = new Vuex.Store({
  state() {
    return {
      lang: "zh",
    };
  },
  mutations: {
    changeLang(state, playload) {
      state.lang = playload;
    },
  },
});

export default store;

标签:lang,en,zh,element,ui,user,vue2,i18n,js
From: https://www.cnblogs.com/it774274680/p/17512855.html

相关文章

  • 图书商城Vue+Element+Node项目练习(...)
    本系列文章是为学习Vue的项目练习笔记,尽量详细记录一下一个完整项目的开发过程。面向初学者,本人也是初学者,搬砖技术还不成熟。项目在技术上前端为主,包含一些后端代码,从基础的数据库(Sqlite)、到后端服务Node.js(Express),再到Web端的Vue,包含服务端、管理后台、商城网站、小程序/App,分......
  • 瓴羊Quick BI财务报表分析工具,帮助现代企业提升财务管理水平
    财务管理,是现代企业管理的基础,也是企业内部管理的中枢。随着财务管理智能化、数字化要求的不断提升,瓴羊QuickBI等商业智能工具逐渐成为了企业财务报表分析工具的主流选择。在瓴羊QuickBI等BI工具广泛应用之前,企业的财务管理工作繁重而复杂,时效性要求又高,往往需要投入大量的专业人......
  • Arduino + GP2D12红外测距传感器
    https://ost.51cto.com/posts/1786技术规格:1.测量射程范围:10-80cm2.最大允许角度:>40°3.电源电压:4.5-5.5V4.平均功耗:33-40mA5.峰值功耗:约200mA6.更新频率/周期:25Hz/40ms7.模拟输出噪声:<200mV8.精度和采集的AD位数以及转化计算公式相关,10AD一般能达到0.1CM.9.测量距离与输......
  • arduino控制电机
    https://howtomechatronics.com/tutorials/arduino/how-to-control-stepper-motor-with-a4988-driver-and-arduino/A4988步进驱动器引脚分配现在让我们仔细看看驱动器的引脚排列,并将其与步进电机和控制器连接起来。因此,我们将从按钮右侧的2个引脚开始为驱动器供电,我们需要将......
  • 使用element-plus的el-pagination分页组件的时候怎么换中文?
    element里面的分页是英文版的,但是项目需求是要中文的,可以用el-config-provider(切换系统语言)全局的配置选项,有locale属性,用来切换语言包做法如下:在main.js引入对应的包,代码如下:1import'normalize.css/normalize.css'2importElementPlusfrom'element-plus'3import'......
  • 在element-ui视频上传使用canvas截取视频帧数,并且转为视频封面。
    <el-upload:http-request="getFile"//自定义上传action:on-change="handleFileChange"//监听文件上传ref="upload"accept="video/*"//定义格式为视频><el-butto......
  • vue-element table表格排序推拽功能
    //1.安装sortablejsnpminstallsortablejs--save//2.功能页面中引入importSortablefrom‘sortablejs’具体使用(注意:elementtable务必指定row-key,且row-key必须是唯一的,如id,不然会出现排序不对的情况)<el-tablerow-key="id":data="tableData"style="width:......
  • Docker通过build打包镜像--九五小庞
    -----------------------------------------通过build打包镜像,执行此命令需要创建Dockerfile文件,打包时,通过文件中指定的内容打包生成镜像dockerbuild-tsaas-pacs:1.1.1.运行容器dockerrun-itd-p18080:8080-p19527:9527-p18006:8006-p18007:8007-v/home/pxy/D......
  • element-ui 去除input的框
    ::v-deep{.el-input__inner{border:0;border-radius:0px;//&:focus{//border-bottom:1pxsolid#409eff;//}}.el-textarea__inner{resize:none;/*这个是去掉textarea下面拉伸的那个标志,如下......
  • java 序列化 serialVersionUID transient
    问题再现User类实现了序列化,但是没有声明版本号,这个对象放在memcache中,User新添加了1个字段后,把之前的对象从缓存中取出来时,出现了InvalidClassException,为什么会出现这个错误?序列化序列化就是将对象转为流,用于传输或保存。序列化的是“对象状态”,所以就不包括静态变量;反序列化是从......