Skip to main content
JT i18n — hero image
Web App In Development 2026

JT i18n

Self-hosted translation management system for multi-format, multi-locale apps

Tech Stack

Fastify TypeScript fluent-html HTMX Tailwind CSS Prisma PostgreSQL Redis BullMQ Anthropic

Overview

JT i18n is a self-hosted translation management system (TMS) for managing app localization across many projects and many locales. It imports translation files in any of the common industry formats, gives translators and reviewers a first-class web editor, and exports the results back to the exact file format the app consumes — so nothing in the build pipeline has to change.

The Challenge

Every app that ships in more than one language has the same problem: translations live as JSON/YAML/XLIFF/.po/.strings files in the repo, editing them by hand is error-prone, and non-developer translators can't contribute safely. Paid SaaS TMSes (Phrase, Lokalise, Crowdin) solve this but are expensive, opaque, and lock translations behind a proprietary API. Open-source alternatives are either CLI-only or ship half the formats.

The Solution

A Fastify + HTMX SSR app with a Prisma/Postgres data model that treats keys as first-class entities independent of their on-disk shape, and a pluggable parser layer that can losslessly round-trip the major formats. Translators work in a keyboard-driven multi-locale editor; reviewers approve via a queue; CI pulls the latest translations via a signed CDN URL or the CLI. Claude-powered suggestions, a translation memory, and a glossary keep translators consistent without enforcing style via copy-paste.

The whole interface is server-rendered with fluent-html and HTMX — no client-side framework, no bundle. Every cell edit is a typed morphing swap back to the server, so the UI stays fast even on projects with tens of thousands of keys.

JT i18n screenshot

Key Features

  • Multi-Locale Editor — Keyboard-driven grid editor with source and all target locales side by side, per-value status, inline HTMX saves, and full keyboard navigation
  • First-Class Keys — Keys are database entities with placeholders, plural forms, descriptions, context, and screenshot URLs — independent of any on-disk format
  • Pluggable Parsers — Lossless round-trip for JSON, YAML, XLIFF 1.2/2.0, .po, Android strings.xml, iOS .strings / .stringsdict, .properties, Fluent, and CSV
  • Review Workflow — Draft → translated → reviewed → approved state machine with assignments, review queue, and inline comments per value
  • Coverage Dashboard — Per-locale completeness, review-queue depth, recent activity, and full audit log
  • Search & Filter — Search across keys, source text, and translated values; filter by status, locale, namespace, or placeholder
  • Per-Value History — Every TranslationValue keeps a full revision trail with author, diff view, and one-click restore
  • AI Assistance — Claude-powered draft translations and review suggestions, grounded in the project's translation memory and glossary
  • Translation Memory + Glossary — Cross-project reuse of previously-approved translations and enforced terminology
  • Quality Checks — Automatic placeholder parity, glossary consistency, empty/missing detection, HTML/markdown validation
  • CI-Friendly Delivery — TypeScript SDK, REST API, webhooks, signed CDN bundles, CLI for pulling the latest translations
  • Git Sync — Optional two-way sync with a project's repo so translations can round-trip through PRs
JT i18n screenshot

Technical highlights

  • Zero-JS architecture — Full interactivity via HTMX morphing swaps; every cell save, filter, and navigation is a typed server round-trip with no client framework
  • Type-safe HTML — fluent-html generates the entire UI with compile-time validation, fluent Tailwind methods, and typed route/ID refs via defineRoutes / defineIds
  • Format-agnostic data model — Keys, values, locales, and namespaces modelled in Prisma/Postgres so the same key can be exported to any supported format without lossy re-encoding
  • Pluggable parser layer — Each format is a self-contained module implementing a shared Parser interface, tested against a fixture corpus for round-trip equality
  • Background jobs via BullMQ — Imports, exports, CDN bundle rebuilds, and AI translate requests run asynchronously with per-project rate limits
  • Claude-assisted translate + review — Prompts are grounded in TM hits and glossary terms; suggestions are never written back without a human click
  • Signed CDN bundles — Production apps fetch translations by project + locale + version over a signed, cacheable URL — no TMS API at request time
  • Testability — Integration and unit tests with Vitest covering parsers, services, controllers, and the review workflow end-to-end