@feugene/fint-i18n

Lightweight Vue 3 i18n library with lazy-loading blocks and template caching
3,428 1
Install
npm install @feugene/fint-i18n
Latest Version:0.9.1
Vue:3
License:MIT
Last Updated:Oct 16, 2026
Links: GitHub  ·  npm
Maintainer: efureev

@feugene/fint-i18n

codecov npm version bundle size

English version

Локализация для 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-проверки: согласованы ли локали между собой и с кодом

Всё подключается опционально: за то, что не импортировали, платить не приходится.

Документация

У каждой возможности есть живая секция в playground, у SSR — отдельное приложение.

Лицензия

MIT

Related Packages

@byjohann/vue-i18n

Lightweight internationalization plugin for Vue

8,721 7
vuex-i18n

Easy localization for vue-components using vuex as data store

241,310 654
@unify/vuex-i18n

Localization for vue 3 applications that use vuex. Can be used as plugin or comp...

44,250 2
langie

Lightweight translation SDK for Vue.js applications with smart interface languag...

4,147
gt-vue

A lightweight Vue internationalization library for General Translation.

3,971 1,069

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