@feugene/fint-i18n
@feugene/fint-i18n
Локализация для Vue 3, которая грузит только тот словарь, что нужен текущему экрану, — за 5.2 КБ и без единой зависимости.
В цифрах
Размер — yarn size:consumer: каждая строка — отдельный бандл поверх собранного
dist, gzip -9, vue вынесен наружу.
| Что импортируете | Цена |
|---|---|
createFintI18n + t() |
5.2 КБ |
+ Vue-слой: плагин, useI18nScope, v-t |
5.9 КБ |
+ форматирование n() / d() |
6.3 КБ |
+ SSR-снимок и PersistencePlugin |
7.0 КБ |
Скорость — yarn bench, Apple M5 Pro, Node 26:
| Операция | Время |
|---|---|
| 5 000 переводов, кэш прогрет | 0.21 мс (≈ 23 млн вызовов/с) |
| Первый проход по 5 000 ключей: инстанс + мердж + компиляция каждого сообщения | 2.3 мс |
Один t() с двумя подстановками |
64 нс |
n() с кэшем форматтеров против конструирования Intl.NumberFormat |
0.29 мкс против 6.8 мкс |
Размер — гейт CI: size-budget.json роняет сборку на подкравшихся байтах, а каждый сдвинутый
бюджет несёт обоснование в том же файле. Бенчи в CI тоже гоняются, но информационно: на общих раннерах числа слишком
шумные, чтобы на них гейтить.
Почему эта
- Ленивые блоки вместо одного большого файла. Экран грузит свой словарь. Блок без собственного лоадера резолвится
вверх к родителю,
widgets.*разворачивается во все дочерние, а счётчик использований освобождает блок, когда размонтируется последний использующий его компонент. - Компиляция, совместимая с CSP. Шаблоны компилируются в функции без
new Functionи безeval, поэтому работают под строгимContent-Security-Policy, где библиотеки с компилятором внутри не работают. - В сообщении нет спецсимволов. Плюрализация — это форма значения, объект форм CLDR, а не разметка внутри строки.
|в тексте остаётся|, и ничто не разрежет перевод пополам молча. - Tree-shaking по локалям. Локали — отдельные экспорты, в бандл попадают только перечисленные языки.
sideEffects: falseво всём пакете. - Типизированные ключи без потери динамических. Дженерик схемы даёт автодополнение и проверку опечаток для
литеральных ключей, а
t()продолжает принимать строки, собранные в рантайме.
Установка
npm i @feugene/fint-i18n # yarn add / pnpm add
Vue 3.5+, только ESM. vue — единственная peer-зависимость, других нет.
За минуту
import {createApp} from 'vue'
import {createFintI18n} from '@feugene/fint-i18n/core'
import {installI18n} from '@feugene/fint-i18n/vue'
import {en, ru} from './i18n/messages'
const i18n = createFintI18n({
locale: 'en',
fallbackLocale: 'en',
// В сборку попадут только перечисленные здесь локали.
loaders: [en, ru],
})
const app = createApp(App)
installI18n(app, i18n)
app.mount('#app')
<script setup>
import {useFintI18n, useI18nScope} from '@feugene/fint-i18n/vue'
// Блоки, нужные компоненту: грузятся на монтировании, выгружаются вместе с ним.
await useI18nScope(['common', 'auth'])
const {t, locale, setLocale} = useFintI18n()
</script>
<template>
<p>{{ t('common.welcome', { name: 'User' }) }}</p>
<span v-t="'auth.login'"/>
<button @click="setLocale(locale === 'en' ? 'ru' : 'en')">
{{ t('common.switch') }}
</button>
</template>
loaders принимает одну коллекцию или массив коллекций, так что свои локали может поставлять каждый пакет, — порядок
мерджа и правила конфликтов в разделе
«Определение сообщений».
Что внутри
| Перевод | t(), $t, директива v-t с .once / .preserve, fallback-локаль на конкретный вызов |
| Блоки | ленивая загрузка, восходящий резолвинг, wildcard'ы prefix.*, счётчик использований, retry на отказ загрузки |
| Локали | negotiateLocale() поверх navigator.languages / Accept-Language, ru-RU находит ru |
| Плюрализация | категории CLDR через Intl.PluralRules, правила резолвятся один раз при компиляции |
| Числа и даты | n() / d() поверх Intl с кэшем форматтеров, отдельным модулем |
| SSR | снимок состояния на сервере, гидрация на клиенте, без повторной загрузки |
| Интроспекция | te() — существует ли перевод; tm() — целое поддерево как данные |
| Расширение | 7 хуков, плагины с install/uninstall, dispose(), освобождающий всё |
| Совместимость | мост к vue-i18n для постепенной миграции |
| Инструменты | CLI-проверки: согласованы ли локали между собой и с кодом |
Всё подключается опционально: за то, что не импортировали, платить не приходится.
Документация
- 📦 Установка — настройка и опции
- 📂 Определение сообщений — форматы JSON, лоадеры, мердж
- 🚀 Использование —
t(),$t,v-t, скоупы - 🧱 Блоки перевода — резолвинг, wildcard'ы, память
- 📘 Справочник API — все методы, композаблы и типы
- 🔌 Плагины — система хуков и встроенные плагины
- 🖥️ Серверный рендеринг — снимок и гидрация
- 🧰 Инструменты для словарей — проверки в CI и кодмод плюрализации
- 🔍 Devtools — состояние рантайма, лента событий, мост в window
- 🌐 Гайд для авторов локализационных пакетов — контракт per-locale экспортов
- ⚡ Бенчмарки и анализ бандла — как измеряются цифры выше
У каждой возможности есть живая секция в playground, у SSR — отдельное приложение.
Лицензия
Related Packages
Localization for vue 3 applications that use vuex. Can be used as plugin or comp...
Version History
| Version | Released | Vue | License |
|---|---|---|---|
| 0.9.1 | ^3.5.32 | MIT | |
| 0.9.0 | ^3.5.32 | MIT | |
| 0.8.0 | ^3.5.32 | MIT | |
| 0.7.0 | ^3.5.32 | MIT | |
| 0.6.0 | ^3.5.32 | MIT | |
| 0.4.0 | ^3.5.32 | MIT | |
| 0.3.0 | ^3.5.32 | MIT | |
| 0.2.3 | ^3.5.32 | MIT | |
| 0.2.2 | ^3.5.32 | MIT | |
| 0.2.1 | ^3.5.32 | MIT | |
| 0.2.0 | ^3.5.32 | MIT | |
| 0.1.1 | ^3.5.32 | MIT | |
| 0.1.0 | ^3.5.32 | MIT |