Skip to content

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, 21 across 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

FeatureShortcutDescription
Quick OpenCtrl+PFuzzy-search all keys by name; jump instantly
Find & ReplaceCtrl+HSearch values across all or a specific locale, preview and apply replacements
UndoCtrl+ZUndo the last saved change (up to 100 steps)
Export CSVDownload all translations as a CSV file
Import CSVUpload a CSV; preview diff before applying
Export XLIFF / POExport a locale for CAT tools / Poedit / Weblate
Import XLIFF / POImport completed file from a translator
Translate missingAuto-translate missing values via LibreTranslate or DeepL
Shortcut help?Show keyboard shortcut cheatsheet

Filter bar

FilterDescription
all / missing / completeShow all keys, only keys with missing translations, or only fully translated keys
unusedShow only keys not referenced in any source file
phantomShow only keys used in code but absent from all locale files
staleShow 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.

json
// i18n-kit.config.json
{
  "staleTracking": true
}

How it works:

  1. When you save a value in the reference locale via the editor, a SHA1 hash is stored in i18n-kit.notes.json under _hash.<key>.
  2. On the next load the editor compares every reference value to its stored hash.
  3. Keys with a mismatched hash appear with an ⚠ outdated badge in the editor.
  4. A dedicated stale filter shows only outdated keys.
  5. 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.