mirror of
https://github.com/garethgeorge/backrest.git
synced 2026-05-04 12:00:36 +00:00
What is this folder?
This is an unpacked (git-friendly) inlang project.
At a glance
Purpose:
- This folder stores inlang project configuration and plugin cache data.
- Translation files live outside this folder and are referenced from
settings.json.
Safe to edit:
settings.json
Do not edit:
cache/.gitignore
Key files:
settings.json— locales, plugins, file patterns (source of truth)cache/— plugin caches (safe to delete).gitignore— generated
*.inlang/
├── settings.json # Locales, plugins, and file patterns (source of truth)
├── cache/ # Plugin caches (gitignored)
└── .gitignore # Ignores everything except settings.json
Translation files (like messages/en.json) live outside this folder and are referenced via plugins in settings.json.
What is inlang?
Inlang is an open file format for building custom localization (i18n) tooling. It provides:
- CRUD API — Read and write translations programmatically via SQL
- 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 │
└──────────────────────────────────┘
Quick start
npm install @inlang/sdk
import { loadProjectFromDirectory, saveProjectToDirectory } from "@inlang/sdk";
const project = await loadProjectFromDirectory({ path: "./project.inlang" });
// Query messages with SQLite + [Kysely](https://kysely.dev/) under the hood.
const messages = await project.db.selectFrom("message").selectAll().execute();
// Use project.db to update messages.
await saveProjectToDirectory({ path: "./project.inlang", project });
Ideas for custom tooling
- Translation health dashboard (missing/empty/stale messages)
- Locale coverage report in CI
- Auto-PR for new keys with placeholders
- Migration tool between file formats via plugins
- Glossary/term consistency checker
Data model (docs)
bundle (a concept, e.g., "welcome_header")
└── message (per locale, e.g., "en", "de")
└── variant (plural forms, gender, etc.)
- bundle: Groups messages by ID (e.g.,
welcome_header) - message: A translation for a specific locale
- variant: Handles pluralization/selectors (most messages have one variant)
Common tasks
- List bundles:
project.db.selectFrom("bundle").selectAll().execute() - List messages for locale:
project.db.selectFrom("message").where("locale", "=", "en").selectAll().execute() - Find missing translations: compare message counts across locales
- Update a message:
project.db.updateTable("message").set({ ... }).where("id", "=", "...").execute()