@application-kit/i18n
@application-kit/i18n
Локали, словари и плагин vue-i18n для SSR-приложений на Vue.js и серверный резолв локали запроса. Пакет не знает
языков продукта, его словарей и реестра модулей: набор локалей, каркасный словарь и словари модулей приходят
параметрами.
Установка
yarn add @application-kit/i18n
Peer-зависимости: vue, vue-i18n — экземпляр у приложения один.
Входы
| Вход | Для чего | Тянет |
|---|---|---|
@application-kit/i18n |
изоморфно: набор локалей, тип словаря, сборка словаря, тип перевода | ничего (типы vue-i18n) |
@application-kit/i18n/vue |
клиент и SSR-рендер: плагин, доступ к локали и переводу, cookie выбора | vue, vue-i18n |
@application-kit/i18n/server |
сервер: локаль запроса | ничего |
@application-kit/i18n/testing |
спеки потребителя: перевод по словарю без vue-i18n |
ничего |
Импорт любого входа не имеет побочных эффектов и не требует окружения: состояние плагина заводится на установке в приложение, а не на загрузке модуля.
Корень
defineLocales(locales, fallback)— набор{ locales, fallback, isSupported }; тип локали выводится из литерального кортежа, запасная локаль вне списка не компилируется.isSupported(value: unknown)— проверка значения, пришедшего снаружи (cookie, заголовок, профиль).LocaleDictionary<L>— половины словаря одного поставщика по локалям;LocaleMessages— одна половина.composeMessages(dictionaries, locales)— словарь приложения: каркас первым, модули за ним, поздний перекрывает ранний.TranslateFunction—(key, named?) => string, формаtизuseI18n(): перевод для кода вне компонентов.DictionaryProviderInterface<L>— контракт модуля, несущего свой словарь (getDictionary()).
export const localeSet = defineLocales(['ru', 'en'], 'ru')
export type AppLocale = (typeof localeSet.locales)[number]
Vue.js
app.use(new I18nPlugin({
localeSet,
messages: frameworkMessages,
// Вызывается в контексте приложения: `inject` доступен, реестр модулей приложение достаёт само.
moduleDictionaries: () => collectModuleDictionaries(inject(MODULE_REGISTRY, undefined)),
}))
I18nPlugin— ставитvue-i18n(Composition API), стартовая и запасная локаль —localeSet.fallback.collectModuleDictionaries(registry)— словари модулей реестра в порядке регистрации. Реестр структурный: достаточноgetModules(); словарь берётся у модуля с методомgetDictionary.setLocale(app, locale),getLocaleReference(app),getTranslate(app)— локаль и перевод конкретного экземпляра приложения для кода вне компонентов. Состояние хранится поApp(WeakMap), а не в модуле: на сервере модуль живёт между запросами, и язык одного пользователя не доезжает до другого.writeLocaleCookie(locale, { name, maxAgeSeconds? })— запоминает выбор языка для следующего запроса:Path=/,SameSite=Lax, год по умолчанию, безHttpOnly(cookie пишет браузер, значение не секрет).
Сервер
resolveLocale(request, { localeSet, cookieName })— локаль запроса: профиль (request.user.locale) → cookie →Accept-Languageс весамиq(q=0отклоняет язык,ru-RU— этоru) →localeSet.fallback. Испорченное значение любого источника читается как «предпочтения нет». Запрос описан структурно (LocaleRequestInterface) — подходит запрос Fastify с@fastify/cookieи без привязки к фреймворку.
Тесты потребителя
createFakeTranslate(dictionary, defaultLocale)— фабрика(locale = defaultLocale) => TranslateFunctionдля спек кода, который принимаетtзависимостью. Фейк, а не заглушка: ходит в настоящий словарь, подставляет именованные строки и числа ({name}), на отсутствующий ключ бросаетTypeError— опечатка в ключе валит спеку, а не проходит как «какой-то текст вернулся».
export const fakeTranslate = createFakeTranslate(messages, localeSet.fallback)
useUserListActions({ translate: fakeTranslate() })
Related Packages
@i18n-micro/utils
Framework-agnostic utilities for Nuxt I18n Micro (granular subpath imports).
66,657
251
vue-i18n-lite
A super lightweight and minimal plugin that introduces internationalization into...
9,012
14
Version History
| Version | Released | Vue | License |
|---|---|---|---|
| 0.2.0 | ^3.5.0 | MIT | |
| 0.1.0 | ^3.5.0 | MIT | |
| 0.0.0 | ^3.5.0 | MIT |
Pre-releases (1)
| Version | Released | License |
|---|---|---|
| 0.0.0-stage |