如何使用vee-validate和vue-i18n转换字段名称

时间:2018-12-26 06:15:26

标签: javascript vue.js vee-validate vue-i18n

我认为,有关将i18n与vee-validate集成的文档不完整。如果我将i18n与vee-validate一起使用,我仍然不知道如何翻译字段名称。

这是我的main.js:

import ruValidation from 'vee-validate/dist/locale/ru'
import enValidation from 'vee-validate/dist/locale/en'

Vue.use(VeeValidate, {
  i18nRootKey: 'validations',
  i18n,
  dictionary: {
    en: enValidation,
    ru: ruValidation
  },
  errorBagName: 'vErrors',
  events: ''
})

但是问题是-我该如何转换属性?我尝试过:

import attributesRU from './locales/veevalidate/ru/attributes'

  dictionary: {
    en: enValidation,
    ru: { message: ruValidation, attributes: attributesRU }
  },

attributes.js的内容:

export const attributes = {
  mail: 'Эл.почта'
}

输入:

<input type="text" name="mail" v-validate="'required|email'">

但是如果我添加,即使没有消息也无法翻译成功

ru: { message: ruValidation, attributes: attributesRU }

代替:

ru: ruValidation

3 个答案:

答案 0 :(得分:1)

我可以使用它,但是我不知道这是否是最佳解决方案。

我正在使用Laravel和generator package从php lang文件中创建翻译文件。

JS文件:

/**
 * For translations in Vue use i18n Package
 */
import VueInternationalization from 'vue-i18n';
import Locale from './vue-i18n-locales.generated';
Vue.use(VueInternationalization);
const i18n = new VueInternationalization({
    locale: 'de',
    messages: Locale
});


/**
 * Form Validation
 */
import VeeValidate from 'vee-validate';
import { ValidationProvider } from 'vee-validate';
import de from 'vee-validate/dist/locale/de';
import en from 'vee-validate/dist/locale/en';
import fr from 'vee-validate/dist/locale/fr';
Vue.use(VeeValidate, {
    i18n,
    dictionary: {
        en: {
            messages: en.messages,
            attributes: Locale.en.attributes, // I use a lang file called attributes
        },
        de: {
            messages: de.messages,
            attributes: Locale.de.attributes,
        },
        fr: {
            messages: fr.messages,
            attributes: Locale.fr.attributes,
        },
    },
});

要更改JS中的语言环境,请使用

i18n.locale = 'fr';

对于管理翻译文件,我建议使用BabelEdit

答案 1 :(得分:0)

您可以制作这样的字典

const dictionary = {
  en: {
    messages: {
      required: (field, val) => `Field ${field} is required`
    }
  },
  ru: {
    messages: {
      required: (field, val) => `поле ${field} обязательно`
    }
  },
};

export default dictionary;

您必须将其导入到组件中,然后像这样添加到验证程序库中

this.$validator.localize(dictionary);

希望这可以解决您的问题。

答案 2 :(得分:0)

不看更多代码很难回答您的问题。我为您的输入元素here设置了一个有效的codeandbox。修改i18n.locale后,这将成功翻译错误消息和字段。

组件:

<input type="text" name="mail" v-validate="'required|email'" />
{{ errors.first("mail") }}

在index.js中进行设置:

import ru from "vee-validate/dist/locale/ru";
import en from "vee-validate/dist/locale/en";    
import VueI18n from "vue-i18n";

Vue.use(VueI18n);

const i18n = new VueI18n({
  locale: "ru"
});

Vue.use(VeeValidate, {
  i18n,
  dictionary: {
    ru: {
      messages: ru.messages,
      attributes: { mail: "Эл.почта" }
    },
    en: {
      messages: en.messages,
      attributes: { mail: "mail test" }
    }
  }
});