How inlang works
The problem
i18n tools are not interoperable.
No common file format for i18n tools exists. Data formats like JSON or YAML are unsuited for complex tools that need CRUD APIs, need to scale to hundreds of thousands of messages, or require version control.
The result is fragmented tooling:
- Switching tools requires migrations and refactoring
- Cross-team work requires manual exports and hand-offs
- Automating workflows requires custom scripts and glue code
ββββββββββββ βββββββββββββ ββββββββββββ
β i18n lib ββββββββββTranslationβββββββββββ CI/CD β
β β β Tool β βAutomationβ
ββββββββββββ βββββββββββββ ββββββββββββ
The solution
Inlang is an open file format designed for building localization (i18n) tooling. It provides:
- CRUD API β Read and write translations programmatically
- SQL queries β Query messages like a database, scale to millions
- Plugin system β Import/export any format (JSON, XLIFF, etc.)
- Version control β Built-in version control via lix
ββββββββββββ βββββββββββββ ββββββββββββββ
β i18n lib β βTranslationβ β CI/CD β
β β β Tool β β Automation β
ββββββ¬ββββββ βββββββ¬ββββββ βββββββ¬βββββββ
β β β
βββββββββββ β ββββββββββββ
βΌ βΌ βΌ
ββββββββββββββββββββββββββββββββββββ
β .inlang file β
ββββββββββββββββββββββββββββββββββββ
The result:
- Switch tools without migrations β they all use the same file
- Cross-team work without hand-offs β developers, translators, and designers all edit the same source
- Automation just works β one source of truth, no glue code
Build your own i18n tooling
The inlang SDK is the official specification and parser for .inlang files.
Build linters, editors, CLI tools, IDE extensions, or libraries β all interoperable with every other inlang tool.
import { loadProjectFromDirectory } from "@inlang/sdk";
const project = await loadProjectFromDirectory({
path: "./project.inlang",
});
const messages = await project.db.selectFrom("message").selectAll().execute();

