Skip to content
F fluenti

Introduction

Fluenti is a compile-time internationalization library for modern frameworks. It currently supports Vue and SolidJS, with React and Svelte planned. It eliminates the three biggest pain points of traditional i18n: manual key management, runtime parsing overhead, and clunky rich text APIs.

Every i18n library asks you to invent a key for every string:

// en.json — you maintain this by hand
{
"pages.home.hero.title": "Welcome to our app",
"pages.home.hero.subtitle": "The best tool for ...",
"pages.home.cta": "Get started"
}

Keys drift out of sync. Unused keys pile up. Developers spend time naming things instead of building features.

Fluenti’s answer: the source text is the key. Write <h1 v-t>Welcome to our app</h1> and extraction happens automatically. No JSON file to maintain.

Traditional libraries ship a full ICU parser to the browser, parsing message strings on every render. For a page with 50 translated strings, that’s 50 parse calls before the user sees anything.

Fluenti’s answer: the v-t directive is a Vue nodeTransform — it rewrites your template at build time. The compiled render function contains the translated string directly. At runtime, there is nothing left to parse.

Need a link inside a translated sentence? Most libraries force you into one of these:

<!-- vue-i18n: raw HTML injection -->
<p v-html="$t('click_here', { link: '<a href=\'/docs\'>here</a>' })" />

Fluenti preserves your actual markup. Translators see HTML they already understand, and there is no XSS vector.

Featurevue-i18nLinguiFluenti
KeysManual key stringsAuto-generated IDsSource text = key
Rich textv-html (XSS risk)<0>indexed</0> placeholdersNative <a>, <strong>, etc.
Runtime costFull parser in bundleCompiled messagesCompiled + v-t zero-cost
Code splittingManualPer-routePer-route (built-in)
Catalog formatJSON onlyPO / JSONPO / JSON
SSRPlugin config requiredCustom setupBuilt-in locale detection
FrameworksVue onlyReact onlyVue, Solid, and more
ICU MessageFormatPartial supportFullFull
FormattersSeparate @intlify/coreExternal packagesBuilt-in d() / n()

Fluenti’s pipeline turns your source text into optimized, per-locale bundles at build time:

Source code Extract Catalog Translate
┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐
│ <h1 v-t> │ ───► │ fluenti │ ───► │ .po │ ───► │ Poedit / │
│ Hello! │ │ extract │ │ catalog │ │ Crowdin │
│ </h1> │ └──────────┘ └──────────┘ └──────────┘
└──────────┘ │
Ship Compile Translated
┌──────────┐ ┌──────────┐ ┌──────────────────────────┐
│ Vite │ ◄─── │ fluenti │ ◄─── │ .po catalog with target │
│ bundle │ │ compile │ │ language strings filled │
└──────────┘ └──────────┘ └──────────────────────────┘
  1. Write source text directly in your templates: <h1 v-t>Welcome</h1> or t('Hello!')

  2. Extract messages with fluenti extract — scans Vue SFCs and TSX files, generates PO catalogs

  3. Translate using any gettext-compatible tool (Poedit, Crowdin, Weblate) or translate the PO files by hand

  4. Compile with fluenti compile — generates optimized JS modules, one per locale, ready for code splitting

  5. Ship — Vite bundles compiled translations automatically via @fluenti/vite-plugin, lazy-loading per route

PackageDescription
@fluenti/coreFramework-agnostic ICU parser, compiler, interpolation, plural/select, and formatters
@fluenti/vueVue 3 plugin: v-t directive, <Trans>, <Plural>, <Select>, useI18n() composable
@fluenti/solidSolidJS integration: I18nProvider, <Trans>, <Plural>, <Select>, useI18n() hook
@fluenti/cliMessage extraction (Vue SFC + TSX), PO/JSON catalog format, compilation
@fluenti/vite-pluginVite plugin: virtual modules, build-time v-t transforms, per-route code splitting
Terminal window
pnpm add @fluenti/core @fluenti/vue
pnpm add -D @fluenti/cli @fluenti/vite-plugin
Terminal window
pnpm add @fluenti/core @fluenti/solid
pnpm add -D @fluenti/cli @fluenti/vite-plugin
  • Node.js >= 18
  • Vue >= 3.4 (for Vue bindings)
  • SolidJS >= 1.8 (for Solid bindings)
  • Vite >= 5 (for Vite plugin)