首页 > 其他分享 >vue-cli以及element-ui国际化实战(待完善-切换时不刷新页面)

vue-cli以及element-ui国际化实战(待完善-切换时不刷新页面)

时间:2023-02-02 23:55:56浏览次数:49  
标签:vue zh cli locale element en i18n import name

步骤

创建 language文件夹

  1. 在src同级的目录下新建language文件夹,新增三个文件,代码如下
    index.js
import Vue from 'vue'
import VueI18n from 'vue-i18n'
Vue.use(VueI18n)

// 引入各个语言配置文件
import zh from './zh'
import en from './en'

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

// 创建i18n实例
const i18n = new VueI18n({
  // 设置默认语言
  locale: window.localStorage.getItem('lang') || 'zh', // 语言标识
  // 添加多语言(每一个语言标示对应一个语言文件)
  messages: {
    zh: {
      ...cnLocale,
      ...zh,
    },
    en: {
      ...enLocale,
      ...en,
    },
  },
})

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

en.js

const en = {
  name: 'name',
  nameRequire: 'please input name',
}

export default en

zh.js

const zh = {
  name: '姓名',
  nameRequire: '请输入姓名',
}

export default zh

项目入口文件引入上面的index文件

main.js


import 'element-ui/lib/theme-chalk/index.css'
import ElementUI from 'element-ui'
Vue.use(ElementUI)
import i18n from './language'

new Vue({
  i18n,
  router,
  store,
  render: (h) => h(App),
}).$mount('#app')

vue文件

index.vue

<template>
  <div>
    <el-pagination
      :page-sizes="[100, 200, 300, 400]"
      :page-size="100"
      layout="total, sizes, prev, pager, next, jumper"
      :total="400"
    >
    </el-pagination>
    <button @click="changeLangue">点击切换语言</button>
    <my-form v-bind="formConfig" v-model="formData"></my-form>
  </div>
</template>

<script>
import MyForm from '@/components/form'
import formConfig from './form-config'

import i18n from '@/language'
export default {
  components: {
    MyForm,
  },
  data() {
    return {
      formData: {},
      formConfig,
    }
  },
  methods: {
    changeLangue() {
      const currentLang = i18n.locale
      if (currentLang == 'zh') {
        i18n.locale = 'en'
      } else {
        i18n.locale = 'zh'
      }
      console.log(i18n.t('name'))
    },
  },
}
</script>

form-config.js

import i18n from '@/language'
const formConfig = {
  formItems: [
    {
      type: 'input',
      prop: 'name',
      label: i18n.t('name'),
      placeholder: i18n.t('nameRequire'),
    },
  ],
  labelWidth: '120px',
}

export default formConfig

components/form

<template>
  <div class="form">
    <el-form ref="formRef" :model="formData" :label-width="labelWidth">
      <el-form-item
        v-for="(item, index) in formItems"
        :key="index"
        :label="item.label"
        :prop="item.prop"
        :rules="item.rules"
      >
        <template v-if="item.type == 'input'">
          <el-input
            v-model="formData[item.prop]"
            :placeholder="item.placeholder"
          ></el-input>
        </template>
        <template v-else-if="item.type == 'select'">
          <el-select
            v-model="formData[item.prop]"
            :placeholder="item.placeholder"
          >
            <el-option
              v-for="option in item.options"
              :key="option.value"
              :label="option.label"
              :value="option.value"
            >
            </el-option>
          </el-select>
        </template>
        <template v-else-if="item.type == 'date'">
          <el-date-picker
            v-model="formData[item.prop]"
            type="date"
            placeholder="选择日期"
            value-format="yyyy-MM-dd"
          >
          </el-date-picker>
        </template>
      </el-form-item>
    </el-form>
  </div>
</template>

<script>
export default {
  name: 'MyForm',
  // 自定义组件上使用v-model
  //   1. 定义model。  2. 需要将model中prop值同时在props中定义
  //   父组件通过v-model指令绑定值时会将数据传递给子组件中的modelValue,子组件通过触发"update:modelValue"事件可以通知父组件
  model: {
    prop: 'modelValue',
    event: 'update:modelValue',
  },
  props: {
    modelValue: Object,
    formItems: {
      type: Array,
      required: true,
    },
    labelWidth: {
      type: String,
    },
  },
  data() {
    return {
      formData: {},
    }
  },
  emits: ['update:modelValue'],
  created() {
    // 表单初始化
    for (let item of this.formItems) {
      this.$set(this.formData, item.prop, '')
    }
    this.$emit('update:modelValue', this.formData)
  },
  watch: {
    formData: {
      handler(newValue) {},
      deep: true,
    },
  },
}
</script>

参考

https://juejin.cn/post/6922708116165361671

标签:vue,zh,cli,locale,element,en,i18n,import,name
From: https://www.cnblogs.com/it774274680/p/17087768.html

相关文章

  • xib起冲突 StartTag: invalid element name
    <欢迎大家加入iOS开发学习交流群:QQ529560119>首先要表明下心态,代码已经推到到了项目分支,跑步起来xib点不开,双击就报错line:XX StartTag:invalidelementname,感觉真的挂了......
  • 看到发狂的moveElement函数中的字符串拼接
    vartimer=setTimeout("moveEleme('"+eleID+"',"+leftMar+","+topMar+","+interval+")",interval)这是我调用时候传的参数:moveEleme("test",20......
  • vue实现自定义v-loading指令
    实现dom节点的局部loading效果,效果如element-ui的v-loading。实现代码:loading.js,其中@/components/loadingComponent/index.vue为自定义的一个loading组件,可自行实现。......
  • element-ui栅格系统之margin为负值的情况总结
    1.前言在css布局中margin是一个使用频率比较高的属性,通常我们都是赋值为正数,但是在使用element-ui的栅格系统时,我们经常会发现源码中有使用margin-left和margin-right为负......
  • vue脚手架的使用
    打开创建好的vue项目,点开src可以看到下面:assets是用来放图片的目录components用于放vue组件文件router用于放路由文件main.js是项目开始走的路口,一般不用修改:import......
  • vue脚手架的安装
    安装脚手架基于npm命令下面,因此需要先安装node.js前面,前面安装elementui里面有介绍怎么安装node.jselement-ui的安装及使用-Liku007-博客园(cnblogs.com)npm管理前端......
  • VUE API接口的统一管理
    vue项目对api进行封装统一管理在日常vue项目中或刚接收一个vue项目,如果项目足够大,就需要进行统一管理和规范接口了1.js文件创建先在src目录下新建一个api文件夹,然后......
  • Could not find a declaration file for module ‘xxx‘ (vue3+ts)
    vue3+ts框架搭建过程中遇到引入三方qs库出现eslitn提示'Couldnotfindadeclarationfileformodule‘qs‘';解决方案方案1:npmi--save-dev@types/qs此处......
  • 查看ClickHouse中某个表的详情
    进入终端:sudodockerexec-itmsun-clickhouseclickhouse-client--port10000--user用户--password密码-mselect  database,  table,  formatRead......
  • bug|git 提交代码报错|vue-cli-service lint found some errors. Please fix them and
    前言git提交代码报错,使用除了参考链接里的解决方案,正好复习一下之前学习的GitHooks:错误git日志git-error-1675323308267...✖vue-cli-servicelintfounds......