DEV Community

loading...

Fork of class-validator with support multi-language (typescript)

ILshat Khamitov
coding...
・3 min read

Allows use of decorator and non-decorator based validation. Internally uses validator.js to perform validation. Class-validator works on both browser and node.js platforms.

Installation

npm install class-validator-multi-lang --save

Differences from the original project:

🤘 This feature added support to replace any validation errors

🔥 Integrations with https://crowdin.com/ for manual simplified update translates 🇨🇳 🇩🇪 🇷🇺 🇺🇸

🌎 Translations created with the machine 🤖, if you found the mistake 🐛 please add a new version of translate and write a comment in the right panel in https://crowdin.com/project/class-validator 😎

❗ The translations are inside the package, so the package size is very large, you can use the lite version without translations and add the necessary translates ones manually

Examples of usages

👶 Basic set custom messages

import { IsOptional, Equals, validator } from 'class-validator-multi-lang';

class MyClass {
  @IsOptional()
  @Equals('test')
  title: string = 'bad_value';
}

const RU_I18N_MESSAGES = {
  '$property must be equal to $constraint1': '$property должно быть равно $constraint1',
};

const model = new MyClass();

validator.validate(model, messages: RU_I18N_MESSAGES).then(errors => {
  console.log(errors[0].constraints);
  // out: title должно быть равно test
});

👦 Load from file

import { IsOptional, Equals, validator } from 'class-validator-multi-lang';
import { readFileSync } from 'fs';
import { resolve } from 'path';

class MyClass {
  @IsOptional()
  @Equals('test')
  title: string = 'bad_value';
}

const RU_I18N_MESSAGES = JSON.parse(readFileSync(resolve(__dirname, './node_modules/class-validator-multi-lang/i18n/ru.json')).toString());

const model = new MyClass();

validator.validate(model, messages: RU_I18N_MESSAGES).then(errors => {
  console.log(errors[0].constraints);
  // out: title должен быть равен test
});

🧔 Load from 2 file 💣 💥

import { IsOptional, Equals, validator } from 'class-validator-multi-lang';
import { readFileSync } from 'fs';
import { resolve } from 'path';

class MyClass {
  @IsOptional()
  @Equals('test')
  title: string = 'bad_value';
}

const RU_I18N_MESSAGES = JSON.parse(
  readFileSync(resolve(__dirname, './node_modules/class-validator-multi-lang/i18n/ru.json')).toString()
);

const FR_I18N_MESSAGES = JSON.parse(
  readFileSync(resolve(__dirname, './node_modules/class-validator-multi-lang/i18n/fr.json')).toString()
);

const model = new MyClass();

validator.validate(model, { messages: RU_I18N_MESSAGES }).then(errors => {
  console.log(errors[0].constraints);
  // out: title должен быть равен test

  validator.validate(model, { messages: FR_I18N_MESSAGES }).then(errors => {
    console.log(errors[0].constraints);
    // out: title doit être égal à test
  });
});

🤴 With override

import { IsOptional, Equals, validator, setClassValidatorMessages } from 'class-validator-multi-lang';

class MyClass {
  @IsOptional()
  @Equals('test')
  title: string = 'bad_value';
}

setClassValidatorMessages({
  '$property must be equal to $constraint1': '$property должно быть равно $constraint1',
});

const model = new MyClass();

validator.validate(model).then(errors => {
  console.log(errors[0].constraints);
  // out: title должно быть равно test
});

🔢 With change property name

import { IsOptional, Equals, ClassPropertyTitle, validator } from 'class-validator-multi-lang';

class MyClass {
  @IsOptional()
  @Equals('test')
  @ClassPropertyTitle('property "title"')
  title: string = 'bad_value';
}

const RU_I18N_MESSAGES = {
  '$property must be equal to $constraint1': '$property должно быть равно $constraint1',
};
const RU_I18N_TITLES = {
  'property "title"': 'поле "заголовок"',
};

const model = new MyClass();

validator.validate(model, { messages: RU_I18N_MESSAGES, titles: RU_I18N_TITLES }).then(errors => {
  console.log(errors[0].constraints);
  // out: поле "заголовок" должно быть равно test
});

🔢 With change target name

import { IsOptional, Equals, ClassPropertyTitle, validator } from 'class-validator-multi-lang';

@ClassTitle('object "MyClass"')
class MyClass {
  @IsOptional()
  @Equals('test')
  title: string = 'bad_value';
}

const RU_I18N_MESSAGES = {
  '$property must be equal to $constraint1': '$property в $target должно быть равно $constraint1',
};
const RU_I18N_TITLES = {
  'object "MyClass"': 'объекте "МойКласс"',
};

const model = new MyClass();

validator.validate(model, { messages: RU_I18N_MESSAGES, titles: RU_I18N_TITLES }).then(errors => {
  console.log(errors[0].constraints);
  // out: title в объекте "МойКласс" должно быть равно test
});

🔢 With change arguments for validation decorator

import { IsOptional, Equals, validator } from 'class-validator-multi-lang';

class MyClass {
  @IsOptional()
  @Equals('test')
  title: string = 'bad_value';
}

const RU_I18N_MESSAGES = {
  '$property must be equal to $constraint1': '$property должно быть равно $constraint1',
};
const RU_I18N_TITLES = {
  test: '"тест"',
};

const model = new MyClass();

validator.validate(model, { messages: RU_I18N_MESSAGES, titles: RU_I18N_TITLES }).then(errors => {
  console.log(errors[0].constraints);
  // out: title должно быть равно "тест"
});

🔢 With change value

import { IsOptional, Equals, validator } from 'class-validator-multi-lang';

class MyClass {
  @IsOptional()
  @Equals('test')
  title: string = 'bad_value';
}

const RU_I18N_MESSAGES = {
  '$property must be equal to $constraint1': '$property равно $value, а должно быть равно $constraint1',
};
const RU_I18N_TITLES = {
  bad_value: '"плохое_значение"',
};

const model = new MyClass();

validator.validate(model, { messages: RU_I18N_MESSAGES, titles: RU_I18N_TITLES }).then(errors => {
  console.log(errors[0].constraints);
  // out: title равно "плохое_значение", а должно быть равно test
});

Links

class-validator-multi-lang - Github repository of this fork.

class-validator - Github repository of original package.

Discussion (0)