The platform under the editor
Translation memory, enforced glossaries, twenty lossless file formats, a quality gate and the automation that drives them. Each system below says what it does and which plan it starts on.
Five systems, one loop
Strings come in, get reused or translated, get checked, and go back out. These are the five parts of that loop you configure.
An exact match is served from memory instantly and costs nothing — it never counts against your monthly word limit, and the words and money it saved are tracked. Read the next section before you rely on it: the pool that serves those matches is deliberately global.
- Matches are keyed by source hash, target locale and model, so a reused string is byte-identical to the one you already approved.
- The exact-match pool carries no organization and no project. A match may come from another tenant, and a string you translate can serve someone else’s match.
- One control exists: the per-project use_translation_memory toggle. Off means the project neither reads from nor writes to the pool.
- Semantic memory is a separate, org-scoped path — it reads only your own human-reviewed rows and surfaces them as a $0 suggestion, never as an automatic write.
Two memories. Only one of them is yours.
Reuse is the largest saving on the invoice, and it comes from two different stores with two different privacy stories. We keep them apart on purpose.
Global, anonymous and shared across tenants — by design, and not something we can scope to your organization.
- Scope
- One pool for the whole platform
- Keyed by
- Source hash + target locale + model
- Rows carry
- No organization, no project, no author
- Cost of a hit
- $0 — never metered
- Your control
- use_translation_memory, per project
Organization-scoped — the hard tenant boundary — and it only ever reads translations your own reviewers approved.
- Scope
- Your organization only
- Keyed by
- pgvector embedding similarity
- Rows carry
- Human-reviewed translations only
- Cost of a hit
- $0 suggestion, plus AI grounding
- Your control
- Per-project toggle; never auto-written
The exact-match pool is not isolated per tenant, and we will not describe it as if it were. A match you receive may have been contributed by another customer, and a string you translate can serve someone else’s match. Rows carry no organization, no project and no author, so nothing records who contributed what. If that is not the trade you want, switch use_translation_memory off for the project — it then neither reads from nor writes to the pool.
The failures that ship green
Both of these pass a raw engine and break in production. Both are caught by the deterministic pass, before a single AI call is spent.
{compte} fichiers déplacés vers {dossier}
{count} fichiers déplacés vers {folder}
{n, plural, one {# plik} other {# plików}}
{n, plural, one {# plik} few {# pliki} many {# plików} other {# pliku}}
Twenty codecs, and an honest skip list
Every format below imports and exports through the same pipeline. Where a format cannot represent something, it says so instead of dropping it quietly.
| Format | Extension | Plurals | What it is |
|---|---|---|---|
| JSON (flat) | .json | — | A single flat key → string map — the i18next / React / Vue default. |
| JSON (nested) | .json | — | Dot-path nested objects, for i18next namespaces and deeper key trees. |
| Android XML | .xml | yes | Android string resources, including <plurals> quantity strings. |
| iOS Strings | .strings | — | Apple key-value strings for iOS and macOS apps. |
| iOS Stringsdict | .stringsdict | yes | Apple’s plural-rules format, paired with .strings for full CLDR plurals. |
| Flutter ARB | .arb | yes | Application Resource Bundle format used by Flutter’s intl tooling. |
| Laravel PHP | .php | yes | PHP array translation files, the Laravel lang/ default. |
| Laravel JSON | .json | — | Laravel’s flat JSON string-keyed translation files. |
| XLIFF 1.2 | .xlf | — | The OASIS CAT/TMS interchange standard — bilingual trans-units with source, target, and notes. |
| XLIFF 2.0 | .xlf | — | The modern OASIS XLIFF standard — a restructured unit/segment model for current CAT/TMS tools. |
| Apple String Catalog | .xcstrings | yes | Xcode 15+ String Catalogs with plural variations — the modern iOS/macOS default. |
| gettext PO | .po | yes | msgid/msgstr with msgctxt and msgstr[N] plurals, for the GNU gettext ecosystem. |
| YAML | .yml | — | Rails-style locale-rooted nested YAML for Ruby and frontend i18n. |
| Java .properties | .properties | — | Java, Spring, and Kotlin resource bundles — key=value pairs with Unicode escapes. |
| .NET .resx | .resx | — | The .NET / C# XML resource format — <data> string entries for desktop, web, and MAUI apps. |
| CSV | .csv | yes | A key/value/description table (RFC 4180) — game string tables and spreadsheet-driven teams. |
| XLSX | .xlsx | yes | The Excel / Google Sheets workbook, same columns as CSV — hand a sheet straight to a translator. |
| Markdown / MDX | .md | — | Markdown and MDX documents — long-form content and docs, with front-matter, fenced code, and MDX/JSX blocks preserved verbatim. |
| Unity CSV | .csv | — | Unity Localization String Table CSV — the wide, multi-locale sheet Unity’s CSV extension imports and exports; one locale column is selected per pull. |
| Unreal PO | .po | — | Unreal Engine Portable Object — the .po the Localization Dashboard exports and imports, keyed by the Unreal key (msgctxt) with the source string in msgid. |
Free checks first, AI second
A structurally broken row is flagged instantly and costs nothing. Only the rows that survive that pass are worth spending a model on.
The AI quality score below which a row is routed to a human. Any finding at major severity or worse routes it too.
Finding categories the review returns — accuracy, fluency, terminology, style, placeholder, plural and length — each with a severity and a message.
AI calls spent re-checking a row whose source hash and translation have not moved since the last run.
Six ways in, one API
The dashboard is one client of /api/v1. Everything below authenticates with the same scoped project tokens and does the same work.
The whole loop over /api/v1 — project, pull, push, translate, batches, translations, QA and glossary — behind a scoped tgl_ bearer token.
A zero-runtime-dependency npm package with init, pull, push and status. Run it with npx transglot from any terminal or CI job.
A composite Action that pushes source files, optionally waits for the AI batch, pulls translations back, and commits them to a branch or uploads them as an artifact.
Ten events, HMAC-SHA256 signed and coalesced rather than fired per row, with the last 50 deliveries logged and redeliverable with their original payload.
@transglot/mcp exposes 15 tools mapped 1:1 onto the REST API. Read tools are annotated read-only; the three that spend word quota say so up front.
Publish reviewed strings to an edge-cacheable endpoint with immutable versioned URLs and ETag/304, then read them with @transglot/runtime or a framework adapter.
Where teams push back
Including the answer people like least: the exact-match memory pool is shared.
Is translation memory private to my organization?
Do I get charged again for a string I already translated?
What does the quality gate check that a reviewer would not?
Will re-running QA cost me every time?
Does anything write over a translation a human approved?
Which parts are gated behind a plan?
Start on the free plan
Two thousand words a month, one project, three seats, the CLI and the GitHub Action. No card.