Reference
The lookup page: exact values, no prose. For the ideas behind them, see Concepts.
Repo settings
| Setting | Values | Default |
|---|---|---|
framework | elixir (gettext) · formatjs (JSON) | elixir |
scan_mode | selected · all | selected |
scan_branch_regex | regex string | — |
required_locales | list of locales | [] (gate inactive) |
gate_scope | incremental · whole_catalog | incremental |
gate_fuzzy | warn · block | warn |
translation_mode | suggest · autofill_submit · autofill_approve | suggest |
auto_translate_on_scan | boolean | false |
quality_gate | off · warn · block | off |
quality_blocking_severity | critical · major | critical |
quality_locales | list of locales | [] (falls back to required_locales) |
quality_model | model override string | — |
All settings live in the repo’s Settings page and are enforced with database constraints — there is no config file to commit.
Roles & permissions
Organization roles: owner, admin, member.
| Capability | owner | admin | member |
|---|---|---|---|
| billing, delete org | ✓ | — | — |
| manage org, connect repos | ✓ | ✓ | — |
| team work | ✓ | ✓ | ✓ |
Team roles: owner, admin, developer, reviewer,
translator, viewer. Repos belong to a team; repo access is team
membership — there are no separate repo-level roles.
| Capability | owner | admin | developer | reviewer | translator | viewer |
|---|---|---|---|---|---|---|
| view | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| edit translation | ✓ | ✓ | ✓ | ✓ | ✓ | — |
| submit for review | ✓ | ✓ | ✓ | ✓ | ✓ | — |
| review | ✓ | ✓ | ✓ | ✓ | — | — |
| assign work | ✓ | ✓ | ✓ | ✓ | — | — |
| structural edit, rename msgid | ✓ | ✓ | ✓ | — | — | — |
| open PR, bulk operations | ✓ | ✓ | ✓ | — | — | — |
| manage team | ✓ | ✓ | — | — | — | — |
A translator membership can be scoped to specific locales
(empty scope = all locales). Locale scoping applies to editing; a
scoped check without a locale fails closed. Last-owner protection
applies everywhere: the only owner of an org or team can’t be removed
or demoted.
Supported PO constructs
The engine parses your files and splices edits into the original bytes — it never regenerates a file. Preserved verbatim across edits:
- multi-line (wrapped) strings
- plural entries (
msgid_plural,msgstr[N]— plural count read from the catalog’s ownPlural-Forms:header, which is never rewritten) msgctxt(entries are keyed by context + msgid)- translator comments (
#), extracted comments (#.), references (#:), flags (#,), previous-msgid markers (#|), obsolete entries (#~) - blank lines and file ordering
Parsing is strict: a malformed catalog rejects its whole scan (HTTP
422) rather than being half-ingested.
Supported JSON shapes
Edits are spliced into the original bytes here too. Supported layouts
(catalog_layout: auto · flat · tree · extension, detected
under auto):
- flat
<locale>.jsonobjects with ICU messages - nested key trees (i18next, next-intl, vue-i18n), with a configurable key separator
- browser-extension
_locales/<locale>/messages.json(message,description,$name$placeholders)
See the JSON guide.
Limits
| Limit | Value |
|---|---|
| Template files per scan | 1,000 |
| Single template file | 5 MB |
| Scan request body | 10 MB |
| Usage snippets per scan | 50,000 |
| API rate limit (scan + MCP) | 30 requests / minute / IP |
MCP list_untranslated page | 500 entries |
| MCP token validity | 365 days |
| Voice: lexicon terms per profile | 50 |
| Voice: exemplar strings per profile | 20 |
| Voice: website scan | 6 pages / 50,000 chars |
| Voice: uploaded source | 10 MB in, 50,000 chars extracted |
| Voice card token budget | ~400 tokens |
| Quality findings shown per check run | 50 |