vue+elementui-国际化(vue-i18n)

本文详细介绍了如何在Vue项目中实现多语言配置,包括安装vue-i18n,创建语言文件夹,配置语言文件,引入i18n到main.js,Vue组件内引用i18n,以及添加语言切换功能。同时,还提供了纯js文件引用i18n的两种方法,确保项目中的文本都能进行国际化处理。

1、安装

npm install vue-i18n --save

2、创建多语言配置(vue-i18n)相应文件夹

  1. 在src目录下创建language文件夹(文件夹名可自定义,建议使用language);

|——src
|——|——languege
|——|——|——index.js
|——|——|——en.js
|——|——|——zh.js

  1. /src/language/index.js内容如下
import Vue from "vue";
import VueI18n from "vue-i18n";
//引入自定义语言配置
import developZh from './zh';
import developEn from './en';
//引入UI框架语言配置---elementui
import locale from 'element-ui/lib/locale'; 
import enLocale from 'element-ui/lib/locale/lang/en';
import zhLocale from 'element-ui/lib/locale/lang/zh-CN';
Vue.use(VueI18n);
const i18n = new VueI18n({
 locale: localStorage.lang || "zh",
 messages: {
   'zh': {
     ...developZh,
     ...zhLocale
   },   // 中文语言包
   'en': {
     ...developEn,
     ...enLocale
   }   //英文语言包
 }
});
locale.i18n((key, value) => i18n.t(key, value))
export default i18n;
  1. /src/language/zh.js内容如下—(本人习惯按照职责划分,这里的结构可按照自己的习惯来)
/**
* 修改zh.js文件后,应将修改或新增的自动同步到en.js
* zh.js 和 en.js 字段数量应一致,如不熟悉字段使用范围,应尽量新增字段,避免修改现有字段
* **/
export default {
 lang: {
   action: {
     // 动作类
     add:"新增",
     edit:"编辑"
    },
   description: {
     // 描述类
     Welcome:'欢迎您!'
     },
   message: {
     // 返回提示类
    },
   contentTips: {
     // 页面提示信息:
     uploadFirst:'请先上传文件!'
     }
  }
}
  1. /src/language/en.js内容如下
/**
* 修改enjs文件后,应将修改或新增的自动同步到zh.js
* zh.js 和 en.js 字段数量应一致,如不熟悉字段使用范围,应尽量新增字段,避免修改现有字段
* **/
export default {
 lang: {
   action: {
     // 动作类
     add:"add",
     edit:"edit"
    },
   description: {
     // 描述类
     Welcome:'Welcome',
     },
   message: {
     // 返回提示类
    },
   contentTips: {
     // 页面提示信息:
     uploadFirst:'Please upload the import file first'
     }
  }
}

3、在main.js引入i18n(language文件夹)

import i18n from './language'

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

4、vue页面引用i18n

按照常规模式引用即可

1、dom部分

<span>{{$t("lang.action.add")}}XXXXXXXX</span>

2、js部分

 methods: {
   function( val ){
      return  this.$t('lang.contentTips.uploadFirst');
   }
}

5、添加多语言切换功能

  1. 在vue文件中添加操作功能
<template>
       <el-select v-model="language" @change="changeLang" class="changeLangstyle">
           <el-option
             v-for="item in languageList"
             :key="item"
             :label="item"
             :value="item">
           </el-option>
         </el-select>
</template>
<script>
export default {
 name: 'CommonHeader',
 data(){
   return {}
 },
 created() {
   if (this.$i18n.locale == 'en') {
     this.language= this.$t('lang.description.ToEnglish')
   }else{
     this.language= this.$t('lang.description.ToChinese'); }
 },
 computed: {
   languageList: function () {
     return [this.$t('lang.description.ToChinese'),this.$t('lang.description.ToEnglish')]  }
 },
 methods: {
   changeLang( val ){
     let locale = this.$i18n.locale;
     if(val==this.$t('lang.description.ToEnglish')){
       locale === 'zh' ? this.$i18n.locale = 'en' : this.$i18n.locale = 'zh';
       localStorage.lang=this.$i18n.locale;
       this.language= this.$t('lang.description.ToEnglish');
     }else if(val==this.$t('lang.description.ToChinese')){
       locale === 'zh' ? this.$i18n.locale = 'en' : this.$i18n.locale = 'zh';
       localStorage.lang=this.$i18n.locale;
       this.language= this.$t('lang.description.ToChinese');
     }
   }
 }
}
</script>

6、纯js文件引用i18n

在前后端分离项目中,对于js文件里的文字进行国际化,常规的引用Vue是不可行的
1、第一种方式:在main.js中把Vue对象赋值给一个变量

//main.js中的vue实例赋给变量-----vm
window.vm = new Vue({
 el: "#app",
 i18n,
 router,
 store,
 template: "<App/>",
 components: {App},
 ready: function () {
 }
});
//js代码中修改如下----- window.vm变量
 MessageBox.confirm(
      window.vm.$t('authentication.failed.message'), 
      window.vm.$t('authentication.failed.confirmLogout'),  
     {  
         confirmButtonText: window.vm.$t('authentication.failed.reLogin'),
         cancelButtonText: window.vm.$t('authentication.failed.cancel'),
         type: 'warning'
      }
  )

2、第一种方式:传递相应的字符串,页面渲染使用----router.js国际化
router中定义前端页面的调用信息,一般左侧导航或者首部导航会直接引用,显示信息因此可通过传递字符串的方式渲染至vue页面

  • router.js文件
  {
    path: "/tools",
    name: "tools",
    component: Layout,
    redirect: "/layout/tools",
    children: [
      {
        path: "/layout/tools",
        name: "tools",
        component: Tools,
        // 'lang.description.tasks'-------语言包中对应位置结构,
        meta: {title: 'lang.description.tasks', icon: 'el-icon-tickets'},
      },
      {
        path: "/layout/tools/file",
        name: "exportfile",
        component: DefaultModel,
          // 'lang.action.export'-------语言包中对应位置结构,
        meta: {title: 'lang.action.export', icon: 'el-icon-location'},
        hidden: true
      }
    ]
  • sidebar.vue文件

<template>
 <div v-if="!item.hidden">
   <template v-if="hasOneShowingChild(item.children,item) && (!onlyOneChild.children||onlyOneChild.noShowingChildren)&&!item.alwaysShow">
     <app-link v-if="onlyOneChild.meta" :to="resolvePath(onlyOneChild.path)">
       <el-menu-item :index="resolvePath(onlyOneChild.path)" :class="{'submenu-title-noDropdown':!isNest}">
        // 此处渲染的路由信息,onlyOneChild.meta.title-----路由变量,取得路由变量中存的字符串
         <item :icon="onlyOneChild.meta.icon||(item.meta&&item.meta.icon)" :title="$t(onlyOneChild.meta.title)" />
       </el-menu-item>
     </app-link>
   </template>

   <el-submenu v-else ref="subMenu" :index="resolvePath(item.path)" popper-append-to-body>
     <template slot="title">
     //此处渲染的路由信息,item.meta.title-----路由变量,取得路由变量中存的字符串
       <item v-if="item.meta" :icon="item.meta && item.meta.icon" :title="$t(item.meta.title)" />
     </template>
     <sidebar-item
       v-for="child in item.children"
       :key="child.path"
       :is-nest="true"
       :item="child"
       :base-path="resolvePath(child.path)"
       class="nest-menu"
     />
   </el-submenu>
 </div>
</template>
<think>好的,我现在需要帮助用户解决在Vue3和Element Plus中如何校验电话号码和邮箱的问题。首先,我得回顾一下用户的问题,确保我理解正确。用户想要在他们的表单中对电话号码和邮箱字段添加校验规则,使用Vue3和Element UI Plus。 接下来,我需要考虑用户可能的场景。他们可能正在开发一个需要用户输入联系信息的表单,比如注册页面或联系方式表单。电话号码和邮箱是常见的需要验证的字段,确保用户输入的数据符合格式要求,减少无效数据。 然后,我需要回忆Element Plus的表单校验机制。Element Plus使用的是async-validator库,通过定义rules数组来指定每个字段的校验规则。每个规则可以包含required、validator、pattern、trigger等属性。 对于电话号码的校验,通常需要考虑不同的国家/地区的格式,但一般情况下,用户可能只需要简单的校验,比如长度、数字组成,或者更复杂的正则表达式。可能需要提供一个通用的正则,比如11位数字,以1开头,或者包含区号等。这里需要权衡严格性和灵活性,避免过于复杂的正则影响用户体验。 邮箱的校验相对标准一些,可以使用常见的正则表达式来验证格式。但要注意,完全符合RFC标准的正则可能会很复杂,通常使用一个较为宽松但足够有效的正则即可。例如,检查是否有@符号,域名部分是否有.等。 接下来,我需要考虑用户可能的深层需求。比如,是否需要对不同地区的电话号码进行不同的校验?用户是否希望实时校验(在输入时触发)还是提交时触发?是否需要自定义错误提示信息?根据常见情况,默认使用blur触发可能比较合适,但提供示例让用户可以根据需要调整trigger。 另外,用户可能需要处理异步校验的情况,比如检查电话号码是否已被注册。这可能需要调用后端API,但用户的问题中没有提到这一点,所以可能暂时不需要,但可以作为扩展建议提及。 然后,我需要组织代码示例,确保语法正确,并符合Vue3的组合式API风格。在示例中展示如何定义data中的rules对象,以及如何在模板中使用ElFormItem的prop和rules属性。 还需要注意一些常见的陷阱,比如正则表达式的正确性,以及如何处理可选字段(如果字段不是必填,是否需要调整required规则)。例如,如果电话号码是可选的,那么required应该设置为false,或者在validator中处理空值的情况。 最后,要确保回答结构清晰,分步骤说明,让用户能够逐步理解和实现校验规则。同时,提供解释说明每个部分的作用,帮助用户更好地定制自己的校验逻辑。</think>以下是在 Vue3 + Element Plus 中实现电话号码和邮箱校验的完整解决方案,包含详细校验规则和最佳实践: --- ### 一、基础校验规则(模板+逻辑) ```vue <template> <el-form :model="form" :rules="rules" label-width="120px"> <!-- 电话号码 --> <el-form-item label="手机号码" prop="phone"> <el-input v-model="form.phone" placeholder="请输入11位手机号" /> </el-form-item> <!-- 邮箱 --> <el-form-item label="电子邮箱" prop="email"> <el-input v-model="form.email" placeholder="请输入邮箱" /> </el-form-item> </el-form> </template> <script setup> import { reactive } from 'vue'; const form = reactive({ phone: '', email: '' }); const rules = reactive({ phone: [ { required: true, message: '手机号不能为空', trigger: 'blur' }, { pattern: /^(?:(?:\+|00)86)?1[3-9]\d{9}$/, message: '请输入有效的11位手机号码', trigger: 'blur' } ], email: [ { required: true, message: '邮箱不能为空', trigger: 'blur' }, { type: 'email', message: '请输入有效的邮箱地址', trigger: ['blur', 'change'] } ] }); </script> ``` --- ### 二、校验规则详解 #### 1. 手机号码校验 **推荐正则**: ```js /^(?:(?:\+|00)86)?1[3-9]\d{9}$/ ``` - ✅ 支持国际格式:`+8613912345678` 或 `008613912345678` - ✅ 支持常规手机号:`13912345678` - ❌ 排除无效号段:`191`(虚拟运营商)、`162`(物联网号段)等 **参数说明**: ```js { pattern: /.../, // 正则表达式 message: '错误提示', trigger: 'blur' // 触发时机(建议blur避免频繁触发) } ``` #### 2. 邮箱校验 **Element Plus 内置类型**: ```js { type: 'email', ... } // 使用内置邮箱校验规则 ``` 内置规则支持: - ✅ 标准格式:`name@domain.com` - ✅ 子域名:`user@mail.domain.com` - ✅ 特殊字符:`user.name+tag@example.com` --- ### 三、增强型校验方案(自定义校验函数) #### 1. 带国际区号的电话号码校验 ```js const validatePhone = (rule, value, callback) => { if (!value) return callback(new Error('手机号不能为空')); const reg = /^(?:\+?86)?1[3-9]\d{9}$/; // 简化的国际版 if (!reg.test(value)) { callback(new Error('格式错误:支持+86或11位手机号')); } else { callback(); } }; // 规则配置 phone: [ { validator: validatePhone, trigger: 'blur' } ] ``` #### 2. 复杂邮箱校验(包含禁用域名) ```js const bannedDomains = ['example.com', 'test.com']; const validateEmail = (rule, value, callback) => { const emailReg = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/; if (!emailReg.test(value)) { return callback(new Error('邮箱格式错误')); } const domain = value.split('@')[1]; if (bannedDomains.includes(domain)) { return callback(new Error('该邮箱域名不可用')); } callback(); }; // 规则配置 email: [ { validator: validateEmail, trigger: 'blur' } ] ``` --- ### 四、最佳实践建议 1. **触发时机选择**: - 常规字段建议使用 `trigger: 'blur'` - 需要实时反馈的字段可添加 `trigger: 'change'` 2. **错误提示优化**: ```js message: () => { return this.$i18n.t('validation.phone') // 国际化场景 } ``` 3. **异步校验示例**: ```js const checkPhoneUnique = async (rule, value) => { if (!value) return; const { data } = await axios.get('/check-phone', { params: { phone: value } }); if (!data.available) { throw new Error('该手机号已被注册'); } }; phone: [ { validator: checkPhoneUnique, trigger: 'blur' } ] ``` --- ### 五、完整功能扩展 建议配合以下功能使用: ```vue <!-- 在 el-form 标签添加 --> ref="formRef" :validate-on-rule-change="false" <!-- 避免规则变更时自动校验 --> @validate="handleValidate" <!-- 监听校验事件 --> ``` 可通过 `formRef.validate()` 手动触发整体表单验证。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值