Localization

Available since v1.4.0.

js-validation ships with built-in support for multiple languages. Error messages are loaded from locale files and resolved at runtime based on the lang option you pass to the validator.

Built-in Locales

LanguageCodeFile
Englishensrc/locales/en.js
Spanishessrc/locales/es.js

All built-in locales are automatically registered when you import the full bundle:

import jsValidation from '@phpdevsr/js-validation';

Setting the Active Language

Pass the lang option when initialising the validator:

const validator = jsValidation('#my-form', {
  lang: 'es'
});

If lang is omitted, it defaults to 'en'.

Fallback Behaviour

When a message key is missing from the active locale, the validator falls back to English (en). If the English key is also absent, the method-level default message ('Please fix this field.') is used instead.

Resolution order:

  1. Custom message in options.messages
  2. Active locale (options.lang)
  3. English locale (en) as fallback
  4. Method default message

Message Types

Locale messages are plain strings or functions:

// Static string
required: 'This field is required.'

// Dynamic string (receives the rule param as first argument)
minlength: (param) => `Please enter at least ${param} characters.`

// Multi-param (e.g. range uses an array/JSON)
range: (param) => {
  const bounds = Array.isArray(param) ? param : JSON.parse(param);
  return `Please enter a value between ${bounds[0]} and ${bounds[1]}.`;
}

All Built-in Message Keys

KeyParamDescription
requiredField is required
emailMust be a valid email
minlengthnumberMinimum character count
maxlengthnumberMaximum character count
range[min, max]Value within a numeric range
patternMust match a regex pattern
equalToMust equal another field
notEqualToMust differ from another field
numericOnly numeric values
urlMust be a valid URL
dateMust be a valid date
dateISOMust be a valid ISO date (YYYY-MM-DD)
ipv4Must be a valid IPv4 address
ipv6Must be a valid IPv6 address
alphaOnly alphabetic letters
alphanumericLetters, numbers, and underscores only
maxfilesnumberMaximum number of files
maxsizestringMaximum file size
maxsizetotalstringMaximum total file size
ishexcolorMust be a valid hex color
timeMust be a valid time (HH:MM or HH:MM:SS)

Adding a Custom Locale

Step 1 – Create the locale file

Create src/locales/<lang>.js (replace <lang> with your language code):

// src/locales/fr.js
export const fr = {
  required: 'Ce champ est obligatoire.',
  email: 'Veuillez entrer une adresse e-mail valide.',
  minlength: (param) => `Veuillez entrer au moins ${param} caractères.`,
  maxlength: (param) => `Veuillez entrer au plus ${param} caractères.`,
  range: (param) => {
    const bounds = Array.isArray(param) ? param : JSON.parse(param);
    return `Veuillez entrer une valeur entre ${bounds[0]} et ${bounds[1]}.`;
  },
  pattern: 'Veuillez respecter le format demandé.',
  equalTo: 'Veuillez entrer la même valeur.',
  notEqualTo: 'Veuillez entrer une valeur différente.',
  numeric: 'Veuillez entrer uniquement des valeurs numériques.',
  url: 'Veuillez entrer une URL valide.',
  date: 'Veuillez entrer une date valide.',
  dateISO: 'Veuillez entrer une date ISO valide (AAAA-MM-JJ).',
  ipv4: 'Veuillez entrer une adresse IPv4 valide.',
  ipv6: 'Veuillez entrer une adresse IPv6 valide.',
  alpha: 'Veuillez entrer uniquement des lettres.',
  alphanumeric: 'Veuillez entrer uniquement des lettres, chiffres et tirets bas.',
  maxfiles: (param) => `Veuillez sélectionner au plus ${param} fichiers.`,
  maxsize: (param) => `Veuillez sélectionner des fichiers ne dépassant pas ${param}.`,
  maxsizetotal: (param) => `La taille totale ne doit pas dépasser ${param}.`,
  ishexcolor: 'Veuillez entrer une couleur hexadécimale valide (ex. #fff ou #ffffff).',
  time: 'Veuillez entrer une heure valide (HH:MM ou HH:MM:SS).'
};

Step 2 – Register it in src/locales.js

// src/locales.js
import { en } from './locales/en.js';
import { es } from './locales/es.js';
import { fr } from './locales/fr.js'; // ← add

export const locales = { en, es, fr }; // ← add to object

export { en, es, fr }; // ← named re-export

Step 3 – Use it

const validator = jsValidation('#my-form', { lang: 'fr' });

Runtime Registration (without modifying source)

You can register a locale at runtime without touching the source files. Useful when consuming the published package:

import jsValidation from '@phpdevsr/js-validation';

jsValidation.addLocaleMessages('de', {
  required: 'Dieses Feld ist erforderlich.',
  email: 'Bitte geben Sie eine gültige E-Mail-Adresse ein.',
  // ... all other keys
});

const validator = jsValidation('#my-form', { lang: 'de' });

The low-level API is also available via VanillaValidator:

import { VanillaValidator } from '@phpdevsr/js-validation';

VanillaValidator.addLocaleMessages('de', { /* messages */ });

Per-Field Custom Messages

Locale messages can be overridden per field via options.messages. These take the highest priority:

jsValidation('#my-form', {
  lang: 'es',
  rules: {
    confirmPassword: { required: true, equalTo: '#password' }
  },
  messages: {
    confirmPassword: { equalTo: 'Las contraseñas no coinciden.' }
  }
});

You only need to define keys that differ from the fallback locale. Missing keys resolve to English or the method default.