vue.js - 如何将 vee-validate v.2 与 nuxt-i18n 集成?
问题描述
我正在使用 vee-validate v.2,我想本地化错误消息。我写了一个这样的插件
import {configure} from 'vee-validate'
export default function ({app}){
configure({
defaultMessage:(field,values)=>{
values._field_=app.i18n.t(`fields.${field}`)
return app.i18n.t(`validation.${values._rule_}`,values)
}
})
}
这是 loacales/en.js
validation: {
required: "{_field_} can not be empty",
min: "{_field_} may not be Less than {length} characters",
confirmed: "{_field_} do not matches",
email: "{_field_} is not valid"
},
fields: {
email: 'Email',
password: 'Password',
userName: 'Username',
},
}
这也是 nuxt 配置中的 $i18n
i18n: {
seo: false,
locales: [
{ code: 'en', iso: 'en-US', file: 'en.js' },
{ code: 'de', iso: 'de-GER', file: 'de.js' }
],
lazy: true,
langDir: 'locales/',
baseUrl: process.env.BASE_URL,
defaultLocale: 'de'
},
解决方案
让我一步一步解释我的解决方案:
步骤 1 ) 安装所需的软件包:
npm install nuxt-i18n --save
npm install vee-validate --save
package.json
{
"@nuxtjs/i18n": "^7.0.1",
"vee-validate": "^3.4.12"
}
步骤 2 )在项目的根目录下创建一个名为/locales的文件夹。
步骤 3 )为英文创建文件/locales/en.js
import en from 'vee-validate/dist/locale/en'
export default async (context, locale) => {
return {
validation: en.messages,
email : "email",
};
}
步骤 4 )为第二语言 (Türkçe)创建文件/locales/tr.js
import en from 'vee-validate/dist/locale/tr'
export default async (context, locale) => {
return {
validation: tr.messages,
email : "e-posta",
};
}
步骤 5 ) 创建 i18n 插件文件/plugins/i18n.js
import {configure } from "vee-validate";
export default function ({app}) {
configure({
defaultMessage: (field, values) => {
return app.i18n.t(`validation.${values._rule_}`, values);
}
});
}
步骤 6 ) 创建一个验证插件文件/plugins/validate.js
import Vue from 'vue'
import { ValidationProvider, ValidationObserver, extend} from 'vee-validate';
import { required, email } from 'vee-validate/dist/rules';
Vue.component('appValidationProvider', ValidationProvider);
Vue.component("appValidationObserver", ValidationObserver);
extend("required", required);
extend("email", email);
注意:我在此示例中使用了“必需”和“电子邮件”规则,如果您想使用更多规则,您可以访问指南页面并添加到此文件中。
所有规则列表:https ://vee-validate.logaretm.com/v2/guide/rules.html
步骤 7 ) nuxt.config -> 插件配置
plugins: [
'~/plugins/i18n.js',
'~/plugins/validate.js',
],
步骤 8 ) nuxt.config -> i18n 模块配置
modules: [
['nuxt-i18n', {
baseUrl: 'https://yourdomain.com',
lazy: true,
loadLanguagesAsync: true,
locales: [
{
name: 'English',
code: 'en',
iso: 'en-US',
file: 'en.js'
},
{
name: 'Türkçe',
code: 'tr',
iso: 'tr-TR',
file: 'tr.js'
},
],
langDir: 'locales/',
defaultLocale: 'en',
vueI18n: {
fallbackLocale: 'en'
},
strategy: 'prefix_and_default',
detectBrowserLanguage: {
useCookie: true,
cookieKey: 'i18n_redirected',
alwaysRedirect: false,
fallbackLocale: 'en',
redirectOn: 'root'
},
parsePages: false,
pages: {
'contact/index': {
tr: '/iletisim',
en: '/contact'
}
}
}]
],
第 9 步)nuxt.config -> vee-validate 配置添加:
build: {
transpile: ['vee-validate/dist/rules',
'vee-validate/dist/locale/tr',
'vee-validate/dist/locale/en']
},
用法-> 页面:contact/index.vue
<template>
<app-validation-observer v-slot="{ handleSubmit }">
<form class="form" @submit.prevent="handleSubmit(onSubmit)">
<app-validation-provider rules="required|email" v-slot="{ errors }">
<input type="text" :name="$t('email')" v-model="formData.email">
<span class="is-invalid">{{ errors[0]}}</span>
<button>Test</button>
</app-validation-provider>
</form>
</app-validation-observer>
</template>
<script>
export default {
name: "contact",
data() {
return {
formData: {
email: ''
}
}
},
methods: {
onSubmit() {
console.log('form posted :)');
}
}
}
</script>
<style scoped>
.is-invalid {
color: red;
}
</style>
推荐阅读
- html - 我们如何在 CSS Grid 中使用 shape-outside 属性?
- php - Laravel 雄辩的两个表的组合
- python-3.x - 如何获得漂亮的汤 get_text() 以考虑段落标签的行距
- mobile - 当设备小于断点大小时,Bootstrap 5 隐藏列
- python - 我想让卡片响应。但在 django
- elasticsearch - 在 AWS Elasticsearch Service 上汇总可用性?
- php - 如何动态计算laravel中动态嵌套数组的数量
- python - 抑制python中的弃用
- jmeter - Jmeter-将文件从服务器(使用 ssh sftp)传输到本地
- javascript - 如何根据下拉列表制作搜索功能