PLATFORM · WHAT RUNS UNDERNEATH

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.

20
FILE FORMATS
10
WEBHOOK EVENTS
15
MCP TOOLS
TRANSGLOT CLI · FOUR COMMANDS
EVERY PLAN
# authenticate with a scoped tgl_ project token
$ npx transglot init
# send the source file up, in any of the 20 formats
$ npx transglot push
# bring the finished translations back into the repo
$ npx transglot pull
X-Skipped-Keys reports anything the format could not hold
THE PLATFORM

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.

SELECT A SYSTEM
Translation memory

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.
EXACT MATCH · EVERY PLAN — SEMANTIC MEMORY · TEAM AND UP
TRANSLATION MEMORY

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.

Track A · every plan
Exact-match pool

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
Track B · Team and up
Semantic memory

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
SAID PLAINLY
TRUST CENTER · /TRUST-CENTER

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.

WHAT THE GATE CATCHES

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.

Placeholder integrity · fr
source: {count} files moved to {folder}
Raw engine

{compte} fichiers déplacés vers {dossier}

PLACEHOLDER TRANSLATED · INTERPOLATION BREAKS AT RUNTIME
Transglot

{count} fichiers déplacés vers {folder}

BOTH PLACEHOLDERS INVENTORIED AND FOUND IN THE TARGET
Plural categories · pl
source: {n, plural, one {# file} other {# files}}
Raw engine

{n, plural, one {# plik} other {# plików}}

MISSING few · POLISH TAKES one · few · many · other
Transglot

{n, plural, one {# plik} few {# pliki} many {# plików} other {# pliku}}

ALL FOUR CLDR CATEGORIES PRESENT · CHECKED BEFORE THE AI PASS
FILE FORMATS

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.

8 OF 20 CARRY PLURALS
Supported file formats, with their extension, whether they carry plural forms, and what they are.
FormatExtensionPluralsWhat it is
JSON (flat).jsonA single flat key → string map — the i18next / React / Vue default.
JSON (nested).jsonDot-path nested objects, for i18next namespaces and deeper key trees.
Android XML.xmlyesAndroid string resources, including <plurals> quantity strings.
iOS Strings.stringsApple key-value strings for iOS and macOS apps.
iOS Stringsdict.stringsdictyesApple’s plural-rules format, paired with .strings for full CLDR plurals.
Flutter ARB.arbyesApplication Resource Bundle format used by Flutter’s intl tooling.
Laravel PHP.phpyesPHP array translation files, the Laravel lang/ default.
Laravel JSON.jsonLaravel’s flat JSON string-keyed translation files.
XLIFF 1.2.xlfThe OASIS CAT/TMS interchange standard — bilingual trans-units with source, target, and notes.
XLIFF 2.0.xlfThe modern OASIS XLIFF standard — a restructured unit/segment model for current CAT/TMS tools.
Apple String Catalog.xcstringsyesXcode 15+ String Catalogs with plural variations — the modern iOS/macOS default.
gettext PO.poyesmsgid/msgstr with msgctxt and msgstr[N] plurals, for the GNU gettext ecosystem.
YAML.ymlRails-style locale-rooted nested YAML for Ruby and frontend i18n.
Java .properties.propertiesJava, Spring, and Kotlin resource bundles — key=value pairs with Unicode escapes.
.NET .resx.resxThe .NET / C# XML resource format — <data> string entries for desktop, web, and MAUI apps.
CSV.csvyesA key/value/description table (RFC 4180) — game string tables and spreadsheet-driven teams.
XLSX.xlsxyesThe Excel / Google Sheets workbook, same columns as CSV — hand a sheet straight to a translator.
Markdown / MDX.mdMarkdown and MDX documents — long-form content and docs, with front-matter, fenced code, and MDX/JSX blocks preserved verbatim.
Unity CSV.csvUnity 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.poUnreal Engine Portable Object — the .po the Localization Dashboard exports and imports, keyed by the Unreal key (msgctxt) with the source string in msgid.
CSV AND XLSX CARRY PLURALS AS key[one] / key[other] ROWS · ANYTHING A SIMPLE FORMAT CANNOT HOLD RETURNS IN THE X-SKIPPED-KEYS HEADER
QUALITY GATE

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.

70

The AI quality score below which a row is routed to a human. Any finding at major severity or worse routes it too.

QA SCORE THRESHOLD · config/qa.php
7

Finding categories the review returns — accuracy, fluency, terminology, style, placeholder, plural and length — each with a severity and a message.

MQM-STYLE REVIEW OUTPUT
0

AI calls spent re-checking a row whose source hash and translation have not moved since the last run.

INCREMENTAL QA RUNS
AUTOMATION

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.

Indie and up
REST API

The whole loop over /api/v1 — project, pull, push, translate, batches, translations, QA and glossary — behind a scoped tgl_ bearer token.

Every plan
CLI

A zero-runtime-dependency npm package with init, pull, push and status. Run it with npx transglot from any terminal or CI job.

Every plan
GitHub Action

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.

Indie and up
Webhooks

Ten events, HMAC-SHA256 signed and coalesced rather than fired per row, with the last 50 deliveries logged and redeliverable with their original payload.

Indie and up
MCP server

@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.

Every paid plan
OTA / CDN delivery

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.

OBJECTIONS

Where teams push back

Including the answer people like least: the exact-match memory pool is shared.

Is translation memory private to my organization?
It depends which one. The exact-match pool is deliberately not private: it is a single global, anonymous pool keyed by source hash, target locale and model, carrying no organization or project. That is what makes an exact match instant and free, but it also means a match may come from another tenant, and strings you translate can serve someone else’s exact match. Nothing identifies who contributed an entry. The one control is the per-project use_translation_memory toggle: turn it off and the project neither reads from nor writes to the pool. The separate semantic memory on Team plans and up is the opposite — it is scoped to your organization, reads only your own human-reviewed translations, and is surfaced as a suggestion rather than auto-applied.
Do I get charged again for a string I already translated?
No. Exact matches are served from translation memory at no quota cost, and the savings — words and money — are tracked so you can see the impact. Everything else is metered per organization against your plan’s monthly word limit, with overage at $0.003 per word on paid plans and a hard cap on Free.
What does the quality gate check that a reviewer would not?
Placeholder integrity per plural form, complete CLDR plural categories, max length, and glossary terminology — the structural failures that ship green from a raw engine. That pass is deterministic and costs nothing. Rows that survive it get an MQM-style Claude review returning a 0–100 score and categorised findings; a row is flagged for a human when any finding is major-or-worse or the score falls below 70.
Will re-running QA cost me every time?
No. QA is incremental: a row is only re-checked when its source hash moved or its translation changed since the last check, so re-running over an unchanged project does zero AI work. Runs are scoped to missing, stale, selected or all, and metered per organization.
Does anything write over a translation a human approved?
No. Self-heal in apply mode re-translates only machine rows, gates the result through every deterministic validator, and writes under a row lock that re-asserts the row is still machine-translated. A human edit that lands mid-run wins. Style inference produces a draft style guide for a person to edit and is never applied automatically, and AI-mined glossary terms stay pending until someone approves them.
Which parts are gated behind a plan?
Granular access control is not: four organization roles plus per-project and per-language grants ship on every plan, including Free. The glossary and in-context editing start on Indie. Semantic memory, Quality Mode, translation QA, self-heal and the MQM scorecard start on Team. SSO/SAML, SCIM, the append-only audit log and white-label branding are Enterprise. The CLI and the GitHub Action are on Free; the REST API, webhooks and OTA delivery start on Indie.

Start on the free plan

Two thousand words a month, one project, three seats, the CLI and the GitHub Action. No card.

EXACT MATCHES SERVED FROM MEMORY NEVER COUNT AGAINST YOUR WORD LIMIT