Библиотека Yup предоставляет встроенный механизм локализации сообщений ошибок валидации. Это позволяет адаптировать текст ошибок под разные языки интерфейса без изменения бизнес-логики схем.
Каждое стандартное правило валидации в Yup использует текстовые сообщения по умолчанию, которые могут быть переопределены глобально или локально для конкретных схем.
Основной механизм управления языковыми сообщениями реализуется через
setLocale.
import * as Yup from 'yup';
Yup.setLocale({
mixed: {
required: 'Обязательное поле',
notType: 'Неверный тип данных',
},
string: {
min: 'Минимальная длина ${min} символов',
max: 'Максимальная длина ${max} символов',
},
number: {
min: 'Значение должно быть не меньше ${min}',
max: 'Значение должно быть не больше ${max}',
}
});
setLocale${min},
${max}, ${path})Глобальные настройки могут быть переопределены внутри конкретной схемы:
const schema = Yup.object({
username: Yup.string()
.required('Введите имя пользователя')
.min(3, 'Слишком короткое имя'),
});
Такой подход используется, когда требуется:
В приложениях с поддержкой нескольких языков часто требуется менять язык интерфейса без перезагрузки.
const locales = {
ru: {
mixed: { required: 'Обязательное поле' },
string: { min: 'Минимум ${min} символа' }
},
en: {
mixed: { required: 'Required field' },
string: { min: 'Minimum ${min} characters' }
}
};
function applyLocale(lang) {
Yup.setLocale(locales[lang]);
}
После вызова setLocale новые схемы будут использовать
обновлённые сообщения. Уже созданные схемы сохраняют предыдущие
значения, если сообщения были зафиксированы в момент создания.
В реальных приложениях Yup часто используется совместно с библиотеками интернационализации, такими как i18next.
import i18n from 'i18next';
import * as Yup from 'yup';
Yup.setLocale({
mixed: {
required: () => i18n.t('validation.required')
},
string: {
min: ({ min }) => i18n.t('validation.min', { min })
}
});
Yup поддерживает передачу параметров в функции сообщений:
Yup.string()
.min(5, ({ min, path }) =>
`${path} должен содержать минимум ${min} символов`
);
Доступные параметры:
path — имя поляvalue — текущее значениеmin, max — ограниченияoriginalValue — исходное значениеВ сложных объектах с вложенной структурой локализация применяется ко всем уровням:
const schema = Yup.object({
user: Yup.object({
name: Yup.string().required(),
profile: Yup.object({
age: Yup.number().min(18)
})
})
});
При использовании setLocale сообщения автоматически
распространяются на вложенные схемы без дополнительных настроек.
Иногда требуется менять язык в зависимости от состояния приложения:
function createSchema(lang) {
const messages = {
ru: 'Обязательное поле',
en: 'Required field'
};
return Yup.object({
email: Yup.string().required(messages[lang])
});
}
Такой подход применяется, когда глобальная локализация нежелательна.
При отсутствии перевода Yup не выбрасывает ошибку, а использует:
setLocaleЭто позволяет безопасно внедрять новые языки постепенно.
При использовании TypeScript локализация сообщений не влияет на типизацию схем, но важно учитывать:
stringИспользование функций в setLocale может влиять на
производительность при массовой валидации:
Баланс достигается смешанным подходом: статические сообщения + функции только там, где необходим динамический текст.
Часто локализация выносится в отдельные модули:
export const yupRu = {
mixed: {
required: 'Обязательное поле'
}
};
export const yupEn = {
mixed: {
required: 'Required field'
}
};
И затем подключается централизованно:
Yup.setLocale(yupRu);
Если язык меняется во время работы формы:
Можно расширять стандартные сообщения под бизнес-логику:
Yup.addMethod(Yup.string, 'cyrillicOnly', function (message) {
return this.matches(/^[а-яА-Я]+$/, message);
});
И использовать локализованные тексты:
Yup.string().cyrillicOnly('Только кириллица');
При серверной валидации важно:
Это обеспечивает единообразие ошибок между клиентом и сервером при использовании Yup-схем как общего контракта валидации.