Локализация в библиотеке FAST Element строится вокруг идеи отделения текстового содержимого и культурных настроек от логики и визуальной структуры компонента. Такой подход позволяет использовать один и тот же компонент в разных языковых и региональных контекстах без модификации исходного кода.
FAST Element не навязывает конкретный механизм локализации, но предоставляет удобный слой абстракции через биндинги и реактивность. Текстовые ресурсы обычно выносятся в отдельные словари, а компоненты получают доступ к этим данным через свойства, контекст или DI-контейнер.
Реактивное обновление позволяет переключать язык динамически: при изменении локали компонент автоматически перерисовывает привязанные текстовые узлы и атрибуты.
Словари часто организуются в виде простых объектов:
{
ru: {
greeting: "Здравствуйте",
dateFormat: "DD.MM.YYYY"
},
en: {
greeting: "Hello",
dateFormat: "MM/DD/YYYY"
}
}
Ключи отражают смысловые единицы: приветствие, подписи полей, сообщения об ошибках, сообщения интерфейса. Желательно избегать в словарях конкретных текстов, завязанных на визуальный контекст или порядок элементов. Это различие облегчает повторное использование словарей.
Компонент получает доступ к словарю через свойство
locale или контекст. Внутри шаблона текст подставляется с
помощью биндинга:
<span>${x => x.t("greeting")}</span>
Метод t() выполняет поиск по активному словарю и
возвращает строку. При изменении локали реактивность FAST инициирует
обновление привязанного узла.
FAST предоставляет механизм контекста, который позволяет объявить локаль на уровне корневого приложения и унаследовать её всеми дочерними компонентами. Такой подход исключает необходимость передавать параметры локали вручную вниз по дереву.
Контекст локали может определять:
Многие строки требуют подстановок: количества, имен, дат. Обработка таких строк выполняется через шаблонные функции:
notifications: "{count} новых уведомлений"
Компонент передает значения при вызове t():
x.t("notifications", { count: x.count })
Подстановка может сопровождаться форматированием чисел через
Intl.NumberFormat, что обеспечивает корректное отображение
размера, разделителей и знаков в зависимости от языка и региона.
FAST не реализует форматирование самостоятельно, но тесно работает с
Intl.* API браузера. Типичные случаи включают:
Intl.DateTimeFormat для дат и времени;Intl.NumberFormat для чисел, валют и процентов;Intl.RelativeTimeFormat для относительных
интервалов;Intl.PluralRules для согласования множественного
числа.Сочетание PluralRules с параметризованными строками
обеспечивает корректный выбор формы слова:
ru:
notifications_zero: "Нет уведомлений"
notifications_one: "{count} уведомление"
notifications_few: "{count} уведомления"
notifications_many: "{count} уведомлений"
Правило выбирается на основе результата PluralRules.
Локализация не ограничивается видимым текстом. В компонентах
присутствуют aria-метки, заголовки, атрибуты alt,
placeholder, title. Все эти элементы также
должны выводиться через словарь.
<input
placeholder=${x => x.t("searchPlaceholder")}
aria-label=${x => x.t("searchAriaLabel")}
/>
Соблюдение этого правила повышает доступность и делает компонент пригодным для международных приложений.
Чтобы переключение языка происходило без перезагрузки, контейнер локали реализует событие изменения. Компоненты подписываются на это событие автоматически через реактивность FAST. После изменения локали:
Динамическое переключение особенно важно для SPA-интерфейсов.
В крупных приложениях словари загружаются по требованию. Такой подход снижает размер начального bundles и ускоряет загрузку. FAST-компоненты совместимы с отложенной загрузкой, если метод получения словаря возвращает Promise. После разрешения Promise инициируется обновление компонента.
async t(key) {
const dict = await this.getDictionaryForLocale(this.locale);
return dict[key];
}
Тестирование включает следующие аспекты:
Псевдолокализация применяется для выявления срезания текста, переполнений, неверных ширин контейнеров и неподдерживаемых символов.
Словари могут быть неполными. Распространенная стратегия — вывод fallback-текста или логирование предупреждений. Нельзя использовать пустые строки или молчаливые пропуски, поскольку они ведут к трудноуловимым дефектам интерфейса.
Локализация включает не только язык. Сюда относится форматирование дат, валют, единиц измерения, написание имен, порядок обращения, сортировка. Такие аспекты выносятся в отдельные вспомогательные функции или классы, которые зависят от локали. Компонент остается универсальным и не знает о конкретных форматах.
Компоненты с пользовательскими слотами должны учитывать, что вложенный контент может быть локализован пользователем. Важно избегать коллизий: компонент локализует только свои собственные участки, оставляя слоты внешнему коду. Такой подход снижает связывание и повышает гибкость.
Сообщения об ошибках обычно зависят от данных. Форматирование ошибок строится на параметризации шаблонов и выборе формы слова. Валидационные сообщения помещаются в отдельный раздел словаря или в отдельный словарь валидации, что позволяет менять формулировки без изменения логики.
В многоязычных системах сервер может предоставлять данные уже в нужной локали. Компонент должен уметь сочетать серверные данные и собственные словари. Например, сервер может отдать отформатированные даты или уже локализованные сообщения. В таких случаях компонент избегает повторной локализации.
Intl для форматирования.Систематическое соблюдение этих практик обеспечивает универсальность компонентов FAST Element и делает их пригодными для масштабных международных приложений.