@letar/forms

Интернационализация

Локализация меток полей, ошибок валидации и опций

Обзор

@letar/forms/i18n предоставляет полную поддержку интернационализации: локализованные метки, сообщения об ошибках валидации и опции выбора.

Настройка

import { FormI18nProvider } from '@letar/forms/i18n'

const translations = {
  en: {
    fields: {
      name: 'Full Name',
      email: 'Email Address',
    },
    validation: {
      required: 'This field is required',
      min: 'Must be at least {min} characters',
    },
  },
  ru: {
    fields: {
      name: 'Полное имя',
      email: 'Электронная почта',
    },
    validation: {
      required: 'Обязательное поле',
      min: 'Минимум {min} символов',
    },
  },
}

function App() {
  return (
    <FormI18nProvider locale="ru" translations={translations}>
      <MyForm />
    </FormI18nProvider>
  )
}

Локализация опций

Используйте useLocalizedOptions для перевода опций select:

import { useLocalizedOptions } from '@letar/forms/i18n'

const options = useLocalizedOptions([
  { value: 'active', label: { en: 'Active', ru: 'Активный' } },
  { value: 'inactive', label: { en: 'Inactive', ru: 'Неактивный' } },
])

Перевод ошибок Zod

Создайте кастомную карту ошибок для сообщений валидации:

import { createFormErrorMap } from '@letar/forms/i18n'

const errorMap = createFormErrorMap({
  too_small: ({ minimum }) => `Минимум ${minimum} символов`,
  too_big: ({ maximum }) => `Максимум ${maximum} символов`,
  invalid_string: ({ validation }) => {
    if (validation === 'email') return 'Некорректный email'
    return 'Некорректный формат'
  },
})

Constraint Hints

Подсказки из Zod constraints (например "Minimum 2 characters") автоматически переводятся на основе locale в FormI18nProvider:

// Английский (по умолчанию)
<Form schema={schema}>...</Form>
// → "Minimum 2 characters"

// Русский
<FormI18nProvider locale="ru">
  <Form schema={schema}>...</Form>
</FormI18nProvider>
// → "Минимум 2 символа"

Встроенные переводы: English, Русский. Для других языков передайте constraintHints в провайдер.

On this page