Editor Table & Advanced Features
For launching the editor and its dashboard, see Locale Editor UI.
Editor table
- Inline editing — click any cell to edit in place; save with Enter or ✓, cancel with Escape
- Namespace groups — keys grouped by dotted prefix; groups collapse/expand; arbitrary nesting depth
- Group operations — add sub-group, add key, rename namespace, delete group
- Inline key actions — rename, duplicate, add/edit note, delete
- Batch select & delete — row checkboxes + bulk delete bar
- Usage map — expand any key row to see which source files reference it; clickable file chips open the file in your IDE (VS Code, Cursor, WebStorm, PhpStorm, IntelliJ)
- Cell validation — inline warnings for placeholder mismatch, HTML tag mismatch, ICU syntax errors, length > 2.5× reference
- Translation memory — previously saved translations for similar source strings are shown as one-click suggestion chips
- Plural preview — for ICU keys, shows rendered forms for
n = 0, 1, 2, 5, 11, 21across all locales - Interpolation preview — expand a key row to fill in
{variable}values and see the rendered output per locale - Keyboard navigation — arrow keys move between cells; Enter starts editing; Space toggles selection
- Live reload — when a locale file changes on disk, the affected locale reloads automatically via SSE
Toolbar & header
| Feature | Shortcut | Description |
|---|---|---|
| Quick Open | Ctrl+P | Fuzzy-search all keys by name; jump instantly |
| Find & Replace | Ctrl+H | Search values across all or a specific locale, preview and apply replacements |
| Undo | Ctrl+Z | Undo the last saved change (up to 100 steps) |
| Export CSV | — | Download all translations as a CSV file |
| Import CSV | — | Upload a CSV; preview diff before applying |
| Export XLIFF / PO | — | Export a locale for CAT tools / Poedit / Weblate |
| Import XLIFF / PO | — | Import completed file from a translator |
| Translate missing | — | Auto-translate missing values via LibreTranslate or DeepL |
| Shortcut help | ? | Show keyboard shortcut cheatsheet |
Filter bar
| Filter | Description |
|---|---|
all / missing / complete | Show all keys, only keys with missing translations, or only fully translated keys |
unused | Show only keys not referenced in any source file |
phantom | Show only keys used in code but absent from all locale files |
stale | Show only keys whose reference value changed since last review |
Stale translation detection
When staleTracking: true is set, the editor tracks changes to the reference locale and marks translations in other locales as potentially outdated.
// i18n-kit.config.json
{
"staleTracking": true
}How it works:
- When you save a value in the reference locale via the editor, a SHA1 hash is stored in
i18n-kit.notes.jsonunder_hash.<key>. - On the next load the editor compares every reference value to its stored hash.
- Keys with a mismatched hash appear with an
⚠ outdatedbadge in the editor. - A dedicated
stalefilter shows only outdated keys. - Clicking Mark as reviewed resets the hash — use this after updating all translations.
XLIFF / PO export & import
Industry-standard translation file formats — compatible with Phrase, Lokalise, Weblate, OmegaT, Poedit, and most CAT tools.
The XLIFF file includes <source> (reference text) and <target> (current translation). Translator notes from the editor appear as <note> elements. The PO file uses msgctxt for the key name, msgid for the source text, and msgstr for the translation.
The locale editor header has Export XLIFF, Export PO, and Import buttons that open locale-picker dialogs.
Machine translation
The editor can auto-translate all missing keys with one click. Two engines are supported — choose in Settings → Translation engine.
LibreTranslate
An open-source, self-hostable translation API. The public instance at https://libretranslate.com is free for low traffic.
DeepL
Higher translation quality. The free plan covers 500,000 characters/month — sign up at deepl.com/pro for DeepL API Free.
Keys ending in :fx use the free-tier endpoint api-free.deepl.com automatically.
Placeholder handling
Both engines receive strings with {variable} and ICU plural blocks ({count, plural, ...}) replaced by opaque XML tags (<x id="0"/>). After translation, the tags are substituted back — placeholders survive translation unchanged regardless of word order changes.