Локализация
Библиотека не заводит свой i18n-стек: локаль, словари и хранение выбора остаются за приложением. Три языка в поставке.
Пакет не навязывает приложению отдельный i18n-стек и не создаёт свой инстанс. Локаль, запасная локаль, хранение выбранного языка и объединение словарей — работа приложения; библиотека лишь спрашивает у него перевод по ключу.
Как это работает
- Компонент запрашивает строку по ключу вида
gr.pagination.prev. - Есть перевод — используется он.
- Слой не подключён или вернул сам ключ — компонент берёт встроенный запасной текст.
Третий шаг важнее, чем кажется: отсутствие перевода не ломает интерфейс. Пакет можно подключать поэтапно, а часть служебных строк вынести в словари позже — компоненты продолжат работать по-английски.
Что в поставке
Библиотека везёт словари трёх языков: английский, испанский и русский. Все три полные — состав ключей сверяется гейтом пакета, а не глазами.
Портал, который вы читаете, говорит на двух языках, а библиотека — на трёх. Расхождение не ошибка: испанский словарь ядра полон и работоспособен, документации на испанском просто ещё нет.
Подключение
Рекомендуемый слой — @feugene/fint-i18n: он объявлен необязательной
peer-зависимостью и хорошо ложится на подход, где приложение владеет всем. Если
в проекте уже есть зрелый i18n, пакет встраивается и в него.
import { createFintI18n } from '@feugene/fint-i18n/core'
import { installI18n } from '@feugene/fint-i18n/vue'
import { GRANULARITY_I18N_BLOCK, en, ru } from '@feugene/granularity/i18n'
const i18n = createFintI18n({
locale: 'ru',
fallbackLocale: 'en',
loaders: [en, ru],
})
i18n.registerBlocks([GRANULARITY_I18N_BLOCK])
await i18n.loadUsedBlocks('ru')
// Без этого пакет не найдёт инстанс через provide/inject
// и останется на встроенных текстах.
installI18n(app, i18n)Подпуть @feugene/granularity/i18n отдаёт блок gr, ленивые загрузчики en,
es, ru и ключ адаптера с типами. Загрузчики по локалям — именно то, что
нужно в бою: бандлер вытряхивает неиспользуемые языки. Агрегат всех локалей
сразу лежит отдельно, в @feugene/granularity/i18n/all, и предназначен для
демо, e2e и инструментов.
Пакеты-спутники
У каждого спутника свой блок строк — grChrono, GR_MEDIA_I18N_BLOCK и так
далее, — и подключаются они в тот же инстанс, рядом с основным:
import { GRANULARITY_I18N_BLOCK, en as coreEn, ru as coreRu } from '@feugene/granularity/i18n'
import { GR_CHRONO_I18N_BLOCK, en, ru } from '@feugene/granularity-chrono/i18n'
const i18n = createFintI18n({ locale: 'ru', fallbackLocale: 'en', loaders: [coreEn, coreRu, en, ru] })
i18n.registerBlocks([GRANULARITY_I18N_BLOCK, GR_CHRONO_I18N_BLOCK])Один i18n-слой на всё приложение — и продуктовые экраны, и дизайн-система.
Что не приходит из словарей
Календарь, время и относительные даты берут из Intl всё, что зависит от
локали: названия месяцев и дней недели, первый день недели, порядок разбора
даты, выбор 12- или 24-часового формата. Словарь несёт только строки интерфейса
— подписи, aria-label, заголовки панелей.
Практическое следствие: компоненты дат говорят на всех языках, которые знает движок, а не на трёх перечисленных.
Переопределение строк
Менять подписи, кнопки, aria-label и служебные сообщения нужно в словаре
приложения, а не форком пакета. Так терминология остаётся под единым
контролем, а обновление библиотеки не превращается в разбор конфликтов.
Смена языка и провайдер
GrConfigProvider принимает проп locale, но это просьба к адаптеру
переключиться, а не источник истины: провайдер локаль не хранит и не
подменяет. Сам адаптер отдаётся вниз через фасад, а не значением, — поэтому
адаптер, созданный асинхронно (обычная загрузка локали), доедет до компонентов,
когда появится, а подмена адаптера при смене языка перерисует строки. См.
конфигурацию.