Настройка языковых параметров

Система сообщений об ошибках в Validator.js построена на принципе разделения логики валидации и представления результата. Каждое правило валидации возвращает код ошибки, который затем преобразуется в человекочитаемое сообщение через слой локализации.

Такой подход позволяет:

  • отделить бизнес-логику от текстового представления ошибок
  • поддерживать множественные языки без изменения ядра библиотеки
  • централизованно управлять формулировками сообщений
  • адаптировать формат сообщений под конкретный интерфейс

Основой языковой системы выступает словарь сообщений, где каждому правилу сопоставляется строковый шаблон.


Структура сообщений об ошибках

Сообщения в Validator.js обычно представляют собой строковые шаблоны с параметрами подстановки.

Типовая структура:

{
  required: "Поле обязательно для заполнения",
  email: "Некорректный формат email",
  min: "Значение должно быть не меньше :min",
  max: "Значение должно быть не больше :max",
  length: "Длина должна быть равна :length"
}

Плейсхолдеры вида :min, :max, :length используются для динамической подстановки значений из правил валидации.

При выполнении проверки:

validator.min(5)

сообщение преобразуется в:

"Значение должно быть не меньше 5"

Базовая система локалей

Validator.js поддерживает концепцию языковых пакетов (locales), представляющих собой набор словарей.

Пример структуры локали:

const ruLocale = {
  messages: {
    required: "Поле обязательно",
    email: "Некорректный email",
    min: "Минимальное значение :min"
  }
};
const enLocale = {
  messages: {
    required: "The field is required",
    email: "Invalid email format",
    min: "Minimum value is :min"
  }
};

Переключение между локалями осуществляется через конфигурацию валидатора или глобальные настройки.


Глобальная настройка языка

Глобальная локализация применяется ко всем экземплярам валидаторов в рамках приложения.

import Validator from "validatorjs";
import ruLocale from "./locales/ru";

Validator.setMessages("ru", ruLocale.messages);
Validator.useLang("ru");

После установки активного языка все ошибки начинают возвращаться в заданной локали.

Механизм глобальной локализации особенно эффективен в одностраничных приложениях, где единый язык интерфейса определён на уровне системы.


Локальная настройка сообщений

Для изолированных сценариев возможно переопределение сообщений на уровне конкретной валидации.

const data = { email: "" };

const rules = {
  email: "required|email"
};

const messages = {
  "required.email": "Email должен быть указан",
  "email.email": "Неверный формат email"
};

const validation = new Validator(data, rules, messages);

Формат ключей:

{rule}.{field}

Такая схема позволяет детально управлять текстами ошибок для каждого поля независимо от глобальной локали.


Приоритет сообщений

При генерации текста ошибки соблюдается иерархия:

  1. локальные сообщения (переданные в экземпляр)
  2. сообщения текущей локали
  3. сообщения по умолчанию (fallback)

Если сообщение отсутствует на одном уровне, происходит переход к следующему.


Интерполяция значений в сообщениях

Система шаблонов поддерживает подстановку параметров из правил.

Поддерживаемые типы плейсхолдеров:

  • :min
  • :max
  • :size
  • :value
  • :attribute

Пример:

{
  between: "Значение должно быть между :min и :max"
}

При валидации:

validator.between(10, 20)

Результат:

"Значение должно быть между 10 и 20"

Механизм интерполяции реализуется на этапе постобработки результата валидации.


Поддержка множественных языков

Validator.js не ограничивает количество подключаемых локалей. Каждый языковой пакет регистрируется под уникальным ключом.

Validator.setMessages("ru", ruLocale.messages);
Validator.setMessages("kz", kzLocale.messages);
Validator.setMessages("en", enLocale.messages);

Переключение осуществляется динамически:

Validator.useLang("kz");

При смене языка все последующие проверки используют обновлённый словарь сообщений без пересоздания валидаторов.


Динамическая смена языка

В системах с пользовательскими настройками языка возможна смена локали в рантайме.

Поведение системы при смене языка:

  • текущие экземпляры валидаторов сохраняют правила
  • сообщения пересобираются при следующем вызове errors
  • новые экземпляры сразу используют активную локаль

Это позволяет интегрировать Validator.js в интерфейсы с переключением языка без перезагрузки приложения.


Интеграция с i18n-системами

Validator.js может работать совместно с внешними библиотеками интернационализации, такими как i18next или аналогичными системами.

Подход интеграции:

  • сообщения в Validator.js заменяются ключами i18n
  • реальный текст извлекается из внешнего хранилища переводов

Пример:

const messages = {
  required: "validation.required",
  email: "validation.email"
};

Далее интерпретация происходит через i18n:

i18next.t("validation.required");

Такой подход централизует управление текстами и исключает дублирование переводов.


Пользовательские словари сообщений

Для специализированных приложений возможно создание расширенных словарей.

Пример кастомной локали:

const customLocale = {
  messages: {
    required: "Обязательное поле не заполнено",
    numeric: "Допустимы только числа",
    email: "Email указан некорректно",
    url: "Некорректный URL адрес"
  },
  attributes: {
    email: "Электронная почта",
    password: "Пароль"
  }
};

Раздел attributes используется для подстановки читаемых названий полей в сообщения:

"Поле Электронная почта обязательно"

Формирование сообщений с атрибутами

Подстановка имён полей осуществляется через плейсхолдер :attribute.

Пример:

{
  required: ":attribute обязательно для заполнения"
}

Результат:

"Пароль обязательно для заполнения"

Если атрибут не задан, используется имя поля из данных модели.


Поведение при отсутствии локализации

Если запрашиваемая локаль отсутствует:

  • используется локаль по умолчанию (обычно en)
  • при отсутствии ключа сообщения применяется системный fallback
  • при полном отсутствии словаря возвращается технический текст ошибки

Такая стратегия предотвращает появление пустых или неинформативных сообщений в интерфейсе.


Расширение языковой системы

Языковая система Validator.js допускает расширение через добавление новых правил и их сообщений.

Пример нового правила:

Validator.register(
  "startsWithA",
  (value) => value.startsWith("A"),
  "Значение должно начинаться с A"
);

Для локализации:

Validator.setMessages("ru", {
  startsWithA: "Значение должно начинаться с буквы A"
});

Каждое новое правило требует явного добавления перевода в соответствующие языковые пакеты.


Поведение при комбинированных правилах

При использовании цепочек правил:

email|required|min:5

сообщения формируются независимо для каждого нарушенного правила, после чего агрегируются в список ошибок поля.

Структура результата:

email:
  - "Поле обязательно"
  - "Некорректный email"

Локализация применяется к каждому сообщению отдельно, без влияния на порядок выполнения правил.