Skip to content

Translations

The Translations page is the editor. It is a table of keys (rows) × languages (columns) where your team spends most of its time. This page explains what the editor can do and how to work efficiently in it.

  • Rows are translation keys within the selected namespace.
  • Columns are languages in the project. The source language is always visible so translators see what they’re translating from.
  • Cells contain translation values, each with a status badge (Not translated / Not reviewed / Translated).
  • Side panel (when a cell is active) shows the key’s description, history, comments, ICU validation, translation memory matches, machine translation suggestions, and glossary hits.
  1. Add Key

    Click Add Key at the top of the Translations page.

  2. Name it

    Use stable, descriptive names. checkout.payment.card_number tells a translator where the string lives; label_42 doesn’t. Keys are unique within a namespace — nav.home can exist independently in common and in emails.

  3. Pick the namespace

    Default to default if you haven’t split yet. See Namespaces for when to split.

  4. Write the source value

    Use ICU MessageFormat for placeholders, plurals, and selects. Comvi validates ICU syntax on save.

  5. Add a description (strongly recommended)

    Explain where the string appears, what tone it should have, what it refers to. Good descriptions save more translator time than any other single thing.

The key is created with the source value filled and empty slots for every target language.

Click any cell to edit inline. Press the save shortcut (see Keyboard below) or move focus away to save. Comvi validates ICU as you type — missing placeholders in the target relative to the source are flagged before you save.

Editing an already-Translated value drops it back to Not reviewed — every edit after approval goes through review again. See Translation Lifecycle for the full state machine.

Comvi stores values in ICU MessageFormat. Typical shapes:

Hello, {name}!
You have {count, plural, one {# message} other {# messages}}.
{gender, select, male {He} female {She} other {They}} updated the profile.

Source and target placeholders must match. If the source uses {name} and your translation omits it, you’ll see a warning on save.

StatusWhen it’s set
Not translatedEmpty cell
Not reviewedValue exists, not approved. MT, translator edits, and imports (by non-reviewers) land here.
TranslatedApproved. Include only this status in production CDN settings to keep drafts out.

Click a status badge to change it manually — subject to role. Translators cannot set Translated; editors and above can. See Roles & Permissions.

The Translations page combines several filters:

  • Search — by key name or value substring
  • Namespace — restrict to one namespace at a time
  • Status per language — “show only French keys that are Not reviewed”
  • Language subset — hide columns you don’t need
  • Sort — by key name, creation date, or last-updated date

Filters compose. “Search error, in auth namespace, Not translated for French” is one click away and is how translators focus their work.

Select keys via the row checkboxes; a bulk-action bar appears:

ActionEffect
Bulk translateSend selected keys through machine translation for chosen languages
Change statusSet Not reviewed or Translated for selected cells
Move namespaceMove keys to another namespace (names must stay unique there)
Copy valuesDuplicate values from one language to another for selected keys
Clear valuesWipe values back to Not translated
ExportExport only the selected keys
DeletePermanently remove keys and all their values

When a cell is focused, the side panel shows context for that exact (key, language) pair:

  • Description — the key’s definition
  • ICU validation — red flags on placeholder mismatches
  • History — every change with who/when/what
  • Comments — threaded discussion on this value
  • TM matches — similar source text translated before (see Translation Memory)
  • MT suggestions — on-demand machine translations
  • Glossary hits — highlighted terms with preferred translations

Use it when you’re uncertain about a value — it answers “why was this last edited?”, “what did the previous translator do?”, “is this consistent with the TM?”.

ShortcutAction
Tab / Shift+TabMove to next / previous cell
EnterSave and move down
EscapeCancel edit, discard pending changes

These keep power users in a rhythm — for long translation sessions, the keyboard flow matters.

Both are covered per-value in the side panel. History is immutable — a full audit trail.

  • Keys must be unique within a namespace. Same name across namespaces is allowed.
  • ICU validation is enforced on save — broken placeholders block save.
  • Bulk delete is permanent; there is no trash or restore.

A translation saved but the status didn’t change

Section titled “A translation saved but the status didn’t change”

The caller doesn’t have review permission. Translators’ edits always land as Not reviewed; an editor or manager has to approve.

ICU validation keeps failing on a translation

Section titled “ICU validation keeps failing on a translation”

The target must use the same placeholder names as the source. Check for {name} vs {Name}, or a missing plural branch. See Pluralization & ICU for syntax.

Check the TM is assigned to the project and has content in the right language pair. Short source strings rarely match. See Translation Memory.

Bulk translate finished but nothing changed

Section titled “Bulk translate finished but nothing changed”

Check job results — some language pairs may be unsupported by the provider and skipped. Switch providers or pick different languages.

I edited a Translated value and it dropped back to Not reviewed

Section titled “I edited a Translated value and it dropped back to Not reviewed”

Deliberate — every edit after approval re-enters review. See Translation Lifecycle.